Skip to content

Commit d62666d

Browse files
MrHensindresorhus
authored andcommitted
prefer-node-append: Only fix when expression is not used (#321)
1 parent 0f59d01 commit d62666d

File tree

2 files changed

+95
-11
lines changed

2 files changed

+95
-11
lines changed

rules/prefer-node-append.js

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,43 @@ const getDocsUrl = require('./utils/get-docs-url');
33

44
const getMethodName = memberExpression => memberExpression.property.name;
55

6+
const ignoredParentTypes = [
7+
'IfStatement',
8+
'MemberExpression',
9+
'VariableDeclarator'
10+
];
11+
12+
const ignoredGrandparentTypes = [
13+
'ExpressionStatement'
14+
];
15+
616
const create = context => {
717
return {
818
CallExpression(node) {
9-
const {callee} = node;
19+
const {
20+
callee,
21+
parent
22+
} = node;
23+
24+
const {
25+
parent: grandparent
26+
} = (parent || {});
1027

1128
if (callee.type === 'MemberExpression' && getMethodName(callee) === 'appendChild') {
29+
let fix = fixer => fixer.replaceText(callee.property, 'append');
30+
31+
if (parent && ignoredParentTypes.includes(parent.type)) {
32+
fix = undefined;
33+
}
34+
35+
if (grandparent && ignoredGrandparentTypes.includes(grandparent.type)) {
36+
fix = undefined;
37+
}
38+
1239
context.report({
1340
node,
1441
message: 'Prefer `Node#append()` over `Node#appendChild()`.',
15-
fix: fixer => fixer.replaceText(callee.property, 'append')
42+
fix
1643
});
1744
}
1845
}

test/prefer-node-append.js

Lines changed: 66 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import test from 'ava';
22
import avaRuleTester from 'eslint-ava-rule-tester';
3+
import {outdent} from 'outdent';
34
import rule from '../rules/prefer-node-append';
45

56
const ruleTester = avaRuleTester(test, {
@@ -8,11 +9,9 @@ const ruleTester = avaRuleTester(test, {
89
}
910
});
1011

11-
const errors = [
12-
{
13-
message: 'Prefer `Node#append()` over `Node#appendChild()`.'
14-
}
15-
];
12+
const error = {
13+
message: 'Prefer `Node#append()` over `Node#appendChild()`.'
14+
};
1615

1716
ruleTester.run('prefer-node-append', rule, {
1817
valid: [
@@ -25,22 +24,80 @@ ruleTester.run('prefer-node-append', rule, {
2524
{
2625
code: 'node.appendChild(child);',
2726
output: 'node.append(child);',
28-
errors
27+
errors: [error]
2928
},
3029
{
3130
code: 'document.body.appendChild(child);',
3231
output: 'document.body.append(child);',
33-
errors
32+
errors: [error]
3433
},
3534
{
3635
code: 'node.appendChild()',
3736
output: 'node.append()',
38-
errors
37+
errors: [error]
3938
},
4039
{
4140
code: 'node.appendChild(null)',
4241
output: 'node.append(null)',
43-
errors
42+
errors: [error]
43+
},
44+
{
45+
code: outdent`
46+
function foo() {
47+
node.appendChild(null);
48+
}
49+
`,
50+
output: outdent`
51+
function foo() {
52+
node.append(null);
53+
}
54+
`,
55+
errors: [error]
56+
},
57+
{
58+
code: 'const foo = node.appendChild(child);',
59+
output: 'const foo = node.appendChild(child);',
60+
errors: [error]
61+
},
62+
{
63+
code: 'console.log(node.appendChild(child));',
64+
output: 'console.log(node.appendChild(child));',
65+
errors: [error]
66+
},
67+
{
68+
code: 'node.appendChild(child).appendChild(grandchild);',
69+
output: 'node.appendChild(child).append(grandchild);',
70+
errors: [error, error]
71+
},
72+
{
73+
code: 'node.appendChild(child) || "foo";',
74+
output: 'node.appendChild(child) || "foo";',
75+
errors: [error]
76+
},
77+
{
78+
code: 'node.appendChild(child) + 0;',
79+
output: 'node.appendChild(child) + 0;',
80+
errors: [error]
81+
},
82+
{
83+
code: 'node.appendChild(child) + 0;',
84+
output: 'node.appendChild(child) + 0;',
85+
errors: [error]
86+
},
87+
{
88+
code: '+node.appendChild(child);',
89+
output: '+node.appendChild(child);',
90+
errors: [error]
91+
},
92+
{
93+
code: 'node.appendChild(child) ? "foo" : "bar";',
94+
output: 'node.appendChild(child) ? "foo" : "bar";',
95+
errors: [error]
96+
},
97+
{
98+
code: 'if (node.appendChild(child)) {}',
99+
output: 'if (node.appendChild(child)) {}',
100+
errors: [error]
44101
}
45102
]
46103
});

0 commit comments

Comments
 (0)