atom.io 0.15.3 → 0.15.5

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 (125) hide show
  1. package/data/dist/index.cjs +29 -16
  2. package/data/dist/index.cjs.map +1 -1
  3. package/data/dist/index.js +30 -17
  4. package/data/dist/index.js.map +1 -1
  5. package/data/src/join.ts +15 -2
  6. package/dist/index.cjs +32 -6
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.ts +153 -85
  9. package/dist/index.js +157 -1
  10. package/dist/index.js.map +1 -1
  11. package/internal/dist/index.cjs +98 -159
  12. package/internal/dist/index.cjs.map +1 -1
  13. package/internal/dist/index.d.ts +44 -32
  14. package/internal/dist/index.js +89 -105
  15. package/internal/dist/index.js.map +1 -1
  16. package/internal/src/atom/create-regular-atom.ts +1 -1
  17. package/internal/src/get-environment-data.ts +18 -0
  18. package/internal/src/index.ts +2 -0
  19. package/internal/src/ingest-updates/index.ts +3 -0
  20. package/internal/src/ingest-updates/ingest-atom-update.ts +14 -0
  21. package/internal/src/ingest-updates/ingest-selector-update.ts +17 -0
  22. package/internal/src/ingest-updates/ingest-transaction-update.ts +22 -0
  23. package/internal/src/mutable/tracker.ts +4 -4
  24. package/internal/src/not-found-error.ts +3 -8
  25. package/internal/src/operation.ts +4 -4
  26. package/internal/src/selector/create-read-write-selector.ts +6 -4
  27. package/internal/src/selector/create-readonly-selector.ts +3 -3
  28. package/internal/src/selector/register-selector.ts +6 -4
  29. package/internal/src/selector/update-selector-atoms.ts +2 -2
  30. package/internal/src/store/deposit.ts +5 -5
  31. package/internal/src/store/store.ts +4 -4
  32. package/internal/src/store/withdraw-new-family-member.ts +8 -11
  33. package/internal/src/store/withdraw.ts +11 -12
  34. package/internal/src/subscribe/subscribe-to-state.ts +2 -2
  35. package/internal/src/subscribe/subscribe-to-timeline.ts +4 -4
  36. package/internal/src/timeline/add-atom-to-timeline.ts +7 -7
  37. package/internal/src/timeline/create-timeline.ts +29 -21
  38. package/internal/src/timeline/time-travel.ts +19 -45
  39. package/internal/src/transaction/apply-transaction.ts +5 -51
  40. package/internal/src/transaction/build-transaction.ts +9 -2
  41. package/internal/src/transaction/create-transaction.ts +4 -4
  42. package/internal/src/transaction/index.ts +2 -2
  43. package/introspection/dist/index.cjs +9 -9
  44. package/introspection/dist/index.cjs.map +1 -1
  45. package/introspection/dist/index.d.ts +6 -6
  46. package/introspection/dist/index.js +9 -9
  47. package/introspection/dist/index.js.map +1 -1
  48. package/introspection/src/attach-atom-index.ts +4 -4
  49. package/introspection/src/attach-introspection-states.ts +2 -2
  50. package/introspection/src/attach-selector-index.ts +4 -4
  51. package/introspection/src/attach-timeline-family.ts +6 -6
  52. package/introspection/src/attach-timeline-index.ts +6 -4
  53. package/introspection/src/attach-transaction-index.ts +1 -1
  54. package/introspection/src/index.ts +1 -1
  55. package/package.json +11 -12
  56. package/react/dist/index.cjs.map +1 -1
  57. package/react/dist/index.d.ts +4 -4
  58. package/react/dist/index.js.map +1 -1
  59. package/react/src/store-hooks.ts +5 -5
  60. package/react-devtools/dist/index.cjs +7 -9
  61. package/react-devtools/dist/index.cjs.map +1 -1
  62. package/react-devtools/dist/index.d.ts +10 -265
  63. package/react-devtools/dist/index.js +7 -9
  64. package/react-devtools/dist/index.js.map +1 -1
  65. package/react-devtools/src/StateEditor.tsx +3 -3
  66. package/react-devtools/src/StateIndex.tsx +3 -3
  67. package/react-devtools/src/TimelineIndex.tsx +2 -2
  68. package/react-devtools/src/Updates.tsx +1 -1
  69. package/realtime-client/dist/index.cjs +68 -66
  70. package/realtime-client/dist/index.cjs.map +1 -1
  71. package/realtime-client/dist/index.d.ts +8 -7
  72. package/realtime-client/dist/index.js +63 -62
  73. package/realtime-client/dist/index.js.map +1 -1
  74. package/realtime-client/src/pull-family-member.ts +1 -1
  75. package/realtime-client/src/pull.ts +1 -1
  76. package/realtime-client/src/push.ts +2 -3
  77. package/realtime-client/src/realtime-state.ts +11 -3
  78. package/realtime-client/src/server-action.ts +65 -65
  79. package/realtime-react/dist/index.cjs +90 -56
  80. package/realtime-react/dist/index.cjs.map +1 -1
  81. package/realtime-react/dist/index.d.ts +11 -6
  82. package/realtime-react/dist/index.js +89 -55
  83. package/realtime-react/dist/index.js.map +1 -1
  84. package/realtime-react/src/on-mount.ts +23 -0
  85. package/realtime-react/src/realtime-context.tsx +14 -6
  86. package/realtime-react/src/use-pull-family-member.ts +5 -8
  87. package/realtime-react/src/use-pull-mutable-family-member.ts +4 -7
  88. package/realtime-react/src/use-pull-mutable.ts +4 -7
  89. package/realtime-react/src/use-pull.ts +5 -8
  90. package/realtime-react/src/use-push.ts +5 -9
  91. package/realtime-react/src/use-realtime-service.ts +30 -0
  92. package/realtime-react/src/use-server-action.ts +8 -8
  93. package/realtime-server/dist/index.cjs +109 -40
  94. package/realtime-server/dist/index.cjs.map +1 -1
  95. package/realtime-server/dist/index.d.ts +7 -6
  96. package/realtime-server/dist/index.js +90 -39
  97. package/realtime-server/dist/index.js.map +1 -1
  98. package/realtime-server/src/hook-composition/expose-family.ts +2 -2
  99. package/realtime-server/src/hook-composition/expose-mutable-family.ts +1 -1
  100. package/realtime-server/src/hook-composition/expose-single.ts +1 -1
  101. package/realtime-server/src/hook-composition/index.ts +2 -1
  102. package/realtime-server/src/hook-composition/receive-state.ts +2 -2
  103. package/realtime-server/src/hook-composition/receive-transaction.ts +13 -32
  104. package/realtime-server/src/hook-composition/sync-transaction.ts +92 -0
  105. package/realtime-testing/dist/index.cjs +3 -3
  106. package/realtime-testing/dist/index.cjs.map +1 -1
  107. package/realtime-testing/dist/index.js +2 -2
  108. package/realtime-testing/dist/index.js.map +1 -1
  109. package/realtime-testing/src/setup-realtime-test.tsx +4 -3
  110. package/src/atom.ts +30 -7
  111. package/src/dispose.ts +2 -2
  112. package/src/find-state.ts +64 -0
  113. package/src/get-state.ts +2 -2
  114. package/src/index.ts +23 -0
  115. package/src/logger.ts +1 -0
  116. package/src/selector.ts +16 -0
  117. package/src/set-state.ts +2 -2
  118. package/src/silo.ts +2 -2
  119. package/src/subscribe.ts +7 -11
  120. package/src/timeline.ts +20 -12
  121. package/src/transaction.ts +31 -12
  122. package/src/validators.ts +74 -0
  123. package/dist/chunk-K22LR3V6.js +0 -138
  124. package/dist/chunk-K22LR3V6.js.map +0 -1
  125. package/internal/src/set-state/copy-mutable-into-new-store.ts +0 -34
package/dist/index.js CHANGED
@@ -1,4 +1,160 @@
1
- export { AtomIOLogger, LOG_LEVELS, Silo, atom, atomFamily, dispose, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, timeline, transaction, undo } from './chunk-K22LR3V6.js';
2
1
  import './chunk-PZLG2HP3.js';
2
+ import * as Internal3 from 'atom.io/internal';
3
+ import { createAtom, IMPLICIT, createAtomFamily, createSelector, createSelectorFamily, Store, createTransaction, createTimeline, timeTravel, subscribeToTimeline, subscribeToTransaction, subscribeToState, withdraw } from 'atom.io/internal';
4
+
5
+ function atom(options) {
6
+ return createAtom(options, void 0, IMPLICIT.STORE);
7
+ }
8
+ function atomFamily(options) {
9
+ return createAtomFamily(options, IMPLICIT.STORE);
10
+ }
11
+ function dispose(token, store = Internal3.IMPLICIT.STORE) {
12
+ switch (token.type) {
13
+ case `atom`:
14
+ Internal3.deleteAtom(token, store);
15
+ break;
16
+ case `selector`:
17
+ case `readonly_selector`:
18
+ Internal3.deleteSelector(token, store);
19
+ break;
20
+ }
21
+ }
22
+ function findInStore(token, key, store) {
23
+ const familyKey = token.key;
24
+ const family = store.families.get(familyKey);
25
+ if (family === void 0) {
26
+ throw new Error(`Family ${familyKey} not found`);
27
+ }
28
+ const state = family(key);
29
+ return state;
30
+ }
31
+ function findState(token, key) {
32
+ const state = findInStore(token, key, IMPLICIT.STORE);
33
+ return state;
34
+ }
35
+ function getState(token, store = Internal3.IMPLICIT.STORE) {
36
+ var _a;
37
+ const state = (_a = Internal3.withdraw(token, store)) != null ? _a : Internal3.withdrawNewFamilyMember(token, store);
38
+ if (state === void 0) {
39
+ throw new Internal3.NotFoundError(token, store);
40
+ }
41
+ return Internal3.readOrComputeValue(state, store);
42
+ }
43
+
44
+ // src/logger.ts
45
+ var LOG_LEVELS = [`info`, `warn`, `error`];
46
+ var simpleLog = (logLevel) => (icon, tokenType, tokenKey, message, ...rest) => {
47
+ console[logLevel](`${icon} ${tokenType} "${tokenKey}" ${message}`, ...rest);
48
+ };
49
+ var simpleLogger = {
50
+ error: simpleLog(`error`),
51
+ info: simpleLog(`info`),
52
+ warn: simpleLog(`warn`)
53
+ };
54
+ var AtomIOLogger = class {
55
+ constructor(logLevel, filter, logger = simpleLogger) {
56
+ this.logLevel = logLevel;
57
+ this.filter = filter;
58
+ this.logger = logger;
59
+ this.error = (...args) => {
60
+ var _a, _b;
61
+ if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel !== null) {
62
+ this.logger.error(...args);
63
+ }
64
+ };
65
+ this.info = (...args) => {
66
+ var _a, _b;
67
+ if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel === `info`) {
68
+ this.logger.info(...args);
69
+ }
70
+ };
71
+ this.warn = (...args) => {
72
+ var _a, _b;
73
+ if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel !== `error` && this.logLevel !== null) {
74
+ this.logger.warn(...args);
75
+ }
76
+ };
77
+ }
78
+ };
79
+ function selector(options) {
80
+ return createSelector(options, void 0, IMPLICIT.STORE);
81
+ }
82
+ function selectorFamily(options) {
83
+ return createSelectorFamily(options, IMPLICIT.STORE);
84
+ }
85
+ function setState(token, value, store = Internal3.IMPLICIT.STORE) {
86
+ var _a;
87
+ const rejection = Internal3.openOperation(token, store);
88
+ if (rejection) {
89
+ return;
90
+ }
91
+ const state = (_a = Internal3.withdraw(token, store)) != null ? _a : Internal3.withdrawNewFamilyMember(token, store);
92
+ if (state === void 0) {
93
+ throw new Internal3.NotFoundError(token, store);
94
+ }
95
+ Internal3.setAtomOrSelector(state, value, store);
96
+ Internal3.closeOperation(store);
97
+ }
98
+ var Silo = class {
99
+ constructor(name, fromStore = null) {
100
+ const s = new Store(name, fromStore);
101
+ this.store = s;
102
+ this.atom = (options) => createAtom(options, void 0, s);
103
+ this.atomFamily = (options) => createAtomFamily(options, s);
104
+ this.selector = (options) => createSelector(options, void 0, s);
105
+ this.selectorFamily = (options) => createSelectorFamily(options, s);
106
+ this.transaction = (options) => createTransaction(options, s);
107
+ this.timeline = (options) => createTimeline(options, s);
108
+ this.getState = (token) => getState(token, s);
109
+ this.setState = (token, newValue) => setState(token, newValue, s);
110
+ this.subscribe = (token, handler, key) => subscribe(token, handler, key, s);
111
+ this.undo = (token) => timeTravel(`undo`, token, s);
112
+ this.redo = (token) => timeTravel(`redo`, token, s);
113
+ }
114
+ };
115
+ function subscribe(token, handleUpdate, key = Math.random().toString(36).slice(2), store = IMPLICIT.STORE) {
116
+ switch (token.type) {
117
+ case `atom`:
118
+ case `readonly_selector`:
119
+ case `selector`:
120
+ return subscribeToState(token, handleUpdate, key, store);
121
+ case `transaction`:
122
+ return subscribeToTransaction(token, handleUpdate, key, store);
123
+ case `timeline`:
124
+ return subscribeToTimeline(token, handleUpdate, key, store);
125
+ }
126
+ }
127
+ var timeline = (options) => {
128
+ return createTimeline(options, IMPLICIT.STORE);
129
+ };
130
+ var redo = (timeline2) => {
131
+ timeTravel(`redo`, timeline2, IMPLICIT.STORE);
132
+ };
133
+ var undo = (timeline2) => {
134
+ timeTravel(`undo`, timeline2, IMPLICIT.STORE);
135
+ };
136
+ function transaction(options) {
137
+ return createTransaction(options, IMPLICIT.STORE);
138
+ }
139
+ var runTransaction = (token, store = IMPLICIT.STORE, id) => (...parameters) => {
140
+ const tx = withdraw(token, store);
141
+ if (tx) {
142
+ return tx.run(parameters, id);
143
+ }
144
+ throw new Error(
145
+ `Cannot run transaction "${token.key}": transaction not found in store "${store.config.name}".`
146
+ );
147
+ };
148
+
149
+ // src/validators.ts
150
+ function isToken(knownToken, unknownToken) {
151
+ return knownToken.key === unknownToken.key;
152
+ }
153
+ function belongsTo(family, unknownToken) {
154
+ var _a;
155
+ return family.key === ((_a = unknownToken.family) == null ? void 0 : _a.key);
156
+ }
157
+
158
+ export { AtomIOLogger, LOG_LEVELS, Silo, atom, atomFamily, belongsTo, dispose, findInStore, findState, getState, isToken, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, timeline, transaction, undo };
3
159
  //# sourceMappingURL=out.js.map
4
160
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":""}
1
+ {"version":3,"sources":["../src/atom.ts","../src/dispose.ts","../src/find-state.ts","../src/get-state.ts","../src/logger.ts","../src/selector.ts","../src/set-state.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts","../src/validators.ts"],"names":["IMPLICIT","Internal","createAtom","createAtomFamily","createSelector","createSelectorFamily","createTimeline","timeTravel","timeline","createTransaction","withdraw"],"mappings":"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","sourcesContent":["import type { Store, Subject, Transceiver } from \"atom.io/internal\"\nimport { IMPLICIT, createAtom, createAtomFamily } from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken } from \".\"\n\nexport type Effectors<T> = {\n\tsetSelf: <V extends T>(next: V | ((oldValue: T) => V)) => void\n\tonSet: (callback: (options: { newValue: T; oldValue: T }) => void) => void\n}\n\nexport type AtomEffect<T> = (tools: Effectors<T>) => (() => void) | void\n\nexport type AtomOptions<T> = {\n\tkey: string\n\tdefault: T | (() => T)\n\teffects?: AtomEffect<T>[]\n}\n// biome-ignore format: complex intersection\nexport type MutableAtomOptions<T extends Transceiver<any>, J extends Json.Serializable> = \n\t& JsonInterface<T, J>\n\t& Omit<AtomOptions<T>, `default`> \n\t& { \n\t\t\tdefault: ()\t=> T\n\t\t\tmutable: true\n\t\t}\n\nexport function atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\toptions: MutableAtomOptions<T, J>,\n): MutableAtomToken<T, J>\nexport function atom<T>(options: AtomOptions<T>): AtomToken<T>\nexport function atom(\n\toptions: AtomOptions<any> | MutableAtomOptions<any, any>,\n): AtomToken<any> {\n\treturn createAtom(options, undefined, IMPLICIT.STORE)\n}\n\nexport type AtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> = ((\n\tkey: K,\n) => AtomToken<T>) & {\n\tkey: string\n\ttype: `atom_family`\n\tsubject: Subject<AtomToken<T>>\n\tmutable?: boolean\n\tinstall: (store: Store) => void\n\t__T?: T\n\t__K?: K\n}\nexport type AtomFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `atom_family`\n\t__T?: T\n\t__K?: K\n}\n\n// biome-ignore format: intersection\nexport type MutableAtomFamilyOptions<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& AtomFamilyOptions<T, K>\n\t& JsonInterface<T, J>\n\t& { mutable: true }\n\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& JsonInterface<T, J>\n\t& ((key: K) => MutableAtomToken<T, J>) \n\t& {\n\t\t\tkey: string\n\t\t\ttype: `atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<T, J>>\n\t\t\tmutable: true\n\t\t\tinstall: (store: Store) => void\n\t\t\t__T?: T\n\t\t\t__J?: J\n\t\t\t__K?: K\n\t\t}\nexport type MutableAtomFamilyToken<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = {\n\tkey: string\n\ttype: `atom_family`\n\tmutable: true\n\t__T?: T\n\t__J?: J\n\t__K?: K\n}\n\nexport function atomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n>(options: MutableAtomFamilyOptions<T, J, K>): MutableAtomFamily<T, J, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K>,\n): AtomFamily<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K> | MutableAtomFamilyOptions<any, any, any>,\n): AtomFamily<T, K> | MutableAtomFamily<any, any, any> {\n\treturn createAtomFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadableToken } from \".\"\n\nexport function dispose(\n\ttoken: ReadableToken<any>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\t\tInternal.deleteAtom(token, store)\n\t\t\tbreak\n\t\tcase `selector`:\n\t\tcase `readonly_selector`:\n\t\t\tInternal.deleteSelector(token, store)\n\t\t\tbreak\n\t}\n}\n","import type {\n\tAtomFamilyToken,\n\tAtomToken,\n\tMutableAtomFamilyToken,\n\tMutableAtomToken,\n\tReadableFamilyToken,\n\tReadableToken,\n\tReadonlySelectorFamilyToken,\n\tReadonlySelectorToken,\n\tSelectorFamilyToken,\n\tSelectorToken,\n\tWritableFamilyToken,\n\tWritableToken,\n} from \"atom.io\"\nimport type { Store, Transceiver } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport function findInStore(\n\ttoken: ReadableFamilyToken<any, any>,\n\tkey: Json.Serializable,\n\tstore: Store,\n): ReadableToken<any> {\n\tconst familyKey = token.key\n\tconst family = store.families.get(familyKey)\n\tif (family === undefined) {\n\t\tthrow new Error(`Family ${familyKey} not found`)\n\t}\n\tconst state = family(key)\n\treturn state\n}\n\nexport function findState<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n>(token: MutableAtomFamilyToken<T, J, K>, key: K): MutableAtomToken<T, J>\nexport function findState<T, K extends Json.Serializable>(\n\ttoken: AtomFamilyToken<T, K>,\n\tkey: K,\n): AtomToken<T>\nexport function findState<T, K extends Json.Serializable>(\n\ttoken: SelectorFamilyToken<T, K>,\n\tkey: K,\n): SelectorToken<T>\nexport function findState<T, K extends Json.Serializable>(\n\ttoken: ReadonlySelectorFamilyToken<T, K>,\n\tkey: K,\n): ReadonlySelectorToken<T>\nexport function findState<T, K extends Json.Serializable>(\n\ttoken: WritableFamilyToken<T, K>,\n\tkey: K,\n): WritableToken<T>\nexport function findState<T, K extends Json.Serializable>(\n\ttoken: ReadableFamilyToken<T, K>,\n\tkey: K,\n): ReadableToken<T>\nexport function findState(\n\ttoken: ReadableFamilyToken<any, any>,\n\tkey: Json.Serializable,\n): ReadableToken<any> {\n\tconst state = findInStore(token, key, IMPLICIT.STORE)\n\treturn state\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { ReadableToken } from \".\"\n\nexport function getState<T>(\n\ttoken: ReadableToken<T>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): T {\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Internal.NotFoundError(token, store)\n\t}\n\treturn Internal.readOrComputeValue(state, store)\n}\n","const LoggerIconDictionary = {\n\t\"⌛\": `Timeline event fully captured`,\n\t\"⏩\": `Timeline redo`,\n\t\"⏪\": `Timeline undo`,\n\t\"⏭️\": `Transaction redo`,\n\t\"⏮️\": `Transaction undo`,\n\t\"⏳\": `Timeline event partially captured`,\n\t\"⏹️\": `Time-travel complete`,\n\t\"💁\": `Notice`,\n\t\"🔄\": `Realtime transaction synchronized`,\n\t\"✅\": `Realtime transaction success`,\n\t\"✨\": `Computation complete`,\n\t\"❌\": `Conflict prevents attempted action`,\n\t\"⭕\": `Operation start`,\n\t\"🐞\": `Possible bug in AtomIO`,\n\t\"👀\": `Subscription added`,\n\t\"👪\": `Family member added`,\n\t\"📁\": `Stow update`,\n\t\"📃\": `Copy mutable`,\n\t\"📖\": `Read state`,\n\t\"📝\": `Write state`,\n\t\"📢\": `Notify subscribers`,\n\t\"🔌\": `Register dependency`,\n\t\"🔍\": `Discover root`,\n\t\"🔥\": `Delete state`,\n\t\"🔧\": `Create mutable atom`,\n\t\"🔨\": `Create immutable atom`,\n\t\"🔴\": `Operation complete`,\n\t\"🗑\": `Evict cached value`,\n\t\"💥\": `Caught`,\n\t\"🙈\": `Subscription canceled`,\n\t\"🛄\": `Apply transaction`,\n\t\"🛠️\": `Install atom into store`,\n\t\"🛫\": `Begin transaction`,\n\t\"🛬\": `Complete transaction`,\n\t\"🧮\": `Computing selector`,\n\t\"🧹\": `Prepare to evict`,\n\t\"🪂\": `Abort transaction`,\n\t\"🚀\": `Performance measure`,\n} as const\nexport type LoggerIcon = keyof typeof LoggerIconDictionary\n\nexport const LOG_LEVELS = [`info`, `warn`, `error`] as const\nexport type LogLevel = (typeof LOG_LEVELS)[number]\n\nexport type LogFn = (\n\ticon: LoggerIcon,\n\ttokenType:\n\t\t| `atom`\n\t\t| `readonly_selector`\n\t\t| `selector`\n\t\t| `state`\n\t\t| `timeline`\n\t\t| `transaction`\n\t\t| `unknown`,\n\ttokenKey: string,\n\tmessage: string,\n\t...rest: unknown[]\n) => void\nexport type LogFilter = (...params: Parameters<LogFn>) => boolean\n\nexport type Logger = Record<LogLevel, LogFn>\n\nexport const simpleLog =\n\t(logLevel: keyof Logger): LogFn =>\n\t(icon, tokenType, tokenKey, message, ...rest) => {\n\t\tconsole[logLevel](`${icon} ${tokenType} \"${tokenKey}\" ${message}`, ...rest)\n\t}\nexport const simpleLogger: Logger = {\n\terror: simpleLog(`error`),\n\tinfo: simpleLog(`info`),\n\twarn: simpleLog(`warn`),\n}\n\nexport class AtomIOLogger implements Logger {\n\tpublic constructor(\n\t\tpublic logLevel: `error` | `info` | `warn` | null,\n\t\tprivate readonly filter?: LogFilter,\n\t\tprivate readonly logger: Logger = simpleLogger,\n\t) {}\n\n\tpublic error: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel !== null) {\n\t\t\tthis.logger.error(...args)\n\t\t}\n\t}\n\tpublic info: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel === `info`) {\n\t\t\tthis.logger.info(...args)\n\t\t}\n\t}\n\tpublic warn: LogFn = (...args) => {\n\t\tif (\n\t\t\t(this.filter?.(...args) ?? true) &&\n\t\t\tthis.logLevel !== `error` &&\n\t\t\tthis.logLevel !== null\n\t\t) {\n\t\t\tthis.logger.warn(...args)\n\t\t}\n\t}\n}\n","import type { Store, Subject } from \"atom.io/internal\"\nimport { IMPLICIT, createSelector, createSelectorFamily } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, SelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type SelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n\tset: Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n}\n\nexport function selector<T>(options: SelectorOptions<T>): SelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | SelectorOptions<T>,\n): ReadonlySelectorToken<T> | SelectorToken<T> {\n\treturn createSelector(options, undefined, IMPLICIT.STORE)\n}\n\nexport type SelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n\tset: (key: K) => Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n}\n\nexport type SelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => SelectorToken<T>) & {\n\tkey: string\n\ttype: `selector_family`\n\tsubject: Subject<SelectorToken<T>>\n\tinstall: (store: Store) => void\n\t__T?: T\n\t__K?: K\n}\nexport type SelectorFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `selector_family`\n\t__T?: T\n\t__K?: K\n}\n\nexport type ReadonlySelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => ReadonlySelectorToken<T>) & {\n\tkey: string\n\ttype: `readonly_selector_family`\n\tsubject: Subject<ReadonlySelectorToken<T>>\n\tinstall: (store: Store) => void\n\t__T?: T\n\t__K?: K\n}\nexport type ReadonlySelectorFamilyToken<T, K extends Json.Serializable> = {\n\tkey: string\n\ttype: `readonly_selector_family`\n\t__T?: T\n\t__K?: K\n}\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: SelectorFamilyOptions<T, K>,\n): SelectorFamily<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K> | SelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K> | SelectorFamily<T, K> {\n\treturn createSelectorFamily(options, IMPLICIT.STORE)\n}\n","import * as Internal from \"atom.io/internal\"\n\nimport type { WritableToken } from \".\"\n\nexport function setState<T, New extends T>(\n\ttoken: WritableToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void {\n\tconst rejection = Internal.openOperation(token, store)\n\tif (rejection) {\n\t\treturn\n\t}\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new Internal.NotFoundError(token, store)\n\t}\n\tInternal.setAtomOrSelector(state, value, store)\n\tInternal.closeOperation(store)\n}\n","import {\n\tStore,\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateSelector,\n\tcreateSelectorFamily,\n\tcreateTimeline,\n\tcreateTransaction,\n\ttimeTravel,\n} from \"atom.io/internal\"\n\nimport type { redo, timeline, undo } from \".\"\nimport { getState, setState, subscribe } from \".\"\nimport type { atom, atomFamily } from \"./atom\"\nimport type { selector, selectorFamily } from \"./selector\"\nimport type { transaction } from \"./transaction\"\n\nexport class Silo {\n\tpublic store: Store\n\tpublic atom: typeof atom\n\tpublic atomFamily: typeof atomFamily\n\tpublic selector: typeof selector\n\tpublic selectorFamily: typeof selectorFamily\n\tpublic transaction: typeof transaction\n\tpublic timeline: typeof timeline\n\tpublic getState: typeof getState\n\tpublic setState: typeof setState\n\tpublic subscribe: typeof subscribe\n\tpublic undo: typeof undo\n\tpublic redo: typeof redo\n\tpublic constructor(name: string, fromStore: Store | null = null) {\n\t\tconst s = new Store(name, fromStore)\n\t\tthis.store = s\n\t\tthis.atom = (options) => createAtom(options, undefined, s)\n\t\tthis.atomFamily = (options) => createAtomFamily(options, s)\n\t\tthis.selector = (options) => createSelector(options, undefined, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => createTransaction(options, s)\n\t\tthis.timeline = (options) => createTimeline(options, s)\n\t\tthis.getState = (token) => getState(token, s)\n\t\tthis.setState = (token, newValue) => setState(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => timeTravel(`undo`, token, s)\n\t\tthis.redo = (token) => timeTravel(`redo`, token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tsubscribeToState,\n\tsubscribeToTimeline,\n\tsubscribeToTransaction,\n} from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadableToken,\n\tTimelineManageable,\n\tTimelineToken,\n\tTimelineUpdate,\n\tTransactionToken,\n\tTransactionUpdate,\n\tƒn,\n} from \".\"\n\nexport type StateUpdate<T> = { newValue: T; oldValue: T }\nexport type KeyedStateUpdate<T> = StateUpdate<T> & {\n\tkey: string\n\tfamily?: FamilyMetadata\n}\nexport type UpdateHandler<T> = (update: StateUpdate<T>) => void\n\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport function subscribe<T>(\n\ttoken: ReadableToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe<M extends TimelineManageable>(\n\ttoken: TimelineToken<M>,\n\thandleUpdate: (update: TimelineUpdate<M> | `redo` | `undo`) => void,\n\tkey?: string,\n\tstore?: Store,\n): () => void\nexport function subscribe(\n\ttoken: ReadableToken<any> | TimelineToken<any> | TransactionToken<any>,\n\thandleUpdate: (update: any) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): () => void {\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\tcase `readonly_selector`:\n\t\tcase `selector`:\n\t\t\treturn subscribeToState(token, handleUpdate, key, store)\n\t\tcase `transaction`:\n\t\t\treturn subscribeToTransaction(token, handleUpdate, key, store)\n\t\tcase `timeline`:\n\t\t\treturn subscribeToTimeline(token, handleUpdate, key, store)\n\t}\n}\n","import type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport { IMPLICIT, createTimeline, timeTravel } from \"atom.io/internal\"\n\nimport type { AtomFamily, AtomToken } from \".\"\n\nexport type TimelineManageable = AtomFamily<any, any> | AtomToken<any>\n\nexport type TimelineToken<_> = {\n\tkey: string\n\ttype: `timeline`\n\t__brand?: _\n}\n\nexport type TimelineOptions<ManagedAtom extends TimelineManageable> = {\n\tkey: string\n\tatoms: ManagedAtom[]\n\tshouldCapture?: (\n\t\tupdate: TimelineUpdate<ManagedAtom>,\n\t\ttimeline: Timeline<TimelineManageable>,\n\t) => boolean\n}\n\nexport type TimelineUpdate<ManagedAtom extends TimelineManageable> =\n\t| TimelineAtomUpdate<ManagedAtom>\n\t| TimelineSelectorUpdate<ManagedAtom>\n\t| TimelineTransactionUpdate\n\nexport const timeline = <ManagedAtom extends TimelineManageable>(\n\toptions: TimelineOptions<ManagedAtom>,\n): TimelineToken<ManagedAtom> => {\n\treturn createTimeline(options, IMPLICIT.STORE)\n}\n\nexport const redo = (timeline: TimelineToken<any>): void => {\n\ttimeTravel(`redo`, timeline, IMPLICIT.STORE)\n}\n\nexport const undo = (timeline: TimelineToken<any>): void => {\n\ttimeTravel(`undo`, timeline, IMPLICIT.STORE)\n}\n","import type { EnvironmentData, Store } from \"atom.io/internal\"\nimport { IMPLICIT, createTransaction, withdraw } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type {\n\tKeyedStateUpdate,\n\tReadonlySelectorToken,\n\tWritableToken,\n\tfindState,\n\tƒn,\n} from \".\"\n\nexport type TransactionToken<_> = {\n\tkey: string\n\ttype: `transaction`\n\t__brand?: _\n}\n\nexport type TransactionUpdateContent =\n\t| KeyedStateUpdate<unknown>\n\t| TransactionUpdate<ƒn>\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tid: string\n\tupdates: TransactionUpdateContent[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | WritableToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: WritableToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\tfind: typeof findState\n}>\nexport type TransactorsWithRunAndEnv = Readonly<{\n\tget: <S>(state: ReadonlySelectorToken<S> | WritableToken<S>) => S\n\tset: <S, New extends S>(\n\t\tstate: WritableToken<S>,\n\t\tnewValue: New | ((oldValue: S) => New),\n\t) => void\n\tfind: typeof findState\n\trun: typeof runTransaction\n\tenv: () => EnvironmentData\n}>\nexport type ReadonlyTransactors = Pick<Transactors, `find` | `get`>\n\nexport type Read<ƒ extends ƒn> = (\n\ttransactors: ReadonlyTransactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Write<ƒ extends ƒn> = (\n\ttransactors: Transactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Transact<ƒ extends ƒn> = (\n\ttransactors: TransactorsWithRunAndEnv,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Transact<ƒ>\n}\n\nexport type TransactionIO<Token extends TransactionToken<any>> =\n\tToken extends TransactionToken<infer ƒ> ? ƒ : never\n\nexport function transaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n): TransactionToken<ƒ> {\n\treturn createTransaction(options, IMPLICIT.STORE)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(\n\t\ttoken: TransactionToken<ƒ>,\n\t\tstore: Store = IMPLICIT.STORE,\n\t\tid?: string,\n\t) =>\n\t(...parameters: Parameters<ƒ>): ReturnType<ƒ> => {\n\t\tconst tx = withdraw(token, store)\n\t\tif (tx) {\n\t\t\treturn tx.run(parameters, id)\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Cannot run transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n","import type {\n\tAtomFamily,\n\tAtomToken,\n\tReadableFamily,\n\tReadableToken,\n\tReadonlySelectorFamily,\n\tReadonlySelectorToken,\n\tSelectorFamily,\n\tSelectorToken,\n\tWritableFamily,\n\tWritableToken,\n} from \"atom.io\"\n\nexport type TokenType<\n\tComparison extends ReadableFamily<any, any> | ReadableToken<any>,\n> = Comparison extends ReadableToken<infer RepresentedValue>\n\t? RepresentedValue\n\t: Comparison extends ReadableFamily<infer RepresentedValue, any>\n\t ? RepresentedValue\n\t : never\n\nexport function isToken<KnownToken extends AtomToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is AtomToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends SelectorToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is SelectorToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadonlySelectorToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is ReadonlySelectorToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends WritableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is WritableToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends WritableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is ReadableToken<TokenType<KnownToken>>\nexport function isToken<KnownToken extends ReadableToken<any>>(\n\tknownToken: KnownToken,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is ReadableToken<TokenType<KnownToken>> {\n\treturn knownToken.key === unknownToken.key\n}\n\nexport function belongsTo<Family extends AtomFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is AtomToken<TokenType<Family>>\nexport function belongsTo<Family extends SelectorFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is SelectorToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadonlySelectorFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is ReadonlySelectorToken<TokenType<Family>>\nexport function belongsTo<Family extends WritableFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is WritableToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadableFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is ReadableToken<TokenType<Family>>\nexport function belongsTo<Family extends ReadableFamily<any, any>>(\n\tfamily: Family,\n\tunknownToken: ReadableToken<unknown>,\n): unknownToken is ReadableToken<TokenType<Family>> {\n\treturn family.key === unknownToken.family?.key\n}\n"]}