From a43916e3d3505cb791e0e8c94e367b59b078bf73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 5 Feb 2025 10:26:34 +0100 Subject: [PATCH 1/3] test(valid-style-parse): added tests --- .../invalid/invalid-css01-errors.yaml | 6 ++++++ .../invalid/invalid-css01-input.svelte | 18 ++++++++++++++++++ .../invalid/invalid-scss01-errors.yaml | 6 ++++++ .../invalid/invalid-scss01-input.svelte | 18 ++++++++++++++++++ .../invalid/unknown-lang01-errors.yaml | 4 ++++ .../invalid/unknown-lang01-input.svelte | 18 ++++++++++++++++++ .../valid/no-style01-input.svelte | 3 +++ .../valid/valid-css01-input.svelte | 13 +++++++++++++ .../valid/valid-scss01-input.svelte | 18 ++++++++++++++++++ .../tests/src/rules/valid-style-parse.ts | 12 ++++++++++++ 10 files changed, 116 insertions(+) create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-css01-errors.yaml create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-css01-input.svelte create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-scss01-errors.yaml create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-scss01-input.svelte create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/unknown-lang01-errors.yaml create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/unknown-lang01-input.svelte create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/no-style01-input.svelte create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/valid-css01-input.svelte create mode 100644 packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/valid-scss01-input.svelte create mode 100644 packages/eslint-plugin-svelte/tests/src/rules/valid-style-parse.ts diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-css01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-css01-errors.yaml new file mode 100644 index 000000000..996754aa2 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-css01-errors.yaml @@ -0,0 +1,6 @@ +- message: 'Error parsing style element. Error message: + "tests/fixtures/rules/valid-style-parse/invalid/invalid-css01-input.svelte:4:11: + Unknown word"' + line: 7 + column: 1 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-css01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-css01-input.svelte new file mode 100644 index 000000000..a3184dbd2 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-css01-input.svelte @@ -0,0 +1,18 @@ +
+
Hello
+ + World! +
+ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-scss01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-scss01-errors.yaml new file mode 100644 index 000000000..f13c0568e --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-scss01-errors.yaml @@ -0,0 +1,6 @@ +- message: 'Error parsing style element. Error message: + "tests/fixtures/rules/valid-style-parse/invalid/invalid-scss01-input.svelte:4:11: + Unknown word"' + line: 7 + column: 1 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-scss01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-scss01-input.svelte new file mode 100644 index 000000000..df4d586d2 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/invalid-scss01-input.svelte @@ -0,0 +1,18 @@ +
+
Hello
+ + World! +
+ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/unknown-lang01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/unknown-lang01-errors.yaml new file mode 100644 index 000000000..0ca96bb37 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/unknown-lang01-errors.yaml @@ -0,0 +1,4 @@ +- message: Found unsupported style element language "invalid-lang" + line: 7 + column: 1 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/unknown-lang01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/unknown-lang01-input.svelte new file mode 100644 index 000000000..43e1850c4 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/invalid/unknown-lang01-input.svelte @@ -0,0 +1,18 @@ +
+
Hello
+ + World! +
+ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/no-style01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/no-style01-input.svelte new file mode 100644 index 000000000..f3f9e5892 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/no-style01-input.svelte @@ -0,0 +1,3 @@ +Hello + +World! diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/valid-css01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/valid-css01-input.svelte new file mode 100644 index 000000000..cca266abb --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/valid-css01-input.svelte @@ -0,0 +1,13 @@ +
Hello
+ +World! + + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/valid-scss01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/valid-scss01-input.svelte new file mode 100644 index 000000000..f7130b584 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-style-parse/valid/valid-scss01-input.svelte @@ -0,0 +1,18 @@ +
+
Hello
+ + World! +
+ + diff --git a/packages/eslint-plugin-svelte/tests/src/rules/valid-style-parse.ts b/packages/eslint-plugin-svelte/tests/src/rules/valid-style-parse.ts new file mode 100644 index 000000000..d5d1c5f92 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/src/rules/valid-style-parse.ts @@ -0,0 +1,12 @@ +import { RuleTester } from '../../utils/eslint-compat.js'; +import rule from '../../../src/rules/valid-style-parse.js'; +import { loadTestCases } from '../../utils/utils.js'; + +const tester = new RuleTester({ + languageOptions: { + ecmaVersion: 2020, + sourceType: 'module' + } +}); + +tester.run('valid-style-parse', rule as any, loadTestCases('valid-style-parse')); From 269e66ef6cc11b9d2620acbd7ddd829b1190e61e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 5 Feb 2025 10:58:01 +0100 Subject: [PATCH 2/3] feat(valid-style-parse): implemented the rule --- .changeset/stupid-penguins-smoke.md | 5 +++ README.md | 1 + docs/rules.md | 1 + .../eslint-plugin-svelte/src/rule-types.ts | 5 +++ .../src/rules/valid-style-parse.ts | 40 +++++++++++++++++++ .../eslint-plugin-svelte/src/utils/rules.ts | 4 +- 6 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 .changeset/stupid-penguins-smoke.md create mode 100644 packages/eslint-plugin-svelte/src/rules/valid-style-parse.ts diff --git a/.changeset/stupid-penguins-smoke.md b/.changeset/stupid-penguins-smoke.md new file mode 100644 index 000000000..8be998d65 --- /dev/null +++ b/.changeset/stupid-penguins-smoke.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': minor +--- + +feat: added the valid-style-parse rule diff --git a/README.md b/README.md index 01eb6bdfa..83a17b9ed 100644 --- a/README.md +++ b/README.md @@ -335,6 +335,7 @@ These rules relate to possible syntax or logic errors in Svelte code: | [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-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 | | ## Security Vulnerability diff --git a/docs/rules.md b/docs/rules.md index 5e509b01e..3d6000e8d 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -32,6 +32,7 @@ These rules relate to possible syntax or logic errors in Svelte code: | [svelte/require-store-callbacks-use-set-param](./rules/require-store-callbacks-use-set-param.md) | store callbacks must use `set` param | | | [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 | | ## Security Vulnerability diff --git a/packages/eslint-plugin-svelte/src/rule-types.ts b/packages/eslint-plugin-svelte/src/rule-types.ts index 30f15c1c2..5e38cc0fc 100644 --- a/packages/eslint-plugin-svelte/src/rule-types.ts +++ b/packages/eslint-plugin-svelte/src/rule-types.ts @@ -366,6 +366,11 @@ export interface RuleOptions { * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-prop-names-in-kit-pages/ */ 'svelte/valid-prop-names-in-kit-pages'?: Linter.RuleEntry<[]> + /** + * require valid style element parsing + * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/valid-style-parse/ + */ + 'svelte/valid-style-parse'?: Linter.RuleEntry<[]> } /* ======= Declarations ======= */ diff --git a/packages/eslint-plugin-svelte/src/rules/valid-style-parse.ts b/packages/eslint-plugin-svelte/src/rules/valid-style-parse.ts new file mode 100644 index 000000000..685c68ac6 --- /dev/null +++ b/packages/eslint-plugin-svelte/src/rules/valid-style-parse.ts @@ -0,0 +1,40 @@ +import { createRule } from '../utils/index.js'; +import { getCwd, getSourceCode } from '../utils/compat.js'; + +export default createRule('valid-style-parse', { + meta: { + docs: { + description: 'require valid style element parsing', + category: 'Possible Errors', + recommended: false + }, + schema: [], + messages: {}, + type: 'problem' + }, + create(context) { + const sourceCode = getSourceCode(context); + if (!sourceCode.parserServices.isSvelte) { + return {}; + } + const cwd = `${getCwd(context)}/`; + + return { + SvelteStyleElement(node) { + const styleContext = sourceCode.parserServices.getStyleContext!(); + if (styleContext.status === 'parse-error') { + context.report({ + loc: node.loc, + message: `Error parsing style element. Error message: "${styleContext.error.message.replace(cwd, '')}"` + }); + } + if (styleContext.status === 'unknown-lang') { + context.report({ + loc: node.loc, + message: `Found unsupported style element language "${styleContext.sourceLang}"` + }); + } + } + }; + } +}); diff --git a/packages/eslint-plugin-svelte/src/utils/rules.ts b/packages/eslint-plugin-svelte/src/utils/rules.ts index 2a2ddeeda..13d3bd65c 100644 --- a/packages/eslint-plugin-svelte/src/utils/rules.ts +++ b/packages/eslint-plugin-svelte/src/utils/rules.ts @@ -72,6 +72,7 @@ import system from '../rules/system.js'; import validCompile from '../rules/valid-compile.js'; import validEachKey from '../rules/valid-each-key.js'; import validPropNamesInKitPages from '../rules/valid-prop-names-in-kit-pages.js'; +import validStyleParse from '../rules/valid-style-parse.js'; export const rules = [ typescriptEslintNoUnnecessaryCondition, @@ -143,5 +144,6 @@ export const rules = [ system, validCompile, validEachKey, - validPropNamesInKitPages + validPropNamesInKitPages, + validStyleParse ] as RuleModule[]; From 2ee6d7d63082f707875c6cbf7f49d819a2e89945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 5 Feb 2025 11:04:40 +0100 Subject: [PATCH 3/3] docs(valid-style-parse): documented the rule --- docs/rules/valid-style-parse.md | 78 +++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 docs/rules/valid-style-parse.md diff --git a/docs/rules/valid-style-parse.md b/docs/rules/valid-style-parse.md new file mode 100644 index 000000000..eee703fef --- /dev/null +++ b/docs/rules/valid-style-parse.md @@ -0,0 +1,78 @@ +--- +pageClass: 'rule-details' +sidebarDepth: 0 +title: 'svelte/valid-style-parse' +description: 'require valid style element parsing' +--- + +# svelte/valid-style-parse + +> require valid style element parsing + +- :exclamation: **_This rule has not been released yet._** + +## :book: Rule Details + +This rule reports issues with parsing of the ` +``` + +```svelte + + + + +``` + +```svelte + + + + +``` + +```svelte + + + + +``` + +## :wrench: Options + +Nothing. + +## :mag: Implementation + +- [Rule source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/src/rules/valid-style-parse.ts) +- [Test source](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/tests/src/rules/valid-style-parse.ts)