pull/13013/head
Rich Harris 2 years ago
parent e5cbcf190c
commit e6c712894a

@ -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) {

@ -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;
};

@ -34,28 +34,17 @@ let inspect_effects = new Set();
/**
* @template V
* @param {V} v
* @param {Reaction | null} [owner]
* @returns {Source<V>}
*/
/*#__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<V>}
*/
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;
}
/**

@ -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<string>[] = [];
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<string | number>;
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<unknown>;
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'));

@ -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);

@ -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;

@ -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;

@ -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);

@ -11,8 +11,8 @@ function reset(_, str, tpl) {
var root = $.template(`<input> <input> <button>reset</button>`, 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);

Loading…
Cancel
Save