From c3d5bd7e15e46da35e1907555c1cb5bc84870f21 Mon Sep 17 00:00:00 2001 From: baseballyama Date: Sun, 9 Feb 2025 21:20:40 +0900 Subject: [PATCH 1/6] fix: ignore `$state` in the `prefer-const` rule --- .changeset/sixty-cars-fail.md | 5 +++++ docs/rules/prefer-const.md | 2 +- packages/eslint-plugin-svelte/src/rules/prefer-const.ts | 8 ++------ .../rules/prefer-const/invalid/test01-errors.yaml | 8 -------- .../rules/prefer-const/invalid/test01-output.svelte | 4 ++-- 5 files changed, 10 insertions(+), 17 deletions(-) create mode 100644 .changeset/sixty-cars-fail.md diff --git a/.changeset/sixty-cars-fail.md b/.changeset/sixty-cars-fail.md new file mode 100644 index 000000000..fb509d9ce --- /dev/null +++ b/.changeset/sixty-cars-fail.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': patch +--- + +fix: ignore `$state` in the `prefer-const` rule diff --git a/docs/rules/prefer-const.md b/docs/rules/prefer-const.md index a6ad021e0..9cf661d21 100644 --- a/docs/rules/prefer-const.md +++ b/docs/rules/prefer-const.md @@ -14,7 +14,7 @@ since: 'v3.0.0-next.6' ## :book: Rule Details -This rule reports the same as the base ESLint `prefer-const` rule, except that ignores Svelte reactive values such as `$derived` and `$props`. If this rule is active, make sure to disable the base `prefer-const` rule, as it will conflict with this rule. +This rule reports the same as the base ESLint `prefer-const` rule, except that ignores Svelte reactive values such as `$derived`, `$state`, and `$props`. If this rule is active, make sure to disable the base `prefer-const` rule, as it will conflict with this rule. diff --git a/packages/eslint-plugin-svelte/src/rules/prefer-const.ts b/packages/eslint-plugin-svelte/src/rules/prefer-const.ts index 0d079b1e1..a8decc816 100644 --- a/packages/eslint-plugin-svelte/src/rules/prefer-const.ts +++ b/packages/eslint-plugin-svelte/src/rules/prefer-const.ts @@ -31,7 +31,7 @@ function shouldSkipDeclaration(declaration: TSESTree.Expression | null) { return false; } - if (callee.type === 'Identifier' && ['$props', '$derived'].includes(callee.name)) { + if (callee.type === 'Identifier' && ['$props', '$state', '$derived'].includes(callee.name)) { return true; } @@ -39,11 +39,7 @@ function shouldSkipDeclaration(declaration: TSESTree.Expression | null) { return false; } - if ( - callee.object.name === '$derived' && - callee.property.type === 'Identifier' && - callee.property.name === 'by' - ) { + if (callee.object.name === '$state' || callee.object.name === '$derived') { return true; } diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-errors.yaml index fed423c4a..5e2a52173 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-errors.yaml @@ -2,14 +2,6 @@ line: 3 column: 6 suggestions: null -- message: "'state' is never reassigned. Use 'const' instead." - line: 4 - column: 6 - suggestions: null -- message: "'raw' is never reassigned. Use 'const' instead." - line: 5 - column: 6 - suggestions: null - message: "'doubled' is never reassigned. Use 'const' instead." line: 6 column: 6 diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-output.svelte index fb6da26ca..97d178239 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-output.svelte +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-output.svelte @@ -1,8 +1,8 @@ diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option1/test01-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option1/test01-output.svelte new file mode 100644 index 000000000..dd1b99c5e --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option1/test01-output.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/_config.json new file mode 100644 index 000000000..9021ae6a7 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/_config.json @@ -0,0 +1,3 @@ +{ + "options": [{ "excludedRunes": ["$state"] }] +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/test01-errors.yaml new file mode 100644 index 000000000..b784981e8 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/test01-errors.yaml @@ -0,0 +1,16 @@ +- message: "'prop1' is never reassigned. Use 'const' instead." + line: 2 + column: 8 + suggestions: null +- message: "'prop2' is never reassigned. Use 'const' instead." + line: 2 + column: 15 + suggestions: null +- message: "'derived' is never reassigned. Use 'const' instead." + line: 4 + column: 6 + suggestions: null +- message: "'derivedBy' is never reassigned. Use 'const' instead." + line: 5 + column: 6 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/test01-input.svelte new file mode 100644 index 000000000..97f28d4a2 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/test01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/test01-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/test01-output.svelte new file mode 100644 index 000000000..2e25c28b6 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/option2/test01-output.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-errors.yaml index 5e2a52173..fed423c4a 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-errors.yaml @@ -2,6 +2,14 @@ line: 3 column: 6 suggestions: null +- message: "'state' is never reassigned. Use 'const' instead." + line: 4 + column: 6 + suggestions: null +- message: "'raw' is never reassigned. Use 'const' instead." + line: 5 + column: 6 + suggestions: null - message: "'doubled' is never reassigned. Use 'const' instead." line: 6 column: 6 diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-output.svelte index 97d178239..fb6da26ca 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-output.svelte +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/invalid/test01-output.svelte @@ -1,8 +1,8 @@ diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/valid/option2/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/valid/option2/_config.json new file mode 100644 index 000000000..03a86e4c3 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/valid/option2/_config.json @@ -0,0 +1,3 @@ +{ + "options": [{ "excludedRunes": ["$props", "$derived", "$state"] }] +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/valid/option2/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/valid/option2/test01-input.svelte new file mode 100644 index 000000000..97f28d4a2 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/valid/option2/test01-input.svelte @@ -0,0 +1,6 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/valid/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/valid/test01-input.svelte index 5c768eb34..33ac25397 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/valid/test01-input.svelte +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/prefer-const/valid/test01-input.svelte @@ -1,3 +1,6 @@ From 326f231973ffb2f8fc5180643e3de056cf21cd08 Mon Sep 17 00:00:00 2001 From: baseballyama Date: Sun, 23 Feb 2025 22:34:57 +0900 Subject: [PATCH 3/6] update --- .changeset/sixty-cars-fail.md | 4 ++-- docs/rules/prefer-const.md | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.changeset/sixty-cars-fail.md b/.changeset/sixty-cars-fail.md index fb509d9ce..b98c40f6d 100644 --- a/.changeset/sixty-cars-fail.md +++ b/.changeset/sixty-cars-fail.md @@ -1,5 +1,5 @@ --- -'eslint-plugin-svelte': patch +'eslint-plugin-svelte': minor --- -fix: ignore `$state` in the `prefer-const` rule +feat: add `excludedRunes` option to the `prefer-const` rule diff --git a/docs/rules/prefer-const.md b/docs/rules/prefer-const.md index 9cf661d21..55aacb781 100644 --- a/docs/rules/prefer-const.md +++ b/docs/rules/prefer-const.md @@ -46,7 +46,8 @@ This rule reports the same as the base ESLint `prefer-const` rule, except that i "error", { "destructuring": "any", - "ignoreReadonly": true + "ignoreReadonly": true, + "excludedRunes": ["$props", "$state"] } ] } @@ -56,6 +57,7 @@ This rule reports the same as the base ESLint `prefer-const` rule, except that i - `any` (default): if any variables in destructuring should be const, this rule warns for those variables. - `all`: if all variables in destructuring should be const, this rule warns the variables. Otherwise, ignores them. - `ignoreReadonly`: If `true`, this rule will ignore variables that are read between the declaration and the _first_ assignment. +- `excludedRunes`: An array of rune names that should be ignored. Even if a rune is declared with `let`, it will still be ignored. ## :books: Further Reading From 85193f598b6264a7a80e0215e679e99663033823 Mon Sep 17 00:00:00 2001 From: baseballyama Date: Sun, 23 Feb 2025 22:41:35 +0900 Subject: [PATCH 4/6] update docs --- docs/rules/prefer-const.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rules/prefer-const.md b/docs/rules/prefer-const.md index 55aacb781..3afe130af 100644 --- a/docs/rules/prefer-const.md +++ b/docs/rules/prefer-const.md @@ -14,7 +14,7 @@ since: 'v3.0.0-next.6' ## :book: Rule Details -This rule reports the same as the base ESLint `prefer-const` rule, except that ignores Svelte reactive values such as `$derived`, `$state`, and `$props`. If this rule is active, make sure to disable the base `prefer-const` rule, as it will conflict with this rule. +This rule reports the same as the base ESLint `prefer-const` rule, except that ignores Svelte reactive values such as `$derived` and `$props` as default. If this rule is active, make sure to disable the base `prefer-const` rule, as it will conflict with this rule. From 372e455afe6d7c61f7aafa3a29284ee28c5f17db Mon Sep 17 00:00:00 2001 From: baseballyama Date: Sun, 23 Feb 2025 22:43:44 +0900 Subject: [PATCH 5/6] fix --- packages/eslint-plugin-svelte/src/rule-types.ts | 3 +++ packages/eslint-plugin-svelte/src/rules/prefer-const.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/packages/eslint-plugin-svelte/src/rule-types.ts b/packages/eslint-plugin-svelte/src/rule-types.ts index d11e3c3ef..a2cd6f4fa 100644 --- a/packages/eslint-plugin-svelte/src/rule-types.ts +++ b/packages/eslint-plugin-svelte/src/rule-types.ts @@ -523,6 +523,9 @@ type SveltePreferClassDirective = []|[{ }] // ----- svelte/prefer-const ----- type SveltePreferConst = []|[{ + destructuring?: ("any" | "all") + ignoreReadBeforeAssign?: boolean + additionalProperties?: never excludedRunes?: string[] [k: string]: unknown | undefined }] diff --git a/packages/eslint-plugin-svelte/src/rules/prefer-const.ts b/packages/eslint-plugin-svelte/src/rules/prefer-const.ts index 091e443d2..abd74ca89 100644 --- a/packages/eslint-plugin-svelte/src/rules/prefer-const.ts +++ b/packages/eslint-plugin-svelte/src/rules/prefer-const.ts @@ -59,6 +59,9 @@ export default createRule('prefer-const', { { type: 'object', properties: { + destructuring: { enum: ['any', 'all'] }, + ignoreReadBeforeAssign: { type: 'boolean' }, + additionalProperties: false, excludedRunes: { type: 'array', items: { From e4f255e80297b6043fbc995e843902966811572c Mon Sep 17 00:00:00 2001 From: baseballyama Date: Sun, 23 Feb 2025 23:07:43 +0900 Subject: [PATCH 6/6] fix --- packages/eslint-plugin-svelte/src/rule-types.ts | 2 -- packages/eslint-plugin-svelte/src/rules/prefer-const.ts | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/eslint-plugin-svelte/src/rule-types.ts b/packages/eslint-plugin-svelte/src/rule-types.ts index a2cd6f4fa..5836fa0d1 100644 --- a/packages/eslint-plugin-svelte/src/rule-types.ts +++ b/packages/eslint-plugin-svelte/src/rule-types.ts @@ -525,9 +525,7 @@ type SveltePreferClassDirective = []|[{ type SveltePreferConst = []|[{ destructuring?: ("any" | "all") ignoreReadBeforeAssign?: boolean - additionalProperties?: never excludedRunes?: string[] - [k: string]: unknown | undefined }] // ----- svelte/shorthand-attribute ----- type SvelteShorthandAttribute = []|[{ diff --git a/packages/eslint-plugin-svelte/src/rules/prefer-const.ts b/packages/eslint-plugin-svelte/src/rules/prefer-const.ts index abd74ca89..842bbc924 100644 --- a/packages/eslint-plugin-svelte/src/rules/prefer-const.ts +++ b/packages/eslint-plugin-svelte/src/rules/prefer-const.ts @@ -61,14 +61,14 @@ export default createRule('prefer-const', { properties: { destructuring: { enum: ['any', 'all'] }, ignoreReadBeforeAssign: { type: 'boolean' }, - additionalProperties: false, excludedRunes: { type: 'array', items: { type: 'string' } } - } + }, + additionalProperties: false } ] },