diff --git a/lib/rules/no-multi-assign.js b/lib/rules/no-multi-assign.js index ab6430c19ef..7cee1a914b8 100644 --- a/lib/rules/no-multi-assign.js +++ b/lib/rules/no-multi-assign.js @@ -21,7 +21,16 @@ module.exports = { url: "https://eslint.org/docs/rules/no-multi-assign" }, - schema: [], + schema: [{ + type: "object", + properties: { + ignoreNonDeclaration: { + type: "boolean", + default: false + } + }, + additionalProperties: false + }], messages: { unexpectedChain: "Unexpected chained assignment." @@ -33,10 +42,15 @@ module.exports = { //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- + const options = context.options[0] || { + ignoreNonDeclaration: false + }; return { AssignmentExpression(node) { - if (["AssignmentExpression", "VariableDeclarator"].indexOf(node.parent.type) !== -1) { + const target = options.ignoreNonDeclaration ? ["VariableDeclarator"] : ["AssignmentExpression", "VariableDeclarator"]; + + if (target.indexOf(node.parent.type) !== -1) { context.report({ node, messageId: "unexpectedChain" diff --git a/tests/lib/rules/no-multi-assign.js b/tests/lib/rules/no-multi-assign.js index dc907465c60..ba1c6e434b3 100644 --- a/tests/lib/rules/no-multi-assign.js +++ b/tests/lib/rules/no-multi-assign.js @@ -39,6 +39,7 @@ function errorAt(line, column, type) { //------------------------------------------------------------------------------ const ruleTester = new RuleTester(); +const options = [{ ignoreNonDeclaration: true }]; ruleTester.run("no-mutli-assign", rule, { valid: [ @@ -51,7 +52,8 @@ ruleTester.run("no-mutli-assign", rule, { { code: "for(let a = 0, b = 0;;){}", parserOptions: { ecmaVersion: 6 } }, { code: "for(const a = 0, b = 0;;){}", parserOptions: { ecmaVersion: 6 } }, { code: "export let a, b;", parserOptions: { ecmaVersion: 6, sourceType: "module" } }, - { code: "export let a,\n b = 0;", parserOptions: { ecmaVersion: 6, sourceType: "module" } } + { code: "export let a,\n b = 0;", parserOptions: { ecmaVersion: 6, sourceType: "module" } }, + { code: "const x = {};const y = {};x.one = y.one = 1;", options, parserOptions: { ecmaVersion: 6 } } ], invalid: [ @@ -137,6 +139,15 @@ ruleTester.run("no-mutli-assign", rule, { errors: [ errorAt(1, 5, "AssignmentExpression") ] + }, + { + code: "const x = {};\nconst y = x.one = 1;", + options, + parserOptions: { ecmaVersion: 6 }, + errors: [ + errorAt(2, 11, "AssignmentExpression") + ] + } ] });