cross-state 0.56.4 → 1.0.1
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.
- package/dist/{diff-CElc7pJI.d.ts → diff-CAQaunfv.d.cts} +3 -3
- package/dist/{diff-BslUrJZE.d.cts → diff-DFvRd-Gf.d.ts} +3 -3
- package/dist/{extendedJson-BZkQBXEv.js → extendedJson-Dv9q6rps.js} +2 -2
- package/dist/{extendedJson-BZkQBXEv.js.map → extendedJson-Dv9q6rps.js.map} +1 -1
- package/dist/{extendedJson-Dn2F7Edo.cjs → extendedJson-ursQ8DbQ.cjs} +1 -1
- package/dist/{extendedJson-Dn2F7Edo.cjs.map → extendedJson-ursQ8DbQ.cjs.map} +1 -1
- package/dist/index.cjs +9 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +7 -9
- package/dist/index.js.map +1 -1
- package/dist/mutative/index.cjs +2 -1
- package/dist/mutative/index.d.cts +2 -2
- package/dist/mutative/index.d.ts +2 -2
- package/dist/mutative/index.js +2 -1
- package/dist/mutative/register.cjs +4 -3
- package/dist/mutative/register.cjs.map +1 -1
- package/dist/mutative/register.d.cts +2 -4
- package/dist/mutative/register.d.ts +2 -2
- package/dist/mutative/register.js +4 -3
- package/dist/mutative/register.js.map +1 -1
- package/dist/{mutativeMethods-Bhd1Yi22.d.ts → mutativeMethods-BT1Cim3p.d.ts} +3 -3
- package/dist/{mutativeMethods-DWhwZRzv.d.cts → mutativeMethods-C8VcZWED.d.cts} +3 -3
- package/dist/{mutativeMethods-CgXk_bMt.cjs → mutativeMethods-CkNycpO9.cjs} +6 -7
- package/dist/{mutativeMethods-CgXk_bMt.cjs.map → mutativeMethods-CkNycpO9.cjs.map} +1 -1
- package/dist/{mutativeMethods-CZKeRIDL.js → mutativeMethods-Jowr0Znn.js} +4 -6
- package/dist/{mutativeMethods-CZKeRIDL.js.map → mutativeMethods-Jowr0Znn.js.map} +1 -1
- package/dist/{patchMethods-hhlLwtqE.cjs → patchMethods-B7Hm5-Qh.cjs} +4 -6
- package/dist/{patchMethods-hhlLwtqE.cjs.map → patchMethods-B7Hm5-Qh.cjs.map} +1 -1
- package/dist/{patchMethods-DXWygPZ6.d.ts → patchMethods-BmyvvHnP.d.cts} +4 -4
- package/dist/{patchMethods-BT4Tg5aG.d.cts → patchMethods-CixmHmNt.d.ts} +4 -4
- package/dist/{patchMethods-C_f3PORQ.js → patchMethods-iK2F87G0.js} +5 -7
- package/dist/{patchMethods-C_f3PORQ.js.map → patchMethods-iK2F87G0.js.map} +1 -1
- package/dist/patches/index.cjs +3 -3
- package/dist/patches/index.d.cts +3 -3
- package/dist/patches/index.d.ts +3 -3
- package/dist/patches/index.js +3 -3
- package/dist/patches/register.cjs +4 -4
- package/dist/patches/register.cjs.map +1 -1
- package/dist/patches/register.d.cts +3 -5
- package/dist/patches/register.d.ts +3 -3
- package/dist/patches/register.js +4 -4
- package/dist/patches/register.js.map +1 -1
- package/dist/{chunk-CUT6urMc.cjs → path-B-Rq5q6m.cjs} +14 -1
- package/dist/path-B-Rq5q6m.cjs.map +1 -0
- package/dist/path-CyYq74W8.js +8 -0
- package/dist/path-CyYq74W8.js.map +1 -0
- package/dist/persist/register.cjs +5 -5
- package/dist/persist/register.cjs.map +1 -1
- package/dist/persist/register.d.cts +2 -4
- package/dist/persist/register.d.ts +2 -2
- package/dist/persist/register.js +5 -5
- package/dist/persist/register.js.map +1 -1
- package/dist/{persist-CLgS5Cqw.js → persist-Bunx8xfQ.js} +12 -15
- package/dist/persist-Bunx8xfQ.js.map +1 -0
- package/dist/{persist-olbNkcdZ.d.ts → persist-CHRYYolx.d.cts} +3 -3
- package/dist/{persist-DboMIMOK.cjs → persist-DMbVdqS_.cjs} +11 -14
- package/dist/persist-DMbVdqS_.cjs.map +1 -0
- package/dist/{persist-DVKRq8RQ.d.cts → persist-DyI_JLxZ.d.ts} +3 -3
- package/dist/{propAccess-BdLsqViO.cjs → propAccess-C2AIn9RC.cjs} +4 -6
- package/dist/{propAccess-BdLsqViO.cjs.map → propAccess-C2AIn9RC.cjs.map} +1 -1
- package/dist/{propAccess-B260LXN1.js → propAccess-DvWFpYoj.js} +5 -7
- package/dist/{propAccess-B260LXN1.js.map → propAccess-DvWFpYoj.js.map} +1 -1
- package/dist/react/index.cjs +66 -80
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +70 -70
- package/dist/react/index.d.ts +70 -70
- package/dist/react/index.js +62 -77
- package/dist/react/index.js.map +1 -1
- package/dist/react/register.cjs +5 -5
- package/dist/react/register.cjs.map +1 -1
- package/dist/react/register.d.cts +3 -5
- package/dist/react/register.d.ts +3 -3
- package/dist/react/register.js +5 -5
- package/dist/react/register.js.map +1 -1
- package/dist/{scope-CfLlLxo9.cjs → scope-C1bcfK8e.cjs} +32 -7
- package/dist/scope-C1bcfK8e.cjs.map +1 -0
- package/dist/{scope-D3jkIPgn.d.ts → scope-CESkVNvI.d.cts} +3 -3
- package/dist/{scope-7LeON9bZ.js → scope-CKGsCVn3.js} +20 -7
- package/dist/scope-CKGsCVn3.js.map +1 -0
- package/dist/{scope-CcBxgcrs.d.cts → scope-DJXSRsGy.d.ts} +3 -3
- package/dist/{store-MBrcOgtz.d.cts → store-BRHFhRPm.d.ts} +21 -21
- package/dist/{store-CdST5wJZ.cjs → store-C1NYHLgR.cjs} +12 -13
- package/dist/store-C1NYHLgR.cjs.map +1 -0
- package/dist/{store-DnZ6fsiJ.d.ts → store-XcnTdeiJ.d.cts} +21 -21
- package/dist/{store-Dx8w7yT-.js → store-v3RYWzVg.js} +13 -14
- package/dist/store-v3RYWzVg.js.map +1 -0
- package/dist/{storeMethods-B_RzvMaV.cjs → storeMethods-CNu7VD6w.cjs} +135 -60
- package/dist/storeMethods-CNu7VD6w.cjs.map +1 -0
- package/dist/{storeMethods-BrKuusQ2.js → storeMethods-CQhXlHpl.js} +115 -59
- package/dist/storeMethods-CQhXlHpl.js.map +1 -0
- package/dist/{storeMethods-CmWv1YMe.d.cts → storeMethods-Dsz0-Cda.d.ts} +4 -4
- package/dist/{storeMethods-Cb1ur5K3.d.ts → storeMethods-y3PlfTHV.d.cts} +4 -4
- package/package.json +26 -37
- package/dist/hash-DNFM5y_h.js +0 -19
- package/dist/hash-DNFM5y_h.js.map +0 -1
- package/dist/hash-Dv3XlmHn.cjs +0 -30
- package/dist/hash-Dv3XlmHn.cjs.map +0 -1
- package/dist/persist-CLgS5Cqw.js.map +0 -1
- package/dist/persist-DboMIMOK.cjs.map +0 -1
- package/dist/scope-7LeON9bZ.js.map +0 -1
- package/dist/scope-CfLlLxo9.cjs.map +0 -1
- package/dist/store-CdST5wJZ.cjs.map +0 -1
- package/dist/store-Dx8w7yT-.js.map +0 -1
- package/dist/storeMethods-B_RzvMaV.cjs.map +0 -1
- package/dist/storeMethods-BrKuusQ2.js.map +0 -1
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { deepEqual, isPlainObject } from "./propAccess-
|
|
3
|
-
import {
|
|
4
|
-
import { createContext, useCallback, useContext, useDebugValue, useEffect, useLayoutEffect, useMemo, useRef } from "react";
|
|
5
|
-
import { useSyncExternalStoreWithSelector } from "use-sync-external-store/shim/with-selector.js";
|
|
1
|
+
import { l as makeSelector, n as createStore } from "./store-v3RYWzVg.js";
|
|
2
|
+
import { c as deepEqual, s as isPlainObject } from "./propAccess-DvWFpYoj.js";
|
|
3
|
+
import { t as isAnyPath } from "./path-CyYq74W8.js";
|
|
4
|
+
import { createContext, useCallback, useContext, useDebugValue, useEffect, useLayoutEffect, useMemo, useRef, useSyncExternalStore } from "react";
|
|
6
5
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
7
6
|
|
|
8
7
|
//#region src/lib/trackingProxy.ts
|
|
@@ -29,34 +28,33 @@ function trackingProxy(value, equals = deepEqual) {
|
|
|
29
28
|
});
|
|
30
29
|
return calculatedValue;
|
|
31
30
|
}
|
|
32
|
-
const proxy = new Proxy(value, {
|
|
33
|
-
get(target, p, receiver) {
|
|
34
|
-
if (p === unwrapProxySymbol) return value;
|
|
35
|
-
if (revoked) return target[p];
|
|
36
|
-
const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};
|
|
37
|
-
if (writable === false && configurable === false) return target[p];
|
|
38
|
-
return trackComplexProp(Reflect.get, p, receiver);
|
|
39
|
-
},
|
|
40
|
-
getOwnPropertyDescriptor(target, p) {
|
|
41
|
-
const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};
|
|
42
|
-
if (writable === false && configurable === false) return Reflect.getOwnPropertyDescriptor(target, p);
|
|
43
|
-
return trackComplexProp(Reflect.getOwnPropertyDescriptor, p);
|
|
44
|
-
},
|
|
45
|
-
ownKeys() {
|
|
46
|
-
return trackComplexProp(Reflect.ownKeys);
|
|
47
|
-
},
|
|
48
|
-
getPrototypeOf() {
|
|
49
|
-
return trackSimpleProp(Reflect.getPrototypeOf);
|
|
50
|
-
},
|
|
51
|
-
has(_target, p) {
|
|
52
|
-
return trackSimpleProp(Reflect.has, p);
|
|
53
|
-
},
|
|
54
|
-
isExtensible() {
|
|
55
|
-
return trackSimpleProp(Reflect.isExtensible);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
31
|
return [
|
|
59
|
-
|
|
32
|
+
new Proxy(value, {
|
|
33
|
+
get(target, p, receiver) {
|
|
34
|
+
if (p === unwrapProxySymbol) return value;
|
|
35
|
+
if (revoked) return target[p];
|
|
36
|
+
const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};
|
|
37
|
+
if (writable === false && configurable === false) return target[p];
|
|
38
|
+
return trackComplexProp(Reflect.get, p, receiver);
|
|
39
|
+
},
|
|
40
|
+
getOwnPropertyDescriptor(target, p) {
|
|
41
|
+
const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};
|
|
42
|
+
if (writable === false && configurable === false) return Reflect.getOwnPropertyDescriptor(target, p);
|
|
43
|
+
return trackComplexProp(Reflect.getOwnPropertyDescriptor, p);
|
|
44
|
+
},
|
|
45
|
+
ownKeys() {
|
|
46
|
+
return trackComplexProp(Reflect.ownKeys);
|
|
47
|
+
},
|
|
48
|
+
getPrototypeOf() {
|
|
49
|
+
return trackSimpleProp(Reflect.getPrototypeOf);
|
|
50
|
+
},
|
|
51
|
+
has(_target, p) {
|
|
52
|
+
return trackSimpleProp(Reflect.has, p);
|
|
53
|
+
},
|
|
54
|
+
isExtensible() {
|
|
55
|
+
return trackSimpleProp(Reflect.isExtensible);
|
|
56
|
+
}
|
|
57
|
+
}),
|
|
60
58
|
(other) => !!other && deps.every((equals$1) => equals$1(other)),
|
|
61
59
|
() => {
|
|
62
60
|
revoked = true;
|
|
@@ -65,22 +63,48 @@ function trackingProxy(value, equals = deepEqual) {
|
|
|
65
63
|
];
|
|
66
64
|
}
|
|
67
65
|
|
|
66
|
+
//#endregion
|
|
67
|
+
//#region src/react/lib/useMemoEquals.ts
|
|
68
|
+
function useMemoEquals(value, equals = deepEqual) {
|
|
69
|
+
const ref = useRef(void 0);
|
|
70
|
+
const hasChanged = !ref.current || !equals(ref.current.value, value);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (hasChanged) ref.current = { value };
|
|
73
|
+
});
|
|
74
|
+
return hasChanged ? value : ref.current.value;
|
|
75
|
+
}
|
|
76
|
+
|
|
68
77
|
//#endregion
|
|
69
78
|
//#region src/react/useStore.ts
|
|
70
|
-
function useStore(store,
|
|
71
|
-
|
|
72
|
-
|
|
79
|
+
function useStore(store, ...args) {
|
|
80
|
+
let selectorRaw;
|
|
81
|
+
let allOptions;
|
|
82
|
+
if (typeof args[0] === "function" || isAnyPath(args[0])) {
|
|
83
|
+
selectorRaw = args[0];
|
|
84
|
+
allOptions = args[1] ?? {};
|
|
85
|
+
} else allOptions = args[0] ?? {};
|
|
86
|
+
const selector = useMemo(() => makeSelector(selectorRaw), [selectorRaw]);
|
|
73
87
|
const lastEqualsRef = useRef(void 0);
|
|
74
88
|
if (store.derivedFrom) return useStore(store.derivedFrom.store, (value$1) => {
|
|
75
89
|
for (const selector$1 of store.derivedFrom.selectors) value$1 = makeSelector(selector$1)(value$1);
|
|
76
90
|
return selector(value$1);
|
|
77
91
|
}, allOptions);
|
|
78
92
|
const { disableTrackingProxy = true, equals = store.options.equals ?? deepEqual, withViewTransition,...options } = allOptions;
|
|
79
|
-
const
|
|
93
|
+
const snapshot = useRef(void 0);
|
|
94
|
+
const get = useCallback(() => {
|
|
95
|
+
const storeValue = store.get();
|
|
96
|
+
const selectedValue = selector(storeValue);
|
|
97
|
+
if (!snapshot.current || storeValue !== snapshot.current.storeValue && !(lastEqualsRef.current?.(selectedValue) ?? false)) snapshot.current = {
|
|
98
|
+
storeValue,
|
|
99
|
+
selectedValue
|
|
100
|
+
};
|
|
101
|
+
return snapshot.current.selectedValue;
|
|
102
|
+
}, [store, selector]);
|
|
103
|
+
const subOptions = useMemoEquals({
|
|
80
104
|
...options,
|
|
81
105
|
runNow: false
|
|
82
|
-
};
|
|
83
|
-
|
|
106
|
+
});
|
|
107
|
+
let value = useSyncExternalStore(useCallback((listener) => {
|
|
84
108
|
let _listener = listener;
|
|
85
109
|
let stopped = false;
|
|
86
110
|
if (withViewTransition && document.startViewTransition) {
|
|
@@ -113,8 +137,12 @@ function useStore(store, argument1, argument2) {
|
|
|
113
137
|
stopped = true;
|
|
114
138
|
cancel();
|
|
115
139
|
};
|
|
116
|
-
}, [
|
|
117
|
-
|
|
140
|
+
}, [
|
|
141
|
+
store,
|
|
142
|
+
withViewTransition,
|
|
143
|
+
equals,
|
|
144
|
+
subOptions
|
|
145
|
+
]), get, get);
|
|
118
146
|
let lastEquals = (newValue) => equals(newValue, value);
|
|
119
147
|
let revoke;
|
|
120
148
|
if (!disableTrackingProxy) [value, lastEquals, revoke] = trackingProxy(value, equals);
|
|
@@ -132,8 +160,7 @@ const LoadingBoundaryContext = createContext(createStore(/* @__PURE__ */ new Set
|
|
|
132
160
|
function LoadingBoundary({ fallback, children, isLoading: isLoadingExternal }) {
|
|
133
161
|
const store = useMemo(() => createStore(/* @__PURE__ */ new Set()), []);
|
|
134
162
|
const entries = useStore(store);
|
|
135
|
-
const
|
|
136
|
-
const fallbackNode = isLoading ? typeof fallback === "function" ? fallback([...entries]) : fallback : void 0;
|
|
163
|
+
const fallbackNode = entries.size > 0 || isLoadingExternal ? typeof fallback === "function" ? fallback([...entries]) : fallback : void 0;
|
|
137
164
|
return /* @__PURE__ */ jsx(LoadingBoundaryContext.Provider, {
|
|
138
165
|
value: store,
|
|
139
166
|
children: fallbackNode !== void 0 ? /* @__PURE__ */ jsxs(Fragment$1, { children: [fallbackNode, /* @__PURE__ */ jsx("div", {
|
|
@@ -155,7 +182,7 @@ function useLoadingBoundary(isLoading, label) {
|
|
|
155
182
|
return newEntries;
|
|
156
183
|
});
|
|
157
184
|
};
|
|
158
|
-
}, [isLoading]);
|
|
185
|
+
}, [store, isLoading]);
|
|
159
186
|
}
|
|
160
187
|
|
|
161
188
|
//#endregion
|
|
@@ -223,7 +250,11 @@ function useCache(cache, { passive, disabled, updateOnMount, withViewTransition,
|
|
|
223
250
|
withViewTransition,
|
|
224
251
|
passive: passive || disabled
|
|
225
252
|
});
|
|
226
|
-
useEffect(() => rootCache.subscribe(() => void 0, { passive: passive || disabled }), [
|
|
253
|
+
useEffect(() => rootCache.subscribe(() => void 0, { passive: passive || disabled }), [
|
|
254
|
+
rootCache,
|
|
255
|
+
passive,
|
|
256
|
+
disabled
|
|
257
|
+
]);
|
|
227
258
|
useLoadingBoundary(loadingBoundary && !disabled && result.status === "pending");
|
|
228
259
|
if (suspense && result.status === "pending") throw rootCache.get();
|
|
229
260
|
return result;
|
|
@@ -235,15 +266,43 @@ const cacheMethods = { useCache(options) {
|
|
|
235
266
|
return useCache(this, options);
|
|
236
267
|
} };
|
|
237
268
|
|
|
269
|
+
//#endregion
|
|
270
|
+
//#region src/react/lib/useLatestRef.ts
|
|
271
|
+
function useLatestRef(value) {
|
|
272
|
+
const ref = useRef(value);
|
|
273
|
+
useEffect(() => {
|
|
274
|
+
ref.current = value;
|
|
275
|
+
}, [value]);
|
|
276
|
+
return ref;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
//#endregion
|
|
280
|
+
//#region src/react/lib/useLatestFunction.ts
|
|
281
|
+
function useLatestFunction(fn) {
|
|
282
|
+
const ref = useLatestRef(fn);
|
|
283
|
+
return (...args) => {
|
|
284
|
+
return ref.current(...args);
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
238
288
|
//#endregion
|
|
239
289
|
//#region src/react/useProp.ts
|
|
240
|
-
function useProp(store,
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
if (
|
|
245
|
-
|
|
246
|
-
|
|
290
|
+
function useProp(store, ...args) {
|
|
291
|
+
let selector;
|
|
292
|
+
let updater;
|
|
293
|
+
let options;
|
|
294
|
+
if (typeof args[0] === "function" || isAnyPath(args[0])) {
|
|
295
|
+
selector = args[0];
|
|
296
|
+
if (typeof args[1] === "function") {
|
|
297
|
+
updater = args[1];
|
|
298
|
+
options = args[2];
|
|
299
|
+
} else options = args[1];
|
|
300
|
+
} else options = args[0];
|
|
301
|
+
return [useStore(store, selector ?? ((x) => x), options), useLatestFunction((update) => {
|
|
302
|
+
let _store = store;
|
|
303
|
+
if (selector) _store = _store.map(selector, updater);
|
|
304
|
+
_store.set(update);
|
|
305
|
+
})];
|
|
247
306
|
}
|
|
248
307
|
|
|
249
308
|
//#endregion
|
|
@@ -261,16 +320,13 @@ function ScopeProvider({ scope, store: inputStore, children }) {
|
|
|
261
320
|
});
|
|
262
321
|
}
|
|
263
322
|
function useScope(scope) {
|
|
264
|
-
|
|
265
|
-
return useContext(context);
|
|
323
|
+
return useContext(getScopeContext(scope));
|
|
266
324
|
}
|
|
267
325
|
function useScopeStore(scope, ...args) {
|
|
268
|
-
|
|
269
|
-
return useStore(store, ...args);
|
|
326
|
+
return useStore(useScope(scope), ...args);
|
|
270
327
|
}
|
|
271
328
|
function useScopeProp(scope, ...args) {
|
|
272
|
-
|
|
273
|
-
return useProp(store, ...args);
|
|
329
|
+
return useProp(useScope(scope), ...args);
|
|
274
330
|
}
|
|
275
331
|
|
|
276
332
|
//#endregion
|
|
@@ -311,5 +367,5 @@ const storeMethods = {
|
|
|
311
367
|
};
|
|
312
368
|
|
|
313
369
|
//#endregion
|
|
314
|
-
export {
|
|
315
|
-
//# sourceMappingURL=storeMethods-
|
|
370
|
+
export { useProp as a, cacheMethods as c, useLoadingBoundary as d, useStore as f, useScope as i, useCache as l, scopeMethods as n, useLatestFunction as o, useMemoEquals as p, ScopeProvider as r, useLatestRef as s, storeMethods as t, LoadingBoundary as u };
|
|
371
|
+
//# sourceMappingURL=storeMethods-CQhXlHpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeMethods-CQhXlHpl.js","names":["equals","selectorRaw: Selector<T, S> | AnyPath | undefined","allOptions: UseStoreOptions<S>","selector","value","_listener: (value: any) => void","lastObservedValue: any","revoke: (() => void) | undefined","rootCache: Cache<any, any>","selector","selector: Selector<T, S> | AnyPath | undefined","updater: ((value: S) => Update<T>) | undefined","options: UseStoreOptions<S> | undefined","_store: Store<any>","scopeMethods: {\n useScope: typeof boundUseScope;\n useStore: typeof boundUseScopeStore;\n useProp: typeof boundUseScopeProp;\n Provider: typeof Provider;\n}","storeMethods: {\n useStore: typeof boundUseStore;\n useProp: typeof boundUseProp;\n}"],"sources":["../src/lib/trackingProxy.ts","../src/react/lib/useMemoEquals.ts","../src/react/useStore.ts","../src/react/loadingBoundary.tsx","../src/react/useCache.ts","../src/react/cacheMethods.ts","../src/react/lib/useLatestRef.ts","../src/react/lib/useLatestFunction.ts","../src/react/useProp.ts","../src/react/scope.tsx","../src/react/scopeMethods.ts","../src/react/storeMethods.ts"],"sourcesContent":["import { isPlainObject } from '@lib/helpers';\nimport { deepEqual } from './equals';\n\nconst unwrapProxySymbol = /* @__PURE__ */ Symbol('unwrapProxy');\n\nexport type TrackingProxy<T> = [value: T, equals: (newValue: T) => boolean, revoke?: () => void];\ntype Object_ = Record<string | symbol, unknown>;\n\nexport function trackingProxy<T>(\n value: T,\n equals: (a: any, b: any) => boolean = deepEqual,\n): TrackingProxy<T> {\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [value, (other) => equals(value, other)];\n }\n\n // Unpack proxies, we don't want to nest them\n value = (value as any)[unwrapProxySymbol] ?? value;\n\n const deps = new Array<TrackingProxy<any>[1]>();\n const revokations = new Array<() => void>();\n let revoked = false;\n\n function trackComplexProp(function_: any, ...args: any[]) {\n const [proxiedValue, equals, revoke] = trackingProxy(function_(value, ...args));\n\n deps.push((otherValue) => {\n if (!isPlainObject(otherValue) && !Array.isArray(otherValue)) {\n return false;\n }\n\n return equals(function_(otherValue, ...args));\n });\n\n if (revoke) {\n revokations.push(revoke);\n }\n\n return proxiedValue;\n }\n\n function trackSimpleProp(function_: any, ...args: any[]) {\n const calculatedValue = function_(value, ...args);\n\n deps.push((otherValue) => {\n return function_(otherValue, ...args) === calculatedValue;\n });\n\n return calculatedValue;\n }\n\n const proxy = new Proxy(value as T & Object_, {\n get(target, p, receiver) {\n if (p === unwrapProxySymbol) {\n return value;\n }\n\n if (revoked) {\n return target[p];\n }\n\n const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};\n if (writable === false && configurable === false) {\n return target[p];\n }\n\n return trackComplexProp(Reflect.get, p, receiver);\n },\n\n getOwnPropertyDescriptor(target, p) {\n const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};\n if (writable === false && configurable === false) {\n return Reflect.getOwnPropertyDescriptor(target, p);\n }\n\n return trackComplexProp(Reflect.getOwnPropertyDescriptor, p);\n },\n\n ownKeys() {\n return trackComplexProp(Reflect.ownKeys);\n },\n\n getPrototypeOf() {\n return trackSimpleProp(Reflect.getPrototypeOf);\n },\n\n has(_target, p) {\n return trackSimpleProp(Reflect.has, p);\n },\n\n isExtensible() {\n return trackSimpleProp(Reflect.isExtensible);\n },\n });\n\n return [\n proxy,\n (other) => !!other && deps.every((equals) => equals(other)),\n () => {\n revoked = true;\n revokations.forEach((revoke) => revoke());\n },\n ];\n}\n","import { deepEqual } from '@lib/equals';\nimport { useEffect, useRef } from 'react';\n\nexport default function useMemoEquals<T>(value: T, equals: (a: T, b: T) => boolean = deepEqual): T {\n const ref = useRef<{ value: T }>(undefined);\n const hasChanged = !ref.current || !equals(ref.current.value, value);\n\n useEffect(() => {\n if (hasChanged) {\n ref.current = { value };\n }\n });\n\n return hasChanged ? value : ref.current!.value;\n}\n","import type { Selector, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual } from '@lib/equals';\nimport { makeSelector } from '@lib/makeSelector';\nimport { isAnyPath, type AnyPath, type Path, type Value } from '@lib/path';\nimport { trackingProxy } from '@lib/trackingProxy';\nimport useMemoEquals from '@react/lib/useMemoEquals';\nimport {\n useCallback,\n useDebugValue,\n useLayoutEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react';\n\nexport interface UseStoreOptions<S> extends Omit<SubscribeOptions, 'runNow' | 'passive'> {\n /**\n * If true, the cache content can be consumed but no fetch will be triggered.\n * @default false\n */\n passive?: boolean;\n\n disableTrackingProxy?: boolean;\n\n withViewTransition?: boolean | ((value: S) => unknown);\n}\n\nexport function useStore<T, S>(\n store: Store<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nexport function useStore<T, const P>(\n store: Store<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nexport function useStore<T>(store: Store<T>, option?: UseStoreOptions<T>): T;\n\nexport function useStore<T, S>(\n store: Store<T>,\n ...args: [Selector<T, S> | AnyPath, UseStoreOptions<S>?] | [UseStoreOptions<S>?]\n): S {\n let selectorRaw: Selector<T, S> | AnyPath | undefined;\n let allOptions: UseStoreOptions<S>;\n\n if (typeof args[0] === 'function' || isAnyPath(args[0])) {\n selectorRaw = args[0];\n allOptions = args[1] ?? {};\n } else {\n allOptions = args[0] ?? {};\n }\n\n const selector = useMemo(() => makeSelector<T, S>(selectorRaw), [selectorRaw]);\n const lastEqualsRef = useRef<(newValue: S) => boolean | undefined>(undefined);\n\n if (store.derivedFrom) {\n return useStore(\n store.derivedFrom.store,\n (value) => {\n for (const selector of store.derivedFrom!.selectors) {\n value = makeSelector(selector)(value);\n }\n return selector(value);\n },\n allOptions,\n );\n }\n\n const {\n disableTrackingProxy = true,\n equals = store.options.equals ?? deepEqual,\n withViewTransition,\n ...options\n } = allOptions;\n\n const snapshot = useRef<{ storeValue: T; selectedValue: S }>(undefined);\n\n const get = useCallback(() => {\n const storeValue = store.get();\n const selectedValue = selector(storeValue);\n\n const hasChanged =\n !snapshot.current ||\n (storeValue !== snapshot.current.storeValue &&\n !(lastEqualsRef.current?.(selectedValue) ?? false));\n\n if (hasChanged) {\n snapshot.current = { storeValue, selectedValue };\n }\n\n return snapshot.current!.selectedValue;\n }, [store, selector]);\n\n const subOptions = useMemoEquals({ ...options, runNow: false });\n\n const subscribe = useCallback(\n (listener: () => void) => {\n let _listener: (value: any) => void = listener;\n let stopped = false;\n\n if (withViewTransition && (document as any).startViewTransition) {\n let lastObservedValue: any;\n\n _listener = (value: any) => {\n const observedValue =\n withViewTransition instanceof Function ? withViewTransition(value) : value;\n\n if (equals(lastObservedValue, observedValue)) {\n listener();\n return;\n }\n\n lastObservedValue = observedValue;\n\n let hasChanges = false;\n const mutationObserver = new MutationObserver(() => {\n hasChanges = true;\n mutationObserver.disconnect();\n });\n mutationObserver.observe(document.body, { childList: true, subtree: true });\n\n (document as any).startViewTransition(() => {\n mutationObserver.disconnect();\n\n if (!stopped) {\n listener();\n }\n\n if (!hasChanges) {\n throw new Error('no change');\n }\n });\n };\n }\n\n const cancel = store.subscribe(_listener, subOptions);\n return () => {\n stopped = true;\n cancel();\n };\n },\n [store, withViewTransition, equals, subOptions],\n );\n\n let value = useSyncExternalStore<S>(subscribe, get, get);\n let lastEquals = (newValue: S) => equals(newValue, value);\n let revoke: (() => void) | undefined;\n\n if (!disableTrackingProxy) {\n [value, lastEquals, revoke] = trackingProxy(value, equals);\n }\n\n useLayoutEffect(() => {\n lastEqualsRef.current = lastEquals;\n revoke?.();\n });\n\n useDebugValue(value);\n return value;\n}\n","import { createStore } from '@core';\nimport { useStore } from '@react/useStore';\nimport { createContext, useContext, useLayoutEffect, useMemo, type ReactNode } from 'react';\n\nexport interface LoadingBoundaryEntry {\n label?: ReactNode;\n}\n\nexport interface LoadingBoundaryProps {\n /**\n * Fallback node to render when there are loading components within the boundary.\n */\n fallback?: ReactNode | ((entries: LoadingBoundaryEntry[]) => ReactNode);\n\n /**\n * Child node to render when there are no loading components within the boundary.\n */\n children?: ReactNode;\n\n /**\n * Add a loading state from outside the boundary. Useful for when you want to\n * show a loading state for a component that is not a child of the boundary.\n */\n isLoading?: boolean;\n}\n\nconst LoadingBoundaryContext = createContext(createStore(new Set<LoadingBoundaryEntry>()));\n\nexport function LoadingBoundary({\n fallback,\n children,\n isLoading: isLoadingExternal,\n}: LoadingBoundaryProps): React.JSX.Element {\n const store = useMemo(() => createStore(new Set<LoadingBoundaryEntry>()), []);\n const entries = useStore(store);\n const isLoading = entries.size > 0 || isLoadingExternal;\n\n const fallbackNode = isLoading\n ? typeof fallback === 'function'\n ? fallback([...entries])\n : fallback\n : undefined;\n\n return (\n <LoadingBoundaryContext.Provider value={store}>\n {fallbackNode !== undefined ? (\n <>\n {fallbackNode}\n <div style={{ display: 'none' }}>{children}</div>\n </>\n ) : (\n children\n )}\n </LoadingBoundaryContext.Provider>\n );\n}\n\nexport function useLoadingBoundary(isLoading: boolean | undefined, label?: ReactNode): void {\n const store = useContext(LoadingBoundaryContext);\n\n useLayoutEffect(() => {\n if (!isLoading) {\n return;\n }\n\n const entry = { label };\n store.set((entries) => new Set(entries).add(entry));\n\n return () => {\n store.set((entries) => {\n const newEntries = new Set(entries);\n newEntries.delete(entry);\n return newEntries;\n });\n };\n // oxlint-disable-next-line exhaustive-deps\n }, [store, isLoading]);\n}\n","import type { Cache } from '@core';\nimport type { CacheState } from '@lib/cacheState';\nimport { makeSelector } from '@lib/makeSelector';\nimport { useLoadingBoundary } from '@react/loadingBoundary';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { useStore, type UseStoreOptions } from './useStore';\n\nexport type UseCacheArray<T> = [\n value: T | undefined,\n error: unknown | undefined,\n isUpdating: boolean,\n isStale: boolean,\n];\n\nexport type UseCacheValue<T> = UseCacheArray<T> & CacheState<T>;\n\nexport interface UseCacheOptions<T> extends UseStoreOptions<UseCacheArray<T> & CacheState<T>> {\n /**\n * If true, will always return undefined as value and no fetch will be triggered.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * If true, the cache will be invalidated when the component mounts.\n * @default false\n */\n updateOnMount?: boolean;\n\n /**\n * If true, `useCache` will throw a promise when the cache is pending. This can be used with React Suspense.\n * @see https://react.dev/reference/react/Suspense\n * @default false\n */\n suspense?: boolean;\n\n /**\n * If true, `useCache` will register its loading state with the nearest `LoadingBoundary`.\n * @default false\n */\n loadingBoundary?: boolean;\n}\n\nexport function useCache<T>(\n cache: Cache<T, any>,\n {\n passive,\n disabled,\n updateOnMount,\n withViewTransition,\n suspense,\n loadingBoundary,\n ...options\n }: UseCacheOptions<T> = {},\n): UseCacheValue<T> {\n if (withViewTransition === true) {\n withViewTransition = (state) => state.value;\n }\n\n const { rootCache, selector } = useMemo(() => {\n const rootCache: Cache<any, any> = cache.derivedFromCache?.cache ?? cache;\n let selector = (x: any) => x;\n\n if (cache.derivedFromCache) {\n selector = (value: any) => {\n for (const s of cache.derivedFromCache!.selectors) {\n value = makeSelector(s)(value);\n }\n return value;\n };\n }\n\n return { rootCache, selector };\n }, [cache]);\n\n const hasMounted = useRef(false);\n\n useEffect(() => {\n hasMounted.current = true;\n\n if (updateOnMount) {\n rootCache.invalidate();\n }\n // oxlint-disable-next-line exhaustive-deps\n }, []);\n\n const result = useStore(\n rootCache.state,\n (state) => {\n if (disabled) {\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [undefined, undefined, false, false],\n { status: 'pending', isUpdating: false, isStale: false, isConnected: false },\n );\n }\n\n const isStale = updateOnMount && !hasMounted.current ? true : state.isStale;\n try {\n const value = state.status === 'value' ? selector(state.value) : undefined;\n\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [value, state.error, state.isUpdating, isStale],\n { ...state, value, isStale },\n );\n } catch (error) {\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [undefined, error, state.isUpdating, isStale],\n {\n status: 'error',\n error,\n isUpdating: state.isUpdating,\n isStale: isStale,\n isConnected: state.isConnected,\n },\n );\n }\n },\n { ...options, withViewTransition, passive: passive || disabled },\n );\n\n useEffect(\n () => rootCache.subscribe(() => undefined, { passive: passive || disabled }),\n [rootCache, passive, disabled],\n );\n\n useLoadingBoundary(loadingBoundary && !disabled && result.status === 'pending');\n\n if (suspense && result.status === 'pending') {\n throw rootCache.get();\n }\n\n return result;\n}\n","import type { Cache } from '@core';\nimport { type UseCacheOptions, type UseCacheValue, useCache } from '@react/useCache';\n\nexport const cacheMethods = {\n useCache<T>(this: Cache<T, any>, options?: UseCacheOptions<T>): UseCacheValue<T> {\n return useCache(this, options);\n },\n};\n","import { useEffect, useRef } from 'react';\n\nexport default function useLatestRef<T>(value: T): { current: T } {\n const ref = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n}\n","import useLatestRef from '@react/lib/useLatestRef';\n\nexport default function useLatestFunction<Args extends any[], R>(\n fn: (...args: Args) => R,\n): (...args: Args) => R {\n const ref = useLatestRef(fn);\n\n return (...args: Args) => {\n return ref.current(...args);\n };\n}\n","import { type Selector, type Update } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport { isAnyPath, type AnyPath, type SettablePath, type Value } from '@lib/path';\nimport useLatestFunction from '@react/lib/useLatestFunction';\nimport { useStore, type UseStoreOptions } from './useStore';\n\nexport function useProp<T, S>(\n store: Store<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nexport function useProp<T, const P>(\n store: Store<T>,\n selector: Constrain<P, SettablePath<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nexport function useProp<T>(\n store: Store<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nexport function useProp<T, S>(\n store: Store<T>,\n ...args:\n | [Selector<T, S>, (value: S) => Update<T>, UseStoreOptions<S>?]\n | [AnyPath, UseStoreOptions<Value<T, any>>?]\n | [UseStoreOptions<S>?]\n): [value: S, setValue: Store<S>['set']] {\n let selector: Selector<T, S> | AnyPath | undefined;\n let updater: ((value: S) => Update<T>) | undefined;\n let options: UseStoreOptions<S> | undefined;\n\n if (typeof args[0] === 'function' || isAnyPath(args[0])) {\n selector = args[0];\n if (typeof args[1] === 'function') {\n updater = args[1];\n options = args[2];\n } else {\n options = args[1];\n }\n } else {\n options = args[0];\n }\n\n const value = useStore(store, (selector ?? ((x) => x)) as Selector<T, S>, options);\n\n const update = useLatestFunction((update) => {\n let _store: Store<any> = store;\n if (selector) {\n _store = _store.map(selector as Selector<any, any>, updater);\n }\n\n _store.set(update);\n });\n\n return [value, update];\n}\n","import type { Scope, Selector, Update } from '@core';\nimport { createStore, type Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { createContext, useContext, useMemo, type Context, type ReactNode } from 'react';\nimport { useProp } from './useProp';\nimport { useStore, type UseStoreOptions } from './useStore';\n\nexport type ScopeProps<T> = { scope: Scope<T>; store?: Store<T>; children?: ReactNode };\n\ndeclare module '..' {\n interface Scope<T> {\n context?: Context<Store<T>>;\n }\n}\n\nfunction getScopeContext<T>(scope: Scope<T>): Context<Store<T>> {\n scope.context ??= createContext<Store<T>>(createStore(scope.defaultValue));\n return scope.context;\n}\n\nexport function ScopeProvider<T>({\n scope,\n store: inputStore,\n children,\n}: ScopeProps<T>): React.JSX.Element {\n const context = getScopeContext(scope);\n const currentStore = useMemo(\n () => inputStore ?? createStore(scope.defaultValue),\n [scope, inputStore],\n );\n\n return <context.Provider value={currentStore}>{children}</context.Provider>;\n}\n\nexport function useScope<T>(scope: Scope<T>): Store<T> {\n const context = getScopeContext(scope);\n return useContext(context);\n}\n\nexport function useScopeStore<T, S>(\n scope: Scope<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nexport function useScopeStore<T, const P>(\n scope: Scope<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nexport function useScopeStore<T>(scope: Scope<T>, option?: UseStoreOptions<T>): T;\n\nexport function useScopeStore<T>(scope: Scope<T>, ...args: any[]): T {\n const store = useScope(scope);\n return useStore(store, ...args);\n}\n\nexport function useScopeProp<T, S>(\n scope: Scope<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nexport function useScopeProp<T, const P>(\n scope: Scope<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nexport function useScopeProp<T>(\n scope: Scope<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nexport function useScopeProp<T>(\n scope: Scope<T>,\n ...args: any[]\n): [value: T, setValue: Store<T>['set']] {\n const store = useScope(scope);\n return useProp(store, ...args);\n}\n","import type { Scope, Selector, Store, Update } from '@core';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport {\n ScopeProvider,\n useScope,\n useScopeProp,\n useScopeStore,\n type ScopeProps,\n} from '@react/scope';\nimport type { UseStoreOptions } from '@react/useStore';\n\nfunction boundUseScope<T>(this: Scope<T>): Store<T> {\n return useScope(this);\n}\n\nfunction boundUseScopeStore<T, S>(\n this: Scope<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nfunction boundUseScopeStore<T, const P>(\n this: Scope<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nfunction boundUseScopeStore<T>(this: Scope<T>, option?: UseStoreOptions<T>): T;\n\nfunction boundUseScopeStore(this: Scope<any>, ...args: any[]) {\n return useScopeStore(this, ...args);\n}\n\nfunction boundUseScopeProp<T, S>(\n this: Scope<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nfunction boundUseScopeProp<T, const P>(\n this: Scope<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nfunction boundUseScopeProp<T>(\n this: Scope<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nfunction boundUseScopeProp(this: Scope<any>, ...args: any[]) {\n return useScopeProp(this, ...args);\n}\n\nfunction Provider<T>(this: Scope<T>, props: Omit<ScopeProps<T>, 'scope'>): React.JSX.Element {\n return ScopeProvider({ ...props, scope: this });\n}\n\nexport const scopeMethods: {\n useScope: typeof boundUseScope;\n useStore: typeof boundUseScopeStore;\n useProp: typeof boundUseScopeProp;\n Provider: typeof Provider;\n} = {\n useScope: boundUseScope,\n useStore: boundUseScopeStore,\n useProp: boundUseScopeProp,\n Provider,\n};\n","import type { Selector, Store, Update } from '@core';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { useProp } from '@react/useProp';\nimport { type UseStoreOptions, useStore } from '@react/useStore';\n\nfunction boundUseStore<T, S>(\n this: Store<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\nfunction boundUseStore<T, const P>(\n this: Store<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\nfunction boundUseStore<T>(this: Store<T>, option?: UseStoreOptions<T>): T;\nfunction boundUseStore(this: Store<any>, ...args: any[]) {\n return useStore(this, ...args);\n}\n\nfunction boundUseProp<T, S>(\n this: Store<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\nfunction boundUseProp<T, const P>(\n this: Store<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\nfunction boundUseProp<T>(\n this: Store<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\nfunction boundUseProp(this: Store<any>, ...args: any[]) {\n return useProp(this, ...args);\n}\n\nexport const storeMethods: {\n useStore: typeof boundUseStore;\n useProp: typeof boundUseProp;\n} = {\n useStore: boundUseStore,\n useProp: boundUseProp,\n};\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { m as CacheState, r as Cache, t as Scope } from "./scope-DJXSRsGy.js";
|
|
2
|
+
import { B as Value, C as Selector, K as Constrain, N as Path, T as Update, r as Store, w as SubscribeOptions } from "./store-BRHFhRPm.js";
|
|
3
3
|
import { Context, ReactNode } from "react";
|
|
4
4
|
|
|
5
5
|
//#region src/react/useStore.d.ts
|
|
@@ -103,5 +103,5 @@ declare const storeMethods: {
|
|
|
103
103
|
useProp: typeof boundUseProp;
|
|
104
104
|
};
|
|
105
105
|
//#endregion
|
|
106
|
-
export {
|
|
107
|
-
//# sourceMappingURL=storeMethods-
|
|
106
|
+
export { useScope as a, UseCacheValue as c, useStore as d, ScopeProvider as i, useCache as l, scopeMethods as n, cacheMethods as o, ScopeProps as r, UseCacheArray as s, storeMethods as t, UseStoreOptions as u };
|
|
107
|
+
//# sourceMappingURL=storeMethods-Dsz0-Cda.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { m as CacheState, r as Cache, t as Scope } from "./scope-CESkVNvI.cjs";
|
|
2
|
+
import { B as Value, C as Selector, K as Constrain, N as Path, T as Update, r as Store, w as SubscribeOptions } from "./store-XcnTdeiJ.cjs";
|
|
3
3
|
import { Context, ReactNode } from "react";
|
|
4
4
|
|
|
5
5
|
//#region src/react/useStore.d.ts
|
|
@@ -103,5 +103,5 @@ declare const storeMethods: {
|
|
|
103
103
|
useProp: typeof boundUseProp;
|
|
104
104
|
};
|
|
105
105
|
//#endregion
|
|
106
|
-
export {
|
|
107
|
-
//# sourceMappingURL=storeMethods-
|
|
106
|
+
export { useScope as a, UseCacheValue as c, useStore as d, ScopeProvider as i, useCache as l, scopeMethods as n, cacheMethods as o, ScopeProps as r, UseCacheArray as s, storeMethods as t, UseStoreOptions as u };
|
|
107
|
+
//# sourceMappingURL=storeMethods-y3PlfTHV.d.cts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cross-state",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "(React) state library",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"repository": "schummar/cross-state",
|
|
@@ -66,8 +66,7 @@
|
|
|
66
66
|
"lint": "runp -i lint:*",
|
|
67
67
|
"lint:prettier": "prettier -l src",
|
|
68
68
|
"lint:oxlint": "oxlint",
|
|
69
|
-
"lint:
|
|
70
|
-
"lint:tsc:tests": "tsc --noEmit --emitDeclarationOnly false -p test/tsconfig.json",
|
|
69
|
+
"lint:ts": "tsgo --noEmit --emitDeclarationOnly false",
|
|
71
70
|
"size": "size-limit",
|
|
72
71
|
"prepublishOnly": "runp -i lint test build :p size publint",
|
|
73
72
|
"test": "vitest run --coverage",
|
|
@@ -76,65 +75,55 @@
|
|
|
76
75
|
"test:export": "pnpm test:watch run --coverage --reporter=verbose --reporter=junit --outputFile=test/testResults.xml"
|
|
77
76
|
},
|
|
78
77
|
"peerDependencies": {
|
|
79
|
-
"@types/react": ">=16.8.0",
|
|
80
78
|
"mutative": ">=1.0.3",
|
|
81
|
-
"react": ">=
|
|
82
|
-
"use-sync-external-store": "1.5.0"
|
|
79
|
+
"react": ">=18.0.0"
|
|
83
80
|
},
|
|
84
81
|
"peerDependenciesMeta": {
|
|
85
|
-
"@types/react": {
|
|
86
|
-
"optional": true
|
|
87
|
-
},
|
|
88
82
|
"mutative": {
|
|
89
83
|
"optional": true
|
|
90
84
|
},
|
|
91
85
|
"react": {
|
|
92
86
|
"optional": true
|
|
93
|
-
},
|
|
94
|
-
"use-sync-external-store": {
|
|
95
|
-
"optional": true
|
|
96
87
|
}
|
|
97
88
|
},
|
|
98
89
|
"devDependencies": {
|
|
99
90
|
"@emotion/styled": "11.14.1",
|
|
100
|
-
"@mantine/core": "8.
|
|
101
|
-
"@mantine/hooks": "^8.
|
|
102
|
-
"@mui/material": "7.3.
|
|
91
|
+
"@mantine/core": "8.3.6",
|
|
92
|
+
"@mantine/hooks": "^8.3.6",
|
|
93
|
+
"@mui/material": "7.3.4",
|
|
103
94
|
"@schummar/prettier-config": "github:schummar/prettier-config",
|
|
104
95
|
"@schummar/runp": "2.2.2",
|
|
105
96
|
"@size-limit/preset-small-lib": "11.2.0",
|
|
106
97
|
"@testing-library/react": "16.3.0",
|
|
107
|
-
"@types/react": "19.
|
|
108
|
-
"@types/react-dom": "19.
|
|
98
|
+
"@types/react": "19.2.2",
|
|
99
|
+
"@types/react-dom": "19.2.2",
|
|
109
100
|
"@types/seedrandom": "3.0.8",
|
|
110
|
-
"@types/use-sync-external-store": "1.5.0",
|
|
111
101
|
"@types/ws": "8.18.1",
|
|
112
|
-
"@
|
|
113
|
-
"@
|
|
114
|
-
"@vitest/
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
102
|
+
"@typescript/native-preview": "7.0.0-dev.20251029.1",
|
|
103
|
+
"@vitejs/plugin-react": "5.1.0",
|
|
104
|
+
"@vitest/coverage-v8": "4.0.5",
|
|
105
|
+
"@vitest/ui": "^4.0.5",
|
|
106
|
+
"esbuild": "0.25.11",
|
|
107
|
+
"happy-dom": "20.0.10",
|
|
108
|
+
"jsdom": "27.0.1",
|
|
109
|
+
"mutative": "^1.3.0",
|
|
110
|
+
"oxlint": "^1.24.0",
|
|
120
111
|
"prettier": "3.6.2",
|
|
121
|
-
"publint": "0.3.
|
|
122
|
-
"react": "^19.
|
|
123
|
-
"react-dom": "^19.
|
|
112
|
+
"publint": "0.3.15",
|
|
113
|
+
"react": "^19.2.0",
|
|
114
|
+
"react-dom": "^19.2.0",
|
|
124
115
|
"rimraf": "6.0.1",
|
|
125
116
|
"seedrandom": "3.0.5",
|
|
126
|
-
"semantic-release": "
|
|
117
|
+
"semantic-release": "25.0.1",
|
|
127
118
|
"size-limit": "11.2.0",
|
|
128
|
-
"tsdown": "^0.
|
|
129
|
-
"
|
|
130
|
-
"use-sync-external-store": "^1.5.0",
|
|
131
|
-
"vite": "7.1.4",
|
|
119
|
+
"tsdown": "^0.15.11",
|
|
120
|
+
"vite": "^7.1.12",
|
|
132
121
|
"vite-tsconfig-paths": "5.1.4",
|
|
133
|
-
"vitest": "
|
|
122
|
+
"vitest": "4.0.5"
|
|
134
123
|
},
|
|
135
124
|
"volta": {
|
|
136
|
-
"node": "
|
|
137
|
-
"pnpm": "10.
|
|
125
|
+
"node": "24.11.0",
|
|
126
|
+
"pnpm": "10.20.0"
|
|
138
127
|
},
|
|
139
128
|
"prettier": "@schummar/prettier-config",
|
|
140
129
|
"size-limit": [
|
package/dist/hash-DNFM5y_h.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { isPlainObject } from "./propAccess-B260LXN1.js";
|
|
2
|
-
|
|
3
|
-
//#region src/lib/hash.ts
|
|
4
|
-
const hash = Symbol("hash");
|
|
5
|
-
function hasHashFunction(value) {
|
|
6
|
-
return typeof value === "object" && value !== null && hash in value && typeof value[hash] === "function" && value[hash].length === 0;
|
|
7
|
-
}
|
|
8
|
-
function simpleHash(value) {
|
|
9
|
-
if (hasHashFunction(value)) return value[hash]();
|
|
10
|
-
if (value instanceof Set) return `s[${[...value].map(simpleHash).sort().join(",")}]`;
|
|
11
|
-
if (value instanceof Map) return `m[${[...value.entries()].map(simpleHash).sort().join(",")}]`;
|
|
12
|
-
if (Array.isArray(value)) return `[${value.map(simpleHash).join(",")}]`;
|
|
13
|
-
if (isPlainObject(value)) return `o[${Object.entries(value).map(simpleHash).sort().join(",")}]`;
|
|
14
|
-
return JSON.stringify(value);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
//#endregion
|
|
18
|
-
export { hash, simpleHash };
|
|
19
|
-
//# sourceMappingURL=hash-DNFM5y_h.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hash-DNFM5y_h.js","names":["hash: unique symbol"],"sources":["../src/lib/hash.ts"],"sourcesContent":["import { isPlainObject } from '@lib/helpers';\n\nexport interface Hashable {\n [hash](): string;\n}\n\nexport const hash: unique symbol = Symbol('hash');\n\nfunction hasHashFunction(value: unknown): value is Hashable {\n return (\n typeof value === 'object' &&\n value !== null &&\n hash in value &&\n typeof (value as any)[hash] === 'function' &&\n (value as any)[hash].length === 0\n );\n}\n\nexport function simpleHash(value: unknown): string {\n if (hasHashFunction(value)) {\n return value[hash]();\n }\n\n if (value instanceof Set) {\n return `s[${[...value].map(simpleHash).sort().join(',')}]`;\n }\n\n if (value instanceof Map) {\n return `m[${[...value.entries()].map(simpleHash).sort().join(',')}]`;\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(simpleHash).join(',')}]`;\n }\n\n if (isPlainObject(value)) {\n return `o[${Object.entries(value).map(simpleHash).sort().join(',')}]`;\n }\n\n return JSON.stringify(value);\n}\n"],"mappings":";;;AAMA,MAAaA,OAAsB,OAAO;AAE1C,SAAS,gBAAgB,OAAmC;AAC1D,QACE,OAAO,UAAU,YACjB,UAAU,QACV,QAAQ,SACR,OAAQ,MAAc,UAAU,cAC/B,MAAc,MAAM,WAAW;;AAIpC,SAAgB,WAAW,OAAwB;AACjD,KAAI,gBAAgB,OAClB,QAAO,MAAM;AAGf,KAAI,iBAAiB,IACnB,QAAO,KAAK,CAAC,GAAG,OAAO,IAAI,YAAY,OAAO,KAAK,KAAK;AAG1D,KAAI,iBAAiB,IACnB,QAAO,KAAK,CAAC,GAAG,MAAM,WAAW,IAAI,YAAY,OAAO,KAAK,KAAK;AAGpE,KAAI,MAAM,QAAQ,OAChB,QAAO,IAAI,MAAM,IAAI,YAAY,KAAK,KAAK;AAG7C,KAAI,cAAc,OAChB,QAAO,KAAK,OAAO,QAAQ,OAAO,IAAI,YAAY,OAAO,KAAK,KAAK;AAGrE,QAAO,KAAK,UAAU"}
|
package/dist/hash-Dv3XlmHn.cjs
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
const require_propAccess = require('./propAccess-BdLsqViO.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/lib/hash.ts
|
|
4
|
-
const hash = Symbol("hash");
|
|
5
|
-
function hasHashFunction(value) {
|
|
6
|
-
return typeof value === "object" && value !== null && hash in value && typeof value[hash] === "function" && value[hash].length === 0;
|
|
7
|
-
}
|
|
8
|
-
function simpleHash(value) {
|
|
9
|
-
if (hasHashFunction(value)) return value[hash]();
|
|
10
|
-
if (value instanceof Set) return `s[${[...value].map(simpleHash).sort().join(",")}]`;
|
|
11
|
-
if (value instanceof Map) return `m[${[...value.entries()].map(simpleHash).sort().join(",")}]`;
|
|
12
|
-
if (Array.isArray(value)) return `[${value.map(simpleHash).join(",")}]`;
|
|
13
|
-
if (require_propAccess.isPlainObject(value)) return `o[${Object.entries(value).map(simpleHash).sort().join(",")}]`;
|
|
14
|
-
return JSON.stringify(value);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
//#endregion
|
|
18
|
-
Object.defineProperty(exports, 'hash', {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
get: function () {
|
|
21
|
-
return hash;
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
Object.defineProperty(exports, 'simpleHash', {
|
|
25
|
-
enumerable: true,
|
|
26
|
-
get: function () {
|
|
27
|
-
return simpleHash;
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
//# sourceMappingURL=hash-Dv3XlmHn.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hash-Dv3XlmHn.cjs","names":["hash: unique symbol","isPlainObject"],"sources":["../src/lib/hash.ts"],"sourcesContent":["import { isPlainObject } from '@lib/helpers';\n\nexport interface Hashable {\n [hash](): string;\n}\n\nexport const hash: unique symbol = Symbol('hash');\n\nfunction hasHashFunction(value: unknown): value is Hashable {\n return (\n typeof value === 'object' &&\n value !== null &&\n hash in value &&\n typeof (value as any)[hash] === 'function' &&\n (value as any)[hash].length === 0\n );\n}\n\nexport function simpleHash(value: unknown): string {\n if (hasHashFunction(value)) {\n return value[hash]();\n }\n\n if (value instanceof Set) {\n return `s[${[...value].map(simpleHash).sort().join(',')}]`;\n }\n\n if (value instanceof Map) {\n return `m[${[...value.entries()].map(simpleHash).sort().join(',')}]`;\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(simpleHash).join(',')}]`;\n }\n\n if (isPlainObject(value)) {\n return `o[${Object.entries(value).map(simpleHash).sort().join(',')}]`;\n }\n\n return JSON.stringify(value);\n}\n"],"mappings":";;;AAMA,MAAaA,OAAsB,OAAO;AAE1C,SAAS,gBAAgB,OAAmC;AAC1D,QACE,OAAO,UAAU,YACjB,UAAU,QACV,QAAQ,SACR,OAAQ,MAAc,UAAU,cAC/B,MAAc,MAAM,WAAW;;AAIpC,SAAgB,WAAW,OAAwB;AACjD,KAAI,gBAAgB,OAClB,QAAO,MAAM;AAGf,KAAI,iBAAiB,IACnB,QAAO,KAAK,CAAC,GAAG,OAAO,IAAI,YAAY,OAAO,KAAK,KAAK;AAG1D,KAAI,iBAAiB,IACnB,QAAO,KAAK,CAAC,GAAG,MAAM,WAAW,IAAI,YAAY,OAAO,KAAK,KAAK;AAGpE,KAAI,MAAM,QAAQ,OAChB,QAAO,IAAI,MAAM,IAAI,YAAY,KAAK,KAAK;AAG7C,KAAIC,iCAAc,OAChB,QAAO,KAAK,OAAO,QAAQ,OAAO,IAAI,YAAY,OAAO,KAAK,KAAK;AAGrE,QAAO,KAAK,UAAU"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"persist-CLgS5Cqw.js","names":["value","entries: Map<KeyType, unknown>","path","store: Store<T>","options: PersistOptions<T>","path","value"],"sources":["../src/lib/promiseChain.ts","../src/persist/persistPathHelpers.ts","../src/persist/persistStorage.ts","../src/persist/persist.ts"],"sourcesContent":["import isPromise from '@lib/isPromise';\n\nexport interface Chain<T> {\n value: T;\n next<S>(fn: (value: Awaited<T>) => S): T extends Promise<any> ? Chain<Promise<S>> : Chain<S>;\n}\n\nexport default function promiseChain<T>(value: T | (() => T)): Chain<T> {\n if (value instanceof Function) {\n value = value();\n }\n\n return {\n value,\n next(fn) {\n const next = isPromise(value)\n ? value.then((value) => fn(value as Awaited<T>))\n : fn(value as Awaited<T>);\n\n return promiseChain(next) as any;\n },\n };\n}\n","import type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (value: any, path: KeyType[]): { path: KeyType[]; value: unknown }[] => {\n const [first, ...rest] = path;\n if (first === undefined) return [{ path: [], value }];\n\n let entries: Map<KeyType, unknown>;\n if (value instanceof Map) {\n entries = value;\n } else if (value instanceof Set) {\n entries = new Map([...value].map((v, i) => [i, v]));\n } else if (Array.isArray(value)) {\n entries = new Map(value.map((v, i) => [i, v]));\n } else if (typeof value === 'object' && value !== null) {\n entries = new Map(Object.entries(value));\n } else {\n return [{ path: [], value }];\n }\n\n if (first === '*') {\n return [...entries].flatMap(([k, v]) =>\n split(v, rest).map(({ path, value }) => ({ path: [k, ...path], value })),\n );\n }\n\n const subValue = entries.get(first);\n if (subValue === undefined) return [{ path: [], value }];\n\n return split(subValue, rest).map(({ path, value }) => ({ path: [first, ...path], value }));\n};\n","import isPromise from '@lib/isPromise';\nimport promiseChain from '@lib/promiseChain';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<unknown>;\n removeItem: (key: string) => void | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport interface PersistStorageWithListItems extends PersistStorageBase {\n listItems: () => Map<string, string> | Promise<Map<string, string>>;\n}\n\nexport type PersistStorage =\n | PersistStorageWithKeys\n | PersistStorageWithLength\n | PersistStorageWithListItems;\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithListItems {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n listItems() {\n if ('listItems' in storage) {\n return storage.listItems();\n }\n\n return promiseChain(() => {\n if ('keys' in storage) {\n return storage.keys();\n } else {\n return promiseChain(\n storage.length instanceof Function ? storage.length() : storage.length,\n )\n .next((length) => {\n const keys = Array.from({ length }, (_, index) => storage.key(index));\n return keys.some(isPromise) ? Promise.all(keys) : (keys as (string | null)[]);\n })\n .next((keys) => {\n return keys.filter((key): key is string => typeof key === 'string');\n }).value;\n }\n })\n .next((keys) => {\n const results = keys.map(\n (key) =>\n promiseChain(storage.getItem(key)).next((value) => [key, value] as const).value,\n );\n\n return results.some(isPromise)\n ? Promise.all(results)\n : (results as [string, string | null][]);\n })\n .next((results) => {\n return new Map(results.filter(([, value]) => value !== null) as [string, string][]);\n }).value;\n },\n };\n}\n","import { type Cancel, type Duration, type Store } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { shallowEqual } from '@lib/equals';\nimport { fromExtendedJsonString, toExtendedJsonString } from '@lib/extendedJson';\nimport isPromise from '@lib/isPromise';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport promiseChain from '@lib/promiseChain';\nimport { castArrayPath, get, remove, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\nimport { subscribePatches } from '@patches/patchMethods';\nimport { isAncestor, split } from '@persist/persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithListItems,\n} from './persistStorage';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n // throttle?: Duration;\n };\n\ntype Key = { type: 'internal'; path: string } | { type: 'data'; path: KeyType[] };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttle?: Duration;\n persistInitialState?: boolean;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithListItems;\n readonly [Symbol.dispose]!: Cancel;\n\n readonly paths: {\n path: KeyType[];\n throttle?: number;\n }[];\n\n readonly initialized: Promise<void>;\n\n private resolveInitialized?: () => void;\n\n private channel: BroadcastChannel;\n\n private queue = queue();\n\n private handles = new Set<Cancel>();\n\n private stopped = false;\n\n private updateInProgress = new Map<string, unknown>();\n\n private prefix;\n\n constructor(\n public readonly store: Store<T>,\n public readonly options: PersistOptions<T>,\n ) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n this.prefix = `${options.id}:`;\n\n if (Symbol.dispose) {\n this[Symbol.dispose] = () => this.stop();\n }\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttle?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return {\n path: castArrayPath(p),\n throttle: options.throttle && calcDuration(options.throttle),\n };\n }\n\n const _p = p as { path: KeyType[]; throttle?: Duration };\n\n return {\n path: castArrayPath(_p.path),\n throttle:\n (_p.throttle && calcDuration(_p.throttle)) ??\n (options.throttle && calcDuration(options.throttle)),\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({\n path: ['*'],\n throttle: options.throttle && calcDuration(options.throttle),\n });\n }\n\n this.initialized = new Promise((resolve) => {\n this.resolveInitialized = resolve;\n });\n\n this.watchStore();\n this.watchStorage();\n }\n\n private watchStore() {\n const throttle = Math.min(...this.paths.map((p) => p.throttle ?? 0)) || undefined;\n\n const cancel = subscribePatches.apply(this.store as Store<unknown>, [\n (patches, reversePatches) => {\n let i = 0;\n for (const patch of patches) {\n const reversePatch = reversePatches[i++];\n\n const stringPath = JSON.stringify(patch.path);\n if (\n this.updateInProgress.has(stringPath) &&\n this.updateInProgress.get(stringPath) ===\n (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const matchingPaths = this.paths.filter(\n (p) => isAncestor(p.path, patch.path) || isAncestor(patch.path, p.path),\n );\n\n for (const { path } of matchingPaths) {\n if (path.length <= patch.path.length) {\n const pathToSave = patch.path.slice(0, path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n } else if (patch.op === 'remove') {\n const subValues = split(\n reversePatch?.op === 'add' ? reversePatch.value : {},\n path.slice(patch.path.length),\n );\n\n for (const { path } of subValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n } else {\n const updatedValues = split(patch.value, path.slice(patch.path.length));\n const removedValues = split(\n reversePatch?.op !== 'remove' ? (reversePatch?.value ?? {}) : {},\n path.slice(patch.path.length),\n ).filter((v) => !updatedValues.some((u) => shallowEqual(u.path, v.path)));\n\n for (const { path } of updatedValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n for (const { path } of removedValues) {\n this.queue(() => this.save([...patch.path, ...path]), [...patch.path, ...path]);\n }\n }\n }\n }\n },\n { runNow: this.options.persistInitialState ?? false, passive: true, throttle },\n ]);\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n if (!this.options.persistInitialState) {\n let items = this.storage.listItems();\n if (isPromise(items)) {\n items = await items;\n }\n\n if (this.stopped) {\n return;\n }\n\n const toLoad = new Map(\n [...items.entries()]\n .sort((a, b) => b[1].length - a[1].length)\n .map(([key, value]) => [this.parseKey(key), value])\n .filter(([key]) => key) as [Key, string][],\n );\n\n this.queue(() => this.load(toLoad));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load([{ type: 'data', path: event.data }]));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey({ type, path }: Key) {\n return `${this.prefix}${type === 'internal' ? path : JSON.stringify(path)}`;\n }\n\n private parseKey(key: string): Key | undefined {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n key = key.slice(this.prefix.length);\n\n if (!key.startsWith('[')) {\n return { type: 'internal', path: key };\n }\n\n return { type: 'data', path: JSON.parse(key) as KeyType[] };\n }\n\n private load(items: Key[] | Map<Key, string>): void | Promise<void> {\n return promiseChain(() => {\n if (Array.isArray(items)) {\n return promiseChain(() => {\n const entries = items.map(\n (key) =>\n promiseChain(() => {\n return this.storage.getItem(this.buildKey(key));\n }).next((value) => [key, value] as const).value,\n );\n\n return entries.some(isPromise)\n ? Promise.all(entries)\n : (entries as [Key, string | null][]);\n }).next((entries) => {\n return entries.filter((entry) => entry !== null) as [Key, string][];\n }).value;\n } else {\n return [...items.entries()];\n }\n }).next((entries) => {\n if (this.stopped) {\n return;\n }\n\n const toWrite = entries\n .filter(([key, value]) => {\n if (key.type !== 'data' || !value) {\n return;\n }\n\n if (\n !this.paths.find(\n (p) =>\n (p.path.length === 1 && p.path[0] === '*' && key.path.length === 0) ||\n (p.path.length === key.path.length && isAncestor(p.path, key.path)),\n )\n ) {\n return null;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, key.path) || isAncestor(key.path, ref));\n return !inSaveQueue;\n })\n .map(([key, value]) => {\n try {\n return {\n path: key.path,\n value: !value || value === 'undefined' ? undefined : fromExtendedJsonString(value),\n };\n } catch {\n return undefined;\n }\n })\n .filter(Boolean) as { path: KeyType[]; value: unknown }[];\n\n if (toWrite.length > 0) {\n for (const { path, value } of toWrite) {\n this.updateInProgress.set(JSON.stringify(path), value);\n }\n\n this.store.set((state) => {\n for (const { path, value } of toWrite) {\n if (value === undefined) {\n state = remove(state, path as any);\n } else {\n state = set(state, path as any, value);\n }\n }\n\n return state;\n });\n\n this.updateInProgress.clear();\n }\n\n const versionEntry = entries.find(\n ([key]) => key.type === 'internal' && key.path === 'version',\n );\n if (versionEntry) {\n this.store.version = versionEntry[1];\n }\n }).value;\n }\n\n private save(path: KeyType[]): void | Promise<unknown> {\n const key = this.buildKey({ type: 'data', path });\n const value = get(this.store.get() as any, path);\n\n return promiseChain(value)\n .next((value) => {\n if (value === undefined) {\n return this.storage.removeItem(key);\n } else {\n return this.storage.setItem(key, toExtendedJsonString(value));\n }\n })\n .next(() => {\n this.channel.postMessage(path);\n\n if (this.store.version) {\n return this.storage.setItem(\n this.buildKey({ type: 'internal', path: 'version' }),\n this.store.version,\n );\n } else {\n return this.storage.removeItem(this.buildKey({ type: 'internal', path: 'version' }));\n }\n }).value;\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"mappings":"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"}
|