Skip to content

Commit 5c29c5c

Browse files
committed
feat: Add svelte/prefer-const rule that excludes reactive variables
1 parent 7ec6c0f commit 5c29c5c

File tree

13 files changed

+499
-8
lines changed

13 files changed

+499
-8
lines changed

.changeset/tricky-windows-brush.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'eslint-plugin-svelte': minor
3+
---
4+
5+
Add svelte/prefer-const rule that excludes reactive variables

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ These rules relate to better ways of doing things to help you avoid problems:
425425
| [svelte/no-unused-class-name](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-unused-class-name/) | disallow the use of a class in the template without a corresponding style | |
426426
| [svelte/no-unused-svelte-ignore](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-unused-svelte-ignore/) | disallow unused svelte-ignore comments | :star: |
427427
| [svelte/no-useless-mustaches](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-useless-mustaches/) | disallow unnecessary mustache interpolations | :wrench: |
428+
| [svelte/prefer-const](https://sveltejs.github.io/eslint-plugin-svelte/rules/prefer-const/) | Require `const` declarations for variables that are never reassigned after declared (excludes reactive values). | :wrench: |
428429
| [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: |
429430
| [svelte/require-each-key](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-each-key/) | require keyed `{#each}` block | |
430431
| [svelte/require-event-dispatcher-types](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-event-dispatcher-types/) | require type parameters for `createEventDispatcher` | |

docs/rules.md

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ These rules relate to better ways of doing things to help you avoid problems:
6262
| [svelte/no-unused-class-name](./rules/no-unused-class-name.md) | disallow the use of a class in the template without a corresponding style | |
6363
| [svelte/no-unused-svelte-ignore](./rules/no-unused-svelte-ignore.md) | disallow unused svelte-ignore comments | :star: |
6464
| [svelte/no-useless-mustaches](./rules/no-useless-mustaches.md) | disallow unnecessary mustache interpolations | :wrench: |
65+
| [svelte/prefer-const](./rules/prefer-const.md) | Require `const` declarations for variables that are never reassigned after declared (excludes reactive values). | :wrench: |
6566
| [svelte/prefer-destructured-store-props](./rules/prefer-destructured-store-props.md) | destructure values from object stores for better change tracking & fewer redraws | :bulb: |
6667
| [svelte/require-each-key](./rules/require-each-key.md) | require keyed `{#each}` block | |
6768
| [svelte/require-event-dispatcher-types](./rules/require-event-dispatcher-types.md) | require type parameters for `createEventDispatcher` | |

docs/rules/prefer-const.md

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
---
2+
pageClass: 'rule-details'
3+
sidebarDepth: 0
4+
title: 'svelte/prefer-const'
5+
description: 'Require `const` declarations for variables that are never reassigned after declared (excludes reactive values).'
6+
---
7+
8+
# svelte/prefer-const
9+
10+
> Require `const` declarations for variables that are never reassigned after declared (excludes reactive values).
11+
12+
- :exclamation: <badge text="This rule has not been released yet." vertical="middle" type="error"> **_This rule has not been released yet._** </badge>
13+
- :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule.
14+
15+
## :book: Rule Details
16+
17+
Based on https://eslint.org/docs/latest/rules/prefer-const but skips reactive variables created by runes.
18+
19+
## :mag: Implementation
20+
21+
- [Rule source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/src/rules/prefer-const.ts)
22+
- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/tests/src/rules/prefer-const.ts)

packages/eslint-plugin-svelte/package.json

+8-8
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
"eslint-compat-utils": "^0.5.1",
6262
"esutils": "^2.0.3",
6363
"known-css-properties": "^0.34.0",
64-
"postcss": "^8.4.38",
64+
"postcss": "^8.4.39",
6565
"postcss-load-config": "^3.1.4",
6666
"postcss-safe-parser": "^6.0.0",
6767
"postcss-selector-parser": "^6.1.0",
@@ -78,27 +78,27 @@
7878
"@types/esutils": "^2.0.2",
7979
"@types/json-schema": "^7.0.15",
8080
"@types/less": "^3.0.6",
81-
"@types/mocha": "^10.0.6",
82-
"@types/node": "^20.14.2",
81+
"@types/mocha": "^10.0.7",
82+
"@types/node": "^20.14.10",
8383
"@types/postcss-safe-parser": "^5.0.4",
8484
"@types/semver": "^7.5.8",
8585
"@types/stylus": "^0.48.42",
86-
"acorn": "^8.12.0",
86+
"acorn": "^8.12.1",
8787
"assert": "^2.1.0",
8888
"esbuild": "^0.23.0",
8989
"esbuild-register": "^3.5.0",
9090
"eslint-scope": "^8.0.1",
9191
"eslint-typegen": "^0.2.4",
9292
"eslint-visitor-keys": "^4.0.0",
93-
"espree": "^10.0.1",
93+
"espree": "^10.1.0",
9494
"less": "^4.2.0",
95-
"mocha": "^10.4.0",
95+
"mocha": "^10.6.0",
9696
"nyc": "^17.0.0",
9797
"postcss-nested": "^6.0.1",
98-
"sass": "^1.77.5",
98+
"sass": "^1.77.6",
9999
"source-map-js": "^1.2.0",
100100
"stylus": "^0.63.0",
101-
"svelte": "^5.0.0-next.155",
101+
"svelte": "5.0.0-next.175",
102102
"svelte-i18n": "^4.0.0",
103103
"type-coverage": "^2.29.0",
104104
"yaml": "^2.4.5"

packages/eslint-plugin-svelte/src/rule-types.ts

+10
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,11 @@ export interface RuleOptions {
249249
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/prefer-class-directive/
250250
*/
251251
'svelte/prefer-class-directive'?: Linter.RuleEntry<SveltePreferClassDirective>
252+
/**
253+
* Require `const` declarations for variables that are never reassigned after declared (excludes reactive values).
254+
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/prefer-const/
255+
*/
256+
'svelte/prefer-const'?: Linter.RuleEntry<SveltePreferConst>
252257
/**
253258
* destructure values from object stores for better change tracking & fewer redraws
254259
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/prefer-destructured-store-props/
@@ -460,6 +465,11 @@ type SvelteNoUselessMustaches = []|[{
460465
type SveltePreferClassDirective = []|[{
461466
prefer?: ("always" | "empty")
462467
}]
468+
// ----- svelte/prefer-const -----
469+
type SveltePreferConst = []|[{
470+
destructuring?: ("any" | "all")
471+
ignoreReadBeforeAssign?: boolean
472+
}]
463473
// ----- svelte/shorthand-attribute -----
464474
type SvelteShorthandAttribute = []|[{
465475
prefer?: ("always" | "never")

0 commit comments

Comments
 (0)