eslint-plugin-unicorn 43.0.0 β 43.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/configs/recommended.js +2 -1
- package/package.json +2 -2
- package/readme.md +1 -1
- package/rules/prefer-spread.js +24 -11
package/configs/recommended.js
CHANGED
|
@@ -78,7 +78,8 @@ module.exports = {
|
|
|
78
78
|
'unicorn/prefer-dom-node-dataset': 'error',
|
|
79
79
|
'unicorn/prefer-dom-node-remove': 'error',
|
|
80
80
|
'unicorn/prefer-dom-node-text-content': 'error',
|
|
81
|
-
|
|
81
|
+
// TODO: Enable this by default when targeting Node.js 16.
|
|
82
|
+
'unicorn/prefer-event-target': 'off',
|
|
82
83
|
'unicorn/prefer-export-from': 'error',
|
|
83
84
|
'unicorn/prefer-includes': 'error',
|
|
84
85
|
'unicorn/prefer-json-parse-buffer': 'off',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-unicorn",
|
|
3
|
-
"version": "43.0.
|
|
3
|
+
"version": "43.0.2",
|
|
4
4
|
"description": "More than 100 powerful ESLint rules",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": "sindresorhus/eslint-plugin-unicorn",
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"enquirer": "^2.3.6",
|
|
74
74
|
"eslint": "^8.18.0",
|
|
75
75
|
"eslint-ava-rule-tester": "^4.0.0",
|
|
76
|
-
"eslint-plugin-eslint-plugin": "^
|
|
76
|
+
"eslint-plugin-eslint-plugin": "^5.0.0",
|
|
77
77
|
"eslint-plugin-internal-rules": "file:./scripts/internal-rules/",
|
|
78
78
|
"eslint-remote-tester": "^3.0.0",
|
|
79
79
|
"eslint-remote-tester-repositories": "^0.0.6",
|
package/readme.md
CHANGED
|
@@ -118,7 +118,7 @@ Each rule has emojis denoting:
|
|
|
118
118
|
| [prefer-dom-node-dataset](docs/rules/prefer-dom-node-dataset.md) | Prefer using `.dataset` on DOM elements over calling attribute methods. | β
| π§ | |
|
|
119
119
|
| [prefer-dom-node-remove](docs/rules/prefer-dom-node-remove.md) | Prefer `childNode.remove()` over `parentNode.removeChild(childNode)`. | β
| π§ | π‘ |
|
|
120
120
|
| [prefer-dom-node-text-content](docs/rules/prefer-dom-node-text-content.md) | Prefer `.textContent` over `.innerText`. | β
| | π‘ |
|
|
121
|
-
| [prefer-event-target](docs/rules/prefer-event-target.md) | Prefer `EventTarget` over `EventEmitter`. |
|
|
121
|
+
| [prefer-event-target](docs/rules/prefer-event-target.md) | Prefer `EventTarget` over `EventEmitter`. | | | |
|
|
122
122
|
| [prefer-export-from](docs/rules/prefer-export-from.md) | Prefer `exportβ¦from` when re-exporting. | β
| π§ | π‘ |
|
|
123
123
|
| [prefer-includes](docs/rules/prefer-includes.md) | Prefer `.includes()` over `.indexOf()` and `Array#some()` when checking for existence or non-existence. | β
| π§ | π‘ |
|
|
124
124
|
| [prefer-json-parse-buffer](docs/rules/prefer-json-parse-buffer.md) | Prefer reading a JSON file as a buffer. | | π§ | |
|
package/rules/prefer-spread.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
const {isParenthesized, getStaticValue, isCommaToken, hasSideEffect} = require('eslint-utils');
|
|
3
|
-
const {methodCallSelector
|
|
3
|
+
const {methodCallSelector} = require('./selectors/index.js');
|
|
4
4
|
const needsSemicolon = require('./utils/needs-semicolon.js');
|
|
5
5
|
const {getParenthesizedRange, getParenthesizedText} = require('./utils/parentheses.js');
|
|
6
6
|
const shouldAddParenthesesToSpreadElementArgument = require('./utils/should-add-parentheses-to-spread-element-argument.js');
|
|
@@ -11,6 +11,7 @@ const {
|
|
|
11
11
|
removeMethodCall,
|
|
12
12
|
} = require('./fix/index.js');
|
|
13
13
|
const {isLiteral} = require('./ast/index.js');
|
|
14
|
+
const isMethodNamed = require('./utils/is-method-named.js');
|
|
14
15
|
|
|
15
16
|
const ERROR_ARRAY_FROM = 'array-from';
|
|
16
17
|
const ERROR_ARRAY_CONCAT = 'array-concat';
|
|
@@ -44,15 +45,7 @@ const arrayFromCallSelector = [
|
|
|
44
45
|
'[arguments.0.type!="ObjectExpression"]',
|
|
45
46
|
].join('');
|
|
46
47
|
|
|
47
|
-
const arrayConcatCallSelector =
|
|
48
|
-
methodCallSelector('concat'),
|
|
49
|
-
not(
|
|
50
|
-
[
|
|
51
|
-
'Literal',
|
|
52
|
-
'TemplateLiteral',
|
|
53
|
-
].map(type => `[callee.object.type="${type}"]`),
|
|
54
|
-
),
|
|
55
|
-
].join('');
|
|
48
|
+
const arrayConcatCallSelector = methodCallSelector('concat');
|
|
56
49
|
|
|
57
50
|
const arraySliceCallSelector = [
|
|
58
51
|
methodCallSelector({
|
|
@@ -320,6 +313,26 @@ function isClassName(node) {
|
|
|
320
313
|
return /^[A-Z]./.test(name) && name.toUpperCase() !== name;
|
|
321
314
|
}
|
|
322
315
|
|
|
316
|
+
function isNotArray(node, scope) {
|
|
317
|
+
if (
|
|
318
|
+
node.type === 'TemplateLiteral'
|
|
319
|
+
|| node.type === 'Literal'
|
|
320
|
+
|| node.type === 'BinaryExpression'
|
|
321
|
+
|| isClassName(node)
|
|
322
|
+
// `foo.join()`
|
|
323
|
+
|| (isMethodNamed(node, 'join') && node.arguments.length <= 1)
|
|
324
|
+
) {
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const staticValue = getStaticValue(node, scope);
|
|
329
|
+
if (staticValue && !Array.isArray(staticValue.value)) {
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
|
|
323
336
|
/** @param {import('eslint').Rule.RuleContext} context */
|
|
324
337
|
const create = context => {
|
|
325
338
|
const sourceCode = context.getSourceCode();
|
|
@@ -335,7 +348,7 @@ const create = context => {
|
|
|
335
348
|
[arrayConcatCallSelector](node) {
|
|
336
349
|
const {object} = node.callee;
|
|
337
350
|
|
|
338
|
-
if (
|
|
351
|
+
if (isNotArray(object, context.getScope())) {
|
|
339
352
|
return;
|
|
340
353
|
}
|
|
341
354
|
|