diff --git a/.changeset/lang-ts-error.md b/.changeset/lang-ts-error.md new file mode 100644 index 000000000000..d2291d910b34 --- /dev/null +++ b/.changeset/lang-ts-error.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: improve error message for TS-like snippet annotations without lang="ts" diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/svelte/.gitignore b/packages/svelte/.gitignore index d0c4ba8d6144..b5150ed6f552 100644 --- a/packages/svelte/.gitignore +++ b/packages/svelte/.gitignore @@ -13,3 +13,5 @@ /transition.d.ts /scripts/_bundle.js +*.Zone.Identifier + diff --git a/packages/svelte/src/compiler/phases/1-parse/read/context.js b/packages/svelte/src/compiler/phases/1-parse/read/context.js index 282288e2a22f..1e3f0e07dbc7 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/context.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/context.js @@ -45,6 +45,17 @@ export default function read_pattern(parser) { const pattern_string = parser.template.slice(start, i); try { + // Check for TypeScript parameter annotations in the pattern string + if (!parser.ts) { + const parameterRegex = /\w+\s*:\s*\w+/; + if (parameterRegex.test(pattern_string)) { + e.typescript_invalid_feature( + start, + 'type annotations in snippets. Did you forget to add lang="ts" to your script tag?' + ); + } + } + // the length of the `space_with_newline` has to be start - 1 // because we added a `(` in front of the pattern_string, // which shifted the entire string to right by 1 @@ -67,7 +78,9 @@ export default function read_pattern(parser) { ) ).left; - expression.typeAnnotation = read_type_annotation(parser); + const annotation = read_type_annotation(parser); + + expression.typeAnnotation = annotation; if (expression.typeAnnotation) { expression.end = expression.typeAnnotation.end; } diff --git a/packages/svelte/src/compiler/phases/1-parse/state/tag.js b/packages/svelte/src/compiler/phases/1-parse/state/tag.js index 4ff948e165bc..49c8d29bffa8 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/tag.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/tag.js @@ -396,6 +396,14 @@ function open(parser) { const prelude = parser.template.slice(0, params_start).replace(/\S/g, ' '); const params = parser.template.slice(params_start, parser.index); + // Check for TypeScript parameter annotations without lang="ts" + if (!parser.ts && matched && /\w+\s*:\s*\w+/.test(params)) { + e.typescript_invalid_feature( + parser.index, + 'type annotations in snippets. Did you forget to add lang="ts" to your script tag?' + ); + } + let function_expression = matched ? /** @type {ArrowFunctionExpression} */ ( parse_expression_at(