Skip to content

Commit

Permalink
Add new-regexp rule - fixes #92 (#100)
Browse files Browse the repository at this point in the history
  • Loading branch information
SamVerschueren authored and sindresorhus committed Jul 10, 2017
1 parent 2ab2e58 commit 87f446d
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 2 deletions.
17 changes: 17 additions & 0 deletions docs/rules/new-regexp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Enforce the use of `new RegExp()` instead of `RegExp()`

They work the same, but `new RegExp()` should be preferred for consistency with other constructors.


## Fail

```js
const regexp = RegExp('foo');
```


## Pass

```js
const regexp = new RegExp('foo');
```
3 changes: 2 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ module.exports = {
'unicorn/custom-error-definition': 'error',
'unicorn/prefer-starts-ends-with': 'error',
'unicorn/prefer-type-error': 'error',
'unicorn/no-fn-reference-in-iterator': 'error'
'unicorn/no-fn-reference-in-iterator': 'error',
'unicorn/new-regexp': 'error'
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ Configure it in `package.json`.
"unicorn/no-hex-escape": "error",
"unicorn/custom-error-definition": "error",
"unicorn/prefer-starts-ends-with": "error",
"unicorn/prefer-type-error": "error"
"unicorn/prefer-type-error": "error",
"unicorn/new-regexp": "error"
}
}
}
Expand All @@ -70,6 +71,7 @@ Configure it in `package.json`.
- [prefer-starts-ends-with](docs/rules/prefer-starts-ends-with.md) - Prefer `String#startsWith` & `String#endsWith` over more complex alternatives.
- [prefer-type-error](docs/rules/prefer-type-error.md) - Enforce throwing `TypeError` in type checking conditions. *(fixable)*
- [no-fn-reference-in-iterator](docs/rules/no-fn-reference-in-iterator.md) - Prevents passing a function reference directly to iterator methods. *(fixable)*
- [new-regexp](docs/rules/new-regexp.md) - Enforce the use of `new RegExp()` instead of `RegExp()`. *(fixable)*


## Recommended config
Expand Down
19 changes: 19 additions & 0 deletions rules/new-regexp.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
'use strict';
const create = context => {
return {
'CallExpression[callee.name="RegExp"]': node => {
context.report({
node,
message: 'Use `new RegExp()` instead of `RegExp()`',
fix: fixer => fixer.insertTextBefore(node, 'new ')
});
}
};
};

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

const ruleTester = avaRuleTester(test, {
env: {
es6: true
}
});

const error = {
ruleId: 'new-regexp',
message: 'Use `new RegExp()` instead of `RegExp()`'
};

ruleTester.run('new-regexp', rule, {
valid: [
`const foo = new RegExp('foo', 'g')`,
`const foo = new RegExp('foo')`,
`const foo = new RegExp(/foo/, 'g')`,
`new RegExp('foo', 'g').exec('foo')`
],
invalid: [
{
code: `const foo = RegExp('foo', 'g')`,
errors: [error],
output: `const foo = new RegExp('foo', 'g')`
},
{
code: `const foo = RegExp('foo')`,
errors: [error],
output: `const foo = new RegExp('foo')`
},
{
code: `const foo = RegExp(/foo/, 'g')`,
errors: [error],
output: `const foo = new RegExp(/foo/, 'g')`
},
{
code: `RegExp('foo', 'g').exec('foo')`,
errors: [error],
output: `new RegExp('foo', 'g').exec('foo')`
}
]
});

0 comments on commit 87f446d

Please sign in to comment.