From b5bbcf0eaf8b4a86cf7794886bef2fa87fedb14d Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Fri, 28 Mar 2025 20:33:52 +0000 Subject: [PATCH 1/5] feat: add fixer to `require-store-callbacks-use-set-param` Adds a fixer which adds or changes the param to `set`. For example: ```ts // before readable(val, () => ...); readable(val, function () { ... }); // after readable(val, (set) => ...); readable(val, function (set) { ... }); ``` --- .../require-store-callbacks-use-set-param.ts | 16 +++++++++++++++- .../invalid/test01-output.svelte | 9 +++++++++ .../invalid/test02-output.svelte | 9 +++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-output.svelte create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-output.svelte diff --git a/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts b/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts index fc12fdfee..05ef76e01 100644 --- a/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts +++ b/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts @@ -8,6 +8,7 @@ export default createRule('require-store-callbacks-use-set-param', { category: 'Possible Errors', recommended: false }, + fixable: 'code', schema: [], messages: { unexpected: 'Store callbacks must use `set` param.' @@ -27,7 +28,20 @@ export default createRule('require-store-callbacks-use-set-param', { context.report({ node: fn, loc: fn.loc, - messageId: 'unexpected' + messageId: 'unexpected', + fix: (fixer) => { + if (param) { + return fixer.replaceText(param, 'set'); + } + const token = context.getSourceCode().getTokenBefore(fn.body, { + filter: (token) => token.type === 'Punctuator' && token.value === '(', + includeComments: false + }); + if (token) { + return fixer.insertTextAfter(token, 'set'); + } + return []; + } }); } } diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-output.svelte new file mode 100644 index 000000000..674c6a181 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-output.svelte @@ -0,0 +1,9 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-output.svelte new file mode 100644 index 000000000..9b503866f --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-output.svelte @@ -0,0 +1,9 @@ + From e22c62e49bf0cdb174fae017a33b0aef727c08fc Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Sat, 29 Mar 2025 14:49:31 +0000 Subject: [PATCH 2/5] fix: use a suggestion instead --- .../require-store-callbacks-use-set-param.ts | 84 ++++++++-- .../invalid/test01-errors.yaml | 149 +++++++++++++++++- .../invalid/test01-input.svelte | 15 ++ .../invalid/test01-output.svelte | 9 -- .../invalid/test02-errors.yaml | 56 ++++++- .../invalid/test02-output.svelte | 9 -- 6 files changed, 284 insertions(+), 38 deletions(-) delete mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-output.svelte delete mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-output.svelte diff --git a/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts b/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts index 05ef76e01..5c4994522 100644 --- a/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts +++ b/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts @@ -1,5 +1,36 @@ +import { getScope } from '../utils/ast-utils.js'; +import type { RuleContext, SuggestionReportDescriptor } from '../types.js'; import { createRule } from '../utils/index.js'; import { extractStoreReferences } from './reference-helpers/svelte-store.js'; +import type { TSESTree } from '@typescript-eslint/types'; +import type { Variable } from '@typescript-eslint/scope-manager'; +import { getSourceCode } from '../utils/compat.js'; + +function findVariableForName( + context: RuleContext, + node: TSESTree.Node, + name: string | null, + expectedName: string +): { hasConflict: boolean; variable: Variable | null } { + const scope = getScope(context, node); + let hasConflict = false; + let variable: Variable | null = null; + + for (const v of scope.variables) { + if (hasConflict && (variable || name === null)) { + break; + } + if (v.name === expectedName) { + hasConflict = true; + continue; + } + if (name !== null && v.name === name) { + variable = v; + } + } + + return { hasConflict, variable }; +} export default createRule('require-store-callbacks-use-set-param', { meta: { @@ -8,10 +39,12 @@ export default createRule('require-store-callbacks-use-set-param', { category: 'Possible Errors', recommended: false }, - fixable: 'code', + hasSuggestions: true, schema: [], messages: { - unexpected: 'Store callbacks must use `set` param.' + unexpected: 'Store callbacks must use `set` param.', + updateParam: 'Rename parameter from {{oldName}} to `set`.', + addParam: 'Add a `set` parameter.' }, type: 'suggestion' }, @@ -25,23 +58,48 @@ export default createRule('require-store-callbacks-use-set-param', { } const param = fn.params[0]; if (!param || (param.type === 'Identifier' && param.name !== 'set')) { - context.report({ - node: fn, - loc: fn.loc, - messageId: 'unexpected', - fix: (fixer) => { - if (param) { - return fixer.replaceText(param, 'set'); - } - const token = context.getSourceCode().getTokenBefore(fn.body, { + const { hasConflict, variable } = findVariableForName( + context, + fn.body, + param ? param.name : null, + 'set' + ); + const suggest: SuggestionReportDescriptor[] = []; + if (!hasConflict) { + if (param) { + suggest.push({ + messageId: 'updateParam', + data: { oldName: param.name }, + *fix(fixer) { + yield fixer.replaceText(param, 'set'); + + if (variable) { + for (const ref of variable.references) { + yield fixer.replaceText(ref.identifier, 'set'); + } + } + } + }); + } else { + const token = getSourceCode(context).getTokenBefore(fn.body, { filter: (token) => token.type === 'Punctuator' && token.value === '(', includeComments: false }); if (token) { - return fixer.insertTextAfter(token, 'set'); + suggest.push({ + messageId: 'addParam', + fix(fixer) { + return fixer.insertTextAfter(token, 'set'); + } + }); } - return []; } + } + context.report({ + node: fn, + loc: fn.loc, + messageId: 'unexpected', + suggest }); } } diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-errors.yaml index 74e27379c..424ffca69 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-errors.yaml @@ -1,16 +1,159 @@ - message: Store callbacks must use `set` param. line: 4 column: 18 - suggestions: null + suggestions: + - desc: Add a `set` parameter. + messageId: addParam + output: | + - message: Store callbacks must use `set` param. line: 5 column: 18 - suggestions: null + suggestions: + - desc: Rename parameter from foo to `set`. + messageId: updateParam + output: | + - message: Store callbacks must use `set` param. line: 7 column: 18 - suggestions: null + suggestions: + - desc: Add a `set` parameter. + messageId: addParam + output: | + - message: Store callbacks must use `set` param. line: 8 column: 18 + suggestions: + - desc: Rename parameter from foo to `set`. + messageId: updateParam + output: | + +- message: Store callbacks must use `set` param. + line: 10 + column: 19 + suggestions: + - desc: Rename parameter from foo to `set`. + messageId: updateParam + output: | + +- message: Store callbacks must use `set` param. + line: 21 + column: 19 suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-input.svelte index a41201205..164a644c9 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-input.svelte +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-input.svelte @@ -6,4 +6,19 @@ writable(false, () => true); writable(false, (foo) => true); + + readable(false, (foo) => { + foo; + insideACallback(() => { + foo; + }); + conflictingName(() => { + const foo = 303; + foo; + }); + }); + + readable(false, () => { + const set = 303; + }); diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-output.svelte deleted file mode 100644 index 674c6a181..000000000 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-output.svelte +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-errors.yaml index 74e27379c..6f2236ad9 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-errors.yaml @@ -1,16 +1,64 @@ - message: Store callbacks must use `set` param. line: 4 column: 18 - suggestions: null + suggestions: + - desc: Add a `set` parameter. + messageId: addParam + output: | + - message: Store callbacks must use `set` param. line: 5 column: 18 - suggestions: null + suggestions: + - desc: Rename parameter from foo to `set`. + messageId: updateParam + output: | + - message: Store callbacks must use `set` param. line: 7 column: 18 - suggestions: null + suggestions: + - desc: Add a `set` parameter. + messageId: addParam + output: | + - message: Store callbacks must use `set` param. line: 8 column: 18 - suggestions: null + suggestions: + - desc: Rename parameter from foo to `set`. + messageId: updateParam + output: | + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-output.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-output.svelte deleted file mode 100644 index 9b503866f..000000000 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test02-output.svelte +++ /dev/null @@ -1,9 +0,0 @@ - From 1b9a07a8c763b07929f72acc100c5b35c515f83a Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Sat, 29 Mar 2025 17:05:39 +0000 Subject: [PATCH 3/5] fix: reuse helper from ast-utils --- .../rules/derived-has-same-inputs-outputs.ts | 33 +--- .../require-store-callbacks-use-set-param.ts | 34 +--- .../src/utils/ast-utils.ts | 34 ++++ .../invalid/test01-errors.yaml | 181 +++++++++++------- .../invalid/test01-input.svelte | 7 + 5 files changed, 157 insertions(+), 132 deletions(-) diff --git a/packages/eslint-plugin-svelte/src/rules/derived-has-same-inputs-outputs.ts b/packages/eslint-plugin-svelte/src/rules/derived-has-same-inputs-outputs.ts index 30f86aa31..319c49d95 100644 --- a/packages/eslint-plugin-svelte/src/rules/derived-has-same-inputs-outputs.ts +++ b/packages/eslint-plugin-svelte/src/rules/derived-has-same-inputs-outputs.ts @@ -3,34 +3,7 @@ import type { Variable } from '@typescript-eslint/scope-manager'; import { createRule } from '../utils/index.js'; import type { RuleContext, RuleFixer } from '../types.js'; import { extractStoreReferences } from './reference-helpers/svelte-store.js'; -import { getScope } from '../utils/ast-utils.js'; - -function findVariableForName( - context: RuleContext, - node: TSESTree.Node, - name: string, - expectedName: string -): { hasConflict: boolean; variable: Variable | null } { - const scope = getScope(context, node); - let variable: Variable | null = null; - - for (const ref of scope.references) { - if (ref.identifier.name === expectedName) { - return { hasConflict: true, variable: null }; - } - } - - for (const v of scope.variables) { - if (v.name === expectedName) { - return { hasConflict: true, variable: null }; - } - if (v.name === name) { - variable = v; - } - } - - return { hasConflict: false, variable }; -} +import { findVariableForReplacement } from '../utils/ast-utils.js'; function createFixer(node: TSESTree.Node, variable: Variable | null, name: string) { return function* fix(fixer: RuleFixer) { @@ -92,7 +65,7 @@ export default createRule('derived-has-same-inputs-outputs', { if (fnParam.type !== 'Identifier') return; const expectedName = `$${args.name}`; if (expectedName !== fnParam.name) { - const { hasConflict, variable } = findVariableForName( + const { hasConflict, variable } = findVariableForReplacement( context, fn.body, fnParam.name, @@ -136,7 +109,7 @@ export default createRule('derived-has-same-inputs-outputs', { if (element && element.type === 'Identifier' && argName) { const expectedName = `$${argName}`; if (expectedName !== element.name) { - const { hasConflict, variable } = findVariableForName( + const { hasConflict, variable } = findVariableForReplacement( context, fn.body, element.name, diff --git a/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts b/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts index 5c4994522..6d138c88a 100644 --- a/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts +++ b/packages/eslint-plugin-svelte/src/rules/require-store-callbacks-use-set-param.ts @@ -1,37 +1,9 @@ -import { getScope } from '../utils/ast-utils.js'; -import type { RuleContext, SuggestionReportDescriptor } from '../types.js'; +import { findVariableForReplacement } from '../utils/ast-utils.js'; +import type { SuggestionReportDescriptor } from '../types.js'; import { createRule } from '../utils/index.js'; import { extractStoreReferences } from './reference-helpers/svelte-store.js'; -import type { TSESTree } from '@typescript-eslint/types'; -import type { Variable } from '@typescript-eslint/scope-manager'; import { getSourceCode } from '../utils/compat.js'; -function findVariableForName( - context: RuleContext, - node: TSESTree.Node, - name: string | null, - expectedName: string -): { hasConflict: boolean; variable: Variable | null } { - const scope = getScope(context, node); - let hasConflict = false; - let variable: Variable | null = null; - - for (const v of scope.variables) { - if (hasConflict && (variable || name === null)) { - break; - } - if (v.name === expectedName) { - hasConflict = true; - continue; - } - if (name !== null && v.name === name) { - variable = v; - } - } - - return { hasConflict, variable }; -} - export default createRule('require-store-callbacks-use-set-param', { meta: { docs: { @@ -58,7 +30,7 @@ export default createRule('require-store-callbacks-use-set-param', { } const param = fn.params[0]; if (!param || (param.type === 'Identifier' && param.name !== 'set')) { - const { hasConflict, variable } = findVariableForName( + const { hasConflict, variable } = findVariableForReplacement( context, fn.body, param ? param.name : null, diff --git a/packages/eslint-plugin-svelte/src/utils/ast-utils.ts b/packages/eslint-plugin-svelte/src/utils/ast-utils.ts index 1b804baef..02c5fff66 100644 --- a/packages/eslint-plugin-svelte/src/utils/ast-utils.ts +++ b/packages/eslint-plugin-svelte/src/utils/ast-utils.ts @@ -685,3 +685,37 @@ function getSimpleNameFromNode( return getSourceCode(context).getText(node); } + +/** + * Finds the variable for a given name in the specified node's scope. + * Also determines if the replacement name is already in use. + * + * If the `name` is set to null, this assumes you're adding a new variable + * and reports if it is already in use. + */ +export function findVariableForReplacement( + context: RuleContext, + node: TSESTree.Node, + name: string | null, + replacementName: string +): { hasConflict: boolean; variable: Variable | null } { + const scope = getScope(context, node); + let variable: Variable | null = null; + + for (const ref of scope.references) { + if (ref.identifier.name === replacementName) { + return { hasConflict: true, variable: null }; + } + } + + for (const v of scope.variables) { + if (v.name === replacementName) { + return { hasConflict: true, variable: null }; + } + if (v.name === name) { + variable = v; + } + } + + return { hasConflict: false, variable }; +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-errors.yaml index 424ffca69..2f0e15716 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-errors.yaml +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-errors.yaml @@ -14,20 +14,27 @@ writable(false, () => true); writable(false, (foo) => true); - readable(false, (foo) => { - foo; - insideACallback(() => { - foo; - }); - conflictingName(() => { - const foo = 303; - foo; - }); - }); - - readable(false, () => { - const set = 303; - }); + readable(false, (foo) => { + foo; + insideACallback(() => { + foo; + }); + conflictingName(() => { + const foo = 303; + foo; + }); + }); + + readable(false, () => { + const set = 303; + }); + + insideACallback(() => { + const set = 303; + readable(false, () => { + set; + }); + }); - message: Store callbacks must use `set` param. line: 5 @@ -45,20 +52,27 @@ writable(false, () => true); writable(false, (foo) => true); - readable(false, (foo) => { - foo; - insideACallback(() => { - foo; - }); - conflictingName(() => { - const foo = 303; - foo; - }); - }); - - readable(false, () => { - const set = 303; - }); + readable(false, (foo) => { + foo; + insideACallback(() => { + foo; + }); + conflictingName(() => { + const foo = 303; + foo; + }); + }); + + readable(false, () => { + const set = 303; + }); + + insideACallback(() => { + const set = 303; + readable(false, () => { + set; + }); + }); - message: Store callbacks must use `set` param. line: 7 @@ -76,20 +90,27 @@ writable(false, (set) => true); writable(false, (foo) => true); - readable(false, (foo) => { - foo; - insideACallback(() => { - foo; - }); - conflictingName(() => { - const foo = 303; - foo; - }); - }); - - readable(false, () => { - const set = 303; - }); + readable(false, (foo) => { + foo; + insideACallback(() => { + foo; + }); + conflictingName(() => { + const foo = 303; + foo; + }); + }); + + readable(false, () => { + const set = 303; + }); + + insideACallback(() => { + const set = 303; + readable(false, () => { + set; + }); + }); - message: Store callbacks must use `set` param. line: 8 @@ -107,24 +128,31 @@ writable(false, () => true); writable(false, (set) => true); - readable(false, (foo) => { - foo; - insideACallback(() => { - foo; - }); - conflictingName(() => { - const foo = 303; - foo; - }); - }); - - readable(false, () => { - const set = 303; - }); + readable(false, (foo) => { + foo; + insideACallback(() => { + foo; + }); + conflictingName(() => { + const foo = 303; + foo; + }); + }); + + readable(false, () => { + const set = 303; + }); + + insideACallback(() => { + const set = 303; + readable(false, () => { + set; + }); + }); - message: Store callbacks must use `set` param. line: 10 - column: 19 + column: 18 suggestions: - desc: Rename parameter from foo to `set`. messageId: updateParam @@ -138,22 +166,33 @@ writable(false, () => true); writable(false, (foo) => true); - readable(false, (set) => { - set; - insideACallback(() => { - set; - }); - conflictingName(() => { - const foo = 303; - foo; - }); - }); - - readable(false, () => { - const set = 303; - }); + readable(false, (set) => { + set; + insideACallback(() => { + set; + }); + conflictingName(() => { + const foo = 303; + foo; + }); + }); + + readable(false, () => { + const set = 303; + }); + + insideACallback(() => { + const set = 303; + readable(false, () => { + set; + }); + }); - message: Store callbacks must use `set` param. line: 21 + column: 18 + suggestions: null +- message: Store callbacks must use `set` param. + line: 27 column: 19 suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-input.svelte index 164a644c9..e89cab34f 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-input.svelte +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/require-store-callbacks-use-set-param/invalid/test01-input.svelte @@ -21,4 +21,11 @@ readable(false, () => { const set = 303; }); + + insideACallback(() => { + const set = 303; + readable(false, () => { + set; + }); + }); From fd3747860e59978ea7fd04ed650cce4bb005e933 Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Sat, 29 Mar 2025 17:09:05 +0000 Subject: [PATCH 4/5] chore: add docs update --- README.md | 2 +- docs/rules.md | 2 +- docs/rules/require-store-callbacks-use-set-param.md | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3308ebfc6..c379a3d82 100644 --- a/README.md +++ b/README.md @@ -272,7 +272,7 @@ These rules relate to possible syntax or logic errors in Svelte code: | [svelte/no-shorthand-style-property-overrides](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-shorthand-style-property-overrides/) | disallow shorthand style properties that override related longhand properties | :star: | | [svelte/no-store-async](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-store-async/) | disallow using async/await inside svelte stores because it causes issues with the auto-unsubscribing features | :star: | | [svelte/no-unknown-style-directive-property](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-unknown-style-directive-property/) | disallow unknown `style:property` | :star: | -| [svelte/require-store-callbacks-use-set-param](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-store-callbacks-use-set-param/) | store callbacks must use `set` param | | +| [svelte/require-store-callbacks-use-set-param](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-store-callbacks-use-set-param/) | store callbacks must use `set` param | :bulb: | | [svelte/require-store-reactive-access](https://sveltejs.github.io/eslint-plugin-svelte/rules/require-store-reactive-access/) | disallow to use of the store itself as an operand. Need to use $ prefix or get function. | :star::wrench: | | [svelte/valid-compile](https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-compile/) | disallow warnings when compiling. | | | [svelte/valid-style-parse](https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-style-parse/) | require valid style element parsing | | diff --git a/docs/rules.md b/docs/rules.md index 5a47ddea8..df2ca5ec4 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -29,7 +29,7 @@ These rules relate to possible syntax or logic errors in Svelte code: | [svelte/no-shorthand-style-property-overrides](./rules/no-shorthand-style-property-overrides.md) | disallow shorthand style properties that override related longhand properties | :star: | | [svelte/no-store-async](./rules/no-store-async.md) | disallow using async/await inside svelte stores because it causes issues with the auto-unsubscribing features | :star: | | [svelte/no-unknown-style-directive-property](./rules/no-unknown-style-directive-property.md) | disallow unknown `style:property` | :star: | -| [svelte/require-store-callbacks-use-set-param](./rules/require-store-callbacks-use-set-param.md) | store callbacks must use `set` param | | +| [svelte/require-store-callbacks-use-set-param](./rules/require-store-callbacks-use-set-param.md) | store callbacks must use `set` param | :bulb: | | [svelte/require-store-reactive-access](./rules/require-store-reactive-access.md) | disallow to use of the store itself as an operand. Need to use $ prefix or get function. | :star::wrench: | | [svelte/valid-compile](./rules/valid-compile.md) | disallow warnings when compiling. | | | [svelte/valid-style-parse](./rules/valid-style-parse.md) | require valid style element parsing | | diff --git a/docs/rules/require-store-callbacks-use-set-param.md b/docs/rules/require-store-callbacks-use-set-param.md index 4995fa495..dbe0f5945 100644 --- a/docs/rules/require-store-callbacks-use-set-param.md +++ b/docs/rules/require-store-callbacks-use-set-param.md @@ -10,6 +10,8 @@ since: 'v2.12.0' > store callbacks must use `set` param +- :bulb: Some problems reported by this rule are manually fixable by editor [suggestions](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions). + ## :book: Rule Details This rule disallows if `readable` / `writable` store's setter function doesn't use `set` parameter.
From f651936822c236654d3eb8606068659e5790765e Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Sat, 29 Mar 2025 17:10:00 +0000 Subject: [PATCH 5/5] chore: add changeset --- .changeset/clear-mugs-rush.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/clear-mugs-rush.md diff --git a/.changeset/clear-mugs-rush.md b/.changeset/clear-mugs-rush.md new file mode 100644 index 000000000..83198ba36 --- /dev/null +++ b/.changeset/clear-mugs-rush.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': minor +--- + +Adds a suggestion to the `require-store-callbacks-use-set-param` rule to automatically rename or add function parameters.