82 lines
2.2 KiB
JavaScript
82 lines
2.2 KiB
JavaScript
'use strict';
|
|
const {isParenthesized} = require('@eslint-community/eslint-utils');
|
|
const shouldAddParenthesesToMemberExpressionObject = require('./utils/should-add-parentheses-to-member-expression-object.js');
|
|
const {fixSpaceAroundKeyword} = require('./fix/index.js');
|
|
|
|
const MESSAGE_ID = 'no-unreadable-array-destructuring';
|
|
const messages = {
|
|
[MESSAGE_ID]: 'Array destructuring may not contain consecutive ignored values.',
|
|
};
|
|
|
|
const isCommaFollowedWithComma = (element, index, array) =>
|
|
element === null && array[index + 1] === null;
|
|
|
|
/** @param {import('eslint').Rule.RuleContext} context */
|
|
const create = context => {
|
|
const sourceCode = context.getSourceCode();
|
|
|
|
return {
|
|
'ArrayPattern[elements.length>=3]'(node) {
|
|
const {elements, parent} = node;
|
|
|
|
if (!elements.some((element, index, elements) => isCommaFollowedWithComma(element, index, elements))) {
|
|
return;
|
|
}
|
|
|
|
const problem = {
|
|
node,
|
|
messageId: MESSAGE_ID,
|
|
};
|
|
|
|
const nonNullElements = elements.filter(node => node !== null);
|
|
if (
|
|
parent.type === 'VariableDeclarator'
|
|
&& parent.id === node
|
|
&& parent.init !== null
|
|
&& nonNullElements.length === 1
|
|
) {
|
|
const [element] = nonNullElements;
|
|
|
|
if (element.type !== 'AssignmentPattern') {
|
|
problem.fix = function * (fixer) {
|
|
const index = elements.indexOf(element);
|
|
const isSlice = element.type === 'RestElement';
|
|
const variable = isSlice ? element.argument : element;
|
|
|
|
yield fixer.replaceText(node, sourceCode.getText(variable));
|
|
|
|
const code = isSlice ? `.slice(${index})` : `[${index}]`;
|
|
const array = parent.init;
|
|
if (
|
|
!isParenthesized(array, sourceCode)
|
|
&& shouldAddParenthesesToMemberExpressionObject(array, sourceCode)
|
|
) {
|
|
yield fixer.insertTextBefore(array, '(');
|
|
yield fixer.insertTextAfter(parent, `)${code}`);
|
|
} else {
|
|
yield fixer.insertTextAfter(parent, code);
|
|
}
|
|
|
|
yield * fixSpaceAroundKeyword(fixer, node, sourceCode);
|
|
};
|
|
}
|
|
}
|
|
|
|
return problem;
|
|
},
|
|
};
|
|
};
|
|
|
|
/** @type {import('eslint').Rule.RuleModule} */
|
|
module.exports = {
|
|
create,
|
|
meta: {
|
|
type: 'suggestion',
|
|
docs: {
|
|
description: 'Disallow unreadable array destructuring.',
|
|
},
|
|
fixable: 'code',
|
|
messages,
|
|
},
|
|
};
|