diff --git a/.changeset/slow-plums-chew.md b/.changeset/slow-plums-chew.md new file mode 100644 index 0000000000..94908bb9b9 --- /dev/null +++ b/.changeset/slow-plums-chew.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: handle multiple snippet parameters with one or more being optional 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 054d60cb0d..b69c16d320 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/context.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/context.js @@ -121,7 +121,10 @@ function read_type_annotation(parser, optional_allowed = false) { const template = parser.template.slice(0, a).replace(/[^\n]/g, ' ') + insert + - parser.template.slice(parser.index); + // If this is a type annotation for a function parameter, Acorn-TS will treat subsequent + // parameters as part of a sequence expression instead, and will then error on optional + // parameters (`?:`). Therefore replace that sequence with something that will not error. + parser.template.slice(parser.index).replace(/\?\s*:/g, ':'); let expression = parse_expression_at(template, parser.ts, a); // `foo: bar = baz` gets mangled — fix it diff --git a/packages/svelte/tests/runtime-runes/samples/snippet-typescript/_config.js b/packages/svelte/tests/runtime-runes/samples/snippet-typescript/_config.js index 094be77b80..06a7242aab 100644 --- a/packages/svelte/tests/runtime-runes/samples/snippet-typescript/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/snippet-typescript/_config.js @@ -1,5 +1,5 @@ import { test } from '../../test'; export default test({ - html: '1 2 3 4 5' + html: '1 2 3 4 5 6a' }); diff --git a/packages/svelte/tests/runtime-runes/samples/snippet-typescript/main.svelte b/packages/svelte/tests/runtime-runes/samples/snippet-typescript/main.svelte index 9923b1d854..ce6aa5fd84 100644 --- a/packages/svelte/tests/runtime-runes/samples/snippet-typescript/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/snippet-typescript/main.svelte @@ -16,9 +16,13 @@ {#snippet counter5(c?: number = 5)} {c} {/snippet} +{#snippet counter6(c?: number, d?: string)} + {c}{d} +{/snippet} {@render counter1(1)} {@render counter2({ c: 2 })} {@render counter3(3)} {@render counter4()} {@render counter5()} +{@render counter6(6, 'a')}