atom.io 0.40.1 → 0.40.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.
Files changed (94) hide show
  1. package/dist/data/index.d.ts +1 -1
  2. package/dist/data/index.d.ts.map +1 -1
  3. package/dist/data/index.js.map +1 -1
  4. package/dist/internal/index.d.ts +146 -142
  5. package/dist/internal/index.d.ts.map +1 -1
  6. package/dist/internal/index.js +64 -14
  7. package/dist/internal/index.js.map +1 -1
  8. package/dist/introspection/index.d.ts +4 -4
  9. package/dist/introspection/index.d.ts.map +1 -1
  10. package/dist/introspection/index.js.map +1 -1
  11. package/dist/main/index.d.ts +79 -55
  12. package/dist/main/index.d.ts.map +1 -1
  13. package/dist/main/index.js.map +1 -1
  14. package/dist/react/index.d.ts +11 -11
  15. package/dist/react/index.d.ts.map +1 -1
  16. package/dist/react/index.js.map +1 -1
  17. package/dist/react-devtools/index.js.map +1 -1
  18. package/package.json +1 -1
  19. package/src/data/struct.ts +2 -2
  20. package/src/internal/atom/create-regular-atom.ts +8 -7
  21. package/src/internal/atom/dispose-atom.ts +6 -3
  22. package/src/internal/atom/has-role.ts +1 -1
  23. package/src/internal/caching.ts +15 -15
  24. package/src/internal/events/ingest-creation-disposal.ts +1 -1
  25. package/src/internal/families/create-readonly-pure-selector-family.ts +21 -14
  26. package/src/internal/families/create-regular-atom-family.ts +18 -11
  27. package/src/internal/families/create-selector-family.ts +9 -9
  28. package/src/internal/families/create-writable-pure-selector-family.ts +22 -14
  29. package/src/internal/families/dispose-from-store.ts +10 -7
  30. package/src/internal/families/find-in-store.ts +23 -23
  31. package/src/internal/families/get-family-of-token.ts +17 -17
  32. package/src/internal/families/mint-in-store.ts +10 -10
  33. package/src/internal/families/seek-in-store.ts +26 -26
  34. package/src/internal/get-state/get-fallback.ts +8 -8
  35. package/src/internal/get-state/get-from-store.ts +17 -12
  36. package/src/internal/get-state/read-or-compute-value.ts +78 -14
  37. package/src/internal/get-state/reduce-reference.ts +10 -10
  38. package/src/internal/index.ts +57 -52
  39. package/src/internal/join/join-internal.ts +15 -6
  40. package/src/internal/mutable/create-mutable-atom-family.ts +1 -1
  41. package/src/internal/mutable/get-json-family.ts +3 -2
  42. package/src/internal/mutable/get-update-family.ts +7 -5
  43. package/src/internal/mutable/tracker-family.ts +5 -1
  44. package/src/internal/mutable/tracker.ts +5 -1
  45. package/src/internal/operation.ts +4 -2
  46. package/src/internal/selector/create-readonly-pure-selector.ts +8 -6
  47. package/src/internal/selector/create-standalone-selector.ts +10 -10
  48. package/src/internal/selector/create-writable-pure-selector.ts +9 -7
  49. package/src/internal/selector/dispose-selector.ts +2 -2
  50. package/src/internal/selector/register-selector.ts +2 -2
  51. package/src/internal/selector/trace-selector-atoms.ts +3 -3
  52. package/src/internal/selector/update-selector-atoms.ts +1 -1
  53. package/src/internal/set-state/dispatch-state-update.ts +9 -5
  54. package/src/internal/set-state/evict-downstream.ts +4 -1
  55. package/src/internal/set-state/operate-on-store.ts +16 -10
  56. package/src/internal/set-state/reset-atom-or-selector.ts +7 -7
  57. package/src/internal/set-state/reset-in-store.ts +9 -6
  58. package/src/internal/set-state/set-atom-or-selector.ts +1 -1
  59. package/src/internal/set-state/set-atom.ts +1 -1
  60. package/src/internal/set-state/set-into-store.ts +10 -7
  61. package/src/internal/set-state/set-selector.ts +1 -1
  62. package/src/internal/store/deposit.ts +38 -30
  63. package/src/internal/store/mint-or-counterfeit.ts +23 -23
  64. package/src/internal/store/store.ts +9 -9
  65. package/src/internal/store/withdraw.ts +68 -62
  66. package/src/internal/subscribe/recall-state.ts +4 -1
  67. package/src/internal/subscribe/subscribe-to-root-atoms.ts +2 -2
  68. package/src/internal/subscribe/subscribe-to-state.ts +4 -4
  69. package/src/internal/timeline/create-timeline.ts +5 -5
  70. package/src/introspection/attach-atom-index.ts +2 -2
  71. package/src/introspection/attach-selector-index.ts +4 -2
  72. package/src/introspection/attach-timeline-family.ts +13 -11
  73. package/src/introspection/attach-timeline-index.ts +1 -1
  74. package/src/introspection/attach-transaction-index.ts +1 -1
  75. package/src/introspection/attach-transaction-logs.ts +4 -2
  76. package/src/introspection/attach-type-selectors.ts +2 -1
  77. package/src/introspection/index.ts +3 -5
  78. package/src/main/atom.ts +14 -8
  79. package/src/main/events.ts +25 -23
  80. package/src/main/get-state.ts +10 -8
  81. package/src/main/reset-state.ts +4 -4
  82. package/src/main/selector.ts +40 -24
  83. package/src/main/set-state.ts +8 -4
  84. package/src/main/timeline.ts +5 -3
  85. package/src/main/tokens.ts +72 -44
  86. package/src/main/validators.ts +4 -4
  87. package/src/react/parse-state-overloads.ts +10 -10
  88. package/src/react/use-i.ts +6 -6
  89. package/src/react/use-loadable.ts +15 -15
  90. package/src/react/use-o.ts +9 -9
  91. package/src/react-devtools/StateEditor.tsx +5 -3
  92. package/src/react-devtools/StateIndex.tsx +6 -4
  93. package/src/react-devtools/Updates.tsx +1 -1
  94. package/src/react-devtools/store.ts +16 -7
@@ -17,19 +17,23 @@ import type {
17
17
  } from "./tokens"
18
18
  import type { Read, Write } from "./transaction"
19
19
 
20
- export type WritablePureSelectorOptions<T> = {
20
+ export type WritablePureSelectorOptions<T, E = never> = {
21
21
  /** The unique identifier of the selector */
22
22
  key: string
23
23
  /** For each instantiated selector, a function that computes its value */
24
24
  get: Read<() => T>
25
25
  /** For each instantiated selector, a function that sets its value */
26
26
  set: Write<(newValue: T) => void>
27
+ /** The classes of errors that might be thrown when deriving the atom's default value */
28
+ catch?: readonly (new () => E)[]
27
29
  }
28
- export type ReadonlyPureSelectorOptions<T> = {
30
+ export type ReadonlyPureSelectorOptions<T, E = never> = {
29
31
  /** The unique identifier of the selector */
30
32
  key: string
31
33
  /** For each instantiated selector, a function that computes its value */
32
34
  get: Read<() => T>
35
+ /** The classes of errors that might be thrown when deriving the atom's default value */
36
+ catch?: readonly (new () => E)[]
33
37
  }
34
38
  export type ReadonlyHeldSelectorOptions<T extends object> = {
35
39
  /** The unique identifier of the selector */
@@ -104,9 +108,9 @@ export function selector<T extends object>(
104
108
  * The token for your selector.
105
109
  * @overload WritablePure
106
110
  */
107
- export function selector<T>(
108
- options: WritablePureSelectorOptions<T>,
109
- ): WritablePureSelectorToken<T>
111
+ export function selector<T, E = never>(
112
+ options: WritablePureSelectorOptions<T, E>,
113
+ ): WritablePureSelectorToken<T, any, E>
110
114
  /**
111
115
  * Declare a selector. The value of a selector should depend
112
116
  * on the value of atoms or other selectors in the store.
@@ -121,36 +125,48 @@ export function selector<T>(
121
125
  * The token for your selector.
122
126
  * @overload ReadonlyPure
123
127
  */
124
- export function selector<T>(
125
- options: ReadonlyPureSelectorOptions<T>,
126
- ): ReadonlyPureSelectorToken<T>
128
+ export function selector<T, E = never>(
129
+ options: ReadonlyPureSelectorOptions<T, E>,
130
+ ): ReadonlyPureSelectorToken<T, any, E>
127
131
  export function selector(
128
132
  options:
129
133
  | ReadonlyHeldSelectorOptions<any>
130
- | ReadonlyPureSelectorOptions<any>
134
+ | ReadonlyPureSelectorOptions<any, any>
131
135
  | WritableHeldSelectorOptions<any>
132
- | WritablePureSelectorOptions<any>,
136
+ | WritablePureSelectorOptions<any, any>,
133
137
  ):
134
138
  | ReadonlyHeldSelectorToken<any>
135
- | ReadonlyPureSelectorToken<any>
139
+ | ReadonlyPureSelectorToken<any, any, any>
136
140
  | WritableHeldSelectorToken<any>
137
- | WritablePureSelectorToken<any> {
141
+ | WritablePureSelectorToken<any, any, any> {
138
142
  return createStandaloneSelector(IMPLICIT.STORE, options)
139
143
  }
140
144
 
141
- export type WritablePureSelectorFamilyOptions<T, K extends Canonical> = {
145
+ export type WritablePureSelectorFamilyOptions<
146
+ T,
147
+ K extends Canonical,
148
+ E = never,
149
+ > = {
142
150
  /** The unique identifier of the family */
143
151
  key: string
144
152
  /** For each instantiated family member, a function that computes its value */
145
153
  get: (key: K) => Read<() => T>
146
154
  /** For each instantiated family member, a function that sets its value */
147
155
  set: (key: K) => Write<(newValue: T) => void>
156
+ /** The classes of errors that might be thrown when deriving the atom's default value */
157
+ catch?: readonly (new () => E)[]
148
158
  }
149
- export type ReadonlyPureSelectorFamilyOptions<T, K extends Canonical> = {
159
+ export type ReadonlyPureSelectorFamilyOptions<
160
+ T,
161
+ K extends Canonical,
162
+ E = never,
163
+ > = {
150
164
  /** The unique identifier of the family */
151
165
  key: string
152
166
  /** For each instantiated family member, a function that computes its value */
153
167
  get: (key: K) => Read<() => T>
168
+ /** The classes of errors that might be thrown when deriving the atom's default value */
169
+ catch?: readonly (new () => E)[]
154
170
  }
155
171
  export type WritableHeldSelectorFamilyOptions<
156
172
  T extends object,
@@ -234,9 +250,9 @@ export function selectorFamily<T extends object, K extends Canonical>(
234
250
  * A reference to the selector family created: a {@link TransientWritableSelectorFamilyToken}
235
251
  * @overload WritablePure
236
252
  */
237
- export function selectorFamily<T, K extends Canonical>(
238
- options: WritablePureSelectorFamilyOptions<T, K>,
239
- ): WritablePureSelectorFamilyToken<T, K>
253
+ export function selectorFamily<T, K extends Canonical, E = never>(
254
+ options: WritablePureSelectorFamilyOptions<T, K, E>,
255
+ ): WritablePureSelectorFamilyToken<T, K, E>
240
256
  /**
241
257
  * Create a family of selectors, allowing for the dynamic creation and disposal of selectors.
242
258
  *
@@ -252,19 +268,19 @@ export function selectorFamily<T, K extends Canonical>(
252
268
  * A reference to the selector family created: a {@link ReadonlyPureSelectorFamilyToken}
253
269
  * @overload ReadonlyPure
254
270
  */
255
- export function selectorFamily<T, K extends Canonical>(
256
- options: ReadonlyPureSelectorFamilyOptions<T, K>,
257
- ): ReadonlyPureSelectorFamilyToken<T, K>
271
+ export function selectorFamily<T, K extends Canonical, E = never>(
272
+ options: ReadonlyPureSelectorFamilyOptions<T, K, E>,
273
+ ): ReadonlyPureSelectorFamilyToken<T, K, E>
258
274
  export function selectorFamily(
259
275
  options:
260
276
  | ReadonlyHeldSelectorFamilyOptions<any, any>
261
- | ReadonlyPureSelectorFamilyOptions<any, any>
277
+ | ReadonlyPureSelectorFamilyOptions<any, any, any>
262
278
  | WritableHeldSelectorFamilyOptions<any, any>
263
- | WritablePureSelectorFamilyOptions<any, any>,
279
+ | WritablePureSelectorFamilyOptions<any, any, any>,
264
280
  ):
265
281
  | ReadonlyHeldSelectorFamilyToken<any, any>
266
- | ReadonlyPureSelectorFamilyToken<any, any>
282
+ | ReadonlyPureSelectorFamilyToken<any, any, any>
267
283
  | WritableHeldSelectorFamilyToken<any, any>
268
- | WritablePureSelectorFamilyToken<any, any> {
284
+ | WritablePureSelectorFamilyToken<any, any, any> {
269
285
  return createSelectorFamily(IMPLICIT.STORE, options)
270
286
  }
@@ -19,7 +19,7 @@ export type Setter<T, New extends T> = (oldValue: T) => New
19
19
  * @default
20
20
  */
21
21
  export function setState<T, New extends T>(
22
- token: WritableToken<T>,
22
+ token: WritableToken<T, any, any>,
23
23
  value: New | Setter<T, New>,
24
24
  ): void
25
25
 
@@ -31,15 +31,19 @@ export function setState<T, New extends T>(
31
31
  * @overload Streamlined
32
32
  */
33
33
  export function setState<T, K extends Canonical, New extends T, Key extends K>(
34
- token: WritableFamilyToken<T, K>,
34
+ token: WritableFamilyToken<T, K, any>,
35
35
  key: Key,
36
36
  value: New | Setter<T, New>,
37
37
  ): void
38
38
 
39
39
  export function setState<T, K extends Canonical, New extends T, Key extends K>(
40
40
  ...params:
41
- | [token: WritableFamilyToken<T, K>, key: Key, value: New | Setter<T, New>]
42
- | [token: WritableToken<T>, value: New | Setter<T, New>]
41
+ | [
42
+ token: WritableFamilyToken<T, K, any>,
43
+ key: Key,
44
+ value: New | Setter<T, New>,
45
+ ]
46
+ | [token: WritableToken<T, any, any>, value: New | Setter<T, New>]
43
47
  ): void {
44
48
  setIntoStore(IMPLICIT.STORE, ...params)
45
49
  }
@@ -2,13 +2,15 @@ import { createTimeline, IMPLICIT, timeTravel } from "atom.io/internal"
2
2
 
3
3
  import type { AtomFamilyToken, AtomToken, TimelineToken } from "."
4
4
 
5
- export type TimelineManageable = AtomFamilyToken<any, any> | AtomToken<any>
5
+ export type TimelineManageable =
6
+ | AtomFamilyToken<any, any, any>
7
+ | AtomToken<any, any, any>
6
8
  export type AtomOnly<M extends TimelineManageable> = M extends AtomFamilyToken<
7
9
  any,
8
10
  any
9
11
  >
10
- ? AtomToken<any>
11
- : M extends AtomToken<any>
12
+ ? AtomToken<any, any, any>
13
+ : M extends AtomToken<any, any, any>
12
14
  ? M
13
15
  : never
14
16
 
@@ -13,31 +13,31 @@ import type { Canonical, stringified } from "atom.io/json"
13
13
  * Tokens are fully serializable, so they can be passed between processes.
14
14
  */
15
15
  export type AtomIOToken =
16
- | ReadableFamilyToken<any, any>
17
- | ReadableToken<any>
16
+ | ReadableFamilyToken<any, any, any>
17
+ | ReadableToken<any, any, any>
18
18
  | TimelineToken<any>
19
19
  | TransactionToken<any>
20
20
 
21
- export type ReadableToken<T, K extends Canonical = any> =
22
- | AtomToken<T, K>
23
- | SelectorToken<T, K>
21
+ export type ReadableToken<T, K extends Canonical = any, E = never> =
22
+ | AtomToken<T, K, E>
23
+ | SelectorToken<T, K, E>
24
24
 
25
- export type WritableToken<T, K extends Canonical = any> =
26
- | AtomToken<T, K>
27
- | WritableSelectorToken<T, K>
25
+ export type WritableToken<T, K extends Canonical = any, E = never> =
26
+ | AtomToken<T, K, E>
27
+ | WritableSelectorToken<T, K, E>
28
28
 
29
29
  /**
30
30
  * States belonging to this family can be read from the store.
31
31
  */
32
- export type ReadableFamilyToken<T, K extends Canonical> =
33
- | AtomFamilyToken<T, K>
34
- | SelectorFamilyToken<T, K>
32
+ export type ReadableFamilyToken<T, K extends Canonical, E = never> =
33
+ | AtomFamilyToken<T, K, E>
34
+ | SelectorFamilyToken<T, K, E>
35
35
  /**
36
36
  * States belonging to this family can be written directly.
37
37
  */
38
- export type WritableFamilyToken<T, K extends Canonical> =
39
- | AtomFamilyToken<T, K>
40
- | WritableSelectorFamilyToken<T, K>
38
+ export type WritableFamilyToken<T, K extends Canonical, E = never> =
39
+ | AtomFamilyToken<T, K, E>
40
+ | WritableSelectorFamilyToken<T, K, E>
41
41
 
42
42
  export type TimelineToken<M> = {
43
43
  /** The unique identifier of the timeline */
@@ -57,10 +57,10 @@ export type TransactionToken<F extends Fn> = {
57
57
  __F?: F
58
58
  }
59
59
 
60
- export type AtomToken<T, K extends Canonical = any> =
60
+ export type AtomToken<T, K extends Canonical = any, E = never> =
61
61
  | MutableAtomToken<T extends Transceiver<any, any, any> ? T : never, K>
62
- | RegularAtomToken<T, K>
63
- export type RegularAtomToken<T, K extends Canonical = any> = {
62
+ | RegularAtomToken<T, K, E>
63
+ export type RegularAtomToken<T, K extends Canonical = any, E = never> = {
64
64
  /** The unique identifier of the atom. */
65
65
  key: string
66
66
  /** Discriminator. */
@@ -69,6 +69,8 @@ export type RegularAtomToken<T, K extends Canonical = any> = {
69
69
  family?: FamilyMetadata<K>
70
70
  /** Never present. This is a marker that preserves the type of the atom's value. */
71
71
  __T?: T
72
+ /** Never present. This is a marker that preserves the type of errors this atom is capable of catching and setting as its value. */
73
+ __E?: E
72
74
  }
73
75
  export type MutableAtomToken<
74
76
  T extends Transceiver<any, any, any>,
@@ -84,23 +86,27 @@ export type MutableAtomToken<
84
86
  __J?: AsJSON<T>
85
87
  }
86
88
 
87
- export type SelectorToken<T, K extends Canonical = any> =
88
- | ReadonlySelectorToken<T, K>
89
- | WritableSelectorToken<T, K>
90
- export type ReadonlySelectorToken<T, K extends Canonical = any> =
89
+ export type SelectorToken<T, K extends Canonical = any, E = never> =
90
+ | ReadonlySelectorToken<T, K, E>
91
+ | WritableSelectorToken<T, K, E>
92
+ export type ReadonlySelectorToken<T, K extends Canonical = any, E = never> =
91
93
  | ReadonlyHeldSelectorToken<T, K>
92
- | ReadonlyPureSelectorToken<T, K>
93
- export type WritableSelectorToken<T, K extends Canonical = any> =
94
+ | ReadonlyPureSelectorToken<T, K, E>
95
+ export type WritableSelectorToken<T, K extends Canonical = any, E = never> =
94
96
  | WritableHeldSelectorToken<T, K>
95
- | WritablePureSelectorToken<T, K>
96
- export type PureSelectorToken<T, K extends Canonical = any> =
97
- | ReadonlyPureSelectorToken<T, K>
98
- | WritablePureSelectorToken<T, K>
97
+ | WritablePureSelectorToken<T, K, E>
98
+ export type PureSelectorToken<T, K extends Canonical = any, E = never> =
99
+ | ReadonlyPureSelectorToken<T, K, E>
100
+ | WritablePureSelectorToken<T, K, E>
99
101
  export type HeldSelectorToken<T, K extends Canonical = any> =
100
102
  | ReadonlyHeldSelectorToken<T, K>
101
103
  | WritableHeldSelectorToken<T, K>
102
104
 
103
- export type WritablePureSelectorToken<T, K extends Canonical = any> = {
105
+ export type WritablePureSelectorToken<
106
+ T,
107
+ K extends Canonical = any,
108
+ E = never,
109
+ > = {
104
110
  /** The unique identifier of the selector. */
105
111
  key: string
106
112
  /** Discriminator. */
@@ -109,6 +115,8 @@ export type WritablePureSelectorToken<T, K extends Canonical = any> = {
109
115
  family?: FamilyMetadata<K>
110
116
  /** Never present. This is a marker that preserves the type of the selector's value. */
111
117
  __T?: T
118
+ /** Never present. This is a marker that preserves the type of errors this selector is capable of catching and setting as its value. */
119
+ __E?: E
112
120
  }
113
121
  export type WritableHeldSelectorToken<T, K extends Canonical = any> = {
114
122
  /** The unique identifier of the selector. */
@@ -120,7 +128,11 @@ export type WritableHeldSelectorToken<T, K extends Canonical = any> = {
120
128
  /** Never present. This is a marker that preserves the type of the selector's value. */
121
129
  __T?: T
122
130
  }
123
- export type ReadonlyPureSelectorToken<T, K extends Canonical = any> = {
131
+ export type ReadonlyPureSelectorToken<
132
+ T,
133
+ K extends Canonical = any,
134
+ E = never,
135
+ > = {
124
136
  /** The unique identifier of the selector. */
125
137
  key: string
126
138
  /** Discriminator. */
@@ -129,6 +141,8 @@ export type ReadonlyPureSelectorToken<T, K extends Canonical = any> = {
129
141
  family?: FamilyMetadata<K>
130
142
  /** Never present. This is a marker that preserves the type of the selector's value. */
131
143
  __T?: T
144
+ /** Never present. This is a marker that preserves the type of errors this selector is capable of catching and setting as its value. */
145
+ __E?: E
132
146
  }
133
147
  export type ReadonlyHeldSelectorToken<T, K extends Canonical = any> = {
134
148
  /** The unique identifier of the selector. */
@@ -151,10 +165,10 @@ export type FamilyMetadata<K extends Canonical = any> = {
151
165
  subKey: stringified<K>
152
166
  }
153
167
 
154
- export type AtomFamilyToken<T, K extends Canonical = Canonical> =
168
+ export type AtomFamilyToken<T, K extends Canonical = Canonical, E = never> =
155
169
  | MutableAtomFamilyToken<T extends Transceiver<any, any, any> ? T : never, K>
156
- | RegularAtomFamilyToken<T, K>
157
- export type RegularAtomFamilyToken<T, K extends Canonical> = {
170
+ | RegularAtomFamilyToken<T, K, E>
171
+ export type RegularAtomFamilyToken<T, K extends Canonical, E = never> = {
158
172
  /** The unique identifier of the atom family */
159
173
  key: string
160
174
  /** Discriminator */
@@ -163,6 +177,8 @@ export type RegularAtomFamilyToken<T, K extends Canonical> = {
163
177
  __T?: T
164
178
  /** Never present. This is a marker that preserves the type of keys used for atoms in this family */
165
179
  __K?: K
180
+ /** Never present. This is a marker that preserves the type of errors this family is capable of catching and setting as its value. */
181
+ __E?: E
166
182
  }
167
183
  export type MutableAtomFamilyToken<
168
184
  T extends Transceiver<any, any, any>,
@@ -178,23 +194,27 @@ export type MutableAtomFamilyToken<
178
194
  __K?: K
179
195
  }
180
196
 
181
- export type SelectorFamilyToken<T, K extends Canonical> =
182
- | ReadonlySelectorFamilyToken<T, K>
183
- | WritableSelectorFamilyToken<T, K>
184
- export type ReadonlySelectorFamilyToken<T, K extends Canonical> =
197
+ export type SelectorFamilyToken<T, K extends Canonical, E = never> =
198
+ | ReadonlySelectorFamilyToken<T, K, E>
199
+ | WritableSelectorFamilyToken<T, K, E>
200
+ export type ReadonlySelectorFamilyToken<T, K extends Canonical, E = never> =
185
201
  | ReadonlyHeldSelectorFamilyToken<T, K>
186
- | ReadonlyPureSelectorFamilyToken<T, K>
187
- export type WritableSelectorFamilyToken<T, K extends Canonical> =
202
+ | ReadonlyPureSelectorFamilyToken<T, K, E>
203
+ export type WritableSelectorFamilyToken<T, K extends Canonical, E = never> =
188
204
  | WritableHeldSelectorFamilyToken<T, K>
189
- | WritablePureSelectorFamilyToken<T, K>
190
- export type PureSelectorFamilyToken<T, K extends Canonical> =
191
- | ReadonlyPureSelectorFamilyToken<T, K>
192
- | WritablePureSelectorFamilyToken<T, K>
205
+ | WritablePureSelectorFamilyToken<T, K, E>
206
+ export type PureSelectorFamilyToken<T, K extends Canonical, E = never> =
207
+ | ReadonlyPureSelectorFamilyToken<T, K, E>
208
+ | WritablePureSelectorFamilyToken<T, K, E>
193
209
  export type HeldSelectorFamilyToken<T, K extends Canonical> =
194
210
  | ReadonlyHeldSelectorFamilyToken<T, K>
195
211
  | WritableHeldSelectorFamilyToken<T, K>
196
212
 
197
- export type WritablePureSelectorFamilyToken<T, K extends Canonical> = {
213
+ export type WritablePureSelectorFamilyToken<
214
+ T,
215
+ K extends Canonical,
216
+ E = never,
217
+ > = {
198
218
  /** The unique identifier of the family */
199
219
  key: string
200
220
  /** Discriminator */
@@ -203,8 +223,14 @@ export type WritablePureSelectorFamilyToken<T, K extends Canonical> = {
203
223
  __T?: T
204
224
  /** Never present. This is a marker that preserves the type of keys used for each family member */
205
225
  __K?: K
226
+ /** Never present. This is a marker that preserves the type of errors this family is capable of catching and setting as its value. */
227
+ __E?: E
206
228
  }
207
- export type ReadonlyPureSelectorFamilyToken<T, K extends Canonical> = {
229
+ export type ReadonlyPureSelectorFamilyToken<
230
+ T,
231
+ K extends Canonical,
232
+ E = never,
233
+ > = {
208
234
  /** The unique identifier of the family */
209
235
  key: string
210
236
  /** Discriminator */
@@ -213,6 +239,8 @@ export type ReadonlyPureSelectorFamilyToken<T, K extends Canonical> = {
213
239
  __T?: T
214
240
  /** Never present. This is a marker that preserves the type of keys used for each family member */
215
241
  __K?: K
242
+ /** Never present. This is a marker that preserves the type of errors this family is capable of catching and setting as its value. */
243
+ __E?: E
216
244
  }
217
245
  export type WritableHeldSelectorFamilyToken<T, K extends Canonical> = {
218
246
  /** The unique identifier of the family */
@@ -16,8 +16,8 @@ import type {
16
16
 
17
17
  export type TokenType<
18
18
  Comparison extends
19
- | ReadableFamilyToken<any, any>
20
- | ReadableToken<any>
19
+ | ReadableFamilyToken<any, any, any>
20
+ | ReadableToken<any, any, any>
21
21
  | TransactionToken<any>,
22
22
  > = Comparison extends ReadableToken<infer RepresentedValue>
23
23
  ? RepresentedValue
@@ -27,9 +27,9 @@ export type TokenType<
27
27
  ? Fn
28
28
  : never
29
29
 
30
- export function isToken<KnownToken extends RegularAtomToken<any>>(
30
+ export function isToken<KnownToken extends RegularAtomToken<any, any, any>>(
31
31
  knownToken: KnownToken,
32
- unknownToken: ReadableToken<any>,
32
+ unknownToken: ReadableToken<any, any, any>,
33
33
  ): unknownToken is RegularAtomToken<TokenType<KnownToken>>
34
34
  export function isToken<KnownToken extends MutableAtomToken<any, any>>(
35
35
  knownToken: KnownToken,
@@ -8,21 +8,21 @@ import type { Store } from "atom.io/internal"
8
8
  import { findInStore } from "atom.io/internal"
9
9
  import type { Canonical } from "atom.io/json"
10
10
 
11
- export function parseStateOverloads<T, K extends Canonical>(
11
+ export function parseStateOverloads<T, K extends Canonical, Key extends K, E>(
12
12
  store: Store,
13
- ...rest: [WritableFamilyToken<T, K>, K] | [WritableToken<T>]
14
- ): WritableToken<T>
13
+ ...rest: [WritableFamilyToken<T, K, E>, Key] | [WritableToken<T, any, E>]
14
+ ): WritableToken<T, K, E>
15
15
 
16
- export function parseStateOverloads<T, K extends Canonical>(
16
+ export function parseStateOverloads<T, K extends Canonical, Key extends K, E>(
17
17
  store: Store,
18
- ...rest: [ReadableFamilyToken<T, K>, K] | [ReadableToken<T>]
19
- ): ReadableToken<T>
18
+ ...rest: [ReadableFamilyToken<T, K, E>, Key] | [ReadableToken<T, any, E>]
19
+ ): ReadableToken<T, K, E>
20
20
 
21
- export function parseStateOverloads<T, K extends Canonical>(
21
+ export function parseStateOverloads<T, K extends Canonical, Key extends K, E>(
22
22
  store: Store,
23
- ...rest: [ReadableFamilyToken<T, K>, K] | [ReadableToken<T>]
24
- ): ReadableToken<T> {
25
- let token: ReadableToken<any>
23
+ ...rest: [ReadableFamilyToken<T, K, E>, Key] | [ReadableToken<T, any, E>]
24
+ ): ReadableToken<T, K, E> {
25
+ let token: ReadableToken<any, any, any>
26
26
  if (rest.length === 2) {
27
27
  const family = rest[0]
28
28
  const key = rest[1]
@@ -7,16 +7,16 @@ import { parseStateOverloads } from "./parse-state-overloads"
7
7
  import { StoreContext } from "./store-context"
8
8
 
9
9
  export function useI<T>(
10
- token: WritableToken<T>,
10
+ token: WritableToken<T, any, any>,
11
11
  ): <New extends T>(next: New | ((old: T) => New)) => void
12
12
 
13
- export function useI<T, K extends Canonical>(
14
- token: WritableFamilyToken<T, K>,
15
- key: K,
13
+ export function useI<T, K extends Canonical, Key extends K>(
14
+ token: WritableFamilyToken<T, K, any>,
15
+ key: Key,
16
16
  ): <New extends T>(next: New | ((old: T) => New)) => void
17
17
 
18
- export function useI<T, K extends Canonical>(
19
- ...params: [WritableFamilyToken<T, K>, K] | [WritableToken<T>]
18
+ export function useI<T, K extends Canonical, Key extends K>(
19
+ ...params: [WritableFamilyToken<T, K, any>, Key] | [WritableToken<T, any, any>]
20
20
  ): <New extends T>(next: New | ((old: T) => New)) => void {
21
21
  const store = React.useContext(StoreContext)
22
22
  const token = parseStateOverloads(store, ...params)
@@ -4,32 +4,32 @@ import type { Canonical } from "atom.io/json"
4
4
  import { useO } from "atom.io/react"
5
5
  import React from "react"
6
6
 
7
- export function useLoadable<T>(
8
- token: ReadableToken<Loadable<T>>,
9
- ): `LOADING` | { loading: boolean; value: T }
7
+ export function useLoadable<T, E>(
8
+ token: ReadableToken<Loadable<T>, any, E>,
9
+ ): `LOADING` | { loading: boolean; value: E | T }
10
10
 
11
- export function useLoadable<T, K extends Canonical>(
12
- token: ReadableFamilyToken<Loadable<T>, K>,
11
+ export function useLoadable<T, K extends Canonical, E>(
12
+ token: ReadableFamilyToken<Loadable<T>, K, E>,
13
13
  key: K,
14
- ): `LOADING` | { loading: boolean; value: T }
14
+ ): `LOADING` | { loading: boolean; value: E | T }
15
15
 
16
- export function useLoadable<T, F extends T>(
17
- token: ReadableToken<Loadable<T>>,
16
+ export function useLoadable<T, F extends T, E>(
17
+ token: ReadableToken<Loadable<T>, any, E>,
18
18
  fallback: F,
19
19
  ): { loading: boolean; value: T }
20
20
 
21
- export function useLoadable<T, K extends Canonical, F extends T>(
22
- token: ReadableFamilyToken<Loadable<T>, K>,
21
+ export function useLoadable<T, K extends Canonical, F extends T, E>(
22
+ token: ReadableFamilyToken<Loadable<T>, K, E>,
23
23
  key: K,
24
24
  fallback: F,
25
- ): { loading: boolean; value: T }
25
+ ): { loading: boolean; value: E | T }
26
26
 
27
27
  export function useLoadable(
28
28
  ...params:
29
- | readonly [ReadableFamilyToken<any, Canonical>, Canonical, unknown]
30
- | readonly [ReadableFamilyToken<any, Canonical>, Canonical]
31
- | readonly [ReadableToken<any>, unknown]
32
- | readonly [ReadableToken<any>]
29
+ | readonly [ReadableFamilyToken<any, Canonical, any>, Canonical, unknown]
30
+ | readonly [ReadableFamilyToken<any, Canonical, any>, Canonical]
31
+ | readonly [ReadableToken<any, any, any>, unknown]
32
+ | readonly [ReadableToken<any, any, any>]
33
33
  ): `LOADING` | { loading: boolean; value: unknown } {
34
34
  let state: unknown
35
35
  let fallback: unknown
@@ -6,20 +6,20 @@ import * as React from "react"
6
6
  import { parseStateOverloads } from "./parse-state-overloads"
7
7
  import { StoreContext } from "./store-context"
8
8
 
9
- export function useO<T>(token: ReadableToken<T>): T
9
+ export function useO<T, E>(token: ReadableToken<T, any, E>): E | T
10
10
 
11
- export function useO<T, K extends Canonical>(
12
- token: ReadableFamilyToken<T, K>,
13
- key: K,
14
- ): T
11
+ export function useO<T, K extends Canonical, Key extends K, E>(
12
+ token: ReadableFamilyToken<T, K, E>,
13
+ key: Key,
14
+ ): E | T
15
15
 
16
- export function useO<T, K extends Canonical>(
17
- ...params: [ReadableFamilyToken<T, K>, K] | [ReadableToken<T>]
18
- ): T {
16
+ export function useO<T, K extends Canonical, Key extends K, E>(
17
+ ...params: [ReadableFamilyToken<T, K, E>, Key] | [ReadableToken<T, any, E>]
18
+ ): E | T {
19
19
  const store = React.useContext(StoreContext)
20
20
  const token = parseStateOverloads(store, ...params)
21
21
  const id = React.useId()
22
- return React.useSyncExternalStore<T>(
22
+ return React.useSyncExternalStore<E | T>(
23
23
  (dispatch) => subscribeToState(store, token, `use-o:${id}`, dispatch),
24
24
  () => getFromStore(store, token),
25
25
  () => getFromStore(store, token),
@@ -5,7 +5,7 @@ import type { FC } from "react"
5
5
  import { JsonEditor } from "./json-editor"
6
6
 
7
7
  export const StateEditor: FC<{
8
- token: WritableToken<unknown>
8
+ token: WritableToken<unknown, any, unknown>
9
9
  }> = ({ token }) => {
10
10
  const set = useI(token)
11
11
  const data = useO(token)
@@ -23,7 +23,7 @@ export const StateEditor: FC<{
23
23
  }
24
24
 
25
25
  export const ReadonlySelectorViewer: FC<{
26
- token: ReadonlySelectorToken<unknown>
26
+ token: ReadonlySelectorToken<unknown, any, unknown>
27
27
  }> = ({ token }) => {
28
28
  const data = useO(token)
29
29
  const metaPath = token.family
@@ -41,7 +41,9 @@ export const ReadonlySelectorViewer: FC<{
41
41
  }
42
42
 
43
43
  export const StoreEditor: FC<{
44
- token: ReadonlySelectorToken<unknown> | WritableToken<unknown>
44
+ token:
45
+ | ReadonlySelectorToken<unknown, any, unknown>
46
+ | WritableToken<unknown, any, unknown>
45
47
  }> = ({ token }) => {
46
48
  switch (token.type) {
47
49
  case `readonly_pure_selector`:
@@ -25,7 +25,7 @@ import { DevtoolsContext } from "./store"
25
25
  /* eslint-disable no-console */
26
26
 
27
27
  export const StateIndexLeafNode: FC<{
28
- node: ReadableToken<unknown>
28
+ node: ReadableToken<unknown, any, unknown>
29
29
  isOpenState: RegularAtomToken<boolean>
30
30
  typeState: ReadonlyPureSelectorToken<Loadable<string>>
31
31
  dispose?: (() => void) | undefined
@@ -95,7 +95,7 @@ export const StateIndexLeafNode: FC<{
95
95
  )
96
96
  }
97
97
  export const StateIndexTreeNode: FC<{
98
- node: FamilyNode<ReadableToken<unknown>>
98
+ node: FamilyNode<ReadableToken<unknown, any, unknown>>
99
99
  isOpenState: RegularAtomToken<boolean>
100
100
  }> = ({ node, isOpenState }) => {
101
101
  const setIsOpen = useI(isOpenState)
@@ -147,7 +147,9 @@ export const StateIndexTreeNode: FC<{
147
147
  }
148
148
 
149
149
  export const StateIndexNode: FC<{
150
- node: FamilyNode<ReadableToken<unknown>> | ReadableToken<unknown>
150
+ node:
151
+ | FamilyNode<ReadableToken<unknown, any, unknown>>
152
+ | ReadableToken<unknown, any, unknown>
151
153
  isOpenState: RegularAtomToken<boolean>
152
154
  typeState: ReadonlyPureSelectorToken<Loadable<string>>
153
155
  dispose?: () => void
@@ -169,7 +171,7 @@ export const StateIndexNode: FC<{
169
171
  }
170
172
 
171
173
  export const StateIndex: FC<{
172
- tokenIndex: AtomToken<WritableTokenIndex<ReadableToken<unknown>>>
174
+ tokenIndex: AtomToken<WritableTokenIndex<ReadableToken<unknown, any, unknown>>>
173
175
  }> = ({ tokenIndex }) => {
174
176
  const tokenIds = useO(tokenIndex)
175
177
 
@@ -13,7 +13,7 @@ import * as React from "react"
13
13
 
14
14
  const AtomUpdateFC: React.FC<{
15
15
  serialNumber: number
16
- atomUpdate: AtomUpdateEvent<AtomToken<unknown>>
16
+ atomUpdate: AtomUpdateEvent<AtomToken<unknown, any, any>>
17
17
  }> = ({ atomUpdate }) => {
18
18
  return (
19
19
  <article