atom.io 0.6.7 → 0.6.9

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 (129) hide show
  1. package/dist/index.d.mts +241 -263
  2. package/dist/index.d.ts +241 -263
  3. package/dist/index.js +28 -1911
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +5 -1871
  6. package/dist/index.mjs.map +1 -1
  7. package/introspection/dist/index.d.mts +121 -176
  8. package/introspection/dist/index.d.ts +121 -176
  9. package/introspection/dist/index.js +6 -346
  10. package/introspection/dist/index.js.map +1 -1
  11. package/introspection/dist/index.mjs +5 -324
  12. package/introspection/dist/index.mjs.map +1 -1
  13. package/json/dist/index.d.mts +37 -8
  14. package/json/dist/index.d.ts +37 -8
  15. package/json/dist/index.js +31 -48
  16. package/json/dist/index.js.map +1 -1
  17. package/json/dist/index.mjs +6 -14
  18. package/json/dist/index.mjs.map +1 -1
  19. package/package.json +30 -14
  20. package/react/dist/index.js +34 -83
  21. package/react/dist/index.js.map +1 -1
  22. package/react/dist/index.mjs +7 -43
  23. package/react/dist/index.mjs.map +1 -1
  24. package/react-devtools/dist/index.css +1 -42
  25. package/react-devtools/dist/index.css.map +1 -1
  26. package/react-devtools/dist/index.d.mts +128 -193
  27. package/react-devtools/dist/index.d.ts +128 -193
  28. package/react-devtools/dist/index.js +56 -4154
  29. package/react-devtools/dist/index.js.map +1 -1
  30. package/react-devtools/dist/index.mjs +19 -4117
  31. package/react-devtools/dist/index.mjs.map +1 -1
  32. package/realtime/dist/index.d.mts +7 -11
  33. package/realtime/dist/index.d.ts +7 -11
  34. package/realtime/dist/index.js +26 -185
  35. package/realtime/dist/index.js.map +1 -1
  36. package/realtime/dist/index.mjs +4 -149
  37. package/realtime/dist/index.mjs.map +1 -1
  38. package/realtime-react/dist/index.d.mts +12 -16
  39. package/realtime-react/dist/index.d.ts +12 -16
  40. package/realtime-react/dist/index.js +41 -214
  41. package/realtime-react/dist/index.js.map +1 -1
  42. package/realtime-react/dist/index.mjs +9 -169
  43. package/realtime-react/dist/index.mjs.map +1 -1
  44. package/src/atom.ts +7 -6
  45. package/src/index.ts +12 -9
  46. package/src/logger.ts +5 -5
  47. package/src/selector.ts +16 -14
  48. package/src/silo.ts +36 -39
  49. package/src/subscribe.ts +25 -20
  50. package/src/timeline.ts +9 -4
  51. package/src/transaction.ts +3 -4
  52. package/src/internal/atom-internal.ts +0 -54
  53. package/src/internal/families-internal.ts +0 -141
  54. package/src/internal/get.ts +0 -129
  55. package/src/internal/index.ts +0 -15
  56. package/src/internal/is-default.ts +0 -35
  57. package/src/internal/operation.ts +0 -139
  58. package/src/internal/selector/create-read-write-selector.ts +0 -66
  59. package/src/internal/selector/create-readonly-selector.ts +0 -46
  60. package/src/internal/selector/index.ts +0 -4
  61. package/src/internal/selector/lookup-selector-sources.ts +0 -16
  62. package/src/internal/selector/register-selector.ts +0 -57
  63. package/src/internal/selector/trace-selector-atoms.ts +0 -43
  64. package/src/internal/selector/update-selector-atoms.ts +0 -33
  65. package/src/internal/selector-internal.ts +0 -58
  66. package/src/internal/set.ts +0 -99
  67. package/src/internal/store.ts +0 -151
  68. package/src/internal/subject.ts +0 -24
  69. package/src/internal/subscribe-internal.ts +0 -88
  70. package/src/internal/time-travel-internal.ts +0 -91
  71. package/src/internal/timeline/add-atom-to-timeline.ts +0 -168
  72. package/src/internal/timeline/index.ts +0 -1
  73. package/src/internal/timeline-internal.ts +0 -107
  74. package/src/internal/transaction/abort-transaction.ts +0 -12
  75. package/src/internal/transaction/apply-transaction.ts +0 -57
  76. package/src/internal/transaction/build-transaction.ts +0 -33
  77. package/src/internal/transaction/index.ts +0 -25
  78. package/src/internal/transaction/redo-transaction.ts +0 -23
  79. package/src/internal/transaction/undo-transaction.ts +0 -23
  80. package/src/internal/transaction-internal.ts +0 -61
  81. package/src/introspection/attach-atom-index.ts +0 -73
  82. package/src/introspection/attach-introspection-states.ts +0 -42
  83. package/src/introspection/attach-selector-index.ts +0 -77
  84. package/src/introspection/attach-timeline-family.ts +0 -59
  85. package/src/introspection/attach-timeline-index.ts +0 -36
  86. package/src/introspection/attach-transaction-index.ts +0 -38
  87. package/src/introspection/attach-transaction-logs.ts +0 -40
  88. package/src/introspection/index.ts +0 -20
  89. package/src/json/index.ts +0 -1
  90. package/src/json/select-json.ts +0 -18
  91. package/src/react/index.ts +0 -2
  92. package/src/react/store-context.tsx +0 -13
  93. package/src/react/store-hooks.ts +0 -47
  94. package/src/react-devtools/AtomIODevtools.tsx +0 -107
  95. package/src/react-devtools/Button.tsx +0 -24
  96. package/src/react-devtools/StateEditor.tsx +0 -70
  97. package/src/react-devtools/StateIndex.tsx +0 -153
  98. package/src/react-devtools/TimelineIndex.tsx +0 -92
  99. package/src/react-devtools/TransactionIndex.tsx +0 -70
  100. package/src/react-devtools/Updates.tsx +0 -145
  101. package/src/react-devtools/devtools.scss +0 -311
  102. package/src/react-devtools/index.ts +0 -72
  103. package/src/react-explorer/AtomIOExplorer.tsx +0 -218
  104. package/src/react-explorer/explorer-effects.ts +0 -20
  105. package/src/react-explorer/explorer-states.ts +0 -217
  106. package/src/react-explorer/index.ts +0 -23
  107. package/src/react-explorer/space-states.ts +0 -72
  108. package/src/react-explorer/view-states.ts +0 -41
  109. package/src/realtime/README.md +0 -33
  110. package/src/realtime/hook-composition/expose-family.ts +0 -101
  111. package/src/realtime/hook-composition/expose-single.ts +0 -38
  112. package/src/realtime/hook-composition/expose-timeline.ts +0 -60
  113. package/src/realtime/hook-composition/index.ts +0 -12
  114. package/src/realtime/hook-composition/receive-state.ts +0 -29
  115. package/src/realtime/hook-composition/receive-transaction.ts +0 -18
  116. package/src/realtime/index.ts +0 -1
  117. package/src/realtime-react/index.ts +0 -3
  118. package/src/realtime-react/realtime-context.tsx +0 -30
  119. package/src/realtime-react/realtime-hooks.ts +0 -39
  120. package/src/realtime-react/realtime-state.ts +0 -10
  121. package/src/realtime-react/use-pull-family-member.ts +0 -26
  122. package/src/realtime-react/use-pull-family.ts +0 -24
  123. package/src/realtime-react/use-pull.ts +0 -22
  124. package/src/realtime-react/use-push.ts +0 -25
  125. package/src/realtime-react/use-server-action.ts +0 -33
  126. package/src/realtime-testing/index.ts +0 -1
  127. package/src/realtime-testing/setup-realtime-test.tsx +0 -159
  128. package/src/web-effects/index.ts +0 -1
  129. package/src/web-effects/storage.ts +0 -30
@@ -1,129 +0,0 @@
1
- import type { ƒn } from "~/packages/anvl/src/function"
2
-
3
- import type {
4
- Atom,
5
- ReadonlySelector,
6
- Selector,
7
- Store,
8
- Timeline,
9
- Transaction,
10
- } from "."
11
- import { target, isValueCached, readCachedValue, IMPLICIT } from "."
12
- import type {
13
- AtomToken,
14
- ReadonlySelectorToken,
15
- SelectorToken,
16
- StateToken,
17
- TimelineToken,
18
- TransactionToken,
19
- } from ".."
20
-
21
- export const computeSelectorState = <T>(
22
- selector: ReadonlySelector<T> | Selector<T>,
23
- ): T => selector.get()
24
-
25
- export function lookup(
26
- key: string,
27
- store: Store,
28
- ): AtomToken<unknown> | ReadonlySelectorToken<unknown> | SelectorToken<unknown> {
29
- const core = target(store)
30
- const type = core.atoms.has(key)
31
- ? `atom`
32
- : core.selectors.has(key)
33
- ? `selector`
34
- : `readonly_selector`
35
- return { key, type } as any
36
- }
37
-
38
- export function withdraw<T>(token: AtomToken<T>, store: Store): Atom<T> | null
39
- export function withdraw<T>(
40
- token: SelectorToken<T>,
41
- store: Store,
42
- ): Selector<T> | null
43
- export function withdraw<T>(
44
- token: StateToken<T>,
45
- store: Store,
46
- ): Atom<T> | Selector<T> | null
47
- export function withdraw<T>(
48
- token: ReadonlySelectorToken<T>,
49
- store: Store,
50
- ): ReadonlySelector<T> | null
51
- export function withdraw<T>(
52
- token: TransactionToken<T>,
53
- store: Store,
54
- ): Transaction<T extends ƒn ? T : never> | null
55
- export function withdraw<T>(
56
- token: ReadonlySelectorToken<T> | StateToken<T>,
57
- store: Store,
58
- ): Atom<T> | ReadonlySelector<T> | Selector<T> | null
59
- export function withdraw<T>(token: TimelineToken, store: Store): Timeline | null
60
- export function withdraw<T>(
61
- token:
62
- | ReadonlySelectorToken<T>
63
- | StateToken<T>
64
- | TimelineToken
65
- | TransactionToken<T>,
66
- store: Store,
67
- ):
68
- | Atom<T>
69
- | ReadonlySelector<T>
70
- | Selector<T>
71
- | Timeline
72
- | Transaction<T extends ƒn ? T : never>
73
- | null {
74
- const core = target(store)
75
- return (
76
- core.atoms.get(token.key) ??
77
- core.selectors.get(token.key) ??
78
- core.readonlySelectors.get(token.key) ??
79
- core.transactions.get(token.key) ??
80
- core.timelines.get(token.key) ??
81
- null
82
- )
83
- }
84
-
85
- export function deposit<T>(state: Atom<T>): AtomToken<T>
86
- export function deposit<T>(state: Selector<T>): SelectorToken<T>
87
- export function deposit<T>(state: Atom<T> | Selector<T>): StateToken<T>
88
- export function deposit<T>(state: ReadonlySelector<T>): ReadonlySelectorToken<T>
89
- export function deposit<T>(
90
- state: Transaction<T extends ƒn ? T : never>,
91
- ): TransactionToken<T>
92
- export function deposit<T>(
93
- state: Atom<T> | ReadonlySelector<T> | Selector<T>,
94
- ): ReadonlySelectorToken<T> | StateToken<T>
95
- export function deposit<T>(
96
- state:
97
- | Atom<T>
98
- | ReadonlySelector<T>
99
- | Selector<T>
100
- | Transaction<T extends ƒn ? T : never>,
101
- ):
102
- | AtomToken<T>
103
- | ReadonlySelectorToken<T>
104
- | SelectorToken<T>
105
- | TransactionToken<T> {
106
- return {
107
- key: state.key,
108
- type: state.type,
109
- ...(`family` in state && { family: state.family }),
110
- } as any
111
- }
112
-
113
- export const getState__INTERNAL = <T>(
114
- state: Atom<T> | ReadonlySelector<T> | Selector<T>,
115
- store: Store = IMPLICIT.STORE,
116
- ): T => {
117
- if (isValueCached(state.key, store)) {
118
- store.config.logger?.info(`>> read "${state.key}"`)
119
- return readCachedValue(state.key, store)
120
- }
121
- if (state.type !== `atom`) {
122
- store.config.logger?.info(`-> calc "${state.key}"`)
123
- return computeSelectorState(state)
124
- }
125
- store.config.logger?.error(
126
- `Attempted to get atom "${state.key}", which was never initialized in store "${store.config.name}".`,
127
- )
128
- return state.default
129
- }
@@ -1,15 +0,0 @@
1
- export * from "./atom-internal"
2
- export * from "./families-internal"
3
- export * from "./get"
4
- export * from "./is-default"
5
- export * from "./operation"
6
- export * from "./selector-internal"
7
- export * from "./selector"
8
- export * from "./set"
9
- export * from "./store"
10
- export * from "./subject"
11
- export * from "./subscribe-internal"
12
- export * from "./time-travel-internal"
13
- export * from "./timeline-internal"
14
- export * from "./transaction-internal"
15
- export * from "./transaction"
@@ -1,35 +0,0 @@
1
- import type { Store } from "."
2
- import { target, IMPLICIT, traceAllSelectorAtoms } from "."
3
-
4
- export const isAtomDefault = (
5
- key: string,
6
- store: Store = IMPLICIT.STORE,
7
- ): boolean => {
8
- const core = target(store)
9
- return core.atomsThatAreDefault.has(key)
10
- }
11
-
12
- export const markAtomAsDefault = (
13
- key: string,
14
- store: Store = IMPLICIT.STORE,
15
- ): void => {
16
- const core = target(store)
17
- core.atomsThatAreDefault = new Set(core.atomsThatAreDefault).add(key)
18
- }
19
-
20
- export const markAtomAsNotDefault = (
21
- key: string,
22
- store: Store = IMPLICIT.STORE,
23
- ): void => {
24
- const core = target(store)
25
- core.atomsThatAreDefault = new Set(target(store).atomsThatAreDefault)
26
- core.atomsThatAreDefault.delete(key)
27
- }
28
-
29
- export const isSelectorDefault = (
30
- key: string,
31
- store: Store = IMPLICIT.STORE,
32
- ): boolean => {
33
- const roots = traceAllSelectorAtoms(key, store)
34
- return roots.every((root) => isAtomDefault(root.key, store))
35
- }
@@ -1,139 +0,0 @@
1
- import type { Atom, ReadonlySelector, Selector } from "."
2
- import { target } from "."
3
- import type { Store } from "./store"
4
- import { IMPLICIT } from "./store"
5
- import type { StateToken } from ".."
6
-
7
- export type OperationProgress =
8
- | {
9
- open: false
10
- }
11
- | {
12
- open: true
13
- done: Set<string>
14
- prev: Map<string, any>
15
- time: number
16
- token: StateToken<any>
17
- }
18
-
19
- export const openOperation = (token: StateToken<any>, store: Store): void => {
20
- const core = target(store)
21
- if (core.operation.open) {
22
- store.config.logger?.error(
23
- `❌ failed to setState to "${token.key}" during a setState for "${core.operation.token.key}"`,
24
- )
25
- throw Symbol(`violation`)
26
- }
27
- core.operation = {
28
- open: true,
29
- done: new Set(),
30
- prev: new Map(store.valueMap),
31
- time: Date.now(),
32
- token,
33
- }
34
- store.config.logger?.info(
35
- `⭕ operation start from "${token.key}" in store "${store.config.name}"`,
36
- )
37
- }
38
- export const closeOperation = (store: Store): void => {
39
- const core = target(store)
40
- core.operation = { open: false }
41
- store.config.logger?.info(`🔴 operation done`)
42
- store.subject.operationStatus.next(core.operation)
43
- }
44
-
45
- export const isDone = (key: string, store: Store = IMPLICIT.STORE): boolean => {
46
- const core = target(store)
47
- if (!core.operation.open) {
48
- store.config.logger?.warn(
49
- `isDone called outside of an operation. This is probably a bug.`,
50
- )
51
- return true
52
- }
53
- return core.operation.done.has(key)
54
- }
55
- export const markDone = (key: string, store: Store = IMPLICIT.STORE): void => {
56
- const core = target(store)
57
- if (!core.operation.open) {
58
- store.config.logger?.warn(
59
- `markDone called outside of an operation. This is probably a bug.`,
60
- )
61
- return
62
- }
63
- core.operation.done.add(key)
64
- }
65
- export const recallState = <T>(
66
- state: Atom<T> | ReadonlySelector<T> | Selector<T>,
67
- store: Store = IMPLICIT.STORE,
68
- ): T => {
69
- const core = target(store)
70
- if (!core.operation.open) {
71
- store.config.logger?.warn(
72
- `recall called outside of an operation. This is probably a bug.`,
73
- )
74
- return core.valueMap.get(state.key)
75
- }
76
- return core.operation.prev.get(state.key)
77
- }
78
-
79
- export const cacheValue = (
80
- key: string,
81
- value: unknown,
82
- store: Store = IMPLICIT.STORE,
83
- ): void => {
84
- const core = target(store)
85
- core.valueMap.set(key, value)
86
- }
87
-
88
- export const evictCachedValue = (
89
- key: string,
90
- store: Store = IMPLICIT.STORE,
91
- ): void => {
92
- const core = target(store)
93
- core.valueMap.delete(key)
94
- }
95
- export const readCachedValue = <T>(
96
- key: string,
97
- store: Store = IMPLICIT.STORE,
98
- ): T => target(store).valueMap.get(key)
99
-
100
- export const isValueCached = (
101
- key: string,
102
- store: Store = IMPLICIT.STORE,
103
- ): boolean => target(store).valueMap.has(key)
104
-
105
- export const storeAtom = (
106
- atom: Atom<any>,
107
- store: Store = IMPLICIT.STORE,
108
- ): void => {
109
- const core = target(store)
110
- core.atoms.set(atom.key, atom)
111
- }
112
-
113
- export const storeSelector = (
114
- selector: Selector<any>,
115
- store: Store = IMPLICIT.STORE,
116
- ): void => {
117
- const core = target(store)
118
- core.selectors.set(selector.key, selector)
119
- }
120
-
121
- export const storeReadonlySelector = (
122
- selector: ReadonlySelector<any>,
123
- store: Store = IMPLICIT.STORE,
124
- ): void => {
125
- const core = target(store)
126
- core.readonlySelectors.set(selector.key, selector)
127
- }
128
-
129
- export const hasKeyBeenUsed = (
130
- key: string,
131
- store: Store = IMPLICIT.STORE,
132
- ): boolean => {
133
- const core = target(store)
134
- return (
135
- core.atoms.has(key) ||
136
- core.selectors.has(key) ||
137
- core.readonlySelectors.has(key)
138
- )
139
- }
@@ -1,66 +0,0 @@
1
- import { become } from "~/packages/anvl/src/function"
2
-
3
- import { Subject } from ".."
4
- import {
5
- type Store,
6
- type Selector,
7
- type StoreCore,
8
- registerSelector,
9
- selector__INTERNAL,
10
- } from ".."
11
- import type { FamilyMetadata, SelectorToken } from "../.."
12
- import type { SelectorOptions } from "../../selector"
13
- import { cacheValue, markDone } from "../operation"
14
-
15
- export const createReadWriteSelector = <T>(
16
- options: SelectorOptions<T>,
17
- family: FamilyMetadata | undefined,
18
- store: Store,
19
- core: StoreCore,
20
- ): SelectorToken<T> => {
21
- const subject = new Subject<{ newValue: T; oldValue: T }>()
22
-
23
- const { get, set } = registerSelector(options.key, store)
24
- const getSelf = () => {
25
- const value = options.get({ get })
26
- cacheValue(options.key, value, store)
27
- return value
28
- }
29
-
30
- const setSelf = (next: T | ((oldValue: T) => T)): void => {
31
- const oldValue = getSelf()
32
- store.config.logger?.info(
33
- ` <- "${options.key}" went (`,
34
- oldValue,
35
- `->`,
36
- next,
37
- `)`,
38
- )
39
- const newValue = become(next)(oldValue)
40
- cacheValue(options.key, newValue, store)
41
- markDone(options.key, store)
42
- if (store.transactionStatus.phase === `idle`) {
43
- subject.next({ newValue, oldValue })
44
- }
45
- options.set({ get, set }, newValue)
46
- }
47
- const mySelector: Selector<T> = {
48
- ...options,
49
- subject,
50
- install: (s: Store) => selector__INTERNAL(options, family, s),
51
- get: getSelf,
52
- set: setSelf,
53
- type: `selector`,
54
- ...(family && { family }),
55
- }
56
- core.selectors.set(options.key, mySelector)
57
- const initialValue = getSelf()
58
- store.config.logger?.info(` ✨ "${options.key}" =`, initialValue)
59
- const token: SelectorToken<T> = {
60
- key: options.key,
61
- type: `selector`,
62
- family,
63
- }
64
- store.subject.selectorCreation.next(token)
65
- return token
66
- }
@@ -1,46 +0,0 @@
1
- import { registerSelector } from "./register-selector"
2
- import { Subject } from ".."
3
- import type {
4
- FamilyMetadata,
5
- ReadonlySelectorOptions,
6
- ReadonlySelectorToken,
7
- Store,
8
- } from "../.."
9
- import { cacheValue } from "../operation"
10
- import { selector__INTERNAL, type ReadonlySelector } from "../selector-internal"
11
- import type { StoreCore } from "../store"
12
-
13
- export const createReadonlySelector = <T>(
14
- options: ReadonlySelectorOptions<T>,
15
- family: FamilyMetadata | undefined,
16
- store: Store,
17
- core: StoreCore,
18
- ): ReadonlySelectorToken<T> => {
19
- const subject = new Subject<{ newValue: T; oldValue: T }>()
20
-
21
- const { get } = registerSelector(options.key, store)
22
- const getSelf = () => {
23
- const value = options.get({ get })
24
- cacheValue(options.key, value, store)
25
- return value
26
- }
27
-
28
- const readonlySelector: ReadonlySelector<T> = {
29
- ...options,
30
- subject,
31
- install: (s: Store) => selector__INTERNAL(options, family, s),
32
- get: getSelf,
33
- type: `readonly_selector`,
34
- ...(family && { family }),
35
- }
36
- core.readonlySelectors.set(options.key, readonlySelector)
37
- const initialValue = getSelf()
38
- store.config.logger?.info(` ✨ "${options.key}" =`, initialValue)
39
- const token: ReadonlySelectorToken<T> = {
40
- key: options.key,
41
- type: `readonly_selector`,
42
- family,
43
- }
44
- store.subject.selectorCreation.next(token)
45
- return token
46
- }
@@ -1,4 +0,0 @@
1
- export * from "./lookup-selector-sources"
2
- export * from "./register-selector"
3
- export * from "./trace-selector-atoms"
4
- export * from "./update-selector-atoms"
@@ -1,16 +0,0 @@
1
- import type { Store } from ".."
2
- import { target, lookup } from ".."
3
- import type { AtomToken, ReadonlySelectorToken, SelectorToken } from "../.."
4
-
5
- export const lookupSelectorSources = (
6
- key: string,
7
- store: Store,
8
- ): (
9
- | AtomToken<unknown>
10
- | ReadonlySelectorToken<unknown>
11
- | SelectorToken<unknown>
12
- )[] =>
13
- target(store)
14
- .selectorGraph.getRelations(key)
15
- .filter(({ source }) => source !== key)
16
- .map(({ source }) => lookup(source, store))
@@ -1,57 +0,0 @@
1
- import { updateSelectorAtoms } from "./update-selector-atoms"
2
- import type { Transactors } from "../../transaction"
3
- import { getState__INTERNAL, withdraw } from "../get"
4
- import { setState__INTERNAL } from "../set"
5
- import type { Store } from "../store"
6
- import { IMPLICIT } from "../store"
7
- import { target } from "../transaction-internal"
8
-
9
- export const registerSelector = (
10
- selectorKey: string,
11
- store: Store = IMPLICIT.STORE,
12
- ): Transactors => ({
13
- get: (dependency) => {
14
- const core = target(store)
15
- const alreadyRegistered = core.selectorGraph
16
- .getRelations(selectorKey)
17
- .some(({ source }) => source === dependency.key)
18
-
19
- const dependencyState = withdraw(dependency, store)
20
- if (dependencyState === null) {
21
- throw new Error(
22
- `State "${dependency.key}" not found in this store. Did you forget to initialize with the "atom" or "selector" function?`,
23
- )
24
- }
25
- const dependencyValue = getState__INTERNAL(dependencyState, store)
26
-
27
- if (alreadyRegistered) {
28
- store.config.logger?.info(
29
- ` || ${selectorKey} <- ${dependency.key} =`,
30
- dependencyValue,
31
- )
32
- } else {
33
- store.config.logger?.info(
34
- `🔌 registerSelector "${selectorKey}" <- ( "${dependency.key}" =`,
35
- dependencyValue,
36
- `)`,
37
- )
38
- core.selectorGraph = core.selectorGraph.set(
39
- { from: dependency.key, to: selectorKey },
40
- {
41
- source: dependency.key,
42
- },
43
- )
44
- }
45
- updateSelectorAtoms(selectorKey, dependency, store)
46
- return dependencyValue
47
- },
48
- set: (stateToken, newValue) => {
49
- const state = withdraw(stateToken, store)
50
- if (state === null) {
51
- throw new Error(
52
- `State "${stateToken.key}" not found in this store. Did you forget to initialize with the "atom" or "selector" function?`,
53
- )
54
- }
55
- setState__INTERNAL(state, newValue, store)
56
- },
57
- })
@@ -1,43 +0,0 @@
1
- import { lookupSelectorSources } from "./lookup-selector-sources"
2
- import type { Store, AtomToken, ReadonlySelectorToken, StateToken } from "../.."
3
-
4
- export const traceSelectorAtoms = (
5
- selectorKey: string,
6
- dependency: ReadonlySelectorToken<unknown> | StateToken<unknown>,
7
- store: Store,
8
- ): AtomToken<unknown>[] => {
9
- const roots: AtomToken<unknown>[] = []
10
-
11
- const sources = lookupSelectorSources(dependency.key, store)
12
- let depth = 0
13
- while (sources.length > 0) {
14
- // rome-ignore lint/style/noNonNullAssertion: just checked length ^^^
15
- const source = sources.shift()!
16
- ++depth
17
- if (depth > 999) {
18
- throw new Error(
19
- `Maximum selector dependency depth exceeded in selector "${selectorKey}".`,
20
- )
21
- }
22
-
23
- if (source.type !== `atom`) {
24
- sources.push(...lookupSelectorSources(source.key, store))
25
- } else {
26
- roots.push(source)
27
- }
28
- }
29
-
30
- return roots
31
- }
32
-
33
- export const traceAllSelectorAtoms = (
34
- selectorKey: string,
35
- store: Store,
36
- ): AtomToken<unknown>[] => {
37
- const sources = lookupSelectorSources(selectorKey, store)
38
- return sources.flatMap((source) =>
39
- source.type === `atom`
40
- ? source
41
- : traceSelectorAtoms(selectorKey, source, store),
42
- )
43
- }
@@ -1,33 +0,0 @@
1
- import { traceSelectorAtoms } from "./trace-selector-atoms"
2
- import type { Store } from ".."
3
- import { target } from ".."
4
- import type { ReadonlySelectorToken, StateToken } from "../.."
5
-
6
- export const updateSelectorAtoms = (
7
- selectorKey: string,
8
- dependency: ReadonlySelectorToken<unknown> | StateToken<unknown>,
9
- store: Store,
10
- ): void => {
11
- const core = target(store)
12
- if (dependency.type === `atom`) {
13
- core.selectorAtoms = core.selectorAtoms.set({
14
- selectorKey,
15
- atomKey: dependency.key,
16
- })
17
- store.config.logger?.info(
18
- ` || adding root for "${selectorKey}": ${dependency.key}`,
19
- )
20
- return
21
- }
22
- const roots = traceSelectorAtoms(selectorKey, dependency, store)
23
- store.config.logger?.info(
24
- ` || adding roots for "${selectorKey}":`,
25
- roots.map((r) => r.key),
26
- )
27
- for (const root of roots) {
28
- core.selectorAtoms = core.selectorAtoms.set({
29
- selectorKey,
30
- atomKey: root.key,
31
- })
32
- }
33
- }
@@ -1,58 +0,0 @@
1
- import { target, IMPLICIT } from "."
2
- import type { Store, Subject } from "."
3
- import { createReadWriteSelector } from "./selector/create-read-write-selector"
4
- import { createReadonlySelector } from "./selector/create-readonly-selector"
5
- import type {
6
- FamilyMetadata,
7
- ReadonlySelectorOptions,
8
- ReadonlySelectorToken,
9
- SelectorOptions,
10
- SelectorToken,
11
- } from ".."
12
-
13
- export type Selector<T> = {
14
- key: string
15
- type: `selector`
16
- family?: FamilyMetadata
17
- install: (store: Store) => void
18
- subject: Subject<{ newValue: T; oldValue: T }>
19
- get: () => T
20
- set: (newValue: T | ((oldValue: T) => T)) => void
21
- }
22
- export type ReadonlySelector<T> = {
23
- key: string
24
- type: `readonly_selector`
25
- family?: FamilyMetadata
26
- install: (store: Store) => void
27
- subject: Subject<{ newValue: T; oldValue: T }>
28
- get: () => T
29
- }
30
-
31
- export function selector__INTERNAL<T>(
32
- options: SelectorOptions<T>,
33
- family?: FamilyMetadata,
34
- store?: Store,
35
- ): SelectorToken<T>
36
- export function selector__INTERNAL<T>(
37
- options: ReadonlySelectorOptions<T>,
38
- family?: FamilyMetadata,
39
- store?: Store,
40
- ): ReadonlySelectorToken<T>
41
- export function selector__INTERNAL<T>(
42
- options: ReadonlySelectorOptions<T> | SelectorOptions<T>,
43
- family?: FamilyMetadata,
44
- store: Store = IMPLICIT.STORE,
45
- ): ReadonlySelectorToken<T> | SelectorToken<T> {
46
- const core = target(store)
47
-
48
- if (core.selectors.has(options.key)) {
49
- store.config.logger?.error(
50
- `Key "${options.key}" already exists in the store.`,
51
- )
52
- }
53
-
54
- if (!(`set` in options)) {
55
- return createReadonlySelector(options, family, store, core)
56
- }
57
- return createReadWriteSelector(options, family, store, core)
58
- }