Skip to content

Commit

Permalink
Add number-literal-case rule (fixes #55) (#57)
Browse files Browse the repository at this point in the history
* add number-literal-case rule - fixes #55

* process feedback

* remove meta

* fix description
  • Loading branch information
SamVerschueren authored and jfmengels committed Oct 17, 2016
1 parent 7fdff88 commit 718578a
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 2 deletions.
35 changes: 35 additions & 0 deletions docs/rules/number-literal-case.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Enforce lowercase identifier and uppercase value for number literals

Enforces a convention of defining number literals where the literal identifier is written in lowercase and the value in uppercase. Differentiating the casing of the identifier and value clearly separates them and makes your code more readable.


## Fail

```js
const foo = 0XFF;
const foo = 0xff;
const foo = 0Xff;
```

```js
const foo = 0B11;
```

```js
const foo = 0O10;
```


## Pass

```js
const foo = 0xFF;
```

```js
const foo = 0b11;
```

```js
const foo = 0o10;
```
3 changes: 2 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ module.exports = {
'unicorn/filename-case': ['error', {case: 'kebabCase'}],
'unicorn/no-abusive-eslint-disable': 'error',
'unicorn/no-process-exit': 'error',
'unicorn/throw-new-error': 'error'
'unicorn/throw-new-error': 'error',
'unicorn/number-literal-case': 'error'
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ Configure it in `package.json`.
"unicorn/filename-case": ["error", {"case": "kebabCase"}],
"unicorn/no-abusive-eslint-disable": "error",
"unicorn/no-process-exit": "error",
"unicorn/throw-new-error": "error"
"unicorn/throw-new-error": "error",
"unicorn/number-literal-case": "error"
}
}
}
Expand All @@ -53,6 +54,7 @@ Configure it in `package.json`.
- [no-abusive-eslint-disable](docs/rules/no-abusive-eslint-disable.md) - Enforce specifying rules to disable in `eslint-disable` comments.
- [no-process-exit](docs/rules/no-process-exit.md) - Disallow `process.exit()`.
- [throw-new-error](docs/rules/throw-new-error.md) - Require `new` when throwing an error. *(fixable)*
- [number-literal-case](docs/rules/number-literal-case.md) - Enforce lowercase identifier and uppercase value for number literals. *(fixable)*


## Recommended config
Expand Down
35 changes: 35 additions & 0 deletions rules/number-literal-case.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
'use strict';
const fix = value => {
if (!/^0[a-zA-Z]/.test(value)) {
return value;
}

const indicator = value[1].toLowerCase();
const val = value.slice(2).toUpperCase();

return `0${indicator}${val}`;
};

const create = context => {
return {
Literal: node => {
const value = node.raw;
const fixedValue = fix(value);

if (value !== fixedValue) {
context.report({
node,
message: 'Invalid number literal casing',
fix: fixer => fixer.replaceText(node, fixedValue)
});
}
}
};
};

module.exports = {
meta: {
fixable: 'code'
},
create
};
75 changes: 75 additions & 0 deletions test/number-literal-case.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import test from 'ava';
import avaRuleTester from 'eslint-ava-rule-tester';
import rule from '../rules/number-literal-case';

const ruleTester = avaRuleTester(test, {
env: {
es6: true
},
parserOptions: {
sourceType: 'module'
}
});

const error = {
ruleId: 'number-literal-case',
message: 'Invalid number literal casing'
};

ruleTester.run('number-literal-case', rule, {
valid: [
'const foo = 0xFF',
'const foo = 0b11',
'const foo = 0o10',
`const foo = '0Xff'`
],
invalid: [
{
code: 'const foo = 0XFF',
errors: [error],
output: 'const foo = 0xFF'
},
{
code: 'const foo = 0xff',
errors: [error],
output: 'const foo = 0xFF'
},
{
code: 'const foo = 0Xff',
errors: [error],
output: 'const foo = 0xFF'
},
{
code: 'const foo = 0Xff',
errors: [error],
output: 'const foo = 0xFF'
},
{
code: 'const foo = 0B11',
errors: [error],
output: 'const foo = 0b11'
},
{
code: 'const foo = 0O10',
errors: [error],
output: 'const foo = 0o10'
},
{
code: `
const foo = 255;
if (foo === 0xff) {
console.log('invalid');
}
`,
errors: [error],
output: `
const foo = 255;
if (foo === 0xFF) {
console.log('invalid');
}
`
}
]
});

0 comments on commit 718578a

Please sign in to comment.