UNPKG

1.26 kBJavaScriptView Raw
1'use strict';
2const getDocumentationUrl = require('./utils/get-documentation-url');
3const methodSelector = require('./utils/method-selector');
4const needsSemicolon = require('./utils/needs-semicolon');
5
6const selector = [
7 methodSelector({
8 object: 'Array',
9 name: 'from',
10 min: 1,
11 max: 3
12 }),
13 // Allow `Array.from({length})`
14 '[arguments.0.type!="ObjectExpression"]'
15].join('');
16
17const create = context => {
18 const sourceCode = context.getSourceCode();
19 const getSource = node => sourceCode.getText(node);
20
21 return {
22 [selector](node) {
23 context.report({
24 node,
25 message: 'Prefer the spread operator over `Array.from()`.',
26 fix: fixer => {
27 const [arrayLikeArgument, mapFn, thisArgument] = node.arguments.map(node => getSource(node));
28 let replacement = `${
29 needsSemicolon(sourceCode.getTokenBefore(node), sourceCode) ? ';' : ''
30 }[...${arrayLikeArgument}]`;
31
32 if (mapFn) {
33 const mapArguments = [mapFn, thisArgument].filter(Boolean);
34 replacement += `.map(${mapArguments.join(', ')})`;
35 }
36
37 return fixer.replaceText(node, replacement);
38 }
39 });
40 }
41 };
42};
43
44module.exports = {
45 create,
46 meta: {
47 type: 'suggestion',
48 docs: {
49 url: getDocumentationUrl(__filename)
50 },
51 fixable: 'code'
52 }
53};