diff --git a/.changeset/silly-turkeys-confess.md b/.changeset/silly-turkeys-confess.md new file mode 100644 index 0000000000..9bb677e52a --- /dev/null +++ b/.changeset/silly-turkeys-confess.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: destructuring state in ssr diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js index 1f0e6be77c..7c94595147 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js @@ -197,9 +197,13 @@ function create_state_declarators(declarator, scope, value) { } const tmp = b.id(scope.generate('tmp')); - const { paths } = extract_paths(declarator.id, tmp); + const { paths, inserts } = extract_paths(declarator.id, tmp); return [ b.declarator(tmp, value), // TODO inject declarator for opts, so we can use it below + ...inserts.map(({ id, value }) => { + id.name = scope.generate('$$array'); + return b.declarator(id, value); + }), ...paths.map((path) => { const value = path.expression; return b.declarator(path.node, value); diff --git a/packages/svelte/tests/server-side-rendering/samples/destructure-state-iterable/_expected.html b/packages/svelte/tests/server-side-rendering/samples/destructure-state-iterable/_expected.html new file mode 100644 index 0000000000..e3f755a08c --- /dev/null +++ b/packages/svelte/tests/server-side-rendering/samples/destructure-state-iterable/_expected.html @@ -0,0 +1 @@ +0, 1 \ No newline at end of file diff --git a/packages/svelte/tests/server-side-rendering/samples/destructure-state-iterable/main.svelte b/packages/svelte/tests/server-side-rendering/samples/destructure-state-iterable/main.svelte new file mode 100644 index 0000000000..9414735f2f --- /dev/null +++ b/packages/svelte/tests/server-side-rendering/samples/destructure-state-iterable/main.svelte @@ -0,0 +1,11 @@ + + +{one}, {two} \ No newline at end of file diff --git a/packages/svelte/tests/server-side-rendering/samples/destructure-state/_expected.html b/packages/svelte/tests/server-side-rendering/samples/destructure-state/_expected.html new file mode 100644 index 0000000000..213a5f5bf1 --- /dev/null +++ b/packages/svelte/tests/server-side-rendering/samples/destructure-state/_expected.html @@ -0,0 +1 @@ +10, Admin \ No newline at end of file diff --git a/packages/svelte/tests/server-side-rendering/samples/destructure-state/main.svelte b/packages/svelte/tests/server-side-rendering/samples/destructure-state/main.svelte new file mode 100644 index 0000000000..422548cd14 --- /dev/null +++ b/packages/svelte/tests/server-side-rendering/samples/destructure-state/main.svelte @@ -0,0 +1,5 @@ + + +{level}, {custom} \ No newline at end of file