From 82d45a203e580c783c7ba3d0771a2a4d3f2e3f70 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Tue, 21 Jan 2025 09:44:42 +0100 Subject: [PATCH] fix: create `assignable_proxy` utils to prevent declaring an external const --- .../3-transform/client/visitors/ClassBody.js | 19 +++---------------- .../client/visitors/VariableDeclaration.js | 13 +++++-------- packages/svelte/src/internal/client/index.js | 2 +- packages/svelte/src/internal/client/proxy.js | 13 ++++++++++++- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/ClassBody.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/ClassBody.js index 1ade350898..8738c397b7 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/ClassBody.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/ClassBody.js @@ -125,24 +125,11 @@ export function ClassBody(node, context) { let proxied = should_proxy(init, context.state.scope); - if (field.kind === 'state' && proxied && options != null) { - let generated = 'state_options'; - let i = 0; - while (private_ids.includes(generated)) { - generated = `state_options_${i++}`; - } - private_ids.push(generated); - body.push(b.prop_def(b.private_id(generated), options)); - options = b.member(b.this, `#${generated}`); - } - value = field.kind === 'state' - ? b.call( - '$.state', - should_proxy(init, context.state.scope) ? b.call('$.proxy', init, options) : init, - options - ) + ? should_proxy(init, context.state.scope) + ? b.call('$.assignable_proxy', init, options) + : b.call('$.state', init, options) : field.kind === 'raw_state' ? b.call('$.state', init) : field.kind === 'derived_by' diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js index 6c266fde21..6897f554e2 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js @@ -127,15 +127,12 @@ export function VariableDeclaration(node, context) { context.state.scope.get(id.name) ); const proxied = rune === '$state' && should_proxy(value, context.state.scope); - if (proxied) { - if (options != null) { - const generated = context.state.scope.generate('state_options'); - declarations.push(b.declarator(generated, options)); - options = b.id(generated); - } + const is_state = is_state_source(binding, context.state.analysis); + if (proxied && is_state) { + value = b.call('$.assignable_proxy', value, options); + } else if (proxied) { value = b.call('$.proxy', value, options); - } - if (is_state_source(binding, context.state.analysis)) { + } else if (is_state) { value = b.call('$.state', value, options); } return value; diff --git a/packages/svelte/src/internal/client/index.js b/packages/svelte/src/internal/client/index.js index 0251b8e47b..8f97f58095 100644 --- a/packages/svelte/src/internal/client/index.js +++ b/packages/svelte/src/internal/client/index.js @@ -152,7 +152,7 @@ export { } from './runtime.js'; export { validate_binding, validate_each_keys } from './validate.js'; export { raf } from './timing.js'; -export { proxy } from './proxy.js'; +export { proxy, assignable_proxy } from './proxy.js'; export { create_custom_element } from './dom/elements/custom-element.js'; export { child, diff --git a/packages/svelte/src/internal/client/proxy.js b/packages/svelte/src/internal/client/proxy.js index 9a2e88cc85..4acc52c943 100644 --- a/packages/svelte/src/internal/client/proxy.js +++ b/packages/svelte/src/internal/client/proxy.js @@ -9,7 +9,7 @@ import { object_prototype } from '../shared/utils.js'; import { check_ownership, widen_ownership } from './dev/ownership.js'; -import { source, set } from './reactivity/sources.js'; +import { source, set, state } from './reactivity/sources.js'; import { STATE_SYMBOL, STATE_SYMBOL_METADATA } from './constants.js'; import { UNINITIALIZED } from '../../constants.js'; import * as e from './errors.js'; @@ -318,6 +318,17 @@ export function proxy(value, options, parent = null, prev) { }); } +/** + * @template T + * @param {T} value + * @param {ValueOptions} [options] + * @returns {Source} + */ + +export function assignable_proxy(value, options) { + return state(proxy(value, options), options); +} + /** * @param {Source} signal * @param {1 | -1} [d]