From 8638d22ac7d72769c68744a6f9a814fb9a6846e4 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 25 Oct 2025 23:00:00 -0400 Subject: [PATCH] WIP --- .../client/visitors/shared/component.js | 25 +++++++++++-------- .../src/internal/client/dom/blocks/async.js | 2 +- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js index 6d5ae926bd..55cff6cc37 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js @@ -16,12 +16,12 @@ import { determine_slot } from '../../../../../utils/slot.js'; * @returns {Statement} */ export function build_component(node, component_name, context) { - /** - * @type {Expression} - */ + /** @type {Expression} */ const anchor = context.state.node; + /** @type {Array} */ const props_and_spreads = []; + /** @type {Array<() => void>} */ const delayed_props = []; @@ -128,13 +128,16 @@ export function build_component(node, component_name, context) { (events[attribute.name] ||= []).push(handler); } else if (attribute.type === 'SpreadAttribute') { - const expression = /** @type {Expression} */ (context.visit(attribute)); + const expression = memoizer.add( + /** @type {Expression} */ (context.visit(attribute)), + attribute.metadata.expression + ); if (attribute.metadata.expression.has_state || attribute.metadata.expression.has_await) { props_and_spreads.push( b.thunk( attribute.metadata.expression.has_await || attribute.metadata.expression.has_call - ? b.call('$.get', memoizer.add(expression, attribute.metadata.expression)) + ? b.call('$.get', expression) : expression ) ); @@ -147,10 +150,10 @@ export function build_component(node, component_name, context) { b.init( attribute.name, build_attribute_value(attribute.value, context, (value, metadata) => { + const memoized = memoizer.add(value, metadata); + // TODO put the derived in the local block - return metadata.has_call || metadata.has_await - ? b.call('$.get', memoizer.add(value, metadata)) - : value; + return metadata.has_call || metadata.has_await ? b.call('$.get', memoized) : memoized; }).value ) ); @@ -184,9 +187,9 @@ export function build_component(node, component_name, context) { ); }); - return should_wrap_in_derived - ? b.call('$.get', memoizer.add(value, metadata, true)) - : value; + const memoized = memoizer.add(value, metadata, should_wrap_in_derived); + + return should_wrap_in_derived ? b.call('$.get', memoized) : memoized; } ); diff --git a/packages/svelte/src/internal/client/dom/blocks/async.js b/packages/svelte/src/internal/client/dom/blocks/async.js index e8412e6cab..db4ebc5934 100644 --- a/packages/svelte/src/internal/client/dom/blocks/async.js +++ b/packages/svelte/src/internal/client/dom/blocks/async.js @@ -18,7 +18,7 @@ import { get_boundary } from './boundary.js'; * @param {Array<() => Promise>} expressions * @param {(anchor: TemplateNode, ...deriveds: Value[]) => void} fn */ -export function async(node, blockers, expressions, fn) { +export function async(node, blockers, expressions = [], fn) { var boundary = get_boundary(); var batch = /** @type {Batch} */ (current_batch); var blocking = !boundary.is_pending();