From 2041b5a7a51c4e90d46919232172d013e918d794 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Thu, 28 Jul 2022 11:05:23 -0700 Subject: [PATCH 01/11] feat: add no-unnecessary-reactive-curlies rule Porting rule from https://github.com/tivac/eslint-plugin-svelte project --- src/rules/no-unnecessary-reactive-curlies.ts | 50 +++++++++++++++++++ src/utils/rules.ts | 2 + .../invalid/test01-errors.json | 7 +++ .../invalid/test01-input.svelte | 5 ++ .../invalid/test01-output.svelte | 3 ++ .../valid/test01-input.svelte | 3 ++ .../valid/test02-input.svelte | 6 +++ .../rules/no-unnecessary-reactive-curlies.ts | 16 ++++++ 8 files changed, 92 insertions(+) create mode 100644 src/rules/no-unnecessary-reactive-curlies.ts create mode 100644 tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-errors.json create mode 100644 tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-input.svelte create mode 100644 tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-output.svelte create mode 100644 tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test01-input.svelte create mode 100644 tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test02-input.svelte create mode 100644 tests/src/rules/no-unnecessary-reactive-curlies.ts diff --git a/src/rules/no-unnecessary-reactive-curlies.ts b/src/rules/no-unnecessary-reactive-curlies.ts new file mode 100644 index 000000000..31cd1d4e6 --- /dev/null +++ b/src/rules/no-unnecessary-reactive-curlies.ts @@ -0,0 +1,50 @@ +import type { AST } from "svelte-eslint-parser" +import { createRule } from "../utils" + +export default createRule("no-unnecessary-reactive-curlies", { + meta: { + docs: { + description: + "disallow wrapping single reactive statements in curly braces", + category: "Stylistic Issues", + recommended: false, + conflictWithPrettier: true, + }, + fixable: "code", + schema: [], + messages: { + unnecessaryCurlies: `Do not wrap reactive statements in curly braces unless necessary.`, + }, + type: "suggestion", + }, + create(context) { + return { + [`SvelteReactiveStatement > BlockStatement[body.length=1]`]: ( + node: AST.SvelteReactiveStatement, + ) => { + const source = context.getSourceCode() + + return context.report({ + node, + loc: node.loc, + messageId: "unnecessaryCurlies", + + fix(fixer) { + const tokens = source.getTokens(node) + + // Remove everything up to the second token, and the entire last token since + // those are known to be "{" and "}" + return [ + fixer.removeRange([tokens[0].range[0], tokens[1].range[0]]), + + fixer.removeRange([ + tokens[tokens.length - 2].range[1], + tokens[tokens.length - 1].range[1], + ]), + ] + }, + }) + }, + } + }, +}) diff --git a/src/utils/rules.ts b/src/utils/rules.ts index c08ae0f1d..ba6149d85 100644 --- a/src/utils/rules.ts +++ b/src/utils/rules.ts @@ -20,6 +20,7 @@ import noShorthandStylePropertyOverrides from "../rules/no-shorthand-style-prope import noSpacesAroundEqualSignsInAttribute from "../rules/no-spaces-around-equal-signs-in-attribute" import noTargetBlank from "../rules/no-target-blank" import noUnknownStyleDirectiveProperty from "../rules/no-unknown-style-directive-property" +import noUnnecessaryReactiveCurlies from "../rules/no-unnecessary-reactive-curlies" import noUnusedSvelteIgnore from "../rules/no-unused-svelte-ignore" import noUselessMustaches from "../rules/no-useless-mustaches" import preferClassDirective from "../rules/prefer-class-directive" @@ -53,6 +54,7 @@ export const rules = [ noSpacesAroundEqualSignsInAttribute, noTargetBlank, noUnknownStyleDirectiveProperty, + noUnnecessaryReactiveCurlies, noUnusedSvelteIgnore, noUselessMustaches, preferClassDirective, diff --git a/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-errors.json b/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-errors.json new file mode 100644 index 000000000..165a1c929 --- /dev/null +++ b/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-errors.json @@ -0,0 +1,7 @@ +[ + { + "message": "Do not wrap reactive statements in curly braces unless necessary.", + "line": 2, + "column": 6 + } +] diff --git a/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-input.svelte b/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-input.svelte new file mode 100644 index 000000000..e65c3abf4 --- /dev/null +++ b/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-input.svelte @@ -0,0 +1,5 @@ + diff --git a/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-output.svelte b/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-output.svelte new file mode 100644 index 000000000..9cfbfca9c --- /dev/null +++ b/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-output.svelte @@ -0,0 +1,3 @@ + diff --git a/tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test01-input.svelte b/tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test01-input.svelte new file mode 100644 index 000000000..9cfbfca9c --- /dev/null +++ b/tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test01-input.svelte @@ -0,0 +1,3 @@ + diff --git a/tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test02-input.svelte b/tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test02-input.svelte new file mode 100644 index 000000000..0bd0c0d97 --- /dev/null +++ b/tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test02-input.svelte @@ -0,0 +1,6 @@ + diff --git a/tests/src/rules/no-unnecessary-reactive-curlies.ts b/tests/src/rules/no-unnecessary-reactive-curlies.ts new file mode 100644 index 000000000..a10f44915 --- /dev/null +++ b/tests/src/rules/no-unnecessary-reactive-curlies.ts @@ -0,0 +1,16 @@ +import { RuleTester } from "eslint" +import rule from "../../../src/rules/no-unnecessary-reactive-curlies" +import { loadTestCases } from "../../utils/utils" + +const tester = new RuleTester({ + parserOptions: { + ecmaVersion: 2020, + sourceType: "module", + }, +}) + +tester.run( + "no-unnecessary-reactive-curlies", + rule as any, + loadTestCases("no-unnecessary-reactive-curlies"), +) From 20aa097f68ffddde93a8112d24dc6888f7f6a5eb Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Thu, 28 Jul 2022 11:11:58 -0700 Subject: [PATCH 02/11] docs: rule documentation --- docs/rules/no-unnecessary-reactive-curlies.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 docs/rules/no-unnecessary-reactive-curlies.md diff --git a/docs/rules/no-unnecessary-reactive-curlies.md b/docs/rules/no-unnecessary-reactive-curlies.md new file mode 100644 index 000000000..936542afd --- /dev/null +++ b/docs/rules/no-unnecessary-reactive-curlies.md @@ -0,0 +1,48 @@ +--- +pageClass: "rule-details" +sidebarDepth: 0 +title: "svelte/no-unnecessary-reactive-curlies" +description: "disallow unnecessary curly braces around reactive statements" +since: "v2.4.0" +--- + +# svelte/no-unnecessary-reactive-curlies + +> disallow unnecessary curly braces around reactive statements + +## :book: Rule Details + +This rule reports if curly brackets (`{` and `}`) are used unnecessarily around a reactive statement body containing only a single expression. + + + + + +```svelte + +``` + + + +## :wrench: Options + +Nothing. + +## :rocket: Version + +This rule was introduced in eslint-plugin-svelte v2.4.0 + +## :mag: Implementation + +- [Rule source](https://github.com/ota-meshi/eslint-plugin-svelte/blob/main/src/rules/no-unnecessary-reactive-curlies.ts) +- [Test source](https://github.com/ota-meshi/eslint-plugin-svelte/blob/main/tests/src/rules/no-unnecessary-reactive-curlies.ts) From ec8cf98431c7235b182801c76c871ce5e3b3b3d1 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Thu, 28 Jul 2022 22:39:45 -0700 Subject: [PATCH 03/11] docs: remove since field Co-authored-by: Yosuke Ota --- docs/rules/no-unnecessary-reactive-curlies.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/rules/no-unnecessary-reactive-curlies.md b/docs/rules/no-unnecessary-reactive-curlies.md index 936542afd..a97806ef1 100644 --- a/docs/rules/no-unnecessary-reactive-curlies.md +++ b/docs/rules/no-unnecessary-reactive-curlies.md @@ -3,7 +3,6 @@ pageClass: "rule-details" sidebarDepth: 0 title: "svelte/no-unnecessary-reactive-curlies" description: "disallow unnecessary curly braces around reactive statements" -since: "v2.4.0" --- # svelte/no-unnecessary-reactive-curlies From 997981ccca2b6dac5316e35a92e3a8dae7f23a7f Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Thu, 28 Jul 2022 22:40:04 -0700 Subject: [PATCH 04/11] chore: remove extraneous conflictWithPrettier Co-authored-by: Yosuke Ota --- src/rules/no-unnecessary-reactive-curlies.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/rules/no-unnecessary-reactive-curlies.ts b/src/rules/no-unnecessary-reactive-curlies.ts index 31cd1d4e6..51e67ba8e 100644 --- a/src/rules/no-unnecessary-reactive-curlies.ts +++ b/src/rules/no-unnecessary-reactive-curlies.ts @@ -8,7 +8,6 @@ export default createRule("no-unnecessary-reactive-curlies", { "disallow wrapping single reactive statements in curly braces", category: "Stylistic Issues", recommended: false, - conflictWithPrettier: true, }, fixable: "code", schema: [], From 389d0278b124d907f0b31031573563814fd98639 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Thu, 28 Jul 2022 22:40:23 -0700 Subject: [PATCH 05/11] fix: include comments in tokens Co-authored-by: Yosuke Ota --- src/rules/no-unnecessary-reactive-curlies.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rules/no-unnecessary-reactive-curlies.ts b/src/rules/no-unnecessary-reactive-curlies.ts index 51e67ba8e..e091f8ba5 100644 --- a/src/rules/no-unnecessary-reactive-curlies.ts +++ b/src/rules/no-unnecessary-reactive-curlies.ts @@ -29,7 +29,7 @@ export default createRule("no-unnecessary-reactive-curlies", { messageId: "unnecessaryCurlies", fix(fixer) { - const tokens = source.getTokens(node) + const tokens = source.getTokens(node, { includeComments: true }) // Remove everything up to the second token, and the entire last token since // those are known to be "{" and "}" From 97bc98009ff94ef0f7828245bbd865d17ee62799 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Thu, 28 Jul 2022 22:40:54 -0700 Subject: [PATCH 06/11] docs: attribution Co-authored-by: Yosuke Ota --- docs/rules/no-unnecessary-reactive-curlies.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/rules/no-unnecessary-reactive-curlies.md b/docs/rules/no-unnecessary-reactive-curlies.md index a97806ef1..3d263bce2 100644 --- a/docs/rules/no-unnecessary-reactive-curlies.md +++ b/docs/rules/no-unnecessary-reactive-curlies.md @@ -37,6 +37,13 @@ This rule reports if curly brackets (`{` and `}`) are used unnecessarily around Nothing. +## :heart: Compatibility + +This rule was taken from [@tivac/eslint-plugin-svelte]. +This rule is compatible with `@tivac/svelte/reactive-curlies` rule. + +[@tivac/eslint-plugin-svelte]: https://github.com/tivac/eslint-plugin-svelte/ + ## :rocket: Version This rule was introduced in eslint-plugin-svelte v2.4.0 From bab0d0374732e60dc6449a4d4c5a1e29de9fb9f7 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Thu, 28 Jul 2022 23:12:32 -0700 Subject: [PATCH 07/11] wip: rename rule Also tightened up matching based on feedback --- ...urlies.md => no-extra-reactive-curlies.md} | 16 +++++++------- ...urlies.ts => no-extra-reactive-curlies.ts} | 21 ++++++++++++++----- src/utils/rules.ts | 4 ++-- .../invalid/test01-errors.json | 0 .../invalid/test01-input.svelte | 0 .../invalid/test01-output.svelte | 0 .../invalid/test02-errors.json | 7 +++++++ .../invalid/test02-input.svelte | 4 ++++ .../invalid/test02-output.svelte | 4 ++++ .../valid/test01-input.svelte | 5 +++++ .../valid/test02-input.svelte | 0 .../valid/test03-input.svelte | 12 +++++++++++ .../valid/test01-input.svelte | 3 --- ...urlies.ts => no-extra-reactive-curlies.ts} | 6 +++--- 14 files changed, 61 insertions(+), 21 deletions(-) rename docs/rules/{no-unnecessary-reactive-curlies.md => no-extra-reactive-curlies.md} (76%) rename src/rules/{no-unnecessary-reactive-curlies.ts => no-extra-reactive-curlies.ts} (60%) rename tests/fixtures/rules/{no-unnecessary-reactive-curlies => no-extra-reactive-curlies}/invalid/test01-errors.json (100%) rename tests/fixtures/rules/{no-unnecessary-reactive-curlies => no-extra-reactive-curlies}/invalid/test01-input.svelte (100%) rename tests/fixtures/rules/{no-unnecessary-reactive-curlies => no-extra-reactive-curlies}/invalid/test01-output.svelte (100%) create mode 100644 tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json create mode 100644 tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-input.svelte create mode 100644 tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-output.svelte create mode 100644 tests/fixtures/rules/no-extra-reactive-curlies/valid/test01-input.svelte rename tests/fixtures/rules/{no-unnecessary-reactive-curlies => no-extra-reactive-curlies}/valid/test02-input.svelte (100%) create mode 100644 tests/fixtures/rules/no-extra-reactive-curlies/valid/test03-input.svelte delete mode 100644 tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test01-input.svelte rename tests/src/rules/{no-unnecessary-reactive-curlies.ts => no-extra-reactive-curlies.ts} (58%) diff --git a/docs/rules/no-unnecessary-reactive-curlies.md b/docs/rules/no-extra-reactive-curlies.md similarity index 76% rename from docs/rules/no-unnecessary-reactive-curlies.md rename to docs/rules/no-extra-reactive-curlies.md index 3d263bce2..01b05ce93 100644 --- a/docs/rules/no-unnecessary-reactive-curlies.md +++ b/docs/rules/no-extra-reactive-curlies.md @@ -1,11 +1,11 @@ --- pageClass: "rule-details" sidebarDepth: 0 -title: "svelte/no-unnecessary-reactive-curlies" +title: "svelte/no-extra-reactive-curlies" description: "disallow unnecessary curly braces around reactive statements" --- -# svelte/no-unnecessary-reactive-curlies +# svelte/no-extra-reactive-curlies > disallow unnecessary curly braces around reactive statements @@ -19,14 +19,14 @@ This rule reports if curly brackets (`{` and `}`) are used unnecessarily around ```svelte ``` @@ -50,5 +50,5 @@ This rule was introduced in eslint-plugin-svelte v2.4.0 ## :mag: Implementation -- [Rule source](https://github.com/ota-meshi/eslint-plugin-svelte/blob/main/src/rules/no-unnecessary-reactive-curlies.ts) -- [Test source](https://github.com/ota-meshi/eslint-plugin-svelte/blob/main/tests/src/rules/no-unnecessary-reactive-curlies.ts) +- [Rule source](https://github.com/ota-meshi/eslint-plugin-svelte/blob/main/src/rules/no-extra-reactive-curlies.ts) +- [Test source](https://github.com/ota-meshi/eslint-plugin-svelte/blob/main/tests/src/rules/no-extra-reactive-curlies.ts) diff --git a/src/rules/no-unnecessary-reactive-curlies.ts b/src/rules/no-extra-reactive-curlies.ts similarity index 60% rename from src/rules/no-unnecessary-reactive-curlies.ts rename to src/rules/no-extra-reactive-curlies.ts index e091f8ba5..2bbdc744b 100644 --- a/src/rules/no-unnecessary-reactive-curlies.ts +++ b/src/rules/no-extra-reactive-curlies.ts @@ -1,32 +1,43 @@ -import type { AST } from "svelte-eslint-parser" +import type { TSESTree } from "@typescript-eslint/types" import { createRule } from "../utils" -export default createRule("no-unnecessary-reactive-curlies", { +export default createRule("no-extra-reactive-curlies", { meta: { docs: { description: "disallow wrapping single reactive statements in curly braces", category: "Stylistic Issues", recommended: false, + conflictWithPrettier: false, }, fixable: "code", schema: [], messages: { - unnecessaryCurlies: `Do not wrap reactive statements in curly braces unless necessary.`, + extraCurlies: `Do not wrap reactive statements in curly braces unless necessary.`, }, type: "suggestion", }, create(context) { return { [`SvelteReactiveStatement > BlockStatement[body.length=1]`]: ( - node: AST.SvelteReactiveStatement, + node: TSESTree.BlockStatement, ) => { + // $: { foo = "bar"; } + // Only want to transform if the contents of the block is a single assignment + // Anything else gets us into potentially weird territory and probably isn't worth handling + if ( + node.body[0].type !== "ExpressionStatement" || + node.body[0].expression.type !== "AssignmentExpression" + ) { + return false + } + const source = context.getSourceCode() return context.report({ node, loc: node.loc, - messageId: "unnecessaryCurlies", + messageId: "extraCurlies", fix(fixer) { const tokens = source.getTokens(node, { includeComments: true }) diff --git a/src/utils/rules.ts b/src/utils/rules.ts index ba6149d85..c93fa47cb 100644 --- a/src/utils/rules.ts +++ b/src/utils/rules.ts @@ -20,7 +20,7 @@ import noShorthandStylePropertyOverrides from "../rules/no-shorthand-style-prope import noSpacesAroundEqualSignsInAttribute from "../rules/no-spaces-around-equal-signs-in-attribute" import noTargetBlank from "../rules/no-target-blank" import noUnknownStyleDirectiveProperty from "../rules/no-unknown-style-directive-property" -import noUnnecessaryReactiveCurlies from "../rules/no-unnecessary-reactive-curlies" +import noExtraReactiveCurlies from "../rules/no-extra-reactive-curlies" import noUnusedSvelteIgnore from "../rules/no-unused-svelte-ignore" import noUselessMustaches from "../rules/no-useless-mustaches" import preferClassDirective from "../rules/prefer-class-directive" @@ -54,7 +54,7 @@ export const rules = [ noSpacesAroundEqualSignsInAttribute, noTargetBlank, noUnknownStyleDirectiveProperty, - noUnnecessaryReactiveCurlies, + noExtraReactiveCurlies, noUnusedSvelteIgnore, noUselessMustaches, preferClassDirective, diff --git a/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-errors.json b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-errors.json similarity index 100% rename from tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-errors.json rename to tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-errors.json diff --git a/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-input.svelte b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-input.svelte similarity index 100% rename from tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-input.svelte rename to tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-input.svelte diff --git a/tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-output.svelte b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-output.svelte similarity index 100% rename from tests/fixtures/rules/no-unnecessary-reactive-curlies/invalid/test01-output.svelte rename to tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-output.svelte diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json new file mode 100644 index 000000000..db0ef623c --- /dev/null +++ b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json @@ -0,0 +1,7 @@ +[ + { + "message": "Do not wrap reactive statements in curly braces unless necessary.", + "line": 3, + "column": 6 + } +] diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-input.svelte b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-input.svelte new file mode 100644 index 000000000..6074c3c06 --- /dev/null +++ b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-input.svelte @@ -0,0 +1,4 @@ + + diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-output.svelte b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-output.svelte new file mode 100644 index 000000000..f489ce895 --- /dev/null +++ b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-output.svelte @@ -0,0 +1,4 @@ + + diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/valid/test01-input.svelte b/tests/fixtures/rules/no-extra-reactive-curlies/valid/test01-input.svelte new file mode 100644 index 000000000..630f71509 --- /dev/null +++ b/tests/fixtures/rules/no-extra-reactive-curlies/valid/test01-input.svelte @@ -0,0 +1,5 @@ + + diff --git a/tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test02-input.svelte b/tests/fixtures/rules/no-extra-reactive-curlies/valid/test02-input.svelte similarity index 100% rename from tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test02-input.svelte rename to tests/fixtures/rules/no-extra-reactive-curlies/valid/test02-input.svelte diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/valid/test03-input.svelte b/tests/fixtures/rules/no-extra-reactive-curlies/valid/test03-input.svelte new file mode 100644 index 000000000..2944ea38c --- /dev/null +++ b/tests/fixtures/rules/no-extra-reactive-curlies/valid/test03-input.svelte @@ -0,0 +1,12 @@ + diff --git a/tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test01-input.svelte b/tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test01-input.svelte deleted file mode 100644 index 9cfbfca9c..000000000 --- a/tests/fixtures/rules/no-unnecessary-reactive-curlies/valid/test01-input.svelte +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/tests/src/rules/no-unnecessary-reactive-curlies.ts b/tests/src/rules/no-extra-reactive-curlies.ts similarity index 58% rename from tests/src/rules/no-unnecessary-reactive-curlies.ts rename to tests/src/rules/no-extra-reactive-curlies.ts index a10f44915..ed9674db3 100644 --- a/tests/src/rules/no-unnecessary-reactive-curlies.ts +++ b/tests/src/rules/no-extra-reactive-curlies.ts @@ -1,5 +1,5 @@ import { RuleTester } from "eslint" -import rule from "../../../src/rules/no-unnecessary-reactive-curlies" +import rule from "../../../src/rules/no-extra-reactive-curlies" import { loadTestCases } from "../../utils/utils" const tester = new RuleTester({ @@ -10,7 +10,7 @@ const tester = new RuleTester({ }) tester.run( - "no-unnecessary-reactive-curlies", + "no-extra-reactive-curlies", rule as any, - loadTestCases("no-unnecessary-reactive-curlies"), + loadTestCases("no-extra-reactive-curlies"), ) From be2c4db82e417284536d3da305ef2d6fda704f94 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Sat, 30 Jul 2022 19:30:20 -0700 Subject: [PATCH 08/11] wip: make suggestions instead Per conversation with @ota-meshi in the PR --- src/rules/no-extra-reactive-curlies.ts | 44 ++++++++++++-------------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/src/rules/no-extra-reactive-curlies.ts b/src/rules/no-extra-reactive-curlies.ts index 2bbdc744b..ba9db7d84 100644 --- a/src/rules/no-extra-reactive-curlies.ts +++ b/src/rules/no-extra-reactive-curlies.ts @@ -10,49 +10,45 @@ export default createRule("no-extra-reactive-curlies", { recommended: false, conflictWithPrettier: false, }, - fixable: "code", + hasSuggestions: true, schema: [], messages: { extraCurlies: `Do not wrap reactive statements in curly braces unless necessary.`, + removeExtraCurlies: `Remove the unnecessary curly braces.`, }, type: "suggestion", }, create(context) { return { + // $: { foo = "bar"; } [`SvelteReactiveStatement > BlockStatement[body.length=1]`]: ( node: TSESTree.BlockStatement, ) => { - // $: { foo = "bar"; } - // Only want to transform if the contents of the block is a single assignment - // Anything else gets us into potentially weird territory and probably isn't worth handling - if ( - node.body[0].type !== "ExpressionStatement" || - node.body[0].expression.type !== "AssignmentExpression" - ) { - return false - } - const source = context.getSourceCode() return context.report({ node, loc: node.loc, messageId: "extraCurlies", + suggest: [ + { + messageId: "removeExtraCurlies", + fix(fixer) { + const tokens = source.getTokens(node, { includeComments: true }) - fix(fixer) { - const tokens = source.getTokens(node, { includeComments: true }) - - // Remove everything up to the second token, and the entire last token since - // those are known to be "{" and "}" - return [ - fixer.removeRange([tokens[0].range[0], tokens[1].range[0]]), + // Remove everything up to the second token, and the entire last token since + // those are known to be "{" and "}" + return [ + fixer.removeRange([tokens[0].range[0], tokens[1].range[0]]), - fixer.removeRange([ - tokens[tokens.length - 2].range[1], - tokens[tokens.length - 1].range[1], - ]), - ] - }, + fixer.removeRange([ + tokens[tokens.length - 2].range[1], + tokens[tokens.length - 1].range[1], + ]), + ] + }, + }, + ], }) }, } From 26bc92d85c9ecd56f7541689cc79ec251d7eef80 Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Sat, 30 Jul 2022 19:30:29 -0700 Subject: [PATCH 09/11] test: testing updates for suggestions change --- .../invalid/test01-errors.json | 9 ++++++++- .../invalid/test01-output.svelte | 3 --- .../invalid/test02-errors.json | 9 ++++++++- .../invalid/test02-output.svelte | 4 ---- .../valid/test03-input.svelte | 12 ------------ 5 files changed, 16 insertions(+), 21 deletions(-) delete mode 100644 tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-output.svelte delete mode 100644 tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-output.svelte delete mode 100644 tests/fixtures/rules/no-extra-reactive-curlies/valid/test03-input.svelte diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-errors.json b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-errors.json index 165a1c929..51fc25fcd 100644 --- a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-errors.json +++ b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-errors.json @@ -2,6 +2,13 @@ { "message": "Do not wrap reactive statements in curly braces unless necessary.", "line": 2, - "column": 6 + "column": 6, + "suggestions": [ + { + "desc": "Remove the unnecessary curly braces.", + "messageId": "removeExtraCurlies", + "output": "\r\n" + } + ] } ] diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-output.svelte b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-output.svelte deleted file mode 100644 index 9cfbfca9c..000000000 --- a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-output.svelte +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json index db0ef623c..eecf796dd 100644 --- a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json +++ b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json @@ -2,6 +2,13 @@ { "message": "Do not wrap reactive statements in curly braces unless necessary.", "line": 3, - "column": 6 + "column": 6, + "suggestions": [ + { + "desc": "Remove the unnecessary curly braces.", + "messageId": "removeExtraCurlies", + "output": "\r\n\r\n" + } + ] } ] diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-output.svelte b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-output.svelte deleted file mode 100644 index f489ce895..000000000 --- a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-output.svelte +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/valid/test03-input.svelte b/tests/fixtures/rules/no-extra-reactive-curlies/valid/test03-input.svelte deleted file mode 100644 index 2944ea38c..000000000 --- a/tests/fixtures/rules/no-extra-reactive-curlies/valid/test03-input.svelte +++ /dev/null @@ -1,12 +0,0 @@ - From a91b8e8b69b13817d830b6720370d914f26886fa Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Sat, 30 Jul 2022 19:32:45 -0700 Subject: [PATCH 10/11] chore: yarn update outupt --- README.md | 1 + docs/rules.md | 1 + docs/rules/no-extra-reactive-curlies.md | 10 ++++------ src/utils/rules.ts | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5dbdf553f..d557ee96f 100644 --- a/README.md +++ b/README.md @@ -298,6 +298,7 @@ These rules relate to style guidelines, and are therefore quite subjective: | [svelte/indent](https://ota-meshi.github.io/eslint-plugin-svelte/rules/indent/) | enforce consistent indentation | :wrench: | | [svelte/max-attributes-per-line](https://ota-meshi.github.io/eslint-plugin-svelte/rules/max-attributes-per-line/) | enforce the maximum number of attributes per line | :wrench: | | [svelte/mustache-spacing](https://ota-meshi.github.io/eslint-plugin-svelte/rules/mustache-spacing/) | enforce unified spacing in mustache | :wrench: | +| [svelte/no-extra-reactive-curlies](https://ota-meshi.github.io/eslint-plugin-svelte/rules/no-extra-reactive-curlies/) | disallow wrapping single reactive statements in curly braces | | | [svelte/no-spaces-around-equal-signs-in-attribute](https://ota-meshi.github.io/eslint-plugin-svelte/rules/no-spaces-around-equal-signs-in-attribute/) | disallow spaces around equal signs in attribute | :wrench: | | [svelte/prefer-class-directive](https://ota-meshi.github.io/eslint-plugin-svelte/rules/prefer-class-directive/) | require class directives instead of ternary expressions | :wrench: | | [svelte/prefer-style-directive](https://ota-meshi.github.io/eslint-plugin-svelte/rules/prefer-style-directive/) | require style directives instead of style attribute | :wrench: | diff --git a/docs/rules.md b/docs/rules.md index 9581c794f..55a3fbf6d 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -58,6 +58,7 @@ These rules relate to style guidelines, and are therefore quite subjective: | [svelte/indent](./rules/indent.md) | enforce consistent indentation | :wrench: | | [svelte/max-attributes-per-line](./rules/max-attributes-per-line.md) | enforce the maximum number of attributes per line | :wrench: | | [svelte/mustache-spacing](./rules/mustache-spacing.md) | enforce unified spacing in mustache | :wrench: | +| [svelte/no-extra-reactive-curlies](./rules/no-extra-reactive-curlies.md) | disallow wrapping single reactive statements in curly braces | | | [svelte/no-spaces-around-equal-signs-in-attribute](./rules/no-spaces-around-equal-signs-in-attribute.md) | disallow spaces around equal signs in attribute | :wrench: | | [svelte/prefer-class-directive](./rules/prefer-class-directive.md) | require class directives instead of ternary expressions | :wrench: | | [svelte/prefer-style-directive](./rules/prefer-style-directive.md) | require style directives instead of style attribute | :wrench: | diff --git a/docs/rules/no-extra-reactive-curlies.md b/docs/rules/no-extra-reactive-curlies.md index 01b05ce93..7b3bf37de 100644 --- a/docs/rules/no-extra-reactive-curlies.md +++ b/docs/rules/no-extra-reactive-curlies.md @@ -2,12 +2,14 @@ pageClass: "rule-details" sidebarDepth: 0 title: "svelte/no-extra-reactive-curlies" -description: "disallow unnecessary curly braces around reactive statements" +description: "disallow wrapping single reactive statements in curly braces" --- # svelte/no-extra-reactive-curlies -> disallow unnecessary curly braces around reactive statements +> disallow wrapping single reactive statements in curly braces + +- :exclamation: **_This rule has not been released yet._** ## :book: Rule Details @@ -44,10 +46,6 @@ This rule is compatible with `@tivac/svelte/reactive-curlies` rule. [@tivac/eslint-plugin-svelte]: https://github.com/tivac/eslint-plugin-svelte/ -## :rocket: Version - -This rule was introduced in eslint-plugin-svelte v2.4.0 - ## :mag: Implementation - [Rule source](https://github.com/ota-meshi/eslint-plugin-svelte/blob/main/src/rules/no-extra-reactive-curlies.ts) diff --git a/src/utils/rules.ts b/src/utils/rules.ts index c93fa47cb..e46182b7c 100644 --- a/src/utils/rules.ts +++ b/src/utils/rules.ts @@ -12,6 +12,7 @@ import noAtHtmlTags from "../rules/no-at-html-tags" import noDupeElseIfBlocks from "../rules/no-dupe-else-if-blocks" import noDupeStyleProperties from "../rules/no-dupe-style-properties" import noDynamicSlotName from "../rules/no-dynamic-slot-name" +import noExtraReactiveCurlies from "../rules/no-extra-reactive-curlies" import noInnerDeclarations from "../rules/no-inner-declarations" import noNotFunctionHandler from "../rules/no-not-function-handler" import noObjectInTextMustaches from "../rules/no-object-in-text-mustaches" @@ -20,7 +21,6 @@ import noShorthandStylePropertyOverrides from "../rules/no-shorthand-style-prope import noSpacesAroundEqualSignsInAttribute from "../rules/no-spaces-around-equal-signs-in-attribute" import noTargetBlank from "../rules/no-target-blank" import noUnknownStyleDirectiveProperty from "../rules/no-unknown-style-directive-property" -import noExtraReactiveCurlies from "../rules/no-extra-reactive-curlies" import noUnusedSvelteIgnore from "../rules/no-unused-svelte-ignore" import noUselessMustaches from "../rules/no-useless-mustaches" import preferClassDirective from "../rules/prefer-class-directive" @@ -46,6 +46,7 @@ export const rules = [ noDupeElseIfBlocks, noDupeStyleProperties, noDynamicSlotName, + noExtraReactiveCurlies, noInnerDeclarations, noNotFunctionHandler, noObjectInTextMustaches, @@ -54,7 +55,6 @@ export const rules = [ noSpacesAroundEqualSignsInAttribute, noTargetBlank, noUnknownStyleDirectiveProperty, - noExtraReactiveCurlies, noUnusedSvelteIgnore, noUselessMustaches, preferClassDirective, From 642db3791037953fb258896281e47d77d936c6be Mon Sep 17 00:00:00 2001 From: Pat Cavit Date: Sat, 30 Jul 2022 19:34:45 -0700 Subject: [PATCH 11/11] chore: remove carriage returns --- .../rules/no-extra-reactive-curlies/invalid/test01-errors.json | 2 +- .../rules/no-extra-reactive-curlies/invalid/test02-errors.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-errors.json b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-errors.json index 51fc25fcd..6a0b3a4bc 100644 --- a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-errors.json +++ b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test01-errors.json @@ -7,7 +7,7 @@ { "desc": "Remove the unnecessary curly braces.", "messageId": "removeExtraCurlies", - "output": "\r\n" + "output": "\n" } ] } diff --git a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json index eecf796dd..cc41e643a 100644 --- a/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json +++ b/tests/fixtures/rules/no-extra-reactive-curlies/invalid/test02-errors.json @@ -7,7 +7,7 @@ { "desc": "Remove the unnecessary curly braces.", "messageId": "removeExtraCurlies", - "output": "\r\n\r\n" + "output": "\n\n" } ] }