atom.io 0.21.1 → 0.23.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 +152 -63
- package/data/dist/index.d.ts +6 -0
- package/data/dist/index.js +3 -3
- package/data/src/join.ts +164 -51
- package/data/src/struct-family.ts +2 -2
- package/dist/chunk-6MLFYN32.js +18 -0
- package/dist/{chunk-HITX3MO4.js → chunk-7DT3PVS3.js} +151 -62
- package/dist/{chunk-RT43TVKP.js → chunk-GVHKIJ3G.js} +1 -1
- package/dist/chunk-OAYGID5B.js +27 -0
- package/dist/index.cjs +4 -18
- package/dist/index.d.ts +71 -28
- package/dist/index.js +6 -19
- 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 +155 -1
- package/eslint-plugin/dist/index.js +155 -1
- package/eslint-plugin/src/rules/index.ts +1 -0
- package/eslint-plugin/src/rules/lifespan.ts +203 -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 +260 -0
- package/immortal/dist/index.js +212 -0
- package/immortal/package.json +16 -0
- package/immortal/src/index.ts +3 -0
- package/immortal/src/make-molecule.ts +222 -0
- package/immortal/src/molecule.ts +167 -0
- package/immortal/src/seek-state.ts +73 -0
- package/internal/dist/index.cjs +1242 -837
- package/internal/dist/index.d.ts +135 -22
- package/internal/dist/index.js +1215 -838
- package/internal/src/atom/create-regular-atom.ts +0 -2
- package/internal/src/atom/create-standalone-atom.ts +6 -2
- package/internal/src/atom/dispose-atom.ts +26 -3
- package/internal/src/families/create-readonly-selector-family.ts +15 -10
- package/internal/src/families/create-regular-atom-family.ts +20 -21
- package/internal/src/families/create-writable-selector-family.ts +13 -9
- package/{src/dispose.ts → internal/src/families/dispose-from-store.ts} +7 -4
- package/internal/src/families/find-in-store.ts +11 -6
- package/internal/src/families/index.ts +3 -0
- package/internal/src/families/init-family-member.ts +112 -0
- package/internal/src/families/seek-in-store.ts +123 -0
- package/internal/src/get-state/get-from-store.ts +2 -2
- package/internal/src/ingest-updates/index.ts +1 -0
- package/internal/src/ingest-updates/ingest-creation-disposal.ts +104 -0
- package/internal/src/ingest-updates/ingest-transaction-update.ts +26 -4
- package/internal/src/mutable/create-mutable-atom-family.ts +22 -24
- package/internal/src/mutable/create-mutable-atom.ts +3 -3
- package/internal/src/mutable/get-json-family.ts +2 -2
- package/internal/src/mutable/get-json-token.ts +26 -12
- package/internal/src/mutable/tracker-family.ts +21 -19
- package/internal/src/not-found-error.ts +16 -3
- package/internal/src/selector/create-readonly-selector.ts +2 -3
- package/internal/src/selector/create-standalone-selector.ts +6 -2
- package/internal/src/selector/create-writable-selector.ts +2 -3
- package/internal/src/selector/dispose-selector.ts +68 -24
- package/internal/src/selector/register-selector.ts +10 -5
- package/internal/src/set-state/set-into-store.ts +2 -2
- package/internal/src/set-state/stow-update.ts +5 -1
- package/internal/src/store/deposit.ts +41 -7
- package/internal/src/store/index.ts +0 -1
- package/internal/src/store/store.ts +29 -5
- package/internal/src/store/withdraw.ts +28 -1
- package/internal/src/subscribe/subscribe-to-state.ts +2 -2
- package/internal/src/timeline/add-atom-to-timeline.ts +206 -182
- package/internal/src/timeline/create-timeline.ts +181 -60
- package/internal/src/timeline/time-travel.ts +20 -0
- package/internal/src/transaction/apply-transaction.ts +2 -12
- package/internal/src/transaction/build-transaction.ts +16 -2
- package/introspection/dist/index.cjs +40 -53
- package/introspection/dist/index.js +40 -53
- package/introspection/src/attach-atom-index.ts +38 -48
- package/introspection/src/attach-selector-index.ts +45 -50
- package/introspection/src/attach-timeline-family.ts +1 -0
- package/json/dist/index.cjs +40 -6
- package/json/dist/index.js +44 -9
- package/json/src/select-json-family.ts +47 -9
- 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 +69 -57
- package/react-devtools/dist/index.js +62 -49
- package/react-devtools/src/StateIndex.tsx +2 -1
- package/react-devtools/src/TimelineIndex.tsx +17 -14
- package/react-devtools/src/TransactionIndex.tsx +7 -7
- package/react-devtools/src/Updates.tsx +41 -32
- 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 +39 -27
- package/realtime-server/dist/index.d.ts +1 -1
- package/realtime-server/dist/index.js +27 -16
- 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-server/src/realtime-server-stores/server-sync-store.ts +21 -11
- package/realtime-testing/dist/index.cjs +7 -2
- package/realtime-testing/dist/index.js +8 -5
- package/realtime-testing/src/setup-realtime-test.tsx +5 -2
- package/src/atom.ts +19 -7
- package/src/dispose-state.ts +10 -0
- package/src/index.ts +5 -2
- package/src/selector.ts +13 -7
- package/src/silo.ts +3 -3
- package/src/subscribe.ts +8 -4
- package/src/timeline.ts +18 -1
- package/src/transaction.ts +59 -4
- package/dist/chunk-BF4MVQF6.js +0 -44
- package/internal/src/store/withdraw-new-family-member.ts +0 -69
- /package/{src → ephemeral/src}/find-state.ts +0 -0
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
AtomFamilyToken,
|
|
3
3
|
FamilyMetadata,
|
|
4
|
+
Flat,
|
|
4
5
|
Func,
|
|
6
|
+
MoleculeCreation,
|
|
7
|
+
MoleculeDisposal,
|
|
8
|
+
ReadableToken,
|
|
9
|
+
StateCreation,
|
|
10
|
+
StateDisposal,
|
|
5
11
|
StateUpdate,
|
|
6
12
|
TimelineManageable,
|
|
7
13
|
TimelineOptions,
|
|
@@ -10,6 +16,7 @@ import type {
|
|
|
10
16
|
TokenType,
|
|
11
17
|
TransactionUpdate,
|
|
12
18
|
} from "atom.io"
|
|
19
|
+
import { type Json, stringifyJson } from "atom.io/json"
|
|
13
20
|
|
|
14
21
|
import { newest } from "../lineage"
|
|
15
22
|
import { getUpdateToken, isMutable } from "../mutable"
|
|
@@ -17,31 +24,46 @@ import { type Store, withdraw } from "../store"
|
|
|
17
24
|
import { Subject } from "../subject"
|
|
18
25
|
import { addAtomToTimeline } from "./add-atom-to-timeline"
|
|
19
26
|
|
|
20
|
-
export type TimelineAtomUpdate<ManagedAtom extends TimelineManageable> =
|
|
27
|
+
export type TimelineAtomUpdate<ManagedAtom extends TimelineManageable> = Flat<
|
|
21
28
|
StateUpdate<TokenType<ManagedAtom>> & {
|
|
22
29
|
key: string
|
|
23
30
|
type: `atom_update`
|
|
24
31
|
timestamp: number
|
|
25
32
|
family?: FamilyMetadata
|
|
26
33
|
}
|
|
34
|
+
>
|
|
27
35
|
export type TimelineSelectorUpdate<ManagedAtom extends TimelineManageable> = {
|
|
28
36
|
key: string
|
|
29
37
|
type: `selector_update`
|
|
30
38
|
timestamp: number
|
|
31
39
|
atomUpdates: Omit<TimelineAtomUpdate<ManagedAtom>, `timestamp`>[]
|
|
32
40
|
}
|
|
33
|
-
export type TimelineTransactionUpdate =
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
export type TimelineTransactionUpdate = Flat<
|
|
42
|
+
TransactionUpdate<Func> & {
|
|
43
|
+
key: string
|
|
44
|
+
type: `transaction_update`
|
|
45
|
+
timestamp: number
|
|
46
|
+
}
|
|
47
|
+
>
|
|
48
|
+
export type TimelineStateCreation<T extends ReadableToken<any>> = Flat<
|
|
49
|
+
StateCreation<T> & { timestamp: number }
|
|
50
|
+
>
|
|
51
|
+
export type TimelineStateDisposal<T extends ReadableToken<any>> = Flat<
|
|
52
|
+
StateDisposal<T> & { timestamp: number }
|
|
53
|
+
>
|
|
54
|
+
export type TimelineMoleculeCreation<Key extends Json.Serializable> = Flat<
|
|
55
|
+
MoleculeCreation<Key> & { timestamp: number }
|
|
56
|
+
>
|
|
57
|
+
export type TimelineMoleculeDisposal<Key extends Json.Serializable> = Flat<
|
|
58
|
+
MoleculeDisposal<Key> & { timestamp: number }
|
|
59
|
+
>
|
|
38
60
|
|
|
39
61
|
export type Timeline<ManagedAtom extends TimelineManageable> = {
|
|
40
62
|
type: `timeline`
|
|
41
63
|
key: string
|
|
42
64
|
at: number
|
|
43
65
|
shouldCapture?: (
|
|
44
|
-
update: TimelineUpdate<
|
|
66
|
+
update: TimelineUpdate<ManagedAtom>,
|
|
45
67
|
timeline: Timeline<ManagedAtom>,
|
|
46
68
|
) => boolean
|
|
47
69
|
timeTraveling: `into_future` | `into_past` | null
|
|
@@ -49,13 +71,8 @@ export type Timeline<ManagedAtom extends TimelineManageable> = {
|
|
|
49
71
|
selectorTime: number | null
|
|
50
72
|
transactionKey: string | null
|
|
51
73
|
install: (store: Store) => void
|
|
52
|
-
subject: Subject<
|
|
53
|
-
|
|
54
|
-
| TimelineSelectorUpdate<ManagedAtom>
|
|
55
|
-
| TimelineTransactionUpdate
|
|
56
|
-
| `redo`
|
|
57
|
-
| `undo`
|
|
58
|
-
>
|
|
74
|
+
subject: Subject<TimelineUpdate<ManagedAtom> | `redo` | `undo`>
|
|
75
|
+
subscriptions: Map<string, () => void>
|
|
59
76
|
}
|
|
60
77
|
|
|
61
78
|
export function createTimeline<ManagedAtom extends TimelineManageable>(
|
|
@@ -67,6 +84,7 @@ export function createTimeline<ManagedAtom extends TimelineManageable>(
|
|
|
67
84
|
type: `timeline`,
|
|
68
85
|
key: options.key,
|
|
69
86
|
at: 0,
|
|
87
|
+
|
|
70
88
|
timeTraveling: null,
|
|
71
89
|
selectorTime: null,
|
|
72
90
|
transactionKey: null,
|
|
@@ -74,62 +92,140 @@ export function createTimeline<ManagedAtom extends TimelineManageable>(
|
|
|
74
92
|
history: data?.history.map((update) => ({ ...update })) ?? [],
|
|
75
93
|
install: (s) => createTimeline(options, s, tl),
|
|
76
94
|
subject: new Subject(),
|
|
95
|
+
subscriptions: new Map(),
|
|
77
96
|
}
|
|
78
97
|
if (options.shouldCapture) {
|
|
79
98
|
tl.shouldCapture = options.shouldCapture
|
|
80
99
|
}
|
|
81
100
|
const timelineKey = options.key
|
|
82
101
|
const target = newest(store)
|
|
83
|
-
for (const tokenOrFamily of options.
|
|
102
|
+
for (const tokenOrFamily of options.scope) {
|
|
84
103
|
let atomKey = tokenOrFamily.key
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
104
|
+
switch (tokenOrFamily.type) {
|
|
105
|
+
case `atom_family`:
|
|
106
|
+
case `mutable_atom_family`:
|
|
107
|
+
{
|
|
108
|
+
const familyToken: AtomFamilyToken<any> = tokenOrFamily
|
|
109
|
+
const family = withdraw(familyToken, store)
|
|
110
|
+
const familyKey = family.key
|
|
111
|
+
target.timelineAtoms.set({ atomKey: familyKey, timelineKey })
|
|
112
|
+
tl.subscriptions.set(
|
|
113
|
+
family.key,
|
|
114
|
+
family.subject.subscribe(
|
|
115
|
+
`timeline:${options.key}`,
|
|
116
|
+
(creationOrDisposal) => {
|
|
117
|
+
handleStateLifecycleEvent(creationOrDisposal, tl, store)
|
|
118
|
+
},
|
|
119
|
+
),
|
|
120
|
+
)
|
|
121
|
+
for (const atom of target.atoms.values()) {
|
|
122
|
+
if (atom.family?.key === familyKey) {
|
|
123
|
+
addAtomToTimeline(atom, tl, store)
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
break
|
|
128
|
+
case `atom`:
|
|
129
|
+
case `mutable_atom`:
|
|
130
|
+
{
|
|
131
|
+
let atom = withdraw(tokenOrFamily, store)
|
|
132
|
+
if (isMutable(atom)) {
|
|
133
|
+
const updateAtom = withdraw(getUpdateToken(atom), store)
|
|
134
|
+
atom = updateAtom
|
|
135
|
+
atomKey = atom.key
|
|
136
|
+
}
|
|
137
|
+
if (`family` in atom) {
|
|
138
|
+
const familyTimelineKey = target.timelineAtoms.getRelatedKey(
|
|
139
|
+
atom.family.key,
|
|
140
|
+
)
|
|
141
|
+
if (familyTimelineKey) {
|
|
142
|
+
store.logger.error(
|
|
143
|
+
`❌`,
|
|
144
|
+
`timeline`,
|
|
145
|
+
options.key,
|
|
146
|
+
`Failed to add atom "${atom.key}" because its family "${atom.family.key}" already belongs to timeline "${familyTimelineKey}"`,
|
|
147
|
+
)
|
|
148
|
+
continue
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const existingTimelineKey = target.timelineAtoms.getRelatedKey(atomKey)
|
|
152
|
+
if (existingTimelineKey) {
|
|
153
|
+
store.logger.error(
|
|
154
|
+
`❌`,
|
|
155
|
+
`timeline`,
|
|
156
|
+
options.key,
|
|
157
|
+
`Failed to add atom "${atomKey}" because it already belongs to timeline "${existingTimelineKey}"`,
|
|
158
|
+
)
|
|
159
|
+
continue
|
|
160
|
+
}
|
|
98
161
|
addAtomToTimeline(atom, tl, store)
|
|
99
162
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
163
|
+
break
|
|
164
|
+
case `molecule_family`:
|
|
165
|
+
{
|
|
166
|
+
const family = store.moleculeFamilies.get(tokenOrFamily.key)
|
|
167
|
+
if (family) {
|
|
168
|
+
tl.subscriptions.set(
|
|
169
|
+
tokenOrFamily.key,
|
|
170
|
+
family.subject.subscribe(
|
|
171
|
+
`timeline:${options.key}`,
|
|
172
|
+
(creationOrDisposal) => {
|
|
173
|
+
switch (creationOrDisposal.type) {
|
|
174
|
+
case `molecule_creation`:
|
|
175
|
+
{
|
|
176
|
+
const molecule = store.molecules.get(
|
|
177
|
+
stringifyJson(creationOrDisposal.token.key),
|
|
178
|
+
)
|
|
179
|
+
if (molecule) {
|
|
180
|
+
const event = Object.assign(creationOrDisposal, {
|
|
181
|
+
timestamp: Date.now(),
|
|
182
|
+
})
|
|
183
|
+
tl.history.push(event)
|
|
184
|
+
tl.at = tl.history.length
|
|
185
|
+
tl.subject.next(event)
|
|
186
|
+
|
|
187
|
+
for (const token of molecule.tokens) {
|
|
188
|
+
switch (token.type) {
|
|
189
|
+
case `atom`:
|
|
190
|
+
case `mutable_atom`:
|
|
191
|
+
addAtomToTimeline(token, tl, store)
|
|
192
|
+
break
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
tl.subscriptions.set(
|
|
196
|
+
molecule.key,
|
|
197
|
+
molecule.subject.subscribe(
|
|
198
|
+
`timeline:${options.key}`,
|
|
199
|
+
(stateCreationOrDisposal) => {
|
|
200
|
+
handleStateLifecycleEvent(
|
|
201
|
+
stateCreationOrDisposal,
|
|
202
|
+
tl,
|
|
203
|
+
store,
|
|
204
|
+
)
|
|
205
|
+
},
|
|
206
|
+
),
|
|
207
|
+
)
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
break
|
|
211
|
+
case `molecule_disposal`:
|
|
212
|
+
tl.subscriptions.get(creationOrDisposal.token.key)?.()
|
|
213
|
+
tl.subscriptions.delete(creationOrDisposal.token.key)
|
|
214
|
+
for (const familyKey of creationOrDisposal.familyKeys) {
|
|
215
|
+
const stateKey = `${familyKey}(${stringifyJson(
|
|
216
|
+
creationOrDisposal.token.key,
|
|
217
|
+
)})`
|
|
218
|
+
tl.subscriptions.get(stateKey)?.()
|
|
219
|
+
tl.subscriptions.delete(stateKey)
|
|
220
|
+
}
|
|
221
|
+
break
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
),
|
|
225
|
+
)
|
|
226
|
+
}
|
|
120
227
|
}
|
|
121
|
-
|
|
122
|
-
const existingTimelineKey = target.timelineAtoms.getRelatedKey(atomKey)
|
|
123
|
-
if (existingTimelineKey) {
|
|
124
|
-
store.logger.error(
|
|
125
|
-
`❌`,
|
|
126
|
-
`timeline`,
|
|
127
|
-
options.key,
|
|
128
|
-
`Failed to add atom "${atomKey}" because it already belongs to timeline "${existingTimelineKey}"`,
|
|
129
|
-
)
|
|
130
|
-
continue
|
|
131
|
-
}
|
|
132
|
-
addAtomToTimeline(atom, tl, store)
|
|
228
|
+
break
|
|
133
229
|
}
|
|
134
230
|
}
|
|
135
231
|
|
|
@@ -141,3 +237,28 @@ export function createTimeline<ManagedAtom extends TimelineManageable>(
|
|
|
141
237
|
store.on.timelineCreation.next(token)
|
|
142
238
|
return token
|
|
143
239
|
}
|
|
240
|
+
|
|
241
|
+
function handleStateLifecycleEvent(
|
|
242
|
+
event: StateCreation<any> | StateDisposal<any>,
|
|
243
|
+
tl: Timeline<any>,
|
|
244
|
+
store: Store,
|
|
245
|
+
): void {
|
|
246
|
+
const timestamp = Date.now()
|
|
247
|
+
const timelineEvent = Object.assign(event, {
|
|
248
|
+
timestamp,
|
|
249
|
+
}) as TimelineUpdate<any>
|
|
250
|
+
if (!tl.timeTraveling) {
|
|
251
|
+
tl.history.push(timelineEvent)
|
|
252
|
+
tl.at = tl.history.length
|
|
253
|
+
tl.subject.next(timelineEvent)
|
|
254
|
+
}
|
|
255
|
+
switch (event.type) {
|
|
256
|
+
case `state_creation`:
|
|
257
|
+
addAtomToTimeline(event.token, tl, store)
|
|
258
|
+
break
|
|
259
|
+
case `state_disposal`:
|
|
260
|
+
tl.subscriptions.get(event.token.key)?.()
|
|
261
|
+
tl.subscriptions.delete(event.token.key)
|
|
262
|
+
break
|
|
263
|
+
}
|
|
264
|
+
}
|
|
@@ -2,6 +2,10 @@ import type { TimelineToken } from "atom.io"
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
ingestAtomUpdate,
|
|
5
|
+
ingestCreationEvent,
|
|
6
|
+
ingestDisposalEvent,
|
|
7
|
+
ingestMoleculeCreationEvent,
|
|
8
|
+
ingestMoleculeDisposalEvent,
|
|
5
9
|
ingestSelectorUpdate,
|
|
6
10
|
ingestTransactionUpdate,
|
|
7
11
|
} from "../ingest-updates"
|
|
@@ -64,6 +68,22 @@ export const timeTravel = (
|
|
|
64
68
|
ingestTransactionUpdate(applying, update, store)
|
|
65
69
|
break
|
|
66
70
|
}
|
|
71
|
+
case `state_creation`: {
|
|
72
|
+
ingestCreationEvent(update, applying, store)
|
|
73
|
+
break
|
|
74
|
+
}
|
|
75
|
+
case `state_disposal`: {
|
|
76
|
+
ingestDisposalEvent(update, applying, store)
|
|
77
|
+
break
|
|
78
|
+
}
|
|
79
|
+
case `molecule_creation`: {
|
|
80
|
+
ingestMoleculeCreationEvent(update, applying, store)
|
|
81
|
+
break
|
|
82
|
+
}
|
|
83
|
+
case `molecule_disposal`: {
|
|
84
|
+
ingestMoleculeDisposalEvent(update, applying, store)
|
|
85
|
+
break
|
|
86
|
+
}
|
|
67
87
|
}
|
|
68
88
|
|
|
69
89
|
if (action === `redo`) {
|
|
@@ -46,19 +46,9 @@ export const applyTransaction = <F extends Func>(
|
|
|
46
46
|
}
|
|
47
47
|
tracker.dispose()
|
|
48
48
|
}
|
|
49
|
-
|
|
50
|
-
if (!parent.atoms.has(atom.key)) {
|
|
51
|
-
parent.atoms.set(atom.key, atom)
|
|
52
|
-
parent.valueMap.set(atom.key, atom.default)
|
|
53
|
-
parent.logger.info(
|
|
54
|
-
`🔨`,
|
|
55
|
-
`transaction`,
|
|
56
|
-
child.transactionMeta.update.key,
|
|
57
|
-
`Adding atom "${atom.key}"`,
|
|
58
|
-
)
|
|
59
|
-
}
|
|
60
|
-
}
|
|
49
|
+
|
|
61
50
|
ingestTransactionUpdate(`newValue`, child.transactionMeta.update, parent)
|
|
51
|
+
|
|
62
52
|
if (isRootStore(parent)) {
|
|
63
53
|
setEpochNumberOfAction(
|
|
64
54
|
child.transactionMeta.update.key,
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Func } from "atom.io"
|
|
2
|
+
import type { findState } from "atom.io/ephemeral"
|
|
3
|
+
import { makeMoleculeInStore, type seekState } from "atom.io/immortal"
|
|
2
4
|
|
|
3
5
|
import { Junction } from "~/packages/rel8/junction/src"
|
|
4
6
|
|
|
5
7
|
import { arbitrary } from "../arbitrary"
|
|
6
|
-
import { findInStore } from "../families"
|
|
8
|
+
import { disposeFromStore, findInStore, seekInStore } from "../families"
|
|
7
9
|
import { getEnvironmentData } from "../get-environment-data"
|
|
8
10
|
import { getFromStore } from "../get-state"
|
|
9
11
|
import { LazyMap } from "../lazy-map"
|
|
10
12
|
import { newest } from "../lineage"
|
|
13
|
+
import { getJsonToken } from "../mutable"
|
|
11
14
|
import { setIntoStore } from "../set-state"
|
|
12
15
|
import type { Store } from "../store"
|
|
13
16
|
import type { TransactionProgress } from "."
|
|
@@ -43,11 +46,15 @@ export const buildTransaction = (
|
|
|
43
46
|
}),
|
|
44
47
|
selectors: new LazyMap(parent.selectors),
|
|
45
48
|
valueMap: new LazyMap(parent.valueMap),
|
|
49
|
+
molecules: new LazyMap(parent.molecules),
|
|
50
|
+
moleculeFamilies: new LazyMap(parent.moleculeFamilies),
|
|
51
|
+
miscResources: new LazyMap(parent.miscResources),
|
|
46
52
|
}
|
|
47
53
|
const epoch = getEpochNumberOfAction(key, store)
|
|
48
54
|
const transactionMeta: TransactionProgress<Func> = {
|
|
49
55
|
phase: `building`,
|
|
50
56
|
update: {
|
|
57
|
+
type: `transaction_update`,
|
|
51
58
|
key,
|
|
52
59
|
id,
|
|
53
60
|
epoch: epoch === undefined ? Number.NaN : epoch + 1,
|
|
@@ -63,6 +70,13 @@ export const buildTransaction = (
|
|
|
63
70
|
run: (token, identifier = arbitrary()) =>
|
|
64
71
|
actUponStore(token, identifier, child),
|
|
65
72
|
find: ((token, k) => findInStore(token, k, child)) as typeof findState,
|
|
73
|
+
seek: ((token, k) => seekInStore(token, k, child)) as typeof seekState,
|
|
74
|
+
json: (token) => getJsonToken(token, child),
|
|
75
|
+
make: (context, family, k, ...args) =>
|
|
76
|
+
makeMoleculeInStore(child, context, family, k, ...args),
|
|
77
|
+
dispose: (token) => {
|
|
78
|
+
disposeFromStore(token, child)
|
|
79
|
+
},
|
|
66
80
|
env: () => getEnvironmentData(child),
|
|
67
81
|
},
|
|
68
82
|
}
|
|
@@ -66,55 +66,45 @@ var attachAtomIndex = (store = Internal2.IMPLICIT.STORE) => {
|
|
|
66
66
|
},
|
|
67
67
|
effects: [
|
|
68
68
|
({ setSelf }) => {
|
|
69
|
-
|
|
70
|
-
`
|
|
71
|
-
|
|
72
|
-
if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
setSelf((self) => {
|
|
76
|
-
if (atomToken.family) {
|
|
77
|
-
const { key: familyKey, subKey } = atomToken.family;
|
|
78
|
-
let familyNode = self.get(familyKey);
|
|
79
|
-
if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
|
|
80
|
-
familyNode = {
|
|
81
|
-
key: familyKey,
|
|
82
|
-
familyMembers: /* @__PURE__ */ new Map()
|
|
83
|
-
};
|
|
84
|
-
self.set(familyKey, familyNode);
|
|
85
|
-
}
|
|
86
|
-
familyNode.familyMembers.set(subKey, atomToken);
|
|
87
|
-
} else {
|
|
88
|
-
self.set(atomToken.key, atomToken);
|
|
89
|
-
}
|
|
90
|
-
return self;
|
|
91
|
-
});
|
|
69
|
+
store.on.atomCreation.subscribe(`introspection`, (atomToken) => {
|
|
70
|
+
if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
|
|
71
|
+
return;
|
|
92
72
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
73
|
+
setSelf((self) => {
|
|
74
|
+
if (atomToken.family) {
|
|
75
|
+
const { key: familyKey, subKey } = atomToken.family;
|
|
76
|
+
let familyNode = self.get(familyKey);
|
|
77
|
+
if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
|
|
78
|
+
familyNode = {
|
|
79
|
+
key: familyKey,
|
|
80
|
+
familyMembers: /* @__PURE__ */ new Map()
|
|
81
|
+
};
|
|
82
|
+
self.set(familyKey, familyNode);
|
|
83
|
+
}
|
|
84
|
+
familyNode.familyMembers.set(subKey, atomToken);
|
|
85
|
+
} else {
|
|
86
|
+
self.set(atomToken.key, atomToken);
|
|
87
|
+
}
|
|
88
|
+
return self;
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
store.on.atomDisposal.subscribe(`introspection`, (atomToken) => {
|
|
92
|
+
setSelf((self) => {
|
|
93
|
+
if (atomToken.family) {
|
|
94
|
+
const { key: familyKey, subKey } = atomToken.family;
|
|
95
|
+
const familyNode = self.get(familyKey);
|
|
96
|
+
if (familyNode && `familyMembers` in familyNode) {
|
|
97
|
+
familyNode.familyMembers.delete(subKey);
|
|
98
|
+
if (familyNode.familyMembers.size === 0) {
|
|
99
|
+
self.delete(familyKey);
|
|
106
100
|
}
|
|
107
|
-
} else {
|
|
108
|
-
self.delete(atomToken.key);
|
|
109
101
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
unsubscribeFromAtomDisposal();
|
|
117
|
-
};
|
|
102
|
+
} else {
|
|
103
|
+
self.delete(atomToken.key);
|
|
104
|
+
}
|
|
105
|
+
return self;
|
|
106
|
+
});
|
|
107
|
+
});
|
|
118
108
|
}
|
|
119
109
|
]
|
|
120
110
|
},
|
|
@@ -159,7 +149,7 @@ var attachSelectorIndex = (store = Internal2.IMPLICIT.STORE) => {
|
|
|
159
149
|
},
|
|
160
150
|
effects: [
|
|
161
151
|
({ setSelf }) => {
|
|
162
|
-
|
|
152
|
+
store.on.selectorCreation.subscribe(
|
|
163
153
|
`introspection`,
|
|
164
154
|
(selectorToken) => {
|
|
165
155
|
if (selectorToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
|
|
@@ -184,7 +174,7 @@ var attachSelectorIndex = (store = Internal2.IMPLICIT.STORE) => {
|
|
|
184
174
|
});
|
|
185
175
|
}
|
|
186
176
|
);
|
|
187
|
-
|
|
177
|
+
store.on.selectorDisposal.subscribe(
|
|
188
178
|
`introspection`,
|
|
189
179
|
(selectorToken) => {
|
|
190
180
|
setSelf((self) => {
|
|
@@ -204,10 +194,6 @@ var attachSelectorIndex = (store = Internal2.IMPLICIT.STORE) => {
|
|
|
204
194
|
});
|
|
205
195
|
}
|
|
206
196
|
);
|
|
207
|
-
return () => {
|
|
208
|
-
unsubscribeFromSelectorCreation();
|
|
209
|
-
unsubscribeFromSelectorDisposal();
|
|
210
|
-
};
|
|
211
197
|
}
|
|
212
198
|
]
|
|
213
199
|
},
|
|
@@ -238,7 +224,8 @@ var attachTimelineFamily = (store = Internal2.IMPLICIT.STORE) => {
|
|
|
238
224
|
transactionKey: null,
|
|
239
225
|
install: () => {
|
|
240
226
|
},
|
|
241
|
-
subject: new Internal2.Subject()
|
|
227
|
+
subject: new Internal2.Subject(),
|
|
228
|
+
subscriptions: /* @__PURE__ */ new Map()
|
|
242
229
|
};
|
|
243
230
|
},
|
|
244
231
|
effects: (key) => [
|
|
@@ -31,55 +31,45 @@ var attachAtomIndex = (store = IMPLICIT.STORE) => {
|
|
|
31
31
|
},
|
|
32
32
|
effects: [
|
|
33
33
|
({ setSelf }) => {
|
|
34
|
-
|
|
35
|
-
`
|
|
36
|
-
|
|
37
|
-
if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
setSelf((self) => {
|
|
41
|
-
if (atomToken.family) {
|
|
42
|
-
const { key: familyKey, subKey } = atomToken.family;
|
|
43
|
-
let familyNode = self.get(familyKey);
|
|
44
|
-
if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
|
|
45
|
-
familyNode = {
|
|
46
|
-
key: familyKey,
|
|
47
|
-
familyMembers: /* @__PURE__ */ new Map()
|
|
48
|
-
};
|
|
49
|
-
self.set(familyKey, familyNode);
|
|
50
|
-
}
|
|
51
|
-
familyNode.familyMembers.set(subKey, atomToken);
|
|
52
|
-
} else {
|
|
53
|
-
self.set(atomToken.key, atomToken);
|
|
54
|
-
}
|
|
55
|
-
return self;
|
|
56
|
-
});
|
|
34
|
+
store.on.atomCreation.subscribe(`introspection`, (atomToken) => {
|
|
35
|
+
if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
|
|
36
|
+
return;
|
|
57
37
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
38
|
+
setSelf((self) => {
|
|
39
|
+
if (atomToken.family) {
|
|
40
|
+
const { key: familyKey, subKey } = atomToken.family;
|
|
41
|
+
let familyNode = self.get(familyKey);
|
|
42
|
+
if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
|
|
43
|
+
familyNode = {
|
|
44
|
+
key: familyKey,
|
|
45
|
+
familyMembers: /* @__PURE__ */ new Map()
|
|
46
|
+
};
|
|
47
|
+
self.set(familyKey, familyNode);
|
|
48
|
+
}
|
|
49
|
+
familyNode.familyMembers.set(subKey, atomToken);
|
|
50
|
+
} else {
|
|
51
|
+
self.set(atomToken.key, atomToken);
|
|
52
|
+
}
|
|
53
|
+
return self;
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
store.on.atomDisposal.subscribe(`introspection`, (atomToken) => {
|
|
57
|
+
setSelf((self) => {
|
|
58
|
+
if (atomToken.family) {
|
|
59
|
+
const { key: familyKey, subKey } = atomToken.family;
|
|
60
|
+
const familyNode = self.get(familyKey);
|
|
61
|
+
if (familyNode && `familyMembers` in familyNode) {
|
|
62
|
+
familyNode.familyMembers.delete(subKey);
|
|
63
|
+
if (familyNode.familyMembers.size === 0) {
|
|
64
|
+
self.delete(familyKey);
|
|
71
65
|
}
|
|
72
|
-
} else {
|
|
73
|
-
self.delete(atomToken.key);
|
|
74
66
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
unsubscribeFromAtomDisposal();
|
|
82
|
-
};
|
|
67
|
+
} else {
|
|
68
|
+
self.delete(atomToken.key);
|
|
69
|
+
}
|
|
70
|
+
return self;
|
|
71
|
+
});
|
|
72
|
+
});
|
|
83
73
|
}
|
|
84
74
|
]
|
|
85
75
|
},
|
|
@@ -124,7 +114,7 @@ var attachSelectorIndex = (store = IMPLICIT.STORE) => {
|
|
|
124
114
|
},
|
|
125
115
|
effects: [
|
|
126
116
|
({ setSelf }) => {
|
|
127
|
-
|
|
117
|
+
store.on.selectorCreation.subscribe(
|
|
128
118
|
`introspection`,
|
|
129
119
|
(selectorToken) => {
|
|
130
120
|
if (selectorToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
|
|
@@ -149,7 +139,7 @@ var attachSelectorIndex = (store = IMPLICIT.STORE) => {
|
|
|
149
139
|
});
|
|
150
140
|
}
|
|
151
141
|
);
|
|
152
|
-
|
|
142
|
+
store.on.selectorDisposal.subscribe(
|
|
153
143
|
`introspection`,
|
|
154
144
|
(selectorToken) => {
|
|
155
145
|
setSelf((self) => {
|
|
@@ -169,10 +159,6 @@ var attachSelectorIndex = (store = IMPLICIT.STORE) => {
|
|
|
169
159
|
});
|
|
170
160
|
}
|
|
171
161
|
);
|
|
172
|
-
return () => {
|
|
173
|
-
unsubscribeFromSelectorCreation();
|
|
174
|
-
unsubscribeFromSelectorDisposal();
|
|
175
|
-
};
|
|
176
162
|
}
|
|
177
163
|
]
|
|
178
164
|
},
|
|
@@ -203,7 +189,8 @@ var attachTimelineFamily = (store = IMPLICIT.STORE) => {
|
|
|
203
189
|
transactionKey: null,
|
|
204
190
|
install: () => {
|
|
205
191
|
},
|
|
206
|
-
subject: new Subject()
|
|
192
|
+
subject: new Subject(),
|
|
193
|
+
subscriptions: /* @__PURE__ */ new Map()
|
|
207
194
|
};
|
|
208
195
|
},
|
|
209
196
|
effects: (key) => [
|