atom.io 0.21.1 → 0.22.0
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/data/dist/index.cjs +136 -63
- package/data/dist/index.d.ts +6 -0
- package/data/dist/index.js +3 -3
- package/data/src/join.ts +135 -51
- package/data/src/struct-family.ts +2 -2
- package/dist/{chunk-RT43TVKP.js → chunk-GVHKIJ3G.js} +1 -1
- package/dist/{chunk-HITX3MO4.js → chunk-JA4V7TJY.js} +135 -62
- package/dist/index.cjs +2 -7
- package/dist/index.d.ts +29 -14
- package/dist/index.js +4 -8
- package/ephemeral/dist/index.cjs +11 -0
- package/ephemeral/dist/index.js +9 -0
- package/ephemeral/package.json +16 -0
- package/ephemeral/src/index.ts +1 -0
- package/eslint-plugin/dist/index.cjs +156 -1
- package/eslint-plugin/dist/index.js +156 -1
- package/eslint-plugin/src/rules/index.ts +1 -0
- package/eslint-plugin/src/rules/lifespan.ts +204 -0
- package/eslint-plugin/src/rules/synchronous-selector-dependencies.ts +1 -65
- package/eslint-plugin/src/walk.ts +73 -0
- package/immortal/dist/index.cjs +100 -0
- package/immortal/dist/index.js +97 -0
- package/immortal/package.json +16 -0
- package/immortal/src/index.ts +2 -0
- package/immortal/src/molecule.ts +134 -0
- package/immortal/src/seek-state.ts +60 -0
- package/internal/dist/index.cjs +186 -146
- package/internal/dist/index.d.ts +29 -13
- package/internal/dist/index.js +185 -146
- package/internal/src/atom/dispose-atom.ts +4 -1
- package/internal/src/families/create-readonly-selector-family.ts +9 -9
- package/internal/src/families/create-regular-atom-family.ts +15 -20
- package/internal/src/families/create-writable-selector-family.ts +6 -7
- package/internal/src/families/find-in-store.ts +11 -5
- package/internal/src/families/index.ts +2 -0
- package/internal/src/families/init-family-member.ts +91 -0
- package/internal/src/families/seek-in-store.ts +106 -0
- package/internal/src/get-state/get-from-store.ts +2 -2
- package/internal/src/mutable/create-mutable-atom-family.ts +17 -23
- package/internal/src/mutable/create-mutable-atom.ts +3 -1
- package/internal/src/mutable/get-json-family.ts +2 -2
- package/internal/src/mutable/get-json-token.ts +27 -12
- package/internal/src/mutable/tracker-family.ts +14 -12
- package/internal/src/not-found-error.ts +11 -3
- package/internal/src/selector/create-readonly-selector.ts +2 -2
- package/internal/src/selector/create-writable-selector.ts +2 -2
- package/internal/src/selector/dispose-selector.ts +40 -23
- package/internal/src/selector/register-selector.ts +8 -5
- package/internal/src/set-state/set-into-store.ts +2 -2
- package/internal/src/store/index.ts +0 -1
- package/internal/src/store/store.ts +18 -5
- package/internal/src/subscribe/subscribe-to-state.ts +2 -2
- package/internal/src/transaction/build-transaction.ts +7 -2
- package/introspection/dist/index.cjs +38 -52
- package/introspection/dist/index.js +38 -52
- package/introspection/src/attach-atom-index.ts +38 -48
- package/introspection/src/attach-selector-index.ts +45 -50
- package/json/dist/index.cjs +38 -4
- package/json/dist/index.js +40 -6
- package/json/src/select-json-family.ts +46 -7
- package/package.json +30 -10
- package/react/dist/index.cjs +1 -1
- package/react/dist/index.js +1 -1
- package/react/src/use-json.ts +1 -1
- package/react-devtools/dist/index.cjs +11 -10
- package/react-devtools/dist/index.js +2 -1
- package/react-devtools/src/StateIndex.tsx +2 -1
- package/react-devtools/src/TimelineIndex.tsx +2 -1
- package/react-devtools/src/TransactionIndex.tsx +7 -7
- package/realtime-client/dist/index.cjs +3 -3
- package/realtime-client/dist/index.js +3 -3
- package/realtime-client/src/pull-mutable-atom-family-member.ts +1 -1
- package/realtime-client/src/pull-mutable-atom.ts +1 -1
- package/realtime-client/src/sync-continuity.ts +1 -2
- package/realtime-react/dist/index.cjs +1 -1
- package/realtime-react/dist/index.js +1 -1
- package/realtime-server/dist/index.cjs +18 -17
- package/realtime-server/dist/index.js +7 -6
- package/realtime-server/src/realtime-continuity-synchronizer.ts +5 -3
- package/realtime-server/src/realtime-mutable-family-provider.ts +2 -1
- package/realtime-server/src/realtime-mutable-provider.ts +1 -1
- package/realtime-testing/dist/index.cjs +6 -2
- package/realtime-testing/dist/index.js +8 -5
- package/realtime-testing/src/setup-realtime-test.tsx +5 -2
- package/src/atom.ts +10 -4
- package/src/index.ts +1 -2
- package/src/selector.ts +10 -4
- package/src/silo.ts +3 -3
- package/src/transaction.ts +5 -2
- package/internal/src/store/withdraw-new-family-member.ts +0 -69
- /package/{src → ephemeral/src}/find-state.ts +0 -0
- /package/src/{dispose.ts → dispose-state.ts} +0 -0
package/internal/dist/index.cjs
CHANGED
|
@@ -391,7 +391,7 @@ function isChildStore(store) {
|
|
|
391
391
|
|
|
392
392
|
// internal/src/store/store.ts
|
|
393
393
|
var Store = class {
|
|
394
|
-
constructor(
|
|
394
|
+
constructor(config, store = null) {
|
|
395
395
|
this.parent = null;
|
|
396
396
|
this.child = null;
|
|
397
397
|
this.valueMap = /* @__PURE__ */ new Map();
|
|
@@ -420,6 +420,8 @@ var Store = class {
|
|
|
420
420
|
makeContentKey: (...keys) => keys.sort().join(`:`)
|
|
421
421
|
}
|
|
422
422
|
);
|
|
423
|
+
this.molecules = /* @__PURE__ */ new Map();
|
|
424
|
+
this.miscResources = /* @__PURE__ */ new Map();
|
|
423
425
|
this.on = {
|
|
424
426
|
atomCreation: new Subject(),
|
|
425
427
|
atomDisposal: new Subject(),
|
|
@@ -441,7 +443,8 @@ var Store = class {
|
|
|
441
443
|
})
|
|
442
444
|
};
|
|
443
445
|
this.config = {
|
|
444
|
-
name: `IMPLICIT_STORE
|
|
446
|
+
name: `IMPLICIT_STORE`,
|
|
447
|
+
lifespan: `ephemeral`
|
|
445
448
|
};
|
|
446
449
|
this.loggers = [
|
|
447
450
|
new atom_io.AtomIOLogger(`warn`, (_, __, key) => !key.includes(`\u{1F441}\u200D\u{1F5E8}`))
|
|
@@ -471,9 +474,7 @@ var Store = class {
|
|
|
471
474
|
)
|
|
472
475
|
};
|
|
473
476
|
}
|
|
474
|
-
this.config =
|
|
475
|
-
name
|
|
476
|
-
});
|
|
477
|
+
this.config = __spreadValues(__spreadValues({}, store == null ? void 0 : store.config), config);
|
|
477
478
|
for (const [, family] of store.families) {
|
|
478
479
|
family.install(this);
|
|
479
480
|
}
|
|
@@ -484,7 +485,7 @@ var Store = class {
|
|
|
484
485
|
}
|
|
485
486
|
atom.install(this);
|
|
486
487
|
if (atom.type === `mutable_atom`) {
|
|
487
|
-
const originalJsonToken = getJsonToken(atom);
|
|
488
|
+
const originalJsonToken = getJsonToken(atom, store);
|
|
488
489
|
const originalUpdateToken = getUpdateToken(atom);
|
|
489
490
|
mutableHelpers.add(originalJsonToken.key);
|
|
490
491
|
mutableHelpers.add(originalUpdateToken.key);
|
|
@@ -512,12 +513,18 @@ var IMPLICIT = {
|
|
|
512
513
|
STORE_INTERNAL: void 0,
|
|
513
514
|
get STORE() {
|
|
514
515
|
var _a;
|
|
515
|
-
return (_a = this.STORE_INTERNAL) != null ? _a : this.STORE_INTERNAL = new Store(
|
|
516
|
+
return (_a = this.STORE_INTERNAL) != null ? _a : this.STORE_INTERNAL = new Store({
|
|
517
|
+
name: `IMPLICIT_STORE`,
|
|
518
|
+
lifespan: `ephemeral`
|
|
519
|
+
});
|
|
516
520
|
}
|
|
517
521
|
};
|
|
518
522
|
var clearStore = (store) => {
|
|
519
523
|
const { config } = store;
|
|
520
|
-
|
|
524
|
+
for (const disposable of store.miscResources.values()) {
|
|
525
|
+
disposable[Symbol.dispose]();
|
|
526
|
+
}
|
|
527
|
+
Object.assign(store, new Store(config));
|
|
521
528
|
store.config = config;
|
|
522
529
|
};
|
|
523
530
|
|
|
@@ -558,36 +565,6 @@ function withdraw(token, store) {
|
|
|
558
565
|
throw new NotFoundError(token, store);
|
|
559
566
|
}
|
|
560
567
|
|
|
561
|
-
// internal/src/store/withdraw-new-family-member.ts
|
|
562
|
-
function withdrawOrCreate(token, store) {
|
|
563
|
-
try {
|
|
564
|
-
const state = withdraw(token, store);
|
|
565
|
-
return state;
|
|
566
|
-
} catch (notFoundError) {
|
|
567
|
-
if (token.family) {
|
|
568
|
-
store.logger.info(
|
|
569
|
-
`\u{1F46A}`,
|
|
570
|
-
token.type,
|
|
571
|
-
token.key,
|
|
572
|
-
`creating new family member in store "${store.config.name}"`
|
|
573
|
-
);
|
|
574
|
-
const target = newest(store);
|
|
575
|
-
const family = target.families.get(token.family.key);
|
|
576
|
-
if (family) {
|
|
577
|
-
const jsonSubKey = JSON.parse(token.family.subKey);
|
|
578
|
-
family(jsonSubKey);
|
|
579
|
-
const state = withdraw(token, store);
|
|
580
|
-
return state;
|
|
581
|
-
}
|
|
582
|
-
throw new NotFoundError(
|
|
583
|
-
{ key: token.family.key, type: `${token.type}_family` },
|
|
584
|
-
store
|
|
585
|
-
);
|
|
586
|
-
}
|
|
587
|
-
throw notFoundError;
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
|
|
591
568
|
// internal/src/get-state/read-or-compute-value.ts
|
|
592
569
|
var readOrComputeValue = (state, target) => {
|
|
593
570
|
if (target.valueMap.has(state.key)) {
|
|
@@ -615,22 +592,17 @@ function createRegularAtomFamily(options, store) {
|
|
|
615
592
|
const subKey = json.stringifyJson(key);
|
|
616
593
|
const family = { key: options.key, subKey };
|
|
617
594
|
const fullKey = `${options.key}(${subKey})`;
|
|
618
|
-
const
|
|
619
|
-
const
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
default: options.default instanceof Function ? options.default(key) : options.default
|
|
627
|
-
};
|
|
628
|
-
if (options.effects) {
|
|
629
|
-
individualOptions.effects = options.effects(key);
|
|
630
|
-
}
|
|
631
|
-
token = createRegularAtom(individualOptions, family, store);
|
|
632
|
-
subject.next(token);
|
|
595
|
+
const target = newest(store);
|
|
596
|
+
const def = options.default;
|
|
597
|
+
const individualOptions = {
|
|
598
|
+
key: fullKey,
|
|
599
|
+
default: def instanceof Function ? def(key) : def
|
|
600
|
+
};
|
|
601
|
+
if (options.effects) {
|
|
602
|
+
individualOptions.effects = options.effects(key);
|
|
633
603
|
}
|
|
604
|
+
const token = createRegularAtom(individualOptions, family, target);
|
|
605
|
+
subject.next(token);
|
|
634
606
|
return token;
|
|
635
607
|
},
|
|
636
608
|
{
|
|
@@ -640,8 +612,7 @@ function createRegularAtomFamily(options, store) {
|
|
|
640
612
|
install: (s) => createRegularAtomFamily(options, s)
|
|
641
613
|
}
|
|
642
614
|
);
|
|
643
|
-
|
|
644
|
-
target.families.set(options.key, atomFamily);
|
|
615
|
+
store.families.set(options.key, atomFamily);
|
|
645
616
|
return atomFamily;
|
|
646
617
|
}
|
|
647
618
|
|
|
@@ -657,22 +628,20 @@ function createReadonlySelectorFamily(options, store) {
|
|
|
657
628
|
const subject = new Subject();
|
|
658
629
|
const readonlySelectorFamily = Object.assign(
|
|
659
630
|
(key) => {
|
|
660
|
-
const target = newest(store);
|
|
661
631
|
const subKey = json.stringifyJson(key);
|
|
662
632
|
const family = { key: options.key, subKey };
|
|
663
633
|
const fullKey = `${options.key}(${subKey})`;
|
|
664
|
-
const
|
|
665
|
-
|
|
666
|
-
return deposit(existing);
|
|
667
|
-
}
|
|
668
|
-
return createReadonlySelector(
|
|
634
|
+
const target = newest(store);
|
|
635
|
+
const token = createReadonlySelector(
|
|
669
636
|
{
|
|
670
637
|
key: fullKey,
|
|
671
638
|
get: options.get(key)
|
|
672
639
|
},
|
|
673
640
|
family,
|
|
674
|
-
|
|
641
|
+
target
|
|
675
642
|
);
|
|
643
|
+
subject.next(token);
|
|
644
|
+
return token;
|
|
676
645
|
},
|
|
677
646
|
{
|
|
678
647
|
key: options.key,
|
|
@@ -691,10 +660,7 @@ function createWritableSelectorFamily(options, store) {
|
|
|
691
660
|
const subKey = json.stringifyJson(key);
|
|
692
661
|
const family = { key: options.key, subKey };
|
|
693
662
|
const fullKey = `${options.key}(${subKey})`;
|
|
694
|
-
const
|
|
695
|
-
if (existing) {
|
|
696
|
-
return deposit(existing);
|
|
697
|
-
}
|
|
663
|
+
const target = newest(store);
|
|
698
664
|
const token = createWritableSelector(
|
|
699
665
|
{
|
|
700
666
|
key: fullKey,
|
|
@@ -702,7 +668,7 @@ function createWritableSelectorFamily(options, store) {
|
|
|
702
668
|
set: options.set(key)
|
|
703
669
|
},
|
|
704
670
|
family,
|
|
705
|
-
|
|
671
|
+
target
|
|
706
672
|
);
|
|
707
673
|
subject.next(token);
|
|
708
674
|
return token;
|
|
@@ -730,10 +696,18 @@ function createSelectorFamily(options, store) {
|
|
|
730
696
|
// internal/src/not-found-error.ts
|
|
731
697
|
var capitalize = (str) => str[0].toUpperCase() + str.slice(1);
|
|
732
698
|
function prettyPrintTokenType(token) {
|
|
733
|
-
|
|
734
|
-
|
|
699
|
+
switch (token.type) {
|
|
700
|
+
case `atom_family`:
|
|
701
|
+
return `Atom Family`;
|
|
702
|
+
case `readonly_selector`:
|
|
703
|
+
return `Readonly Selector`;
|
|
704
|
+
case `readonly_selector_family`:
|
|
705
|
+
return `Readonly Selector Family`;
|
|
706
|
+
case `selector_family`:
|
|
707
|
+
return `Selector Family`;
|
|
708
|
+
default:
|
|
709
|
+
return capitalize(token.type);
|
|
735
710
|
}
|
|
736
|
-
return capitalize(token.type);
|
|
737
711
|
}
|
|
738
712
|
var NotFoundError = class extends Error {
|
|
739
713
|
constructor(token, store) {
|
|
@@ -743,8 +717,8 @@ var NotFoundError = class extends Error {
|
|
|
743
717
|
}
|
|
744
718
|
};
|
|
745
719
|
|
|
746
|
-
// internal/src/families/
|
|
747
|
-
function
|
|
720
|
+
// internal/src/families/init-family-member.ts
|
|
721
|
+
function initFamilyMember(token, key, store) {
|
|
748
722
|
const familyKey = token.key;
|
|
749
723
|
const family = store.families.get(familyKey);
|
|
750
724
|
if (family === void 0) {
|
|
@@ -753,6 +727,44 @@ function findInStore(token, key, store) {
|
|
|
753
727
|
const state = family(key);
|
|
754
728
|
return state;
|
|
755
729
|
}
|
|
730
|
+
function seekInStore(token, key, store) {
|
|
731
|
+
const subKey = json.stringifyJson(key);
|
|
732
|
+
const fullKey = `${token.key}(${subKey})`;
|
|
733
|
+
const target = newest(store);
|
|
734
|
+
let state;
|
|
735
|
+
switch (token.type) {
|
|
736
|
+
case `atom_family`:
|
|
737
|
+
case `mutable_atom_family`:
|
|
738
|
+
state = target.atoms.get(fullKey);
|
|
739
|
+
break;
|
|
740
|
+
case `selector_family`: {
|
|
741
|
+
state = target.selectors.get(fullKey);
|
|
742
|
+
break;
|
|
743
|
+
}
|
|
744
|
+
case `readonly_selector_family`:
|
|
745
|
+
state = target.readonlySelectors.get(fullKey);
|
|
746
|
+
break;
|
|
747
|
+
}
|
|
748
|
+
if (state) {
|
|
749
|
+
return deposit(state);
|
|
750
|
+
}
|
|
751
|
+
return state;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
// internal/src/families/find-in-store.ts
|
|
755
|
+
function findInStore(token, key, store) {
|
|
756
|
+
if (store.config.lifespan === `immortal`) {
|
|
757
|
+
throw new Error(
|
|
758
|
+
`Do not use \`find\` or \`findState\` in an immortal store. Prefer \`seek\` or \`seekState\`.`
|
|
759
|
+
);
|
|
760
|
+
}
|
|
761
|
+
let state = seekInStore(token, key, store);
|
|
762
|
+
if (state) {
|
|
763
|
+
return state;
|
|
764
|
+
}
|
|
765
|
+
state = initFamilyMember(token, key, store);
|
|
766
|
+
return state;
|
|
767
|
+
}
|
|
756
768
|
|
|
757
769
|
// internal/src/set-state/become.ts
|
|
758
770
|
var become = (nextVersionOfThing) => (originalThing) => nextVersionOfThing instanceof Function ? nextVersionOfThing(
|
|
@@ -995,7 +1007,7 @@ function setIntoStore(token, value, store) {
|
|
|
995
1007
|
);
|
|
996
1008
|
return;
|
|
997
1009
|
}
|
|
998
|
-
const state =
|
|
1010
|
+
const state = withdraw(token, store);
|
|
999
1011
|
setAtomOrSelector(state, value, store);
|
|
1000
1012
|
closeOperation(store);
|
|
1001
1013
|
}
|
|
@@ -1081,7 +1093,7 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
|
1081
1093
|
var registerSelector = (selectorKey, store) => ({
|
|
1082
1094
|
get: (dependency) => {
|
|
1083
1095
|
const target = newest(store);
|
|
1084
|
-
const dependencyState =
|
|
1096
|
+
const dependencyState = withdraw(dependency, store);
|
|
1085
1097
|
const dependencyValue = readOrComputeValue(dependencyState, store);
|
|
1086
1098
|
store.logger.info(
|
|
1087
1099
|
`\u{1F50C}`,
|
|
@@ -1104,19 +1116,20 @@ var registerSelector = (selectorKey, store) => ({
|
|
|
1104
1116
|
return dependencyValue;
|
|
1105
1117
|
},
|
|
1106
1118
|
set: (WritableToken, newValue) => {
|
|
1107
|
-
const state =
|
|
1119
|
+
const state = withdraw(WritableToken, store);
|
|
1108
1120
|
setAtomOrSelector(state, newValue, store);
|
|
1109
1121
|
},
|
|
1110
|
-
find: (token, key) => findInStore(token, key, store)
|
|
1122
|
+
find: (token, key) => findInStore(token, key, store),
|
|
1123
|
+
seek: (token, key) => seekInStore(token, key, store)
|
|
1111
1124
|
});
|
|
1112
1125
|
|
|
1113
1126
|
// internal/src/selector/create-readonly-selector.ts
|
|
1114
1127
|
var createReadonlySelector = (options, family, store) => {
|
|
1115
1128
|
const target = newest(store);
|
|
1116
1129
|
const subject = new Subject();
|
|
1117
|
-
const { get, find } = registerSelector(options.key, target);
|
|
1130
|
+
const { get, find, seek } = registerSelector(options.key, target);
|
|
1118
1131
|
const getSelf = () => {
|
|
1119
|
-
const value = options.get({ get, find });
|
|
1132
|
+
const value = options.get({ get, find, seek });
|
|
1120
1133
|
cacheValue(options.key, value, subject, newest(store));
|
|
1121
1134
|
return value;
|
|
1122
1135
|
};
|
|
@@ -1151,8 +1164,8 @@ var createWritableSelector = (options, family, store) => {
|
|
|
1151
1164
|
const target = newest(store);
|
|
1152
1165
|
const subject = new Subject();
|
|
1153
1166
|
const transactors = registerSelector(options.key, target);
|
|
1154
|
-
const { find, get } = transactors;
|
|
1155
|
-
const readonlyTransactors = { find, get };
|
|
1167
|
+
const { find, get, seek } = transactors;
|
|
1168
|
+
const readonlyTransactors = { find, get, seek };
|
|
1156
1169
|
const getSelf = () => {
|
|
1157
1170
|
const value = options.get(readonlyTransactors);
|
|
1158
1171
|
cacheValue(options.key, value, subject, newest(store));
|
|
@@ -1210,32 +1223,50 @@ function createStandaloneSelector(options, store) {
|
|
|
1210
1223
|
|
|
1211
1224
|
// internal/src/selector/dispose-selector.ts
|
|
1212
1225
|
function disposeSelector(selectorToken, store) {
|
|
1226
|
+
var _a;
|
|
1213
1227
|
const target = newest(store);
|
|
1214
1228
|
const { key } = selectorToken;
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
+
const selector = (_a = target.selectors.get(key)) != null ? _a : target.readonlySelectors.get(key);
|
|
1230
|
+
if (!selector) {
|
|
1231
|
+
store.logger.error(
|
|
1232
|
+
`\u274C`,
|
|
1233
|
+
`selector`,
|
|
1234
|
+
key,
|
|
1235
|
+
`Tried to dispose selector, but it does not exist in the store.`
|
|
1236
|
+
);
|
|
1237
|
+
} else if (!selector.family) {
|
|
1238
|
+
store.logger.error(
|
|
1239
|
+
`\u274C`,
|
|
1240
|
+
`selector`,
|
|
1241
|
+
key,
|
|
1242
|
+
`Standalone selectors cannot be disposed.`
|
|
1243
|
+
);
|
|
1244
|
+
} else {
|
|
1245
|
+
switch (selectorToken.type) {
|
|
1246
|
+
case `selector`:
|
|
1247
|
+
target.selectors.delete(key);
|
|
1248
|
+
break;
|
|
1249
|
+
case `readonly_selector`:
|
|
1250
|
+
target.readonlySelectors.delete(key);
|
|
1251
|
+
break;
|
|
1229
1252
|
}
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1253
|
+
target.valueMap.delete(key);
|
|
1254
|
+
target.selectorAtoms.delete(key);
|
|
1255
|
+
const downstreamTokens = target.selectorGraph.getRelationEntries({ upstreamSelectorKey: key }).filter(([_, { source }]) => source === key).map(
|
|
1256
|
+
([downstreamSelectorKey]) => {
|
|
1257
|
+
var _a2;
|
|
1258
|
+
return (_a2 = target.selectors.get(downstreamSelectorKey)) != null ? _a2 : target.readonlySelectors.get(downstreamSelectorKey);
|
|
1259
|
+
}
|
|
1260
|
+
);
|
|
1261
|
+
for (const downstreamToken of downstreamTokens) {
|
|
1262
|
+
if (downstreamToken) {
|
|
1263
|
+
disposeSelector(downstreamToken, store);
|
|
1264
|
+
}
|
|
1234
1265
|
}
|
|
1266
|
+
target.selectorGraph.delete(key);
|
|
1267
|
+
store.logger.info(`\u{1F525}`, selectorToken.type, key, `deleted`);
|
|
1268
|
+
store.on.selectorDisposal.next(selectorToken);
|
|
1235
1269
|
}
|
|
1236
|
-
target.selectorGraph.delete(key);
|
|
1237
|
-
store.logger.info(`\u{1F525}`, selectorToken.type, key, `deleted`);
|
|
1238
|
-
store.on.selectorDisposal.next(selectorToken);
|
|
1239
1270
|
}
|
|
1240
1271
|
|
|
1241
1272
|
// internal/src/subscribe/recall-state.ts
|
|
@@ -1306,7 +1337,7 @@ function subscribeToState(token, handleUpdate, key, store) {
|
|
|
1306
1337
|
handleUpdate(update);
|
|
1307
1338
|
}
|
|
1308
1339
|
}
|
|
1309
|
-
const state =
|
|
1340
|
+
const state = withdraw(token, store);
|
|
1310
1341
|
store.logger.info(`\u{1F440}`, state.type, state.key, `Adding subscription "${key}"`);
|
|
1311
1342
|
const isSelector = state.type === `selector` || state.type === `readonly_selector`;
|
|
1312
1343
|
let dependencyUnsubFunctions = null;
|
|
@@ -1567,37 +1598,41 @@ function createMutableAtom(options, family, store) {
|
|
|
1567
1598
|
};
|
|
1568
1599
|
}
|
|
1569
1600
|
new Tracker(token, store);
|
|
1570
|
-
|
|
1601
|
+
if (!family) {
|
|
1602
|
+
json.selectJson(token, options, store);
|
|
1603
|
+
}
|
|
1571
1604
|
store.on.atomCreation.next(token);
|
|
1572
1605
|
return token;
|
|
1573
1606
|
}
|
|
1574
1607
|
var FamilyTracker = class {
|
|
1575
|
-
constructor(
|
|
1576
|
-
this.
|
|
1608
|
+
constructor(mutableAtoms, store) {
|
|
1609
|
+
this.latestUpdateAtoms = createRegularAtomFamily(
|
|
1577
1610
|
{
|
|
1578
|
-
key: `*${
|
|
1611
|
+
key: `*${mutableAtoms.key}`,
|
|
1579
1612
|
default: null
|
|
1580
1613
|
},
|
|
1581
1614
|
store
|
|
1582
1615
|
);
|
|
1583
|
-
this.
|
|
1584
|
-
this.
|
|
1616
|
+
this.mutableAtoms = mutableAtoms;
|
|
1617
|
+
this.mutableAtoms.subject.subscribe(
|
|
1585
1618
|
`store=${store.config.name}::tracker-atom-family`,
|
|
1586
1619
|
(atomToken) => {
|
|
1587
1620
|
if (atomToken.family) {
|
|
1588
1621
|
const key = json.parseJson(atomToken.family.subKey);
|
|
1589
|
-
this.
|
|
1622
|
+
seekInStore(this.latestUpdateAtoms, key, store);
|
|
1590
1623
|
new Tracker(atomToken, store);
|
|
1591
1624
|
}
|
|
1592
1625
|
}
|
|
1593
1626
|
);
|
|
1594
|
-
this.
|
|
1627
|
+
this.latestUpdateAtoms.subject.subscribe(
|
|
1595
1628
|
`store=${store.config.name}::tracker-atom-family`,
|
|
1596
1629
|
(atomToken) => {
|
|
1597
1630
|
if (atomToken.family) {
|
|
1598
1631
|
const key = json.parseJson(atomToken.family.subKey);
|
|
1599
|
-
const mutableAtomToken = this.
|
|
1600
|
-
|
|
1632
|
+
const mutableAtomToken = seekInStore(this.mutableAtoms, key, store);
|
|
1633
|
+
if (mutableAtomToken) {
|
|
1634
|
+
new Tracker(mutableAtomToken, store);
|
|
1635
|
+
}
|
|
1601
1636
|
}
|
|
1602
1637
|
}
|
|
1603
1638
|
);
|
|
@@ -1612,25 +1647,19 @@ function createMutableAtomFamily(options, store) {
|
|
|
1612
1647
|
const subKey = json.stringifyJson(key);
|
|
1613
1648
|
const family = { key: options.key, subKey };
|
|
1614
1649
|
const fullKey = `${options.key}(${subKey})`;
|
|
1615
|
-
const
|
|
1616
|
-
const
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
fromJson: options.fromJson,
|
|
1626
|
-
mutable: true
|
|
1627
|
-
};
|
|
1628
|
-
if (options.effects) {
|
|
1629
|
-
individualOptions.effects = options.effects(key);
|
|
1630
|
-
}
|
|
1631
|
-
token = createMutableAtom(individualOptions, family, store);
|
|
1632
|
-
subject.next(token);
|
|
1650
|
+
const target = newest(store);
|
|
1651
|
+
const individualOptions = {
|
|
1652
|
+
key: fullKey,
|
|
1653
|
+
default: () => options.default(key),
|
|
1654
|
+
toJson: options.toJson,
|
|
1655
|
+
fromJson: options.fromJson,
|
|
1656
|
+
mutable: true
|
|
1657
|
+
};
|
|
1658
|
+
if (options.effects) {
|
|
1659
|
+
individualOptions.effects = options.effects(key);
|
|
1633
1660
|
}
|
|
1661
|
+
const token = createMutableAtom(individualOptions, family, target);
|
|
1662
|
+
subject.next(token);
|
|
1634
1663
|
return token;
|
|
1635
1664
|
},
|
|
1636
1665
|
{
|
|
@@ -1642,8 +1671,7 @@ function createMutableAtomFamily(options, store) {
|
|
|
1642
1671
|
fromJson: options.fromJson
|
|
1643
1672
|
}
|
|
1644
1673
|
);
|
|
1645
|
-
|
|
1646
|
-
target.families.set(options.key, atomFamily);
|
|
1674
|
+
store.families.set(options.key, atomFamily);
|
|
1647
1675
|
json.selectJsonFamily(atomFamily, options, store);
|
|
1648
1676
|
new FamilyTracker(atomFamily, store);
|
|
1649
1677
|
return atomFamily;
|
|
@@ -1658,19 +1686,24 @@ var getJsonFamily = (mutableAtomFamily, store) => {
|
|
|
1658
1686
|
};
|
|
1659
1687
|
|
|
1660
1688
|
// internal/src/mutable/get-json-token.ts
|
|
1661
|
-
var getJsonToken = (mutableAtomToken) => {
|
|
1662
|
-
const key = mutableAtomToken.family ? `${mutableAtomToken.family.key}:JSON(${mutableAtomToken.family.subKey})` : `${mutableAtomToken.key}:JSON`;
|
|
1663
|
-
const jsonToken = {
|
|
1664
|
-
type: `selector`,
|
|
1665
|
-
key
|
|
1666
|
-
};
|
|
1689
|
+
var getJsonToken = (mutableAtomToken, store) => {
|
|
1667
1690
|
if (mutableAtomToken.family) {
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1691
|
+
const target = newest(store);
|
|
1692
|
+
const jsonFamilyKey = `${mutableAtomToken.family.key}:JSON`;
|
|
1693
|
+
const jsonFamilyToken = {
|
|
1694
|
+
key: jsonFamilyKey,
|
|
1695
|
+
type: `selector_family`
|
|
1671
1696
|
};
|
|
1697
|
+
const family = withdraw(jsonFamilyToken, target);
|
|
1698
|
+
const subKey = JSON.parse(mutableAtomToken.family.subKey);
|
|
1699
|
+
const jsonToken = findInStore(family, subKey, store);
|
|
1700
|
+
return jsonToken;
|
|
1672
1701
|
}
|
|
1673
|
-
|
|
1702
|
+
const token = {
|
|
1703
|
+
type: `selector`,
|
|
1704
|
+
key: `${mutableAtomToken.key}:JSON`
|
|
1705
|
+
};
|
|
1706
|
+
return token;
|
|
1674
1707
|
};
|
|
1675
1708
|
|
|
1676
1709
|
// internal/src/mutable/get-update-token.ts
|
|
@@ -1866,8 +1899,10 @@ function disposeAtom(atomToken, store) {
|
|
|
1866
1899
|
`\u274C`,
|
|
1867
1900
|
`atom`,
|
|
1868
1901
|
key,
|
|
1869
|
-
`Tried to
|
|
1902
|
+
`Tried to dispose atom, but it does not exist in the store.`
|
|
1870
1903
|
);
|
|
1904
|
+
} else if (!atom.family) {
|
|
1905
|
+
store.logger.error(`\u274C`, `atom`, key, `Standalone atoms cannot be disposed.`);
|
|
1871
1906
|
} else {
|
|
1872
1907
|
(_a = atom.cleanup) == null ? void 0 : _a.call(atom);
|
|
1873
1908
|
target.atoms.delete(key);
|
|
@@ -1887,6 +1922,7 @@ function disposeAtom(atomToken, store) {
|
|
|
1887
1922
|
if (atomToken.type === `mutable_atom`) {
|
|
1888
1923
|
const updateToken = getUpdateToken(atomToken);
|
|
1889
1924
|
disposeAtom(updateToken, store);
|
|
1925
|
+
store.trackers.delete(key);
|
|
1890
1926
|
}
|
|
1891
1927
|
store.logger.info(`\u{1F525}`, `atom`, key, `deleted`);
|
|
1892
1928
|
store.on.atomDisposal.next(atomToken);
|
|
@@ -1904,7 +1940,7 @@ function getEnvironmentData(store) {
|
|
|
1904
1940
|
|
|
1905
1941
|
// internal/src/get-state/get-from-store.ts
|
|
1906
1942
|
function getFromStore(token, store) {
|
|
1907
|
-
const state =
|
|
1943
|
+
const state = withdraw(token, store);
|
|
1908
1944
|
return readOrComputeValue(state, store);
|
|
1909
1945
|
}
|
|
1910
1946
|
|
|
@@ -2458,7 +2494,9 @@ var buildTransaction = (key, params, store, id) => {
|
|
|
2458
2494
|
makeContentKey: (...keys) => keys.sort().join(`:`)
|
|
2459
2495
|
}),
|
|
2460
2496
|
selectors: new LazyMap(parent.selectors),
|
|
2461
|
-
valueMap: new LazyMap(parent.valueMap)
|
|
2497
|
+
valueMap: new LazyMap(parent.valueMap),
|
|
2498
|
+
molecules: new LazyMap(parent.molecules),
|
|
2499
|
+
miscResources: new LazyMap(parent.miscResources)
|
|
2462
2500
|
};
|
|
2463
2501
|
const epoch = getEpochNumberOfAction(key, store);
|
|
2464
2502
|
const transactionMeta = {
|
|
@@ -2478,6 +2516,7 @@ var buildTransaction = (key, params, store, id) => {
|
|
|
2478
2516
|
},
|
|
2479
2517
|
run: (token, identifier = arbitrary()) => actUponStore(token, identifier, child),
|
|
2480
2518
|
find: (token, k) => findInStore(token, k, child),
|
|
2519
|
+
seek: (token, k) => seekInStore(token, k, child),
|
|
2481
2520
|
env: () => getEnvironmentData(child)
|
|
2482
2521
|
}
|
|
2483
2522
|
};
|
|
@@ -2596,6 +2635,7 @@ exports.getUpdateToken = getUpdateToken;
|
|
|
2596
2635
|
exports.ingestAtomUpdate = ingestAtomUpdate;
|
|
2597
2636
|
exports.ingestSelectorUpdate = ingestSelectorUpdate;
|
|
2598
2637
|
exports.ingestTransactionUpdate = ingestTransactionUpdate;
|
|
2638
|
+
exports.initFamilyMember = initFamilyMember;
|
|
2599
2639
|
exports.isAtomDefault = isAtomDefault;
|
|
2600
2640
|
exports.isAtomKey = isAtomKey;
|
|
2601
2641
|
exports.isChildStore = isChildStore;
|
|
@@ -2614,6 +2654,7 @@ exports.openOperation = openOperation;
|
|
|
2614
2654
|
exports.readCachedValue = readCachedValue;
|
|
2615
2655
|
exports.readOrComputeValue = readOrComputeValue;
|
|
2616
2656
|
exports.registerSelector = registerSelector;
|
|
2657
|
+
exports.seekInStore = seekInStore;
|
|
2617
2658
|
exports.setAtomOrSelector = setAtomOrSelector;
|
|
2618
2659
|
exports.setEpochNumberOfAction = setEpochNumberOfAction;
|
|
2619
2660
|
exports.setEpochNumberOfContinuity = setEpochNumberOfContinuity;
|
|
@@ -2627,4 +2668,3 @@ exports.traceAllSelectorAtoms = traceAllSelectorAtoms;
|
|
|
2627
2668
|
exports.traceSelectorAtoms = traceSelectorAtoms;
|
|
2628
2669
|
exports.updateSelectorAtoms = updateSelectorAtoms;
|
|
2629
2670
|
exports.withdraw = withdraw;
|
|
2630
|
-
exports.withdrawOrCreate = withdrawOrCreate;
|