From 529f9872bd1fc2bc6133bd6a258a2894089ced1c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 23 Feb 2024 16:40:59 -0500 Subject: [PATCH] move code --- .../client/dom/blocks/svelte-component.js | 35 +++++++++++++++++++ packages/svelte/src/internal/client/render.js | 33 ----------------- packages/svelte/src/internal/index.js | 1 + 3 files changed, 36 insertions(+), 33 deletions(-) create mode 100644 packages/svelte/src/internal/client/dom/blocks/svelte-component.js diff --git a/packages/svelte/src/internal/client/dom/blocks/svelte-component.js b/packages/svelte/src/internal/client/dom/blocks/svelte-component.js new file mode 100644 index 0000000000..ca484221b3 --- /dev/null +++ b/packages/svelte/src/internal/client/dom/blocks/svelte-component.js @@ -0,0 +1,35 @@ +import { hydrate_block_anchor } from '../../hydration.js'; +import { pause_effect, render_effect } from '../../reactivity/computations.js'; + +/** + * @template {Record} P + * @template {(node: Node, props: P) => void} C + * @param {Comment} anchor_node + * @param {() => C} component_fn + * @param {(component: C) => void} render_fn + * @returns {void} + */ +export function component(anchor_node, component_fn, render_fn) { + hydrate_block_anchor(anchor_node); + + /** @type {C | null} */ + let Component = null; + + /** @type {import('../../types.js').ComputationSignal | null} */ + let effect = null; + + render_effect(() => { + if (Component === (Component = component_fn() ?? null)) return; + + if (effect) { + const e = effect; + pause_effect(effect, () => { + if (e === effect) effect = null; + }); + } + + if (Component) { + effect = render_effect(() => render_fn(/** @type {C} */ (Component)), {}, true); + } + }); +} diff --git a/packages/svelte/src/internal/client/render.js b/packages/svelte/src/internal/client/render.js index 69553eae04..5b9d19a507 100644 --- a/packages/svelte/src/internal/client/render.js +++ b/packages/svelte/src/internal/client/render.js @@ -1522,39 +1522,6 @@ export function head(fn) { } } -/** - * @template {Record} P - * @template {(node: Node, props: P) => void} C - * @param {Comment} anchor_node - * @param {() => C} component_fn - * @param {(component: C) => void} render_fn - * @returns {void} - */ -export function component(anchor_node, component_fn, render_fn) { - hydrate_block_anchor(anchor_node); - - /** @type {C | null} */ - let Component = null; - - /** @type {import('./types.js').ComputationSignal | null} */ - let effect = null; - - render_effect(() => { - if (Component === (Component = component_fn() ?? null)) return; - - if (effect) { - const e = effect; - pause_effect(effect, () => { - if (e === effect) effect = null; - }); - } - - if (Component) { - effect = render_effect(() => render_fn(/** @type {C} */ (Component)), {}, true); - } - }); -} - /** * @param {Element | Text | Comment} anchor * @param {boolean} is_html diff --git a/packages/svelte/src/internal/index.js b/packages/svelte/src/internal/index.js index 4daa7920fd..b37ddf4880 100644 --- a/packages/svelte/src/internal/index.js +++ b/packages/svelte/src/internal/index.js @@ -24,6 +24,7 @@ export * from './client/dev/ownership.js'; export { await_block as await } from './client/dom/blocks/await.js'; export { if_block as if } from './client/dom/blocks/if.js'; export { key_block as key } from './client/dom/blocks/key.js'; +export { component } from './client/dom/blocks/svelte-component.js'; export { element } from './client/dom/blocks/svelte-element.js'; export * from './client/dom/blocks/each.js'; export * from './client/reactivity/computations.js';