From fd023fbff2fabc73d04d12fca8b071ff3c4fd519 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Thu, 22 Jan 2026 16:26:25 +0100 Subject: [PATCH 1/4] feat: add `beforeMount` callback to `MountOptions` --- .changeset/cyan-kings-wait.md | 5 +++++ packages/svelte/src/index.d.ts | 4 ++++ packages/svelte/src/internal/client/render.js | 7 ++++++- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 .changeset/cyan-kings-wait.md diff --git a/.changeset/cyan-kings-wait.md b/.changeset/cyan-kings-wait.md new file mode 100644 index 0000000000..8381b6305c --- /dev/null +++ b/.changeset/cyan-kings-wait.md @@ -0,0 +1,5 @@ +--- +'svelte': minor +--- + +feat: add `beforeMount` callback to `MountOptions` diff --git a/packages/svelte/src/index.d.ts b/packages/svelte/src/index.d.ts index a1782f5b61..7fd64c15c8 100644 --- a/packages/svelte/src/index.d.ts +++ b/packages/svelte/src/index.d.ts @@ -333,6 +333,10 @@ export type MountOptions = Record * Can be accessed via `getContext()` at the component level. */ context?: Map; + /** + * A function invoked before the component is mounted but after the component context has been initialized. + */ + beforeMount?: () => void; /** * Whether or not to play transitions on initial render. * @default true diff --git a/packages/svelte/src/internal/client/render.js b/packages/svelte/src/internal/client/render.js index c76f0b1ce7..6d7046a111 100644 --- a/packages/svelte/src/internal/client/render.js +++ b/packages/svelte/src/internal/client/render.js @@ -158,7 +158,10 @@ const document_listeners = new Map(); * @param {MountOptions} options * @returns {Exports} */ -function _mount(Component, { target, anchor, props = {}, events, context, intro = true }) { +function _mount( + Component, + { target, anchor, props = {}, beforeMount, events, context, intro = true } +) { init_operations(); /** @type {Set} */ @@ -214,6 +217,8 @@ function _mount(Component, { target, anchor, props = {}, events, context, intro ctx.c = context; } + beforeMount?.(); + if (events) { // We can't spread the object or else we'd lose the state proxy stuff, if it is one /** @type {any} */ (props).$$events = events; From 659572ecb2bf246098fef966a0edffb1976b7a41 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Thu, 22 Jan 2026 16:54:40 +0100 Subject: [PATCH 2/4] fix: push if before mount exists --- packages/svelte/src/internal/client/render.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/internal/client/render.js b/packages/svelte/src/internal/client/render.js index 6d7046a111..cdb35da846 100644 --- a/packages/svelte/src/internal/client/render.js +++ b/packages/svelte/src/internal/client/render.js @@ -211,10 +211,12 @@ function _mount( pending: () => {} }, (anchor_node) => { - if (context) { + if (context || beforeMount) { push({}); - var ctx = /** @type {ComponentContext} */ (component_context); - ctx.c = context; + if (context) { + var ctx = /** @type {ComponentContext} */ (component_context); + ctx.c = context; + } } beforeMount?.(); From 283ab8dd4aa0f73930109d3107c70987814343d7 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Thu, 22 Jan 2026 16:57:36 +0100 Subject: [PATCH 3/4] fix: generate types --- packages/svelte/types/index.d.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index 9e569126bb..6a7fbf91f5 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -332,6 +332,10 @@ declare module 'svelte' { * Can be accessed via `getContext()` at the component level. */ context?: Map; + /** + * A function invoked before the component is mounted but after the component context has been initialized. + */ + beforeMount?: () => void; /** * Whether or not to play transitions on initial render. * @default true From 642f967c967994dbb7e22b8178e8a5d5566d63a6 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Thu, 22 Jan 2026 17:01:04 +0100 Subject: [PATCH 4/4] fix: `pop` if `beforeMount` --- packages/svelte/src/internal/client/render.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/src/internal/client/render.js b/packages/svelte/src/internal/client/render.js index cdb35da846..2472bc3025 100644 --- a/packages/svelte/src/internal/client/render.js +++ b/packages/svelte/src/internal/client/render.js @@ -248,7 +248,7 @@ function _mount( } } - if (context) { + if (context || beforeMount) { pop(); } }