diff --git a/.changeset/gold-bottles-learn.md b/.changeset/gold-bottles-learn.md new file mode 100644 index 000000000..2eb49d5e2 --- /dev/null +++ b/.changeset/gold-bottles-learn.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': patch +--- + +fix: allow `children` in `valid-prop-names-in-kit-pages` rule diff --git a/packages/eslint-plugin-svelte/src/rules/valid-prop-names-in-kit-pages.ts b/packages/eslint-plugin-svelte/src/rules/valid-prop-names-in-kit-pages.ts index e8461104c..ab3f9d526 100644 --- a/packages/eslint-plugin-svelte/src/rules/valid-prop-names-in-kit-pages.ts +++ b/packages/eslint-plugin-svelte/src/rules/valid-prop-names-in-kit-pages.ts @@ -2,16 +2,23 @@ import type { AST } from 'svelte-eslint-parser'; import type { TSESTree } from '@typescript-eslint/types'; import { createRule } from '../utils/index.js'; import type { RuleContext } from '../types.js'; +import { getSvelteVersion } from '../utils/svelte-context.js'; +import { getFilename } from '../utils/compat.js'; const EXPECTED_PROP_NAMES = ['data', 'errors', 'form', 'snapshot']; +const EXPECTED_PROP_NAMES_SVELTE5 = [...EXPECTED_PROP_NAMES, 'children']; -function checkProp(node: TSESTree.VariableDeclarator, context: RuleContext) { +function checkProp( + node: TSESTree.VariableDeclarator, + context: RuleContext, + expectedPropNames: string[] +) { if (node.id.type !== 'ObjectPattern') return; for (const p of node.id.properties) { if ( p.type === 'Property' && p.value.type === 'Identifier' && - !EXPECTED_PROP_NAMES.includes(p.value.name) + !expectedPropNames.includes(p.value.name) ) { context.report({ node: p.value, @@ -42,6 +49,8 @@ export default createRule('valid-prop-names-in-kit-pages', { }, create(context) { let isScript = false; + const isSvelte5 = getSvelteVersion(getFilename(context)) === '5'; + const expectedPropNames = isSvelte5 ? EXPECTED_PROP_NAMES_SVELTE5 : EXPECTED_PROP_NAMES; return { // + +{children} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte4-children/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte4-children/_config.json new file mode 100644 index 000000000..7e9bb8b64 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte4-children/_config.json @@ -0,0 +1,13 @@ +{ + "languageOptions": { + "parserOptions": { + "svelteConfig": { + "kit": { + "files": { + "routes": "tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte4-children" + } + } + } + } + } +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte4-children/errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte4-children/errors.yaml new file mode 100644 index 000000000..1d3d85764 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte4-children/errors.yaml @@ -0,0 +1,4 @@ +- message: disallow props other than data or errors in SvelteKit page components. + line: 2 + column: 13 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte4-children/requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte4-children/requirements.json new file mode 100644 index 000000000..b650cc296 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/invalid/svelte4-children/requirements.json @@ -0,0 +1,3 @@ +{ + "svelte": "^3.0.0 || ^4.0.0" +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5-without-runes/+page.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5-without-runes/+page.svelte new file mode 100644 index 000000000..b1fd5942c --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5-without-runes/+page.svelte @@ -0,0 +1,24 @@ + + +{data}, {errors} + +{#if form?.success} +
Successfully logged in! Welcome back, {data.user.name}
+{/if} + + diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5-without-runes/_config.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5-without-runes/_config.json new file mode 100644 index 000000000..e245d263b --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5-without-runes/_config.json @@ -0,0 +1,13 @@ +{ + "languageOptions": { + "parserOptions": { + "svelteConfig": { + "kit": { + "files": { + "routes": "tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5-without-runes" + } + } + } + } + } +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5-without-runes/requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5-without-runes/requirements.json new file mode 100644 index 000000000..0192b1098 --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5-without-runes/requirements.json @@ -0,0 +1,3 @@ +{ + "svelte": ">=5.0.0-0" +} diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/+page.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/+page.svelte index 6ed2875b6..66723409f 100644 --- a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/+page.svelte +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-prop-names-in-kit-pages/valid/svelte5/+page.svelte @@ -1,5 +1,5 @@