${$.escape(title)}
we don't need to traverse these nodes
or
these
ones
${$.html(content)}these
trailing
nodes
can
be
completely
ignored
diff --git a/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js b/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js index df7ba38544..eadcefe6b5 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js @@ -242,7 +242,7 @@ export function server_component(analysis, options) { b.call( '$$payload.child', b.arrow( - [], + [b.object_pattern([b.init('$$payload', b.id('$$payload'))])], b.block([ .../** @type {Statement[]} */ (instance.body), .../** @type {Statement[]} */ (template.body) diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/SnippetBlock.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/SnippetBlock.js index aa24668706..908ca9faba 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/SnippetBlock.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/SnippetBlock.js @@ -12,8 +12,18 @@ export function SnippetBlock(node, context) { let fn = b.function_declaration( node.expression, [b.id('$$payload'), ...node.parameters], - /** @type {BlockStatement} */ (context.visit(node.body)), - node.metadata.has_await + b.block([ + b.stmt( + b.call( + '$$payload.child', + b.arrow( + [b.object_pattern([b.init('$$payload', b.id('$$payload'))])], + /** @type {BlockStatement} */ (context.visit(node.body)), + context.state.analysis.suspends + ) + ) + ) + ]) ); // @ts-expect-error - TODO remove this hack once $$render_inner for legacy bindings is gone diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/component.js index f5de8e795d..73e9e267cb 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/component.js @@ -237,7 +237,11 @@ export function build_inline_component(node, expression, context) { b.stmt( b.call( '$$payload.child', - b.arrow([], b.block(block.body), context.state.analysis.suspends) + b.arrow( + [b.object_pattern([b.init('$$payload', b.id('$$payload'))])], + b.block(block.body), + context.state.analysis.suspends + ) ) ) ]) diff --git a/packages/svelte/tests/snapshot/samples/await-block-scope/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/await-block-scope/_expected/server/index.svelte.js index cc2628c852..f123a4ac06 100644 --- a/packages/svelte/tests/snapshot/samples/await-block-scope/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/await-block-scope/_expected/server/index.svelte.js @@ -1,14 +1,16 @@ import * as $ from 'svelte/internal/server'; export default function Await_block_scope($$payload) { - let counter = { count: 0 }; - const promise = Promise.resolve(counter); + $$payload.child(({ $$payload }) => { + let counter = { count: 0 }; + const promise = Promise.resolve(counter); - function increment() { - counter.count += 1; - } + function increment() { + counter.count += 1; + } - $$payload.out.push(` `); - $.await($$payload, promise, () => {}, (counter) => {}); - $$payload.out.push(` ${$.escape(counter.count)}`); + $$payload.out.push(` `); + $.await($$payload, promise, () => {}, (counter) => {}); + $$payload.out.push(` ${$.escape(counter.count)}`); + }); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/server/index.svelte.js index c0db7d2fd5..e50eddd635 100644 --- a/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/server/index.svelte.js @@ -2,35 +2,39 @@ import * as $ from 'svelte/internal/server'; import TextInput from './Child.svelte'; function snippet($$payload) { - $$payload.out.push(`Something`); + $$payload.child(({ $$payload }) => { + $$payload.out.push(`Something`); + }); } export default function Bind_component_snippet($$payload) { - let value = ''; - const _snippet = snippet; - let $$settled = true; - let $$inner_payload; + $$payload.child(({ $$payload }) => { + let value = ''; + const _snippet = snippet; + let $$settled = true; + let $$inner_payload; - function $$render_inner($$payload) { - TextInput($$payload, { - get value() { - return value; - }, + function $$render_inner($$payload) { + TextInput($$payload, { + get value() { + return value; + }, - set value($$value) { - value = $$value; - $$settled = false; - } - }); + set value($$value) { + value = $$value; + $$settled = false; + } + }); - $$payload.out.push(` value: ${$.escape(value)}`); - } + $$payload.out.push(` value: ${$.escape(value)}`); + } - do { - $$settled = true; - $$inner_payload = $.copy_payload($$payload); - $$render_inner($$inner_payload); - } while (!$$settled); + do { + $$settled = true; + $$inner_payload = $.copy_payload($$payload); + $$render_inner($$inner_payload); + } while (!$$settled); - $.assign_payload($$payload, $$inner_payload); + $.assign_payload($$payload, $$inner_payload); + }); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/bind-this/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/bind-this/_expected/server/index.svelte.js index 148573766f..86a632de8d 100644 --- a/packages/svelte/tests/snapshot/samples/bind-this/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/bind-this/_expected/server/index.svelte.js @@ -1,5 +1,7 @@ import * as $ from 'svelte/internal/server'; export default function Bind_this($$payload) { - Foo($$payload, {}); + $$payload.child(({ $$payload }) => { + Foo($$payload, {}); + }); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/class-state-field-constructor-assignment/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/class-state-field-constructor-assignment/_expected/server/index.svelte.js index abfc264fea..968cbcebfb 100644 --- a/packages/svelte/tests/snapshot/samples/class-state-field-constructor-assignment/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/class-state-field-constructor-assignment/_expected/server/index.svelte.js @@ -3,36 +3,38 @@ import * as $ from 'svelte/internal/server'; export default function Class_state_field_constructor_assignment($$payload, $$props) { $.push(); - class Foo { - a = 0; - #b; - #foo = $.derived(() => ({ bar: this.a * 2 })); - - get foo() { - return this.#foo(); - } - - set foo($$value) { - return this.#foo($$value); - } - - #bar = $.derived(() => ({ baz: this.foo })); - - get bar() { - return this.#bar(); - } - - set bar($$value) { - return this.#bar($$value); - } - - constructor() { - this.a = 1; - this.#b = 2; - this.foo.bar = 3; - this.bar = 4; + $$payload.child(({ $$payload }) => { + class Foo { + a = 0; + #b; + #foo = $.derived(() => ({ bar: this.a * 2 })); + + get foo() { + return this.#foo(); + } + + set foo($$value) { + return this.#foo($$value); + } + + #bar = $.derived(() => ({ baz: this.foo })); + + get bar() { + return this.#bar(); + } + + set bar($$value) { + return this.#bar($$value); + } + + constructor() { + this.a = 1; + this.#b = 2; + this.foo.bar = 3; + this.bar = 4; + } } - } + }); $.pop(); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/delegated-locally-declared-shadowed/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/delegated-locally-declared-shadowed/_expected/server/index.svelte.js index ac3dfcd2cb..777dd72d78 100644 --- a/packages/svelte/tests/snapshot/samples/delegated-locally-declared-shadowed/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/delegated-locally-declared-shadowed/_expected/server/index.svelte.js @@ -1,13 +1,15 @@ import * as $ from 'svelte/internal/server'; export default function Delegated_locally_declared_shadowed($$payload) { - const each_array = $.ensure_array_like({ length: 1 }); + $$payload.child(({ $$payload }) => { + const each_array = $.ensure_array_like({ length: 1 }); - $$payload.out.push(``); + $$payload.out.push(``); - for (let index = 0, $$length = each_array.length; index < $$length; index++) { - $$payload.out.push(``); - } + for (let index = 0, $$length = each_array.length; index < $$length; index++) { + $$payload.out.push(``); + } - $$payload.out.push(``); + $$payload.out.push(``); + }); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/dynamic-attributes-casing/_expected/server/main.svelte.js b/packages/svelte/tests/snapshot/samples/dynamic-attributes-casing/_expected/server/main.svelte.js index 9c837d4e1d..70ff077557 100644 --- a/packages/svelte/tests/snapshot/samples/dynamic-attributes-casing/_expected/server/main.svelte.js +++ b/packages/svelte/tests/snapshot/samples/dynamic-attributes-casing/_expected/server/main.svelte.js @@ -1,10 +1,10 @@ import * as $ from 'svelte/internal/server'; export default function Main($$payload) { - // needs to be a snapshot test because jsdom does auto-correct the attribute casing - let x = 'test'; + $$payload.child(({ $$payload }) => { + let x = 'test'; + let y = () => 'test'; - let y = () => 'test'; - - $$payload.out.push(`
index: ${$.escape(i)}
`); - } + for (let i = 0, $$length = each_array.length; i < $$length; i++) { + $$payload.out.push(`index: ${$.escape(i)}
`); + } - $$payload.out.push(``); + $$payload.out.push(``); + }); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/each-string-template/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/each-string-template/_expected/server/index.svelte.js index 6dbe8130da..1bc9da9d65 100644 --- a/packages/svelte/tests/snapshot/samples/each-string-template/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/each-string-template/_expected/server/index.svelte.js @@ -1,15 +1,17 @@ import * as $ from 'svelte/internal/server'; export default function Each_string_template($$payload) { - const each_array = $.ensure_array_like(['foo', 'bar', 'baz']); + $$payload.child(({ $$payload }) => { + const each_array = $.ensure_array_like(['foo', 'bar', 'baz']); - $$payload.out.push(``); + $$payload.out.push(``); - for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) { - let thing = each_array[$$index]; + for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) { + let thing = each_array[$$index]; - $$payload.out.push(`${$.escape(thing)}, `); - } + $$payload.out.push(`${$.escape(thing)}, `); + } - $$payload.out.push(``); + $$payload.out.push(``); + }); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/function-prop-no-getter/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/function-prop-no-getter/_expected/server/index.svelte.js index ce4f09ed1d..8dcec90232 100644 --- a/packages/svelte/tests/snapshot/samples/function-prop-no-getter/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/function-prop-no-getter/_expected/server/index.svelte.js @@ -1,23 +1,27 @@ import * as $ from 'svelte/internal/server'; export default function Function_prop_no_getter($$payload) { - let count = 0; + $$payload.child(({ $$payload }) => { + let count = 0; - function onmouseup() { - count += 2; - } + function onmouseup() { + count += 2; + } - const plusOne = (num) => num + 1; + const plusOne = (num) => num + 1; - Button($$payload, { - onmousedown: () => count += 1, - onmouseup, - onmouseenter: () => count = plusOne(count), + Button($$payload, { + onmousedown: () => count += 1, + onmouseup, + onmouseenter: () => count = plusOne(count), - children: ($$payload) => { - $$payload.out.push(`clicks: ${$.escape(count)}`); - }, + children: ($$payload) => { + $$payload.child(({ $$payload }) => { + $$payload.out.push(`clicks: ${$.escape(count)}`); + }); + }, - $$slots: { default: true } + $$slots: { default: true } + }); }); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/functional-templating/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/functional-templating/_expected/server/index.svelte.js index b1a0a5f9e6..cab4658382 100644 --- a/packages/svelte/tests/snapshot/samples/functional-templating/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/functional-templating/_expected/server/index.svelte.js @@ -1,5 +1,7 @@ import * as $ from 'svelte/internal/server'; export default function Functional_templating($$payload) { - $$payload.out.push(`child element
another child element
child element
another child element
0
${$.escape(location.href)}
`); - Child($$payload, { prop: encodeURIComponent('hello') }); - $$payload.out.push(``); + $$payload.child(({ $$payload }) => { + $$payload.out.push(`0
${$.escape(location.href)}
`); + Child($$payload, { prop: encodeURIComponent('hello') }); + $$payload.out.push(``); + }); } \ No newline at end of file diff --git a/packages/svelte/tests/snapshot/samples/skip-static-subtree/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/skip-static-subtree/_expected/server/index.svelte.js index bad475ec86..65c4341a5e 100644 --- a/packages/svelte/tests/snapshot/samples/skip-static-subtree/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/skip-static-subtree/_expected/server/index.svelte.js @@ -1,7 +1,9 @@ import * as $ from 'svelte/internal/server'; export default function Skip_static_subtree($$payload, $$props) { - let { title, content } = $$props; + $$payload.child(({ $$payload }) => { + let { title, content } = $$props; - $$payload.out.push(`we don't need to traverse these nodes
or
these
ones
${$.html(content)}these
trailing
nodes
can
be
completely
ignored
we don't need to traverse these nodes
or
these
ones
${$.html(content)}these
trailing
nodes
can
be
completely
ignored
${$.escape(text1())}${$.escape(text2())}
`); + $$payload.out.push(`${$.escape(text1())}${$.escape(text2())}
`); + }); } \ No newline at end of file