Skip to content

Commit df25e3c

Browse files
authored
feat(param-names): add resolvePattern & rejectPattern option (#368)
1 parent 01def31 commit df25e3c

File tree

3 files changed

+75
-14
lines changed

3 files changed

+75
-14
lines changed

__tests__/param-names.js

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ const ruleTester = new RuleTester({
88
},
99
})
1010

11-
const message = 'Promise constructor parameters must be named resolve, reject'
11+
const messageForResolve =
12+
'Promise constructor parameters must be named to match "^_?resolve$"'
13+
const messageForReject =
14+
'Promise constructor parameters must be named to match "^_?reject$"'
1215

1316
ruleTester.run('param-names', rule, {
1417
valid: [
@@ -22,24 +25,42 @@ ruleTester.run('param-names', rule, {
2225
'new Promise((resolve, reject) => {})',
2326
'new Promise(() => {})',
2427
'new NonPromise()',
28+
{
29+
code: 'new Promise((yes, no) => {})',
30+
options: [{ resolvePattern: '^yes$', rejectPattern: '^no$' }],
31+
},
2532
],
2633

2734
invalid: [
2835
{
2936
code: 'new Promise(function(reject, resolve) {})',
30-
errors: [{ message }],
37+
errors: [{ message: messageForResolve }, { message: messageForReject }],
3138
},
3239
{
3340
code: 'new Promise(function(resolve, rej) {})',
34-
errors: [{ message }],
41+
errors: [{ message: messageForReject }],
3542
},
3643
{
3744
code: 'new Promise(yes => {})',
38-
errors: [{ message }],
45+
errors: [{ message: messageForResolve }],
3946
},
4047
{
4148
code: 'new Promise((yes, no) => {})',
42-
errors: [{ message }],
49+
errors: [{ message: messageForResolve }, { message: messageForReject }],
50+
},
51+
{
52+
code: 'new Promise(function(resolve, reject) {})',
53+
options: [{ resolvePattern: '^yes$', rejectPattern: '^no$' }],
54+
errors: [
55+
{
56+
message:
57+
'Promise constructor parameters must be named to match "^yes$"',
58+
},
59+
{
60+
message:
61+
'Promise constructor parameters must be named to match "^no$"',
62+
},
63+
],
4364
},
4465
],
4566
})

docs/rules/param-names.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,17 @@ Promise constructor uses the
2424
[RevealingConstructor pattern](https://blog.domenic.me/the-revealing-constructor-pattern/).
2525
Using the same parameter names as the language specification makes code more
2626
uniform and easier to understand.
27+
28+
#### Options
29+
30+
##### `resolvePattern`
31+
32+
You can pass a `{ resolvePattern: "^_?resolve$" }` as an option to this rule to
33+
the first argument name pattern that the rule allows. Default is
34+
`"^_?resolve$"`.
35+
36+
##### `rejectPattern`
37+
38+
You can pass a `{ rejectPattern: "^_?reject$" }` as an option to this rule to
39+
the second argument name pattern that the rule allows. Default is
40+
`"^_?reject$"`.

rules/param-names.js

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,25 @@ module.exports = {
88
docs: {
99
url: getDocsUrl('param-names'),
1010
},
11-
schema: [],
11+
schema: [
12+
{
13+
type: 'object',
14+
properties: {
15+
resolvePattern: { type: 'string' },
16+
rejectPattern: { type: 'string' },
17+
},
18+
additionalProperties: false,
19+
},
20+
],
1221
},
1322
create(context) {
23+
const options = context.options[0] || {}
24+
const resolvePattern = new RegExp(
25+
options.resolvePattern || '^_?resolve$',
26+
'u'
27+
)
28+
const rejectPattern = new RegExp(options.rejectPattern || '^_?reject$', 'u')
29+
1430
return {
1531
NewExpression(node) {
1632
if (node.callee.name === 'Promise' && node.arguments.length === 1) {
@@ -20,16 +36,26 @@ module.exports = {
2036
return
2137
}
2238

23-
if (
24-
(params[0].name !== 'resolve' && params[0].name !== '_resolve') ||
25-
(params[1] &&
26-
params[1].name !== 'reject' &&
27-
params[1].name !== '_reject')
28-
) {
39+
const resolveParamName = params[0] && params[0].name
40+
if (resolveParamName && !resolvePattern.test(resolveParamName)) {
41+
context.report({
42+
node: params[0],
43+
message:
44+
'Promise constructor parameters must be named to match "{{ resolvePattern }}"',
45+
data: {
46+
resolvePattern: resolvePattern.source,
47+
},
48+
})
49+
}
50+
const rejectParamName = params[1] && params[1].name
51+
if (rejectParamName && !rejectPattern.test(rejectParamName)) {
2952
context.report({
30-
node,
53+
node: params[1],
3154
message:
32-
'Promise constructor parameters must be named resolve, reject',
55+
'Promise constructor parameters must be named to match "{{ rejectPattern }}"',
56+
data: {
57+
rejectPattern: rejectPattern.source,
58+
},
3359
})
3460
}
3561
}

0 commit comments

Comments
 (0)