atom.io 0.14.1 → 0.14.2
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 +12 -64
- package/data/dist/index.cjs.map +1 -1
- package/data/dist/index.d.cts +2 -0
- package/data/dist/index.js +1 -1
- package/dist/{chunk-KW7RA7IM.js → chunk-C4YZZNRH.js} +4 -4
- package/dist/{chunk-LFXB7Y6M.js → chunk-CWKKQKVQ.js} +2 -2
- package/dist/{chunk-CK7GNCU5.js → chunk-GMN5KH6A.js} +2 -2
- package/dist/{chunk-5VJ77LZE.js → chunk-N7ADBQJG.js} +2 -2
- package/dist/{chunk-TE3ZSTQ6.js → chunk-PURABO5G.js} +92 -27
- package/dist/chunk-PURABO5G.js.map +1 -0
- package/dist/index.cjs +106 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -1
- package/dist/index.js +1 -1
- package/dist/metafile-cjs.json +1 -1
- package/internal/dist/index.cjs +93 -29
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.cts +6 -4
- package/internal/dist/index.js +1 -1
- package/internal/src/atom/create-atom.ts +3 -1
- package/internal/src/families/create-atom-family.ts +3 -4
- package/internal/src/mutable/get-update-family.ts +23 -0
- package/internal/src/mutable/index.ts +1 -4
- package/internal/src/mutable/is-mutable.ts +44 -0
- package/internal/src/mutable/tracker.ts +9 -2
- package/internal/src/subject.ts +2 -1
- package/internal/src/timeline/add-atom-to-timeline.ts +10 -1
- package/internal/src/timeline/create-timeline.ts +44 -16
- package/introspection/dist/index.cjs +12 -64
- package/introspection/dist/index.cjs.map +1 -1
- package/introspection/dist/index.d.cts +2 -0
- package/introspection/dist/index.js +2 -2
- package/json/dist/index.cjs +9 -64
- package/json/dist/index.cjs.map +1 -1
- package/json/dist/index.d.cts +2 -0
- package/json/dist/index.js +1 -1
- package/package.json +1 -1
- package/react/dist/index.cjs +9 -64
- package/react/dist/index.cjs.map +1 -1
- package/react/dist/index.d.cts +2 -0
- package/react/dist/index.js +2 -2
- package/react-devtools/dist/index.cjs +12 -64
- package/react-devtools/dist/index.cjs.map +1 -1
- package/react-devtools/dist/index.d.cts +2 -0
- package/react-devtools/dist/index.js +3 -3
- package/realtime-client/dist/index.cjs +9 -64
- package/realtime-client/dist/index.cjs.map +1 -1
- package/realtime-client/dist/index.d.cts +2 -0
- package/realtime-client/dist/index.js +2 -2
- package/realtime-react/dist/index.cjs +9 -64
- package/realtime-react/dist/index.cjs.map +1 -1
- package/realtime-react/dist/index.js +4 -4
- package/realtime-server/dist/index.cjs +9 -64
- package/realtime-server/dist/index.cjs.map +1 -1
- package/realtime-server/dist/index.d.cts +4 -1
- package/realtime-server/dist/index.js +1 -1
- package/realtime-testing/dist/index.cjs +104 -79
- package/realtime-testing/dist/index.cjs.map +1 -1
- package/realtime-testing/dist/index.d.cts +4 -1
- package/realtime-testing/dist/index.js +4 -4
- package/src/atom.ts +3 -1
- package/transceivers/set-rtx/dist/index.cjs +2 -1
- package/transceivers/set-rtx/dist/index.cjs.map +1 -1
- package/transceivers/set-rtx/dist/index.js +1 -1
- package/dist/chunk-TE3ZSTQ6.js.map +0 -1
- package/internal/src/mutable/is-atom-token-mutable.ts +0 -7
- /package/dist/{chunk-KW7RA7IM.js.map → chunk-C4YZZNRH.js.map} +0 -0
- /package/dist/{chunk-LFXB7Y6M.js.map → chunk-CWKKQKVQ.js.map} +0 -0
- /package/dist/{chunk-CK7GNCU5.js.map → chunk-GMN5KH6A.js.map} +0 -0
- /package/dist/{chunk-5VJ77LZE.js.map → chunk-N7ADBQJG.js.map} +0 -0
|
@@ -36,14 +36,16 @@ type AtomFamily<T, K extends Serializable = Serializable> = ((key: K) => AtomTok
|
|
|
36
36
|
key: string;
|
|
37
37
|
type: `atom_family`;
|
|
38
38
|
subject: Subject<AtomToken<T>>;
|
|
39
|
+
mutable?: boolean;
|
|
39
40
|
};
|
|
40
41
|
type MutableAtomFamilyOptions<T extends Transceiver<any>, J extends Serializable, K extends Serializable> = AtomFamilyOptions<T, K> & JsonInterface<T, J> & {
|
|
41
42
|
mutable: true;
|
|
42
43
|
};
|
|
43
44
|
type MutableAtomFamily<Core extends Transceiver<any>, SerializableCore extends Serializable, Key extends Serializable> = JsonInterface<Core, SerializableCore> & ((key: Key) => MutableAtomToken<Core, SerializableCore>) & {
|
|
44
|
-
key: `${string}
|
|
45
|
+
key: `${string}`;
|
|
45
46
|
type: `atom_family`;
|
|
46
47
|
subject: Subject<MutableAtomToken<Core, SerializableCore>>;
|
|
48
|
+
mutable: true;
|
|
47
49
|
};
|
|
48
50
|
|
|
49
51
|
declare const LoggerIconDictionary: {
|
|
@@ -405,7 +407,7 @@ declare const getJsonToken: <Core extends Transceiver<Serializable>, Serializabl
|
|
|
405
407
|
|
|
406
408
|
declare const getUpdateToken: <Core extends Transceiver<Serializable>, SerializableCore extends Serializable>(mutableAtomToken: MutableAtomToken<Core, SerializableCore>) => AtomToken<Signal<Core>>;
|
|
407
409
|
|
|
408
|
-
declare
|
|
410
|
+
declare const getUpdateFamily: <Core extends Transceiver<Serializable>, SerializableCore extends Serializable, Key extends string>(mutableAtomFamily: MutableAtomFamily<Core, SerializableCore, Key>, store: Store) => AtomFamily<Signal<Core> | null, Key>;
|
|
409
411
|
|
|
410
412
|
/**
|
|
411
413
|
* @internal Give the tracker a transceiver state and a store, and it will
|
|
@@ -433,7 +435,6 @@ declare class FamilyTracker<Core extends Transceiver<any>, FamilyMemberKey exten
|
|
|
433
435
|
interface MutableAtom<T> extends Atom<T> {
|
|
434
436
|
mutable: true;
|
|
435
437
|
}
|
|
436
|
-
declare const isAtomMutable: <T>(atom: Atom<T>) => atom is MutableAtom<T>;
|
|
437
438
|
|
|
438
439
|
type OperationProgress = {
|
|
439
440
|
open: false;
|
|
@@ -541,6 +542,7 @@ declare function withdrawNewFamilyMember<T>(token: ReadonlySelectorToken<T> | St
|
|
|
541
542
|
type Atom<T> = {
|
|
542
543
|
key: string;
|
|
543
544
|
type: `atom`;
|
|
545
|
+
mutable?: boolean;
|
|
544
546
|
family?: FamilyMetadata;
|
|
545
547
|
install: (store: Store) => void;
|
|
546
548
|
subject: Subject<{
|
|
@@ -617,4 +619,4 @@ declare const subscribeToTimeline: (token: TimelineToken, handleUpdate: (update:
|
|
|
617
619
|
|
|
618
620
|
declare const subscribeToTransaction: <ƒ extends ƒn>(token: TransactionToken<ƒ>, handleUpdate: TransactionUpdateHandler<ƒ>, key: string, store: Store) => (() => void);
|
|
619
621
|
|
|
620
|
-
export { type Atom, type AtomKey, FamilyTracker, Future, IMPLICIT, LazyMap, type Lineage, type Modify, type MutableAtom, NotFoundError, type OperationProgress, type ReadonlySelector, type ReadonlySelectorKey, type Selector, type SelectorKey, type Signal, type StateKey, StatefulSubject, Store, Subject, TRANSACTION_PHASES, type Timeline, type TimelineAtomUpdate, type TimelineSelectorUpdate, type TimelineTransactionUpdate, Tracker, type Transaction, type TransactionMeta, type TransactionPhase, type Transceiver, type TransceiverMode, abortTransaction, addAtomToTimeline, applyTransaction, become, buildTransaction, cacheValue, clearStore, closeOperation, createAtom, createAtomFamily, createMutableAtom, createMutableAtomFamily, createReadonlySelectorFamily, createSelector, createSelectorFamily, createTimeline, createTransaction, deleteAtom, deleteSelector, deposit, eldest, evictCachedValue, getJsonFamily, getJsonToken, getSelectorDependencyKeys, getUpdateToken, isAtomDefault, isAtomKey,
|
|
622
|
+
export { type Atom, type AtomKey, FamilyTracker, Future, IMPLICIT, LazyMap, type Lineage, type Modify, type MutableAtom, NotFoundError, type OperationProgress, type ReadonlySelector, type ReadonlySelectorKey, type Selector, type SelectorKey, type Signal, type StateKey, StatefulSubject, Store, Subject, TRANSACTION_PHASES, type Timeline, type TimelineAtomUpdate, type TimelineSelectorUpdate, type TimelineTransactionUpdate, Tracker, type Transaction, type TransactionMeta, type TransactionPhase, type Transceiver, type TransceiverMode, abortTransaction, addAtomToTimeline, applyTransaction, become, buildTransaction, cacheValue, clearStore, closeOperation, createAtom, createAtomFamily, createMutableAtom, createMutableAtomFamily, createReadonlySelectorFamily, createSelector, createSelectorFamily, createTimeline, createTransaction, deleteAtom, deleteSelector, deposit, eldest, evictCachedValue, getJsonFamily, getJsonToken, getSelectorDependencyKeys, getUpdateFamily, getUpdateToken, isAtomDefault, isAtomKey, isDone, isReadonlySelectorKey, isSelectorDefault, isSelectorKey, isStateKey, isTransceiver, isValueCached, markAtomAsDefault, markAtomAsNotDefault, markDone, newest, openOperation, readCachedValue, readOrComputeValue, redoTransactionUpdate, registerSelector, setAtomOrSelector, subscribeToRootAtoms, subscribeToState, subscribeToTimeline, subscribeToTransaction, timeTravel, traceAllSelectorAtoms, traceSelectorAtoms, undoTransactionUpdate, updateSelectorAtoms, withdraw, withdrawNewFamilyMember };
|
package/internal/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { FamilyTracker, Future, IMPLICIT, LazyMap, NotFoundError, StatefulSubject, Store, Subject, TRANSACTION_PHASES, Tracker, abortTransaction, addAtomToTimeline, applyTransaction, become, buildTransaction, cacheValue, clearStore, closeOperation, createAtom, createAtomFamily, createMutableAtom, createMutableAtomFamily, createReadonlySelectorFamily, createSelector, createSelectorFamily, createTimeline, createTransaction, deleteAtom, deleteSelector, deposit, eldest, evictCachedValue, getJsonFamily, getJsonToken, getSelectorDependencyKeys, getUpdateToken, isAtomDefault, isAtomKey,
|
|
1
|
+
export { FamilyTracker, Future, IMPLICIT, LazyMap, NotFoundError, StatefulSubject, Store, Subject, TRANSACTION_PHASES, Tracker, abortTransaction, addAtomToTimeline, applyTransaction, become, buildTransaction, cacheValue, clearStore, closeOperation, createAtom, createAtomFamily, createMutableAtom, createMutableAtomFamily, createReadonlySelectorFamily, createSelector, createSelectorFamily, createTimeline, createTransaction, deleteAtom, deleteSelector, deposit, eldest, evictCachedValue, getJsonFamily, getJsonToken, getSelectorDependencyKeys, getUpdateFamily, getUpdateToken, isAtomDefault, isAtomKey, isDone, isReadonlySelectorKey, isSelectorDefault, isSelectorKey, isStateKey, isTransceiver, isValueCached, markAtomAsDefault, markAtomAsNotDefault, markDone, newest, openOperation, readCachedValue, readOrComputeValue, redoTransactionUpdate, registerSelector, setAtomOrSelector, subscribeToRootAtoms, subscribeToState, subscribeToTimeline, subscribeToTransaction, timeTravel, traceAllSelectorAtoms, traceSelectorAtoms, undoTransactionUpdate, updateSelectorAtoms, withdraw, withdrawNewFamilyMember } from '../../dist/chunk-PURABO5G.js';
|
|
2
2
|
//# sourceMappingURL=out.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -6,10 +6,11 @@ import type {
|
|
|
6
6
|
UpdateHandler,
|
|
7
7
|
} from "atom.io"
|
|
8
8
|
import { setState } from "atom.io"
|
|
9
|
+
import { Json } from "atom.io/json"
|
|
9
10
|
|
|
10
11
|
import { cacheValue } from "../caching"
|
|
11
12
|
import { newest } from "../lineage"
|
|
12
|
-
import { createMutableAtom } from "../mutable"
|
|
13
|
+
import { Transceiver, createMutableAtom } from "../mutable"
|
|
13
14
|
import type { Store } from "../store"
|
|
14
15
|
import { deposit } from "../store"
|
|
15
16
|
import { Subject } from "../subject"
|
|
@@ -19,6 +20,7 @@ import { markAtomAsDefault } from "./is-default"
|
|
|
19
20
|
export type Atom<T> = {
|
|
20
21
|
key: string
|
|
21
22
|
type: `atom`
|
|
23
|
+
mutable?: boolean
|
|
22
24
|
family?: FamilyMetadata
|
|
23
25
|
install: (store: Store) => void
|
|
24
26
|
subject: Subject<{ newValue: T; oldValue: T }>
|
|
@@ -39,10 +39,6 @@ export function createAtomFamily<T, K extends Json.Serializable>(
|
|
|
39
39
|
if (options.effects) {
|
|
40
40
|
individualOptions.effects = options.effects(key)
|
|
41
41
|
}
|
|
42
|
-
// if (`toJson` in options && `fromJson` in options) {
|
|
43
|
-
// individualOptions.toJson = options.toJson
|
|
44
|
-
// individualOptions.fromJson
|
|
45
|
-
// }
|
|
46
42
|
token = createAtom<T>(individualOptions, family, store)
|
|
47
43
|
subject.next(token)
|
|
48
44
|
}
|
|
@@ -54,6 +50,9 @@ export function createAtomFamily<T, K extends Json.Serializable>(
|
|
|
54
50
|
subject,
|
|
55
51
|
} as const,
|
|
56
52
|
)
|
|
53
|
+
if (`mutable` in options && typeof options.mutable === `boolean`) {
|
|
54
|
+
Object.assign(atomFamily, { mutable: options.mutable })
|
|
55
|
+
}
|
|
57
56
|
const target = newest(store)
|
|
58
57
|
target.families.set(options.key, atomFamily)
|
|
59
58
|
return atomFamily
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AtomFamily, MutableAtomFamily, SelectorFamily } from "atom.io"
|
|
2
|
+
import type { Json } from "atom.io/json"
|
|
3
|
+
|
|
4
|
+
import { newest } from "../lineage"
|
|
5
|
+
import type { Store } from "../store"
|
|
6
|
+
import type { Signal, Transceiver } from "./transceiver"
|
|
7
|
+
|
|
8
|
+
export const getUpdateFamily = <
|
|
9
|
+
Core extends Transceiver<Json.Serializable>,
|
|
10
|
+
SerializableCore extends Json.Serializable,
|
|
11
|
+
Key extends string,
|
|
12
|
+
>(
|
|
13
|
+
mutableAtomFamily: MutableAtomFamily<Core, SerializableCore, Key>,
|
|
14
|
+
store: Store,
|
|
15
|
+
): AtomFamily<Signal<Core> | null, Key> => {
|
|
16
|
+
const target = newest(store)
|
|
17
|
+
const key = `*${mutableAtomFamily.key}`
|
|
18
|
+
const updateFamily = target.families.get(key) as AtomFamily<
|
|
19
|
+
Signal<Core> | null,
|
|
20
|
+
Key
|
|
21
|
+
>
|
|
22
|
+
return updateFamily
|
|
23
|
+
}
|
|
@@ -5,7 +5,7 @@ export * from "./create-mutable-atom-family"
|
|
|
5
5
|
export * from "./get-json-family"
|
|
6
6
|
export * from "./get-json-token"
|
|
7
7
|
export * from "./get-update-token"
|
|
8
|
-
export * from "./
|
|
8
|
+
export * from "./get-update-family"
|
|
9
9
|
export * from "./tracker"
|
|
10
10
|
export * from "./tracker-family"
|
|
11
11
|
export * from "./transceiver"
|
|
@@ -13,6 +13,3 @@ export * from "./transceiver"
|
|
|
13
13
|
export interface MutableAtom<T> extends Atom<T> {
|
|
14
14
|
mutable: true
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
export const isAtomMutable = <T>(atom: Atom<T>): atom is MutableAtom<T> =>
|
|
18
|
-
`isMutable` in atom
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AtomFamily,
|
|
3
|
+
AtomToken,
|
|
4
|
+
MutableAtomFamily,
|
|
5
|
+
MutableAtomToken,
|
|
6
|
+
} from "~/packages/atom.io/src"
|
|
7
|
+
import type { MutableAtom } from "."
|
|
8
|
+
import type { Atom } from "../atom"
|
|
9
|
+
import type { Store } from "../store"
|
|
10
|
+
import { withdraw } from "../store"
|
|
11
|
+
|
|
12
|
+
export function isMutable(
|
|
13
|
+
token: AtomToken<any>,
|
|
14
|
+
store: Store,
|
|
15
|
+
): token is MutableAtomToken<any, any>
|
|
16
|
+
export function isMutable(atom: Atom<any>): atom is MutableAtom<any>
|
|
17
|
+
export function isMutable(
|
|
18
|
+
family: AtomFamily<any, any>,
|
|
19
|
+
): family is MutableAtomFamily<any, any, any>
|
|
20
|
+
export function isMutable(
|
|
21
|
+
atomOrTokenOrFamily: Atom<any> | AtomFamily<any, any> | AtomToken<any>,
|
|
22
|
+
store?: Store,
|
|
23
|
+
): boolean {
|
|
24
|
+
if (`mutable` in atomOrTokenOrFamily) {
|
|
25
|
+
return atomOrTokenOrFamily.mutable
|
|
26
|
+
}
|
|
27
|
+
if (atomOrTokenOrFamily.type === `atom_family`) {
|
|
28
|
+
return false
|
|
29
|
+
}
|
|
30
|
+
if (`default` in atomOrTokenOrFamily) {
|
|
31
|
+
return false
|
|
32
|
+
}
|
|
33
|
+
if (!store) {
|
|
34
|
+
throw new Error(`Cannot check mutability without a store`)
|
|
35
|
+
}
|
|
36
|
+
const atom = withdraw(atomOrTokenOrFamily, store)
|
|
37
|
+
if (!atom) {
|
|
38
|
+
throw new Error(`Cannot check mutability without an atom`)
|
|
39
|
+
}
|
|
40
|
+
if (`mutable` in atom) {
|
|
41
|
+
return atom.mutable
|
|
42
|
+
}
|
|
43
|
+
return false
|
|
44
|
+
}
|
|
@@ -20,7 +20,8 @@ export class Tracker<Mutable extends Transceiver<any>> {
|
|
|
20
20
|
store: Store,
|
|
21
21
|
): AtomToken<typeof this.Update | null> {
|
|
22
22
|
const latestUpdateStateKey = `*${mutableState.key}`
|
|
23
|
-
|
|
23
|
+
store.atoms.delete(latestUpdateStateKey)
|
|
24
|
+
store.valueMap.delete(latestUpdateStateKey)
|
|
24
25
|
const familyMetaData: FamilyMetadata | undefined = mutableState.family
|
|
25
26
|
? {
|
|
26
27
|
key: `*${mutableState.family.key}`,
|
|
@@ -37,6 +38,10 @@ export class Tracker<Mutable extends Transceiver<any>> {
|
|
|
37
38
|
familyMetaData,
|
|
38
39
|
store,
|
|
39
40
|
)
|
|
41
|
+
if (store.parent) {
|
|
42
|
+
const parentValue = store.parent.valueMap.get(latestUpdateStateKey)
|
|
43
|
+
store.valueMap.set(latestUpdateStateKey, parentValue)
|
|
44
|
+
}
|
|
40
45
|
|
|
41
46
|
return latestUpdateState
|
|
42
47
|
}
|
|
@@ -137,7 +142,9 @@ export class Tracker<Mutable extends Transceiver<any>> {
|
|
|
137
142
|
() => {
|
|
138
143
|
unsubscribe()
|
|
139
144
|
const mutable = getState(mutableState, store)
|
|
140
|
-
|
|
145
|
+
// debugger
|
|
146
|
+
const updateNumber =
|
|
147
|
+
newValue === null ? -1 : mutable.getUpdateNumber(newValue)
|
|
141
148
|
const eventOffset = updateNumber - mutable.cacheUpdateNumber
|
|
142
149
|
if (newValue && eventOffset === 1) {
|
|
143
150
|
// ❗ new:"0=add:\"myHand\"",old:"0=add:\"deckId\""
|
package/internal/src/subject.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { TransactionUpdate, ƒn } from "atom.io"
|
|
|
2
2
|
import type { AtomToken, TimelineUpdate } from "atom.io"
|
|
3
3
|
|
|
4
4
|
import { newest } from "../lineage"
|
|
5
|
+
import { getUpdateToken } from "../mutable"
|
|
5
6
|
import type { Store } from "../store"
|
|
6
7
|
import { withdraw } from "../store"
|
|
7
8
|
import type {
|
|
@@ -15,13 +16,21 @@ export const addAtomToTimeline = (
|
|
|
15
16
|
tl: Timeline,
|
|
16
17
|
store: Store,
|
|
17
18
|
): void => {
|
|
18
|
-
|
|
19
|
+
let maybeAtom = withdraw(atomToken, store)
|
|
20
|
+
if (maybeAtom?.mutable) {
|
|
21
|
+
console.log(`adding transceiver to timeline`, atomToken.key)
|
|
22
|
+
const updateToken = getUpdateToken(atomToken)
|
|
23
|
+
maybeAtom = withdraw(updateToken, store)
|
|
24
|
+
}
|
|
25
|
+
const atom = maybeAtom
|
|
19
26
|
if (atom === undefined) {
|
|
20
27
|
throw new Error(
|
|
21
28
|
`Cannot subscribe to atom "${atomToken.key}" because it has not been initialized in store "${store.config.name}"`,
|
|
22
29
|
)
|
|
23
30
|
}
|
|
31
|
+
|
|
24
32
|
atom.subject.subscribe(`timeline`, (update) => {
|
|
33
|
+
// debugger
|
|
25
34
|
const target = newest(store)
|
|
26
35
|
const currentSelectorKey =
|
|
27
36
|
store.operation.open && store.operation.token.type === `selector`
|
|
@@ -9,7 +9,10 @@ import type {
|
|
|
9
9
|
} from "atom.io"
|
|
10
10
|
|
|
11
11
|
import { newest } from "../lineage"
|
|
12
|
-
import
|
|
12
|
+
import { getUpdateToken } from "../mutable"
|
|
13
|
+
import { getUpdateFamily } from "../mutable/get-update-family"
|
|
14
|
+
import { isMutable } from "../mutable/is-mutable"
|
|
15
|
+
import { type Store, withdraw } from "../store"
|
|
13
16
|
import { Subject } from "../subject"
|
|
14
17
|
import { addAtomToTimeline } from "./add-atom-to-timeline"
|
|
15
18
|
|
|
@@ -70,21 +73,26 @@ export function createTimeline(
|
|
|
70
73
|
if (options.shouldCapture) {
|
|
71
74
|
tl.shouldCapture = options.shouldCapture
|
|
72
75
|
}
|
|
73
|
-
|
|
76
|
+
const timelineKey = options.key
|
|
74
77
|
const target = newest(store)
|
|
75
78
|
for (const tokenOrFamily of options.atoms) {
|
|
76
|
-
|
|
77
|
-
|
|
79
|
+
let atomKey = tokenOrFamily.key
|
|
80
|
+
const existingTimelineKey = target.timelineAtoms.getRelatedKey(atomKey)
|
|
81
|
+
if (existingTimelineKey) {
|
|
78
82
|
store.logger.error(
|
|
79
83
|
`❌`,
|
|
80
84
|
`timeline`,
|
|
81
85
|
options.key,
|
|
82
|
-
`Failed to add atom "${
|
|
86
|
+
`Failed to add atom "${atomKey}" because it already belongs to timeline "${existingTimelineKey}"`,
|
|
83
87
|
)
|
|
84
88
|
continue
|
|
85
89
|
}
|
|
86
90
|
if (tokenOrFamily.type === `atom_family`) {
|
|
87
|
-
|
|
91
|
+
let family = tokenOrFamily
|
|
92
|
+
if (isMutable(family)) {
|
|
93
|
+
family = getUpdateFamily(family, store)
|
|
94
|
+
atomKey = family.key
|
|
95
|
+
}
|
|
88
96
|
family.subject.subscribe(`timeline:${options.key}`, (token) => {
|
|
89
97
|
addAtomToTimeline(token, tl, store)
|
|
90
98
|
})
|
|
@@ -94,32 +102,52 @@ export function createTimeline(
|
|
|
94
102
|
}
|
|
95
103
|
}
|
|
96
104
|
} else {
|
|
97
|
-
|
|
98
|
-
if (
|
|
105
|
+
let atom = withdraw(tokenOrFamily, store)
|
|
106
|
+
if (atom === undefined) {
|
|
107
|
+
store.logger.error(
|
|
108
|
+
`❌`,
|
|
109
|
+
`timeline`,
|
|
110
|
+
options.key,
|
|
111
|
+
`Failed to add atom "${atomKey}" because it does not exist in the store`,
|
|
112
|
+
)
|
|
113
|
+
continue
|
|
114
|
+
}
|
|
115
|
+
if (isMutable(atom)) {
|
|
116
|
+
const updateAtom = withdraw(getUpdateToken(atom), store)
|
|
117
|
+
if (updateAtom === undefined) {
|
|
118
|
+
store.logger.error(
|
|
119
|
+
`❌`,
|
|
120
|
+
`timeline`,
|
|
121
|
+
options.key,
|
|
122
|
+
`Failed to add update atom "${atomKey}" because it does not exist in the store`,
|
|
123
|
+
)
|
|
124
|
+
continue
|
|
125
|
+
}
|
|
126
|
+
atom = updateAtom
|
|
127
|
+
atomKey = atom.key
|
|
128
|
+
}
|
|
129
|
+
if (`family` in atom) {
|
|
99
130
|
const familyTimelineKey = target.timelineAtoms.getRelatedKey(
|
|
100
|
-
|
|
131
|
+
atom.family.key,
|
|
101
132
|
)
|
|
102
133
|
if (familyTimelineKey) {
|
|
103
134
|
store.logger.error(
|
|
104
135
|
`❌`,
|
|
105
136
|
`timeline`,
|
|
106
137
|
options.key,
|
|
107
|
-
`Failed to add atom "${
|
|
138
|
+
`Failed to add atom "${atom.key}" because its family "${atom.family.key}" already belongs to timeline "${familyTimelineKey}"`,
|
|
108
139
|
)
|
|
109
140
|
continue
|
|
110
141
|
}
|
|
111
142
|
}
|
|
112
|
-
addAtomToTimeline(
|
|
143
|
+
addAtomToTimeline(atom, tl, store)
|
|
113
144
|
}
|
|
114
|
-
target.timelineAtoms
|
|
115
|
-
atomKey: tokenOrFamily.key,
|
|
116
|
-
timelineKey: options.key,
|
|
117
|
-
})
|
|
145
|
+
target.timelineAtoms.set({ atomKey, timelineKey })
|
|
118
146
|
}
|
|
119
147
|
|
|
120
148
|
store.timelines.set(options.key, tl)
|
|
121
149
|
const token: TimelineToken = {
|
|
122
|
-
key:
|
|
150
|
+
key: timelineKey,
|
|
123
151
|
type: `timeline`,
|
|
124
152
|
}
|
|
125
153
|
store.subject.timelineCreation.next(token)
|
|
@@ -274,7 +274,8 @@ var Subject = class {
|
|
|
274
274
|
this.subscribers.delete(key);
|
|
275
275
|
}
|
|
276
276
|
next(value) {
|
|
277
|
-
|
|
277
|
+
const subscribers = this.subscribers.values();
|
|
278
|
+
for (const subscriber of subscribers) {
|
|
278
279
|
subscriber(value);
|
|
279
280
|
}
|
|
280
281
|
}
|
|
@@ -1081,35 +1082,6 @@ function createSelector(options, family, store) {
|
|
|
1081
1082
|
return createReadonlySelector(options, family, store);
|
|
1082
1083
|
}
|
|
1083
1084
|
|
|
1084
|
-
// internal/src/selector/delete-selector.ts
|
|
1085
|
-
function deleteSelector(selectorToken, store) {
|
|
1086
|
-
const target = newest(store);
|
|
1087
|
-
const { key } = selectorToken;
|
|
1088
|
-
switch (selectorToken.type) {
|
|
1089
|
-
case `selector`:
|
|
1090
|
-
target.selectors.delete(key);
|
|
1091
|
-
break;
|
|
1092
|
-
case `readonly_selector`:
|
|
1093
|
-
target.readonlySelectors.delete(key);
|
|
1094
|
-
break;
|
|
1095
|
-
}
|
|
1096
|
-
target.valueMap.delete(key);
|
|
1097
|
-
target.selectorAtoms.delete(key);
|
|
1098
|
-
const downstreamTokens = target.selectorGraph.getRelationEntries({ upstreamSelectorKey: key }).filter(([_, { source }]) => source === key).map(
|
|
1099
|
-
([downstreamSelectorKey]) => {
|
|
1100
|
-
var _a;
|
|
1101
|
-
return (_a = target.selectors.get(downstreamSelectorKey)) != null ? _a : target.readonlySelectors.get(downstreamSelectorKey);
|
|
1102
|
-
}
|
|
1103
|
-
);
|
|
1104
|
-
for (const downstreamToken of downstreamTokens) {
|
|
1105
|
-
if (downstreamToken) {
|
|
1106
|
-
deleteSelector(downstreamToken, store);
|
|
1107
|
-
}
|
|
1108
|
-
}
|
|
1109
|
-
target.selectorGraph.delete(key);
|
|
1110
|
-
store.logger.info(`\u{1F525}`, selectorToken.type, `${key}`, `deleted`);
|
|
1111
|
-
}
|
|
1112
|
-
|
|
1113
1085
|
// internal/src/subscribe/recall-state.ts
|
|
1114
1086
|
var recallState = (state, store) => {
|
|
1115
1087
|
const target = newest(store);
|
|
@@ -1228,7 +1200,8 @@ var Tracker = class {
|
|
|
1228
1200
|
}
|
|
1229
1201
|
initializeState(mutableState, store) {
|
|
1230
1202
|
const latestUpdateStateKey = `*${mutableState.key}`;
|
|
1231
|
-
|
|
1203
|
+
store.atoms.delete(latestUpdateStateKey);
|
|
1204
|
+
store.valueMap.delete(latestUpdateStateKey);
|
|
1232
1205
|
const familyMetaData = mutableState.family ? {
|
|
1233
1206
|
key: `*${mutableState.family.key}`,
|
|
1234
1207
|
subKey: mutableState.family.subKey
|
|
@@ -1241,6 +1214,10 @@ var Tracker = class {
|
|
|
1241
1214
|
familyMetaData,
|
|
1242
1215
|
store
|
|
1243
1216
|
);
|
|
1217
|
+
if (store.parent) {
|
|
1218
|
+
const parentValue = store.parent.valueMap.get(latestUpdateStateKey);
|
|
1219
|
+
store.valueMap.set(latestUpdateStateKey, parentValue);
|
|
1220
|
+
}
|
|
1244
1221
|
return latestUpdateState;
|
|
1245
1222
|
}
|
|
1246
1223
|
observeCore(mutableState, latestUpdateState, store) {
|
|
@@ -1321,7 +1298,7 @@ var Tracker = class {
|
|
|
1321
1298
|
() => {
|
|
1322
1299
|
unsubscribe();
|
|
1323
1300
|
const mutable = getState(mutableState, store);
|
|
1324
|
-
const updateNumber = mutable.getUpdateNumber(newValue);
|
|
1301
|
+
const updateNumber = newValue === null ? -1 : mutable.getUpdateNumber(newValue);
|
|
1325
1302
|
const eventOffset = updateNumber - mutable.cacheUpdateNumber;
|
|
1326
1303
|
if (newValue && eventOffset === 1) {
|
|
1327
1304
|
setState(
|
|
@@ -1396,6 +1373,9 @@ function createAtomFamily(options, store) {
|
|
|
1396
1373
|
subject
|
|
1397
1374
|
}
|
|
1398
1375
|
);
|
|
1376
|
+
if (`mutable` in options && typeof options.mutable === `boolean`) {
|
|
1377
|
+
Object.assign(atomFamily, { mutable: options.mutable });
|
|
1378
|
+
}
|
|
1399
1379
|
const target = newest(store);
|
|
1400
1380
|
target.families.set(options.key, atomFamily);
|
|
1401
1381
|
return atomFamily;
|
|
@@ -1554,38 +1534,6 @@ function createAtom(options, family, store) {
|
|
|
1554
1534
|
return token;
|
|
1555
1535
|
}
|
|
1556
1536
|
|
|
1557
|
-
// internal/src/atom/delete-atom.ts
|
|
1558
|
-
function deleteAtom(atomToken, store) {
|
|
1559
|
-
var _a, _b;
|
|
1560
|
-
const target = newest(store);
|
|
1561
|
-
const { key } = atomToken;
|
|
1562
|
-
const atom = target.atoms.get(key);
|
|
1563
|
-
if (!atom) {
|
|
1564
|
-
store.logger.error(
|
|
1565
|
-
`\u274C`,
|
|
1566
|
-
`atom`,
|
|
1567
|
-
`${key}`,
|
|
1568
|
-
`Tried to delete atom, but it does not exist in the store.`
|
|
1569
|
-
);
|
|
1570
|
-
}
|
|
1571
|
-
(_a = atom == null ? void 0 : atom.cleanup) == null ? void 0 : _a.call(atom);
|
|
1572
|
-
target.atoms.delete(key);
|
|
1573
|
-
target.valueMap.delete(key);
|
|
1574
|
-
const selectorKeys = target.selectorAtoms.getRelatedKeys(key);
|
|
1575
|
-
if (selectorKeys) {
|
|
1576
|
-
for (const selectorKey of selectorKeys) {
|
|
1577
|
-
const token = (_b = target.selectors.get(selectorKey)) != null ? _b : target.readonlySelectors.get(selectorKey);
|
|
1578
|
-
if (token) {
|
|
1579
|
-
deleteSelector(token, store);
|
|
1580
|
-
}
|
|
1581
|
-
}
|
|
1582
|
-
}
|
|
1583
|
-
target.selectorAtoms.delete(key);
|
|
1584
|
-
target.atomsThatAreDefault.delete(key);
|
|
1585
|
-
target.timelineAtoms.delete(key);
|
|
1586
|
-
store.logger.info(`\u{1F525}`, `atom`, `${key}`, `deleted`);
|
|
1587
|
-
}
|
|
1588
|
-
|
|
1589
1537
|
// internal/src/not-found-error.ts
|
|
1590
1538
|
var capitalize = (str) => str[0].toUpperCase() + str.slice(1);
|
|
1591
1539
|
function prettyPrintTokenType(token) {
|