Skip to content

Commit d2fbee0

Browse files
authored
Refactor prefer-node-append to use selector (#509)
1 parent eb23520 commit d2fbee0

File tree

3 files changed

+56
-20
lines changed

3 files changed

+56
-20
lines changed

rules/prefer-node-append.js

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
'use strict';
22
const getDocumentationUrl = require('./utils/get-documentation-url');
33
const isValueNotUsable = require('./utils/is-value-not-usable');
4+
const methodSelector = require('./utils/method-selector');
45

5-
const getMethodName = memberExpression => memberExpression.property.name;
6+
const message = 'Prefer `Node#append()` over `Node#appendChild()`.';
7+
const selector = methodSelector({
8+
name: 'appendChild',
9+
length: 1
10+
});
611

712
const create = context => {
813
return {
9-
CallExpression(node) {
10-
const {callee} = node;
14+
[selector](node) {
15+
// TODO: exclude those cases parent/child impossible to be `Node`
16+
const fix = isValueNotUsable(node) ?
17+
fixer => fixer.replaceText(node.callee.property, 'append') :
18+
undefined;
1119

12-
if (callee.type === 'MemberExpression' && getMethodName(callee) === 'appendChild') {
13-
const fix = isValueNotUsable(node) ? fixer => fixer.replaceText(callee.property, 'append') : undefined;
14-
15-
context.report({
16-
node,
17-
message: 'Prefer `Node#append()` over `Node#appendChild()`.',
18-
fix
19-
});
20-
}
20+
context.report({
21+
node,
22+
message,
23+
fix
24+
});
2125
}
2226
};
2327
};

rules/utils/method-selector.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
'use strict';
2+
3+
module.exports = options => {
4+
const {name, length, allowSpreadElement} = {
5+
allowSpreadElement: false,
6+
...options
7+
};
8+
9+
return [
10+
'CallExpression',
11+
'[callee.type="MemberExpression"]',
12+
'[callee.computed=false]',
13+
'[callee.property.type="Identifier"]',
14+
`[callee.property.name="${name}"]`,
15+
`[arguments.length=${length}]`,
16+
...(
17+
allowSpreadElement ?
18+
[] :
19+
Array.from(
20+
{length},
21+
(_, index) => `[arguments.${index}.type!="SpreadElement"]`
22+
)
23+
)
24+
].join('');
25+
};

test/prefer-node-append.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,22 @@ const error = {
1515

1616
ruleTester.run('prefer-node-append', rule, {
1717
valid: [
18+
// Already using `append`
1819
'parent.append(child);',
19-
'document.body.append(child, \'text\');',
20-
'node.append()',
21-
'node.append(null)'
20+
// Not `CallExpression`
21+
'new parent.appendChild(child);',
22+
// Not `MemberExpression`
23+
'appendChild(child);',
24+
// `callee.property` is not a `Identifier`
25+
'parent[\'appendChild\'](child);',
26+
// Computed
27+
'parent[appendChild](child);',
28+
// Not `appendChild`
29+
'parent.foo(child);',
30+
// More or less argument(s)
31+
'parent.appendChild(one, two);',
32+
'parent.appendChild();',
33+
'parent.appendChild(...argumentsArray)'
2234
],
2335
invalid: [
2436
{
@@ -31,11 +43,6 @@ ruleTester.run('prefer-node-append', rule, {
3143
output: 'document.body.append(child);',
3244
errors: [error]
3345
},
34-
{
35-
code: 'node.appendChild()',
36-
output: 'node.append()',
37-
errors: [error]
38-
},
3946
{
4047
code: 'node.appendChild(null)',
4148
output: 'node.append(null)',

0 commit comments

Comments
 (0)