From 41fa2a4c46f502556d91e65e9d2f0684d0b731fb Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 30 Oct 2024 20:23:48 +0000 Subject: [PATCH 1/5] fix: ensure onMount correctly fires when used externally --- .changeset/early-hounds-float.md | 5 +++++ packages/svelte/src/index-client.js | 12 ++++-------- .../samples/onmount-external/_config.js | 7 +++++++ .../samples/onmount-external/main.svelte | 5 +++++ .../samples/onmount-external/myClass.js | 7 +++++++ 5 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 .changeset/early-hounds-float.md create mode 100644 packages/svelte/tests/runtime-legacy/samples/onmount-external/_config.js create mode 100644 packages/svelte/tests/runtime-legacy/samples/onmount-external/main.svelte create mode 100644 packages/svelte/tests/runtime-legacy/samples/onmount-external/myClass.js diff --git a/.changeset/early-hounds-float.md b/.changeset/early-hounds-float.md new file mode 100644 index 000000000000..b01b037f4f33 --- /dev/null +++ b/.changeset/early-hounds-float.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure onMount correctly fires when used externally diff --git a/packages/svelte/src/index-client.js b/packages/svelte/src/index-client.js index ff477595a191..a04a70550005 100644 --- a/packages/svelte/src/index-client.js +++ b/packages/svelte/src/index-client.js @@ -25,14 +25,10 @@ export function onMount(fn) { lifecycle_outside_component('onMount'); } - if (component_context.l !== null) { - init_update_callbacks(component_context).m.push(fn); - } else { - user_effect(() => { - const cleanup = untrack(fn); - if (typeof cleanup === 'function') return /** @type {() => void} */ (cleanup); - }); - } + user_effect(() => { + const cleanup = untrack(fn); + if (typeof cleanup === 'function') return /** @type {() => void} */ (cleanup); + }); } /** diff --git a/packages/svelte/tests/runtime-legacy/samples/onmount-external/_config.js b/packages/svelte/tests/runtime-legacy/samples/onmount-external/_config.js new file mode 100644 index 000000000000..6cf976bd483e --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/onmount-external/_config.js @@ -0,0 +1,7 @@ +import { test } from '../../test'; + +export default test({ + async test({ assert, logs }) { + assert.deepEqual(logs, ['mounted']); + } +}); diff --git a/packages/svelte/tests/runtime-legacy/samples/onmount-external/main.svelte b/packages/svelte/tests/runtime-legacy/samples/onmount-external/main.svelte new file mode 100644 index 000000000000..89ffe02e89ca --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/onmount-external/main.svelte @@ -0,0 +1,5 @@ + diff --git a/packages/svelte/tests/runtime-legacy/samples/onmount-external/myClass.js b/packages/svelte/tests/runtime-legacy/samples/onmount-external/myClass.js new file mode 100644 index 000000000000..0c3566b2b4ce --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/onmount-external/myClass.js @@ -0,0 +1,7 @@ +import { onMount } from 'svelte'; + +export class MyClass { + constructor() { + onMount(() => console.log('mounted')); + } +} From 66064fcb310d6a7138b4321c113174d536db2658 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 30 Oct 2024 20:45:40 +0000 Subject: [PATCH 2/5] fix root context --- packages/svelte/src/internal/client/render.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/internal/client/render.js b/packages/svelte/src/internal/client/render.js index 6e86968c7aff..d5aad00d745d 100644 --- a/packages/svelte/src/internal/client/render.js +++ b/packages/svelte/src/internal/client/render.js @@ -208,8 +208,9 @@ function _mount(Component, { target, anchor, props = {}, events, context, intro var anchor_node = anchor ?? target.appendChild(create_text()); branch(() => { + push({}); + if (context) { - push({}); var ctx = /** @type {ComponentContext} */ (component_context); ctx.c = context; } @@ -232,9 +233,7 @@ function _mount(Component, { target, anchor, props = {}, events, context, intro /** @type {Effect} */ (active_effect).nodes_end = hydrate_node; } - if (context) { - pop(); - } + pop(); }); return () => { From d38c1ece63e76e4b92b5eb836693639440a3a99d Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 30 Oct 2024 20:50:24 +0000 Subject: [PATCH 3/5] fix root context --- .../samples/onmount-external/main.svelte | 12 ++++++++++-- .../samples/onmount-external/myClass.js | 7 ------- 2 files changed, 10 insertions(+), 9 deletions(-) delete mode 100644 packages/svelte/tests/runtime-legacy/samples/onmount-external/myClass.js diff --git a/packages/svelte/tests/runtime-legacy/samples/onmount-external/main.svelte b/packages/svelte/tests/runtime-legacy/samples/onmount-external/main.svelte index 89ffe02e89ca..e2e7dad8dc23 100644 --- a/packages/svelte/tests/runtime-legacy/samples/onmount-external/main.svelte +++ b/packages/svelte/tests/runtime-legacy/samples/onmount-external/main.svelte @@ -1,5 +1,13 @@ + + diff --git a/packages/svelte/tests/runtime-legacy/samples/onmount-external/myClass.js b/packages/svelte/tests/runtime-legacy/samples/onmount-external/myClass.js deleted file mode 100644 index 0c3566b2b4ce..000000000000 --- a/packages/svelte/tests/runtime-legacy/samples/onmount-external/myClass.js +++ /dev/null @@ -1,7 +0,0 @@ -import { onMount } from 'svelte'; - -export class MyClass { - constructor() { - onMount(() => console.log('mounted')); - } -} From cf26726a54d9e3467da7173f0e586dee89339c3d Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 30 Oct 2024 20:57:26 +0000 Subject: [PATCH 4/5] revert --- .changeset/early-hounds-float.md | 2 +- packages/svelte/src/index-client.js | 12 ++++++++---- packages/svelte/src/internal/client/render.js | 7 ++++--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/.changeset/early-hounds-float.md b/.changeset/early-hounds-float.md index b01b037f4f33..0a708c59e4cf 100644 --- a/.changeset/early-hounds-float.md +++ b/.changeset/early-hounds-float.md @@ -2,4 +2,4 @@ 'svelte': patch --- -fix: ensure onMount correctly fires when used externally +fix: ensure onMount correctly fires when new expressions are used diff --git a/packages/svelte/src/index-client.js b/packages/svelte/src/index-client.js index a04a70550005..ff477595a191 100644 --- a/packages/svelte/src/index-client.js +++ b/packages/svelte/src/index-client.js @@ -25,10 +25,14 @@ export function onMount(fn) { lifecycle_outside_component('onMount'); } - user_effect(() => { - const cleanup = untrack(fn); - if (typeof cleanup === 'function') return /** @type {() => void} */ (cleanup); - }); + if (component_context.l !== null) { + init_update_callbacks(component_context).m.push(fn); + } else { + user_effect(() => { + const cleanup = untrack(fn); + if (typeof cleanup === 'function') return /** @type {() => void} */ (cleanup); + }); + } } /** diff --git a/packages/svelte/src/internal/client/render.js b/packages/svelte/src/internal/client/render.js index d5aad00d745d..6e86968c7aff 100644 --- a/packages/svelte/src/internal/client/render.js +++ b/packages/svelte/src/internal/client/render.js @@ -208,9 +208,8 @@ function _mount(Component, { target, anchor, props = {}, events, context, intro var anchor_node = anchor ?? target.appendChild(create_text()); branch(() => { - push({}); - if (context) { + push({}); var ctx = /** @type {ComponentContext} */ (component_context); ctx.c = context; } @@ -233,7 +232,9 @@ function _mount(Component, { target, anchor, props = {}, events, context, intro /** @type {Effect} */ (active_effect).nodes_end = hydrate_node; } - pop(); + if (context) { + pop(); + } }); return () => { From e83d037dc0bb81c65252c06f6ca07b89b97530cb Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 30 Oct 2024 20:58:16 +0000 Subject: [PATCH 5/5] alternative fix --- .../src/compiler/phases/2-analyze/visitors/NewExpression.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/NewExpression.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/NewExpression.js index 6b393ae9b91b..bcb2400932c2 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/NewExpression.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/NewExpression.js @@ -11,5 +11,7 @@ export function NewExpression(node, context) { w.perf_avoid_inline_class(node); } + context.state.analysis.needs_context = true; + context.next(); }