atom.io 0.40.1 → 0.40.3
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/dist/data/index.d.ts +1 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js.map +1 -1
- package/dist/internal/index.d.ts +155 -144
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +91 -39
- package/dist/internal/index.js.map +1 -1
- package/dist/introspection/index.d.ts +4 -4
- package/dist/introspection/index.d.ts.map +1 -1
- package/dist/introspection/index.js.map +1 -1
- package/dist/main/index.d.ts +80 -56
- package/dist/main/index.d.ts.map +1 -1
- package/dist/main/index.js.map +1 -1
- package/dist/react/index.d.ts +11 -11
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react-devtools/index.d.ts.map +1 -1
- package/dist/react-devtools/index.js.map +1 -1
- package/package.json +1 -1
- package/src/data/struct.ts +2 -2
- package/src/internal/atom/create-regular-atom.ts +8 -7
- package/src/internal/atom/dispose-atom.ts +6 -3
- package/src/internal/atom/has-role.ts +1 -1
- package/src/internal/caching.ts +15 -15
- package/src/internal/events/ingest-creation-disposal.ts +1 -1
- package/src/internal/families/create-readonly-held-selector-family.ts +6 -7
- package/src/internal/families/create-readonly-pure-selector-family.ts +23 -17
- package/src/internal/families/create-regular-atom-family.ts +17 -15
- package/src/internal/families/create-selector-family.ts +9 -9
- package/src/internal/families/create-writable-held-selector-family.ts +6 -7
- package/src/internal/families/create-writable-pure-selector-family.ts +24 -18
- package/src/internal/families/dispose-from-store.ts +10 -7
- package/src/internal/families/find-in-store.ts +23 -23
- package/src/internal/families/get-family-of-token.ts +17 -17
- package/src/internal/families/mint-in-store.ts +11 -11
- package/src/internal/families/seek-in-store.ts +26 -26
- package/src/internal/get-state/get-fallback.ts +8 -8
- package/src/internal/get-state/get-from-store.ts +17 -12
- package/src/internal/get-state/read-or-compute-value.ts +78 -14
- package/src/internal/get-state/reduce-reference.ts +10 -10
- package/src/internal/index.ts +58 -53
- package/src/internal/join/join-internal.ts +15 -6
- package/src/internal/mutable/create-mutable-atom-family.ts +7 -8
- package/src/internal/mutable/get-json-family.ts +3 -2
- package/src/internal/mutable/get-update-family.ts +7 -5
- package/src/internal/mutable/tracker-family.ts +5 -1
- package/src/internal/mutable/tracker.ts +5 -1
- package/src/internal/operation.ts +4 -2
- package/src/internal/selector/create-readonly-pure-selector.ts +8 -6
- package/src/internal/selector/create-standalone-selector.ts +10 -10
- package/src/internal/selector/create-writable-pure-selector.ts +9 -7
- package/src/internal/selector/dispose-selector.ts +2 -2
- package/src/internal/selector/register-selector.ts +2 -2
- package/src/internal/selector/trace-selector-atoms.ts +3 -3
- package/src/internal/selector/update-selector-atoms.ts +1 -1
- package/src/internal/set-state/dispatch-state-update.ts +9 -5
- package/src/internal/set-state/evict-downstream.ts +4 -1
- package/src/internal/set-state/operate-on-store.ts +16 -10
- package/src/internal/set-state/reset-atom-or-selector.ts +7 -7
- package/src/internal/set-state/reset-in-store.ts +9 -6
- package/src/internal/set-state/set-atom-or-selector.ts +1 -1
- package/src/internal/set-state/set-atom.ts +1 -1
- package/src/internal/set-state/set-into-store.ts +10 -7
- package/src/internal/set-state/set-selector.ts +1 -1
- package/src/internal/store/deposit.ts +38 -30
- package/src/internal/store/mint-or-counterfeit.ts +23 -23
- package/src/internal/store/store.ts +9 -9
- package/src/internal/store/withdraw.ts +68 -62
- package/src/internal/subscribe/recall-state.ts +4 -1
- package/src/internal/subscribe/subscribe-to-root-atoms.ts +2 -2
- package/src/internal/subscribe/subscribe-to-state.ts +4 -4
- package/src/internal/timeline/create-timeline.ts +5 -5
- package/src/internal/utility-types.ts +2 -0
- package/src/introspection/attach-atom-index.ts +2 -2
- package/src/introspection/attach-selector-index.ts +4 -2
- package/src/introspection/attach-timeline-family.ts +13 -11
- package/src/introspection/attach-timeline-index.ts +1 -1
- package/src/introspection/attach-transaction-index.ts +1 -1
- package/src/introspection/attach-transaction-logs.ts +4 -2
- package/src/introspection/attach-type-selectors.ts +2 -1
- package/src/introspection/index.ts +3 -5
- package/src/main/atom.ts +15 -9
- package/src/main/events.ts +25 -23
- package/src/main/get-state.ts +10 -8
- package/src/main/reset-state.ts +4 -4
- package/src/main/selector.ts +41 -24
- package/src/main/set-state.ts +8 -4
- package/src/main/timeline.ts +5 -3
- package/src/main/tokens.ts +72 -44
- package/src/main/validators.ts +4 -4
- package/src/react/parse-state-overloads.ts +10 -10
- package/src/react/use-i.ts +6 -6
- package/src/react/use-loadable.ts +15 -15
- package/src/react/use-o.ts +9 -9
- package/src/react-devtools/StateEditor.tsx +5 -3
- package/src/react-devtools/StateIndex.tsx +6 -4
- package/src/react-devtools/Updates.tsx +1 -1
- package/src/react-devtools/store.ts +16 -7
|
@@ -8,24 +8,24 @@ import { COUNTERFEIT, mint } from "../store"
|
|
|
8
8
|
|
|
9
9
|
export const MUST_CREATE: unique symbol = Symbol(`MUST_CREATE`)
|
|
10
10
|
|
|
11
|
-
export function mintInStore<T, K extends Canonical, Key extends K>(
|
|
11
|
+
export function mintInStore<T, K extends Canonical, Key extends K, E>(
|
|
12
12
|
store: Store,
|
|
13
|
-
family: ReadableFamily<T, K>,
|
|
13
|
+
family: ReadableFamily<T, K, E>,
|
|
14
14
|
key: Key,
|
|
15
15
|
mustCreate?: typeof MUST_CREATE,
|
|
16
|
-
): WritableToken<T,
|
|
17
|
-
export function mintInStore<T, K extends Canonical, Key extends K>(
|
|
16
|
+
): WritableToken<T, Key, E>
|
|
17
|
+
export function mintInStore<T, K extends Canonical, Key extends K, E>(
|
|
18
18
|
store: Store,
|
|
19
|
-
family: ReadableFamily<T, K>,
|
|
19
|
+
family: ReadableFamily<T, K, E>,
|
|
20
20
|
key: Key,
|
|
21
21
|
mustCreate?: typeof MUST_CREATE,
|
|
22
|
-
): ReadableToken<T,
|
|
23
|
-
export function mintInStore<T, K extends Canonical, Key extends K>(
|
|
22
|
+
): ReadableToken<T, Key, E>
|
|
23
|
+
export function mintInStore<T, K extends Canonical, Key extends K, E>(
|
|
24
24
|
store: Store,
|
|
25
|
-
family: ReadableFamily<T, K>,
|
|
25
|
+
family: ReadableFamily<T, K, E>,
|
|
26
26
|
key: Key,
|
|
27
27
|
mustCreate?: typeof MUST_CREATE,
|
|
28
|
-
): ReadableToken<T,
|
|
28
|
+
): ReadableToken<T, Key, E> {
|
|
29
29
|
const stringKey = stringifyJson(key)
|
|
30
30
|
const molecule = store.molecules.get(stringKey)
|
|
31
31
|
|
|
@@ -43,7 +43,7 @@ export function mintInStore<T, K extends Canonical, Key extends K>(
|
|
|
43
43
|
return mint(family, key, COUNTERFEIT)
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
let token: ReadableToken<T,
|
|
46
|
+
let token: ReadableToken<T, Key, E>
|
|
47
47
|
if (mustCreate === MUST_CREATE) {
|
|
48
48
|
store.logger.info(
|
|
49
49
|
`👪`,
|
|
@@ -52,7 +52,7 @@ export function mintInStore<T, K extends Canonical, Key extends K>(
|
|
|
52
52
|
`adds member`,
|
|
53
53
|
typeof key === `string` ? `\`${key}\`` : key,
|
|
54
54
|
)
|
|
55
|
-
token = family(key)
|
|
55
|
+
token = family.create(key)
|
|
56
56
|
if (molecule) {
|
|
57
57
|
store.moleculeData.set(stringKey, family.key)
|
|
58
58
|
}
|
|
@@ -19,7 +19,7 @@ import type {
|
|
|
19
19
|
import type { Canonical } from "atom.io/json"
|
|
20
20
|
import { stringifyJson } from "atom.io/json"
|
|
21
21
|
|
|
22
|
-
import type {
|
|
22
|
+
import type { ReadableState } from ".."
|
|
23
23
|
import { newest } from "../lineage"
|
|
24
24
|
import type { Transceiver } from "../mutable"
|
|
25
25
|
import { deposit, type Store } from "../store"
|
|
@@ -32,59 +32,59 @@ export function seekInStore<
|
|
|
32
32
|
store: Store,
|
|
33
33
|
token: MutableAtomFamilyToken<T, K>,
|
|
34
34
|
key: Key,
|
|
35
|
-
): MutableAtomToken<T,
|
|
35
|
+
): MutableAtomToken<T, Key> | undefined
|
|
36
36
|
|
|
37
|
-
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
37
|
+
export function seekInStore<T, K extends Canonical, Key extends K, E>(
|
|
38
38
|
store: Store,
|
|
39
|
-
token: RegularAtomFamilyToken<T, K>,
|
|
39
|
+
token: RegularAtomFamilyToken<T, K, E>,
|
|
40
40
|
key: Key,
|
|
41
|
-
): RegularAtomToken<T,
|
|
41
|
+
): RegularAtomToken<T, Key, E> | undefined
|
|
42
42
|
|
|
43
|
-
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
43
|
+
export function seekInStore<T, K extends Canonical, Key extends K, E>(
|
|
44
44
|
store: Store,
|
|
45
|
-
token: AtomFamilyToken<T, K>,
|
|
45
|
+
token: AtomFamilyToken<T, K, E>,
|
|
46
46
|
key: Key,
|
|
47
|
-
): AtomToken<T,
|
|
47
|
+
): AtomToken<T, Key, E> | undefined
|
|
48
48
|
|
|
49
|
-
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
49
|
+
export function seekInStore<T, K extends Canonical, Key extends K, E>(
|
|
50
50
|
store: Store,
|
|
51
|
-
token: WritablePureSelectorFamilyToken<T, K>,
|
|
51
|
+
token: WritablePureSelectorFamilyToken<T, K, E>,
|
|
52
52
|
key: Key,
|
|
53
|
-
): WritablePureSelectorToken<T,
|
|
53
|
+
): WritablePureSelectorToken<T, Key, E> | undefined
|
|
54
54
|
|
|
55
|
-
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
55
|
+
export function seekInStore<T, K extends Canonical, Key extends K, E>(
|
|
56
56
|
store: Store,
|
|
57
|
-
token: ReadonlyPureSelectorFamilyToken<T, K>,
|
|
57
|
+
token: ReadonlyPureSelectorFamilyToken<T, K, E>,
|
|
58
58
|
key: Key,
|
|
59
|
-
): ReadonlyPureSelectorToken<T,
|
|
59
|
+
): ReadonlyPureSelectorToken<T, Key, E> | undefined
|
|
60
60
|
|
|
61
|
-
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
61
|
+
export function seekInStore<T, K extends Canonical, Key extends K, E>(
|
|
62
62
|
store: Store,
|
|
63
|
-
token: SelectorFamilyToken<T, K>,
|
|
63
|
+
token: SelectorFamilyToken<T, K, E>,
|
|
64
64
|
key: Key,
|
|
65
|
-
): SelectorToken<T,
|
|
65
|
+
): SelectorToken<T, Key, E> | undefined
|
|
66
66
|
|
|
67
|
-
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
67
|
+
export function seekInStore<T, K extends Canonical, Key extends K, E>(
|
|
68
68
|
store: Store,
|
|
69
|
-
token: WritableFamilyToken<T, K>,
|
|
69
|
+
token: WritableFamilyToken<T, K, E>,
|
|
70
70
|
key: Key,
|
|
71
|
-
): WritableToken<T,
|
|
71
|
+
): WritableToken<T, Key, E> | undefined
|
|
72
72
|
|
|
73
|
-
export function seekInStore<T, K extends Canonical, Key extends K>(
|
|
73
|
+
export function seekInStore<T, K extends Canonical, Key extends K, E>(
|
|
74
74
|
store: Store,
|
|
75
|
-
token: ReadableFamilyToken<T, K>,
|
|
75
|
+
token: ReadableFamilyToken<T, K, E>,
|
|
76
76
|
key: Key,
|
|
77
|
-
): ReadableToken<T,
|
|
77
|
+
): ReadableToken<T, Key, E> | undefined
|
|
78
78
|
|
|
79
79
|
export function seekInStore(
|
|
80
80
|
store: Store,
|
|
81
|
-
token: ReadableFamilyToken<any, any>,
|
|
81
|
+
token: ReadableFamilyToken<any, any, any>,
|
|
82
82
|
key: Canonical,
|
|
83
|
-
): ReadableToken<any> | undefined {
|
|
83
|
+
): ReadableToken<any, any, any> | undefined {
|
|
84
84
|
const subKey = stringifyJson(key)
|
|
85
85
|
const fullKey = `${token.key}(${subKey})`
|
|
86
86
|
const target = newest(store)
|
|
87
|
-
let state:
|
|
87
|
+
let state: ReadableState<any, any> | undefined
|
|
88
88
|
switch (token.type) {
|
|
89
89
|
case `atom_family`:
|
|
90
90
|
case `mutable_atom_family`:
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import type { ReadableToken } from "atom.io"
|
|
1
|
+
import type { ReadableToken, ViewOf } from "atom.io"
|
|
2
2
|
import { type Canonical, stringifyJson } from "atom.io/json"
|
|
3
3
|
|
|
4
4
|
import type { ReadableFamily } from ".."
|
|
5
5
|
import type { Store } from "../store"
|
|
6
6
|
|
|
7
|
-
export function getFallback<T, K extends Canonical>(
|
|
7
|
+
export function getFallback<T, K extends Canonical, E>(
|
|
8
8
|
store: Store,
|
|
9
|
-
token: ReadableToken<T, K>,
|
|
10
|
-
family: ReadableFamily<T, K>,
|
|
9
|
+
token: ReadableToken<T, K, E>,
|
|
10
|
+
family: ReadableFamily<T, K, E>,
|
|
11
11
|
subKey: K,
|
|
12
|
-
): T {
|
|
12
|
+
): ViewOf<E | T> {
|
|
13
13
|
const disposal = store.disposalTraces.buffer.find(
|
|
14
14
|
(item) => item?.key === stringifyJson(subKey),
|
|
15
15
|
)
|
|
@@ -31,7 +31,7 @@ export function getFallback<T, K extends Canonical>(
|
|
|
31
31
|
}
|
|
32
32
|
const defaultValue = new family.class()
|
|
33
33
|
store.defaults.set(family.key, defaultValue)
|
|
34
|
-
return defaultValue
|
|
34
|
+
return defaultValue.READONLY_VIEW
|
|
35
35
|
}
|
|
36
36
|
case `atom_family`: {
|
|
37
37
|
if (store.defaults.has(family.key)) {
|
|
@@ -40,7 +40,7 @@ export function getFallback<T, K extends Canonical>(
|
|
|
40
40
|
const def = family.default as (key: K) => T
|
|
41
41
|
const defaultValue = def(subKey)
|
|
42
42
|
store.defaults.set(family.key, defaultValue)
|
|
43
|
-
return defaultValue
|
|
43
|
+
return defaultValue as ViewOf<T>
|
|
44
44
|
}
|
|
45
45
|
case `readonly_pure_selector_family`:
|
|
46
46
|
case `writable_pure_selector_family`:
|
|
@@ -51,7 +51,7 @@ export function getFallback<T, K extends Canonical>(
|
|
|
51
51
|
}
|
|
52
52
|
const defaultValue = family.default(subKey)
|
|
53
53
|
store.defaults.set(family.key, defaultValue)
|
|
54
|
-
return defaultValue
|
|
54
|
+
return defaultValue as ViewOf<T>
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ReadableFamilyToken, ReadableToken } from "atom.io"
|
|
1
|
+
import type { ReadableFamilyToken, ReadableToken, ViewOf } from "atom.io"
|
|
2
2
|
import type { Canonical } from "atom.io/json"
|
|
3
3
|
|
|
4
4
|
import { type Store, withdraw } from "../store"
|
|
@@ -8,25 +8,30 @@ import { reduceReference } from "./reduce-reference"
|
|
|
8
8
|
|
|
9
9
|
export function getFromStore<T>(store: Store, token: ReadableToken<T>): T
|
|
10
10
|
|
|
11
|
-
export function getFromStore<T,
|
|
11
|
+
export function getFromStore<T, E>(
|
|
12
12
|
store: Store,
|
|
13
|
-
token:
|
|
13
|
+
token: ReadableToken<T, any, E>,
|
|
14
|
+
): E | T
|
|
15
|
+
|
|
16
|
+
export function getFromStore<T, K extends Canonical, E>(
|
|
17
|
+
store: Store,
|
|
18
|
+
token: ReadableFamilyToken<T, K, E>,
|
|
14
19
|
key: K,
|
|
15
|
-
): T
|
|
20
|
+
): ViewOf<E | T>
|
|
16
21
|
|
|
17
|
-
export function getFromStore<T, K extends Canonical, Key extends K>(
|
|
22
|
+
export function getFromStore<T, K extends Canonical, Key extends K, E>(
|
|
18
23
|
store: Store,
|
|
19
24
|
...params:
|
|
20
|
-
| [token: ReadableFamilyToken<T, K>, key: Key]
|
|
21
|
-
| [token: ReadableToken<T>]
|
|
22
|
-
): T
|
|
25
|
+
| [token: ReadableFamilyToken<T, K, E>, key: Key]
|
|
26
|
+
| [token: ReadableToken<T, any, E>]
|
|
27
|
+
): ViewOf<E | T>
|
|
23
28
|
|
|
24
|
-
export function getFromStore<T, K extends Canonical, Key extends K>(
|
|
29
|
+
export function getFromStore<T, K extends Canonical, Key extends K, E>(
|
|
25
30
|
store: Store,
|
|
26
31
|
...params:
|
|
27
|
-
| [token: ReadableFamilyToken<T, K>, key: Key]
|
|
28
|
-
| [token: ReadableToken<T>]
|
|
29
|
-
):
|
|
32
|
+
| [token: ReadableFamilyToken<T, K, E>, key: Key]
|
|
33
|
+
| [token: ReadableToken<T, any, E>]
|
|
34
|
+
): ViewOf<E | T> {
|
|
30
35
|
const { token, family, subKey } = reduceReference(store, ...params)
|
|
31
36
|
|
|
32
37
|
if (`counterfeit` in token && family && subKey) {
|
|
@@ -5,21 +5,21 @@ import { readFromCache, writeToCache } from "../caching"
|
|
|
5
5
|
import { isFn } from "../is-fn"
|
|
6
6
|
import type { Store } from "../store"
|
|
7
7
|
|
|
8
|
-
export function readOrComputeValue<T>(
|
|
8
|
+
export function readOrComputeValue<T, E>(
|
|
9
9
|
target: Store,
|
|
10
|
-
state: ReadableState<T>,
|
|
10
|
+
state: ReadableState<T, E>,
|
|
11
11
|
mut?: undefined,
|
|
12
|
-
): ViewOf<T>
|
|
13
|
-
export function readOrComputeValue<T>(
|
|
12
|
+
): ViewOf<E | T>
|
|
13
|
+
export function readOrComputeValue<T, E>(
|
|
14
14
|
target: Store,
|
|
15
|
-
state: ReadableState<T>,
|
|
15
|
+
state: ReadableState<T, E>,
|
|
16
16
|
mut: `mut`,
|
|
17
|
-
): T
|
|
18
|
-
export function readOrComputeValue<T>(
|
|
17
|
+
): E | T
|
|
18
|
+
export function readOrComputeValue<T, E>(
|
|
19
19
|
target: Store,
|
|
20
|
-
state: ReadableState<T>,
|
|
20
|
+
state: ReadableState<T, E>,
|
|
21
21
|
mut: `mut` | undefined,
|
|
22
|
-
): T {
|
|
22
|
+
): E | T {
|
|
23
23
|
if (target.valueMap.has(state.key)) {
|
|
24
24
|
return readFromCache(target, state, mut)
|
|
25
25
|
}
|
|
@@ -27,16 +27,80 @@ export function readOrComputeValue<T>(
|
|
|
27
27
|
const { key } = state
|
|
28
28
|
switch (state.type) {
|
|
29
29
|
case `readonly_held_selector`:
|
|
30
|
-
case `readonly_pure_selector`:
|
|
31
30
|
case `writable_held_selector`:
|
|
32
|
-
case `writable_pure_selector`:
|
|
33
31
|
target.logger.info(`🧮`, state.type, key, `computing value`)
|
|
34
32
|
return state.getFrom(target)
|
|
33
|
+
case `readonly_pure_selector`:
|
|
34
|
+
case `writable_pure_selector`: {
|
|
35
|
+
let val: E | T
|
|
36
|
+
target.logger.info(`🧮`, state.type, key, `computing value`)
|
|
37
|
+
try {
|
|
38
|
+
val = state.getFrom(target)
|
|
39
|
+
if (val instanceof Promise) {
|
|
40
|
+
return (val as Promise<E & T>).catch((e) => {
|
|
41
|
+
target.logger.error(`💥`, state.type, key, `rejected:`, e)
|
|
42
|
+
if (state.catch) {
|
|
43
|
+
for (const Class of state.catch) {
|
|
44
|
+
if (e instanceof Class) {
|
|
45
|
+
return writeToCache(target, state, e)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw e
|
|
50
|
+
}) as E | T
|
|
51
|
+
}
|
|
52
|
+
} catch (e) {
|
|
53
|
+
target.logger.error(`💥`, state.type, key, `rejected:`, e)
|
|
54
|
+
if (state.catch) {
|
|
55
|
+
for (const Class of state.catch) {
|
|
56
|
+
if (e instanceof Class) {
|
|
57
|
+
return writeToCache(target, state, e)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
throw e
|
|
62
|
+
}
|
|
63
|
+
const cachedValue = writeToCache(target, state, val)
|
|
64
|
+
return cachedValue
|
|
65
|
+
}
|
|
35
66
|
case `atom`: {
|
|
36
|
-
let def: T
|
|
67
|
+
let def: E | T
|
|
37
68
|
if (isFn(state.default)) {
|
|
38
|
-
|
|
39
|
-
|
|
69
|
+
try {
|
|
70
|
+
def = state.default()
|
|
71
|
+
if (def instanceof Promise) {
|
|
72
|
+
def = (def as Promise<T> & T).catch<E | T>((e) => {
|
|
73
|
+
target.logger.error(`💥`, state.type, key, `rejected:`, e)
|
|
74
|
+
if (state.catch) {
|
|
75
|
+
for (const Class of state.catch) {
|
|
76
|
+
if (e instanceof Class) {
|
|
77
|
+
def = writeToCache(target, state, e)
|
|
78
|
+
return def
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
throw e
|
|
83
|
+
}) as E | T
|
|
84
|
+
}
|
|
85
|
+
} catch (e) {
|
|
86
|
+
target.logger.error(`💥`, state.type, key, `rejected:`, e)
|
|
87
|
+
if (state.catch) {
|
|
88
|
+
for (const Class of state.catch) {
|
|
89
|
+
if (e instanceof Class) {
|
|
90
|
+
def = writeToCache(target, state, e)
|
|
91
|
+
target.logger.info(
|
|
92
|
+
`✨`,
|
|
93
|
+
state.type,
|
|
94
|
+
key,
|
|
95
|
+
`computed default`,
|
|
96
|
+
def,
|
|
97
|
+
)
|
|
98
|
+
return def
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
throw e
|
|
103
|
+
}
|
|
40
104
|
} else {
|
|
41
105
|
def = state.default
|
|
42
106
|
target.logger.info(`✨`, state.type, key, `using static default`, def)
|
|
@@ -13,27 +13,27 @@ import { mintInStore, MUST_CREATE } from "../families/mint-in-store"
|
|
|
13
13
|
import type { Store } from "../store"
|
|
14
14
|
import { withdraw } from "../store"
|
|
15
15
|
|
|
16
|
-
export function reduceReference<T, K extends Canonical>(
|
|
16
|
+
export function reduceReference<T, K extends Canonical, E>(
|
|
17
17
|
store: Store,
|
|
18
18
|
...params:
|
|
19
|
-
| [token: ReadableFamilyToken<T, K>, key: K]
|
|
20
|
-
| [token: ReadableToken<T>]
|
|
19
|
+
| [token: ReadableFamilyToken<T, K, E>, key: K]
|
|
20
|
+
| [token: ReadableToken<T, K, E>]
|
|
21
21
|
): {
|
|
22
|
-
token: ReadableToken<T, K>
|
|
23
|
-
family: ReadableFamily<T, K> | undefined
|
|
22
|
+
token: ReadableToken<T, K, E>
|
|
23
|
+
family: ReadableFamily<T, K, E> | undefined
|
|
24
24
|
subKey: K | undefined
|
|
25
25
|
isNew: boolean
|
|
26
26
|
} {
|
|
27
|
-
let existingToken: ReadableToken<T> | undefined
|
|
28
|
-
let brandNewToken: ReadableToken<T> | undefined
|
|
29
|
-
let family: ReadableFamily<T, K> | undefined
|
|
27
|
+
let existingToken: ReadableToken<T, K, E> | undefined
|
|
28
|
+
let brandNewToken: ReadableToken<T, K, E> | undefined
|
|
29
|
+
let family: ReadableFamily<T, K, E> | undefined
|
|
30
30
|
let subKey: K | undefined
|
|
31
|
-
let token: ReadableToken<T, K>
|
|
31
|
+
let token: ReadableToken<T, K, E>
|
|
32
32
|
if (params.length === 1) {
|
|
33
33
|
token = params[0]
|
|
34
34
|
if (`family` in token) {
|
|
35
35
|
const familyToken = getFamilyOfToken(store, token)
|
|
36
|
-
family = withdraw(store, familyToken) as ReadableFamily<T, K>
|
|
36
|
+
family = withdraw(store, familyToken) as ReadableFamily<T, K, E>
|
|
37
37
|
subKey = parseJson(token.family.subKey)
|
|
38
38
|
existingToken = seekInStore(store, familyToken, subKey)
|
|
39
39
|
if (`counterfeit` in token) {
|
package/src/internal/index.ts
CHANGED
|
@@ -23,7 +23,7 @@ import type { Store } from "./store"
|
|
|
23
23
|
import type { Subject } from "./subject"
|
|
24
24
|
import type { Timeline } from "./timeline"
|
|
25
25
|
import type { RootStore, Transaction } from "./transaction"
|
|
26
|
-
import type { Flat } from "./utility-types"
|
|
26
|
+
import type { Ctor, Flat } from "./utility-types"
|
|
27
27
|
|
|
28
28
|
export * from "./arbitrary"
|
|
29
29
|
export * from "./atom"
|
|
@@ -61,12 +61,13 @@ export type AtomIOState = {
|
|
|
61
61
|
install: (store: RootStore) => void
|
|
62
62
|
subject: Subject<StateUpdate<any>>
|
|
63
63
|
}
|
|
64
|
-
export type RegularAtom<T> = Flat<
|
|
64
|
+
export type RegularAtom<T, E> = Flat<
|
|
65
65
|
AtomIOState & {
|
|
66
66
|
type: `atom`
|
|
67
67
|
default: T | (() => T)
|
|
68
68
|
cleanup?: () => void
|
|
69
69
|
internalRoles?: internalRole[]
|
|
70
|
+
catch?: readonly Ctor<E>[]
|
|
70
71
|
}
|
|
71
72
|
>
|
|
72
73
|
export type MutableAtom<T extends Transceiver<any, any, any>> = Flat<
|
|
@@ -76,8 +77,8 @@ export type MutableAtom<T extends Transceiver<any, any, any>> = Flat<
|
|
|
76
77
|
cleanup?: () => void
|
|
77
78
|
}
|
|
78
79
|
>
|
|
79
|
-
export type Atom<T> =
|
|
80
|
-
| RegularAtom<T>
|
|
80
|
+
export type Atom<T, E> =
|
|
81
|
+
| RegularAtom<T, E>
|
|
81
82
|
| (T extends Transceiver<any, any, any> ? MutableAtom<T> : never)
|
|
82
83
|
|
|
83
84
|
export type WritableHeldSelector<T> = Flat<
|
|
@@ -95,48 +96,52 @@ export type ReadonlyHeldSelector<T> = Flat<
|
|
|
95
96
|
getFrom: (target: Store) => T
|
|
96
97
|
}
|
|
97
98
|
>
|
|
98
|
-
export type WritablePureSelector<T> = Flat<
|
|
99
|
+
export type WritablePureSelector<T, E> = Flat<
|
|
99
100
|
AtomIOState & {
|
|
100
101
|
type: `writable_pure_selector`
|
|
101
|
-
getFrom: (target: Store) => T
|
|
102
|
+
getFrom: (target: Store) => E | T
|
|
102
103
|
setSelf: (newValue: T) => void
|
|
104
|
+
catch?: readonly Ctor<E>[]
|
|
103
105
|
}
|
|
104
106
|
>
|
|
105
|
-
export type ReadonlyPureSelector<T> = Flat<
|
|
107
|
+
export type ReadonlyPureSelector<T, E> = Flat<
|
|
106
108
|
AtomIOState & {
|
|
107
109
|
type: `readonly_pure_selector`
|
|
108
|
-
getFrom: (target: Store) => T
|
|
110
|
+
getFrom: (target: Store) => E | T
|
|
111
|
+
catch?: readonly Ctor<E>[]
|
|
109
112
|
}
|
|
110
113
|
>
|
|
111
|
-
export type ReadonlySelector<T> =
|
|
114
|
+
export type ReadonlySelector<T, E> =
|
|
112
115
|
| ReadonlyHeldSelector<T>
|
|
113
|
-
| ReadonlyPureSelector<T>
|
|
114
|
-
export type WritableSelector<T> =
|
|
116
|
+
| ReadonlyPureSelector<T, E>
|
|
117
|
+
export type WritableSelector<T, E> =
|
|
115
118
|
| WritableHeldSelector<T>
|
|
116
|
-
| WritablePureSelector<T>
|
|
119
|
+
| WritablePureSelector<T, E>
|
|
117
120
|
export type HeldSelector<T> = ReadonlyHeldSelector<T> | WritableHeldSelector<T>
|
|
118
|
-
export type PureSelector<T> =
|
|
119
|
-
|
|
121
|
+
export type PureSelector<T, E> =
|
|
122
|
+
| ReadonlyPureSelector<T, E>
|
|
123
|
+
| WritablePureSelector<T, E>
|
|
124
|
+
export type Selector<T, E> =
|
|
120
125
|
| ReadonlyHeldSelector<T>
|
|
121
|
-
| ReadonlyPureSelector<T>
|
|
126
|
+
| ReadonlyPureSelector<T, E>
|
|
122
127
|
| WritableHeldSelector<T>
|
|
123
|
-
| WritablePureSelector<T>
|
|
128
|
+
| WritablePureSelector<T, E>
|
|
124
129
|
|
|
125
|
-
export type WritableState<T> = Atom<T> | WritableSelector<T>
|
|
126
|
-
export type ReadableState<T> = Atom<T> | Selector<T>
|
|
130
|
+
export type WritableState<T, E> = Atom<T, E> | WritableSelector<T, E>
|
|
131
|
+
export type ReadableState<T, E> = Atom<T, E> | Selector<T, E>
|
|
127
132
|
|
|
128
133
|
// biome-ignore format: intersection
|
|
129
|
-
export type RegularAtomFamily<T, K extends Canonical> =
|
|
134
|
+
export type RegularAtomFamily<T, K extends Canonical, E = never> =
|
|
130
135
|
& Flat<
|
|
131
|
-
& RegularAtomFamilyToken<T, K>
|
|
136
|
+
& RegularAtomFamilyToken<T, K, E>
|
|
132
137
|
& {
|
|
138
|
+
create: <Key extends K>(key: Key) => RegularAtomToken<T, Key, E>
|
|
133
139
|
default: T | ((key: K) => T)
|
|
134
140
|
install: (store: RootStore) => void
|
|
135
141
|
internalRoles: string[] | undefined
|
|
136
|
-
subject: Subject<StateLifecycleEvent<RegularAtomToken<T>>>
|
|
142
|
+
subject: Subject<StateLifecycleEvent<RegularAtomToken<T, K, E>>>
|
|
137
143
|
}
|
|
138
144
|
>
|
|
139
|
-
& ((key: K) => RegularAtomToken<T>)
|
|
140
145
|
|
|
141
146
|
// biome-ignore format: intersection
|
|
142
147
|
export type MutableAtomFamily<
|
|
@@ -146,99 +151,99 @@ export type MutableAtomFamily<
|
|
|
146
151
|
& Flat<
|
|
147
152
|
& MutableAtomFamilyToken<T, K>
|
|
148
153
|
& {
|
|
154
|
+
create: <Key extends K>(key: Key) => MutableAtomToken<T, Key>
|
|
149
155
|
class: ConstructorOf<T>
|
|
150
156
|
install: (store: RootStore) => void
|
|
151
157
|
internalRoles: string[] | undefined
|
|
152
158
|
subject: Subject<StateLifecycleEvent<MutableAtomToken<T>>>
|
|
153
159
|
}
|
|
154
160
|
>
|
|
155
|
-
& ((key: K) => MutableAtomToken<T>)
|
|
156
161
|
|
|
157
|
-
export type AtomFamily<T, K extends Canonical
|
|
162
|
+
export type AtomFamily<T, K extends Canonical, E> =
|
|
158
163
|
| MutableAtomFamily<T extends Transceiver<any, any, any> ? T : never, K>
|
|
159
|
-
| RegularAtomFamily<T, K>
|
|
164
|
+
| RegularAtomFamily<T, K, E>
|
|
160
165
|
|
|
161
166
|
// biome-ignore format: intersection
|
|
162
|
-
export type WritablePureSelectorFamily<T, K extends Canonical> =
|
|
167
|
+
export type WritablePureSelectorFamily<T, K extends Canonical, E> =
|
|
163
168
|
& Flat<
|
|
164
|
-
& WritablePureSelectorFamilyToken<T, K>
|
|
169
|
+
& WritablePureSelectorFamilyToken<T, K, E>
|
|
165
170
|
& {
|
|
171
|
+
create: <Key extends K>(key: Key) => WritablePureSelectorToken<T, Key, E>
|
|
166
172
|
default: (key: K) => T,
|
|
167
173
|
install: (store: RootStore) => void
|
|
168
174
|
internalRoles: string[] | undefined
|
|
169
|
-
subject: Subject<StateLifecycleEvent<WritablePureSelectorToken<T>>>
|
|
175
|
+
subject: Subject<StateLifecycleEvent<WritablePureSelectorToken<T, K, E>>>
|
|
170
176
|
}
|
|
171
177
|
>
|
|
172
|
-
& ((key: K) => WritablePureSelectorToken<T>)
|
|
173
178
|
|
|
174
179
|
// biome-ignore format: intersection
|
|
175
180
|
export type WritableHeldSelectorFamily<T , K extends Canonical> =
|
|
176
181
|
& Flat<
|
|
177
182
|
& WritableHeldSelectorFamilyToken<T, K>
|
|
178
183
|
& {
|
|
184
|
+
create: <Key extends K>(key: Key) => WritableHeldSelectorToken<T, Key>
|
|
179
185
|
default: (key: K) => T,
|
|
180
186
|
install: (store: RootStore) => void
|
|
181
187
|
internalRoles: string[] | undefined
|
|
182
|
-
subject: Subject<StateLifecycleEvent<WritableHeldSelectorToken<T>>>
|
|
188
|
+
subject: Subject<StateLifecycleEvent<WritableHeldSelectorToken<T, K>>>
|
|
183
189
|
}
|
|
184
190
|
>
|
|
185
|
-
& ((key: K) => WritableHeldSelectorToken<T>)
|
|
186
191
|
|
|
187
192
|
// biome-ignore format: intersection
|
|
188
|
-
export type ReadonlyPureSelectorFamily<T, K extends Canonical> =
|
|
193
|
+
export type ReadonlyPureSelectorFamily<T, K extends Canonical, E> =
|
|
189
194
|
& Flat<
|
|
190
|
-
& ReadonlyPureSelectorFamilyToken<T, K>
|
|
195
|
+
& ReadonlyPureSelectorFamilyToken<T, K, E>
|
|
191
196
|
& {
|
|
197
|
+
create: <Key extends K>(key: Key) => ReadonlyPureSelectorToken<T, Key, E>
|
|
192
198
|
default: (key: K) => T,
|
|
193
199
|
install: (store: RootStore) => void
|
|
194
200
|
internalRoles: string[] | undefined
|
|
195
|
-
subject: Subject<StateLifecycleEvent<ReadonlyPureSelectorToken<T>>>
|
|
201
|
+
subject: Subject<StateLifecycleEvent<ReadonlyPureSelectorToken<T, K, E>>>
|
|
196
202
|
}
|
|
197
203
|
>
|
|
198
|
-
& ((key: K) => ReadonlyPureSelectorToken<T>)
|
|
199
204
|
|
|
200
205
|
// biome-ignore format: intersection
|
|
201
206
|
export type ReadonlyHeldSelectorFamily<T , K extends Canonical> =
|
|
202
207
|
& Flat<
|
|
203
208
|
& ReadonlyHeldSelectorFamilyToken<T, K>
|
|
204
209
|
& {
|
|
210
|
+
create: <Key extends K>(key: Key) => ReadonlyHeldSelectorToken<T, Key>
|
|
205
211
|
default: (key: K) => T,
|
|
206
212
|
install: (store: RootStore) => void
|
|
207
213
|
internalRoles: string[] | undefined
|
|
208
214
|
subject: Subject<StateLifecycleEvent<ReadonlyHeldSelectorToken<T>>>
|
|
209
215
|
}
|
|
210
216
|
>
|
|
211
|
-
& ((key: K) => ReadonlyHeldSelectorToken<T>)
|
|
212
217
|
|
|
213
|
-
export type PureSelectorFamily<T, K extends Canonical> =
|
|
214
|
-
| ReadonlyPureSelectorFamily<T, K>
|
|
215
|
-
| WritablePureSelectorFamily<T, K>
|
|
218
|
+
export type PureSelectorFamily<T, K extends Canonical, E> =
|
|
219
|
+
| ReadonlyPureSelectorFamily<T, K, E>
|
|
220
|
+
| WritablePureSelectorFamily<T, K, E>
|
|
216
221
|
|
|
217
222
|
export type HeldSelectorFamily<T, K extends Canonical> =
|
|
218
223
|
| ReadonlyHeldSelectorFamily<T, K>
|
|
219
224
|
| WritableHeldSelectorFamily<T, K>
|
|
220
225
|
|
|
221
|
-
export type ReadonlySelectorFamily<T, K extends Canonical> =
|
|
226
|
+
export type ReadonlySelectorFamily<T, K extends Canonical, E> =
|
|
222
227
|
| ReadonlyHeldSelectorFamily<T, K>
|
|
223
|
-
| ReadonlyPureSelectorFamily<T, K>
|
|
228
|
+
| ReadonlyPureSelectorFamily<T, K, E>
|
|
224
229
|
|
|
225
|
-
export type WritableSelectorFamily<T, K extends Canonical> =
|
|
230
|
+
export type WritableSelectorFamily<T, K extends Canonical, E> =
|
|
226
231
|
| WritableHeldSelectorFamily<T, K>
|
|
227
|
-
| WritablePureSelectorFamily<T, K>
|
|
232
|
+
| WritablePureSelectorFamily<T, K, E>
|
|
228
233
|
|
|
229
|
-
export type SelectorFamily<T, K extends Canonical> =
|
|
234
|
+
export type SelectorFamily<T, K extends Canonical, E> =
|
|
230
235
|
| HeldSelectorFamily<T, K>
|
|
231
|
-
| PureSelectorFamily<T, K>
|
|
236
|
+
| PureSelectorFamily<T, K, E>
|
|
232
237
|
|
|
233
|
-
export type WritableFamily<T, K extends Canonical> =
|
|
234
|
-
| AtomFamily<T, K>
|
|
235
|
-
|
|
|
236
|
-
export type ReadableFamily<T, K extends Canonical> =
|
|
237
|
-
| AtomFamily<T, K>
|
|
238
|
-
| SelectorFamily<T, K>
|
|
238
|
+
export type WritableFamily<T, K extends Canonical, E> =
|
|
239
|
+
| AtomFamily<T, K, E>
|
|
240
|
+
| WritableSelectorFamily<T, K, E>
|
|
241
|
+
export type ReadableFamily<T, K extends Canonical, E> =
|
|
242
|
+
| AtomFamily<T, K, E>
|
|
243
|
+
| SelectorFamily<T, K, E>
|
|
239
244
|
|
|
240
245
|
export type AtomIOInternalResource =
|
|
241
|
-
| ReadableFamily<any, any>
|
|
242
|
-
| ReadableState<any>
|
|
246
|
+
| ReadableFamily<any, any, any>
|
|
247
|
+
| ReadableState<any, any>
|
|
243
248
|
| Timeline<any>
|
|
244
249
|
| Transaction<any>
|