diff --git a/.changeset/light-bars-talk.md b/.changeset/light-bars-talk.md new file mode 100644 index 000000000..67d8ca971 --- /dev/null +++ b/.changeset/light-bars-talk.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': patch +--- + +fix false positives for regular components in valid-compile/custom_element_props_identifier diff --git a/packages/eslint-plugin-svelte/src/shared/svelte-compile-warns/index.ts b/packages/eslint-plugin-svelte/src/shared/svelte-compile-warns/index.ts index bf462e027..c77e5ca62 100644 --- a/packages/eslint-plugin-svelte/src/shared/svelte-compile-warns/index.ts +++ b/packages/eslint-plugin-svelte/src/shared/svelte-compile-warns/index.ts @@ -17,7 +17,6 @@ import { extractLeadingComments } from './extract-leading-comments.js'; import { findAttribute, getLangValue } from '../../utils/ast-utils.js'; import path from 'path'; import fs from 'fs'; -import semver from 'semver'; type WarningTargetNode = | (AST.SvelteProgram & ASTNodeWithParent) @@ -383,7 +382,7 @@ function* transformScripts(context: RuleContext, text: string) { } } -function hasTagOption(program: AST.SvelteProgram) { +function isCustomElement(program: AST.SvelteProgram) { return program.body.some((body) => { if (body.type !== 'SvelteElement' || body.kind !== 'special') { return false; @@ -392,7 +391,7 @@ function hasTagOption(program: AST.SvelteProgram) { return false; } - return Boolean(findAttribute(body, 'tag')); + return Boolean(findAttribute(body, 'tag')) || Boolean(findAttribute(body, 'customElement')); }); } @@ -409,11 +408,7 @@ function getWarningsFromCode( try { const result = compiler.compile(code, { generate: false, - ...(semver.satisfies(compiler.VERSION, '>=4.0.0-0') - ? { customElement: true } - : hasTagOption(context.sourceCode.ast) - ? { customElement: true } - : {}) + ...(isCustomElement(context.sourceCode.ast) ? { customElement: true } : {}) }); return { warnings: result.warnings as Warning[], kind: 'warn' }; diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/custom_element_props_identifier-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/custom_element_props_identifier-errors.yaml new file mode 100644 index 000000000..e4e9ca4ec --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/custom_element_props_identifier-errors.yaml @@ -0,0 +1,6 @@ +- message: |- + Using a rest element or a non-destructured declaration with `$props()` means that Svelte can't infer what properties to expose when creating a custom element. Consider destructuring all the props or explicitly specifying the `customElement.props` option. + https://svelte.dev/e/custom_element_props_identifier(custom_element_props_identifier) + line: 4 + column: 6 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/custom_element_props_identifier-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/custom_element_props_identifier-input.svelte new file mode 100644 index 000000000..a69b44dba --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/custom_element_props_identifier-input.svelte @@ -0,0 +1,5 @@ + + + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/custom_element_props_identifier-requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/custom_element_props_identifier-requirements.json new file mode 100644 index 000000000..f7b650913 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/custom_element_props_identifier-requirements.json @@ -0,0 +1,3 @@ +{ + "svelte": ">=5.33.4" +} \ No newline at end of file diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/no-false-custom_element_props_identifier-warning-without-custom-element-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/no-false-custom_element_props_identifier-warning-without-custom-element-input.svelte new file mode 100644 index 000000000..a65d11341 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/no-false-custom_element_props_identifier-warning-without-custom-element-input.svelte @@ -0,0 +1,3 @@ + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/no-false-custom_element_props_identifier-warning-without-custom-element-requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/no-false-custom_element_props_identifier-warning-without-custom-element-requirements.json new file mode 100644 index 000000000..f7b650913 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/no-false-custom_element_props_identifier-warning-without-custom-element-requirements.json @@ -0,0 +1,3 @@ +{ + "svelte": ">=5.33.4" +} \ No newline at end of file diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/valid-custom-element-with-props-identifier-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/valid-custom-element-with-props-identifier-input.svelte new file mode 100644 index 000000000..8b9ba2363 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/valid-custom-element-with-props-identifier-input.svelte @@ -0,0 +1,5 @@ + + + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/valid-custom-element-with-props-identifier-requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/valid-custom-element-with-props-identifier-requirements.json new file mode 100644 index 000000000..f7b650913 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/valid/valid-custom-element-with-props-identifier-requirements.json @@ -0,0 +1,3 @@ +{ + "svelte": ">=5.33.4" +} \ No newline at end of file