diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/$$props.svelte b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/$$props.svelte new file mode 100644 index 000000000..d04d2f55c --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/$$props.svelte @@ -0,0 +1 @@ +
diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/expected.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/expected.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/expected.json @@ -0,0 +1 @@ +[] diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/expectedv2.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/expectedv2.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/expectedv2.json @@ -0,0 +1 @@ +[] diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/input.svelte b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/input.svelte new file mode 100644 index 000000000..db21b2304 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/$$props/input.svelte @@ -0,0 +1,5 @@ + + + diff --git a/packages/svelte2tsx/src/svelte2tsx/createRenderFunction.ts b/packages/svelte2tsx/src/svelte2tsx/createRenderFunction.ts index 5c5288ab8..3fc3d9d79 100644 --- a/packages/svelte2tsx/src/svelte2tsx/createRenderFunction.ts +++ b/packages/svelte2tsx/src/svelte2tsx/createRenderFunction.ts @@ -114,7 +114,7 @@ export function createRenderFunction({ '}'; const returnString = - `\nreturn { props: ${exportedNames.createPropsStr(isTsFile)}` + + `\nreturn { props: ${exportedNames.createPropsStr(isTsFile, uses$$props)}` + `, slots: ${slotsAsDef}` + `, events: ${events.toDefString()} }}`; diff --git a/packages/svelte2tsx/src/svelte2tsx/nodes/ExportedNames.ts b/packages/svelte2tsx/src/svelte2tsx/nodes/ExportedNames.ts index 22ffdcfa3..880053a11 100644 --- a/packages/svelte2tsx/src/svelte2tsx/nodes/ExportedNames.ts +++ b/packages/svelte2tsx/src/svelte2tsx/nodes/ExportedNames.ts @@ -19,6 +19,9 @@ interface ExportedName { } export class ExportedNames { + /** + * Uses the $$Props type + */ public uses$$Props = false; private exports = new Map(); private possibleExports = new Map< @@ -321,8 +324,9 @@ export class ExportedNames { * Creates a string from the collected props * * @param isTsFile Whether this is a TypeScript file or not. + * @param uses$$propsValue whether the file references the $$props variable */ - createPropsStr(isTsFile: boolean): string { + createPropsStr(isTsFile: boolean, uses$$propsValue: boolean): string { const names = Array.from(this.exports.entries()); if (this.uses$$Props) { @@ -352,7 +356,7 @@ export class ExportedNames { ); } - if (names.length === 0) { + if (names.length === 0 && !uses$$propsValue) { // Necessary, because {} roughly equals to any return isTsFile ? '{} as Record' diff --git a/packages/svelte2tsx/test/sourcemaps/samples/reserved-variables/mappings.jsx b/packages/svelte2tsx/test/sourcemaps/samples/reserved-variables/mappings.jsx index c5185be6e..861026a9f 100644 --- a/packages/svelte2tsx/test/sourcemaps/samples/reserved-variables/mappings.jsx +++ b/packages/svelte2tsx/test/sourcemaps/samples/reserved-variables/mappings.jsx @@ -51,7 +51,7 @@ { {/if} [original] line 13 ------------------------------------------------------------------------------------------------------------------------------------------------------ */} -return { props: /** @type {Record} */ ({}), slots: {}, events: {} }} +return { props: {}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial_with_any(__sveltets_1_with_any_event(render()))) { } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-uses-$$props/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/ts-uses-$$props/expected.tsx index 44277b2ab..19e716cf5 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-uses-$$props/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-uses-$$props/expected.tsx @@ -3,7 +3,7 @@ ; () => (<>

{$$props['name']}

); -return { props: {} as Record, slots: {}, events: {} }} +return { props: {}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_with_any(__sveltets_1_with_any_event(render()))) { } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-uses-$$props/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/ts-uses-$$props/expectedv2.ts index 04c384810..20e3dd4df 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-uses-$$props/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-uses-$$props/expectedv2.ts @@ -3,7 +3,7 @@ ; async () => { { svelteHTML.createElement("h1", {});$$props['name']; }}; -return { props: {} as Record, slots: {}, events: {} }} +return { props: {}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_with_any(__sveltets_1_with_any_event(render()))) { } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expected.tsx index 5f4c95fcf..fa7b4642e 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expected.tsx @@ -5,7 +5,7 @@ ; () => (<>

{name}

); -return { props: /** @type {Record} */ ({}), slots: {}, events: {} }} +return { props: {}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial_with_any(__sveltets_1_with_any_event(render()))) { } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expectedv2.ts index 3f8b2e9ec..bfa09bb8c 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props-script/expectedv2.ts @@ -5,7 +5,7 @@ ; async () => { { svelteHTML.createElement("h1", {});name; } }; -return { props: /** @type {Record} */ ({}), slots: {}, events: {} }} +return { props: {}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial_with_any(__sveltets_1_with_any_event(render()))) { -} \ No newline at end of file +} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props/expected.tsx index 8028f58ac..117da66c5 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props/expected.tsx @@ -1,7 +1,7 @@ /// <>;function render() { let $$props = __sveltets_1_allPropsType(); <>

{$$props['name']}

-return { props: /** @type {Record} */ ({}), slots: {}, events: {} }} +return { props: {}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial_with_any(__sveltets_1_with_any_event(render()))) { } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props/expectedv2.ts index 21f3398b2..bea1a9e6e 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-$$props/expectedv2.ts @@ -1,7 +1,7 @@ /// ;function render() { let $$props = __sveltets_1_allPropsType(); async () => { { svelteHTML.createElement("h1", {});$$props['name']; }}; -return { props: /** @type {Record} */ ({}), slots: {}, events: {} }} +return { props: {}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial_with_any(__sveltets_1_with_any_event(render()))) { } \ No newline at end of file