64 lines
1.9 KiB
JavaScript
64 lines
1.9 KiB
JavaScript
|
'use strict';
|
||
|
const {checkVueTemplate} = require('./utils/rule.js');
|
||
|
const {getParenthesizedRange} = require('./utils/parentheses.js');
|
||
|
const {replaceNodeOrTokenAndSpacesBefore, fixSpaceAroundKeyword} = require('./fix/index.js');
|
||
|
|
||
|
const isInstanceofToken = token => token.value === 'instanceof' && token.type === 'Keyword';
|
||
|
|
||
|
const MESSAGE_ID = 'no-instanceof-array';
|
||
|
const messages = {
|
||
|
[MESSAGE_ID]: 'Use `Array.isArray()` instead of `instanceof Array`.',
|
||
|
};
|
||
|
const selector = [
|
||
|
'BinaryExpression',
|
||
|
'[operator="instanceof"]',
|
||
|
'[right.type="Identifier"]',
|
||
|
'[right.name="Array"]',
|
||
|
].join('');
|
||
|
|
||
|
/** @param {import('eslint').Rule.RuleContext} context */
|
||
|
const create = context => {
|
||
|
const sourceCode = context.getSourceCode();
|
||
|
|
||
|
return {
|
||
|
[selector](node) {
|
||
|
const {left, right} = node;
|
||
|
let tokenStore = sourceCode;
|
||
|
let instanceofToken = tokenStore.getTokenAfter(left, isInstanceofToken);
|
||
|
if (!instanceofToken && context.parserServices.getTemplateBodyTokenStore) {
|
||
|
tokenStore = context.parserServices.getTemplateBodyTokenStore();
|
||
|
instanceofToken = tokenStore.getTokenAfter(left, isInstanceofToken);
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
node: instanceofToken,
|
||
|
messageId: MESSAGE_ID,
|
||
|
/** @param {import('eslint').Rule.RuleFixer} fixer */
|
||
|
* fix(fixer) {
|
||
|
yield * fixSpaceAroundKeyword(fixer, node, sourceCode);
|
||
|
|
||
|
const range = getParenthesizedRange(left, tokenStore);
|
||
|
yield fixer.insertTextBeforeRange(range, 'Array.isArray(');
|
||
|
yield fixer.insertTextAfterRange(range, ')');
|
||
|
|
||
|
yield * replaceNodeOrTokenAndSpacesBefore(instanceofToken, '', fixer, sourceCode, tokenStore);
|
||
|
yield * replaceNodeOrTokenAndSpacesBefore(right, '', fixer, sourceCode, tokenStore);
|
||
|
},
|
||
|
};
|
||
|
},
|
||
|
};
|
||
|
};
|
||
|
|
||
|
/** @type {import('eslint').Rule.RuleModule} */
|
||
|
module.exports = {
|
||
|
create: checkVueTemplate(create),
|
||
|
meta: {
|
||
|
type: 'suggestion',
|
||
|
docs: {
|
||
|
description: 'Require `Array.isArray()` instead of `instanceof Array`.',
|
||
|
},
|
||
|
fixable: 'code',
|
||
|
messages,
|
||
|
},
|
||
|
};
|