atom.io 0.24.6 → 0.24.8
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/internal/dist/index.cjs +38 -28
- package/internal/dist/index.d.ts +3 -3
- package/internal/dist/index.js +38 -28
- package/internal/src/selector/create-readonly-selector.ts +7 -2
- package/internal/src/selector/create-writable-selector.ts +3 -1
- package/internal/src/selector/register-selector.ts +14 -3
- package/internal/src/selector/trace-selector-atoms.ts +6 -8
- package/internal/src/selector/update-selector-atoms.ts +3 -1
- package/package.json +5 -5
package/internal/dist/index.cjs
CHANGED
|
@@ -765,6 +765,20 @@ function createAtomFamily(options, store) {
|
|
|
765
765
|
return createRegularAtomFamily(options, store);
|
|
766
766
|
}
|
|
767
767
|
|
|
768
|
+
// internal/src/get-state/get-from-store.ts
|
|
769
|
+
function getFromStore(token, store) {
|
|
770
|
+
if (token.type === `molecule`) {
|
|
771
|
+
try {
|
|
772
|
+
const molecule = withdraw(token, store);
|
|
773
|
+
return molecule.instance;
|
|
774
|
+
} catch (_) {
|
|
775
|
+
return void 0;
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
const state = withdraw(token, store);
|
|
779
|
+
return readOrComputeValue(state, store);
|
|
780
|
+
}
|
|
781
|
+
|
|
768
782
|
// internal/src/keys.ts
|
|
769
783
|
var isAtomKey = (key, store) => newest(store).atoms.has(key);
|
|
770
784
|
var isSelectorKey = (key, store) => newest(store).selectors.has(key);
|
|
@@ -778,21 +792,18 @@ var getSelectorDependencyKeys = (key, store) => {
|
|
|
778
792
|
};
|
|
779
793
|
|
|
780
794
|
// internal/src/selector/trace-selector-atoms.ts
|
|
781
|
-
var traceSelectorAtoms = (
|
|
795
|
+
var traceSelectorAtoms = (directDependencyKey, covered, store) => {
|
|
782
796
|
const rootKeys = [];
|
|
783
797
|
const indirectDependencyKeys = getSelectorDependencyKeys(
|
|
784
798
|
directDependencyKey,
|
|
785
799
|
store
|
|
786
800
|
);
|
|
787
|
-
let depth = 0;
|
|
788
801
|
while (indirectDependencyKeys.length > 0) {
|
|
789
802
|
const indirectDependencyKey = indirectDependencyKeys.shift();
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
throw new Error(
|
|
793
|
-
`Maximum selector dependency depth exceeded (> 99999) in selector "${selectorKey}". This is likely due to a circular dependency.`
|
|
794
|
-
);
|
|
803
|
+
if (covered.has(indirectDependencyKey)) {
|
|
804
|
+
continue;
|
|
795
805
|
}
|
|
806
|
+
covered.add(indirectDependencyKey);
|
|
796
807
|
if (!isAtomKey(indirectDependencyKey, store)) {
|
|
797
808
|
indirectDependencyKeys.push(
|
|
798
809
|
...getSelectorDependencyKeys(indirectDependencyKey, store)
|
|
@@ -806,13 +817,14 @@ var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
|
|
|
806
817
|
var traceAllSelectorAtoms = (selector, store) => {
|
|
807
818
|
const selectorKey = selector.key;
|
|
808
819
|
const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store);
|
|
820
|
+
const covered = /* @__PURE__ */ new Set();
|
|
809
821
|
return directDependencyKeys.flatMap(
|
|
810
|
-
(depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(
|
|
822
|
+
(depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(depKey, covered, store)
|
|
811
823
|
);
|
|
812
824
|
};
|
|
813
825
|
|
|
814
826
|
// internal/src/selector/update-selector-atoms.ts
|
|
815
|
-
var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
827
|
+
var updateSelectorAtoms = (selectorKey, dependency, covered, store) => {
|
|
816
828
|
const target = newest(store);
|
|
817
829
|
if (dependency.type === `atom` || dependency.type === `mutable_atom`) {
|
|
818
830
|
target.selectorAtoms.set({
|
|
@@ -826,7 +838,7 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
|
826
838
|
`discovers root atom "${dependency.key}"`
|
|
827
839
|
);
|
|
828
840
|
} else {
|
|
829
|
-
const rootKeys = traceSelectorAtoms(
|
|
841
|
+
const rootKeys = traceSelectorAtoms(dependency.key, covered, store);
|
|
830
842
|
store.logger.info(
|
|
831
843
|
`\u{1F50D}`,
|
|
832
844
|
`selector`,
|
|
@@ -840,12 +852,16 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
|
840
852
|
});
|
|
841
853
|
}
|
|
842
854
|
}
|
|
855
|
+
covered.add(dependency.key);
|
|
843
856
|
};
|
|
844
857
|
|
|
845
858
|
// internal/src/selector/register-selector.ts
|
|
846
|
-
var registerSelector = (selectorKey, store) => ({
|
|
859
|
+
var registerSelector = (selectorKey, covered, store) => ({
|
|
847
860
|
get: (dependency) => {
|
|
848
861
|
const target = newest(store);
|
|
862
|
+
if (dependency.type === `molecule`) {
|
|
863
|
+
return getFromStore(dependency, store);
|
|
864
|
+
}
|
|
849
865
|
const dependencyState = withdraw(dependency, store);
|
|
850
866
|
const dependencyValue = readOrComputeValue(dependencyState, store);
|
|
851
867
|
store.logger.info(
|
|
@@ -865,7 +881,7 @@ var registerSelector = (selectorKey, store) => ({
|
|
|
865
881
|
source: dependency.key
|
|
866
882
|
}
|
|
867
883
|
);
|
|
868
|
-
updateSelectorAtoms(selectorKey, dependency, store);
|
|
884
|
+
updateSelectorAtoms(selectorKey, dependency, covered, store);
|
|
869
885
|
return dependencyValue;
|
|
870
886
|
},
|
|
871
887
|
set: (WritableToken, newValue) => {
|
|
@@ -882,10 +898,16 @@ var registerSelector = (selectorKey, store) => ({
|
|
|
882
898
|
var createReadonlySelector = (options, family, store) => {
|
|
883
899
|
const target = newest(store);
|
|
884
900
|
const subject = new Subject();
|
|
885
|
-
const
|
|
901
|
+
const covered = /* @__PURE__ */ new Set();
|
|
902
|
+
const { get, find, seek, json } = registerSelector(
|
|
903
|
+
options.key,
|
|
904
|
+
covered,
|
|
905
|
+
target
|
|
906
|
+
);
|
|
886
907
|
const getSelf = () => {
|
|
887
908
|
const value = options.get({ get, find, seek, json });
|
|
888
909
|
cacheValue(options.key, value, subject, newest(store));
|
|
910
|
+
covered.clear();
|
|
889
911
|
return value;
|
|
890
912
|
};
|
|
891
913
|
const readonlySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
|
|
@@ -917,12 +939,14 @@ var createReadonlySelector = (options, family, store) => {
|
|
|
917
939
|
var createWritableSelector = (options, family, store) => {
|
|
918
940
|
const target = newest(store);
|
|
919
941
|
const subject = new Subject();
|
|
920
|
-
const
|
|
942
|
+
const covered = /* @__PURE__ */ new Set();
|
|
943
|
+
const transactors = registerSelector(options.key, covered, target);
|
|
921
944
|
const { find, get, seek, json } = transactors;
|
|
922
945
|
const readonlyTransactors = { find, get, seek, json };
|
|
923
946
|
const getSelf = (innerTarget = newest(store)) => {
|
|
924
947
|
const value = options.get(readonlyTransactors);
|
|
925
948
|
cacheValue(options.key, value, subject, innerTarget);
|
|
949
|
+
covered.clear();
|
|
926
950
|
return value;
|
|
927
951
|
};
|
|
928
952
|
const setSelf = (next) => {
|
|
@@ -1323,20 +1347,6 @@ function getEnvironmentData(store) {
|
|
|
1323
1347
|
store
|
|
1324
1348
|
};
|
|
1325
1349
|
}
|
|
1326
|
-
|
|
1327
|
-
// internal/src/get-state/get-from-store.ts
|
|
1328
|
-
function getFromStore(token, store) {
|
|
1329
|
-
if (token.type === `molecule`) {
|
|
1330
|
-
try {
|
|
1331
|
-
const molecule = withdraw(token, store);
|
|
1332
|
-
return molecule.instance;
|
|
1333
|
-
} catch (_) {
|
|
1334
|
-
return void 0;
|
|
1335
|
-
}
|
|
1336
|
-
}
|
|
1337
|
-
const state = withdraw(token, store);
|
|
1338
|
-
return readOrComputeValue(state, store);
|
|
1339
|
-
}
|
|
1340
1350
|
var Molecule = class {
|
|
1341
1351
|
constructor(ctx, key, family) {
|
|
1342
1352
|
this.key = key;
|
package/internal/dist/index.d.ts
CHANGED
|
@@ -523,12 +523,12 @@ declare function disposeSelector(selectorToken: ReadonlySelectorToken<unknown> |
|
|
|
523
523
|
|
|
524
524
|
declare const getSelectorDependencyKeys: (key: string, store: Store) => (AtomKey<unknown> | ReadonlySelectorKey<unknown> | SelectorKey<unknown>)[];
|
|
525
525
|
|
|
526
|
-
declare const registerSelector: (selectorKey: string, store: Store) => Transactors;
|
|
526
|
+
declare const registerSelector: (selectorKey: string, covered: Set<string>, store: Store) => Transactors;
|
|
527
527
|
|
|
528
|
-
declare const traceSelectorAtoms: (
|
|
528
|
+
declare const traceSelectorAtoms: (directDependencyKey: StateKey<unknown>, covered: Set<string>, store: Store) => AtomKey<unknown>[];
|
|
529
529
|
declare const traceAllSelectorAtoms: (selector: Selector<any>, store: Store) => AtomKey<unknown>[];
|
|
530
530
|
|
|
531
|
-
declare const updateSelectorAtoms: (selectorKey: string, dependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>, store: Store) => void;
|
|
531
|
+
declare const updateSelectorAtoms: (selectorKey: string, dependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>, covered: Set<string>, store: Store) => void;
|
|
532
532
|
|
|
533
533
|
type Modify<T> = (thing: T) => T;
|
|
534
534
|
declare const become: <T>(nextVersionOfThing: Modify<T> | T) => (originalThing: T) => T;
|
package/internal/dist/index.js
CHANGED
|
@@ -490,6 +490,20 @@ function createAtomFamily(options, store) {
|
|
|
490
490
|
return createRegularAtomFamily(options, store);
|
|
491
491
|
}
|
|
492
492
|
|
|
493
|
+
// internal/src/get-state/get-from-store.ts
|
|
494
|
+
function getFromStore(token, store) {
|
|
495
|
+
if (token.type === `molecule`) {
|
|
496
|
+
try {
|
|
497
|
+
const molecule = withdraw(token, store);
|
|
498
|
+
return molecule.instance;
|
|
499
|
+
} catch (_) {
|
|
500
|
+
return void 0;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
const state = withdraw(token, store);
|
|
504
|
+
return readOrComputeValue(state, store);
|
|
505
|
+
}
|
|
506
|
+
|
|
493
507
|
// internal/src/keys.ts
|
|
494
508
|
var isAtomKey = (key, store) => newest(store).atoms.has(key);
|
|
495
509
|
var isSelectorKey = (key, store) => newest(store).selectors.has(key);
|
|
@@ -503,21 +517,18 @@ var getSelectorDependencyKeys = (key, store) => {
|
|
|
503
517
|
};
|
|
504
518
|
|
|
505
519
|
// internal/src/selector/trace-selector-atoms.ts
|
|
506
|
-
var traceSelectorAtoms = (
|
|
520
|
+
var traceSelectorAtoms = (directDependencyKey, covered, store) => {
|
|
507
521
|
const rootKeys = [];
|
|
508
522
|
const indirectDependencyKeys = getSelectorDependencyKeys(
|
|
509
523
|
directDependencyKey,
|
|
510
524
|
store
|
|
511
525
|
);
|
|
512
|
-
let depth = 0;
|
|
513
526
|
while (indirectDependencyKeys.length > 0) {
|
|
514
527
|
const indirectDependencyKey = indirectDependencyKeys.shift();
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
throw new Error(
|
|
518
|
-
`Maximum selector dependency depth exceeded (> 99999) in selector "${selectorKey}". This is likely due to a circular dependency.`
|
|
519
|
-
);
|
|
528
|
+
if (covered.has(indirectDependencyKey)) {
|
|
529
|
+
continue;
|
|
520
530
|
}
|
|
531
|
+
covered.add(indirectDependencyKey);
|
|
521
532
|
if (!isAtomKey(indirectDependencyKey, store)) {
|
|
522
533
|
indirectDependencyKeys.push(
|
|
523
534
|
...getSelectorDependencyKeys(indirectDependencyKey, store)
|
|
@@ -531,13 +542,14 @@ var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
|
|
|
531
542
|
var traceAllSelectorAtoms = (selector, store) => {
|
|
532
543
|
const selectorKey = selector.key;
|
|
533
544
|
const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store);
|
|
545
|
+
const covered = /* @__PURE__ */ new Set();
|
|
534
546
|
return directDependencyKeys.flatMap(
|
|
535
|
-
(depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(
|
|
547
|
+
(depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(depKey, covered, store)
|
|
536
548
|
);
|
|
537
549
|
};
|
|
538
550
|
|
|
539
551
|
// internal/src/selector/update-selector-atoms.ts
|
|
540
|
-
var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
552
|
+
var updateSelectorAtoms = (selectorKey, dependency, covered, store) => {
|
|
541
553
|
const target = newest(store);
|
|
542
554
|
if (dependency.type === `atom` || dependency.type === `mutable_atom`) {
|
|
543
555
|
target.selectorAtoms.set({
|
|
@@ -551,7 +563,7 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
|
551
563
|
`discovers root atom "${dependency.key}"`
|
|
552
564
|
);
|
|
553
565
|
} else {
|
|
554
|
-
const rootKeys = traceSelectorAtoms(
|
|
566
|
+
const rootKeys = traceSelectorAtoms(dependency.key, covered, store);
|
|
555
567
|
store.logger.info(
|
|
556
568
|
`\u{1F50D}`,
|
|
557
569
|
`selector`,
|
|
@@ -565,12 +577,16 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
|
565
577
|
});
|
|
566
578
|
}
|
|
567
579
|
}
|
|
580
|
+
covered.add(dependency.key);
|
|
568
581
|
};
|
|
569
582
|
|
|
570
583
|
// internal/src/selector/register-selector.ts
|
|
571
|
-
var registerSelector = (selectorKey, store) => ({
|
|
584
|
+
var registerSelector = (selectorKey, covered, store) => ({
|
|
572
585
|
get: (dependency) => {
|
|
573
586
|
const target = newest(store);
|
|
587
|
+
if (dependency.type === `molecule`) {
|
|
588
|
+
return getFromStore(dependency, store);
|
|
589
|
+
}
|
|
574
590
|
const dependencyState = withdraw(dependency, store);
|
|
575
591
|
const dependencyValue = readOrComputeValue(dependencyState, store);
|
|
576
592
|
store.logger.info(
|
|
@@ -590,7 +606,7 @@ var registerSelector = (selectorKey, store) => ({
|
|
|
590
606
|
source: dependency.key
|
|
591
607
|
}
|
|
592
608
|
);
|
|
593
|
-
updateSelectorAtoms(selectorKey, dependency, store);
|
|
609
|
+
updateSelectorAtoms(selectorKey, dependency, covered, store);
|
|
594
610
|
return dependencyValue;
|
|
595
611
|
},
|
|
596
612
|
set: (WritableToken, newValue) => {
|
|
@@ -607,10 +623,16 @@ var registerSelector = (selectorKey, store) => ({
|
|
|
607
623
|
var createReadonlySelector = (options, family, store) => {
|
|
608
624
|
const target = newest(store);
|
|
609
625
|
const subject = new Subject();
|
|
610
|
-
const
|
|
626
|
+
const covered = /* @__PURE__ */ new Set();
|
|
627
|
+
const { get, find, seek, json } = registerSelector(
|
|
628
|
+
options.key,
|
|
629
|
+
covered,
|
|
630
|
+
target
|
|
631
|
+
);
|
|
611
632
|
const getSelf = () => {
|
|
612
633
|
const value = options.get({ get, find, seek, json });
|
|
613
634
|
cacheValue(options.key, value, subject, newest(store));
|
|
635
|
+
covered.clear();
|
|
614
636
|
return value;
|
|
615
637
|
};
|
|
616
638
|
const readonlySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
|
|
@@ -642,12 +664,14 @@ var createReadonlySelector = (options, family, store) => {
|
|
|
642
664
|
var createWritableSelector = (options, family, store) => {
|
|
643
665
|
const target = newest(store);
|
|
644
666
|
const subject = new Subject();
|
|
645
|
-
const
|
|
667
|
+
const covered = /* @__PURE__ */ new Set();
|
|
668
|
+
const transactors = registerSelector(options.key, covered, target);
|
|
646
669
|
const { find, get, seek, json } = transactors;
|
|
647
670
|
const readonlyTransactors = { find, get, seek, json };
|
|
648
671
|
const getSelf = (innerTarget = newest(store)) => {
|
|
649
672
|
const value = options.get(readonlyTransactors);
|
|
650
673
|
cacheValue(options.key, value, subject, innerTarget);
|
|
674
|
+
covered.clear();
|
|
651
675
|
return value;
|
|
652
676
|
};
|
|
653
677
|
const setSelf = (next) => {
|
|
@@ -1048,20 +1072,6 @@ function getEnvironmentData(store) {
|
|
|
1048
1072
|
store
|
|
1049
1073
|
};
|
|
1050
1074
|
}
|
|
1051
|
-
|
|
1052
|
-
// internal/src/get-state/get-from-store.ts
|
|
1053
|
-
function getFromStore(token, store) {
|
|
1054
|
-
if (token.type === `molecule`) {
|
|
1055
|
-
try {
|
|
1056
|
-
const molecule = withdraw(token, store);
|
|
1057
|
-
return molecule.instance;
|
|
1058
|
-
} catch (_) {
|
|
1059
|
-
return void 0;
|
|
1060
|
-
}
|
|
1061
|
-
}
|
|
1062
|
-
const state = withdraw(token, store);
|
|
1063
|
-
return readOrComputeValue(state, store);
|
|
1064
|
-
}
|
|
1065
1075
|
var Molecule = class {
|
|
1066
1076
|
constructor(ctx, key, family) {
|
|
1067
1077
|
this.key = key;
|
|
@@ -18,11 +18,16 @@ export const createReadonlySelector = <T>(
|
|
|
18
18
|
): ReadonlySelectorToken<T> => {
|
|
19
19
|
const target = newest(store)
|
|
20
20
|
const subject = new Subject<{ newValue: T; oldValue: T }>()
|
|
21
|
-
|
|
22
|
-
const { get, find, seek, json } = registerSelector(
|
|
21
|
+
const covered = new Set<string>()
|
|
22
|
+
const { get, find, seek, json } = registerSelector(
|
|
23
|
+
options.key,
|
|
24
|
+
covered,
|
|
25
|
+
target,
|
|
26
|
+
)
|
|
23
27
|
const getSelf = () => {
|
|
24
28
|
const value = options.get({ get, find, seek, json })
|
|
25
29
|
cacheValue(options.key, value, subject, newest(store))
|
|
30
|
+
covered.clear()
|
|
26
31
|
return value
|
|
27
32
|
}
|
|
28
33
|
|
|
@@ -21,13 +21,15 @@ export const createWritableSelector = <T>(
|
|
|
21
21
|
): WritableSelectorToken<T> => {
|
|
22
22
|
const target = newest(store)
|
|
23
23
|
const subject = new Subject<{ newValue: T; oldValue: T }>()
|
|
24
|
-
const
|
|
24
|
+
const covered = new Set<string>()
|
|
25
|
+
const transactors = registerSelector(options.key, covered, target)
|
|
25
26
|
const { find, get, seek, json } = transactors
|
|
26
27
|
const readonlyTransactors = { find, get, seek, json }
|
|
27
28
|
|
|
28
29
|
const getSelf = (innerTarget = newest(store)): T => {
|
|
29
30
|
const value = options.get(readonlyTransactors)
|
|
30
31
|
cacheValue(options.key, value, subject, innerTarget)
|
|
32
|
+
covered.clear()
|
|
31
33
|
return value
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
MoleculeConstructor,
|
|
3
|
+
MoleculeToken,
|
|
4
|
+
ReadableToken,
|
|
5
|
+
Transactors,
|
|
6
|
+
} from "atom.io"
|
|
2
7
|
import type { findState } from "atom.io/ephemeral"
|
|
3
8
|
import type { seekState } from "atom.io/immortal"
|
|
4
9
|
|
|
5
10
|
import { findInStore, seekInStore } from "../families"
|
|
11
|
+
import { getFromStore } from "../get-state"
|
|
6
12
|
import { readOrComputeValue } from "../get-state/read-or-compute-value"
|
|
7
13
|
import { newest } from "../lineage"
|
|
8
14
|
import { getJsonToken } from "../mutable"
|
|
@@ -13,11 +19,16 @@ import { updateSelectorAtoms } from "./update-selector-atoms"
|
|
|
13
19
|
|
|
14
20
|
export const registerSelector = (
|
|
15
21
|
selectorKey: string,
|
|
22
|
+
covered: Set<string>,
|
|
16
23
|
store: Store,
|
|
17
24
|
): Transactors => ({
|
|
18
|
-
get: (dependency) => {
|
|
25
|
+
get: (dependency: MoleculeToken<MoleculeConstructor> | ReadableToken<any>) => {
|
|
19
26
|
const target = newest(store)
|
|
20
27
|
|
|
28
|
+
if (dependency.type === `molecule`) {
|
|
29
|
+
return getFromStore(dependency, store)
|
|
30
|
+
}
|
|
31
|
+
|
|
21
32
|
const dependencyState = withdraw(dependency, store)
|
|
22
33
|
const dependencyValue = readOrComputeValue(dependencyState, store)
|
|
23
34
|
|
|
@@ -39,7 +50,7 @@ export const registerSelector = (
|
|
|
39
50
|
source: dependency.key,
|
|
40
51
|
},
|
|
41
52
|
)
|
|
42
|
-
updateSelectorAtoms(selectorKey, dependency, store)
|
|
53
|
+
updateSelectorAtoms(selectorKey, dependency, covered, store)
|
|
43
54
|
return dependencyValue
|
|
44
55
|
},
|
|
45
56
|
set: (WritableToken, newValue) => {
|
|
@@ -4,8 +4,8 @@ import { isAtomKey } from "../keys"
|
|
|
4
4
|
import { getSelectorDependencyKeys } from "./get-selector-dependency-keys"
|
|
5
5
|
|
|
6
6
|
export const traceSelectorAtoms = (
|
|
7
|
-
selectorKey: string,
|
|
8
7
|
directDependencyKey: StateKey<unknown>,
|
|
8
|
+
covered: Set<string>,
|
|
9
9
|
store: Store,
|
|
10
10
|
): AtomKey<unknown>[] => {
|
|
11
11
|
const rootKeys: AtomKey<unknown>[] = []
|
|
@@ -14,16 +14,13 @@ export const traceSelectorAtoms = (
|
|
|
14
14
|
directDependencyKey,
|
|
15
15
|
store,
|
|
16
16
|
)
|
|
17
|
-
let depth = 0
|
|
18
17
|
while (indirectDependencyKeys.length > 0) {
|
|
19
18
|
// biome-ignore lint/style/noNonNullAssertion: just checked length ^^^
|
|
20
19
|
const indirectDependencyKey = indirectDependencyKeys.shift()!
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
throw new Error(
|
|
24
|
-
`Maximum selector dependency depth exceeded (> 99999) in selector "${selectorKey}". This is likely due to a circular dependency.`,
|
|
25
|
-
)
|
|
20
|
+
if (covered.has(indirectDependencyKey)) {
|
|
21
|
+
continue
|
|
26
22
|
}
|
|
23
|
+
covered.add(indirectDependencyKey)
|
|
27
24
|
|
|
28
25
|
if (!isAtomKey(indirectDependencyKey, store)) {
|
|
29
26
|
indirectDependencyKeys.push(
|
|
@@ -43,9 +40,10 @@ export const traceAllSelectorAtoms = (
|
|
|
43
40
|
): AtomKey<unknown>[] => {
|
|
44
41
|
const selectorKey = selector.key
|
|
45
42
|
const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store)
|
|
43
|
+
const covered = new Set<string>()
|
|
46
44
|
return directDependencyKeys.flatMap((depKey) =>
|
|
47
45
|
isAtomKey(depKey, store)
|
|
48
46
|
? depKey
|
|
49
|
-
: traceSelectorAtoms(
|
|
47
|
+
: traceSelectorAtoms(depKey, covered, store),
|
|
50
48
|
)
|
|
51
49
|
}
|
|
@@ -7,6 +7,7 @@ import { traceSelectorAtoms } from "./trace-selector-atoms"
|
|
|
7
7
|
export const updateSelectorAtoms = (
|
|
8
8
|
selectorKey: string,
|
|
9
9
|
dependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>,
|
|
10
|
+
covered: Set<string>,
|
|
10
11
|
store: Store,
|
|
11
12
|
): void => {
|
|
12
13
|
const target = newest(store)
|
|
@@ -22,7 +23,7 @@ export const updateSelectorAtoms = (
|
|
|
22
23
|
`discovers root atom "${dependency.key}"`,
|
|
23
24
|
)
|
|
24
25
|
} else {
|
|
25
|
-
const rootKeys = traceSelectorAtoms(
|
|
26
|
+
const rootKeys = traceSelectorAtoms(dependency.key, covered, store)
|
|
26
27
|
store.logger.info(
|
|
27
28
|
`🔍`,
|
|
28
29
|
`selector`,
|
|
@@ -38,4 +39,5 @@ export const updateSelectorAtoms = (
|
|
|
38
39
|
})
|
|
39
40
|
}
|
|
40
41
|
}
|
|
42
|
+
covered.add(dependency.key)
|
|
41
43
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atom.io",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.8",
|
|
4
4
|
"description": "Composable and testable reactive data library.",
|
|
5
5
|
"homepage": "https://atom.io.fyi",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -56,8 +56,8 @@
|
|
|
56
56
|
"@types/npmlog": "7.0.0",
|
|
57
57
|
"@types/react": "18.3.3",
|
|
58
58
|
"@types/tmp": "0.2.6",
|
|
59
|
-
"@typescript-eslint/parser": "7.
|
|
60
|
-
"@typescript-eslint/rule-tester": "7.
|
|
59
|
+
"@typescript-eslint/parser": "7.14.1",
|
|
60
|
+
"@typescript-eslint/rule-tester": "7.14.1",
|
|
61
61
|
"@vitest/coverage-v8": "1.6.0",
|
|
62
62
|
"@vitest/ui": "1.6.0",
|
|
63
63
|
"concurrently": "8.2.2",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"drizzle-orm": "0.31.2",
|
|
66
66
|
"eslint": "npm:eslint@8.57.0",
|
|
67
67
|
"eslint-v9": "npm:eslint@9.5.0",
|
|
68
|
-
"framer-motion": "11.2.
|
|
68
|
+
"framer-motion": "11.2.12",
|
|
69
69
|
"happy-dom": "14.12.3",
|
|
70
70
|
"http-proxy": "1.18.1",
|
|
71
71
|
"npmlog": "7.0.1",
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"preact": "10.22.0",
|
|
74
74
|
"react": "18.3.1",
|
|
75
75
|
"react-dom": "18.3.1",
|
|
76
|
-
"react-router-dom": "6.
|
|
76
|
+
"react-router-dom": "6.24.0",
|
|
77
77
|
"socket.io": "4.7.5",
|
|
78
78
|
"socket.io-client": "4.7.5",
|
|
79
79
|
"tmp": "0.2.3",
|