Skip to content

Commit 642e4dd

Browse files
committed
refactor: Instead of "signal", use wording used in the Svelte docs
1 parent f5775b7 commit 642e4dd

File tree

14 files changed

+76
-42
lines changed

14 files changed

+76
-42
lines changed

.changeset/proud-donuts-tickle.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
'eslint-plugin-svelte': minor
33
---
44

5-
New svelte/signal-prefer-let rule
5+
New svelte/rune-prefer-let rule

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ These rules relate to better ways of doing things to help you avoid problems:
430430
| [svelte/require-event-dispatcher-types](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-event-dispatcher-types/) | require type parameters for `createEventDispatcher` | |
431431
| [svelte/require-optimized-style-attribute](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-optimized-style-attribute/) | require style attributes that can be optimized | |
432432
| [svelte/require-stores-init](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-stores-init/) | require initial value in store | |
433-
| [svelte/signal-prefer-let](https://sveltejs.github.io/eslint-plugin-svelte/rules/signal-prefer-let/) | use let instead of const for signals values | :wrench: |
433+
| [svelte/rune-prefer-let](https://sveltejs.github.io/eslint-plugin-svelte/rules/rune-prefer-let/) | use let instead of const for reactive variables created by runes | :wrench: |
434434
| [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 | |
435435

436436
## Stylistic Issues

docs/rules.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ These rules relate to better ways of doing things to help you avoid problems:
6767
| [svelte/require-event-dispatcher-types](./rules/require-event-dispatcher-types.md) | require type parameters for `createEventDispatcher` | |
6868
| [svelte/require-optimized-style-attribute](./rules/require-optimized-style-attribute.md) | require style attributes that can be optimized | |
6969
| [svelte/require-stores-init](./rules/require-stores-init.md) | require initial value in store | |
70-
| [svelte/signal-prefer-let](./rules/signal-prefer-let.md) | use let instead of const for signals values | :wrench: |
70+
| [svelte/rune-prefer-let](./rules/rune-prefer-let.md) | use let instead of const for reactive variables created by runes | :wrench: |
7171
| [svelte/valid-each-key](./rules/valid-each-key.md) | enforce keys to use variables defined in the `{#each}` block | |
7272

7373
## Stylistic Issues

docs/rules/signal-prefer-let.md docs/rules/rune-prefer-let.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
---
22
pageClass: 'rule-details'
33
sidebarDepth: 0
4-
title: 'svelte/signal-prefer-let'
5-
description: 'use let instead of const for signals values'
4+
title: 'svelte/rune-prefer-let'
5+
description: 'use let instead of const for reactive variables created by runes'
66
---
77

8-
# svelte/signal-prefer-let
8+
# svelte/rune-prefer-let
99

10-
> use let instead of const for signals values
10+
> use let instead of const for reactive variables created by runes
1111
1212
- :exclamation: <badge text="This rule has not been released yet." vertical="middle" type="error"> **_This rule has not been released yet._** </badge>
1313
- :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.
1414

1515
## :book: Rule Details
1616

17-
This rule reports whenever a signal is assigned to a const.
17+
This rule reports whenever a rune that creates a reactive value is assigned to a const.
1818
In JavaScript `const` are defined as immutable references which cannot be reassigned.
19-
Signals are by definition changing and are reassigned by Svelte's reactivity system.
19+
Reactive variables can be reassigned by Svelte's reactivity system.
2020

2121
<ESLintCodeBlock fix>
2222

2323
<!--eslint-skip-->
2424

2525
```svelte
2626
<script>
27-
/* eslint svelte/signal-prefer-let: "error" */
27+
/* eslint svelte/rune-prefer-let: "error" */
2828
2929
/* ✓ GOOD */
3030
let { value } = $props();
@@ -46,5 +46,5 @@ Nothing
4646

4747
## :mag: Implementation
4848

49-
- [Rule source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/src/rules/signal-prefer-let.ts)
50-
- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/tests/src/rules/signal-prefer-let.ts)
49+
- [Rule source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/src/rules/rune-prefer-let.ts)
50+
- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/tests/src/rules/rune-prefer-let.ts)

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,11 @@ export interface RuleOptions {
289289
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/require-stores-init/
290290
*/
291291
'svelte/require-stores-init'?: Linter.RuleEntry<[]>
292+
/**
293+
* use let instead of const for reactive variables created by runes
294+
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/rune-prefer-let/
295+
*/
296+
'svelte/rune-prefer-let'?: Linter.RuleEntry<[]>
292297
/**
293298
* enforce use of shorthand syntax in attribute
294299
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/shorthand-attribute/
@@ -299,11 +304,6 @@ export interface RuleOptions {
299304
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/shorthand-directive/
300305
*/
301306
'svelte/shorthand-directive'?: Linter.RuleEntry<SvelteShorthandDirective>
302-
/**
303-
* use let instead of const for signals values
304-
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/signal-prefer-let/
305-
*/
306-
'svelte/signal-prefer-let'?: Linter.RuleEntry<[]>
307307
/**
308308
* enforce order of attributes
309309
* @see https://sveltejs.github.io/eslint-plugin-svelte/rules/sort-attributes/

packages/eslint-plugin-svelte/src/rules/signal-prefer-let.ts packages/eslint-plugin-svelte/src/rules/rune-prefer-let.ts

+20-6
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
11
import type { TSESTree } from '@typescript-eslint/types';
22
import { createRule } from '../utils';
33

4-
export default createRule('signal-prefer-let', {
4+
export default createRule('rune-prefer-let', {
55
meta: {
66
docs: {
7-
description: 'use let instead of const for signals values',
7+
description: 'use let instead of const for reactive variables created by runes',
88
category: 'Best Practices',
99
recommended: false
1010
},
1111
schema: [],
1212
messages: {
13-
useLet: "const is used for a signal value. Use 'let' instead."
13+
useLet: "const is used for a reactive variable from {{rune}}. Use 'let' instead."
1414
},
1515
type: 'suggestion',
1616
fixable: 'code'
1717
},
1818
create(context) {
19-
function preferLet(node: TSESTree.VariableDeclaration) {
19+
function preferLet(node: TSESTree.VariableDeclaration, rune: string) {
2020
if (node.kind !== 'const') {
2121
return;
2222
}
2323
context.report({
2424
node,
2525
messageId: 'useLet',
26+
data: { rune },
2627
fix: (fixer) => fixer.replaceTextRange([node.range[0], node.range[0] + 5], 'let')
2728
});
2829
}
@@ -32,7 +33,7 @@ export default createRule('signal-prefer-let', {
3233
node: TSESTree.Identifier
3334
) {
3435
if (['$props', '$derived', '$state'].includes(node.name)) {
35-
preferLet(node.parent.parent?.parent as TSESTree.VariableDeclaration);
36+
preferLet(node.parent.parent?.parent as TSESTree.VariableDeclaration, `${node.name}()`);
3637
}
3738
},
3839
'VariableDeclaration > VariableDeclarator > CallExpression > MemberExpression > Identifier'(
@@ -43,7 +44,20 @@ export default createRule('signal-prefer-let', {
4344
((node.parent as TSESTree.MemberExpression).object as TSESTree.Identifier).name ===
4445
'$derived'
4546
) {
46-
preferLet(node.parent.parent?.parent?.parent as TSESTree.VariableDeclaration);
47+
preferLet(
48+
node.parent.parent?.parent?.parent as TSESTree.VariableDeclaration,
49+
'$derived.by()'
50+
);
51+
}
52+
if (
53+
node.name === 'frozen' &&
54+
((node.parent as TSESTree.MemberExpression).object as TSESTree.Identifier).name ===
55+
'$state'
56+
) {
57+
preferLet(
58+
node.parent.parent?.parent?.parent as TSESTree.VariableDeclaration,
59+
'$state.frozen()'
60+
);
4761
}
4862
}
4963
};

packages/eslint-plugin-svelte/src/utils/rules.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ import requireOptimizedStyleAttribute from '../rules/require-optimized-style-att
5757
import requireStoreCallbacksUseSetParam from '../rules/require-store-callbacks-use-set-param';
5858
import requireStoreReactiveAccess from '../rules/require-store-reactive-access';
5959
import requireStoresInit from '../rules/require-stores-init';
60+
import runePreferLet from '../rules/rune-prefer-let';
6061
import shorthandAttribute from '../rules/shorthand-attribute';
6162
import shorthandDirective from '../rules/shorthand-directive';
62-
import signalPreferLet from '../rules/signal-prefer-let';
6363
import sortAttributes from '../rules/sort-attributes';
6464
import spacedHtmlComment from '../rules/spaced-html-comment';
6565
import system from '../rules/system';
@@ -123,9 +123,9 @@ export const rules = [
123123
requireStoreCallbacksUseSetParam,
124124
requireStoreReactiveAccess,
125125
requireStoresInit,
126+
runePreferLet,
126127
shorthandAttribute,
127128
shorthandDirective,
128-
signalPreferLet,
129129
sortAttributes,
130130
spacedHtmlComment,
131131
system,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
- message: const is used for a reactive variable from $props(). Use 'let' instead.
2+
line: 2
3+
column: 2
4+
suggestions: null
5+
- message: const is used for a reactive variable from $state(). Use 'let' instead.
6+
line: 4
7+
column: 2
8+
suggestions: null
9+
- message: const is used for a reactive variable from $state.frozen(). Use 'let' instead.
10+
line: 5
11+
column: 2
12+
suggestions: null
13+
- message: const is used for a reactive variable from $derived(). Use 'let' instead.
14+
line: 7
15+
column: 2
16+
suggestions: null
17+
- message: const is used for a reactive variable from $derived.by(). Use 'let' instead.
18+
line: 8
19+
column: 2
20+
suggestions: null
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<script>
22
const { prop } = $props();
3+
34
const state = $state();
5+
const frozen = $state.frozen();
6+
47
const derived = $derived(state + 1);
58
const derivedBy = $derived.by(() => prop + state);
69
</script>
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<script>
22
let { prop } = $props();
3+
34
let state = $state();
5+
let frozen = $state.frozen();
6+
47
let derived = $derived(state + 1);
58
let derivedBy = $derived.by(() => prop + state);
69
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script>
2+
let { prop } = $props();
3+
4+
let state = $state();
5+
let frozen = $state.frozen();
6+
7+
let derived = $derived(state + 1);
8+
let derivedBy = $derived.by(() => prop + state);
9+
</script>

packages/eslint-plugin-svelte/tests/fixtures/rules/signal-prefer-let/invalid/test01-errors.yaml

-12
This file was deleted.

packages/eslint-plugin-svelte/tests/fixtures/rules/signal-prefer-let/valid/test01-input.svelte

-3
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { RuleTester } from '../../utils/eslint-compat';
2-
import rule from '../../../src/rules/signal-prefer-let';
2+
import rule from '../../../src/rules/rune-prefer-let';
33
import { loadTestCases } from '../../utils/utils';
44

55
const tester = new RuleTester({
@@ -9,4 +9,4 @@ const tester = new RuleTester({
99
}
1010
});
1111

12-
tester.run('signal-prefer-let', rule as any, loadTestCases('signal-prefer-let'));
12+
tester.run('rune-prefer-let', rule as any, loadTestCases('rune-prefer-let'));

0 commit comments

Comments
 (0)