From ab20acd47939246899f9219fb47b423e850efbad Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sun, 17 Mar 2019 17:42:07 -0400 Subject: [PATCH] set/unset parent component correctly in SSR - fixes #2182 --- src/internal/ssr.js | 43 ++++++++++++------- .../runtime/samples/context-api-b/Leaf.svelte | 8 ++++ .../samples/context-api-b/Nested.svelte | 10 +++++ test/runtime/samples/context-api-b/_config.js | 6 +++ .../runtime/samples/context-api-b/main.svelte | 13 ++++++ 5 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 test/runtime/samples/context-api-b/Leaf.svelte create mode 100644 test/runtime/samples/context-api-b/Nested.svelte create mode 100644 test/runtime/samples/context-api-b/_config.js create mode 100644 test/runtime/samples/context-api-b/main.svelte diff --git a/src/internal/ssr.js b/src/internal/ssr.js index 762c01a3c5..e6ed110a86 100644 --- a/src/internal/ssr.js +++ b/src/internal/ssr.js @@ -65,28 +65,39 @@ export function debug(file, line, column, values) { return ''; } -export function create_ssr_component($$render) { +let on_destroy; + +export function create_ssr_component(fn) { + function $$render(result, props, bindings, slots) { + const parent_component = current_component; + + const $$ = { + // these will be immediately discarded + on_mount: [], + before_render: [], + after_render: [], + + on_destroy, + context: new Map(parent_component ? parent_component.$$.context : []), + callbacks: blankObject() + }; + + set_current_component({ $$ }); + + const html = fn(result, props, bindings, slots); + + set_current_component(parent_component); + return html; + } + return { render: (props = {}, options = {}) => { - const parent_component = current_component; - - // TODO do we need on_ready, since on_mount, - // before_render and after_render don't run? - const $$ = { - on_mount: [], - on_destroy: [], - before_render: [], - after_render: [], - context: new Map(parent_component ? parent_component.$$.context : []), - callbacks: blankObject() - }; - - set_current_component({ $$ }); + on_destroy = []; const result = { head: '', css: new Set() }; const html = $$render(result, props, {}, options); - run_all($$.on_destroy); + run_all(on_destroy); return { html, diff --git a/test/runtime/samples/context-api-b/Leaf.svelte b/test/runtime/samples/context-api-b/Leaf.svelte new file mode 100644 index 0000000000..0e6e1f34a5 --- /dev/null +++ b/test/runtime/samples/context-api-b/Leaf.svelte @@ -0,0 +1,8 @@ + + +
{name}
\ No newline at end of file diff --git a/test/runtime/samples/context-api-b/Nested.svelte b/test/runtime/samples/context-api-b/Nested.svelte new file mode 100644 index 0000000000..d7f709133f --- /dev/null +++ b/test/runtime/samples/context-api-b/Nested.svelte @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/test/runtime/samples/context-api-b/_config.js b/test/runtime/samples/context-api-b/_config.js new file mode 100644 index 0000000000..70dff54c06 --- /dev/null +++ b/test/runtime/samples/context-api-b/_config.js @@ -0,0 +1,6 @@ +export default { + html: ` +
foo/bar
+
foo/baz
+ ` +}; \ No newline at end of file diff --git a/test/runtime/samples/context-api-b/main.svelte b/test/runtime/samples/context-api-b/main.svelte new file mode 100644 index 0000000000..ddad5267f7 --- /dev/null +++ b/test/runtime/samples/context-api-b/main.svelte @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file