diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/component-with-getters.svelte b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/component-with-getters.svelte new file mode 100644 index 000000000..7a5c61b75 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/component-with-getters.svelte @@ -0,0 +1,7 @@ + diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/expected.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/expected.json new file mode 100644 index 000000000..bc8bb3570 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/expected.json @@ -0,0 +1,10 @@ +[ + { + "range": { "start": { "line": 5, "character": 4 }, "end": { "line": 5, "character": 22 } }, + "severity": 1, + "source": "ts", + "message": "This comparison appears to be unintentional because the types 'boolean' and 'string' have no overlap.", + "code": 2367, + "tags": [] + } +] diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/expectedv2.json b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/expectedv2.json new file mode 100644 index 000000000..bc8bb3570 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/expectedv2.json @@ -0,0 +1,10 @@ +[ + { + "range": { "start": { "line": 5, "character": 4 }, "end": { "line": 5, "character": 22 } }, + "severity": 1, + "source": "ts", + "message": "This comparison appears to be unintentional because the types 'boolean' and 'string' have no overlap.", + "code": 2367, + "tags": [] + } +] diff --git a/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/input.svelte b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/input.svelte new file mode 100644 index 000000000..fb2396279 --- /dev/null +++ b/packages/language-server/test/plugins/typescript/features/diagnostics/fixtures/getters/input.svelte @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/packages/svelte2tsx/src/svelte2tsx/nodes/ExportedNames.ts b/packages/svelte2tsx/src/svelte2tsx/nodes/ExportedNames.ts index b8e026de3..22ffdcfa3 100644 --- a/packages/svelte2tsx/src/svelte2tsx/nodes/ExportedNames.ts +++ b/packages/svelte2tsx/src/svelte2tsx/nodes/ExportedNames.ts @@ -195,7 +195,13 @@ export class ExportedNames { createClassGetters(): string { return Array.from(this.getters) - .map((name) => `\n get ${name}() { return this.$$prop_def.${name} }`) + .map( + (name) => + // getters are const/classes/functions, which are always defined. + // We have to remove the `| undefined` from the type here because it was necessary to + // be added in a previous step so people are not expected to provide these as props. + `\n get ${name}() { return __sveltets_2_nonNullable(this.$$prop_def.${name}) }` + ) .join(''); } diff --git a/packages/svelte2tsx/svelte-shims.d.ts b/packages/svelte2tsx/svelte-shims.d.ts index 3f3dc947d..9aeae7426 100644 --- a/packages/svelte2tsx/svelte-shims.d.ts +++ b/packages/svelte2tsx/svelte-shims.d.ts @@ -231,6 +231,7 @@ declare function __sveltets_2_createComponentAny(props: Record): _S declare function __sveltets_2_any(...dummy: any[]): any; declare function __sveltets_2_empty(...dummy: any[]): {}; declare function __sveltets_2_union(t1:T1,t2?:T2,t3?:T3,t4?:T4,t5?:T5): T1 & T2 & T3 & T4 & T5; +declare function __sveltets_2_nonNullable(type: T): NonNullable; declare function __sveltets_2_cssProp(prop: Record): {}; diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/export-class/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/export-class/expected.tsx index d1680387e..540c8f500 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/export-class/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/export-class/expected.tsx @@ -7,5 +7,5 @@ return { props: {Foo: Foo}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['Foo'], __sveltets_1_with_any_event(render()))) { - get Foo() { return this.$$prop_def.Foo } + get Foo() { return __sveltets_2_nonNullable(this.$$prop_def.Foo) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/export-class/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/export-class/expectedv2.ts index 669d9d301..ce46e4c70 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/export-class/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/export-class/expectedv2.ts @@ -7,5 +7,5 @@ async () => {}; return { props: {Foo: Foo}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['Foo'], __sveltets_1_with_any_event(render()))) { - get Foo() { return this.$$prop_def.Foo } + get Foo() { return __sveltets_2_nonNullable(this.$$prop_def.Foo) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$Props-with-$$props/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$Props-with-$$props/expected.tsx index 2edbe8f68..27656eccb 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$Props-with-$$props/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$Props-with-$$props/expected.tsx @@ -16,5 +16,5 @@ return { props: {...__sveltets_1_ensureRightProps<{}>(__sveltets_1_any("") as $$Props), ...__sveltets_1_ensureRightProps>({}), ...{} as unknown as $$Props, ...{c: c} as {c?: typeof c}}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_with_any_event(render())) { - get c() { return this.$$prop_def.c } + get c() { return __sveltets_2_nonNullable(this.$$prop_def.c) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$Props-with-$$props/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$Props-with-$$props/expectedv2.ts index c2215535c..b3863c8b0 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$Props-with-$$props/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$Props-with-$$props/expectedv2.ts @@ -16,5 +16,5 @@ $$props;}; return { props: {...__sveltets_1_ensureRightProps<{}>(__sveltets_1_any("") as $$Props), ...__sveltets_1_ensureRightProps>({}), ...{} as unknown as $$Props, ...{c: c} as {c?: typeof c}}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_with_any_event(render())) { - get c() { return this.$$prop_def.c } + get c() { return __sveltets_2_nonNullable(this.$$prop_def.c) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-dts/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-dts/expected.tsx index ee9e4f373..803cba7e5 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-dts/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-dts/expected.tsx @@ -37,5 +37,5 @@ export type InputEvents = ReturnType<__sv export type InputSlots = ReturnType<__sveltets_Render['slots']>; export default class Input extends SvelteComponentTyped, InputEvents, InputSlots> { - get getA() { return this.$$prop_def.getA } + get getA() { return __sveltets_2_nonNullable(this.$$prop_def.getA) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-dts/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-dts/expectedv2.ts index ee9e4f373..803cba7e5 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-dts/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics-dts/expectedv2.ts @@ -37,5 +37,5 @@ export type InputEvents = ReturnType<__sv export type InputSlots = ReturnType<__sveltets_Render['slots']>; export default class Input extends SvelteComponentTyped, InputEvents, InputSlots> { - get getA() { return this.$$prop_def.getA } + get getA() { return __sveltets_2_nonNullable(this.$$prop_def.getA) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expected.tsx index b83ea75e8..f4930e520 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expected.tsx @@ -38,5 +38,5 @@ class __sveltets_Render { export default class Input__SvelteComponent_ extends Svelte2TsxComponent['props']>, ReturnType<__sveltets_Render['events']>, ReturnType<__sveltets_Render['slots']>> { - get getA() { return this.$$prop_def.getA } + get getA() { return __sveltets_2_nonNullable(this.$$prop_def.getA) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expectedv2.ts index f981c47fd..a4344f7b9 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-$$generics/expectedv2.ts @@ -38,5 +38,5 @@ class __sveltets_Render { export default class Input__SvelteComponent_ extends Svelte2TsxComponent['props']>, ReturnType<__sveltets_Render['events']>, ReturnType<__sveltets_Render['slots']>> { - get getA() { return this.$$prop_def.getA } + get getA() { return __sveltets_2_nonNullable(this.$$prop_def.getA) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-export-const/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/ts-export-const/expected.tsx index 29e699583..7d150402f 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-export-const/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-export-const/expected.tsx @@ -8,7 +8,7 @@ return { props: {name: name , SOME: SOME , CONSTANT: CONSTANT} as {name?: string, SOME?: typeof SOME, CONSTANT?: typeof CONSTANT}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_with_any_event(render())) { - get name() { return this.$$prop_def.name } - get SOME() { return this.$$prop_def.SOME } - get CONSTANT() { return this.$$prop_def.CONSTANT } + get name() { return __sveltets_2_nonNullable(this.$$prop_def.name) } + get SOME() { return __sveltets_2_nonNullable(this.$$prop_def.SOME) } + get CONSTANT() { return __sveltets_2_nonNullable(this.$$prop_def.CONSTANT) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/ts-export-const/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/ts-export-const/expectedv2.ts index df23619b5..515973265 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/ts-export-const/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/ts-export-const/expectedv2.ts @@ -8,7 +8,7 @@ async () => {}; return { props: {name: name , SOME: SOME , CONSTANT: CONSTANT} as {name?: string, SOME?: typeof SOME, CONSTANT?: typeof CONSTANT}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_with_any_event(render())) { - get name() { return this.$$prop_def.name } - get SOME() { return this.$$prop_def.SOME } - get CONSTANT() { return this.$$prop_def.CONSTANT } + get name() { return __sveltets_2_nonNullable(this.$$prop_def.name) } + get SOME() { return __sveltets_2_nonNullable(this.$$prop_def.SOME) } + get CONSTANT() { return __sveltets_2_nonNullable(this.$$prop_def.CONSTANT) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-not-present/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-not-present/expected.tsx index 1b7697338..ab7fb8bf8 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-not-present/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-not-present/expected.tsx @@ -9,5 +9,5 @@ return { props: {foo: foo , bar: bar}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) { - get bar() { return this.$$prop_def.bar } + get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-not-present/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-not-present/expectedv2.ts index 0018c767b..5b997e0eb 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-not-present/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-not-present/expectedv2.ts @@ -9,5 +9,5 @@ async () => { { svelteHTML.createElement("svelte:options", {});} return { props: {foo: foo , bar: bar}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) { - get bar() { return this.$$prop_def.bar } + get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-present/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-present/expected.tsx index a3eb04069..f1422aea2 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-present/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-present/expected.tsx @@ -12,7 +12,7 @@ return { props: {foo: foo , foo2: foo2 , class: clazz , bar: bar}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','foo2','bar'], __sveltets_1_with_any_event(render()))) { - get bar() { return this.$$prop_def.bar } + get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) } get foo() { return this.$$prop_def.foo } /**accessor*/ set foo(_) {} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-present/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-present/expectedv2.ts index dcae20b09..54ec0259e 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-present/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-attr-present/expectedv2.ts @@ -12,7 +12,7 @@ async () => { { svelteHTML.createElement("svelte:options", {"accessors":true,}) return { props: {foo: foo , foo2: foo2 , class: clazz , bar: bar}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','foo2','bar'], __sveltets_1_with_any_event(render()))) { - get bar() { return this.$$prop_def.bar } + get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) } get foo() { return this.$$prop_def.foo } /**accessor*/ set foo(_) {} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-false/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-false/expected.tsx index 7114ee7bf..aa5962cce 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-false/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-false/expected.tsx @@ -9,5 +9,5 @@ return { props: {foo: foo , bar: bar}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) { - get bar() { return this.$$prop_def.bar } + get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-false/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-false/expectedv2.ts index 7632f66ef..081e6024f 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-false/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-false/expectedv2.ts @@ -9,5 +9,5 @@ async () => { { svelteHTML.createElement("svelte:options", { "accessors":false, return { props: {foo: foo , bar: bar}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) { - get bar() { return this.$$prop_def.bar } + get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-true/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-true/expected.tsx index 7acc71e83..97092b752 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-true/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-true/expected.tsx @@ -12,7 +12,7 @@ return { props: {foo: foo , foo2: foo2 , class: clazz , bar: bar}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','foo2','bar'], __sveltets_1_with_any_event(render()))) { - get bar() { return this.$$prop_def.bar } + get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) } get foo() { return this.$$prop_def.foo } /**accessor*/ set foo(_) {} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-true/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-true/expectedv2.ts index 4b825ed55..5f00a26d9 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-true/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-mustachetag-true/expectedv2.ts @@ -12,7 +12,7 @@ async () => { { svelteHTML.createElement("svelte:options", { "accessors":true,} return { props: {foo: foo , foo2: foo2 , class: clazz , bar: bar}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','foo2','bar'], __sveltets_1_with_any_event(render()))) { - get bar() { return this.$$prop_def.bar } + get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) } get foo() { return this.$$prop_def.foo } /**accessor*/ set foo(_) {} diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-no-svelte-options/expected.tsx b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-no-svelte-options/expected.tsx index ff2ba3e0a..2b02711f9 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-no-svelte-options/expected.tsx +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-no-svelte-options/expected.tsx @@ -8,5 +8,5 @@ return { props: {foo: foo , bar: bar}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) { - get bar() { return this.$$prop_def.bar } + get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) } } \ No newline at end of file diff --git a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-no-svelte-options/expectedv2.ts b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-no-svelte-options/expectedv2.ts index 96a343314..12b3b00df 100644 --- a/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-no-svelte-options/expectedv2.ts +++ b/packages/svelte2tsx/test/svelte2tsx/samples/uses-accessors-no-svelte-options/expectedv2.ts @@ -8,5 +8,5 @@ async () => {}; return { props: {foo: foo , bar: bar}, slots: {}, events: {} }} export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) { - get bar() { return this.$$prop_def.bar } + get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) } } \ No newline at end of file