atom.io 0.24.7 → 0.25.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 +40 -62
- package/data/dist/index.d.ts +3 -3
- package/data/dist/index.js +41 -63
- package/data/src/join.ts +47 -64
- package/dist/index.cjs +26 -8
- package/dist/index.d.ts +37 -15
- package/dist/index.js +27 -9
- package/internal/dist/index.cjs +224 -117
- package/internal/dist/index.d.ts +12 -7
- package/internal/dist/index.js +225 -118
- package/internal/src/families/dispose-from-store.ts +56 -3
- package/internal/src/get-state/get-from-store.ts +58 -25
- package/internal/src/molecule/make-molecule-in-store.ts +59 -23
- package/internal/src/not-found-error.ts +29 -6
- package/internal/src/selector/create-readonly-selector.ts +7 -2
- package/internal/src/selector/create-writable-selector.ts +7 -5
- package/internal/src/selector/register-selector.ts +59 -9
- package/internal/src/selector/trace-selector-atoms.ts +6 -8
- package/internal/src/selector/update-selector-atoms.ts +3 -1
- package/internal/src/set-state/set-into-store.ts +48 -1
- package/internal/src/store/store.ts +4 -4
- package/internal/src/transaction/build-transaction.ts +10 -9
- package/internal/src/transaction/create-transaction.ts +2 -2
- package/internal/src/transaction/index.ts +2 -2
- package/package.json +6 -6
- package/react/dist/index.cjs +4 -1
- package/react/dist/index.js +5 -2
- package/react/src/use-o.ts +11 -3
- package/realtime/dist/index.cjs +0 -1
- package/realtime/dist/index.js +0 -1
- package/realtime/src/realtime-continuity.ts +0 -1
- package/realtime-server/dist/index.cjs +7 -7
- package/realtime-server/dist/index.js +7 -7
- package/realtime-server/src/realtime-server-stores/server-room-external-actions.ts +7 -7
- package/src/dispose-state.ts +32 -3
- package/src/get-state.ts +37 -4
- package/src/molecule.ts +20 -7
- package/src/set-state.ts +19 -2
- package/src/silo.ts +11 -4
- package/src/transaction.ts +9 -17
package/internal/dist/index.cjs
CHANGED
|
@@ -407,8 +407,6 @@ var abortTransaction = (store) => {
|
|
|
407
407
|
);
|
|
408
408
|
target.parent.child = null;
|
|
409
409
|
};
|
|
410
|
-
|
|
411
|
-
// internal/src/not-found-error.ts
|
|
412
410
|
var capitalize = (str) => str[0].toUpperCase() + str.slice(1);
|
|
413
411
|
function prettyPrintTokenType(token) {
|
|
414
412
|
switch (token.type) {
|
|
@@ -427,10 +425,19 @@ function prettyPrintTokenType(token) {
|
|
|
427
425
|
}
|
|
428
426
|
}
|
|
429
427
|
var NotFoundError = class extends Error {
|
|
430
|
-
constructor(
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
)
|
|
428
|
+
constructor(...params) {
|
|
429
|
+
const token = params[0];
|
|
430
|
+
const store = params.length === 2 ? params[1] : params[2];
|
|
431
|
+
if (params.length === 2) {
|
|
432
|
+
super(
|
|
433
|
+
`${prettyPrintTokenType(token)} "${token.key}" not found in store "${store.config.name}".`
|
|
434
|
+
);
|
|
435
|
+
} else {
|
|
436
|
+
const key = params[1];
|
|
437
|
+
super(
|
|
438
|
+
`${prettyPrintTokenType(token)} "${token.key}" member ${json.stringifyJson(key)} not found in store "${store.config.name}".`
|
|
439
|
+
);
|
|
440
|
+
}
|
|
434
441
|
}
|
|
435
442
|
};
|
|
436
443
|
|
|
@@ -690,41 +697,6 @@ var setAtomOrSelector = (state, value, store) => {
|
|
|
690
697
|
break;
|
|
691
698
|
}
|
|
692
699
|
};
|
|
693
|
-
|
|
694
|
-
// internal/src/set-state/set-into-store.ts
|
|
695
|
-
function setIntoStore(token, value, store) {
|
|
696
|
-
const rejectionTime = openOperation(token, store);
|
|
697
|
-
if (rejectionTime) {
|
|
698
|
-
const unsubscribe = store.on.operationClose.subscribe(
|
|
699
|
-
`waiting to set "${token.key}" at T-${rejectionTime}`,
|
|
700
|
-
() => {
|
|
701
|
-
unsubscribe();
|
|
702
|
-
store.logger.info(
|
|
703
|
-
`\u{1F7E2}`,
|
|
704
|
-
token.type,
|
|
705
|
-
token.key,
|
|
706
|
-
`resuming deferred setState from T-${rejectionTime}`
|
|
707
|
-
);
|
|
708
|
-
setIntoStore(token, value, store);
|
|
709
|
-
}
|
|
710
|
-
);
|
|
711
|
-
return;
|
|
712
|
-
}
|
|
713
|
-
const state = withdraw(token, store);
|
|
714
|
-
setAtomOrSelector(state, value, store);
|
|
715
|
-
closeOperation(store);
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
// internal/src/ingest-updates/ingest-atom-update.ts
|
|
719
|
-
function ingestAtomUpdate(applying, atomUpdate, store) {
|
|
720
|
-
const { key, newValue, oldValue } = atomUpdate;
|
|
721
|
-
const value = applying === `newValue` ? newValue : oldValue;
|
|
722
|
-
const token = { key, type: `atom` };
|
|
723
|
-
if (atomUpdate.family) {
|
|
724
|
-
Object.assign(token, { family: atomUpdate.family });
|
|
725
|
-
}
|
|
726
|
-
setIntoStore(token, value, store);
|
|
727
|
-
}
|
|
728
700
|
function createRegularAtomFamily(options, store) {
|
|
729
701
|
const subject = new Subject();
|
|
730
702
|
const atomFamily = Object.assign(
|
|
@@ -766,17 +738,31 @@ function createAtomFamily(options, store) {
|
|
|
766
738
|
}
|
|
767
739
|
|
|
768
740
|
// internal/src/get-state/get-from-store.ts
|
|
769
|
-
function getFromStore(
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
741
|
+
function getFromStore(...params) {
|
|
742
|
+
let token;
|
|
743
|
+
let store;
|
|
744
|
+
if (params.length === 2) {
|
|
745
|
+
token = params[0];
|
|
746
|
+
store = params[1];
|
|
747
|
+
} else {
|
|
748
|
+
const family = params[0];
|
|
749
|
+
const key = params[1];
|
|
750
|
+
store = params[2];
|
|
751
|
+
const maybeToken = family.type === `molecule_family` ? seekInStore(family, key, store) : store.config.lifespan === `immortal` ? seekInStore(family, key, store) : findInStore(family, key, store);
|
|
752
|
+
if (!maybeToken) {
|
|
753
|
+
throw new NotFoundError(family, key, store);
|
|
776
754
|
}
|
|
755
|
+
token = maybeToken;
|
|
756
|
+
}
|
|
757
|
+
switch (token.type) {
|
|
758
|
+
case `atom`:
|
|
759
|
+
case `mutable_atom`:
|
|
760
|
+
case `selector`:
|
|
761
|
+
case `readonly_selector`:
|
|
762
|
+
return readOrComputeValue(withdraw(token, store), store);
|
|
763
|
+
case `molecule`:
|
|
764
|
+
return withdraw(token, store).instance;
|
|
777
765
|
}
|
|
778
|
-
const state = withdraw(token, store);
|
|
779
|
-
return readOrComputeValue(state, store);
|
|
780
766
|
}
|
|
781
767
|
|
|
782
768
|
// internal/src/keys.ts
|
|
@@ -792,21 +778,18 @@ var getSelectorDependencyKeys = (key, store) => {
|
|
|
792
778
|
};
|
|
793
779
|
|
|
794
780
|
// internal/src/selector/trace-selector-atoms.ts
|
|
795
|
-
var traceSelectorAtoms = (
|
|
781
|
+
var traceSelectorAtoms = (directDependencyKey, covered, store) => {
|
|
796
782
|
const rootKeys = [];
|
|
797
783
|
const indirectDependencyKeys = getSelectorDependencyKeys(
|
|
798
784
|
directDependencyKey,
|
|
799
785
|
store
|
|
800
786
|
);
|
|
801
|
-
let depth = 0;
|
|
802
787
|
while (indirectDependencyKeys.length > 0) {
|
|
803
788
|
const indirectDependencyKey = indirectDependencyKeys.shift();
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
throw new Error(
|
|
807
|
-
`Maximum selector dependency depth exceeded (> 99999) in selector "${selectorKey}". This is likely due to a circular dependency.`
|
|
808
|
-
);
|
|
789
|
+
if (covered.has(indirectDependencyKey)) {
|
|
790
|
+
continue;
|
|
809
791
|
}
|
|
792
|
+
covered.add(indirectDependencyKey);
|
|
810
793
|
if (!isAtomKey(indirectDependencyKey, store)) {
|
|
811
794
|
indirectDependencyKeys.push(
|
|
812
795
|
...getSelectorDependencyKeys(indirectDependencyKey, store)
|
|
@@ -820,13 +803,14 @@ var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
|
|
|
820
803
|
var traceAllSelectorAtoms = (selector, store) => {
|
|
821
804
|
const selectorKey = selector.key;
|
|
822
805
|
const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store);
|
|
806
|
+
const covered = /* @__PURE__ */ new Set();
|
|
823
807
|
return directDependencyKeys.flatMap(
|
|
824
|
-
(depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(
|
|
808
|
+
(depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(depKey, covered, store)
|
|
825
809
|
);
|
|
826
810
|
};
|
|
827
811
|
|
|
828
812
|
// internal/src/selector/update-selector-atoms.ts
|
|
829
|
-
var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
813
|
+
var updateSelectorAtoms = (selectorKey, dependency, covered, store) => {
|
|
830
814
|
const target = newest(store);
|
|
831
815
|
if (dependency.type === `atom` || dependency.type === `mutable_atom`) {
|
|
832
816
|
target.selectorAtoms.set({
|
|
@@ -840,7 +824,7 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
|
840
824
|
`discovers root atom "${dependency.key}"`
|
|
841
825
|
);
|
|
842
826
|
} else {
|
|
843
|
-
const rootKeys = traceSelectorAtoms(
|
|
827
|
+
const rootKeys = traceSelectorAtoms(dependency.key, covered, store);
|
|
844
828
|
store.logger.info(
|
|
845
829
|
`\u{1F50D}`,
|
|
846
830
|
`selector`,
|
|
@@ -854,12 +838,21 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
|
854
838
|
});
|
|
855
839
|
}
|
|
856
840
|
}
|
|
841
|
+
covered.add(dependency.key);
|
|
857
842
|
};
|
|
858
843
|
|
|
859
844
|
// internal/src/selector/register-selector.ts
|
|
860
|
-
var registerSelector = (selectorKey, store) => ({
|
|
861
|
-
get: (dependency) => {
|
|
845
|
+
var registerSelector = (selectorKey, covered, store) => ({
|
|
846
|
+
get: (dependency, key) => {
|
|
862
847
|
const target = newest(store);
|
|
848
|
+
if (key) {
|
|
849
|
+
switch (dependency.type) {
|
|
850
|
+
case `molecule_family`:
|
|
851
|
+
return getFromStore(dependency, key, store);
|
|
852
|
+
case `atom_family`:
|
|
853
|
+
dependency = seekInStore(dependency, key, store);
|
|
854
|
+
}
|
|
855
|
+
}
|
|
863
856
|
if (dependency.type === `molecule`) {
|
|
864
857
|
return getFromStore(dependency, store);
|
|
865
858
|
}
|
|
@@ -882,13 +875,28 @@ var registerSelector = (selectorKey, store) => ({
|
|
|
882
875
|
source: dependency.key
|
|
883
876
|
}
|
|
884
877
|
);
|
|
885
|
-
updateSelectorAtoms(selectorKey, dependency, store);
|
|
878
|
+
updateSelectorAtoms(selectorKey, dependency, covered, store);
|
|
886
879
|
return dependencyValue;
|
|
887
880
|
},
|
|
888
|
-
set: (
|
|
881
|
+
set: (...params) => {
|
|
882
|
+
let token;
|
|
883
|
+
let value;
|
|
884
|
+
if (params.length === 2) {
|
|
885
|
+
token = params[0];
|
|
886
|
+
value = params[1];
|
|
887
|
+
} else {
|
|
888
|
+
const family = params[0];
|
|
889
|
+
const key = params[1];
|
|
890
|
+
value = params[2];
|
|
891
|
+
const maybeToken = store.config.lifespan === `ephemeral` ? findInStore(family, key, store) : seekInStore(family, key, store);
|
|
892
|
+
if (!maybeToken) {
|
|
893
|
+
throw new NotFoundError(family, key, store);
|
|
894
|
+
}
|
|
895
|
+
token = maybeToken;
|
|
896
|
+
}
|
|
889
897
|
const target = newest(store);
|
|
890
|
-
const state = withdraw(
|
|
891
|
-
setAtomOrSelector(state,
|
|
898
|
+
const state = withdraw(token, target);
|
|
899
|
+
setAtomOrSelector(state, value, target);
|
|
892
900
|
},
|
|
893
901
|
find: (token, key) => findInStore(token, key, store),
|
|
894
902
|
seek: (token, key) => seekInStore(token, key, store),
|
|
@@ -899,10 +907,16 @@ var registerSelector = (selectorKey, store) => ({
|
|
|
899
907
|
var createReadonlySelector = (options, family, store) => {
|
|
900
908
|
const target = newest(store);
|
|
901
909
|
const subject = new Subject();
|
|
902
|
-
const
|
|
910
|
+
const covered = /* @__PURE__ */ new Set();
|
|
911
|
+
const { get, find, seek, json } = registerSelector(
|
|
912
|
+
options.key,
|
|
913
|
+
covered,
|
|
914
|
+
target
|
|
915
|
+
);
|
|
903
916
|
const getSelf = () => {
|
|
904
917
|
const value = options.get({ get, find, seek, json });
|
|
905
918
|
cacheValue(options.key, value, subject, newest(store));
|
|
919
|
+
covered.clear();
|
|
906
920
|
return value;
|
|
907
921
|
};
|
|
908
922
|
const readonlySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
|
|
@@ -934,12 +948,14 @@ var createReadonlySelector = (options, family, store) => {
|
|
|
934
948
|
var createWritableSelector = (options, family, store) => {
|
|
935
949
|
const target = newest(store);
|
|
936
950
|
const subject = new Subject();
|
|
937
|
-
const
|
|
938
|
-
const
|
|
939
|
-
const
|
|
951
|
+
const covered = /* @__PURE__ */ new Set();
|
|
952
|
+
const toolkit = registerSelector(options.key, covered, target);
|
|
953
|
+
const { find, get, seek, json } = toolkit;
|
|
954
|
+
const getterToolkit = { find, get, seek, json };
|
|
940
955
|
const getSelf = (innerTarget = newest(store)) => {
|
|
941
|
-
const value = options.get(
|
|
956
|
+
const value = options.get(getterToolkit);
|
|
942
957
|
cacheValue(options.key, value, subject, innerTarget);
|
|
958
|
+
covered.clear();
|
|
943
959
|
return value;
|
|
944
960
|
};
|
|
945
961
|
const setSelf = (next) => {
|
|
@@ -961,7 +977,7 @@ var createWritableSelector = (options, family, store) => {
|
|
|
961
977
|
if (isRootStore(innerTarget)) {
|
|
962
978
|
subject.next({ newValue, oldValue });
|
|
963
979
|
}
|
|
964
|
-
options.set(
|
|
980
|
+
options.set(toolkit, newValue);
|
|
965
981
|
};
|
|
966
982
|
const mySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
|
|
967
983
|
subject,
|
|
@@ -1215,23 +1231,6 @@ function disposeMolecule(token, store) {
|
|
|
1215
1231
|
}
|
|
1216
1232
|
}
|
|
1217
1233
|
|
|
1218
|
-
// internal/src/families/dispose-from-store.ts
|
|
1219
|
-
function disposeFromStore(token, store = IMPLICIT.STORE) {
|
|
1220
|
-
switch (token.type) {
|
|
1221
|
-
case `atom`:
|
|
1222
|
-
case `mutable_atom`:
|
|
1223
|
-
disposeAtom(token, store);
|
|
1224
|
-
break;
|
|
1225
|
-
case `selector`:
|
|
1226
|
-
case `readonly_selector`:
|
|
1227
|
-
disposeSelector(token, store);
|
|
1228
|
-
break;
|
|
1229
|
-
case `molecule`:
|
|
1230
|
-
disposeMolecule(token, store);
|
|
1231
|
-
break;
|
|
1232
|
-
}
|
|
1233
|
-
}
|
|
1234
|
-
|
|
1235
1234
|
// internal/src/families/init-family-member.ts
|
|
1236
1235
|
function initFamilyMemberInStore(token, key, store) {
|
|
1237
1236
|
const familyKey = token.key;
|
|
@@ -1305,6 +1304,91 @@ function findInStore(token, key, store) {
|
|
|
1305
1304
|
return state;
|
|
1306
1305
|
}
|
|
1307
1306
|
|
|
1307
|
+
// internal/src/families/dispose-from-store.ts
|
|
1308
|
+
function disposeFromStore(...params) {
|
|
1309
|
+
let token;
|
|
1310
|
+
let store;
|
|
1311
|
+
if (params.length === 2) {
|
|
1312
|
+
token = params[0];
|
|
1313
|
+
store = params[1];
|
|
1314
|
+
} else {
|
|
1315
|
+
const family = params[0];
|
|
1316
|
+
const key = params[1];
|
|
1317
|
+
store = params[2];
|
|
1318
|
+
const maybeToken = family.type === `molecule_family` ? seekInStore(family, key, store) : store.config.lifespan === `immortal` ? seekInStore(family, key, store) : findInStore(family, key, store);
|
|
1319
|
+
if (!maybeToken) {
|
|
1320
|
+
throw new NotFoundError(family, key, store);
|
|
1321
|
+
}
|
|
1322
|
+
token = maybeToken;
|
|
1323
|
+
}
|
|
1324
|
+
switch (token.type) {
|
|
1325
|
+
case `atom`:
|
|
1326
|
+
case `mutable_atom`:
|
|
1327
|
+
disposeAtom(token, store);
|
|
1328
|
+
break;
|
|
1329
|
+
case `selector`:
|
|
1330
|
+
case `readonly_selector`:
|
|
1331
|
+
disposeSelector(token, store);
|
|
1332
|
+
break;
|
|
1333
|
+
case `molecule`:
|
|
1334
|
+
disposeMolecule(token, store);
|
|
1335
|
+
break;
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1339
|
+
// internal/src/set-state/set-into-store.ts
|
|
1340
|
+
function setIntoStore(...params) {
|
|
1341
|
+
let token;
|
|
1342
|
+
let value;
|
|
1343
|
+
let store;
|
|
1344
|
+
if (params.length === 3) {
|
|
1345
|
+
token = params[0];
|
|
1346
|
+
value = params[1];
|
|
1347
|
+
store = params[2];
|
|
1348
|
+
} else {
|
|
1349
|
+
const family = params[0];
|
|
1350
|
+
const key = params[1];
|
|
1351
|
+
value = params[2];
|
|
1352
|
+
store = params[3];
|
|
1353
|
+
const maybeToken = store.config.lifespan === `ephemeral` ? findInStore(family, key, store) : seekInStore(family, key, store);
|
|
1354
|
+
if (!maybeToken) {
|
|
1355
|
+
throw new NotFoundError(family, key, store);
|
|
1356
|
+
}
|
|
1357
|
+
token = maybeToken;
|
|
1358
|
+
}
|
|
1359
|
+
const rejectionTime = openOperation(token, store);
|
|
1360
|
+
if (rejectionTime) {
|
|
1361
|
+
const unsubscribe = store.on.operationClose.subscribe(
|
|
1362
|
+
`waiting to set "${token.key}" at T-${rejectionTime}`,
|
|
1363
|
+
() => {
|
|
1364
|
+
unsubscribe();
|
|
1365
|
+
store.logger.info(
|
|
1366
|
+
`\u{1F7E2}`,
|
|
1367
|
+
token.type,
|
|
1368
|
+
token.key,
|
|
1369
|
+
`resuming deferred setState from T-${rejectionTime}`
|
|
1370
|
+
);
|
|
1371
|
+
setIntoStore(token, value, store);
|
|
1372
|
+
}
|
|
1373
|
+
);
|
|
1374
|
+
return;
|
|
1375
|
+
}
|
|
1376
|
+
const state = withdraw(token, store);
|
|
1377
|
+
setAtomOrSelector(state, value, store);
|
|
1378
|
+
closeOperation(store);
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
// internal/src/ingest-updates/ingest-atom-update.ts
|
|
1382
|
+
function ingestAtomUpdate(applying, atomUpdate, store) {
|
|
1383
|
+
const { key, newValue, oldValue } = atomUpdate;
|
|
1384
|
+
const value = applying === `newValue` ? newValue : oldValue;
|
|
1385
|
+
const token = { key, type: `atom` };
|
|
1386
|
+
if (atomUpdate.family) {
|
|
1387
|
+
Object.assign(token, { family: atomUpdate.family });
|
|
1388
|
+
}
|
|
1389
|
+
setIntoStore(token, value, store);
|
|
1390
|
+
}
|
|
1391
|
+
|
|
1308
1392
|
// internal/src/molecule/create-molecule-family.ts
|
|
1309
1393
|
function createMoleculeFamily(options, store) {
|
|
1310
1394
|
var _a;
|
|
@@ -1366,30 +1450,34 @@ var Molecule = class {
|
|
|
1366
1450
|
};
|
|
1367
1451
|
|
|
1368
1452
|
// internal/src/molecule/make-molecule-in-store.ts
|
|
1453
|
+
function capitalize2(string) {
|
|
1454
|
+
return string[0].toUpperCase() + string.slice(1);
|
|
1455
|
+
}
|
|
1369
1456
|
function makeMoleculeInStore(store, context, familyToken, key, ...params) {
|
|
1370
1457
|
const target = newest(store);
|
|
1371
|
-
|
|
1458
|
+
const stringKey = json.stringifyJson(key);
|
|
1459
|
+
target.moleculeInProgress = stringKey;
|
|
1372
1460
|
const contextArray = Array.isArray(context) ? context : [context];
|
|
1373
1461
|
const owners = contextArray.map((ctx) => {
|
|
1374
1462
|
if (ctx instanceof Molecule) {
|
|
1375
1463
|
return ctx;
|
|
1376
1464
|
}
|
|
1377
|
-
const
|
|
1378
|
-
const molecule2 = store.molecules.get(
|
|
1465
|
+
const ctxStringKey = json.stringifyJson(ctx.key);
|
|
1466
|
+
const molecule2 = store.molecules.get(ctxStringKey);
|
|
1379
1467
|
if (!molecule2) {
|
|
1380
1468
|
throw new Error(
|
|
1381
|
-
`Molecule ${
|
|
1469
|
+
`Molecule ${ctxStringKey} not found in store "${store.config.name}"`
|
|
1382
1470
|
);
|
|
1383
1471
|
}
|
|
1384
1472
|
return molecule2;
|
|
1385
1473
|
});
|
|
1386
1474
|
const molecule = new Molecule(owners, key, familyToken);
|
|
1387
|
-
target.molecules.set(
|
|
1475
|
+
target.molecules.set(stringKey, molecule);
|
|
1388
1476
|
for (const owner of owners) {
|
|
1389
1477
|
owner.below.set(molecule.stringKey, molecule);
|
|
1390
1478
|
}
|
|
1391
|
-
const
|
|
1392
|
-
get: (t) => getFromStore(t, newest(store)),
|
|
1479
|
+
const toolkit = {
|
|
1480
|
+
get: (t) => getFromStore(t, void 0, newest(store)),
|
|
1393
1481
|
set: (t, newValue) => {
|
|
1394
1482
|
setIntoStore(t, newValue, newest(store));
|
|
1395
1483
|
},
|
|
@@ -1401,11 +1489,36 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
|
|
|
1401
1489
|
disposeFromStore(t, newest(store));
|
|
1402
1490
|
},
|
|
1403
1491
|
env: () => getEnvironmentData(newest(store)),
|
|
1404
|
-
bond: (
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1492
|
+
bond: (token2, maybeRole) => {
|
|
1493
|
+
if (token2.type === `join`) {
|
|
1494
|
+
const { as: role } = maybeRole;
|
|
1495
|
+
const join = data.getJoin(token2, store);
|
|
1496
|
+
join.molecules.set(stringKey, molecule);
|
|
1497
|
+
molecule.joins.set(token2.key, join);
|
|
1498
|
+
const unsubFromFamily = family.subject.subscribe(
|
|
1499
|
+
`join:${token2.key}-${stringKey}`,
|
|
1500
|
+
(event) => {
|
|
1501
|
+
if (event.type === `molecule_disposal` && json.stringifyJson(event.token.key) === stringKey) {
|
|
1502
|
+
unsubFromFamily();
|
|
1503
|
+
join.molecules.delete(stringKey);
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
);
|
|
1507
|
+
if (role === null) {
|
|
1508
|
+
return;
|
|
1509
|
+
}
|
|
1510
|
+
const otherRole = token2.a === role ? token2.b : token2.a;
|
|
1511
|
+
const relations = data.findRelations(token2, key);
|
|
1512
|
+
const relatedKeys = relations[`${otherRole}KeysOf${capitalize2(role)}`];
|
|
1513
|
+
const relatedEntries = relations[`${otherRole}EntriesOf${capitalize2(role)}`];
|
|
1514
|
+
let tokens = { relatedKeys };
|
|
1515
|
+
if (relatedEntries) {
|
|
1516
|
+
tokens = Object.assign(tokens, { relatedEntries });
|
|
1517
|
+
}
|
|
1518
|
+
return tokens;
|
|
1519
|
+
}
|
|
1520
|
+
return growMoleculeInStore(molecule, withdraw(token2, store), newest(store));
|
|
1521
|
+
},
|
|
1409
1522
|
claim: (below, options) => {
|
|
1410
1523
|
const { exclusive } = options;
|
|
1411
1524
|
const belowMolecule = newest(store).molecules.get(json.stringifyJson(below.key));
|
|
@@ -1423,12 +1536,6 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
|
|
|
1423
1536
|
}
|
|
1424
1537
|
}
|
|
1425
1538
|
},
|
|
1426
|
-
join: (joinToken) => {
|
|
1427
|
-
const join = data.getJoin(joinToken, store);
|
|
1428
|
-
join.molecules.set(json.stringifyJson(key), molecule);
|
|
1429
|
-
molecule.joins.set(joinToken.key, join);
|
|
1430
|
-
return joinToken;
|
|
1431
|
-
},
|
|
1432
1539
|
spawn: (f, k, ...p) => makeMoleculeInStore(
|
|
1433
1540
|
newest(store),
|
|
1434
1541
|
[molecule],
|
|
@@ -1439,7 +1546,7 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
|
|
|
1439
1546
|
};
|
|
1440
1547
|
const family = withdraw(familyToken, store);
|
|
1441
1548
|
const Constructor = family.new;
|
|
1442
|
-
molecule.instance = new Constructor(
|
|
1549
|
+
molecule.instance = new Constructor(toolkit, key, ...params);
|
|
1443
1550
|
const token = {
|
|
1444
1551
|
type: `molecule`,
|
|
1445
1552
|
key,
|
|
@@ -1740,18 +1847,18 @@ var buildTransaction = (key, params, store, id) => {
|
|
|
1740
1847
|
params,
|
|
1741
1848
|
output: void 0
|
|
1742
1849
|
},
|
|
1743
|
-
|
|
1744
|
-
get: (
|
|
1745
|
-
set: (
|
|
1746
|
-
setIntoStore(
|
|
1850
|
+
toolkit: {
|
|
1851
|
+
get: (...ps) => getFromStore(...ps, child),
|
|
1852
|
+
set: (...ps) => {
|
|
1853
|
+
setIntoStore(...ps, child);
|
|
1747
1854
|
},
|
|
1748
1855
|
run: (token, identifier = arbitrary()) => actUponStore(token, identifier, child),
|
|
1749
1856
|
find: (token, k) => findInStore(token, k, child),
|
|
1750
1857
|
seek: (token, k) => seekInStore(token, k, child),
|
|
1751
1858
|
json: (token) => getJsonToken(token, child),
|
|
1752
1859
|
make: (context, family, k, ...args) => makeMoleculeInStore(child, context, family, k, ...args),
|
|
1753
|
-
dispose: (
|
|
1754
|
-
disposeFromStore(
|
|
1860
|
+
dispose: (...ps) => {
|
|
1861
|
+
disposeFromStore(...ps, child);
|
|
1755
1862
|
},
|
|
1756
1863
|
env: () => getEnvironmentData(child)
|
|
1757
1864
|
}
|
|
@@ -1779,8 +1886,8 @@ function createTransaction(options, store) {
|
|
|
1779
1886
|
const childStore = buildTransaction(options.key, params, store, id);
|
|
1780
1887
|
try {
|
|
1781
1888
|
const target2 = newest(store);
|
|
1782
|
-
const {
|
|
1783
|
-
const output = options.do(
|
|
1889
|
+
const { toolkit } = childStore.transactionMeta;
|
|
1890
|
+
const output = options.do(toolkit, ...params);
|
|
1784
1891
|
applyTransaction(output, target2);
|
|
1785
1892
|
return output;
|
|
1786
1893
|
} catch (thrown) {
|
|
@@ -1896,6 +2003,7 @@ var Store = class {
|
|
|
1896
2003
|
for (const logger of this.loggers) logger.warn(...messages);
|
|
1897
2004
|
}
|
|
1898
2005
|
};
|
|
2006
|
+
this.config = __spreadValues(__spreadValues({}, store == null ? void 0 : store.config), config);
|
|
1899
2007
|
if (store !== null) {
|
|
1900
2008
|
this.valueMap = new Map(store == null ? void 0 : store.valueMap);
|
|
1901
2009
|
this.operation = __spreadValues({}, store == null ? void 0 : store.operation);
|
|
@@ -1907,7 +2015,6 @@ var Store = class {
|
|
|
1907
2015
|
)
|
|
1908
2016
|
};
|
|
1909
2017
|
}
|
|
1910
|
-
this.config = __spreadValues(__spreadValues({}, store == null ? void 0 : store.config), config);
|
|
1911
2018
|
for (const [, family] of store.families) {
|
|
1912
2019
|
family.install(this);
|
|
1913
2020
|
}
|
package/internal/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as atom_io from 'atom.io';
|
|
2
|
-
import { Func, TransactionToken, TransactionUpdate, TransactionOptions,
|
|
2
|
+
import { Func, TransactionToken, TransactionUpdate, TransactionOptions, ActorToolkit, RegularAtomToken, MutableAtomToken, AtomToken, WritableSelectorToken, ReadonlySelectorToken, SelectorToken, WritableToken, MoleculeToken, MoleculeFamily, MoleculeFamilyToken, ReadableToken, TimelineManageable, Flat, StateUpdate, TokenType, FamilyMetadata, StateCreation, StateDisposal, MoleculeConstructor, MoleculeCreation, MoleculeDisposal, TimelineUpdate, TimelineOptions, TimelineToken, WritableSelectorFamily, MutableAtomFamily, RegularAtomFamily, ReadonlySelectorFamily, AtomIOLogger, Logger, AtomFamily, ReadableFamily, SelectorFamily, WritableFamily, RegularAtomFamilyToken, MutableAtomFamilyToken, AtomFamilyToken, ReadonlySelectorFamilyToken, WritableSelectorFamilyToken, SelectorFamilyToken, ReadableFamilyToken, WritableFamilyToken, MutableAtomOptions, MutableAtomFamilyOptions, RegularAtomOptions, RegularAtomFamilyOptions, ReadonlySelectorFamilyOptions, WritableSelectorFamilyOptions, MoleculeKey, KeyedStateUpdate, MoleculeFamilyOptions, MK, MoleculeParams, ReadonlySelectorOptions, WritableSelectorOptions, SetterToolkit, UpdateHandler, TransactionUpdateHandler } from 'atom.io';
|
|
3
3
|
import { Json, JsonInterface } from 'atom.io/json';
|
|
4
4
|
import { Join } from 'atom.io/data';
|
|
5
5
|
|
|
@@ -134,7 +134,7 @@ type TransactionPhase = (typeof TRANSACTION_PHASES)[number];
|
|
|
134
134
|
type TransactionProgress<F extends Func> = {
|
|
135
135
|
phase: `applying` | `building`;
|
|
136
136
|
update: TransactionUpdate<F>;
|
|
137
|
-
|
|
137
|
+
toolkit: ActorToolkit;
|
|
138
138
|
};
|
|
139
139
|
type TransactionEpoch = {
|
|
140
140
|
epoch: Map<string, number>;
|
|
@@ -397,7 +397,9 @@ declare function createRegularAtomFamily<T, K extends Json.Serializable>(options
|
|
|
397
397
|
declare function createSelectorFamily<T, K extends Json.Serializable>(options: WritableSelectorFamilyOptions<T, K>, store: Store): WritableSelectorFamily<T, K>;
|
|
398
398
|
declare function createSelectorFamily<T, K extends Json.Serializable>(options: ReadonlySelectorFamilyOptions<T, K>, store: Store): ReadonlySelectorFamily<T, K>;
|
|
399
399
|
|
|
400
|
-
declare function disposeFromStore(token: MoleculeToken<any> | ReadableToken<any>, store
|
|
400
|
+
declare function disposeFromStore(token: MoleculeToken<any> | ReadableToken<any>, store: Store): void;
|
|
401
|
+
declare function disposeFromStore<K extends Json.Serializable>(token: ReadableFamilyToken<any, K>, key: K, store: Store): void;
|
|
402
|
+
declare function disposeFromStore<M extends MoleculeConstructor>(token: MoleculeFamilyToken<M>, key: MoleculeKey<M>, store: Store): void;
|
|
401
403
|
|
|
402
404
|
declare function findInStore<T extends Transceiver<any>, J extends Json.Serializable, K extends Json.Serializable, Key extends K>(token: MutableAtomFamilyToken<T, J, K>, key: Key, store: Store): MutableAtomToken<T, J>;
|
|
403
405
|
declare function findInStore<T, K extends Json.Serializable, Key extends K>(token: RegularAtomFamilyToken<T, K>, key: Key, store: Store): RegularAtomToken<T>;
|
|
@@ -434,7 +436,8 @@ declare function getEnvironmentData(store: Store): EnvironmentData;
|
|
|
434
436
|
|
|
435
437
|
declare function getFromStore<T>(token: ReadableToken<T>, store: Store): T;
|
|
436
438
|
declare function getFromStore<M extends MoleculeConstructor>(token: MoleculeToken<M>, store: Store): InstanceType<M> | undefined;
|
|
437
|
-
declare function getFromStore<T,
|
|
439
|
+
declare function getFromStore<T, K extends Json.Serializable>(token: ReadableFamilyToken<T, K>, key: K, store: Store): T;
|
|
440
|
+
declare function getFromStore<M extends MoleculeConstructor>(token: MoleculeFamilyToken<M>, key: MoleculeKey<M>, store: Store): InstanceType<M>;
|
|
438
441
|
|
|
439
442
|
declare const readOrComputeValue: <T>(state: ReadableState<T>, target: Store) => T;
|
|
440
443
|
|
|
@@ -510,6 +513,7 @@ declare function makeMoleculeInStore<M extends MoleculeConstructor>(store: Store
|
|
|
510
513
|
type AtomIOToken = MoleculeFamilyToken<any> | MoleculeToken<any> | ReadableFamilyToken<any, any> | ReadableToken<any> | TimelineToken<any> | TransactionToken<any>;
|
|
511
514
|
declare class NotFoundError extends Error {
|
|
512
515
|
constructor(token: AtomIOToken, store: Store);
|
|
516
|
+
constructor(familyToken: AtomIOToken, key: Json.Serializable, store: Store);
|
|
513
517
|
}
|
|
514
518
|
|
|
515
519
|
declare const createReadonlySelector: <T>(options: ReadonlySelectorOptions<T>, family: FamilyMetadata | undefined, store: Store) => ReadonlySelectorToken<T>;
|
|
@@ -523,12 +527,12 @@ declare function disposeSelector(selectorToken: ReadonlySelectorToken<unknown> |
|
|
|
523
527
|
|
|
524
528
|
declare const getSelectorDependencyKeys: (key: string, store: Store) => (AtomKey<unknown> | ReadonlySelectorKey<unknown> | SelectorKey<unknown>)[];
|
|
525
529
|
|
|
526
|
-
declare const registerSelector: (selectorKey: string, store: Store) =>
|
|
530
|
+
declare const registerSelector: (selectorKey: string, covered: Set<string>, store: Store) => SetterToolkit;
|
|
527
531
|
|
|
528
|
-
declare const traceSelectorAtoms: (
|
|
532
|
+
declare const traceSelectorAtoms: (directDependencyKey: StateKey<unknown>, covered: Set<string>, store: Store) => AtomKey<unknown>[];
|
|
529
533
|
declare const traceAllSelectorAtoms: (selector: Selector<any>, store: Store) => AtomKey<unknown>[];
|
|
530
534
|
|
|
531
|
-
declare const updateSelectorAtoms: (selectorKey: string, dependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>, store: Store) => void;
|
|
535
|
+
declare const updateSelectorAtoms: (selectorKey: string, dependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>, covered: Set<string>, store: Store) => void;
|
|
532
536
|
|
|
533
537
|
type Modify<T> = (thing: T) => T;
|
|
534
538
|
declare const become: <T>(nextVersionOfThing: Modify<T> | T) => (originalThing: T) => T;
|
|
@@ -536,6 +540,7 @@ declare const become: <T>(nextVersionOfThing: Modify<T> | T) => (originalThing:
|
|
|
536
540
|
declare const setAtomOrSelector: <T>(state: WritableState<T>, value: T | ((oldValue: T) => T), store: Store) => void;
|
|
537
541
|
|
|
538
542
|
declare function setIntoStore<T, New extends T>(token: WritableToken<T>, value: New | ((oldValue: T) => New), store: Store): void;
|
|
543
|
+
declare function setIntoStore<T, K extends Json.Serializable, New extends T>(token: WritableFamilyToken<T, K>, key: K, value: New | ((oldValue: T) => New), store: Store): void;
|
|
539
544
|
|
|
540
545
|
declare const subscribeToRootAtoms: <T>(selector: Selector<T>, store: Store) => (() => void)[];
|
|
541
546
|
|