cross-state 0.56.2 → 1.0.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.
- package/dist/{diff-qAkLCsnM.d.ts → diff-CAQaunfv.d.cts} +3 -3
- package/dist/{diff-D7XuntCn.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-Be_XPk5N.d.cts → mutativeMethods-BT1Cim3p.d.ts} +3 -3
- package/dist/{mutativeMethods-DRYtjUcH.d.ts → 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-Dr2OFh02.d.ts → patchMethods-BmyvvHnP.d.cts} +4 -4
- package/dist/{patchMethods-BlYtjRUU.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-DFzbvNoJ.js → persist-Bunx8xfQ.js} +12 -15
- package/dist/persist-Bunx8xfQ.js.map +1 -0
- package/dist/{persist-CR3mhti7.d.cts → persist-CHRYYolx.d.cts} +3 -3
- package/dist/{persist-CQhYPv4d.cjs → persist-DMbVdqS_.cjs} +11 -14
- package/dist/persist-DMbVdqS_.cjs.map +1 -0
- package/dist/{persist-CIEYJ0rO.d.ts → 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-C9JXWddv.cjs → scope-C1bcfK8e.cjs} +32 -7
- package/dist/scope-C1bcfK8e.cjs.map +1 -0
- package/dist/{scope-DkO-RIMy.d.cts → scope-CESkVNvI.d.cts} +3 -3
- package/dist/{scope-Mhr133F_.js → scope-CKGsCVn3.js} +20 -7
- package/dist/scope-CKGsCVn3.js.map +1 -0
- package/dist/{scope-ByLCVzKk.d.ts → scope-DJXSRsGy.d.ts} +3 -3
- package/dist/{store-B3PWCx63.d.cts → store-BRHFhRPm.d.ts} +22 -22
- package/dist/{store-DQcFfgKD.cjs → store-C1NYHLgR.cjs} +13 -14
- package/dist/store-C1NYHLgR.cjs.map +1 -0
- package/dist/{store-BJWoRQIs.d.ts → store-XcnTdeiJ.d.cts} +22 -22
- package/dist/{store-DOEc60aP.js → store-v3RYWzVg.js} +14 -15
- package/dist/store-v3RYWzVg.js.map +1 -0
- package/dist/{storeMethods-YDnpa-6-.cjs → storeMethods-CNu7VD6w.cjs} +135 -60
- package/dist/storeMethods-CNu7VD6w.cjs.map +1 -0
- package/dist/{storeMethods-C7bswcgj.js → storeMethods-CQhXlHpl.js} +115 -59
- package/dist/storeMethods-CQhXlHpl.js.map +1 -0
- package/dist/{storeMethods-Dt_mJTe3.d.cts → storeMethods-Dsz0-Cda.d.ts} +4 -4
- package/dist/{storeMethods-wsbbfJzY.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-CQhYPv4d.cjs.map +0 -1
- package/dist/persist-DFzbvNoJ.js.map +0 -1
- package/dist/scope-C9JXWddv.cjs.map +0 -1
- package/dist/scope-Mhr133F_.js.map +0 -1
- package/dist/store-DOEc60aP.js.map +0 -1
- package/dist/store-DQcFfgKD.cjs.map +0 -1
- package/dist/storeMethods-C7bswcgj.js.map +0 -1
- package/dist/storeMethods-YDnpa-6-.cjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { M as KeyType, V as WildcardPath, b as Duration, g as Cancel, r as Store } from "./store-XcnTdeiJ.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/persist/persistStorage.d.ts
|
|
4
4
|
interface PersistStorageBase {
|
|
@@ -57,5 +57,5 @@ declare class Persist<T> {
|
|
|
57
57
|
}
|
|
58
58
|
declare function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T>;
|
|
59
59
|
//#endregion
|
|
60
|
-
export {
|
|
61
|
-
//# sourceMappingURL=persist-
|
|
60
|
+
export { PersistStorageBase as a, PersistStorageWithListItems as c, PersistStorage as i, PersistOptions as n, PersistStorageWithKeys as o, persist as r, PersistStorageWithLength as s, Persist as t };
|
|
61
|
+
//# sourceMappingURL=persist-CHRYYolx.d.cts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const require_store = require('./store-
|
|
2
|
-
const require_propAccess = require('./propAccess-
|
|
3
|
-
const require_patchMethods = require('./patchMethods-
|
|
4
|
-
const require_extendedJson = require('./extendedJson-
|
|
1
|
+
const require_store = require('./store-C1NYHLgR.cjs');
|
|
2
|
+
const require_propAccess = require('./propAccess-C2AIn9RC.cjs');
|
|
3
|
+
const require_patchMethods = require('./patchMethods-B7Hm5-Qh.cjs');
|
|
4
|
+
const require_extendedJson = require('./extendedJson-ursQ8DbQ.cjs');
|
|
5
5
|
|
|
6
6
|
//#region src/lib/promiseChain.ts
|
|
7
7
|
function promiseChain(value) {
|
|
@@ -9,8 +9,7 @@ function promiseChain(value) {
|
|
|
9
9
|
return {
|
|
10
10
|
value,
|
|
11
11
|
next(fn) {
|
|
12
|
-
|
|
13
|
-
return promiseChain(next);
|
|
12
|
+
return promiseChain(require_store.isPromise(value) ? value.then((value$1) => fn(value$1)) : fn(value));
|
|
14
13
|
}
|
|
15
14
|
};
|
|
16
15
|
}
|
|
@@ -193,8 +192,7 @@ var Persist = class {
|
|
|
193
192
|
const toWrite = entries.filter(([key, value]) => {
|
|
194
193
|
if (key.type !== "data" || !value) return;
|
|
195
194
|
if (!this.paths.find((p) => p.path.length === 1 && p.path[0] === "*" && key.path.length === 0 || p.path.length === key.path.length && isAncestor(p.path, key.path))) return null;
|
|
196
|
-
|
|
197
|
-
return !inSaveQueue;
|
|
195
|
+
return !this.queue.getRefs().find((ref) => isAncestor(ref, key.path) || isAncestor(key.path, ref));
|
|
198
196
|
}).map(([key, value]) => {
|
|
199
197
|
try {
|
|
200
198
|
return {
|
|
@@ -202,7 +200,7 @@ var Persist = class {
|
|
|
202
200
|
value: !value || value === "undefined" ? void 0 : require_extendedJson.fromExtendedJsonString(value)
|
|
203
201
|
};
|
|
204
202
|
} catch {
|
|
205
|
-
return
|
|
203
|
+
return;
|
|
206
204
|
}
|
|
207
205
|
}).filter(Boolean);
|
|
208
206
|
if (toWrite.length > 0) {
|
|
@@ -223,10 +221,9 @@ var Persist = class {
|
|
|
223
221
|
type: "data",
|
|
224
222
|
path
|
|
225
223
|
});
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
else return this.storage.setItem(key, require_extendedJson.toExtendedJsonString(value$1));
|
|
224
|
+
return promiseChain(require_propAccess.get(this.store.get(), path)).next((value) => {
|
|
225
|
+
if (value === void 0) return this.storage.removeItem(key);
|
|
226
|
+
else return this.storage.setItem(key, require_extendedJson.toExtendedJsonString(value));
|
|
230
227
|
}).next(() => {
|
|
231
228
|
this.channel.postMessage(path);
|
|
232
229
|
if (this.store.version) return this.storage.setItem(this.buildKey({
|
|
@@ -260,4 +257,4 @@ Object.defineProperty(exports, 'persist', {
|
|
|
260
257
|
return persist;
|
|
261
258
|
}
|
|
262
259
|
});
|
|
263
|
-
//# sourceMappingURL=persist-
|
|
260
|
+
//# sourceMappingURL=persist-DMbVdqS_.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist-DMbVdqS_.cjs","names":["isPromise","value","entries: Map<KeyType, unknown>","path","isPromise","store: Store<T>","options: PersistOptions<T>","queue","castArrayPath","calcDuration","subscribePatches","path","shallowEqual","isPromise","fromExtendedJsonString","remove","set","get","toExtendedJsonString"],"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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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { M as KeyType, V as WildcardPath, b as Duration, g as Cancel, r as Store } from "./store-BRHFhRPm.js";
|
|
2
2
|
|
|
3
3
|
//#region src/persist/persistStorage.d.ts
|
|
4
4
|
interface PersistStorageBase {
|
|
@@ -57,5 +57,5 @@ declare class Persist<T> {
|
|
|
57
57
|
}
|
|
58
58
|
declare function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T>;
|
|
59
59
|
//#endregion
|
|
60
|
-
export {
|
|
61
|
-
//# sourceMappingURL=persist-
|
|
60
|
+
export { PersistStorageBase as a, PersistStorageWithListItems as c, PersistStorage as i, PersistOptions as n, PersistStorageWithKeys as o, persist as r, PersistStorageWithLength as s, Persist as t };
|
|
61
|
+
//# sourceMappingURL=persist-DyI_JLxZ.d.ts.map
|
|
@@ -72,8 +72,7 @@ function castArrayPath(path) {
|
|
|
72
72
|
return path.split(".");
|
|
73
73
|
}
|
|
74
74
|
function get(object, path) {
|
|
75
|
-
const
|
|
76
|
-
const [first, ...rest] = _path;
|
|
75
|
+
const [first, ...rest] = castArrayPath(path);
|
|
77
76
|
if (first === void 0 || !object) return object;
|
|
78
77
|
if (object instanceof Map) return get(object.get(first), rest);
|
|
79
78
|
if (object instanceof Set) return get(Array.from(object)[Number(first)], rest);
|
|
@@ -81,8 +80,7 @@ function get(object, path) {
|
|
|
81
80
|
throw new Error(`Could not get ${path} of ${object}`);
|
|
82
81
|
}
|
|
83
82
|
function set(object, path, value, rootPath = path) {
|
|
84
|
-
const
|
|
85
|
-
const [first, ...rest] = _path;
|
|
83
|
+
const [first, ...rest] = castArrayPath(path);
|
|
86
84
|
if (first === void 0) return value;
|
|
87
85
|
if (object instanceof Map) {
|
|
88
86
|
const copy = flatClone(object);
|
|
@@ -105,7 +103,7 @@ function set(object, path, value, rootPath = path) {
|
|
|
105
103
|
}
|
|
106
104
|
function remove(object, path) {
|
|
107
105
|
const _path = castArrayPath(path);
|
|
108
|
-
if (_path.length === 0) return
|
|
106
|
+
if (_path.length === 0) return;
|
|
109
107
|
const parentPath = _path.slice(0, -1);
|
|
110
108
|
const key = _path[_path.length - 1];
|
|
111
109
|
const parent = flatClone(get(object, parentPath));
|
|
@@ -182,4 +180,4 @@ Object.defineProperty(exports, 'strictEqual', {
|
|
|
182
180
|
return strictEqual;
|
|
183
181
|
}
|
|
184
182
|
});
|
|
185
|
-
//# sourceMappingURL=propAccess-
|
|
183
|
+
//# sourceMappingURL=propAccess-C2AIn9RC.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propAccess-BdLsqViO.cjs","names":["a","b"],"sources":["../src/lib/equals.ts","../src/lib/helpers.ts","../src/lib/clone.ts","../src/lib/propAccess.ts"],"sourcesContent":["export interface EqualityOptions {\n /** Treat undefined values as absent\n * @default false\n */\n undefinedEqualsAbsent?: boolean;\n}\n\nexport function strictEqual(a: any, b: any): boolean {\n return a === b;\n}\n\nexport function shallowEqual(a: any, b: any, options?: EqualityOptions): boolean {\n return internalEqual(a, b, strictEqual, options);\n}\n\nexport function deepEqual(a: any, b: any, options?: EqualityOptions): boolean {\n return internalEqual(a, b, (a, b) => deepEqual(a, b, options), options);\n}\n\nconst internalEqual = (\n a: any,\n b: any,\n comp: (a: any, b: any) => boolean,\n { undefinedEqualsAbsent = false }: EqualityOptions = {},\n) => {\n if (a === b) {\n return true;\n }\n\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {\n // eslint-disable-next-line no-self-compare\n return a !== a && b !== b;\n }\n\n if (a.constructor !== b.constructor) {\n return false;\n }\n\n if (a.constructor === Object || Array.isArray(a)) {\n let entries1 = Object.entries(a);\n let entries2 = Object.entries(b);\n\n if (undefinedEqualsAbsent) {\n entries1 = entries1.filter(([_, value]) => value !== undefined);\n entries2 = entries2.filter(([_, value]) => value !== undefined);\n }\n\n return (\n entries1.length === entries2.length &&\n entries1.every(([key, value]) => key in b && comp(value, b[key]))\n );\n }\n\n if (a instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n\n if (a instanceof Map) {\n let entries1 = [...a.entries()];\n let entries2 = [...b.entries()];\n\n if (undefinedEqualsAbsent) {\n entries1 = entries1.filter(([_, value]) => value !== undefined);\n entries2 = entries2.filter(([_, value]) => value !== undefined);\n }\n\n return (\n entries1.length === entries2.length &&\n entries1.every(([key, value]) => b.has(key) && comp(value, b.get(key)))\n );\n }\n\n if (a instanceof Set) {\n return a.size === b.size && [...a.values()].every((value) => b.has(value));\n }\n\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(a)) {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n\n const a_ = new Int8Array(a.buffer);\n const b_ = new Int8Array(b.buffer);\n return a_.every((value, i) => value === b_[i]);\n }\n\n return false;\n};\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return (\n (prototype === null ||\n prototype === Object.prototype ||\n Object.getPrototypeOf(prototype) === null) &&\n !(Symbol.toStringTag in value) &&\n !(Symbol.iterator in value)\n );\n}\n","import { isObject } from '@lib/helpers';\n\nexport function flatClone<T>(object: T): T {\n if (object instanceof Map) {\n return new Map(object) as any;\n }\n\n if (object instanceof Set) {\n return new Set(object) as any;\n }\n\n if (Array.isArray(object)) {\n return [...object] as any;\n }\n\n if (isObject(object)) {\n return { ...object };\n }\n\n return object;\n}\n","import type { Constrain } from '@lib/constrain';\nimport { isObject } from '@lib/helpers';\nimport { flatClone } from './clone';\nimport type { KeyType, Path, SettablePath, SettableValue, Value } from './path';\n\nexport function castArrayPath(path: string | KeyType[]): KeyType[] {\n if (Array.isArray(path)) {\n return path;\n }\n\n if (path === '') {\n return [];\n }\n\n return (path as string).split('.');\n}\n\nexport function get<T, const P>(object: T, path: Constrain<P, Path<T>>): Value<T, P> {\n const _path = castArrayPath(path as any);\n const [first, ...rest] = _path;\n\n if (first === undefined || !object) {\n return object as Value<T, P>;\n }\n\n if (object instanceof Map) {\n return get(object.get(first), rest);\n }\n\n if (object instanceof Set) {\n return get(Array.from(object)[Number(first)], rest);\n }\n\n if (isObject(object)) {\n return get(object[first as keyof T], rest as any) as Value<T, P>;\n }\n\n throw new Error(`Could not get ${path} of ${object}`);\n}\n\nexport function set<T, const P>(\n object: T,\n path: Constrain<P, SettablePath<T>>,\n value: SettableValue<T, P>,\n rootPath: string | readonly KeyType[] = path,\n): T {\n const _path = castArrayPath(path as any);\n const [first, ...rest] = _path;\n\n if (first === undefined) {\n return value as T;\n }\n\n if (object instanceof Map) {\n const copy = flatClone(object);\n const child = copy.get(first);\n copy.set(first, set(child, rest as any, value, rootPath));\n return copy;\n }\n\n if (object instanceof Set) {\n const copy = [...object];\n const child = copy[Number(first)];\n copy[Number(first)] = set(child, rest as any, value, rootPath);\n return new Set(copy) as any;\n }\n\n if (isObject(object) || object === undefined) {\n const copy = flatClone(object ?? ({} as T));\n copy[first as keyof T] = set(copy[first as keyof T], rest as any, value as any, rootPath);\n return copy;\n }\n\n throw new Error(`Could not set ${path} of ${object}`);\n}\n\nexport function remove<T, const P>(object: T, path: Constrain<P, Path<T, true>>): T {\n const _path = castArrayPath(path as any);\n\n if (_path.length === 0) {\n return undefined as any;\n }\n\n const parentPath = _path.slice(0, -1);\n const key = _path[_path.length - 1];\n\n const parent = flatClone(get(object, parentPath as any));\n\n if (parent instanceof Map) {\n parent.delete(key);\n } else if (parent instanceof Set) {\n const value = Array.from(parent)[Number(key)];\n parent.delete(value);\n } else if (Array.isArray(parent)) {\n parent.splice(Number(key), 1);\n } else {\n delete parent[key as keyof typeof parent];\n }\n\n return set(object, parentPath as any, parent);\n}\n\nexport function join(a: string, b: string): string {\n return [a, b].filter(Boolean).join('.');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"propAccess-C2AIn9RC.cjs","names":["a","b"],"sources":["../src/lib/equals.ts","../src/lib/helpers.ts","../src/lib/clone.ts","../src/lib/propAccess.ts"],"sourcesContent":["export interface EqualityOptions {\n /** Treat undefined values as absent\n * @default false\n */\n undefinedEqualsAbsent?: boolean;\n}\n\nexport function strictEqual(a: any, b: any): boolean {\n return a === b;\n}\n\nexport function shallowEqual(a: any, b: any, options?: EqualityOptions): boolean {\n return internalEqual(a, b, strictEqual, options);\n}\n\nexport function deepEqual(a: any, b: any, options?: EqualityOptions): boolean {\n return internalEqual(a, b, (a, b) => deepEqual(a, b, options), options);\n}\n\nconst internalEqual = (\n a: any,\n b: any,\n comp: (a: any, b: any) => boolean,\n { undefinedEqualsAbsent = false }: EqualityOptions = {},\n) => {\n if (a === b) {\n return true;\n }\n\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {\n // eslint-disable-next-line no-self-compare\n return a !== a && b !== b;\n }\n\n if (a.constructor !== b.constructor) {\n return false;\n }\n\n if (a.constructor === Object || Array.isArray(a)) {\n let entries1 = Object.entries(a);\n let entries2 = Object.entries(b);\n\n if (undefinedEqualsAbsent) {\n entries1 = entries1.filter(([_, value]) => value !== undefined);\n entries2 = entries2.filter(([_, value]) => value !== undefined);\n }\n\n return (\n entries1.length === entries2.length &&\n entries1.every(([key, value]) => key in b && comp(value, b[key]))\n );\n }\n\n if (a instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n\n if (a instanceof Map) {\n let entries1 = [...a.entries()];\n let entries2 = [...b.entries()];\n\n if (undefinedEqualsAbsent) {\n entries1 = entries1.filter(([_, value]) => value !== undefined);\n entries2 = entries2.filter(([_, value]) => value !== undefined);\n }\n\n return (\n entries1.length === entries2.length &&\n entries1.every(([key, value]) => b.has(key) && comp(value, b.get(key)))\n );\n }\n\n if (a instanceof Set) {\n return a.size === b.size && [...a.values()].every((value) => b.has(value));\n }\n\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(a)) {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n\n const a_ = new Int8Array(a.buffer);\n const b_ = new Int8Array(b.buffer);\n return a_.every((value, i) => value === b_[i]);\n }\n\n return false;\n};\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return (\n (prototype === null ||\n prototype === Object.prototype ||\n Object.getPrototypeOf(prototype) === null) &&\n !(Symbol.toStringTag in value) &&\n !(Symbol.iterator in value)\n );\n}\n","import { isObject } from '@lib/helpers';\n\nexport function flatClone<T>(object: T): T {\n if (object instanceof Map) {\n return new Map(object) as any;\n }\n\n if (object instanceof Set) {\n return new Set(object) as any;\n }\n\n if (Array.isArray(object)) {\n return [...object] as any;\n }\n\n if (isObject(object)) {\n return { ...object };\n }\n\n return object;\n}\n","import type { Constrain } from '@lib/constrain';\nimport { isObject } from '@lib/helpers';\nimport { flatClone } from './clone';\nimport type { KeyType, Path, SettablePath, SettableValue, Value } from './path';\n\nexport function castArrayPath(path: string | KeyType[]): KeyType[] {\n if (Array.isArray(path)) {\n return path;\n }\n\n if (path === '') {\n return [];\n }\n\n return (path as string).split('.');\n}\n\nexport function get<T, const P>(object: T, path: Constrain<P, Path<T>>): Value<T, P> {\n const _path = castArrayPath(path as any);\n const [first, ...rest] = _path;\n\n if (first === undefined || !object) {\n return object as Value<T, P>;\n }\n\n if (object instanceof Map) {\n return get(object.get(first), rest);\n }\n\n if (object instanceof Set) {\n return get(Array.from(object)[Number(first)], rest);\n }\n\n if (isObject(object)) {\n return get(object[first as keyof T], rest as any) as Value<T, P>;\n }\n\n throw new Error(`Could not get ${path} of ${object}`);\n}\n\nexport function set<T, const P>(\n object: T,\n path: Constrain<P, SettablePath<T>>,\n value: SettableValue<T, P>,\n rootPath: string | readonly KeyType[] = path,\n): T {\n const _path = castArrayPath(path as any);\n const [first, ...rest] = _path;\n\n if (first === undefined) {\n return value as T;\n }\n\n if (object instanceof Map) {\n const copy = flatClone(object);\n const child = copy.get(first);\n copy.set(first, set(child, rest as any, value, rootPath));\n return copy;\n }\n\n if (object instanceof Set) {\n const copy = [...object];\n const child = copy[Number(first)];\n copy[Number(first)] = set(child, rest as any, value, rootPath);\n return new Set(copy) as any;\n }\n\n if (isObject(object) || object === undefined) {\n const copy = flatClone(object ?? ({} as T));\n copy[first as keyof T] = set(copy[first as keyof T], rest as any, value as any, rootPath);\n return copy;\n }\n\n throw new Error(`Could not set ${path} of ${object}`);\n}\n\nexport function remove<T, const P>(object: T, path: Constrain<P, Path<T, true>>): T {\n const _path = castArrayPath(path as any);\n\n if (_path.length === 0) {\n return undefined as any;\n }\n\n const parentPath = _path.slice(0, -1);\n const key = _path[_path.length - 1];\n\n const parent = flatClone(get(object, parentPath as any));\n\n if (parent instanceof Map) {\n parent.delete(key);\n } else if (parent instanceof Set) {\n const value = Array.from(parent)[Number(key)];\n parent.delete(value);\n } else if (Array.isArray(parent)) {\n parent.splice(Number(key), 1);\n } else {\n delete parent[key as keyof typeof parent];\n }\n\n return set(object, parentPath as any, parent);\n}\n\nexport function join(a: string, b: string): string {\n return [a, b].filter(Boolean).join('.');\n}\n"],"mappings":"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"}
|
|
@@ -71,8 +71,7 @@ function castArrayPath(path) {
|
|
|
71
71
|
return path.split(".");
|
|
72
72
|
}
|
|
73
73
|
function get(object, path) {
|
|
74
|
-
const
|
|
75
|
-
const [first, ...rest] = _path;
|
|
74
|
+
const [first, ...rest] = castArrayPath(path);
|
|
76
75
|
if (first === void 0 || !object) return object;
|
|
77
76
|
if (object instanceof Map) return get(object.get(first), rest);
|
|
78
77
|
if (object instanceof Set) return get(Array.from(object)[Number(first)], rest);
|
|
@@ -80,8 +79,7 @@ function get(object, path) {
|
|
|
80
79
|
throw new Error(`Could not get ${path} of ${object}`);
|
|
81
80
|
}
|
|
82
81
|
function set(object, path, value, rootPath = path) {
|
|
83
|
-
const
|
|
84
|
-
const [first, ...rest] = _path;
|
|
82
|
+
const [first, ...rest] = castArrayPath(path);
|
|
85
83
|
if (first === void 0) return value;
|
|
86
84
|
if (object instanceof Map) {
|
|
87
85
|
const copy = flatClone(object);
|
|
@@ -104,7 +102,7 @@ function set(object, path, value, rootPath = path) {
|
|
|
104
102
|
}
|
|
105
103
|
function remove(object, path) {
|
|
106
104
|
const _path = castArrayPath(path);
|
|
107
|
-
if (_path.length === 0) return
|
|
105
|
+
if (_path.length === 0) return;
|
|
108
106
|
const parentPath = _path.slice(0, -1);
|
|
109
107
|
const key = _path[_path.length - 1];
|
|
110
108
|
const parent = flatClone(get(object, parentPath));
|
|
@@ -121,5 +119,5 @@ function join(a, b) {
|
|
|
121
119
|
}
|
|
122
120
|
|
|
123
121
|
//#endregion
|
|
124
|
-
export {
|
|
125
|
-
//# sourceMappingURL=propAccess-
|
|
122
|
+
export { set as a, deepEqual as c, remove as i, shallowEqual as l, get as n, isObject as o, join as r, isPlainObject as s, castArrayPath as t, strictEqual as u };
|
|
123
|
+
//# sourceMappingURL=propAccess-DvWFpYoj.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propAccess-B260LXN1.js","names":["a","b"],"sources":["../src/lib/equals.ts","../src/lib/helpers.ts","../src/lib/clone.ts","../src/lib/propAccess.ts"],"sourcesContent":["export interface EqualityOptions {\n /** Treat undefined values as absent\n * @default false\n */\n undefinedEqualsAbsent?: boolean;\n}\n\nexport function strictEqual(a: any, b: any): boolean {\n return a === b;\n}\n\nexport function shallowEqual(a: any, b: any, options?: EqualityOptions): boolean {\n return internalEqual(a, b, strictEqual, options);\n}\n\nexport function deepEqual(a: any, b: any, options?: EqualityOptions): boolean {\n return internalEqual(a, b, (a, b) => deepEqual(a, b, options), options);\n}\n\nconst internalEqual = (\n a: any,\n b: any,\n comp: (a: any, b: any) => boolean,\n { undefinedEqualsAbsent = false }: EqualityOptions = {},\n) => {\n if (a === b) {\n return true;\n }\n\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {\n // eslint-disable-next-line no-self-compare\n return a !== a && b !== b;\n }\n\n if (a.constructor !== b.constructor) {\n return false;\n }\n\n if (a.constructor === Object || Array.isArray(a)) {\n let entries1 = Object.entries(a);\n let entries2 = Object.entries(b);\n\n if (undefinedEqualsAbsent) {\n entries1 = entries1.filter(([_, value]) => value !== undefined);\n entries2 = entries2.filter(([_, value]) => value !== undefined);\n }\n\n return (\n entries1.length === entries2.length &&\n entries1.every(([key, value]) => key in b && comp(value, b[key]))\n );\n }\n\n if (a instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n\n if (a instanceof Map) {\n let entries1 = [...a.entries()];\n let entries2 = [...b.entries()];\n\n if (undefinedEqualsAbsent) {\n entries1 = entries1.filter(([_, value]) => value !== undefined);\n entries2 = entries2.filter(([_, value]) => value !== undefined);\n }\n\n return (\n entries1.length === entries2.length &&\n entries1.every(([key, value]) => b.has(key) && comp(value, b.get(key)))\n );\n }\n\n if (a instanceof Set) {\n return a.size === b.size && [...a.values()].every((value) => b.has(value));\n }\n\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(a)) {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n\n const a_ = new Int8Array(a.buffer);\n const b_ = new Int8Array(b.buffer);\n return a_.every((value, i) => value === b_[i]);\n }\n\n return false;\n};\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return (\n (prototype === null ||\n prototype === Object.prototype ||\n Object.getPrototypeOf(prototype) === null) &&\n !(Symbol.toStringTag in value) &&\n !(Symbol.iterator in value)\n );\n}\n","import { isObject } from '@lib/helpers';\n\nexport function flatClone<T>(object: T): T {\n if (object instanceof Map) {\n return new Map(object) as any;\n }\n\n if (object instanceof Set) {\n return new Set(object) as any;\n }\n\n if (Array.isArray(object)) {\n return [...object] as any;\n }\n\n if (isObject(object)) {\n return { ...object };\n }\n\n return object;\n}\n","import type { Constrain } from '@lib/constrain';\nimport { isObject } from '@lib/helpers';\nimport { flatClone } from './clone';\nimport type { KeyType, Path, SettablePath, SettableValue, Value } from './path';\n\nexport function castArrayPath(path: string | KeyType[]): KeyType[] {\n if (Array.isArray(path)) {\n return path;\n }\n\n if (path === '') {\n return [];\n }\n\n return (path as string).split('.');\n}\n\nexport function get<T, const P>(object: T, path: Constrain<P, Path<T>>): Value<T, P> {\n const _path = castArrayPath(path as any);\n const [first, ...rest] = _path;\n\n if (first === undefined || !object) {\n return object as Value<T, P>;\n }\n\n if (object instanceof Map) {\n return get(object.get(first), rest);\n }\n\n if (object instanceof Set) {\n return get(Array.from(object)[Number(first)], rest);\n }\n\n if (isObject(object)) {\n return get(object[first as keyof T], rest as any) as Value<T, P>;\n }\n\n throw new Error(`Could not get ${path} of ${object}`);\n}\n\nexport function set<T, const P>(\n object: T,\n path: Constrain<P, SettablePath<T>>,\n value: SettableValue<T, P>,\n rootPath: string | readonly KeyType[] = path,\n): T {\n const _path = castArrayPath(path as any);\n const [first, ...rest] = _path;\n\n if (first === undefined) {\n return value as T;\n }\n\n if (object instanceof Map) {\n const copy = flatClone(object);\n const child = copy.get(first);\n copy.set(first, set(child, rest as any, value, rootPath));\n return copy;\n }\n\n if (object instanceof Set) {\n const copy = [...object];\n const child = copy[Number(first)];\n copy[Number(first)] = set(child, rest as any, value, rootPath);\n return new Set(copy) as any;\n }\n\n if (isObject(object) || object === undefined) {\n const copy = flatClone(object ?? ({} as T));\n copy[first as keyof T] = set(copy[first as keyof T], rest as any, value as any, rootPath);\n return copy;\n }\n\n throw new Error(`Could not set ${path} of ${object}`);\n}\n\nexport function remove<T, const P>(object: T, path: Constrain<P, Path<T, true>>): T {\n const _path = castArrayPath(path as any);\n\n if (_path.length === 0) {\n return undefined as any;\n }\n\n const parentPath = _path.slice(0, -1);\n const key = _path[_path.length - 1];\n\n const parent = flatClone(get(object, parentPath as any));\n\n if (parent instanceof Map) {\n parent.delete(key);\n } else if (parent instanceof Set) {\n const value = Array.from(parent)[Number(key)];\n parent.delete(value);\n } else if (Array.isArray(parent)) {\n parent.splice(Number(key), 1);\n } else {\n delete parent[key as keyof typeof parent];\n }\n\n return set(object, parentPath as any, parent);\n}\n\nexport function join(a: string, b: string): string {\n return [a, b].filter(Boolean).join('.');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"propAccess-DvWFpYoj.js","names":["a","b"],"sources":["../src/lib/equals.ts","../src/lib/helpers.ts","../src/lib/clone.ts","../src/lib/propAccess.ts"],"sourcesContent":["export interface EqualityOptions {\n /** Treat undefined values as absent\n * @default false\n */\n undefinedEqualsAbsent?: boolean;\n}\n\nexport function strictEqual(a: any, b: any): boolean {\n return a === b;\n}\n\nexport function shallowEqual(a: any, b: any, options?: EqualityOptions): boolean {\n return internalEqual(a, b, strictEqual, options);\n}\n\nexport function deepEqual(a: any, b: any, options?: EqualityOptions): boolean {\n return internalEqual(a, b, (a, b) => deepEqual(a, b, options), options);\n}\n\nconst internalEqual = (\n a: any,\n b: any,\n comp: (a: any, b: any) => boolean,\n { undefinedEqualsAbsent = false }: EqualityOptions = {},\n) => {\n if (a === b) {\n return true;\n }\n\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {\n // eslint-disable-next-line no-self-compare\n return a !== a && b !== b;\n }\n\n if (a.constructor !== b.constructor) {\n return false;\n }\n\n if (a.constructor === Object || Array.isArray(a)) {\n let entries1 = Object.entries(a);\n let entries2 = Object.entries(b);\n\n if (undefinedEqualsAbsent) {\n entries1 = entries1.filter(([_, value]) => value !== undefined);\n entries2 = entries2.filter(([_, value]) => value !== undefined);\n }\n\n return (\n entries1.length === entries2.length &&\n entries1.every(([key, value]) => key in b && comp(value, b[key]))\n );\n }\n\n if (a instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n\n if (a instanceof Map) {\n let entries1 = [...a.entries()];\n let entries2 = [...b.entries()];\n\n if (undefinedEqualsAbsent) {\n entries1 = entries1.filter(([_, value]) => value !== undefined);\n entries2 = entries2.filter(([_, value]) => value !== undefined);\n }\n\n return (\n entries1.length === entries2.length &&\n entries1.every(([key, value]) => b.has(key) && comp(value, b.get(key)))\n );\n }\n\n if (a instanceof Set) {\n return a.size === b.size && [...a.values()].every((value) => b.has(value));\n }\n\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(a)) {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n\n const a_ = new Int8Array(a.buffer);\n const b_ = new Int8Array(b.buffer);\n return a_.every((value, i) => value === b_[i]);\n }\n\n return false;\n};\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return (\n (prototype === null ||\n prototype === Object.prototype ||\n Object.getPrototypeOf(prototype) === null) &&\n !(Symbol.toStringTag in value) &&\n !(Symbol.iterator in value)\n );\n}\n","import { isObject } from '@lib/helpers';\n\nexport function flatClone<T>(object: T): T {\n if (object instanceof Map) {\n return new Map(object) as any;\n }\n\n if (object instanceof Set) {\n return new Set(object) as any;\n }\n\n if (Array.isArray(object)) {\n return [...object] as any;\n }\n\n if (isObject(object)) {\n return { ...object };\n }\n\n return object;\n}\n","import type { Constrain } from '@lib/constrain';\nimport { isObject } from '@lib/helpers';\nimport { flatClone } from './clone';\nimport type { KeyType, Path, SettablePath, SettableValue, Value } from './path';\n\nexport function castArrayPath(path: string | KeyType[]): KeyType[] {\n if (Array.isArray(path)) {\n return path;\n }\n\n if (path === '') {\n return [];\n }\n\n return (path as string).split('.');\n}\n\nexport function get<T, const P>(object: T, path: Constrain<P, Path<T>>): Value<T, P> {\n const _path = castArrayPath(path as any);\n const [first, ...rest] = _path;\n\n if (first === undefined || !object) {\n return object as Value<T, P>;\n }\n\n if (object instanceof Map) {\n return get(object.get(first), rest);\n }\n\n if (object instanceof Set) {\n return get(Array.from(object)[Number(first)], rest);\n }\n\n if (isObject(object)) {\n return get(object[first as keyof T], rest as any) as Value<T, P>;\n }\n\n throw new Error(`Could not get ${path} of ${object}`);\n}\n\nexport function set<T, const P>(\n object: T,\n path: Constrain<P, SettablePath<T>>,\n value: SettableValue<T, P>,\n rootPath: string | readonly KeyType[] = path,\n): T {\n const _path = castArrayPath(path as any);\n const [first, ...rest] = _path;\n\n if (first === undefined) {\n return value as T;\n }\n\n if (object instanceof Map) {\n const copy = flatClone(object);\n const child = copy.get(first);\n copy.set(first, set(child, rest as any, value, rootPath));\n return copy;\n }\n\n if (object instanceof Set) {\n const copy = [...object];\n const child = copy[Number(first)];\n copy[Number(first)] = set(child, rest as any, value, rootPath);\n return new Set(copy) as any;\n }\n\n if (isObject(object) || object === undefined) {\n const copy = flatClone(object ?? ({} as T));\n copy[first as keyof T] = set(copy[first as keyof T], rest as any, value as any, rootPath);\n return copy;\n }\n\n throw new Error(`Could not set ${path} of ${object}`);\n}\n\nexport function remove<T, const P>(object: T, path: Constrain<P, Path<T, true>>): T {\n const _path = castArrayPath(path as any);\n\n if (_path.length === 0) {\n return undefined as any;\n }\n\n const parentPath = _path.slice(0, -1);\n const key = _path[_path.length - 1];\n\n const parent = flatClone(get(object, parentPath as any));\n\n if (parent instanceof Map) {\n parent.delete(key);\n } else if (parent instanceof Set) {\n const value = Array.from(parent)[Number(key)];\n parent.delete(value);\n } else if (Array.isArray(parent)) {\n parent.splice(Number(key), 1);\n } else {\n delete parent[key as keyof typeof parent];\n }\n\n return set(object, parentPath as any, parent);\n}\n\nexport function join(a: string, b: string): string {\n return [a, b].filter(Boolean).join('.');\n}\n"],"mappings":"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"}
|
package/dist/react/index.cjs
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
const
|
|
2
|
-
const require_store = require('../store-
|
|
3
|
-
const require_propAccess = require('../propAccess-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
const require_path = require('../path-B-Rq5q6m.cjs');
|
|
2
|
+
const require_store = require('../store-C1NYHLgR.cjs');
|
|
3
|
+
const require_propAccess = require('../propAccess-C2AIn9RC.cjs');
|
|
4
|
+
const require_extendedJson = require('../extendedJson-ursQ8DbQ.cjs');
|
|
5
|
+
const require_storeMethods = require('../storeMethods-CNu7VD6w.cjs');
|
|
6
|
+
let react = require("react");
|
|
7
|
+
react = require_path.__toESM(react);
|
|
8
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
9
|
+
react_jsx_runtime = require_path.__toESM(react_jsx_runtime);
|
|
9
10
|
|
|
10
11
|
//#region src/react/form/customInput.tsx
|
|
11
12
|
function CustomInput({ name, children,...props }) {
|
|
@@ -107,21 +108,17 @@ function FormField({ name = "", component, commitOnBlur, commitDebounce, render,
|
|
|
107
108
|
function FormForEach({ name, renderElement, children }) {
|
|
108
109
|
const form = this.useForm();
|
|
109
110
|
const names = this.useFormState(() => {
|
|
110
|
-
|
|
111
|
-
return field.names;
|
|
111
|
+
return form.getField(name).names;
|
|
112
112
|
});
|
|
113
113
|
const add = (0, react.useCallback)((...args) => {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}, [form]);
|
|
114
|
+
form.getField(name).add(...args);
|
|
115
|
+
}, [form, name]);
|
|
117
116
|
const remove = (0, react.useCallback)((key) => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}, [form]);
|
|
117
|
+
form.getField(name).remove(key);
|
|
118
|
+
}, [form, name]);
|
|
121
119
|
const setValue = (0, react.useCallback)((value) => {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}, [form]);
|
|
120
|
+
form.getField(name).setValue(value);
|
|
121
|
+
}, [form, name]);
|
|
125
122
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [renderElement && names.map((name$1, index) => {
|
|
126
123
|
const key = name$1.split(".").pop();
|
|
127
124
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Fragment, { children: renderElement({
|
|
@@ -141,39 +138,38 @@ function FormForEach({ name, renderElement, children }) {
|
|
|
141
138
|
//#endregion
|
|
142
139
|
//#region src/react/form/useFormAutosave.ts
|
|
143
140
|
function useFormAutosave(form) {
|
|
144
|
-
const
|
|
145
|
-
const
|
|
146
|
-
const latestRef = (0, react.useRef)({ options });
|
|
141
|
+
const debounceTime = require_store.calcDuration(form.options.autoSave?.debounce ?? 2e3);
|
|
142
|
+
const latestRef = require_storeMethods.useLatestRef(form);
|
|
147
143
|
const lastValue = (0, react.useRef)(void 0);
|
|
148
144
|
const q = (0, react.useMemo)(() => require_store.queue(), []);
|
|
149
145
|
const run = (0, react.useMemo)(() => require_store.debounce(async () => {
|
|
150
|
-
const
|
|
151
|
-
const
|
|
152
|
-
const draft = getDraft();
|
|
146
|
+
const save = latestRef.current.options.autoSave?.save;
|
|
147
|
+
const draft = latestRef.current.getDraft();
|
|
153
148
|
lastValue.current = draft;
|
|
154
149
|
q.clear();
|
|
155
150
|
q(async () => {
|
|
156
151
|
try {
|
|
157
|
-
formState.set("saveInProgress", true);
|
|
158
|
-
await save?.(draft,
|
|
159
|
-
if (q.size === 0 && options
|
|
152
|
+
latestRef.current.formState.set("saveInProgress", true);
|
|
153
|
+
await save?.(draft, latestRef.current);
|
|
154
|
+
if (q.size === 0 && latestRef.current.options.autoSave?.resetAfterSave) latestRef.current.reset();
|
|
160
155
|
} finally {
|
|
161
|
-
formState.set("saveInProgress", false);
|
|
162
|
-
if (q.size === 0) formState.set("saveScheduled", false);
|
|
156
|
+
latestRef.current.formState.set("saveInProgress", false);
|
|
157
|
+
if (q.size === 0) latestRef.current.formState.set("saveScheduled", false);
|
|
163
158
|
}
|
|
164
159
|
});
|
|
165
|
-
}, debounceTime), [
|
|
160
|
+
}, debounceTime), [
|
|
161
|
+
latestRef,
|
|
162
|
+
debounceTime,
|
|
163
|
+
q
|
|
164
|
+
]);
|
|
166
165
|
(0, react.useEffect)(() => {
|
|
167
|
-
if (!options.autoSave?.save) return;
|
|
168
|
-
return formState.map((state) => state.draft).subscribe(() => {
|
|
169
|
-
if (require_propAccess.deepEqual(getDraft(), lastValue.current)) return;
|
|
166
|
+
if (!latestRef.current.options.autoSave?.save) return;
|
|
167
|
+
return latestRef.current.formState.map((state) => state.draft).subscribe(() => {
|
|
168
|
+
if (require_propAccess.deepEqual(latestRef.current.getDraft(), lastValue.current)) return;
|
|
170
169
|
run();
|
|
171
|
-
formState.set("saveScheduled", true);
|
|
170
|
+
latestRef.current.formState.set("saveScheduled", true);
|
|
172
171
|
}, { runNow: false });
|
|
173
|
-
}, [
|
|
174
|
-
(0, react.useEffect)(() => {
|
|
175
|
-
latestRef.current = { options };
|
|
176
|
-
});
|
|
172
|
+
}, [latestRef, run]);
|
|
177
173
|
}
|
|
178
174
|
|
|
179
175
|
//#endregion
|
|
@@ -182,7 +178,7 @@ function FormContainer({ form,...formProps }) {
|
|
|
182
178
|
const formInstance = form.useForm();
|
|
183
179
|
const hasTriggeredValidations = form.useFormState((state) => state.hasTriggeredValidations);
|
|
184
180
|
const formRef = (0, react.useRef)(null);
|
|
185
|
-
|
|
181
|
+
const updateValidity = require_storeMethods.useLatestFunction((errors, buttonElement) => {
|
|
186
182
|
const formElement = formRef.current;
|
|
187
183
|
if (!formElement) return;
|
|
188
184
|
const localizedErrors = new Map([...errors.entries()].map(([field, errors$1]) => [field, errors$1.map((error) => formInstance.options.localizeError?.(error, field) ?? error)]));
|
|
@@ -191,10 +187,10 @@ function FormContainer({ form,...formProps }) {
|
|
|
191
187
|
const errorString = [...errors.values()].flat().join("\n");
|
|
192
188
|
buttonElement.setCustomValidity(errorString);
|
|
193
189
|
}
|
|
194
|
-
}
|
|
190
|
+
});
|
|
195
191
|
(0, react.useEffect)(() => {
|
|
196
192
|
return formInstance.formState.map(() => formInstance.getErrors()).subscribe((errors) => updateValidity(errors));
|
|
197
|
-
}, []);
|
|
193
|
+
}, [formInstance, updateValidity]);
|
|
198
194
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("form", {
|
|
199
195
|
ref: formRef,
|
|
200
196
|
noValidate: true,
|
|
@@ -209,8 +205,7 @@ function FormContainer({ form,...formProps }) {
|
|
|
209
205
|
const buttonElement = event.nativeEvent instanceof SubmitEvent && event.nativeEvent.submitter instanceof HTMLButtonElement ? event.nativeEvent.submitter : void 0;
|
|
210
206
|
updateValidity(formInstance.getErrors(), buttonElement);
|
|
211
207
|
formElement.reportValidity();
|
|
212
|
-
|
|
213
|
-
if (isValid) await formProps.onSubmit?.(event, {
|
|
208
|
+
if (formInstance.validate()) await formProps.onSubmit?.(event, {
|
|
214
209
|
...formInstance,
|
|
215
210
|
...getDerivedState(formInstance)
|
|
216
211
|
});
|
|
@@ -221,13 +216,12 @@ function FormContainer({ form,...formProps }) {
|
|
|
221
216
|
});
|
|
222
217
|
}
|
|
223
218
|
function getField(form, path) {
|
|
224
|
-
|
|
219
|
+
return {
|
|
225
220
|
get originalValue() {
|
|
226
221
|
return form.original !== void 0 ? require_propAccess.get(form.original, path) : void 0;
|
|
227
222
|
},
|
|
228
223
|
get value() {
|
|
229
|
-
|
|
230
|
-
return require_propAccess.get(draft ?? form.original ?? form.options.defaultValue, path);
|
|
224
|
+
return require_propAccess.get(form.getDraft() ?? form.original ?? form.options.defaultValue, path);
|
|
231
225
|
},
|
|
232
226
|
setValue(update) {
|
|
233
227
|
form.formState.set("draft", (draft = form.original ?? form.options.defaultValue) => {
|
|
@@ -239,8 +233,7 @@ function getField(form, path) {
|
|
|
239
233
|
return !require_propAccess.deepEqual(this.originalValue, this.value, { undefinedEqualsAbsent: true });
|
|
240
234
|
},
|
|
241
235
|
get errors() {
|
|
242
|
-
|
|
243
|
-
return errors.get(path) ?? [];
|
|
236
|
+
return form.getErrors().get(path) ?? [];
|
|
244
237
|
},
|
|
245
238
|
get names() {
|
|
246
239
|
const { value } = this;
|
|
@@ -271,7 +264,6 @@ function getField(form, path) {
|
|
|
271
264
|
});
|
|
272
265
|
}
|
|
273
266
|
};
|
|
274
|
-
return field;
|
|
275
267
|
}
|
|
276
268
|
function getErrors(draft, original, validations) {
|
|
277
269
|
const errors = /* @__PURE__ */ new Map();
|
|
@@ -425,8 +417,9 @@ var Form = class Form {
|
|
|
425
417
|
});
|
|
426
418
|
}, [
|
|
427
419
|
original,
|
|
428
|
-
defaultValue,
|
|
429
|
-
options.transform
|
|
420
|
+
options.defaultValue,
|
|
421
|
+
options.transform,
|
|
422
|
+
formState
|
|
430
423
|
]);
|
|
431
424
|
useFormAutosave(context);
|
|
432
425
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(this.context.Provider, {
|
|
@@ -438,8 +431,7 @@ var Form = class Form {
|
|
|
438
431
|
});
|
|
439
432
|
}
|
|
440
433
|
FormState({ selector, children }) {
|
|
441
|
-
|
|
442
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: children(selectedState) });
|
|
434
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: children(this.useFormState(selector)) });
|
|
443
435
|
}
|
|
444
436
|
Field(props) {
|
|
445
437
|
return Reflect.apply(FormField, this, [{
|
|
@@ -473,11 +465,11 @@ function castArray(value) {
|
|
|
473
465
|
//#endregion
|
|
474
466
|
//#region src/react/url/urlHelpers.ts
|
|
475
467
|
function defaultDeserializer(value) {
|
|
476
|
-
if (value === void 0) return
|
|
468
|
+
if (value === void 0) return;
|
|
477
469
|
try {
|
|
478
470
|
return require_extendedJson.fromExtendedJsonString(value);
|
|
479
471
|
} catch {
|
|
480
|
-
return
|
|
472
|
+
return;
|
|
481
473
|
}
|
|
482
474
|
}
|
|
483
475
|
function defaultSerializer(value) {
|
|
@@ -561,8 +553,7 @@ var UrlParamStore = class UrlParamStore extends require_store.Store {
|
|
|
561
553
|
getUrlValue() {
|
|
562
554
|
const href = urlStore.get();
|
|
563
555
|
const url = new URL(href);
|
|
564
|
-
|
|
565
|
-
return params.get(this.urlOptions.key);
|
|
556
|
+
return new URLSearchParams(url[this.urlOptions.type].slice(1) || "").get(this.urlOptions.key);
|
|
566
557
|
}
|
|
567
558
|
getStorageValue() {
|
|
568
559
|
return this.storageKey !== null ? localStorage.getItem(this.storageKey) : null;
|
|
@@ -581,8 +572,7 @@ var UrlParamStore = class UrlParamStore extends require_store.Store {
|
|
|
581
572
|
if (!this.isPathActive() && this.lastHref !== void 0) href = this.lastHref;
|
|
582
573
|
if (this.lastHref === href && this.lastStorageValue === storageValue) return this.lastValue;
|
|
583
574
|
const url = new URL(href);
|
|
584
|
-
const
|
|
585
|
-
const urlValue = params.get(this.urlOptions.key);
|
|
575
|
+
const urlValue = new URLSearchParams(url[this.urlOptions.type].slice(1)).get(this.urlOptions.key);
|
|
586
576
|
const value = urlValue !== null ? this.urlOptions.deserialize(urlValue) : this.storageKey !== null && storageValue !== null ? this.urlOptions.deserialize(storageValue) : this.urlOptions.defaultValue;
|
|
587
577
|
this.lastHref = href;
|
|
588
578
|
this.lastStorageValue = storageValue;
|
|
@@ -610,16 +600,14 @@ var UrlParamStore = class UrlParamStore extends require_store.Store {
|
|
|
610
600
|
if (update instanceof Function) {
|
|
611
601
|
const before = this.get();
|
|
612
602
|
const valueBefore = require_propAccess.get(before, path);
|
|
613
|
-
|
|
614
|
-
update = require_propAccess.set(before, path, valueAfter);
|
|
603
|
+
update = require_propAccess.set(before, path, update(valueBefore));
|
|
615
604
|
} else if (path.length > 0) update = require_propAccess.set(this.get(), path, update);
|
|
616
605
|
if (this.isPathActive()) this.updateUrl(update);
|
|
617
606
|
else this.updateStorage(update);
|
|
618
607
|
}
|
|
619
608
|
parse(path) {
|
|
620
609
|
const url = new URL(path, window.location.href);
|
|
621
|
-
const
|
|
622
|
-
const urlValue = params.get(this.urlOptions.key);
|
|
610
|
+
const urlValue = new URLSearchParams(url[this.urlOptions.type].slice(1) || "").get(this.urlOptions.key);
|
|
623
611
|
return urlValue !== null ? this.urlOptions.deserialize(urlValue) : this.urlOptions.defaultValue;
|
|
624
612
|
}
|
|
625
613
|
};
|
|
@@ -631,32 +619,30 @@ function createUrlParam(options) {
|
|
|
631
619
|
//#region src/react/useDecoupledState.ts
|
|
632
620
|
function useDecoupledState(value, onChange, options = {}) {
|
|
633
621
|
const [dirty, setDirty] = (0, react.useState)();
|
|
634
|
-
const
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
(0, react.useEffect)(() => {
|
|
639
|
-
ref.current = {
|
|
640
|
-
onChange,
|
|
641
|
-
onCommit: options.onCommit
|
|
642
|
-
};
|
|
643
|
-
}, [onChange]);
|
|
622
|
+
const latestOnChange = require_storeMethods.useLatestFunction(onChange);
|
|
623
|
+
const latestOnCommit = require_storeMethods.useLatestFunction(options.onCommit ?? (() => {}));
|
|
624
|
+
const debounceOptions = require_storeMethods.useMemoEquals(options.debounce);
|
|
625
|
+
const throttleOptions = require_storeMethods.useMemoEquals(options.throttle);
|
|
644
626
|
const update = (0, react.useMemo)(() => {
|
|
645
|
-
const { onChange: onChange$1, onCommit } = ref.current;
|
|
646
627
|
const update$1 = (value$1) => {
|
|
647
|
-
|
|
628
|
+
latestOnChange(value$1);
|
|
648
629
|
setDirty(void 0);
|
|
649
|
-
|
|
630
|
+
latestOnCommit(value$1);
|
|
650
631
|
};
|
|
651
632
|
let delayedUpdate;
|
|
652
|
-
if (
|
|
653
|
-
else if (
|
|
633
|
+
if (debounceOptions) delayedUpdate = require_store.debounce(update$1, debounceOptions);
|
|
634
|
+
else if (throttleOptions) delayedUpdate = require_store.throttle(update$1, throttleOptions);
|
|
654
635
|
else delayedUpdate = (value$1) => (0, react.startTransition)(() => update$1(value$1));
|
|
655
636
|
return (value$1) => {
|
|
656
637
|
setDirty({ v: value$1 });
|
|
657
638
|
delayedUpdate(value$1);
|
|
658
639
|
};
|
|
659
|
-
}, [
|
|
640
|
+
}, [
|
|
641
|
+
latestOnChange,
|
|
642
|
+
latestOnCommit,
|
|
643
|
+
debounceOptions,
|
|
644
|
+
throttleOptions
|
|
645
|
+
]);
|
|
660
646
|
return [dirty ? dirty.v : value, update];
|
|
661
647
|
}
|
|
662
648
|
|