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.js
CHANGED
|
@@ -2,7 +2,7 @@ import { Junction } from '../../dist/chunk-HYXKCFVY.js';
|
|
|
2
2
|
import { __spreadValues, __spreadProps } from '../../dist/chunk-S4N6XNPH.js';
|
|
3
3
|
import { stringifyJson, parseJson, selectJson, selectJsonFamily } from 'atom.io/json';
|
|
4
4
|
import { AtomIOLogger } from 'atom.io';
|
|
5
|
-
import { getJoin } from 'atom.io/data';
|
|
5
|
+
import { getJoin, findRelations } from 'atom.io/data';
|
|
6
6
|
|
|
7
7
|
// internal/src/arbitrary.ts
|
|
8
8
|
function arbitrary(random = Math.random) {
|
|
@@ -132,8 +132,6 @@ var abortTransaction = (store) => {
|
|
|
132
132
|
);
|
|
133
133
|
target.parent.child = null;
|
|
134
134
|
};
|
|
135
|
-
|
|
136
|
-
// internal/src/not-found-error.ts
|
|
137
135
|
var capitalize = (str) => str[0].toUpperCase() + str.slice(1);
|
|
138
136
|
function prettyPrintTokenType(token) {
|
|
139
137
|
switch (token.type) {
|
|
@@ -152,10 +150,19 @@ function prettyPrintTokenType(token) {
|
|
|
152
150
|
}
|
|
153
151
|
}
|
|
154
152
|
var NotFoundError = class extends Error {
|
|
155
|
-
constructor(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
)
|
|
153
|
+
constructor(...params) {
|
|
154
|
+
const token = params[0];
|
|
155
|
+
const store = params.length === 2 ? params[1] : params[2];
|
|
156
|
+
if (params.length === 2) {
|
|
157
|
+
super(
|
|
158
|
+
`${prettyPrintTokenType(token)} "${token.key}" not found in store "${store.config.name}".`
|
|
159
|
+
);
|
|
160
|
+
} else {
|
|
161
|
+
const key = params[1];
|
|
162
|
+
super(
|
|
163
|
+
`${prettyPrintTokenType(token)} "${token.key}" member ${stringifyJson(key)} not found in store "${store.config.name}".`
|
|
164
|
+
);
|
|
165
|
+
}
|
|
159
166
|
}
|
|
160
167
|
};
|
|
161
168
|
|
|
@@ -415,41 +422,6 @@ var setAtomOrSelector = (state, value, store) => {
|
|
|
415
422
|
break;
|
|
416
423
|
}
|
|
417
424
|
};
|
|
418
|
-
|
|
419
|
-
// internal/src/set-state/set-into-store.ts
|
|
420
|
-
function setIntoStore(token, value, store) {
|
|
421
|
-
const rejectionTime = openOperation(token, store);
|
|
422
|
-
if (rejectionTime) {
|
|
423
|
-
const unsubscribe = store.on.operationClose.subscribe(
|
|
424
|
-
`waiting to set "${token.key}" at T-${rejectionTime}`,
|
|
425
|
-
() => {
|
|
426
|
-
unsubscribe();
|
|
427
|
-
store.logger.info(
|
|
428
|
-
`\u{1F7E2}`,
|
|
429
|
-
token.type,
|
|
430
|
-
token.key,
|
|
431
|
-
`resuming deferred setState from T-${rejectionTime}`
|
|
432
|
-
);
|
|
433
|
-
setIntoStore(token, value, store);
|
|
434
|
-
}
|
|
435
|
-
);
|
|
436
|
-
return;
|
|
437
|
-
}
|
|
438
|
-
const state = withdraw(token, store);
|
|
439
|
-
setAtomOrSelector(state, value, store);
|
|
440
|
-
closeOperation(store);
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
// internal/src/ingest-updates/ingest-atom-update.ts
|
|
444
|
-
function ingestAtomUpdate(applying, atomUpdate, store) {
|
|
445
|
-
const { key, newValue, oldValue } = atomUpdate;
|
|
446
|
-
const value = applying === `newValue` ? newValue : oldValue;
|
|
447
|
-
const token = { key, type: `atom` };
|
|
448
|
-
if (atomUpdate.family) {
|
|
449
|
-
Object.assign(token, { family: atomUpdate.family });
|
|
450
|
-
}
|
|
451
|
-
setIntoStore(token, value, store);
|
|
452
|
-
}
|
|
453
425
|
function createRegularAtomFamily(options, store) {
|
|
454
426
|
const subject = new Subject();
|
|
455
427
|
const atomFamily = Object.assign(
|
|
@@ -491,17 +463,31 @@ function createAtomFamily(options, store) {
|
|
|
491
463
|
}
|
|
492
464
|
|
|
493
465
|
// internal/src/get-state/get-from-store.ts
|
|
494
|
-
function getFromStore(
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
466
|
+
function getFromStore(...params) {
|
|
467
|
+
let token;
|
|
468
|
+
let store;
|
|
469
|
+
if (params.length === 2) {
|
|
470
|
+
token = params[0];
|
|
471
|
+
store = params[1];
|
|
472
|
+
} else {
|
|
473
|
+
const family = params[0];
|
|
474
|
+
const key = params[1];
|
|
475
|
+
store = params[2];
|
|
476
|
+
const maybeToken = family.type === `molecule_family` ? seekInStore(family, key, store) : store.config.lifespan === `immortal` ? seekInStore(family, key, store) : findInStore(family, key, store);
|
|
477
|
+
if (!maybeToken) {
|
|
478
|
+
throw new NotFoundError(family, key, store);
|
|
501
479
|
}
|
|
480
|
+
token = maybeToken;
|
|
481
|
+
}
|
|
482
|
+
switch (token.type) {
|
|
483
|
+
case `atom`:
|
|
484
|
+
case `mutable_atom`:
|
|
485
|
+
case `selector`:
|
|
486
|
+
case `readonly_selector`:
|
|
487
|
+
return readOrComputeValue(withdraw(token, store), store);
|
|
488
|
+
case `molecule`:
|
|
489
|
+
return withdraw(token, store).instance;
|
|
502
490
|
}
|
|
503
|
-
const state = withdraw(token, store);
|
|
504
|
-
return readOrComputeValue(state, store);
|
|
505
491
|
}
|
|
506
492
|
|
|
507
493
|
// internal/src/keys.ts
|
|
@@ -517,21 +503,18 @@ var getSelectorDependencyKeys = (key, store) => {
|
|
|
517
503
|
};
|
|
518
504
|
|
|
519
505
|
// internal/src/selector/trace-selector-atoms.ts
|
|
520
|
-
var traceSelectorAtoms = (
|
|
506
|
+
var traceSelectorAtoms = (directDependencyKey, covered, store) => {
|
|
521
507
|
const rootKeys = [];
|
|
522
508
|
const indirectDependencyKeys = getSelectorDependencyKeys(
|
|
523
509
|
directDependencyKey,
|
|
524
510
|
store
|
|
525
511
|
);
|
|
526
|
-
let depth = 0;
|
|
527
512
|
while (indirectDependencyKeys.length > 0) {
|
|
528
513
|
const indirectDependencyKey = indirectDependencyKeys.shift();
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
throw new Error(
|
|
532
|
-
`Maximum selector dependency depth exceeded (> 99999) in selector "${selectorKey}". This is likely due to a circular dependency.`
|
|
533
|
-
);
|
|
514
|
+
if (covered.has(indirectDependencyKey)) {
|
|
515
|
+
continue;
|
|
534
516
|
}
|
|
517
|
+
covered.add(indirectDependencyKey);
|
|
535
518
|
if (!isAtomKey(indirectDependencyKey, store)) {
|
|
536
519
|
indirectDependencyKeys.push(
|
|
537
520
|
...getSelectorDependencyKeys(indirectDependencyKey, store)
|
|
@@ -545,13 +528,14 @@ var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
|
|
|
545
528
|
var traceAllSelectorAtoms = (selector, store) => {
|
|
546
529
|
const selectorKey = selector.key;
|
|
547
530
|
const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store);
|
|
531
|
+
const covered = /* @__PURE__ */ new Set();
|
|
548
532
|
return directDependencyKeys.flatMap(
|
|
549
|
-
(depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(
|
|
533
|
+
(depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(depKey, covered, store)
|
|
550
534
|
);
|
|
551
535
|
};
|
|
552
536
|
|
|
553
537
|
// internal/src/selector/update-selector-atoms.ts
|
|
554
|
-
var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
538
|
+
var updateSelectorAtoms = (selectorKey, dependency, covered, store) => {
|
|
555
539
|
const target = newest(store);
|
|
556
540
|
if (dependency.type === `atom` || dependency.type === `mutable_atom`) {
|
|
557
541
|
target.selectorAtoms.set({
|
|
@@ -565,7 +549,7 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
|
565
549
|
`discovers root atom "${dependency.key}"`
|
|
566
550
|
);
|
|
567
551
|
} else {
|
|
568
|
-
const rootKeys = traceSelectorAtoms(
|
|
552
|
+
const rootKeys = traceSelectorAtoms(dependency.key, covered, store);
|
|
569
553
|
store.logger.info(
|
|
570
554
|
`\u{1F50D}`,
|
|
571
555
|
`selector`,
|
|
@@ -579,12 +563,21 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
|
|
|
579
563
|
});
|
|
580
564
|
}
|
|
581
565
|
}
|
|
566
|
+
covered.add(dependency.key);
|
|
582
567
|
};
|
|
583
568
|
|
|
584
569
|
// internal/src/selector/register-selector.ts
|
|
585
|
-
var registerSelector = (selectorKey, store) => ({
|
|
586
|
-
get: (dependency) => {
|
|
570
|
+
var registerSelector = (selectorKey, covered, store) => ({
|
|
571
|
+
get: (dependency, key) => {
|
|
587
572
|
const target = newest(store);
|
|
573
|
+
if (key) {
|
|
574
|
+
switch (dependency.type) {
|
|
575
|
+
case `molecule_family`:
|
|
576
|
+
return getFromStore(dependency, key, store);
|
|
577
|
+
case `atom_family`:
|
|
578
|
+
dependency = seekInStore(dependency, key, store);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
588
581
|
if (dependency.type === `molecule`) {
|
|
589
582
|
return getFromStore(dependency, store);
|
|
590
583
|
}
|
|
@@ -607,13 +600,28 @@ var registerSelector = (selectorKey, store) => ({
|
|
|
607
600
|
source: dependency.key
|
|
608
601
|
}
|
|
609
602
|
);
|
|
610
|
-
updateSelectorAtoms(selectorKey, dependency, store);
|
|
603
|
+
updateSelectorAtoms(selectorKey, dependency, covered, store);
|
|
611
604
|
return dependencyValue;
|
|
612
605
|
},
|
|
613
|
-
set: (
|
|
606
|
+
set: (...params) => {
|
|
607
|
+
let token;
|
|
608
|
+
let value;
|
|
609
|
+
if (params.length === 2) {
|
|
610
|
+
token = params[0];
|
|
611
|
+
value = params[1];
|
|
612
|
+
} else {
|
|
613
|
+
const family = params[0];
|
|
614
|
+
const key = params[1];
|
|
615
|
+
value = params[2];
|
|
616
|
+
const maybeToken = store.config.lifespan === `ephemeral` ? findInStore(family, key, store) : seekInStore(family, key, store);
|
|
617
|
+
if (!maybeToken) {
|
|
618
|
+
throw new NotFoundError(family, key, store);
|
|
619
|
+
}
|
|
620
|
+
token = maybeToken;
|
|
621
|
+
}
|
|
614
622
|
const target = newest(store);
|
|
615
|
-
const state = withdraw(
|
|
616
|
-
setAtomOrSelector(state,
|
|
623
|
+
const state = withdraw(token, target);
|
|
624
|
+
setAtomOrSelector(state, value, target);
|
|
617
625
|
},
|
|
618
626
|
find: (token, key) => findInStore(token, key, store),
|
|
619
627
|
seek: (token, key) => seekInStore(token, key, store),
|
|
@@ -624,10 +632,16 @@ var registerSelector = (selectorKey, store) => ({
|
|
|
624
632
|
var createReadonlySelector = (options, family, store) => {
|
|
625
633
|
const target = newest(store);
|
|
626
634
|
const subject = new Subject();
|
|
627
|
-
const
|
|
635
|
+
const covered = /* @__PURE__ */ new Set();
|
|
636
|
+
const { get, find, seek, json } = registerSelector(
|
|
637
|
+
options.key,
|
|
638
|
+
covered,
|
|
639
|
+
target
|
|
640
|
+
);
|
|
628
641
|
const getSelf = () => {
|
|
629
642
|
const value = options.get({ get, find, seek, json });
|
|
630
643
|
cacheValue(options.key, value, subject, newest(store));
|
|
644
|
+
covered.clear();
|
|
631
645
|
return value;
|
|
632
646
|
};
|
|
633
647
|
const readonlySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
|
|
@@ -659,12 +673,14 @@ var createReadonlySelector = (options, family, store) => {
|
|
|
659
673
|
var createWritableSelector = (options, family, store) => {
|
|
660
674
|
const target = newest(store);
|
|
661
675
|
const subject = new Subject();
|
|
662
|
-
const
|
|
663
|
-
const
|
|
664
|
-
const
|
|
676
|
+
const covered = /* @__PURE__ */ new Set();
|
|
677
|
+
const toolkit = registerSelector(options.key, covered, target);
|
|
678
|
+
const { find, get, seek, json } = toolkit;
|
|
679
|
+
const getterToolkit = { find, get, seek, json };
|
|
665
680
|
const getSelf = (innerTarget = newest(store)) => {
|
|
666
|
-
const value = options.get(
|
|
681
|
+
const value = options.get(getterToolkit);
|
|
667
682
|
cacheValue(options.key, value, subject, innerTarget);
|
|
683
|
+
covered.clear();
|
|
668
684
|
return value;
|
|
669
685
|
};
|
|
670
686
|
const setSelf = (next) => {
|
|
@@ -686,7 +702,7 @@ var createWritableSelector = (options, family, store) => {
|
|
|
686
702
|
if (isRootStore(innerTarget)) {
|
|
687
703
|
subject.next({ newValue, oldValue });
|
|
688
704
|
}
|
|
689
|
-
options.set(
|
|
705
|
+
options.set(toolkit, newValue);
|
|
690
706
|
};
|
|
691
707
|
const mySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
|
|
692
708
|
subject,
|
|
@@ -940,23 +956,6 @@ function disposeMolecule(token, store) {
|
|
|
940
956
|
}
|
|
941
957
|
}
|
|
942
958
|
|
|
943
|
-
// internal/src/families/dispose-from-store.ts
|
|
944
|
-
function disposeFromStore(token, store = IMPLICIT.STORE) {
|
|
945
|
-
switch (token.type) {
|
|
946
|
-
case `atom`:
|
|
947
|
-
case `mutable_atom`:
|
|
948
|
-
disposeAtom(token, store);
|
|
949
|
-
break;
|
|
950
|
-
case `selector`:
|
|
951
|
-
case `readonly_selector`:
|
|
952
|
-
disposeSelector(token, store);
|
|
953
|
-
break;
|
|
954
|
-
case `molecule`:
|
|
955
|
-
disposeMolecule(token, store);
|
|
956
|
-
break;
|
|
957
|
-
}
|
|
958
|
-
}
|
|
959
|
-
|
|
960
959
|
// internal/src/families/init-family-member.ts
|
|
961
960
|
function initFamilyMemberInStore(token, key, store) {
|
|
962
961
|
const familyKey = token.key;
|
|
@@ -1030,6 +1029,91 @@ function findInStore(token, key, store) {
|
|
|
1030
1029
|
return state;
|
|
1031
1030
|
}
|
|
1032
1031
|
|
|
1032
|
+
// internal/src/families/dispose-from-store.ts
|
|
1033
|
+
function disposeFromStore(...params) {
|
|
1034
|
+
let token;
|
|
1035
|
+
let store;
|
|
1036
|
+
if (params.length === 2) {
|
|
1037
|
+
token = params[0];
|
|
1038
|
+
store = params[1];
|
|
1039
|
+
} else {
|
|
1040
|
+
const family = params[0];
|
|
1041
|
+
const key = params[1];
|
|
1042
|
+
store = params[2];
|
|
1043
|
+
const maybeToken = family.type === `molecule_family` ? seekInStore(family, key, store) : store.config.lifespan === `immortal` ? seekInStore(family, key, store) : findInStore(family, key, store);
|
|
1044
|
+
if (!maybeToken) {
|
|
1045
|
+
throw new NotFoundError(family, key, store);
|
|
1046
|
+
}
|
|
1047
|
+
token = maybeToken;
|
|
1048
|
+
}
|
|
1049
|
+
switch (token.type) {
|
|
1050
|
+
case `atom`:
|
|
1051
|
+
case `mutable_atom`:
|
|
1052
|
+
disposeAtom(token, store);
|
|
1053
|
+
break;
|
|
1054
|
+
case `selector`:
|
|
1055
|
+
case `readonly_selector`:
|
|
1056
|
+
disposeSelector(token, store);
|
|
1057
|
+
break;
|
|
1058
|
+
case `molecule`:
|
|
1059
|
+
disposeMolecule(token, store);
|
|
1060
|
+
break;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
// internal/src/set-state/set-into-store.ts
|
|
1065
|
+
function setIntoStore(...params) {
|
|
1066
|
+
let token;
|
|
1067
|
+
let value;
|
|
1068
|
+
let store;
|
|
1069
|
+
if (params.length === 3) {
|
|
1070
|
+
token = params[0];
|
|
1071
|
+
value = params[1];
|
|
1072
|
+
store = params[2];
|
|
1073
|
+
} else {
|
|
1074
|
+
const family = params[0];
|
|
1075
|
+
const key = params[1];
|
|
1076
|
+
value = params[2];
|
|
1077
|
+
store = params[3];
|
|
1078
|
+
const maybeToken = store.config.lifespan === `ephemeral` ? findInStore(family, key, store) : seekInStore(family, key, store);
|
|
1079
|
+
if (!maybeToken) {
|
|
1080
|
+
throw new NotFoundError(family, key, store);
|
|
1081
|
+
}
|
|
1082
|
+
token = maybeToken;
|
|
1083
|
+
}
|
|
1084
|
+
const rejectionTime = openOperation(token, store);
|
|
1085
|
+
if (rejectionTime) {
|
|
1086
|
+
const unsubscribe = store.on.operationClose.subscribe(
|
|
1087
|
+
`waiting to set "${token.key}" at T-${rejectionTime}`,
|
|
1088
|
+
() => {
|
|
1089
|
+
unsubscribe();
|
|
1090
|
+
store.logger.info(
|
|
1091
|
+
`\u{1F7E2}`,
|
|
1092
|
+
token.type,
|
|
1093
|
+
token.key,
|
|
1094
|
+
`resuming deferred setState from T-${rejectionTime}`
|
|
1095
|
+
);
|
|
1096
|
+
setIntoStore(token, value, store);
|
|
1097
|
+
}
|
|
1098
|
+
);
|
|
1099
|
+
return;
|
|
1100
|
+
}
|
|
1101
|
+
const state = withdraw(token, store);
|
|
1102
|
+
setAtomOrSelector(state, value, store);
|
|
1103
|
+
closeOperation(store);
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
// internal/src/ingest-updates/ingest-atom-update.ts
|
|
1107
|
+
function ingestAtomUpdate(applying, atomUpdate, store) {
|
|
1108
|
+
const { key, newValue, oldValue } = atomUpdate;
|
|
1109
|
+
const value = applying === `newValue` ? newValue : oldValue;
|
|
1110
|
+
const token = { key, type: `atom` };
|
|
1111
|
+
if (atomUpdate.family) {
|
|
1112
|
+
Object.assign(token, { family: atomUpdate.family });
|
|
1113
|
+
}
|
|
1114
|
+
setIntoStore(token, value, store);
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1033
1117
|
// internal/src/molecule/create-molecule-family.ts
|
|
1034
1118
|
function createMoleculeFamily(options, store) {
|
|
1035
1119
|
var _a;
|
|
@@ -1091,30 +1175,34 @@ var Molecule = class {
|
|
|
1091
1175
|
};
|
|
1092
1176
|
|
|
1093
1177
|
// internal/src/molecule/make-molecule-in-store.ts
|
|
1178
|
+
function capitalize2(string) {
|
|
1179
|
+
return string[0].toUpperCase() + string.slice(1);
|
|
1180
|
+
}
|
|
1094
1181
|
function makeMoleculeInStore(store, context, familyToken, key, ...params) {
|
|
1095
1182
|
const target = newest(store);
|
|
1096
|
-
|
|
1183
|
+
const stringKey = stringifyJson(key);
|
|
1184
|
+
target.moleculeInProgress = stringKey;
|
|
1097
1185
|
const contextArray = Array.isArray(context) ? context : [context];
|
|
1098
1186
|
const owners = contextArray.map((ctx) => {
|
|
1099
1187
|
if (ctx instanceof Molecule) {
|
|
1100
1188
|
return ctx;
|
|
1101
1189
|
}
|
|
1102
|
-
const
|
|
1103
|
-
const molecule2 = store.molecules.get(
|
|
1190
|
+
const ctxStringKey = stringifyJson(ctx.key);
|
|
1191
|
+
const molecule2 = store.molecules.get(ctxStringKey);
|
|
1104
1192
|
if (!molecule2) {
|
|
1105
1193
|
throw new Error(
|
|
1106
|
-
`Molecule ${
|
|
1194
|
+
`Molecule ${ctxStringKey} not found in store "${store.config.name}"`
|
|
1107
1195
|
);
|
|
1108
1196
|
}
|
|
1109
1197
|
return molecule2;
|
|
1110
1198
|
});
|
|
1111
1199
|
const molecule = new Molecule(owners, key, familyToken);
|
|
1112
|
-
target.molecules.set(
|
|
1200
|
+
target.molecules.set(stringKey, molecule);
|
|
1113
1201
|
for (const owner of owners) {
|
|
1114
1202
|
owner.below.set(molecule.stringKey, molecule);
|
|
1115
1203
|
}
|
|
1116
|
-
const
|
|
1117
|
-
get: (t) => getFromStore(t, newest(store)),
|
|
1204
|
+
const toolkit = {
|
|
1205
|
+
get: (t) => getFromStore(t, void 0, newest(store)),
|
|
1118
1206
|
set: (t, newValue) => {
|
|
1119
1207
|
setIntoStore(t, newValue, newest(store));
|
|
1120
1208
|
},
|
|
@@ -1126,11 +1214,36 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
|
|
|
1126
1214
|
disposeFromStore(t, newest(store));
|
|
1127
1215
|
},
|
|
1128
1216
|
env: () => getEnvironmentData(newest(store)),
|
|
1129
|
-
bond: (
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1217
|
+
bond: (token2, maybeRole) => {
|
|
1218
|
+
if (token2.type === `join`) {
|
|
1219
|
+
const { as: role } = maybeRole;
|
|
1220
|
+
const join = getJoin(token2, store);
|
|
1221
|
+
join.molecules.set(stringKey, molecule);
|
|
1222
|
+
molecule.joins.set(token2.key, join);
|
|
1223
|
+
const unsubFromFamily = family.subject.subscribe(
|
|
1224
|
+
`join:${token2.key}-${stringKey}`,
|
|
1225
|
+
(event) => {
|
|
1226
|
+
if (event.type === `molecule_disposal` && stringifyJson(event.token.key) === stringKey) {
|
|
1227
|
+
unsubFromFamily();
|
|
1228
|
+
join.molecules.delete(stringKey);
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
);
|
|
1232
|
+
if (role === null) {
|
|
1233
|
+
return;
|
|
1234
|
+
}
|
|
1235
|
+
const otherRole = token2.a === role ? token2.b : token2.a;
|
|
1236
|
+
const relations = findRelations(token2, key);
|
|
1237
|
+
const relatedKeys = relations[`${otherRole}KeysOf${capitalize2(role)}`];
|
|
1238
|
+
const relatedEntries = relations[`${otherRole}EntriesOf${capitalize2(role)}`];
|
|
1239
|
+
let tokens = { relatedKeys };
|
|
1240
|
+
if (relatedEntries) {
|
|
1241
|
+
tokens = Object.assign(tokens, { relatedEntries });
|
|
1242
|
+
}
|
|
1243
|
+
return tokens;
|
|
1244
|
+
}
|
|
1245
|
+
return growMoleculeInStore(molecule, withdraw(token2, store), newest(store));
|
|
1246
|
+
},
|
|
1134
1247
|
claim: (below, options) => {
|
|
1135
1248
|
const { exclusive } = options;
|
|
1136
1249
|
const belowMolecule = newest(store).molecules.get(stringifyJson(below.key));
|
|
@@ -1148,12 +1261,6 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
|
|
|
1148
1261
|
}
|
|
1149
1262
|
}
|
|
1150
1263
|
},
|
|
1151
|
-
join: (joinToken) => {
|
|
1152
|
-
const join = getJoin(joinToken, store);
|
|
1153
|
-
join.molecules.set(stringifyJson(key), molecule);
|
|
1154
|
-
molecule.joins.set(joinToken.key, join);
|
|
1155
|
-
return joinToken;
|
|
1156
|
-
},
|
|
1157
1264
|
spawn: (f, k, ...p) => makeMoleculeInStore(
|
|
1158
1265
|
newest(store),
|
|
1159
1266
|
[molecule],
|
|
@@ -1164,7 +1271,7 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
|
|
|
1164
1271
|
};
|
|
1165
1272
|
const family = withdraw(familyToken, store);
|
|
1166
1273
|
const Constructor = family.new;
|
|
1167
|
-
molecule.instance = new Constructor(
|
|
1274
|
+
molecule.instance = new Constructor(toolkit, key, ...params);
|
|
1168
1275
|
const token = {
|
|
1169
1276
|
type: `molecule`,
|
|
1170
1277
|
key,
|
|
@@ -1465,18 +1572,18 @@ var buildTransaction = (key, params, store, id) => {
|
|
|
1465
1572
|
params,
|
|
1466
1573
|
output: void 0
|
|
1467
1574
|
},
|
|
1468
|
-
|
|
1469
|
-
get: (
|
|
1470
|
-
set: (
|
|
1471
|
-
setIntoStore(
|
|
1575
|
+
toolkit: {
|
|
1576
|
+
get: (...ps) => getFromStore(...ps, child),
|
|
1577
|
+
set: (...ps) => {
|
|
1578
|
+
setIntoStore(...ps, child);
|
|
1472
1579
|
},
|
|
1473
1580
|
run: (token, identifier = arbitrary()) => actUponStore(token, identifier, child),
|
|
1474
1581
|
find: (token, k) => findInStore(token, k, child),
|
|
1475
1582
|
seek: (token, k) => seekInStore(token, k, child),
|
|
1476
1583
|
json: (token) => getJsonToken(token, child),
|
|
1477
1584
|
make: (context, family, k, ...args) => makeMoleculeInStore(child, context, family, k, ...args),
|
|
1478
|
-
dispose: (
|
|
1479
|
-
disposeFromStore(
|
|
1585
|
+
dispose: (...ps) => {
|
|
1586
|
+
disposeFromStore(...ps, child);
|
|
1480
1587
|
},
|
|
1481
1588
|
env: () => getEnvironmentData(child)
|
|
1482
1589
|
}
|
|
@@ -1504,8 +1611,8 @@ function createTransaction(options, store) {
|
|
|
1504
1611
|
const childStore = buildTransaction(options.key, params, store, id);
|
|
1505
1612
|
try {
|
|
1506
1613
|
const target2 = newest(store);
|
|
1507
|
-
const {
|
|
1508
|
-
const output = options.do(
|
|
1614
|
+
const { toolkit } = childStore.transactionMeta;
|
|
1615
|
+
const output = options.do(toolkit, ...params);
|
|
1509
1616
|
applyTransaction(output, target2);
|
|
1510
1617
|
return output;
|
|
1511
1618
|
} catch (thrown) {
|
|
@@ -1621,6 +1728,7 @@ var Store = class {
|
|
|
1621
1728
|
for (const logger of this.loggers) logger.warn(...messages);
|
|
1622
1729
|
}
|
|
1623
1730
|
};
|
|
1731
|
+
this.config = __spreadValues(__spreadValues({}, store == null ? void 0 : store.config), config);
|
|
1624
1732
|
if (store !== null) {
|
|
1625
1733
|
this.valueMap = new Map(store == null ? void 0 : store.valueMap);
|
|
1626
1734
|
this.operation = __spreadValues({}, store == null ? void 0 : store.operation);
|
|
@@ -1632,7 +1740,6 @@ var Store = class {
|
|
|
1632
1740
|
)
|
|
1633
1741
|
};
|
|
1634
1742
|
}
|
|
1635
|
-
this.config = __spreadValues(__spreadValues({}, store == null ? void 0 : store.config), config);
|
|
1636
1743
|
for (const [, family] of store.families) {
|
|
1637
1744
|
family.install(this);
|
|
1638
1745
|
}
|
|
@@ -1,15 +1,68 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
MoleculeConstructor,
|
|
3
|
+
MoleculeFamilyToken,
|
|
4
|
+
MoleculeKey,
|
|
5
|
+
MoleculeToken,
|
|
6
|
+
ReadableFamilyToken,
|
|
7
|
+
ReadableToken,
|
|
8
|
+
} from "atom.io"
|
|
9
|
+
import type { Json } from "atom.io/json"
|
|
2
10
|
|
|
3
11
|
import { disposeAtom } from "../atom"
|
|
4
12
|
import { disposeMolecule } from "../molecule/dispose-molecule"
|
|
13
|
+
import { NotFoundError } from "../not-found-error"
|
|
5
14
|
import { disposeSelector } from "../selector"
|
|
6
15
|
import type { Store } from "../store"
|
|
7
|
-
import {
|
|
16
|
+
import { findInStore } from "./find-in-store"
|
|
17
|
+
import { seekInStore } from "./seek-in-store"
|
|
8
18
|
|
|
9
19
|
export function disposeFromStore(
|
|
10
20
|
token: MoleculeToken<any> | ReadableToken<any>,
|
|
11
|
-
store: Store
|
|
21
|
+
store: Store,
|
|
22
|
+
): void
|
|
23
|
+
|
|
24
|
+
export function disposeFromStore<K extends Json.Serializable>(
|
|
25
|
+
token: ReadableFamilyToken<any, K>,
|
|
26
|
+
key: K,
|
|
27
|
+
store: Store,
|
|
28
|
+
): void
|
|
29
|
+
|
|
30
|
+
export function disposeFromStore<M extends MoleculeConstructor>(
|
|
31
|
+
token: MoleculeFamilyToken<M>,
|
|
32
|
+
key: MoleculeKey<M>,
|
|
33
|
+
store: Store,
|
|
34
|
+
): void
|
|
35
|
+
|
|
36
|
+
export function disposeFromStore(
|
|
37
|
+
...params:
|
|
38
|
+
| [
|
|
39
|
+
token: ReadableFamilyToken<any, any>,
|
|
40
|
+
key: Json.Serializable,
|
|
41
|
+
store: Store,
|
|
42
|
+
]
|
|
43
|
+
| [token: MoleculeFamilyToken<any>, key: MoleculeKey<any>, store: Store]
|
|
44
|
+
| [token: MoleculeToken<any> | ReadableToken<any>, store: Store]
|
|
12
45
|
): void {
|
|
46
|
+
let token: MoleculeToken<any> | ReadableToken<any>
|
|
47
|
+
let store: Store
|
|
48
|
+
if (params.length === 2) {
|
|
49
|
+
token = params[0]
|
|
50
|
+
store = params[1]
|
|
51
|
+
} else {
|
|
52
|
+
const family = params[0]
|
|
53
|
+
const key = params[1]
|
|
54
|
+
store = params[2]
|
|
55
|
+
const maybeToken =
|
|
56
|
+
family.type === `molecule_family`
|
|
57
|
+
? seekInStore(family, key, store)
|
|
58
|
+
: store.config.lifespan === `immortal`
|
|
59
|
+
? seekInStore(family, key, store)
|
|
60
|
+
: findInStore(family, key, store)
|
|
61
|
+
if (!maybeToken) {
|
|
62
|
+
throw new NotFoundError(family, key, store)
|
|
63
|
+
}
|
|
64
|
+
token = maybeToken
|
|
65
|
+
}
|
|
13
66
|
switch (token.type) {
|
|
14
67
|
case `atom`:
|
|
15
68
|
case `mutable_atom`:
|