eslint-plugin-svelte 2.27.3 → 2.28.0
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/README.md +2 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -0
- package/lib/meta.d.ts +2 -0
- package/lib/meta.js +5 -0
- package/lib/processor/index.d.ts +1 -0
- package/lib/processor/index.js +25 -1
- package/lib/rules/no-immutable-reactive-statements.js +7 -2
- package/lib/rules/prefer-destructured-store-props.js +2 -2
- package/lib/rules/require-each-key.d.ts +2 -0
- package/lib/rules/require-each-key.js +27 -0
- package/lib/rules/valid-each-key.d.ts +2 -0
- package/lib/rules/valid-each-key.js +47 -0
- package/lib/utils/rules.js +4 -0
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -346,9 +346,11 @@ These rules relate to better ways of doing things to help you avoid problems:
|
|
|
346
346
|
| [svelte/no-unused-svelte-ignore](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-unused-svelte-ignore/) | disallow unused svelte-ignore comments | :star: |
|
|
347
347
|
| [svelte/no-useless-mustaches](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-useless-mustaches/) | disallow unnecessary mustache interpolations | :wrench: |
|
|
348
348
|
| [svelte/prefer-destructured-store-props](https://sveltejs.github.io/eslint-plugin-svelte/rules/prefer-destructured-store-props/) | destructure values from object stores for better change tracking & fewer redraws | :bulb: |
|
|
349
|
+
| [svelte/require-each-key](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-each-key/) | require keyed `{#each}` block | |
|
|
349
350
|
| [svelte/require-event-dispatcher-types](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-event-dispatcher-types/) | require type parameters for `createEventDispatcher` | |
|
|
350
351
|
| [svelte/require-optimized-style-attribute](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-optimized-style-attribute/) | require style attributes that can be optimized | |
|
|
351
352
|
| [svelte/require-stores-init](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-stores-init/) | require initial value in store | |
|
|
353
|
+
| [svelte/valid-each-key](https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-each-key/) | enforce keys to use variables defined in the `{#each}` block | |
|
|
352
354
|
|
|
353
355
|
## Stylistic Issues
|
|
354
356
|
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -31,6 +31,7 @@ const recommended_1 = __importDefault(require("./configs/recommended"));
|
|
|
31
31
|
const prettier_1 = __importDefault(require("./configs/prettier"));
|
|
32
32
|
const all_1 = __importDefault(require("./configs/all"));
|
|
33
33
|
const processor = __importStar(require("./processor"));
|
|
34
|
+
const meta = __importStar(require("./meta"));
|
|
34
35
|
const configs = {
|
|
35
36
|
base: base_1.default,
|
|
36
37
|
recommended: recommended_1.default,
|
|
@@ -42,6 +43,7 @@ const rules = rules_1.rules.reduce((obj, r) => {
|
|
|
42
43
|
return obj;
|
|
43
44
|
}, {});
|
|
44
45
|
module.exports = {
|
|
46
|
+
meta,
|
|
45
47
|
configs,
|
|
46
48
|
rules,
|
|
47
49
|
processors: {
|
package/lib/meta.d.ts
ADDED
package/lib/meta.js
ADDED
package/lib/processor/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Linter } from "eslint";
|
|
2
|
+
export * as meta from "../meta";
|
|
2
3
|
export declare function preprocess(code: string, filename: string): string[];
|
|
3
4
|
export declare function postprocess([messages]: Linter.LintMessage[][], filename: string): Linter.LintMessage[];
|
|
4
5
|
export declare const supportsAutofix = true;
|
package/lib/processor/index.js
CHANGED
|
@@ -1,7 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.supportsAutofix = exports.postprocess = exports.preprocess = void 0;
|
|
26
|
+
exports.supportsAutofix = exports.postprocess = exports.preprocess = exports.meta = void 0;
|
|
4
27
|
const shared_1 = require("../shared");
|
|
28
|
+
exports.meta = __importStar(require("../meta"));
|
|
5
29
|
function preprocess(code, filename) {
|
|
6
30
|
if (filename) {
|
|
7
31
|
(0, shared_1.beginShared)(filename);
|
|
@@ -91,9 +91,14 @@ exports.default = (0, utils_1.createRule)("no-immutable-reactive-statements", {
|
|
|
91
91
|
return;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
|
-
|
|
94
|
+
for (const through of toplevelScope.through.filter((reference) => node.range[0] <= reference.identifier.range[0] &&
|
|
95
95
|
reference.identifier.range[1] <= node.range[1])) {
|
|
96
|
-
|
|
96
|
+
if (through.identifier.name.startsWith("$$")) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (through.resolved == null) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
97
102
|
}
|
|
98
103
|
context.report({
|
|
99
104
|
node: node.body.type === "ExpressionStatement" &&
|
|
@@ -91,7 +91,7 @@ exports.default = (0, utils_1.createRule)("prefer-destructured-store-props", {
|
|
|
91
91
|
"SvelteScriptElement:exit"() {
|
|
92
92
|
inScriptElement = false;
|
|
93
93
|
},
|
|
94
|
-
"MemberExpression[object.type='Identifier'][object.name
|
|
94
|
+
"MemberExpression[object.type='Identifier'][object.name=/^\\$[^\\$]/]"(node) {
|
|
95
95
|
if (inScriptElement)
|
|
96
96
|
return;
|
|
97
97
|
storeMemberAccessStack.unshift({ node, identifiers: [] });
|
|
@@ -99,7 +99,7 @@ exports.default = (0, utils_1.createRule)("prefer-destructured-store-props", {
|
|
|
99
99
|
Identifier(node) {
|
|
100
100
|
storeMemberAccessStack[0]?.identifiers.push(node);
|
|
101
101
|
},
|
|
102
|
-
"MemberExpression[object.type='Identifier'][object.name
|
|
102
|
+
"MemberExpression[object.type='Identifier'][object.name=/^\\$[^\\$]/]:exit"(node) {
|
|
103
103
|
if (storeMemberAccessStack[0]?.node !== node)
|
|
104
104
|
return;
|
|
105
105
|
const { identifiers } = storeMemberAccessStack.shift();
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("../utils");
|
|
4
|
+
exports.default = (0, utils_1.createRule)("require-each-key", {
|
|
5
|
+
meta: {
|
|
6
|
+
docs: {
|
|
7
|
+
description: "require keyed `{#each}` block",
|
|
8
|
+
category: "Best Practices",
|
|
9
|
+
recommended: false,
|
|
10
|
+
},
|
|
11
|
+
schema: [],
|
|
12
|
+
messages: { expectedKey: "Each block should have a key" },
|
|
13
|
+
type: "suggestion",
|
|
14
|
+
},
|
|
15
|
+
create(context) {
|
|
16
|
+
return {
|
|
17
|
+
SvelteEachBlock(node) {
|
|
18
|
+
if (node.key == null) {
|
|
19
|
+
context.report({
|
|
20
|
+
node,
|
|
21
|
+
messageId: "expectedKey",
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("../utils");
|
|
4
|
+
const ast_utils_1 = require("../utils/ast-utils");
|
|
5
|
+
exports.default = (0, utils_1.createRule)("valid-each-key", {
|
|
6
|
+
meta: {
|
|
7
|
+
docs: {
|
|
8
|
+
description: "enforce keys to use variables defined in the `{#each}` block",
|
|
9
|
+
category: "Best Practices",
|
|
10
|
+
recommended: false,
|
|
11
|
+
},
|
|
12
|
+
schema: [],
|
|
13
|
+
messages: {
|
|
14
|
+
keyUseEachVars: "Expected key to use the variables which are defined by the `{#each}` block.",
|
|
15
|
+
},
|
|
16
|
+
type: "suggestion",
|
|
17
|
+
},
|
|
18
|
+
create(context) {
|
|
19
|
+
return {
|
|
20
|
+
SvelteEachBlock(node) {
|
|
21
|
+
if (node.key == null) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const scope = (0, ast_utils_1.getScope)(context, node.key);
|
|
25
|
+
for (const variable of scope.variables) {
|
|
26
|
+
if (!variable.defs.some((def) => (node.context.range[0] <= def.name.range[0] &&
|
|
27
|
+
def.name.range[1] <= node.context.range[1]) ||
|
|
28
|
+
(node.index &&
|
|
29
|
+
node.index.range[0] <= def.name.range[0] &&
|
|
30
|
+
def.name.range[1] <= node.index.range[1]))) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
for (const reference of variable.references) {
|
|
34
|
+
if (node.key.range[0] <= reference.identifier.range[0] &&
|
|
35
|
+
reference.identifier.range[1] <= node.key.range[1]) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
context.report({
|
|
41
|
+
node: node.key,
|
|
42
|
+
messageId: "keyUseEachVars",
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
});
|
package/lib/utils/rules.js
CHANGED
|
@@ -47,6 +47,7 @@ const no_useless_mustaches_1 = __importDefault(require("../rules/no-useless-must
|
|
|
47
47
|
const prefer_class_directive_1 = __importDefault(require("../rules/prefer-class-directive"));
|
|
48
48
|
const prefer_destructured_store_props_1 = __importDefault(require("../rules/prefer-destructured-store-props"));
|
|
49
49
|
const prefer_style_directive_1 = __importDefault(require("../rules/prefer-style-directive"));
|
|
50
|
+
const require_each_key_1 = __importDefault(require("../rules/require-each-key"));
|
|
50
51
|
const require_event_dispatcher_types_1 = __importDefault(require("../rules/require-event-dispatcher-types"));
|
|
51
52
|
const require_optimized_style_attribute_1 = __importDefault(require("../rules/require-optimized-style-attribute"));
|
|
52
53
|
const require_store_callbacks_use_set_param_1 = __importDefault(require("../rules/require-store-callbacks-use-set-param"));
|
|
@@ -58,6 +59,7 @@ const sort_attributes_1 = __importDefault(require("../rules/sort-attributes"));
|
|
|
58
59
|
const spaced_html_comment_1 = __importDefault(require("../rules/spaced-html-comment"));
|
|
59
60
|
const system_1 = __importDefault(require("../rules/system"));
|
|
60
61
|
const valid_compile_1 = __importDefault(require("../rules/valid-compile"));
|
|
62
|
+
const valid_each_key_1 = __importDefault(require("../rules/valid-each-key"));
|
|
61
63
|
const valid_prop_names_in_kit_pages_1 = __importDefault(require("../rules/valid-prop-names-in-kit-pages"));
|
|
62
64
|
exports.rules = [
|
|
63
65
|
no_unnecessary_condition_1.default,
|
|
@@ -103,6 +105,7 @@ exports.rules = [
|
|
|
103
105
|
prefer_class_directive_1.default,
|
|
104
106
|
prefer_destructured_store_props_1.default,
|
|
105
107
|
prefer_style_directive_1.default,
|
|
108
|
+
require_each_key_1.default,
|
|
106
109
|
require_event_dispatcher_types_1.default,
|
|
107
110
|
require_optimized_style_attribute_1.default,
|
|
108
111
|
require_store_callbacks_use_set_param_1.default,
|
|
@@ -114,5 +117,6 @@ exports.rules = [
|
|
|
114
117
|
spaced_html_comment_1.default,
|
|
115
118
|
system_1.default,
|
|
116
119
|
valid_compile_1.default,
|
|
120
|
+
valid_each_key_1.default,
|
|
117
121
|
valid_prop_names_in_kit_pages_1.default,
|
|
118
122
|
];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-svelte",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.28.0",
|
|
4
4
|
"description": "ESLint plugin for Svelte using AST",
|
|
5
5
|
"repository": "git+https://github.com/sveltejs/eslint-plugin-svelte.git",
|
|
6
6
|
"homepage": "https://sveltejs.github.io/eslint-plugin-svelte",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
"sveltejs"
|
|
27
27
|
],
|
|
28
28
|
"scripts": {
|
|
29
|
-
"build": "yarn build:ts",
|
|
29
|
+
"build": "yarn build:meta && yarn build:ts",
|
|
30
|
+
"build:meta": "yarn ts ./tools/update-meta.ts",
|
|
30
31
|
"build:ts": "tsc --project ./tsconfig.build.json",
|
|
31
32
|
"clean": "rimraf .nyc_output lib coverage build .svelte-kit svelte.config-dist.js",
|
|
32
33
|
"cover": "nyc --reporter=lcov yarn test",
|
|
@@ -73,7 +74,7 @@
|
|
|
73
74
|
"postcss": "^8.4.5",
|
|
74
75
|
"postcss-load-config": "^3.1.4",
|
|
75
76
|
"postcss-safe-parser": "^6.0.0",
|
|
76
|
-
"svelte-eslint-parser": "^0.
|
|
77
|
+
"svelte-eslint-parser": "^0.28.0"
|
|
77
78
|
},
|
|
78
79
|
"devDependencies": {
|
|
79
80
|
"@1stg/browserslist-config": "^1.2.3",
|
|
@@ -130,7 +131,7 @@
|
|
|
130
131
|
"eslint-plugin-markdown": "^3.0.0",
|
|
131
132
|
"eslint-plugin-mdx": "^2.0.2",
|
|
132
133
|
"eslint-plugin-node": "^11.1.0",
|
|
133
|
-
"eslint-plugin-node-dependencies": "^0.
|
|
134
|
+
"eslint-plugin-node-dependencies": "^0.11.0",
|
|
134
135
|
"eslint-plugin-prettier": "^4.0.0",
|
|
135
136
|
"eslint-plugin-regexp": "^1.0.0",
|
|
136
137
|
"eslint-plugin-svelte": "^2.11.0",
|