@zeix/cause-effect 0.16.0 → 0.16.1
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/README.md +1 -1
- package/index.dev.js +167 -162
- package/index.js +1 -1
- package/index.ts +3 -2
- package/package.json +1 -1
- package/src/computed.ts +15 -16
- package/src/diff.ts +24 -21
- package/src/state.ts +34 -45
- package/src/store.ts +170 -221
- package/src/util.ts +2 -6
- package/test/batch.test.ts +1 -1
- package/test/benchmark.test.ts +1 -1
- package/test/computed.test.ts +1 -1
- package/test/effect.test.ts +1 -1
- package/test/match.test.ts +1 -1
- package/test/resolve.test.ts +1 -1
- package/test/signal.test.ts +2 -2
- package/test/state.test.ts +1 -1
- package/test/store.test.ts +859 -1502
- package/types/index.d.ts +3 -3
- package/types/src/diff.d.ts +7 -7
- package/types/src/store.d.ts +6 -7
package/README.md
CHANGED
package/index.dev.js
CHANGED
|
@@ -71,9 +71,8 @@ var recordToArray = (record) => {
|
|
|
71
71
|
if (indexes === null)
|
|
72
72
|
return record;
|
|
73
73
|
const array = [];
|
|
74
|
-
for (const index of indexes)
|
|
74
|
+
for (const index of indexes)
|
|
75
75
|
array.push(record[String(index)]);
|
|
76
|
-
}
|
|
77
76
|
return array;
|
|
78
77
|
};
|
|
79
78
|
var valueString = (value) => isString(value) ? `"${value}"` : !!value && typeof value === "object" ? JSON.stringify(value) : String(value);
|
|
@@ -314,18 +313,24 @@ var createComputed = (callback, initialValue = UNSET) => {
|
|
|
314
313
|
ok(result);
|
|
315
314
|
computing = false;
|
|
316
315
|
}, watcher);
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
316
|
+
const computed = {};
|
|
317
|
+
Object.defineProperties(computed, {
|
|
318
|
+
[Symbol.toStringTag]: {
|
|
319
|
+
value: TYPE_COMPUTED
|
|
320
|
+
},
|
|
321
|
+
get: {
|
|
322
|
+
value: () => {
|
|
323
|
+
subscribe(watchers);
|
|
324
|
+
flush();
|
|
325
|
+
if (dirty)
|
|
326
|
+
compute();
|
|
327
|
+
if (error)
|
|
328
|
+
throw error;
|
|
329
|
+
return value;
|
|
330
|
+
}
|
|
327
331
|
}
|
|
328
|
-
};
|
|
332
|
+
});
|
|
333
|
+
return computed;
|
|
329
334
|
};
|
|
330
335
|
var isComputed = (value) => isObjectOfType(value, TYPE_COMPUTED);
|
|
331
336
|
var isComputedCallback = (value) => isFunction(value) && value.length < 3;
|
|
@@ -416,28 +421,40 @@ var createState = (initialValue) => {
|
|
|
416
421
|
throw new NullishSignalValueError("state");
|
|
417
422
|
const watchers = new Set;
|
|
418
423
|
let value = initialValue;
|
|
419
|
-
const
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
return
|
|
424
|
+
const setValue = (newValue) => {
|
|
425
|
+
if (newValue == null)
|
|
426
|
+
throw new NullishSignalValueError("state");
|
|
427
|
+
if (isEqual(value, newValue))
|
|
428
|
+
return;
|
|
429
|
+
value = newValue;
|
|
430
|
+
notify(watchers);
|
|
431
|
+
if (UNSET === value)
|
|
432
|
+
watchers.clear();
|
|
433
|
+
};
|
|
434
|
+
const state = {};
|
|
435
|
+
Object.defineProperties(state, {
|
|
436
|
+
[Symbol.toStringTag]: {
|
|
437
|
+
value: TYPE_STATE
|
|
424
438
|
},
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
439
|
+
get: {
|
|
440
|
+
value: () => {
|
|
441
|
+
subscribe(watchers);
|
|
442
|
+
return value;
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
set: {
|
|
446
|
+
value: (newValue) => {
|
|
447
|
+
setValue(newValue);
|
|
448
|
+
}
|
|
434
449
|
},
|
|
435
|
-
update:
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
450
|
+
update: {
|
|
451
|
+
value: (updater) => {
|
|
452
|
+
if (!isFunction(updater))
|
|
453
|
+
throw new InvalidCallbackError("state update", valueString(updater));
|
|
454
|
+
setValue(updater(value));
|
|
455
|
+
}
|
|
439
456
|
}
|
|
440
|
-
};
|
|
457
|
+
});
|
|
441
458
|
return state;
|
|
442
459
|
};
|
|
443
460
|
var isState = (value) => isObjectOfType(value, TYPE_STATE);
|
|
@@ -457,19 +474,16 @@ var createStore = (initialValue) => {
|
|
|
457
474
|
const signals = new Map;
|
|
458
475
|
const signalWatchers = new Map;
|
|
459
476
|
const isArrayLike = Array.isArray(initialValue);
|
|
460
|
-
const size = createState(0);
|
|
461
477
|
const current = () => {
|
|
462
478
|
const record = {};
|
|
463
|
-
for (const [key, signal] of signals)
|
|
479
|
+
for (const [key, signal] of signals)
|
|
464
480
|
record[key] = signal.get();
|
|
465
|
-
}
|
|
466
481
|
return record;
|
|
467
482
|
};
|
|
468
483
|
const emit = (key, changes) => {
|
|
469
484
|
Object.freeze(changes);
|
|
470
|
-
for (const listener of listeners[key])
|
|
485
|
+
for (const listener of listeners[key])
|
|
471
486
|
listener(changes);
|
|
472
|
-
}
|
|
473
487
|
};
|
|
474
488
|
const getSortedIndexes = () => Array.from(signals.keys()).map((k) => Number(k)).filter((n) => Number.isInteger(n)).sort((a, b) => a - b);
|
|
475
489
|
const isValidValue = (key, value) => {
|
|
@@ -487,18 +501,13 @@ var createStore = (initialValue) => {
|
|
|
487
501
|
const signal = isState(value) || isStore(value) ? value : isRecord(value) || Array.isArray(value) ? createStore(value) : createState(value);
|
|
488
502
|
signals.set(key, signal);
|
|
489
503
|
const watcher = createWatcher(() => observe(() => {
|
|
490
|
-
emit("change", {
|
|
491
|
-
[key]: signal.get()
|
|
492
|
-
});
|
|
504
|
+
emit("change", { [key]: signal.get() });
|
|
493
505
|
}, watcher));
|
|
494
506
|
watcher();
|
|
495
507
|
signalWatchers.set(key, watcher);
|
|
496
508
|
if (single) {
|
|
497
|
-
size.set(signals.size);
|
|
498
509
|
notify(watchers);
|
|
499
|
-
emit("add", {
|
|
500
|
-
[key]: value
|
|
501
|
-
});
|
|
510
|
+
emit("add", { [key]: value });
|
|
502
511
|
}
|
|
503
512
|
return true;
|
|
504
513
|
};
|
|
@@ -511,11 +520,8 @@ var createStore = (initialValue) => {
|
|
|
511
520
|
signalWatchers.delete(key);
|
|
512
521
|
}
|
|
513
522
|
if (single) {
|
|
514
|
-
size.set(signals.size);
|
|
515
523
|
notify(watchers);
|
|
516
|
-
emit("remove", {
|
|
517
|
-
[key]: UNSET
|
|
518
|
-
});
|
|
524
|
+
emit("remove", { [key]: UNSET });
|
|
519
525
|
}
|
|
520
526
|
return ok;
|
|
521
527
|
};
|
|
@@ -523,10 +529,8 @@ var createStore = (initialValue) => {
|
|
|
523
529
|
const changes = diff(oldValue, newValue);
|
|
524
530
|
batch(() => {
|
|
525
531
|
if (Object.keys(changes.add).length) {
|
|
526
|
-
for (const key in changes.add)
|
|
527
|
-
|
|
528
|
-
addProperty(key, value);
|
|
529
|
-
}
|
|
532
|
+
for (const key in changes.add)
|
|
533
|
+
addProperty(key, changes.add[key] ?? UNSET);
|
|
530
534
|
if (initialRun) {
|
|
531
535
|
setTimeout(() => {
|
|
532
536
|
emit("add", changes.add);
|
|
@@ -553,135 +557,135 @@ var createStore = (initialValue) => {
|
|
|
553
557
|
removeProperty(key);
|
|
554
558
|
emit("remove", changes.remove);
|
|
555
559
|
}
|
|
556
|
-
size.set(signals.size);
|
|
557
560
|
});
|
|
558
561
|
return changes.changed;
|
|
559
562
|
};
|
|
560
563
|
reconcile({}, initialValue, true);
|
|
561
|
-
const store = {
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
addProperty(key, v, true);
|
|
566
|
-
} : (k, v) => {
|
|
567
|
-
if (!signals.has(k))
|
|
568
|
-
addProperty(k, v, true);
|
|
569
|
-
else
|
|
570
|
-
throw new StoreKeyExistsError(k, valueString(v));
|
|
564
|
+
const store = {};
|
|
565
|
+
Object.defineProperties(store, {
|
|
566
|
+
[Symbol.toStringTag]: {
|
|
567
|
+
value: TYPE_STORE
|
|
571
568
|
},
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
return recordToArray(current());
|
|
569
|
+
[Symbol.isConcatSpreadable]: {
|
|
570
|
+
value: isArrayLike
|
|
575
571
|
},
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
572
|
+
[Symbol.iterator]: {
|
|
573
|
+
value: isArrayLike ? function* () {
|
|
574
|
+
const indexes = getSortedIndexes();
|
|
575
|
+
for (const index of indexes) {
|
|
576
|
+
const signal = signals.get(String(index));
|
|
577
|
+
if (signal)
|
|
578
|
+
yield signal;
|
|
579
|
+
}
|
|
580
|
+
} : function* () {
|
|
581
|
+
for (const [key, signal] of signals)
|
|
582
|
+
yield [key, signal];
|
|
583
|
+
}
|
|
588
584
|
},
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
585
|
+
add: {
|
|
586
|
+
value: isArrayLike ? (v) => {
|
|
587
|
+
addProperty(String(signals.size), v, true);
|
|
588
|
+
} : (k, v) => {
|
|
589
|
+
if (!signals.has(k))
|
|
590
|
+
addProperty(k, v, true);
|
|
591
|
+
else
|
|
592
|
+
throw new StoreKeyExistsError(k, valueString(v));
|
|
594
593
|
}
|
|
595
594
|
},
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
notify(watchers);
|
|
601
|
-
if (UNSET === newValue)
|
|
602
|
-
watchers.clear();
|
|
595
|
+
get: {
|
|
596
|
+
value: () => {
|
|
597
|
+
subscribe(watchers);
|
|
598
|
+
return recordToArray(current());
|
|
603
599
|
}
|
|
604
600
|
},
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
const
|
|
612
|
-
|
|
613
|
-
if (
|
|
614
|
-
|
|
615
|
-
})
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
emit("sort", newOrder);
|
|
601
|
+
remove: {
|
|
602
|
+
value: isArrayLike ? (index) => {
|
|
603
|
+
const currentArray = recordToArray(current());
|
|
604
|
+
const currentLength = signals.size;
|
|
605
|
+
if (!Array.isArray(currentArray) || index <= -currentLength || index >= currentLength)
|
|
606
|
+
throw new StoreKeyRangeError(index);
|
|
607
|
+
const newArray = [...currentArray];
|
|
608
|
+
newArray.splice(index, 1);
|
|
609
|
+
if (reconcile(currentArray, newArray))
|
|
610
|
+
notify(watchers);
|
|
611
|
+
} : (k) => {
|
|
612
|
+
if (signals.has(k))
|
|
613
|
+
removeProperty(k, true);
|
|
614
|
+
}
|
|
620
615
|
},
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
616
|
+
set: {
|
|
617
|
+
value: (v) => {
|
|
618
|
+
if (reconcile(current(), v)) {
|
|
619
|
+
notify(watchers);
|
|
620
|
+
if (UNSET === v)
|
|
621
|
+
watchers.clear();
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
624
|
},
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
return isArrayLike ? function* () {
|
|
635
|
-
const indexes = getSortedIndexes();
|
|
636
|
-
for (const index of indexes) {
|
|
637
|
-
const signal = signals.get(String(index));
|
|
638
|
-
if (signal)
|
|
639
|
-
yield signal;
|
|
640
|
-
}
|
|
641
|
-
} : function* () {
|
|
642
|
-
for (const [key, signal] of signals)
|
|
643
|
-
yield [key, signal];
|
|
644
|
-
};
|
|
645
|
-
if (isSymbol(prop))
|
|
646
|
-
return;
|
|
647
|
-
if (prop in store)
|
|
648
|
-
return store[prop];
|
|
649
|
-
if (prop === "length" && isArrayLike) {
|
|
650
|
-
subscribe(watchers);
|
|
651
|
-
return size.get();
|
|
625
|
+
update: {
|
|
626
|
+
value: (fn) => {
|
|
627
|
+
const oldValue = current();
|
|
628
|
+
const newValue = fn(recordToArray(oldValue));
|
|
629
|
+
if (reconcile(oldValue, newValue)) {
|
|
630
|
+
notify(watchers);
|
|
631
|
+
if (UNSET === newValue)
|
|
632
|
+
watchers.clear();
|
|
633
|
+
}
|
|
652
634
|
}
|
|
653
|
-
return signals.get(prop);
|
|
654
635
|
},
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
636
|
+
sort: {
|
|
637
|
+
value: (compareFn) => {
|
|
638
|
+
const entries = Array.from(signals.entries()).map(([key, signal]) => [key, signal.get()]).sort(compareFn ? (a, b) => compareFn(a[1], b[1]) : (a, b) => String(a[1]).localeCompare(String(b[1])));
|
|
639
|
+
const newOrder = entries.map(([key]) => String(key));
|
|
640
|
+
const newSignals = new Map;
|
|
641
|
+
entries.forEach(([key], newIndex) => {
|
|
642
|
+
const oldKey = String(key);
|
|
643
|
+
const newKey = isArrayLike ? String(newIndex) : String(key);
|
|
644
|
+
const signal = signals.get(oldKey);
|
|
645
|
+
if (signal)
|
|
646
|
+
newSignals.set(newKey, signal);
|
|
647
|
+
});
|
|
648
|
+
signals.clear();
|
|
649
|
+
newSignals.forEach((signal, key) => signals.set(key, signal));
|
|
650
|
+
notify(watchers);
|
|
651
|
+
emit("sort", newOrder);
|
|
652
|
+
}
|
|
658
653
|
},
|
|
659
|
-
|
|
660
|
-
|
|
654
|
+
on: {
|
|
655
|
+
value: (type, listener) => {
|
|
656
|
+
listeners[type].add(listener);
|
|
657
|
+
return () => listeners[type].delete(listener);
|
|
658
|
+
}
|
|
661
659
|
},
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
writable: false,
|
|
674
|
-
value: size.get()
|
|
675
|
-
};
|
|
676
|
-
if (prop === Symbol.isConcatSpreadable)
|
|
677
|
-
return nonEnumerable(isArrayLike);
|
|
678
|
-
if (prop === Symbol.toStringTag)
|
|
679
|
-
return nonEnumerable(TYPE_STORE);
|
|
660
|
+
length: {
|
|
661
|
+
get() {
|
|
662
|
+
subscribe(watchers);
|
|
663
|
+
return signals.size;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
});
|
|
667
|
+
return new Proxy(store, {
|
|
668
|
+
get(target, prop) {
|
|
669
|
+
if (prop in target)
|
|
670
|
+
return Reflect.get(target, prop);
|
|
680
671
|
if (isSymbol(prop))
|
|
681
672
|
return;
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
673
|
+
return signals.get(prop);
|
|
674
|
+
},
|
|
675
|
+
has(target, prop) {
|
|
676
|
+
if (prop in target)
|
|
677
|
+
return true;
|
|
678
|
+
return signals.has(String(prop));
|
|
679
|
+
},
|
|
680
|
+
ownKeys(target) {
|
|
681
|
+
const staticKeys = Reflect.ownKeys(target);
|
|
682
|
+
const signalKeys = isArrayLike ? getSortedIndexes().map((key) => String(key)) : Array.from(signals.keys());
|
|
683
|
+
return [...new Set([...signalKeys, ...staticKeys])];
|
|
684
|
+
},
|
|
685
|
+
getOwnPropertyDescriptor(target, prop) {
|
|
686
|
+
if (prop in target)
|
|
687
|
+
return Reflect.getOwnPropertyDescriptor(target, prop);
|
|
688
|
+
const signal = signals.get(String(prop));
|
|
685
689
|
return signal ? {
|
|
686
690
|
enumerable: true,
|
|
687
691
|
configurable: true,
|
|
@@ -721,6 +725,7 @@ export {
|
|
|
721
725
|
isSignal,
|
|
722
726
|
isRecordOrArray,
|
|
723
727
|
isRecord,
|
|
728
|
+
isObjectOfType,
|
|
724
729
|
isNumber,
|
|
725
730
|
isMutableSignal,
|
|
726
731
|
isFunction,
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
class
|
|
1
|
+
class _ extends Error{constructor($){super(`Circular dependency detected in ${$}`);this.name="CircularDependencyError"}}class W extends TypeError{constructor($,x){super(`Invalid ${$} callback ${x}`);this.name="InvalidCallbackError"}}class h extends TypeError{constructor($,x){super(`Invalid signal value ${x} in ${$}`);this.name="InvalidSignalValueError"}}class L extends TypeError{constructor($){super(`Nullish signal values are not allowed in ${$}`);this.name="NullishSignalValueError"}}class v extends Error{constructor($,x){super(`Could not add store key "${$}" with value ${x} because it already exists`);this.name="StoreKeyExistsError"}}class n extends RangeError{constructor($){super(`Could not remove store index ${String($)} because it is out of range`);this.name="StoreKeyRangeError"}}class u extends Error{constructor($,x){super(`Could not set store key "${$}" to ${x} because it is readonly`);this.name="StoreKeyReadonlyError"}}var q=Symbol(),e=($)=>typeof $==="string",X$=($)=>typeof $==="number",c=($)=>typeof $==="symbol",K=($)=>typeof $==="function",g=($)=>K($)&&$.constructor.name==="AsyncFunction",m=($,x)=>Object.prototype.toString.call($)===`[object ${x}]`,A=($)=>m($,"Object"),s=($)=>A($)||Array.isArray($),H$=($)=>{if(!$.length)return null;let x=$.map((z)=>e(z)?parseInt(z,10):X$(z)?z:NaN);return x.every((z)=>Number.isFinite(z)&&z>=0)?x.sort((z,J)=>z-J):null};var y=($)=>$ instanceof DOMException&&$.name==="AbortError",U=($)=>$ instanceof Error?$:Error(String($));var t=($)=>{let x=H$(Object.keys($));if(x===null)return $;let z=[];for(let J of x)z.push($[String(J)]);return z},F=($)=>e($)?`"${$}"`:!!$&&typeof $==="object"?JSON.stringify($):String($);var f=($,x,z)=>{if(Object.is($,x))return!0;if(typeof $!==typeof x)return!1;if(typeof $!=="object"||$===null||x===null)return!1;if(!z)z=new WeakSet;if(z.has($)||z.has(x))throw new _("isEqual");z.add($),z.add(x);try{if(Array.isArray($)&&Array.isArray(x)){if($.length!==x.length)return!1;for(let J=0;J<$.length;J++)if(!f($[J],x[J],z))return!1;return!0}if(Array.isArray($)!==Array.isArray(x))return!1;if(A($)&&A(x)){let J=Object.keys($),X=Object.keys(x);if(J.length!==X.length)return!1;for(let M of J){if(!(M in x))return!1;if(!f($[M],x[M],z))return!1}return!0}return!1}finally{z.delete($),z.delete(x)}},$$=($,x)=>{let z=s($),J=s(x);if(!z||!J){let C=!Object.is($,x);return{changed:C,add:C&&J?x:{},change:{},remove:C&&z?$:{}}}let X=new WeakSet,M={},H={},I={},Y=Object.keys($),E=Object.keys(x),P=new Set([...Y,...E]);for(let C of P){let N=C in $,R=C in x;if(!N&&R){M[C]=x[C];continue}else if(N&&!R){I[C]=q;continue}let B=$[C],G=x[C];if(!f(B,G,X))H[C]=G}return{changed:Object.keys(M).length>0||Object.keys(H).length>0||Object.keys(I).length>0,add:M,change:H,remove:I}};var p,i=new Set,x$=0,O=($)=>{let x=new Set,z=$;return z.unwatch=(J)=>{x.add(J)},z.cleanup=()=>{for(let J of x)J();x.clear()},z},j=($)=>{if(p&&!$.has(p)){let x=p;x.unwatch(()=>{$.delete(x)}),$.add(x)}},T=($)=>{for(let x of $)if(x$)i.add(x);else x()},r=()=>{while(i.size){let $=Array.from(i);i.clear();for(let x of $)x()}},R$=($)=>{x$++;try{$()}finally{r(),x$--}},S=($,x)=>{let z=p;p=x;try{$()}finally{p=z}};var B$="Computed",J$=($,x=q)=>{if(!l($))throw new W("computed",F($));if(x==null)throw new L("computed");let z=new Set,J=x,X,M,H=!0,I=!1,Y=!1,E=(G)=>{if(!f(G,J))J=G,I=!0;X=void 0,H=!1},P=()=>{I=q!==J,J=q,X=void 0},V=(G)=>{let Q=U(G);I=!X||Q.name!==X.name||Q.message!==X.message,J=q,X=Q},C=(G)=>(Q)=>{if(Y=!1,M=void 0,G(Q),I)T(z)},N=O(()=>{if(H=!0,M?.abort(),z.size)T(z);else N.cleanup()});N.unwatch(()=>{M?.abort()});let R=()=>S(()=>{if(Y)throw new _("computed");if(I=!1,g($)){if(M)return J;M=new AbortController,M.signal.addEventListener("abort",()=>{Y=!1,M=void 0,R()},{once:!0})}let G;Y=!0;try{G=M?$(J,M.signal):$(J)}catch(Q){if(y(Q))P();else V(Q);Y=!1;return}if(G instanceof Promise)G.then(C(E),C(V));else if(G==null||q===G)P();else E(G);Y=!1},N),B={};return Object.defineProperties(B,{[Symbol.toStringTag]:{value:B$},get:{value:()=>{if(j(z),r(),H)R();if(X)throw X;return J}}}),B},w=($)=>m($,B$),l=($)=>K($)&&$.length<3;var C$=($)=>{if(!K($)||$.length>1)throw new W("effect",F($));let x=g($),z=!1,J,X=O(()=>S(()=>{if(z)throw new _("effect");z=!0,J?.abort(),J=void 0;let M;try{if(x){J=new AbortController;let H=J;$(J.signal).then((I)=>{if(K(I)&&J===H)X.unwatch(I)}).catch((I)=>{if(!y(I))console.error("Async effect error:",I)})}else if(M=$(),K(M))X.unwatch(M)}catch(H){if(!y(H))console.error("Effect callback error:",H)}z=!1},X));return X(),()=>{J?.abort(),X.cleanup()}};function q$($,x){try{if($.pending)x.nil?.();else if($.errors)x.err?.($.errors);else if($.ok)x.ok($.values)}catch(z){if(x.err&&(!$.errors||!$.errors.includes(U(z))))x.err($.errors?[...$.errors,U(z)]:[U(z)]);else throw z}}function D$($){let x=[],z=!1,J={};for(let[X,M]of Object.entries($))try{let H=M.get();if(H===q)z=!0;else J[X]=H}catch(H){x.push(U(H))}if(z)return{ok:!1,pending:!0};if(x.length>0)return{ok:!1,errors:x};return{ok:!0,values:J}}var z$="State",k=($)=>{if($==null)throw new L("state");let x=new Set,z=$,J=(M)=>{if(M==null)throw new L("state");if(f(z,M))return;if(z=M,T(x),q===z)x.clear()},X={};return Object.defineProperties(X,{[Symbol.toStringTag]:{value:z$},get:{value:()=>{return j(x),z}},set:{value:(M)=>{J(M)}},update:{value:(M)=>{if(!K(M))throw new W("state update",F(M));J(M(z))}}}),X},b=($)=>m($,z$);var G$="Store",a=($)=>{if($==null)throw new L("store");let x=new Set,z={add:new Set,change:new Set,remove:new Set,sort:new Set},J=new Map,X=new Map,M=Array.isArray($),H=()=>{let R={};for(let[B,G]of J)R[B]=G.get();return R},I=(R,B)=>{Object.freeze(B);for(let G of z[R])G(B)},Y=()=>Array.from(J.keys()).map((R)=>Number(R)).filter((R)=>Number.isInteger(R)).sort((R,B)=>R-B),E=(R,B)=>{if(B==null)throw new L(`store for key "${R}"`);if(B===q)return!0;if(c(B)||K(B)||w(B))throw new h(`store for key "${R}"`,F(B));return!0},P=(R,B,G=!1)=>{if(!E(R,B))return!1;let Q=b(B)||o(B)?B:A(B)||Array.isArray(B)?a(B):k(B);J.set(R,Q);let Z=O(()=>S(()=>{I("change",{[R]:Q.get()})},Z));if(Z(),X.set(R,Z),G)T(x),I("add",{[R]:B});return!0},V=(R,B=!1)=>{let G=J.delete(R);if(G){let Q=X.get(R);if(Q)Q.cleanup();X.delete(R)}if(B)T(x),I("remove",{[R]:q});return G},C=(R,B,G)=>{let Q=$$(R,B);return R$(()=>{if(Object.keys(Q.add).length){for(let Z in Q.add)P(Z,Q.add[Z]??q);if(G)setTimeout(()=>{I("add",Q.add)},0);else I("add",Q.add)}if(Object.keys(Q.change).length){for(let Z in Q.change){let D=Q.change[Z];if(!E(Z,D))continue;let d=J.get(Z);if(M$(d))d.set(D);else throw new u(Z,F(D))}I("change",Q.change)}if(Object.keys(Q.remove).length){for(let Z in Q.remove)V(Z);I("remove",Q.remove)}}),Q.changed};C({},$,!0);let N={};return Object.defineProperties(N,{[Symbol.toStringTag]:{value:G$},[Symbol.isConcatSpreadable]:{value:M},[Symbol.iterator]:{value:M?function*(){let R=Y();for(let B of R){let G=J.get(String(B));if(G)yield G}}:function*(){for(let[R,B]of J)yield[R,B]}},add:{value:M?(R)=>{P(String(J.size),R,!0)}:(R,B)=>{if(!J.has(R))P(R,B,!0);else throw new v(R,F(B))}},get:{value:()=>{return j(x),t(H())}},remove:{value:M?(R)=>{let B=t(H()),G=J.size;if(!Array.isArray(B)||R<=-G||R>=G)throw new n(R);let Q=[...B];if(Q.splice(R,1),C(B,Q))T(x)}:(R)=>{if(J.has(R))V(R,!0)}},set:{value:(R)=>{if(C(H(),R)){if(T(x),q===R)x.clear()}}},update:{value:(R)=>{let B=H(),G=R(t(B));if(C(B,G)){if(T(x),q===G)x.clear()}}},sort:{value:(R)=>{let B=Array.from(J.entries()).map(([Z,D])=>[Z,D.get()]).sort(R?(Z,D)=>R(Z[1],D[1]):(Z,D)=>String(Z[1]).localeCompare(String(D[1]))),G=B.map(([Z])=>String(Z)),Q=new Map;B.forEach(([Z],D)=>{let d=String(Z),I$=M?String(D):String(Z),Q$=J.get(d);if(Q$)Q.set(I$,Q$)}),J.clear(),Q.forEach((Z,D)=>J.set(D,Z)),T(x),I("sort",G)}},on:{value:(R,B)=>{return z[R].add(B),()=>z[R].delete(B)}},length:{get(){return j(x),J.size}}}),new Proxy(N,{get(R,B){if(B in R)return Reflect.get(R,B);if(c(B))return;return J.get(B)},has(R,B){if(B in R)return!0;return J.has(String(B))},ownKeys(R){let B=Reflect.ownKeys(R),G=M?Y().map((Q)=>String(Q)):Array.from(J.keys());return[...new Set([...G,...B])]},getOwnPropertyDescriptor(R,B){if(B in R)return Reflect.getOwnPropertyDescriptor(R,B);let G=J.get(String(B));return G?{enumerable:!0,configurable:!0,writable:!0,value:G}:void 0}})},o=($)=>m($,G$);var Z$=($)=>b($)||w($)||o($),M$=($)=>b($)||o($);function T$($){if(Z$($))return $;if(l($))return J$($);if(Array.isArray($)||A($))return a($);return k($)}export{F as valueString,T$ as toSignal,U as toError,j as subscribe,D$ as resolve,S as observe,T as notify,q$ as match,c as isSymbol,e as isString,o as isStore,b as isState,Z$ as isSignal,s as isRecordOrArray,A as isRecord,m as isObjectOfType,X$ as isNumber,M$ as isMutableSignal,K as isFunction,f as isEqual,l as isComputedCallback,w as isComputed,g as isAsyncFunction,y as isAbortError,r as flush,$$ as diff,O as createWatcher,a as createStore,k as createState,C$ as createEffect,J$ as createComputed,R$ as batch,q as UNSET,G$ as TYPE_STORE,z$ as TYPE_STATE,B$ as TYPE_COMPUTED,u as StoreKeyReadonlyError,n as StoreKeyRangeError,v as StoreKeyExistsError,L as NullishSignalValueError,h as InvalidSignalValueError,W as InvalidCallbackError,_ as CircularDependencyError};
|
package/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @name Cause & Effect
|
|
3
|
-
* @version 0.16.
|
|
3
|
+
* @version 0.16.1
|
|
4
4
|
* @author Esther Brunner
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -16,9 +16,9 @@ export {
|
|
|
16
16
|
type DiffResult,
|
|
17
17
|
diff,
|
|
18
18
|
isEqual,
|
|
19
|
+
type PartialRecord,
|
|
19
20
|
type UnknownArray,
|
|
20
21
|
type UnknownRecord,
|
|
21
|
-
type UnknownRecordOrArray,
|
|
22
22
|
} from './src/diff'
|
|
23
23
|
export {
|
|
24
24
|
createEffect,
|
|
@@ -67,6 +67,7 @@ export {
|
|
|
67
67
|
isAsyncFunction,
|
|
68
68
|
isFunction,
|
|
69
69
|
isNumber,
|
|
70
|
+
isObjectOfType,
|
|
70
71
|
isRecord,
|
|
71
72
|
isRecordOrArray,
|
|
72
73
|
isString,
|
package/package.json
CHANGED
package/src/computed.ts
CHANGED
|
@@ -145,23 +145,22 @@ const createComputed = <T extends {}>(
|
|
|
145
145
|
computing = false
|
|
146
146
|
}, watcher)
|
|
147
147
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
* Get the current value of the computed
|
|
153
|
-
*
|
|
154
|
-
* @since 0.9.0
|
|
155
|
-
* @returns {T} - Current value of the computed
|
|
156
|
-
*/
|
|
157
|
-
get: (): T => {
|
|
158
|
-
subscribe(watchers)
|
|
159
|
-
flush()
|
|
160
|
-
if (dirty) compute()
|
|
161
|
-
if (error) throw error
|
|
162
|
-
return value
|
|
148
|
+
const computed: Record<PropertyKey, unknown> = {}
|
|
149
|
+
Object.defineProperties(computed, {
|
|
150
|
+
[Symbol.toStringTag]: {
|
|
151
|
+
value: TYPE_COMPUTED,
|
|
163
152
|
},
|
|
164
|
-
|
|
153
|
+
get: {
|
|
154
|
+
value: (): T => {
|
|
155
|
+
subscribe(watchers)
|
|
156
|
+
flush()
|
|
157
|
+
if (dirty) compute()
|
|
158
|
+
if (error) throw error
|
|
159
|
+
return value
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
})
|
|
163
|
+
return computed as Computed<T>
|
|
165
164
|
}
|
|
166
165
|
|
|
167
166
|
/**
|