From e6c712894aa8a4238b2815ff0717d2307ce815e0 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 24 Aug 2024 16:57:21 -0400 Subject: [PATCH] WIP --- .../3-transform/client/visitors/ClassBody.js | 6 +- .../client/visitors/VariableDeclaration.js | 2 +- .../src/internal/client/reactivity/sources.js | 27 ++++---- packages/svelte/tests/signals/test.ts | 68 +++++++++---------- .../_expected/client/index.svelte.js | 2 +- .../_expected/client/index.svelte.js | 4 +- .../_expected/client/index.svelte.js | 4 +- .../_expected/client/index.svelte.js | 2 +- .../_expected/client/index.svelte.js | 4 +- 9 files changed, 59 insertions(+), 60 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 5342e70aac..e9dd9fb390 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 @@ -113,17 +113,17 @@ export function ClassBody(node, context) { value = field.kind === 'state' ? b.call( - '$.source', + '$.state', should_proxy(init, context.state.scope) ? b.call('$.proxy', init) : init ) : field.kind === 'raw_state' - ? b.call('$.source', init) + ? b.call('$.state', init) : field.kind === 'derived_by' ? b.call('$.derived', init) : b.call('$.derived', b.thunk(init)); } else { // if no arguments, we know it's state as `$derived()` is a compile error - value = b.call('$.source'); + value = b.call('$.state'); } if (is_private) { 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 319c711855..97f778f052 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 @@ -126,7 +126,7 @@ export function VariableDeclaration(node, context) { value = b.call('$.proxy', value); } if (is_state_source(binding, context.state.analysis)) { - value = b.call('$.source', value); + value = b.call('$.state', value); } return value; }; diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index 90de029a65..73824168cb 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -34,28 +34,17 @@ let inspect_effects = new Set(); /** * @template V * @param {V} v - * @param {Reaction | null} [owner] * @returns {Source} */ /*#__NO_SIDE_EFFECTS__*/ -export function source(v, owner = current_reaction) { - var source = { +export function source(v) { + return { f: 0, // TODO ideally we could skip this altogether, but it causes type errors v, reactions: null, equals, version: 0 }; - - if (owner !== null && (owner.f & DERIVED) !== 0) { - if (derived_sources === null) { - set_derived_sources([source]); - } else { - derived_sources.push(source); - } - } - - return source; } /** @@ -64,7 +53,17 @@ export function source(v, owner = current_reaction) { * @returns {Source} */ export function state(v) { - return source(v); + var s = source(v); + + if (current_reaction !== null && (current_reaction.f & DERIVED) !== 0) { + if (derived_sources === null) { + set_derived_sources([s]); + } else { + derived_sources.push(s); + } + } + + return s; } /** diff --git a/packages/svelte/tests/signals/test.ts b/packages/svelte/tests/signals/test.ts index 17695eaec4..9935291c0a 100644 --- a/packages/svelte/tests/signals/test.ts +++ b/packages/svelte/tests/signals/test.ts @@ -7,7 +7,7 @@ import { render_effect, user_effect } from '../../src/internal/client/reactivity/effects'; -import { source, set } from '../../src/internal/client/reactivity/sources'; +import { state, set } from '../../src/internal/client/reactivity/sources'; import type { Derived, Value } from '../../src/internal/client/types'; import { proxy } from '../../src/internal/client/proxy'; import { derived } from '../../src/internal/client/reactivity/deriveds'; @@ -53,7 +53,7 @@ describe('signals', () => { test('effect with state and derived in it', () => { const log: string[] = []; - let count = source(0); + let count = state(0); let double = derived(() => $.get(count) * 2); effect(() => { log.push(`${$.get(count)}:${$.get(double)}`); @@ -70,7 +70,7 @@ describe('signals', () => { test('multiple effects with state and derived in it#1', () => { const log: string[] = []; - let count = source(0); + let count = state(0); let double = derived(() => $.get(count) * 2); effect(() => { @@ -91,7 +91,7 @@ describe('signals', () => { test('multiple effects with state and derived in it#2', () => { const log: string[] = []; - let count = source(0); + let count = state(0); let double = derived(() => $.get(count) * 2); effect(() => { @@ -112,7 +112,7 @@ describe('signals', () => { test('derived from state', () => { const log: number[] = []; - let count = source(0); + let count = state(0); let double = derived(() => $.get(count) * 2); effect(() => { @@ -130,7 +130,7 @@ describe('signals', () => { test('derived from derived', () => { const log: number[] = []; - let count = source(0); + let count = state(0); let double = derived(() => $.get(count) * 2); let quadruple = derived(() => $.get(double) * 2); @@ -149,7 +149,7 @@ describe('signals', () => { test('state reset', () => { const log: number[] = []; - let count = source(0); + let count = state(0); let double = derived(() => $.get(count) * 2); effect(() => { @@ -185,8 +185,8 @@ describe('signals', () => { const fib = (n: number): number => (n < 2 ? 1 : fib(n - 1) + fib(n - 2)); const hard = (n: number, l: string) => n + fib(16); - const A = source(0); - const B = source(0); + const A = state(0); + const B = state(0); const C = derived(() => ($.get(A) % 2) + ($.get(B) % 2)); const D = derived(() => numbers.map((i) => i + ($.get(A) % 2) - ($.get(B) % 2))); const E = derived(() => hard($.get(C) + $.get(A) + $.get(D)[0]!, 'E')); @@ -225,7 +225,7 @@ describe('signals', () => { test('effects correctly handle unowned derived values that do not change', () => { const log: number[] = []; - let count = source(0); + let count = state(0); const read = () => { const x = derived(() => ({ count: $.get(count) })); return $.get(x); @@ -253,8 +253,8 @@ describe('signals', () => { return () => { const nested: Derived[] = []; - const a = source(0); - const b = source(0); + const a = state(0); + const b = state(0); const c = derived(() => { const a_2 = derived(() => $.get(a) + '!'); const b_2 = derived(() => $.get(b) + '?'); @@ -282,7 +282,7 @@ describe('signals', () => { }); // outside of test function so that they are unowned signals - let count = source(0); + let count = state(0); let calc = derived(() => { if ($.get(count) >= 2) { return 'limit'; @@ -337,7 +337,7 @@ describe('signals', () => { }; }); - let some_state = source({}); + let some_state = state({}); let some_deps = derived(() => { return [$.get(some_state)]; }); @@ -362,7 +362,7 @@ describe('signals', () => { test('schedules rerun when writing to signal before reading it', (runes) => { if (!runes) return () => {}; - const value = source({ count: 0 }); + const value = state({ count: 0 }); user_effect(() => { set(value, { count: 0 }); $.get(value); @@ -402,7 +402,7 @@ describe('signals', () => { }); test('effect teardown is removed on re-run', () => { - const count = source(0); + const count = state(0); let first = true; let teardown = 0; @@ -430,8 +430,8 @@ describe('signals', () => { let outer: Value; const destroy = effect_root(() => { - inner = source(0); - outer = source(0); + inner = state(0); + outer = state(0); render_effect(() => { a = derived(() => { @@ -472,12 +472,12 @@ describe('signals', () => { test('owned deriveds correctly cleanup when no longer connected to graph', () => { let a: Derived; - let state = source(0); + let s = state(0); const destroy = effect_root(() => { render_effect(() => { a = derived(() => { - $.get(state); + $.get(s); }); $.get(a); }); @@ -486,16 +486,16 @@ describe('signals', () => { return () => { flushSync(); assert.equal(a?.deps?.length, 1); - assert.equal(state?.reactions?.length, 1); + assert.equal(s?.reactions?.length, 1); destroy(); assert.equal(a?.deps?.length, 1); - assert.equal(state?.reactions, null); + assert.equal(s?.reactions, null); }; }); test('deriveds update upon reconnection #1', () => { - let a = source(false); - let b = source(false); + let a = state(false); + let b = state(false); let c = derived(() => $.get(a)); let d = derived(() => $.get(c)); @@ -536,9 +536,9 @@ describe('signals', () => { }); test('deriveds update upon reconnection #2', () => { - let a = source(false); - let b = source(false); - let c = source(false); + let a = state(false); + let b = state(false); + let c = state(false); let d = derived(() => $.get(a) || $.get(b)); @@ -585,8 +585,8 @@ describe('signals', () => { }); test('deriveds update upon reconnection #3', () => { - let a = source(false); - let b = source(false); + let a = state(false); + let b = state(false); let c = derived(() => $.get(a) || $.get(b)); let d = derived(() => $.get(c)); @@ -619,7 +619,7 @@ describe('signals', () => { }); test('unowned deriveds are not added as reactions', () => { - var count = source(0); + var count = state(0); function create_derived() { return derived(() => $.get(count) * 2); @@ -644,7 +644,7 @@ describe('signals', () => { }); test('unowned deriveds are correctly connected and disconnected from the graph', () => { - var count = source(0); + var count = state(0); function create_derived() { return derived(() => $.get(count) * 2); @@ -699,7 +699,7 @@ describe('signals', () => { test('deriveds cannot depend on state they own', () => { return () => { const d = derived(() => { - const s = source(0); + const s = state(0); return $.get(s); }); @@ -707,7 +707,7 @@ describe('signals', () => { }; }); - test('proxy version source does not trigger self-dependency guard', () => { + test('proxy version state does not trigger self-dependency guard', () => { return () => { const s = proxy({ a: { b: 1 } }); const d = derived(() => snapshot(s)); @@ -716,7 +716,7 @@ describe('signals', () => { }; }); - test('set version source does not trigger self-dependency guard', () => { + test('set version state does not trigger self-dependency guard', () => { return () => { const set = new SvelteSet(); const d = derived(() => set.has('test')); diff --git a/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/client/index.svelte.js index c6a894ea71..58ccf7ed7f 100644 --- a/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/client/index.svelte.js @@ -13,7 +13,7 @@ export default function Bind_component_snippet($$anchor) { $.append($$anchor, text); }; - let value = $.source(''); + let value = $.state(''); const _snippet = snippet; var fragment = root(); var node = $.first_child(fragment); diff --git a/packages/svelte/tests/snapshot/samples/class-state-field-constructor-assignment/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/class-state-field-constructor-assignment/_expected/client/index.svelte.js index 197b9d1e73..399fa19b62 100644 --- a/packages/svelte/tests/snapshot/samples/class-state-field-constructor-assignment/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/class-state-field-constructor-assignment/_expected/client/index.svelte.js @@ -5,7 +5,7 @@ export default function Class_state_field_constructor_assignment($$anchor, $$pro $.push($$props, true); class Foo { - #a = $.source(); + #a = $.state(); get a() { return $.get(this.#a); @@ -15,7 +15,7 @@ export default function Class_state_field_constructor_assignment($$anchor, $$pro $.set(this.#a, $.proxy(value)); } - #b = $.source(); + #b = $.state(); constructor() { this.a = 1; diff --git a/packages/svelte/tests/snapshot/samples/destructured-assignments/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/destructured-assignments/_expected/client/index.svelte.js index a10f4ca1a5..dbda825c4d 100644 --- a/packages/svelte/tests/snapshot/samples/destructured-assignments/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/destructured-assignments/_expected/client/index.svelte.js @@ -1,8 +1,8 @@ /* index.svelte.js generated by Svelte VERSION */ import * as $ from "svelte/internal/client"; -let a = $.source(1); -let b = $.source(2); +let a = $.state(1); +let b = $.state(2); let c = 3; let d = 4; diff --git a/packages/svelte/tests/snapshot/samples/function-prop-no-getter/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/function-prop-no-getter/_expected/client/index.svelte.js index af1f6c4634..95d1c72017 100644 --- a/packages/svelte/tests/snapshot/samples/function-prop-no-getter/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/function-prop-no-getter/_expected/client/index.svelte.js @@ -2,7 +2,7 @@ import "svelte/internal/disclose-version"; import * as $ from "svelte/internal/client"; export default function Function_prop_no_getter($$anchor) { - let count = $.source(0); + let count = $.state(0); function onmouseup() { $.set(count, $.get(count) + 2); diff --git a/packages/svelte/tests/snapshot/samples/state-proxy-literal/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/state-proxy-literal/_expected/client/index.svelte.js index bfd57166d8..c24023c8a4 100644 --- a/packages/svelte/tests/snapshot/samples/state-proxy-literal/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/state-proxy-literal/_expected/client/index.svelte.js @@ -11,8 +11,8 @@ function reset(_, str, tpl) { var root = $.template(` `, 1); export default function State_proxy_literal($$anchor) { - let str = $.source(''); - let tpl = $.source(``); + let str = $.state(''); + let tpl = $.state(``); var fragment = root(); var input = $.first_child(fragment);