Skip to content

Commit c0c662a

Browse files
authored
feat(fixer): add fixer for param-names (#99)
Resolves #90
1 parent 1e88da5 commit c0c662a

File tree

3 files changed

+60
-35
lines changed

3 files changed

+60
-35
lines changed

README.md

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,20 +88,20 @@ or start with the recommended rule set
8888

8989
## Rules
9090

91-
| recommended | rule | description |
92-
| ----------- | --------------------------- | -------------------------------------------------------------------------------- |
93-
| :bangbang: | `catch-or-return` | Enforces the use of `catch()` on un-returned promises. |
94-
| :bangbang: | `no-return-wrap` | Avoid wrapping values in `Promise.resolve` or `Promise.reject` when not needed. |
95-
| :bangbang: | `param-names` | Enforce consistent param names when creating new promises. |
96-
| :bangbang: | `always-return` | Return inside each `then()` to create readable and reusable Promise chains. |
97-
| | `no-native` | In an ES5 environment, make sure to create a `Promise` constructor before using. |
98-
| :warning: | `no-nesting` | Avoid nested `then()` or `catch()` statements |
99-
| :warning: | `no-promise-in-callback` | Avoid using promises inside of callbacks |
100-
| :warning: | `no-callback-in-promise` | Avoid calling `cb()` inside of a `then()` (use [nodeify][] instead) |
101-
| :warning: | `avoid-new` | Avoid creating `new` promises outside of utility libs (use [pify][] instead) |
102-
| :warning: | `no-return-in-finally` | Disallow return statements in `finally()` |
103-
| :seven: | `prefer-await-to-then` | Prefer `await` to `then()` for reading Promise values |
104-
| :seven: | `prefer-await-to-callbacks` | Prefer async/await to the callback pattern |
91+
| rule | description | recommended | fixable |
92+
| --------------------------- | -------------------------------------------------------------------------------- | ----------- | -------- |
93+
| `catch-or-return` | Enforces the use of `catch()` on un-returned promises. | :bangbang: | |
94+
| `no-return-wrap` | Avoid wrapping values in `Promise.resolve` or `Promise.reject` when not needed. | :bangbang: | |
95+
| `param-names` | Enforce consistent param names when creating new promises. | :bangbang: | :wrench: |
96+
| `always-return` | Return inside each `then()` to create readable and reusable Promise chains. | :bangbang: | |
97+
| `no-native` | In an ES5 environment, make sure to create a `Promise` constructor before using. | | |
98+
| `no-nesting` | Avoid nested `then()` or `catch()` statements | :warning: | |
99+
| `no-promise-in-callback` | Avoid using promises inside of callbacks | :warning: | |
100+
| `no-callback-in-promise` | Avoid calling `cb()` inside of a `then()` (use [nodeify][] instead) | :warning: | |
101+
| `avoid-new` | Avoid creating `new` promises outside of utility libs (use [pify][] instead) | :warning: | |
102+
| `no-return-in-finally` | Disallow return statements in `finally()` | :warning: | |
103+
| `prefer-await-to-then` | Prefer `await` to `then()` for reading Promise values | :seven: | |
104+
| `prefer-await-to-callbacks` | Prefer async/await to the callback pattern | :seven: | |
105105

106106
**Key**
107107

@@ -110,6 +110,7 @@ or start with the recommended rule set
110110
| :bangbang: | Reports as error in recommended configuration |
111111
| :warning: | Reports as warning in recommended configuration |
112112
| :seven: | ES2017 Async Await rules |
113+
| :wrench: | Rule is fixable with `eslint --fix` |
113114

114115
### `catch-or-return`
115116

@@ -215,6 +216,9 @@ way to reject the promise.
215216

216217
Enforce standard parameter names for Promise constructors
217218

219+
:wrench: The `--fix` option on the command line can automatically fix some of
220+
the problems reported by this rule.
221+
218222
#### Valid
219223

220224
```js

rules/param-names.js

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,33 @@ module.exports = {
44
meta: {
55
docs: {
66
url: 'https://github.com/xjamundx/eslint-plugin-promise#param-names'
7-
}
7+
},
8+
fixable: 'code'
89
},
9-
create: function(context) {
10+
create(context) {
1011
return {
11-
NewExpression: function(node) {
12+
NewExpression(node) {
1213
if (node.callee.name === 'Promise' && node.arguments.length === 1) {
1314
const params = node.arguments[0].params
1415

1516
if (!params || !params.length) {
1617
return
1718
}
1819

19-
if (params[0].name !== 'resolve') {
20-
return context.report({
21-
node,
22-
message:
23-
'Promise constructor parameters must be named resolve, reject'
24-
})
25-
}
26-
27-
if (params[1] && params[1].name !== 'reject') {
28-
return context.report({
20+
if (
21+
params[0].name !== 'resolve' ||
22+
(params[1] && params[1].name !== 'reject')
23+
) {
24+
context.report({
2925
node,
3026
message:
31-
'Promise constructor parameters must be named resolve, reject'
27+
'Promise constructor parameters must be named resolve, reject',
28+
fix(fixer) {
29+
return [
30+
fixer.replaceText(params[0], 'resolve'),
31+
params[1] && fixer.replaceText(params[1], 'reject')
32+
].filter(Boolean)
33+
}
3234
})
3335
}
3436
}

test/param-names.test.js

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,43 @@
22

33
const rule = require('../rules/param-names')
44
const RuleTester = require('eslint').RuleTester
5-
const ruleTester = new RuleTester()
5+
const ruleTester = new RuleTester({
6+
parserOptions: {
7+
ecmaVersion: 6
8+
}
9+
})
610

711
const message = 'Promise constructor parameters must be named resolve, reject'
812

913
ruleTester.run('param-names', rule, {
1014
valid: [
11-
'new Promise(function(resolve, reject) { })',
12-
'new Promise(function(resolve) { })'
15+
'new Promise(function(resolve, reject) {})',
16+
'new Promise(function(resolve) {})',
17+
'new Promise(resolve => {})',
18+
'new Promise((resolve, reject) => {})',
19+
'new Promise(() => {})'
1320
],
1421

1522
invalid: [
1623
{
17-
code: 'new Promise(function(reject, resolve) { })',
18-
errors: [{ message }]
24+
code: 'new Promise(function(reject, resolve) {})',
25+
errors: [{ message }],
26+
output: 'new Promise(function(resolve, reject) {})'
27+
},
28+
{
29+
code: 'new Promise(function(resolve, rej) {})',
30+
errors: [{ message }],
31+
output: 'new Promise(function(resolve, reject) {})'
32+
},
33+
{
34+
code: 'new Promise(yes => {})',
35+
errors: [{ message }],
36+
output: 'new Promise(resolve => {})'
1937
},
2038
{
21-
code: 'new Promise(function(resolve, rej) { })',
22-
errors: [{ message }]
39+
code: 'new Promise((yes, no) => {})',
40+
errors: [{ message }],
41+
output: 'new Promise((resolve, reject) => {})'
2342
}
2443
]
2544
})

0 commit comments

Comments
 (0)