@solidjs/signals 0.4.4 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dev.js +72 -52
- package/dist/node.cjs +348 -328
- package/dist/prod.js +348 -328
- package/dist/types/core/core.d.ts +3 -2
- package/dist/types/core/scheduler.d.ts +2 -2
- package/package.json +1 -1
package/dist/dev.js
CHANGED
|
@@ -39,7 +39,7 @@ function incrementClock() {
|
|
|
39
39
|
clock++;
|
|
40
40
|
}
|
|
41
41
|
var ActiveTransition = null;
|
|
42
|
-
var
|
|
42
|
+
var Unobserved = [];
|
|
43
43
|
var scheduled = false;
|
|
44
44
|
function schedule() {
|
|
45
45
|
if (scheduled)
|
|
@@ -49,12 +49,12 @@ function schedule() {
|
|
|
49
49
|
queueMicrotask(flush);
|
|
50
50
|
}
|
|
51
51
|
function notifyUnobserved() {
|
|
52
|
-
for (let i = 0; i <
|
|
53
|
-
const source =
|
|
52
|
+
for (let i = 0; i < Unobserved.length; i++) {
|
|
53
|
+
const source = Unobserved[i];
|
|
54
54
|
if (!source._observers || !source._observers.length)
|
|
55
|
-
|
|
55
|
+
Unobserved[i]._unobserved?.();
|
|
56
56
|
}
|
|
57
|
-
|
|
57
|
+
Unobserved = [];
|
|
58
58
|
}
|
|
59
59
|
var pureQueue = [];
|
|
60
60
|
var Queue = class {
|
|
@@ -97,7 +97,7 @@ var Queue = class {
|
|
|
97
97
|
this.run(EFFECT_USER);
|
|
98
98
|
} finally {
|
|
99
99
|
this._running = false;
|
|
100
|
-
|
|
100
|
+
Unobserved.length && notifyUnobserved();
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
addChild(child) {
|
|
@@ -285,29 +285,37 @@ function cloneGraph(node) {
|
|
|
285
285
|
return node._transition._sources.get(node);
|
|
286
286
|
}
|
|
287
287
|
const clone = Object.create(Object.getPrototypeOf(node));
|
|
288
|
-
Object.assign(clone, node, {
|
|
288
|
+
Object.assign(clone, node, {
|
|
289
|
+
_disposal: null,
|
|
290
|
+
_nextSibling: null,
|
|
291
|
+
_observers: null,
|
|
292
|
+
_sources: node._sources ? [...node._sources] : null,
|
|
293
|
+
_cloned: node
|
|
294
|
+
});
|
|
289
295
|
ActiveTransition._sources.set(node, clone);
|
|
290
296
|
node._transition = ActiveTransition;
|
|
297
|
+
if (node._sources) {
|
|
298
|
+
for (let i = 0; i < node._sources.length; i++)
|
|
299
|
+
node._sources[i]._observers.push(clone);
|
|
300
|
+
}
|
|
291
301
|
if (node._observers) {
|
|
302
|
+
clone._observers = [];
|
|
292
303
|
for (let i = 0, length = node._observers.length; i < length; i++) {
|
|
293
|
-
|
|
294
|
-
node._observers.push(cloneGraph(o));
|
|
304
|
+
!node._observers[i]._cloned && clone._observers.push(cloneGraph(node._observers[i]));
|
|
295
305
|
}
|
|
296
306
|
}
|
|
297
307
|
return clone;
|
|
298
308
|
}
|
|
299
|
-
function
|
|
309
|
+
function replaceSourceObservers(node, transition2) {
|
|
300
310
|
let source;
|
|
311
|
+
let transitionSource;
|
|
301
312
|
let swap;
|
|
302
|
-
for (let i =
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
}
|
|
309
|
-
if (!source._observers.length)
|
|
310
|
-
unobserved.push(source);
|
|
313
|
+
for (let i = 0; i < node._sources.length; i++) {
|
|
314
|
+
transitionSource = transition2._sources.get(node._sources[i]);
|
|
315
|
+
source = transitionSource || node._sources[i];
|
|
316
|
+
if (source._observers && (swap = source._observers.indexOf(node)) !== -1) {
|
|
317
|
+
source._observers[swap] = transitionSource ? node._cloned : source._observers[source._observers.length - 1];
|
|
318
|
+
!transitionSource && source._observers.pop();
|
|
311
319
|
}
|
|
312
320
|
}
|
|
313
321
|
}
|
|
@@ -375,7 +383,7 @@ function finishTransition(transition2) {
|
|
|
375
383
|
if (source === clone || source._transition !== transition2)
|
|
376
384
|
continue;
|
|
377
385
|
if (clone._sources)
|
|
378
|
-
|
|
386
|
+
replaceSourceObservers(clone, transition2);
|
|
379
387
|
source.dispose(false);
|
|
380
388
|
source.emptyDisposal();
|
|
381
389
|
Object.assign(source, clone);
|
|
@@ -386,11 +394,11 @@ function finishTransition(transition2) {
|
|
|
386
394
|
globalQueue._queues[1].push.apply(globalQueue._queues[1], transition2._queues[1]);
|
|
387
395
|
resolveQueues(transition2._children);
|
|
388
396
|
transition2._done = true;
|
|
389
|
-
globalQueue.flush();
|
|
390
397
|
for (const reset of transition2._optimistic) {
|
|
391
398
|
delete reset._transition;
|
|
392
399
|
reset();
|
|
393
400
|
}
|
|
401
|
+
globalQueue.flush();
|
|
394
402
|
}
|
|
395
403
|
|
|
396
404
|
// src/core/owner.ts
|
|
@@ -597,8 +605,8 @@ var Computation = class extends Owner {
|
|
|
597
605
|
* Automatically re-executes the surrounding computation when the value changes
|
|
598
606
|
*/
|
|
599
607
|
read() {
|
|
600
|
-
if (ActiveTransition && ActiveTransition._sources.has(this)) {
|
|
601
|
-
const clone = ActiveTransition._sources.get(this);
|
|
608
|
+
if (ActiveTransition && (ActiveTransition._sources.has(this) || !this._cloned && this._stateFlags & UNINITIALIZED_BIT)) {
|
|
609
|
+
const clone = ActiveTransition._sources.get(this) || cloneGraph(this);
|
|
602
610
|
if (clone !== this)
|
|
603
611
|
return clone.read();
|
|
604
612
|
}
|
|
@@ -618,8 +626,8 @@ var Computation = class extends Owner {
|
|
|
618
626
|
* before continuing
|
|
619
627
|
*/
|
|
620
628
|
wait() {
|
|
621
|
-
if (ActiveTransition && ActiveTransition._sources.has(this)) {
|
|
622
|
-
const clone = ActiveTransition._sources.get(this);
|
|
629
|
+
if (ActiveTransition && (ActiveTransition._sources.has(this) || !this._cloned && this._stateFlags & UNINITIALIZED_BIT)) {
|
|
630
|
+
const clone = ActiveTransition._sources.get(this) || cloneGraph(this);
|
|
623
631
|
if (clone !== this)
|
|
624
632
|
return clone.wait();
|
|
625
633
|
}
|
|
@@ -672,11 +680,6 @@ var Computation = class extends Owner {
|
|
|
672
680
|
* Set the current node's state, and recursively mark all of this node's observers as STATE_CHECK
|
|
673
681
|
*/
|
|
674
682
|
_notify(state, skipQueue) {
|
|
675
|
-
if (ActiveTransition && ActiveTransition._sources.has(this)) {
|
|
676
|
-
const clone = ActiveTransition._sources.get(this);
|
|
677
|
-
if (clone !== this)
|
|
678
|
-
return clone._notify(state, skipQueue);
|
|
679
|
-
}
|
|
680
683
|
if (this._state >= state && !this._forceNotify)
|
|
681
684
|
return;
|
|
682
685
|
this._forceNotify = !!skipQueue;
|
|
@@ -746,7 +749,7 @@ var Computation = class extends Owner {
|
|
|
746
749
|
for (let i = 0; i < this._sources.length; i++) {
|
|
747
750
|
const source = ActiveTransition && ActiveTransition._sources.get(this._sources[i]) || this._sources[i];
|
|
748
751
|
source._updateIfNecessary();
|
|
749
|
-
observerFlags |= source._stateFlags;
|
|
752
|
+
observerFlags |= source._stateFlags & ~UNINITIALIZED_BIT;
|
|
750
753
|
if (this._state === STATE_DIRTY) {
|
|
751
754
|
break;
|
|
752
755
|
}
|
|
@@ -816,7 +819,7 @@ function update(node) {
|
|
|
816
819
|
}
|
|
817
820
|
let source;
|
|
818
821
|
for (let i = newSourcesIndex; i < node._sources.length; i++) {
|
|
819
|
-
source = node._sources[i];
|
|
822
|
+
source = ActiveTransition && ActiveTransition._sources.get(node._sources[i]) || node._sources[i];
|
|
820
823
|
if (!source._observers)
|
|
821
824
|
source._observers = [node];
|
|
822
825
|
else
|
|
@@ -833,6 +836,21 @@ function update(node) {
|
|
|
833
836
|
node._state = STATE_CLEAN;
|
|
834
837
|
}
|
|
835
838
|
}
|
|
839
|
+
function removeSourceObservers(node, index) {
|
|
840
|
+
let source;
|
|
841
|
+
let swap;
|
|
842
|
+
for (let i = index; i < node._sources.length; i++) {
|
|
843
|
+
source = ActiveTransition && ActiveTransition._sources.get(node._sources[i]) || node._sources[i];
|
|
844
|
+
if (source._observers) {
|
|
845
|
+
if ((swap = source._observers.indexOf(node)) !== -1) {
|
|
846
|
+
source._observers[swap] = source._observers[source._observers.length - 1];
|
|
847
|
+
source._observers.pop();
|
|
848
|
+
}
|
|
849
|
+
if (!source._observers.length)
|
|
850
|
+
Unobserved.push(source);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
}
|
|
836
854
|
function isEqual(a, b) {
|
|
837
855
|
return a === b;
|
|
838
856
|
}
|
|
@@ -936,7 +954,7 @@ function compute(owner, fn, observer) {
|
|
|
936
954
|
currentMask = observer?._handlerMask ?? DEFAULT_FLAGS;
|
|
937
955
|
notStale = true;
|
|
938
956
|
try {
|
|
939
|
-
return fn(observer ? observer._value : void 0);
|
|
957
|
+
return fn.call(observer, observer ? observer._value : void 0);
|
|
940
958
|
} finally {
|
|
941
959
|
setOwner(prevOwner);
|
|
942
960
|
currentObserver = prevObserver;
|
|
@@ -960,7 +978,9 @@ var Effect = class extends Computation {
|
|
|
960
978
|
this._prevValue = initialValue;
|
|
961
979
|
this._type = options?.render ? EFFECT_RENDER : EFFECT_USER;
|
|
962
980
|
if (this._type === EFFECT_RENDER) {
|
|
963
|
-
this._compute = (p)
|
|
981
|
+
this._compute = function(p) {
|
|
982
|
+
return !this._cloned && clock > this._queue.created && !(this._stateFlags & ERROR_BIT) ? latest(() => compute2(p)) : compute2(p);
|
|
983
|
+
};
|
|
964
984
|
}
|
|
965
985
|
this._updateIfNecessary();
|
|
966
986
|
!options?.defer && (this._type === EFFECT_USER ? this._queue.enqueue(this._type, this._run.bind(this)) : this._run(this._type));
|
|
@@ -971,19 +991,17 @@ var Effect = class extends Computation {
|
|
|
971
991
|
if (this._state == STATE_DIRTY) {
|
|
972
992
|
this._stateFlags = flags;
|
|
973
993
|
if (this._type === EFFECT_RENDER) {
|
|
974
|
-
this._queue.notify(this, LOADING_BIT | ERROR_BIT,
|
|
994
|
+
this._queue.notify(this, LOADING_BIT | ERROR_BIT, this._stateFlags);
|
|
975
995
|
}
|
|
976
996
|
}
|
|
977
997
|
if (value === UNCHANGED)
|
|
978
998
|
return this._value;
|
|
979
999
|
this._value = value;
|
|
980
1000
|
this._modified = true;
|
|
1001
|
+
this._error = void 0;
|
|
981
1002
|
return value;
|
|
982
1003
|
}
|
|
983
1004
|
_notify(state, skipQueue) {
|
|
984
|
-
if (ActiveTransition && ActiveTransition._sources.has(this)) {
|
|
985
|
-
return ActiveTransition._sources.get(this)._notify(state, skipQueue);
|
|
986
|
-
}
|
|
987
1005
|
if (this._state >= state || skipQueue)
|
|
988
1006
|
return;
|
|
989
1007
|
if (this._state === STATE_CLEAN)
|
|
@@ -991,8 +1009,8 @@ var Effect = class extends Computation {
|
|
|
991
1009
|
this._state = state;
|
|
992
1010
|
}
|
|
993
1011
|
_notifyFlags(mask, newFlags2) {
|
|
994
|
-
if (
|
|
995
|
-
if (this._state >=
|
|
1012
|
+
if (this._cloned) {
|
|
1013
|
+
if (this._state >= STATE_DIRTY)
|
|
996
1014
|
return;
|
|
997
1015
|
if (mask & 3) {
|
|
998
1016
|
this._notify(STATE_DIRTY);
|
|
@@ -1055,9 +1073,6 @@ var EagerComputation = class extends Computation {
|
|
|
1055
1073
|
console.warn("Eager Computations created outside a reactive context will never be disposed");
|
|
1056
1074
|
}
|
|
1057
1075
|
_notify(state, skipQueue) {
|
|
1058
|
-
if (ActiveTransition && ActiveTransition._sources.has(this)) {
|
|
1059
|
-
return ActiveTransition._sources.get(this)._notify(state, skipQueue);
|
|
1060
|
-
}
|
|
1061
1076
|
if (this._state >= state && !this._forceNotify)
|
|
1062
1077
|
return;
|
|
1063
1078
|
if (!skipQueue && (this._state === STATE_CLEAN || this._state === STATE_CHECK && this._forceNotify))
|
|
@@ -1076,9 +1091,6 @@ var FirewallComputation = class extends Computation {
|
|
|
1076
1091
|
console.warn("Eager Computations created outside a reactive context will never be disposed");
|
|
1077
1092
|
}
|
|
1078
1093
|
_notify(state, skipQueue) {
|
|
1079
|
-
if (ActiveTransition && ActiveTransition._sources.has(this)) {
|
|
1080
|
-
return ActiveTransition._sources.get(this)._notify(state, skipQueue);
|
|
1081
|
-
}
|
|
1082
1094
|
if (this._state >= state && !this._forceNotify)
|
|
1083
1095
|
return;
|
|
1084
1096
|
if (!skipQueue && (this._state === STATE_CLEAN || this._state === STATE_CHECK && this._forceNotify))
|
|
@@ -1524,6 +1536,8 @@ function applyState(next, state, keyFn, all) {
|
|
|
1524
1536
|
}
|
|
1525
1537
|
function reconcile(value, key, all = false) {
|
|
1526
1538
|
return (state) => {
|
|
1539
|
+
if (state == null)
|
|
1540
|
+
throw new Error("Cannot reconcile null or undefined state");
|
|
1527
1541
|
const keyFn = typeof key === "string" ? (item) => item[key] : key;
|
|
1528
1542
|
const eq = keyFn(state);
|
|
1529
1543
|
if (eq !== void 0 && keyFn(value) !== keyFn(state))
|
|
@@ -1768,7 +1782,7 @@ function createMemo(compute2, value, options) {
|
|
|
1768
1782
|
return resolvedValue;
|
|
1769
1783
|
}
|
|
1770
1784
|
resolvedValue = node.wait();
|
|
1771
|
-
if (!node._sources?.length && node._nextSibling?._parent !== node) {
|
|
1785
|
+
if (!node._sources?.length && node._nextSibling?._parent !== node && !(node._stateFlags & UNINITIALIZED_BIT)) {
|
|
1772
1786
|
node.dispose();
|
|
1773
1787
|
node = void 0;
|
|
1774
1788
|
}
|
|
@@ -1829,9 +1843,13 @@ function createAsync(compute2, value, options) {
|
|
|
1829
1843
|
);
|
|
1830
1844
|
const read = node.wait.bind(node);
|
|
1831
1845
|
read.refresh = () => {
|
|
1832
|
-
|
|
1846
|
+
let n = node;
|
|
1847
|
+
if (ActiveTransition && !node._cloned) {
|
|
1848
|
+
n = cloneGraph(node);
|
|
1849
|
+
}
|
|
1850
|
+
n._state = STATE_DIRTY;
|
|
1833
1851
|
refreshing = true;
|
|
1834
|
-
|
|
1852
|
+
n._updateIfNecessary();
|
|
1835
1853
|
};
|
|
1836
1854
|
return read;
|
|
1837
1855
|
}
|
|
@@ -1912,7 +1930,7 @@ function createOptimistic(initial, compute2, key) {
|
|
|
1912
1930
|
(s) => {
|
|
1913
1931
|
const value = initial();
|
|
1914
1932
|
if (!ActiveTransition)
|
|
1915
|
-
|
|
1933
|
+
reconcile({ value }, key)(s);
|
|
1916
1934
|
},
|
|
1917
1935
|
{ value: void 0 }
|
|
1918
1936
|
);
|
|
@@ -1920,9 +1938,9 @@ function createOptimistic(initial, compute2, key) {
|
|
|
1920
1938
|
[store, setStore] = createStore({ value: initial });
|
|
1921
1939
|
const reset = () => setStore(
|
|
1922
1940
|
(s) => reconcile(
|
|
1923
|
-
typeof initial === "function" ? initial() : initial,
|
|
1941
|
+
{ value: typeof initial === "function" ? initial() : initial },
|
|
1924
1942
|
key
|
|
1925
|
-
)(s
|
|
1943
|
+
)(s)
|
|
1926
1944
|
);
|
|
1927
1945
|
let lastChange = void 0;
|
|
1928
1946
|
function write(v) {
|
|
@@ -2284,6 +2302,8 @@ function createErrorBoundary(fn, fallback) {
|
|
|
2284
2302
|
return fallback(node._error, () => {
|
|
2285
2303
|
incrementClock();
|
|
2286
2304
|
for (let node2 of queue._nodes) {
|
|
2305
|
+
if (ActiveTransition && !node2._cloned)
|
|
2306
|
+
node2 = cloneGraph(node2);
|
|
2287
2307
|
node2._state = STATE_DIRTY;
|
|
2288
2308
|
node2._queue?.enqueue(node2._type, node2._run.bind(node2));
|
|
2289
2309
|
}
|