diff --git a/.changeset/chilled-pumas-report.md b/.changeset/chilled-pumas-report.md new file mode 100644 index 00000000..b9e5750c --- /dev/null +++ b/.changeset/chilled-pumas-report.md @@ -0,0 +1,5 @@ +--- +"svelte-eslint-parser": patch +--- + +fix some `$props()` type linting error diff --git a/.changeset/chilly-mails-fly.md b/.changeset/chilly-mails-fly.md new file mode 100644 index 00000000..c2d0368f --- /dev/null +++ b/.changeset/chilly-mails-fly.md @@ -0,0 +1,5 @@ +--- +"svelte-eslint-parser": minor +--- + +update svelte to v5 diff --git a/explorer-v2/package.json b/explorer-v2/package.json index 9c77f61d..e7493503 100644 --- a/explorer-v2/package.json +++ b/explorer-v2/package.json @@ -18,7 +18,7 @@ "eslint-scope": "^7.2.2", "esquery": "^1.6.0", "pako": "^2.1.0", - "svelte": "^5.0.0-next.264", + "svelte": "^5.0.0", "svelte-eslint-parser": "link:..", "tslib": "^2.7.0" }, diff --git a/package.json b/package.json index a5df7270..ea94d1ac 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "version:ci": "env-cmd -e version-ci pnpm run build:meta && changeset version" }, "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.191" + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { "svelte": { @@ -105,7 +105,7 @@ "prettier-plugin-svelte": "^3.2.7", "rimraf": "^6.0.1", "semver": "^7.6.3", - "svelte": "^5.0.0-next.264", + "svelte": "^5.0.0", "svelte2tsx": "^0.7.22", "typescript": "~5.6.3", "typescript-eslint-parser-for-extra-files": "^0.7.0" diff --git a/src/parser/typescript/analyze/index.ts b/src/parser/typescript/analyze/index.ts index 0e1d8bbe..88a617bd 100644 --- a/src/parser/typescript/analyze/index.ts +++ b/src/parser/typescript/analyze/index.ts @@ -339,25 +339,23 @@ function analyzeRuneVariables( continue; } switch (globalName) { - // See https://github.com/sveltejs/svelte/blob/ccb3c90cd57ca9d764efab317ed1cb8e5282926e/packages/svelte/types/index.d.ts#L2646 + // See https://github.com/sveltejs/svelte/blob/41b5cd6f5daae3970a9927e062f42b6b62440d16/packages/svelte/types/index.d.ts#L2299 case "$state": { appendDeclareFunctionVirtualScripts(globalName, [ "(initial: T): T", "(): T | undefined", ]); appendDeclareNamespaceVirtualScripts(globalName, [ - "export function frozen(initial: T): Readonly;", - "export function frozen(): Readonly | undefined;", + "export function raw(initial: T): T;", + "export function raw(): T | undefined;", ]); appendDeclareNamespaceVirtualScripts(globalName, [ "export function snapshot(state: T): T;", ]); - appendDeclareNamespaceVirtualScripts(globalName, [ - "export function is(a: any, b: any): boolean;", - ]); + break; } - // See https://github.com/sveltejs/svelte/blob/ccb3c90cd57ca9d764efab317ed1cb8e5282926e/packages/svelte/types/index.d.ts#L2751 + // See https://github.com/sveltejs/svelte/blob/41b5cd6f5daae3970a9927e062f42b6b62440d16/packages/svelte/types/index.d.ts#L2453 case "$derived": { appendDeclareFunctionVirtualScripts(globalName, [ "(expression: T): T", @@ -367,7 +365,7 @@ function analyzeRuneVariables( ]); break; } - // See https://github.com/sveltejs/svelte/blob/ccb3c90cd57ca9d764efab317ed1cb8e5282926e/packages/svelte/types/index.d.ts#L2811 + // See https://github.com/sveltejs/svelte/blob/41b5cd6f5daae3970a9927e062f42b6b62440d16/packages/svelte/types/index.d.ts#L2513 case "$effect": { appendDeclareFunctionVirtualScripts(globalName, [ "(fn: () => void | (() => void)): void", @@ -379,24 +377,27 @@ function analyzeRuneVariables( ]); break; } - // See https://github.com/sveltejs/svelte/blob/ccb3c90cd57ca9d764efab317ed1cb8e5282926e/packages/svelte/types/index.d.ts#L2913 + // See https://github.com/sveltejs/svelte/blob/41b5cd6f5daae3970a9927e062f42b6b62440d16/packages/svelte/types/index.d.ts#L2615 case "$props": { - appendDeclareFunctionVirtualScripts(globalName, ["(): any"]); + // Use type parameters to avoid `@typescript-eslint/no-unsafe-assignment` errors. + appendDeclareFunctionVirtualScripts(globalName, ["(): T"]); break; } - // See https://github.com/sveltejs/svelte/blob/ccb3c90cd57ca9d764efab317ed1cb8e5282926e/packages/svelte/types/index.d.ts#L2924 + // See https://github.com/sveltejs/svelte/blob/41b5cd6f5daae3970a9927e062f42b6b62440d16/packages/svelte/types/index.d.ts#L2626 case "$bindable": { - appendDeclareFunctionVirtualScripts(globalName, ["(t?: T): T"]); + appendDeclareFunctionVirtualScripts(globalName, [ + "(fallback?: T): T", + ]); break; } - // See https://github.com/sveltejs/svelte/blob/ccb3c90cd57ca9d764efab317ed1cb8e5282926e/packages/svelte/types/index.d.ts#L2944 + // See https://github.com/sveltejs/svelte/blob/41b5cd6f5daae3970a9927e062f42b6b62440d16/packages/svelte/types/index.d.ts#L2646 case "$inspect": { appendDeclareFunctionVirtualScripts(globalName, [ `(...values: T): { with: (fn: (type: 'init' | 'update', ...values: T) => void) => void }`, ]); break; } - // See https://github.com/sveltejs/svelte/blob/ccb3c90cd57ca9d764efab317ed1cb8e5282926e/packages/svelte/types/index.d.ts#L2967 + // See https://github.com/sveltejs/svelte/blob/41b5cd6f5daae3970a9927e062f42b6b62440d16/packages/svelte/types/index.d.ts#L2669 case "$host": { appendDeclareFunctionVirtualScripts(globalName, [ `(): El`, diff --git a/tests/fixtures/integrations/type-info-tests/$props-input.svelte b/tests/fixtures/integrations/type-info-tests/$props-input.svelte new file mode 100644 index 00000000..dbf5c30e --- /dev/null +++ b/tests/fixtures/integrations/type-info-tests/$props-input.svelte @@ -0,0 +1,5 @@ + + +
{x}
diff --git a/tests/fixtures/integrations/type-info-tests/$props-output.json b/tests/fixtures/integrations/type-info-tests/$props-output.json new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/tests/fixtures/integrations/type-info-tests/$props-output.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/fixtures/integrations/type-info-tests/$props-requirements.json b/tests/fixtures/integrations/type-info-tests/$props-requirements.json new file mode 100644 index 00000000..809a4e1f --- /dev/null +++ b/tests/fixtures/integrations/type-info-tests/$props-requirements.json @@ -0,0 +1,5 @@ +{ + "parse": { + "svelte": ">=5.0.0-0" + } +} \ No newline at end of file diff --git a/tests/fixtures/integrations/type-info-tests/$props-setup.ts b/tests/fixtures/integrations/type-info-tests/$props-setup.ts new file mode 100644 index 00000000..d53704e5 --- /dev/null +++ b/tests/fixtures/integrations/type-info-tests/$props-setup.ts @@ -0,0 +1,47 @@ +/* eslint eslint-comments/require-description: 0, @typescript-eslint/explicit-module-boundary-types: 0 */ +import type { Linter } from "eslint"; +import { generateParserOptions } from "../../../src/parser/test-utils"; +import { rules } from "@typescript-eslint/eslint-plugin"; +export function setupLinter(linter: Linter) { + linter.defineRule( + "@typescript-eslint/no-unsafe-argument", + rules["no-unsafe-argument"] as never, + ); + linter.defineRule( + "@typescript-eslint/no-unsafe-assignment", + rules["no-unsafe-assignment"] as never, + ); + linter.defineRule( + "@typescript-eslint/no-unsafe-call", + rules["no-unsafe-call"] as never, + ); + linter.defineRule( + "@typescript-eslint/no-unsafe-member-access", + rules["no-unsafe-member-access"] as never, + ); + linter.defineRule( + "@typescript-eslint/no-unsafe-return", + rules["no-unsafe-return"] as never, + ); +} + +export function getConfig() { + return { + parser: "svelte-eslint-parser", + parserOptions: { + ...generateParserOptions(), + svelteFeatures: { runes: true }, + }, + rules: { + "@typescript-eslint/no-unsafe-argument": "error", + "@typescript-eslint/no-unsafe-assignment": "error", + "@typescript-eslint/no-unsafe-call": "error", + "@typescript-eslint/no-unsafe-member-access": "error", + "@typescript-eslint/no-unsafe-return": "error", + }, + env: { + browser: true, + es2021: true, + }, + }; +} diff --git a/tests/fixtures/parser/ast/svelte5/docs/snippets/10-typing-snippets-type-output.svelte b/tests/fixtures/parser/ast/svelte5/docs/snippets/10-typing-snippets-type-output.svelte index 2009d36a..0db3e719 100644 --- a/tests/fixtures/parser/ast/svelte5/docs/snippets/10-typing-snippets-type-output.svelte +++ b/tests/fixtures/parser/ast/svelte5/docs/snippets/10-typing-snippets-type-output.svelte @@ -5,7 +5,7 @@ data: any[]; // data: any[] children: Snippet; // Snippet: Snippet, children: Snippet<[]> row: Snippet<[any]>; // Snippet: Snippet, row: Snippet<[any]> - } = $props(); // $props(): any + } = $props(); // $props(): { data: any[]; children: Snippet<[]>; row: Snippet<[any]>; } diff --git a/tests/fixtures/parser/ast/svelte5/docs/snippets/11-typing-snippets-type-output.svelte b/tests/fixtures/parser/ast/svelte5/docs/snippets/11-typing-snippets-type-output.svelte index 204db6f5..3396ed9b 100644 --- a/tests/fixtures/parser/ast/svelte5/docs/snippets/11-typing-snippets-type-output.svelte +++ b/tests/fixtures/parser/ast/svelte5/docs/snippets/11-typing-snippets-type-output.svelte @@ -5,7 +5,7 @@ data: T[]; // T: unknown, data: unknown[] children: Snippet; // Snippet: Snippet, children: Snippet<[]> row: Snippet<[T]>; // Snippet: Snippet, T: unknown, row: Snippet<[unknown]> - } = $props(); // $props(): any + } = $props(); // $props(): { data: unknown[]; children: Snippet<[]>; row: Snippet<[unknown]>; }
diff --git a/tests/fixtures/parser/ast/svelte5/generics01-snippets-type-output.svelte b/tests/fixtures/parser/ast/svelte5/generics01-snippets-type-output.svelte index 9511f75b..73fb2bc4 100644 --- a/tests/fixtures/parser/ast/svelte5/generics01-snippets-type-output.svelte +++ b/tests/fixtures/parser/ast/svelte5/generics01-snippets-type-output.svelte @@ -6,7 +6,7 @@ data: A[]; // A: unknown, data: unknown[] children: Snippet; // Snippet: Snippet, children: Snippet<[]> row: Snippet<[A]>; // Snippet: Snippet, A: unknown, row: Snippet<[unknown]> - } = $props(); // $props(): any + } = $props(); // $props(): { data: unknown[]; children: Snippet<[]>; row: Snippet<[unknown]>; }
diff --git a/tests/fixtures/parser/ast/svelte5/ts-$props01-type-output.svelte b/tests/fixtures/parser/ast/svelte5/ts-$props01-type-output.svelte index 5bccb22f..ff36a150 100644 --- a/tests/fixtures/parser/ast/svelte5/ts-$props01-type-output.svelte +++ b/tests/fixtures/parser/ast/svelte5/ts-$props01-type-output.svelte @@ -5,7 +5,7 @@ c: boolean; // c: boolean d: number; // d: number } - let { a, b, c, ...everythingElse }: MyProps = $props(); // a: number, a: number, b: string, b: string, c: boolean, c: boolean, everythingElse: { d: number; }, MyProps: MyProps, $props(): any + let { a, b, c, ...everythingElse }: MyProps = $props(); // a: number, a: number, b: string, b: string, c: boolean, c: boolean, everythingElse: { d: number; }, MyProps: MyProps, $props(): MyProps {a} diff --git a/tests/fixtures/parser/ast/svelte5/ts-event03-type-output.svelte b/tests/fixtures/parser/ast/svelte5/ts-event03-type-output.svelte index e56a63cf..72c2a943 100644 --- a/tests/fixtures/parser/ast/svelte5/ts-event03-type-output.svelte +++ b/tests/fixtures/parser/ast/svelte5/ts-event03-type-output.svelte @@ -1,7 +1,7 @@