From 1c48d7cbdcbc78e397d5ace349198bbb87a9e6b6 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 20 Nov 2023 17:36:23 -0500 Subject: [PATCH] Typescript each indexed (#9567) * failing test * fix undefined index bug * Update packages/svelte/src/compiler/phases/1-parse/read/context.js Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --------- Co-authored-by: Rich Harris Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .../svelte/src/compiler/phases/1-parse/read/context.js | 7 ++++++- .../samples/typescript-each-indexed/_config.js | 9 +++++++++ .../samples/typescript-each-indexed/main.svelte | 7 +++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 packages/svelte/tests/runtime-runes/samples/typescript-each-indexed/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/typescript-each-indexed/main.svelte 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 8bf1390969..2fc93c184e 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/context.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/context.js @@ -106,7 +106,12 @@ function read_type_annotation(parser) { const insert = '_ as '; let a = parser.index - insert.length; const template = ' '.repeat(a) + insert + parser.template.slice(parser.index); - const expression = parse_expression_at(template, parser.ts, a); + let expression = parse_expression_at(template, parser.ts, a); + + // `array as item: string, index` becomes `string, index`, which is mistaken as a sequence expression - fix that + if (expression.type === 'SequenceExpression') { + expression = expression.expressions[0]; + } parser.index = /** @type {number} */ (expression.end); return /** @type {any} */ (expression).typeAnnotation; diff --git a/packages/svelte/tests/runtime-runes/samples/typescript-each-indexed/_config.js b/packages/svelte/tests/runtime-runes/samples/typescript-each-indexed/_config.js new file mode 100644 index 0000000000..d8a932c1f0 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/typescript-each-indexed/_config.js @@ -0,0 +1,9 @@ +import { test } from '../../test'; + +export default test({ + html: ` + 0: a + 1: b + 2: c + ` +}); diff --git a/packages/svelte/tests/runtime-runes/samples/typescript-each-indexed/main.svelte b/packages/svelte/tests/runtime-runes/samples/typescript-each-indexed/main.svelte new file mode 100644 index 0000000000..2624f342a7 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/typescript-each-indexed/main.svelte @@ -0,0 +1,7 @@ + + +{#each letters as letter: string, i} + {i}: {letter} +{/each}