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