Skip to content

Commit

Permalink
prefer-node-append: Only fix when expression is not used (#321)
Browse files Browse the repository at this point in the history
  • Loading branch information
MrHen authored and sindresorhus committed Jun 12, 2019
1 parent 0f59d01 commit d62666d
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 11 deletions.
31 changes: 29 additions & 2 deletions rules/prefer-node-append.js
Expand Up @@ -3,16 +3,43 @@ const getDocsUrl = require('./utils/get-docs-url');

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

const ignoredParentTypes = [
'IfStatement',
'MemberExpression',
'VariableDeclarator'
];

const ignoredGrandparentTypes = [
'ExpressionStatement'
];

const create = context => {
return {
CallExpression(node) {
const {callee} = node;
const {
callee,
parent
} = node;

const {
parent: grandparent
} = (parent || {});

if (callee.type === 'MemberExpression' && getMethodName(callee) === 'appendChild') {
let fix = fixer => fixer.replaceText(callee.property, 'append');

if (parent && ignoredParentTypes.includes(parent.type)) {
fix = undefined;
}

if (grandparent && ignoredGrandparentTypes.includes(grandparent.type)) {
fix = undefined;
}

context.report({
node,
message: 'Prefer `Node#append()` over `Node#appendChild()`.',
fix: fixer => fixer.replaceText(callee.property, 'append')
fix
});
}
}
Expand Down
75 changes: 66 additions & 9 deletions test/prefer-node-append.js
@@ -1,5 +1,6 @@
import test from 'ava';
import avaRuleTester from 'eslint-ava-rule-tester';
import {outdent} from 'outdent';
import rule from '../rules/prefer-node-append';

const ruleTester = avaRuleTester(test, {
Expand All @@ -8,11 +9,9 @@ const ruleTester = avaRuleTester(test, {
}
});

const errors = [
{
message: 'Prefer `Node#append()` over `Node#appendChild()`.'
}
];
const error = {
message: 'Prefer `Node#append()` over `Node#appendChild()`.'
};

ruleTester.run('prefer-node-append', rule, {
valid: [
Expand All @@ -25,22 +24,80 @@ ruleTester.run('prefer-node-append', rule, {
{
code: 'node.appendChild(child);',
output: 'node.append(child);',
errors
errors: [error]
},
{
code: 'document.body.appendChild(child);',
output: 'document.body.append(child);',
errors
errors: [error]
},
{
code: 'node.appendChild()',
output: 'node.append()',
errors
errors: [error]
},
{
code: 'node.appendChild(null)',
output: 'node.append(null)',
errors
errors: [error]
},
{
code: outdent`
function foo() {
node.appendChild(null);
}
`,
output: outdent`
function foo() {
node.append(null);
}
`,
errors: [error]
},
{
code: 'const foo = node.appendChild(child);',
output: 'const foo = node.appendChild(child);',
errors: [error]
},
{
code: 'console.log(node.appendChild(child));',
output: 'console.log(node.appendChild(child));',
errors: [error]
},
{
code: 'node.appendChild(child).appendChild(grandchild);',
output: 'node.appendChild(child).append(grandchild);',
errors: [error, error]
},
{
code: 'node.appendChild(child) || "foo";',
output: 'node.appendChild(child) || "foo";',
errors: [error]
},
{
code: 'node.appendChild(child) + 0;',
output: 'node.appendChild(child) + 0;',
errors: [error]
},
{
code: 'node.appendChild(child) + 0;',
output: 'node.appendChild(child) + 0;',
errors: [error]
},
{
code: '+node.appendChild(child);',
output: '+node.appendChild(child);',
errors: [error]
},
{
code: 'node.appendChild(child) ? "foo" : "bar";',
output: 'node.appendChild(child) ? "foo" : "bar";',
errors: [error]
},
{
code: 'if (node.appendChild(child)) {}',
output: 'if (node.appendChild(child)) {}',
errors: [error]
}
]
});

0 comments on commit d62666d

Please sign in to comment.