/
no-instanceof-array.js
64 lines (56 loc) · 1.89 KB
/
no-instanceof-array.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
'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('');
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,
},
};