From b01af747e820e2b6649e370000eafc3dc5bd4a34 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 11 Apr 2024 10:45:20 +0100 Subject: [PATCH] fix: use keys for hmr modules (#11123) * fix: use keys for hmr modules * simplify * lint * ts --- .changeset/brave-gorillas-end.md | 5 ++++ .../3-transform/client/transform-client.js | 7 +++++- .../svelte/src/internal/client/dev/hmr.js | 23 ++++++++++++++----- 3 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 .changeset/brave-gorillas-end.md diff --git a/.changeset/brave-gorillas-end.md b/.changeset/brave-gorillas-end.md new file mode 100644 index 0000000000..8c86b5a09e --- /dev/null +++ b/.changeset/brave-gorillas-end.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: use keys for hmr modules diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index 2348307b51..c1c3353a83 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -427,7 +427,12 @@ export function client_component(source, analysis, options) { b.export_default( b.conditional( b.import_meta_hot(), - b.call('$.hmr', b.member(b.import_meta_hot(), b.id('data')), b.id(analysis.name)), + b.call( + '$.hmr', + b.member(b.import_meta_hot(), b.id('data')), + b.id(analysis.name), + b.member(b.member(b.literal('import'), b.literal('meta')), b.literal('url')) + ), b.id(analysis.name) ) ), diff --git a/packages/svelte/src/internal/client/dev/hmr.js b/packages/svelte/src/internal/client/dev/hmr.js index 9c42956976..6df951003d 100644 --- a/packages/svelte/src/internal/client/dev/hmr.js +++ b/packages/svelte/src/internal/client/dev/hmr.js @@ -5,15 +5,26 @@ import { get } from '../runtime.js'; /** * @template {(anchor: Comment, props: any) => any} Component - * @param {{ source: import("#client").Source; wrapper: Component; }} data + * @param {{ components: Map; wrapper: null | Component; }> }} hot_data + * @param {string} key * @param {Component} component */ -export function hmr(data, component) { - if (data.source) { - set(data.source, component); +export function hmr(hot_data, component, key) { + var components = (hot_data.components ??= new Map()); + var data = components.get(key); + + if (data === undefined) { + components.set( + key, + (data = { + source: source(component), + wrapper: null + }) + ); } else { - data.source = source(component); + set(data.source, component); } + const component_source = data.source; return (data.wrapper ??= /** @type {Component} */ ( (anchor, props) => { @@ -23,7 +34,7 @@ export function hmr(data, component) { let effect; block(() => { - const component = get(data.source); + const component = get(component_source); if (effect) { // @ts-ignore