cross-state 0.53.3 → 0.54.0

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 (236) hide show
  1. package/dist/chunk-CUT6urMc.cjs +30 -0
  2. package/dist/diff-BQ8bB3Wk.d.cts +22 -0
  3. package/dist/diff-gZezL04N.d.ts +22 -0
  4. package/dist/extendedJson-BZkQBXEv.js +29 -0
  5. package/dist/extendedJson-BZkQBXEv.js.map +1 -0
  6. package/dist/extendedJson-Dn2F7Edo.cjs +53 -0
  7. package/dist/extendedJson-Dn2F7Edo.cjs.map +1 -0
  8. package/dist/hash-BV06P7va.js +19 -0
  9. package/dist/hash-BV06P7va.js.map +1 -0
  10. package/dist/hash-CJPl7SRj.cjs +30 -0
  11. package/dist/hash-CJPl7SRj.cjs.map +1 -0
  12. package/dist/index.cjs +49 -0
  13. package/dist/index.cjs.map +1 -0
  14. package/dist/index.d.cts +59 -0
  15. package/dist/index.d.ts +59 -0
  16. package/dist/index.js +20 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/mutative/index.cjs +3 -0
  19. package/dist/mutative/index.d.cts +3 -0
  20. package/dist/mutative/index.d.ts +3 -0
  21. package/dist/mutative/index.js +3 -0
  22. package/dist/mutative/register.cjs +10 -0
  23. package/dist/mutative/register.cjs.map +1 -0
  24. package/dist/mutative/register.d.cts +11 -0
  25. package/dist/mutative/register.d.ts +9 -0
  26. package/dist/mutative/register.js +10 -0
  27. package/dist/mutative/register.js.map +1 -0
  28. package/dist/mutativeMethods-6QzygG3W.d.cts +13 -0
  29. package/dist/mutativeMethods-Br3xN2Iq.d.ts +13 -0
  30. package/dist/mutativeMethods-CZKeRIDL.js +27 -0
  31. package/dist/mutativeMethods-CZKeRIDL.js.map +1 -0
  32. package/dist/mutativeMethods-CgXk_bMt.cjs +33 -0
  33. package/dist/mutativeMethods-CgXk_bMt.cjs.map +1 -0
  34. package/dist/patchMethods-C3L7Kh8T.d.cts +48 -0
  35. package/dist/patchMethods-D5YJwcpn.cjs +264 -0
  36. package/dist/patchMethods-D5YJwcpn.cjs.map +1 -0
  37. package/dist/patchMethods-DRPfkhAe.js +241 -0
  38. package/dist/patchMethods-DRPfkhAe.js.map +1 -0
  39. package/dist/patchMethods-Dxad6HF6.d.ts +48 -0
  40. package/dist/patches/index.cjs +5 -0
  41. package/dist/patches/index.d.cts +4 -0
  42. package/dist/patches/index.d.ts +4 -0
  43. package/dist/patches/index.js +5 -0
  44. package/dist/patches/register.cjs +11 -0
  45. package/dist/patches/register.cjs.map +1 -0
  46. package/dist/patches/register.d.cts +12 -0
  47. package/dist/patches/register.d.ts +10 -0
  48. package/dist/patches/register.js +11 -0
  49. package/dist/patches/register.js.map +1 -0
  50. package/dist/persist/register.cjs +13 -0
  51. package/dist/persist/register.cjs.map +1 -0
  52. package/dist/persist/register.d.cts +15 -0
  53. package/dist/persist/register.d.ts +13 -0
  54. package/dist/persist/register.js +13 -0
  55. package/dist/persist/register.js.map +1 -0
  56. package/dist/persist-BluRVcW6.js +258 -0
  57. package/dist/persist-BluRVcW6.js.map +1 -0
  58. package/dist/persist-CPjpg6D0.d.ts +61 -0
  59. package/dist/persist-CztClydq.cjs +263 -0
  60. package/dist/persist-CztClydq.cjs.map +1 -0
  61. package/dist/persist-D7MAsyyW.d.cts +61 -0
  62. package/dist/propAccess-ByqBjC19.cjs +173 -0
  63. package/dist/propAccess-ByqBjC19.cjs.map +1 -0
  64. package/dist/propAccess-DGchzVfy.js +113 -0
  65. package/dist/propAccess-DGchzVfy.js.map +1 -0
  66. package/dist/react/index.cjs +610 -0
  67. package/dist/react/index.cjs.map +1 -0
  68. package/dist/react/index.d.cts +305 -0
  69. package/dist/react/index.d.ts +305 -0
  70. package/dist/react/index.js +590 -0
  71. package/dist/react/index.js.map +1 -0
  72. package/dist/react/register.cjs +16 -0
  73. package/dist/react/register.cjs.map +1 -0
  74. package/dist/react/register.d.cts +16 -0
  75. package/dist/react/register.d.ts +14 -0
  76. package/dist/react/register.js +16 -0
  77. package/dist/react/register.js.map +1 -0
  78. package/dist/scope-DI1OFHcr.d.ts +167 -0
  79. package/dist/scope-DO5vpLPV.d.cts +167 -0
  80. package/dist/scope-DU5dFP1T.js +322 -0
  81. package/dist/scope-DU5dFP1T.js.map +1 -0
  82. package/dist/scope-DvqvkIHB.cjs +369 -0
  83. package/dist/scope-DvqvkIHB.cjs.map +1 -0
  84. package/dist/store-BEsiS8y7.d.cts +242 -0
  85. package/dist/store-BWMWEUpu.cjs +819 -0
  86. package/dist/store-BWMWEUpu.cjs.map +1 -0
  87. package/dist/store-DKaeE840.d.ts +242 -0
  88. package/dist/store-Dr8gM3lq.js +730 -0
  89. package/dist/store-Dr8gM3lq.js.map +1 -0
  90. package/dist/storeMethods-AIJSwxHz.js +315 -0
  91. package/dist/storeMethods-AIJSwxHz.js.map +1 -0
  92. package/dist/storeMethods-BQwU2Uia.d.cts +107 -0
  93. package/dist/storeMethods-C4luym7C.d.ts +107 -0
  94. package/dist/storeMethods-DVVsmUg1.cjs +375 -0
  95. package/dist/storeMethods-DVVsmUg1.cjs.map +1 -0
  96. package/package.json +92 -135
  97. package/dist/cjs/hash.cjs +0 -30
  98. package/dist/cjs/hash.cjs.map +0 -1
  99. package/dist/cjs/index.cjs +0 -56
  100. package/dist/cjs/index.cjs.map +0 -1
  101. package/dist/cjs/index2.cjs +0 -300
  102. package/dist/cjs/index2.cjs.map +0 -1
  103. package/dist/cjs/mutative/index.cjs +0 -10
  104. package/dist/cjs/mutative/index.cjs.map +0 -1
  105. package/dist/cjs/mutative/register.cjs +0 -8
  106. package/dist/cjs/mutative/register.cjs.map +0 -1
  107. package/dist/cjs/mutativeMethods.cjs +0 -29
  108. package/dist/cjs/mutativeMethods.cjs.map +0 -1
  109. package/dist/cjs/patches/index.cjs +0 -10
  110. package/dist/cjs/patches/index.cjs.map +0 -1
  111. package/dist/cjs/patches/register.cjs +0 -8
  112. package/dist/cjs/patches/register.cjs.map +0 -1
  113. package/dist/cjs/persist/register.cjs +0 -11
  114. package/dist/cjs/persist/register.cjs.map +0 -1
  115. package/dist/cjs/persist.cjs +0 -302
  116. package/dist/cjs/persist.cjs.map +0 -1
  117. package/dist/cjs/propAccess.cjs +0 -162
  118. package/dist/cjs/propAccess.cjs.map +0 -1
  119. package/dist/cjs/react/index.cjs +0 -628
  120. package/dist/cjs/react/index.cjs.map +0 -1
  121. package/dist/cjs/react/register.cjs +0 -13
  122. package/dist/cjs/react/register.cjs.map +0 -1
  123. package/dist/cjs/scope.cjs +0 -400
  124. package/dist/cjs/scope.cjs.map +0 -1
  125. package/dist/cjs/store.cjs +0 -829
  126. package/dist/cjs/store.cjs.map +0 -1
  127. package/dist/cjs/storeMethods.cjs +0 -856
  128. package/dist/cjs/storeMethods.cjs.map +0 -1
  129. package/dist/cjs/urlStore.cjs +0 -120
  130. package/dist/cjs/urlStore.cjs.map +0 -1
  131. package/dist/es/hash.mjs +0 -27
  132. package/dist/es/hash.mjs.map +0 -1
  133. package/dist/es/index.mjs +0 -20
  134. package/dist/es/index.mjs.map +0 -1
  135. package/dist/es/index2.mjs +0 -291
  136. package/dist/es/index2.mjs.map +0 -1
  137. package/dist/es/mutative/index.mjs +0 -2
  138. package/dist/es/mutative/index.mjs.map +0 -1
  139. package/dist/es/mutative/register.mjs +0 -6
  140. package/dist/es/mutative/register.mjs.map +0 -1
  141. package/dist/es/mutativeMethods.mjs +0 -27
  142. package/dist/es/mutativeMethods.mjs.map +0 -1
  143. package/dist/es/patches/index.mjs +0 -2
  144. package/dist/es/patches/index.mjs.map +0 -1
  145. package/dist/es/patches/register.mjs +0 -6
  146. package/dist/es/patches/register.mjs.map +0 -1
  147. package/dist/es/persist/register.mjs +0 -9
  148. package/dist/es/persist/register.mjs.map +0 -1
  149. package/dist/es/persist.mjs +0 -300
  150. package/dist/es/persist.mjs.map +0 -1
  151. package/dist/es/propAccess.mjs +0 -151
  152. package/dist/es/propAccess.mjs.map +0 -1
  153. package/dist/es/react/index.mjs +0 -611
  154. package/dist/es/react/index.mjs.map +0 -1
  155. package/dist/es/react/register.mjs +0 -11
  156. package/dist/es/react/register.mjs.map +0 -1
  157. package/dist/es/scope.mjs +0 -391
  158. package/dist/es/scope.mjs.map +0 -1
  159. package/dist/es/store.mjs +0 -812
  160. package/dist/es/store.mjs.map +0 -1
  161. package/dist/es/storeMethods.mjs +0 -845
  162. package/dist/es/storeMethods.mjs.map +0 -1
  163. package/dist/es/urlStore.mjs +0 -116
  164. package/dist/es/urlStore.mjs.map +0 -1
  165. package/dist/types/core/cache.d.ts +0 -119
  166. package/dist/types/core/commonTypes.d.ts +0 -76
  167. package/dist/types/core/index.d.ts +0 -6
  168. package/dist/types/core/resourceGroup.d.ts +0 -16
  169. package/dist/types/core/scope.d.ts +0 -5
  170. package/dist/types/core/store.d.ts +0 -86
  171. package/dist/types/core/urlStore.d.ts +0 -21
  172. package/dist/types/index.d.ts +0 -14
  173. package/dist/types/lib/applyPatches.d.ts +0 -2
  174. package/dist/types/lib/autobind.d.ts +0 -1
  175. package/dist/types/lib/cacheState.d.ts +0 -20
  176. package/dist/types/lib/calcDuration.d.ts +0 -2
  177. package/dist/types/lib/calculatedValue.d.ts +0 -9
  178. package/dist/types/lib/castArray.d.ts +0 -1
  179. package/dist/types/lib/clone.d.ts +0 -1
  180. package/dist/types/lib/constrain.d.ts +0 -1
  181. package/dist/types/lib/debounce.d.ts +0 -12
  182. package/dist/types/lib/deferred.d.ts +0 -5
  183. package/dist/types/lib/diff.d.ts +0 -17
  184. package/dist/types/lib/disposable.d.ts +0 -3
  185. package/dist/types/lib/equals.d.ts +0 -3
  186. package/dist/types/lib/extendedJson.d.ts +0 -5
  187. package/dist/types/lib/forwardError.d.ts +0 -1
  188. package/dist/types/lib/hash.d.ts +0 -5
  189. package/dist/types/lib/helpers.d.ts +0 -2
  190. package/dist/types/lib/instanceCache.d.ts +0 -18
  191. package/dist/types/lib/isPromise.d.ts +0 -1
  192. package/dist/types/lib/makeSelector.d.ts +0 -2
  193. package/dist/types/lib/maybePromise.d.ts +0 -1
  194. package/dist/types/lib/path.d.ts +0 -41
  195. package/dist/types/lib/promiseChain.d.ts +0 -5
  196. package/dist/types/lib/promiseWithCancel.d.ts +0 -8
  197. package/dist/types/lib/promiseWithState.d.ts +0 -9
  198. package/dist/types/lib/propAccess.d.ts +0 -7
  199. package/dist/types/lib/queue.d.ts +0 -11
  200. package/dist/types/lib/standardMethods.d.ts +0 -20
  201. package/dist/types/lib/throttle.d.ts +0 -2
  202. package/dist/types/lib/trackingProxy.d.ts +0 -2
  203. package/dist/types/lib/trie.d.ts +0 -11
  204. package/dist/types/lib/typeHelpers.d.ts +0 -12
  205. package/dist/types/lib/unwrapPromise.d.ts +0 -1
  206. package/dist/types/lib/updateHelpers.d.ts +0 -1
  207. package/dist/types/lib/wildcardMatch.d.ts +0 -3
  208. package/dist/types/mutative/index.d.ts +0 -1
  209. package/dist/types/mutative/mutativeMethods.d.ts +0 -11
  210. package/dist/types/mutative/register.d.ts +0 -7
  211. package/dist/types/patches/index.d.ts +0 -1
  212. package/dist/types/patches/patchMethods.d.ts +0 -44
  213. package/dist/types/patches/register.d.ts +0 -7
  214. package/dist/types/persist/index.d.ts +0 -3
  215. package/dist/types/persist/persist.d.ts +0 -40
  216. package/dist/types/persist/persistPathHelpers.d.ts +0 -6
  217. package/dist/types/persist/persistStorage.d.ts +0 -17
  218. package/dist/types/persist/register.d.ts +0 -9
  219. package/dist/types/react/cacheMethods.d.ts +0 -5
  220. package/dist/types/react/form/customInput.d.ts +0 -6
  221. package/dist/types/react/form/form.d.ts +0 -98
  222. package/dist/types/react/form/formField.d.ts +0 -68
  223. package/dist/types/react/form/formForEach.d.ts +0 -19
  224. package/dist/types/react/form/index.d.ts +0 -3
  225. package/dist/types/react/form/useFormAutosave.d.ts +0 -9
  226. package/dist/types/react/index.d.ts +0 -11
  227. package/dist/types/react/loadingBoundary.d.ts +0 -21
  228. package/dist/types/react/register.d.ts +0 -15
  229. package/dist/types/react/scope.d.ts +0 -24
  230. package/dist/types/react/scopeMethods.d.ts +0 -20
  231. package/dist/types/react/storeMethods.d.ts +0 -15
  232. package/dist/types/react/useCache.d.ts +0 -34
  233. package/dist/types/react/useDecoupledState.d.ts +0 -7
  234. package/dist/types/react/useProp.d.ts +0 -8
  235. package/dist/types/react/useStore.d.ts +0 -16
  236. package/dist/types/react/useUrlParamScope.d.ts +0 -4
@@ -1,829 +0,0 @@
1
- 'use strict';
2
-
3
- const propAccess = require('./propAccess.cjs');
4
-
5
- const marker = Symbol("autobind");
6
- const autobind = (_class) => {
7
- for (const key of Reflect.ownKeys(_class.prototype)) {
8
- if (key === "constructor") {
9
- continue;
10
- }
11
- const descriptor = Reflect.getOwnPropertyDescriptor(_class.prototype, key);
12
- let method = descriptor?.get?.() ?? descriptor?.value;
13
- let isBinding = false;
14
- if (typeof method !== "function" || method[marker]) {
15
- continue;
16
- }
17
- Reflect.defineProperty(_class.prototype, key, {
18
- configurable: true,
19
- get() {
20
- if (isBinding || this === _class.prototype || Object.prototype.hasOwnProperty.call(this, key) || typeof method !== "function") {
21
- return method;
22
- }
23
- const boundMethod = (...args) => Reflect.apply(method, this, args);
24
- boundMethod[marker] = true;
25
- isBinding = true;
26
- Object.defineProperty(this, key, {
27
- configurable: true,
28
- get() {
29
- return boundMethod;
30
- }
31
- });
32
- isBinding = false;
33
- return boundMethod;
34
- },
35
- set(v) {
36
- method = v;
37
- }
38
- });
39
- }
40
- return _class;
41
- };
42
-
43
- function calcDuration(t) {
44
- if (typeof t === "number") return t;
45
- return (t.milliseconds ?? 0) + (t.seconds ?? 0) * 1e3 + (t.minutes ?? 0) * 60 * 1e3 + (t.hours ?? 0) * 60 * 60 * 1e3 + (t.days ?? 0) * 24 * 60 * 60 * 1e3;
46
- }
47
-
48
- class Deferred extends Promise {
49
- constructor() {
50
- Object.defineProperty(Deferred, Symbol.species, {
51
- value: Promise
52
- });
53
- const that = {};
54
- super((resolve, reject) => {
55
- Object.assign(that, { resolve, reject });
56
- });
57
- this.resolve = () => undefined;
58
- this.reject = () => undefined;
59
- Object.assign(this, that);
60
- }
61
- }
62
-
63
- function isPromise(value) {
64
- return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
65
- }
66
-
67
- class PromiseWithState extends Promise {
68
- constructor(value, state = { status: "pending" }) {
69
- super((resolve) => resolve(value));
70
- this.state = state;
71
- Object.defineProperty(PromiseWithState, Symbol.species, {
72
- value: Promise
73
- });
74
- if (isPromise(value)) {
75
- value.then((value2) => {
76
- this.state = { status: "value", value: value2 };
77
- }).catch((error) => {
78
- this.state = { status: "error", error };
79
- });
80
- } else {
81
- this.state = { status: "value", value };
82
- }
83
- }
84
- static resolve(value) {
85
- return new PromiseWithState(value);
86
- }
87
- static reject(error) {
88
- return new PromiseWithState(Promise.reject(error), { status: "error", error });
89
- }
90
- }
91
-
92
- function queue() {
93
- const q = [];
94
- const completionListeners = /* @__PURE__ */ new Set();
95
- let active = false;
96
- const notify = () => {
97
- for (const listener of completionListeners) {
98
- listener();
99
- }
100
- completionListeners.clear();
101
- };
102
- const run = async () => {
103
- if (!active) {
104
- active = true;
105
- let next;
106
- while (next = q.shift()) {
107
- try {
108
- let result = next.action();
109
- if (isPromise(result)) {
110
- result = await result;
111
- }
112
- next.resolve(result);
113
- } catch (error) {
114
- next.reject(error);
115
- }
116
- }
117
- active = false;
118
- notify();
119
- }
120
- };
121
- return Object.assign(
122
- (action, ref) => {
123
- return new Promise((resolve, reject) => {
124
- q.push({ action, resolve, reject, ref });
125
- run();
126
- });
127
- },
128
- {
129
- clear() {
130
- q.length = 0;
131
- },
132
- whenDone() {
133
- if (!active) {
134
- return Promise.resolve();
135
- }
136
- return new Promise((resolve) => {
137
- completionListeners.add(resolve);
138
- });
139
- },
140
- get size() {
141
- return q.length;
142
- },
143
- getRefs() {
144
- return q.map((item) => item.ref).filter((x) => x !== undefined);
145
- }
146
- }
147
- );
148
- }
149
-
150
- function calculatedValue(store, notify) {
151
- let active = false;
152
- const deps = new Array();
153
- let value;
154
- const whenConnected = new Deferred();
155
- const whenExecuted = new Deferred();
156
- const ac = new AbortController();
157
- let connection;
158
- const q = queue();
159
- q(() => whenExecuted);
160
- const cancelEffect = store.addEffect(() => {
161
- if (connection) {
162
- store.invalidate();
163
- return;
164
- }
165
- active = true;
166
- for (const dep of deps) {
167
- dep.on();
168
- }
169
- return () => {
170
- active = false;
171
- for (const dep of deps) {
172
- dep.off();
173
- }
174
- if (connection) {
175
- connection.active = false;
176
- connection.cancel?.();
177
- q.clear();
178
- if ("state" in store) {
179
- store.state.set((state) => ({
180
- ...state,
181
- isConnected: false,
182
- isStale: true
183
- }));
184
- }
185
- }
186
- };
187
- });
188
- function use(dep) {
189
- const value2 = dep.get();
190
- let cancel;
191
- const on = () => {
192
- cancel ||= dep.subscribe(() => store.invalidate(), { runNow: false });
193
- };
194
- const off = () => {
195
- cancel?.();
196
- cancel = undefined;
197
- };
198
- deps.push({ store: dep, value: value2, on, off });
199
- if (active) {
200
- on();
201
- }
202
- return value2;
203
- }
204
- async function connect(createConnection) {
205
- if (!active) {
206
- connection = { active: false };
207
- return;
208
- }
209
- const actions = {
210
- set(_value) {
211
- q(() => {
212
- if (!connection?.active) {
213
- return;
214
- }
215
- value = _value;
216
- notify();
217
- });
218
- },
219
- updateValue(update) {
220
- q(async () => {
221
- if (!connection?.active) {
222
- return;
223
- }
224
- if (update instanceof Function) {
225
- const currentValue = await value;
226
- if (!connection?.active) {
227
- return;
228
- }
229
- try {
230
- update = update(currentValue);
231
- } catch (error) {
232
- value = PromiseWithState.reject(error);
233
- notify();
234
- connection.active = false;
235
- connection.cancel?.();
236
- return;
237
- }
238
- }
239
- value = PromiseWithState.resolve(update);
240
- notify();
241
- });
242
- },
243
- updateError(error) {
244
- q(() => {
245
- if (!connection?.active) {
246
- return;
247
- }
248
- connection.active = false;
249
- connection.cancel?.();
250
- if ("state" in store) {
251
- store.state.set({
252
- status: "error",
253
- error,
254
- isConnected: false,
255
- isUpdating: false,
256
- isStale: false
257
- });
258
- }
259
- value = PromiseWithState.reject(error);
260
- notify();
261
- });
262
- },
263
- updateIsConnected(isConnected) {
264
- if (isConnected) {
265
- whenConnected.resolve();
266
- }
267
- q(() => {
268
- if (!connection?.active) {
269
- return;
270
- }
271
- if ("state" in store) {
272
- store.state.set("isConnected", isConnected);
273
- }
274
- });
275
- },
276
- close() {
277
- if (connection?.active) {
278
- store.invalidate();
279
- }
280
- }
281
- };
282
- connection = { active: true };
283
- let _cancel = createConnection(actions);
284
- connection.cancel = () => {
285
- _cancel?.();
286
- _cancel = undefined;
287
- };
288
- if (!connection.active) {
289
- connection.cancel();
290
- }
291
- return whenConnected;
292
- }
293
- if (store.getter instanceof Function) {
294
- try {
295
- value = store.getter({ signal: ac.signal, use, connect });
296
- } catch (error) {
297
- value = PromiseWithState.reject(error);
298
- if (connection) {
299
- connection.active = false;
300
- connection.cancel?.();
301
- q.clear();
302
- }
303
- }
304
- } else {
305
- value = store.getter;
306
- }
307
- if (isPromise(value)) {
308
- value.finally(() => whenExecuted.resolve()).catch(() => undefined);
309
- } else {
310
- whenExecuted.resolve();
311
- }
312
- function check() {
313
- for (const dep of deps) {
314
- if (!propAccess.deepEqual(dep.store.get(), dep.value)) {
315
- store.invalidate();
316
- return;
317
- }
318
- }
319
- }
320
- function stop() {
321
- cancelEffect();
322
- whenExecuted.resolve();
323
- whenConnected.resolve();
324
- ac.abort();
325
- if (connection) {
326
- connection.active = false;
327
- connection.cancel?.();
328
- q.clear();
329
- }
330
- }
331
- function invalidateDependencies(recursive) {
332
- for (const dep of deps) {
333
- dep.store.invalidate(recursive);
334
- }
335
- }
336
- return {
337
- get value() {
338
- return value;
339
- },
340
- check,
341
- stop,
342
- invalidateDependencies
343
- };
344
- }
345
- function staticValue(value) {
346
- return {
347
- value,
348
- check: () => undefined,
349
- stop: () => undefined,
350
- invalidateDependencies: () => undefined
351
- };
352
- }
353
-
354
- function makeSelector(selector) {
355
- if (!selector) {
356
- return (x) => x;
357
- }
358
- if (selector instanceof Function) {
359
- return selector;
360
- }
361
- return (x) => propAccess.get(x, selector);
362
- }
363
-
364
- function debounce(action, options) {
365
- const wait = typeof options === "object" && "wait" in options ? calcDuration(options.wait) : calcDuration(options);
366
- const maxWait = typeof options === "object" && "maxWait" in options && options.maxWait !== undefined ? calcDuration(options.maxWait) : undefined;
367
- let run;
368
- let timeout;
369
- let timeoutStarted;
370
- function flush() {
371
- if (timeout !== undefined) {
372
- clearTimeout(timeout);
373
- }
374
- run?.();
375
- }
376
- function cancel() {
377
- if (timeout !== undefined) {
378
- clearTimeout(timeout);
379
- }
380
- run = undefined;
381
- timeout = undefined;
382
- timeoutStarted = undefined;
383
- }
384
- function isScheduled() {
385
- return timeout !== undefined;
386
- }
387
- function debounce2(...args) {
388
- const now = Date.now();
389
- timeoutStarted ??= now;
390
- const deadline = Math.min(
391
- //
392
- now + wait,
393
- timeoutStarted + (maxWait ?? Number.POSITIVE_INFINITY)
394
- );
395
- if (timeout !== undefined) {
396
- clearTimeout(timeout);
397
- }
398
- run = () => {
399
- run = undefined;
400
- timeout = undefined;
401
- timeoutStarted = undefined;
402
- action(...args);
403
- };
404
- timeout = setTimeout(run, deadline - now);
405
- }
406
- return Object.assign(debounce2, { flush, cancel, isScheduled });
407
- }
408
-
409
- function disposable(dispose) {
410
- return Object.assign(
411
- dispose,
412
- Symbol.dispose ? { [Symbol.dispose]: dispose } : {}
413
- );
414
- }
415
-
416
- function forwardError(error) {
417
- setTimeout(() => {
418
- throw error;
419
- });
420
- }
421
-
422
- class PromiseCancelError extends Error {
423
- constructor() {
424
- super("cancelled");
425
- }
426
- }
427
- class PromiseWithCancel extends Promise {
428
- constructor(executor) {
429
- autobind(PromiseWithCancel);
430
- const abortController = new AbortController();
431
- super((resolve, reject) => {
432
- executor(resolve, reject, abortController.signal);
433
- abortController.signal.addEventListener("abort", () => {
434
- reject(abortController.signal.reason);
435
- });
436
- });
437
- this.abortController = abortController;
438
- }
439
- cancel(reason = new PromiseCancelError()) {
440
- this.abortController.abort(reason);
441
- }
442
- }
443
-
444
- function createArrayAction(prop) {
445
- return function arrayAction(...args) {
446
- const newArray = this.get().slice();
447
- const result = newArray[prop](...args);
448
- this.set(newArray);
449
- return result;
450
- };
451
- }
452
- const arrayMethods = {
453
- splice: /* @__PURE__ */ createArrayAction("splice"),
454
- push: /* @__PURE__ */ createArrayAction("push"),
455
- pop: /* @__PURE__ */ createArrayAction("pop"),
456
- shift: /* @__PURE__ */ createArrayAction("shift"),
457
- unshift: /* @__PURE__ */ createArrayAction("unshift"),
458
- reverse: /* @__PURE__ */ createArrayAction("reverse"),
459
- sort: /* @__PURE__ */ createArrayAction("sort")
460
- };
461
- const recordMethods = {
462
- delete(key) {
463
- const copy = { ...this.get() };
464
- delete copy[key];
465
- this.set(copy);
466
- },
467
- clear() {
468
- this.set({});
469
- }
470
- };
471
- const mapMethods = {
472
- delete(key) {
473
- const newMap = new Map(this.get());
474
- const result = newMap.delete(key);
475
- this.set(newMap);
476
- return result;
477
- },
478
- clear() {
479
- this.set(/* @__PURE__ */ new Map());
480
- }
481
- };
482
- const setMethods = {
483
- add(value) {
484
- const newSet = new Set(this.get());
485
- newSet.add(value);
486
- this.set(newSet);
487
- },
488
- delete(value) {
489
- const newSet = new Set(this.get());
490
- newSet.delete(value);
491
- this.set(newSet);
492
- },
493
- clear() {
494
- this.set(/* @__PURE__ */ new Set());
495
- }
496
- };
497
-
498
- function throttle(action, duration) {
499
- const ms = calcDuration(duration);
500
- let t = 0;
501
- let timeout;
502
- return (...args) => {
503
- if (timeout !== undefined) {
504
- clearTimeout(timeout);
505
- }
506
- const dt = t + ms - Date.now();
507
- if (dt <= 0) {
508
- action(...args);
509
- t = Date.now();
510
- return;
511
- }
512
- timeout = setTimeout(() => {
513
- action(...args);
514
- t = Date.now();
515
- }, dt);
516
- };
517
- }
518
-
519
- function noop() {
520
- return undefined;
521
- }
522
- class Store {
523
- constructor(getter, options = {}, derivedFrom) {
524
- this.getter = getter;
525
- this.options = options;
526
- this.derivedFrom = derivedFrom;
527
- this.listeners = /* @__PURE__ */ new Map();
528
- this.effects = /* @__PURE__ */ new Map();
529
- this.notifyId = {};
530
- autobind(Store);
531
- if (typeof getter !== "function") {
532
- this.calculatedValue = this.defaultValue = staticValue(getter);
533
- }
534
- for (const hook of Store.hooks ?? []) {
535
- hook.apply(this, [this]);
536
- }
537
- if (options.effect instanceof Function) {
538
- this.addEffect(options.effect);
539
- } else if (options.effect) {
540
- this.addEffect(options.effect.effect, options.effect.retain);
541
- }
542
- }
543
- static addHook(hook) {
544
- this.hooks ??= /* @__PURE__ */ new Set();
545
- this.hooks.add(hook);
546
- return disposable(() => this.hooks?.delete(hook));
547
- }
548
- get() {
549
- this.calculatedValue?.check();
550
- if (!this.calculatedValue) {
551
- this.calculatedValue = calculatedValue(this, this.notify);
552
- }
553
- return this.calculatedValue.value;
554
- }
555
- set(...args) {
556
- const path = args.length > 1 ? args[0] : [];
557
- let update = args.length > 1 ? args[1] : args[0];
558
- if (update instanceof Function) {
559
- const before = this.get();
560
- const valueBefore = propAccess.get(before, path);
561
- const valueAfter = update(valueBefore);
562
- update = propAccess.set(before, path, valueAfter);
563
- } else if (path.length > 0) {
564
- update = propAccess.set(this.get(), path, update);
565
- }
566
- if (this.derivedFrom) {
567
- this.derivedFrom.updater(update);
568
- return;
569
- }
570
- this.calculatedValue?.stop();
571
- this.calculatedValue = staticValue(update);
572
- this.notify();
573
- }
574
- invalidate(recursive) {
575
- if (recursive) {
576
- this.calculatedValue?.invalidateDependencies(recursive);
577
- }
578
- this.calculatedValue?.stop();
579
- this.calculatedValue = this.defaultValue;
580
- this.notify();
581
- }
582
- subscribe(listener, options) {
583
- const {
584
- passive,
585
- runNow = true,
586
- throttle: throttleOption,
587
- debounce: debounceOption,
588
- equals = this.options.equals ?? propAccess.deepEqual
589
- } = options ?? {};
590
- let isSetup = false;
591
- let previousValue;
592
- let innerListener = () => {
593
- if (!isSetup) {
594
- return;
595
- }
596
- const value = passive ? this.calculatedValue : { value: this.get() };
597
- if (!value) {
598
- return;
599
- }
600
- if (previousValue && equals(value.value, previousValue.value)) {
601
- return;
602
- }
603
- const _previousValue = previousValue?.value;
604
- previousValue = this.calculatedValue && { value: this.calculatedValue?.value };
605
- try {
606
- listener.apply({ cancel }, [value.value, _previousValue]);
607
- } catch (error) {
608
- forwardError(error);
609
- }
610
- };
611
- if (throttleOption) {
612
- innerListener = throttle(innerListener, throttleOption);
613
- } else if (debounceOption) {
614
- innerListener = debounce(innerListener, debounceOption);
615
- }
616
- this.listeners.set(innerListener, !passive);
617
- const cancel = () => {
618
- if (this.listeners.delete(innerListener) && !passive) {
619
- this.onUnsubscribe();
620
- }
621
- };
622
- if (!passive) {
623
- this.onSubscribe();
624
- }
625
- isSetup = true;
626
- if (runNow) {
627
- innerListener();
628
- if (!throttleOption && typeof debounceOption === "object" && "waitOnRunNow" in debounceOption && debounceOption.waitOnRunNow === false && "flush" in innerListener) {
629
- innerListener.flush();
630
- }
631
- } else {
632
- previousValue = passive ? this.calculatedValue && { value: this.calculatedValue.value } : { value: this.get() };
633
- }
634
- return disposable(cancel);
635
- }
636
- once(...args) {
637
- const condition = args[0] instanceof Function ? args[0] : Boolean;
638
- const options = args[0] instanceof Function ? args[1] : args[0];
639
- return new PromiseWithCancel((resolve, reject, signal) => {
640
- let stopped = false;
641
- let timer;
642
- const cancel = this.subscribe(
643
- (value) => {
644
- if (stopped || !condition(value)) {
645
- return;
646
- }
647
- resolve(value);
648
- stopped = true;
649
- if (timer) {
650
- clearTimeout(timer);
651
- }
652
- setTimeout(() => cancel());
653
- },
654
- {
655
- runNow: !!condition
656
- }
657
- );
658
- if (stopped) {
659
- return;
660
- }
661
- signal.addEventListener("abort", cancel);
662
- options?.signal?.addEventListener("abort", () => {
663
- cancel();
664
- reject(options.signal?.reason ?? new Error("cancelled"));
665
- });
666
- if (options?.timeout !== undefined) {
667
- timer = setTimeout(() => {
668
- cancel();
669
- reject(new Error("timeout"));
670
- }, calcDuration(options.timeout));
671
- }
672
- });
673
- }
674
- map(_selector, ...args) {
675
- const updater = _selector instanceof Function ? args[0] : (value) => (state) => propAccess.set(state, _selector, value);
676
- const selector = makeSelector(_selector);
677
- const derivedFrom = {
678
- store: this.derivedFrom ? this.derivedFrom.store : this,
679
- selectors: this.derivedFrom ? [...this.derivedFrom.selectors, _selector] : [_selector],
680
- updater: (value) => {
681
- if (!updater) {
682
- throw new TypeError(
683
- "Can only update computed stores that either are derived from other stores using string selectors or have an updater function."
684
- );
685
- }
686
- let update = updater(value);
687
- if (update instanceof Function) {
688
- update = update(this.get());
689
- }
690
- if (this.derivedFrom) {
691
- this.derivedFrom.updater(update);
692
- } else {
693
- this.set(update);
694
- }
695
- }
696
- };
697
- return new Store(
698
- ({ use }) => {
699
- return selector(use(this));
700
- },
701
- undefined,
702
- derivedFrom
703
- );
704
- }
705
- /** Add an effect that will be executed when the store becomes active, which means when it has at least one subscriber.
706
- * @param effect
707
- * If there is already a subscriber, the effect will be executed immediately.
708
- * Otherweise it will be executed as soon as the first subscription is created.
709
- * Every time all subscriptions are removed and the first is created again, the effect will be executed again.
710
- * @param retain
711
- * If provided, delay tearing down effects when the last subscriber is removed. This is useful if a short gap in subscriber coverage is supposed to be ignored. E.g. when switching pages, the old page might unsubscribe, while the new page subscribes immediately after.
712
- * @returns
713
- * The effect can return a teardown callback, which will be executed when the last subscription is removed and potentially the ratain time has passed.
714
- */
715
- addEffect(effect, retain = this.options.retain) {
716
- this.effects.set(effect, {
717
- handle: this.isActive() ? effect.apply(this, [this]) ?? noop : undefined,
718
- retain: retain !== undefined ? calcDuration(retain) : undefined
719
- });
720
- return disposable(() => {
721
- const { handle, timeout } = this.effects.get(effect) ?? {};
722
- handle?.();
723
- if (timeout !== undefined) {
724
- clearTimeout(timeout);
725
- }
726
- this.effects.delete(effect);
727
- });
728
- }
729
- /** Return whether the store is currently active, which means whether it has at least one subscriber. */
730
- isActive() {
731
- return [...this.listeners.values()].some(Boolean);
732
- }
733
- onSubscribe() {
734
- if ([...this.listeners.values()].filter(Boolean).length > 1) return;
735
- for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {
736
- if (timeout !== undefined) {
737
- clearTimeout(timeout);
738
- }
739
- this.effects.set(effect, {
740
- handle: handle ?? effect.apply(this, [this]) ?? noop,
741
- retain,
742
- timeout: undefined
743
- });
744
- }
745
- }
746
- onUnsubscribe() {
747
- if ([...this.listeners.values()].some(Boolean)) return;
748
- for (const [effect, { handle, retain, timeout }] of this.effects.entries()) {
749
- if (!retain) {
750
- handle?.();
751
- if (timeout !== undefined) {
752
- clearTimeout(timeout);
753
- }
754
- this.effects.set(effect, {
755
- handle: undefined,
756
- retain,
757
- timeout: undefined
758
- });
759
- continue;
760
- }
761
- const newTimeout = timeout ?? (handle ? setTimeout(() => {
762
- handle();
763
- this.effects.set(effect, {
764
- handle: undefined,
765
- retain,
766
- timeout: undefined
767
- });
768
- }, retain) : undefined);
769
- this.effects.set(effect, {
770
- handle,
771
- retain,
772
- timeout: newTimeout
773
- });
774
- }
775
- }
776
- notify() {
777
- const n = {};
778
- this.notifyId = n;
779
- const snapshot = [...this.listeners.keys()];
780
- for (const listener of snapshot) {
781
- listener();
782
- if (n !== this.notifyId) break;
783
- }
784
- }
785
- }
786
- function create(initialState, options) {
787
- options = { ...createStore.defaultOptions, ...options };
788
- const store = new Store(initialState, options);
789
- if (initialState instanceof Function) {
790
- return store;
791
- }
792
- let methods = options?.methods;
793
- if (initialState instanceof Map) {
794
- methods = { ...mapMethods, ...methods };
795
- } else if (initialState instanceof Set) {
796
- methods = { ...setMethods, ...methods };
797
- } else if (Array.isArray(initialState)) {
798
- methods = { ...arrayMethods, ...methods };
799
- } else if (propAccess.isObject(initialState)) {
800
- methods = { ...recordMethods, ...methods };
801
- }
802
- const boundMethods = Object.fromEntries(
803
- Object.entries(methods ?? {}).filter(([name]) => !(name in store)).map(([name, action]) => [name, action.bind(store)])
804
- );
805
- return Object.assign(store, boundMethods);
806
- }
807
- const createStore = /* @__PURE__ */ Object.assign(create, {
808
- defaultOptions: {
809
- equals: propAccess.deepEqual
810
- }
811
- });
812
-
813
- exports.PromiseWithState = PromiseWithState;
814
- exports.Store = Store;
815
- exports.arrayMethods = arrayMethods;
816
- exports.autobind = autobind;
817
- exports.calcDuration = calcDuration;
818
- exports.calculatedValue = calculatedValue;
819
- exports.createStore = createStore;
820
- exports.debounce = debounce;
821
- exports.disposable = disposable;
822
- exports.isPromise = isPromise;
823
- exports.makeSelector = makeSelector;
824
- exports.mapMethods = mapMethods;
825
- exports.queue = queue;
826
- exports.recordMethods = recordMethods;
827
- exports.setMethods = setMethods;
828
- exports.throttle = throttle;
829
- //# sourceMappingURL=store.cjs.map