cross-state 0.43.3 → 0.44.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/cjs/hash.cjs.map +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index2.cjs +3 -3
- package/dist/cjs/index2.cjs.map +1 -1
- package/dist/cjs/mutative/register.cjs.map +1 -1
- package/dist/cjs/mutativeMethods.cjs.map +1 -1
- package/dist/cjs/patches/register.cjs.map +1 -1
- package/dist/cjs/persist/register.cjs.map +1 -1
- package/dist/cjs/persist.cjs +7 -7
- package/dist/cjs/persist.cjs.map +1 -1
- package/dist/cjs/propAccess.cjs +4 -4
- package/dist/cjs/propAccess.cjs.map +1 -1
- package/dist/cjs/react/index.cjs +16 -16
- package/dist/cjs/react/index.cjs.map +1 -1
- package/dist/cjs/react/register.cjs.map +1 -1
- package/dist/cjs/scope.cjs +8 -8
- package/dist/cjs/scope.cjs.map +1 -1
- package/dist/cjs/store.cjs +36 -36
- package/dist/cjs/store.cjs.map +1 -1
- package/dist/cjs/storeMethods.cjs +25 -17
- package/dist/cjs/storeMethods.cjs.map +1 -1
- package/dist/cjs/urlStore.cjs +6 -6
- package/dist/cjs/urlStore.cjs.map +1 -1
- package/dist/es/hash.mjs.map +1 -1
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/index2.mjs +3 -3
- package/dist/es/index2.mjs.map +1 -1
- package/dist/es/mutative/register.mjs.map +1 -1
- package/dist/es/mutativeMethods.mjs.map +1 -1
- package/dist/es/patches/register.mjs.map +1 -1
- package/dist/es/persist/register.mjs.map +1 -1
- package/dist/es/persist.mjs +7 -7
- package/dist/es/persist.mjs.map +1 -1
- package/dist/es/propAccess.mjs +4 -4
- package/dist/es/propAccess.mjs.map +1 -1
- package/dist/es/react/index.mjs +16 -16
- package/dist/es/react/index.mjs.map +1 -1
- package/dist/es/react/register.mjs.map +1 -1
- package/dist/es/scope.mjs +9 -9
- package/dist/es/scope.mjs.map +1 -1
- package/dist/es/store.mjs +36 -36
- package/dist/es/store.mjs.map +1 -1
- package/dist/es/storeMethods.mjs +27 -19
- package/dist/es/storeMethods.mjs.map +1 -1
- package/dist/es/urlStore.mjs +6 -6
- package/dist/es/urlStore.mjs.map +1 -1
- package/dist/types/core/cache.d.ts +5 -4
- package/dist/types/core/store.d.ts +6 -5
- package/dist/types/lib/constrain.d.ts +1 -0
- package/dist/types/lib/makeSelector.d.ts +2 -2
- package/dist/types/lib/path.d.ts +1 -0
- package/dist/types/lib/propAccess.d.ts +4 -3
- package/dist/types/mutative/mutativeMethods.d.ts +2 -1
- package/dist/types/react/form/form.d.ts +8 -8
- package/dist/types/react/form/formField.d.ts +8 -11
- package/dist/types/react/form/formForEach.d.ts +4 -5
- package/dist/types/react/scope.d.ts +3 -2
- package/dist/types/react/scopeMethods.d.ts +3 -2
- package/dist/types/react/storeMethods.d.ts +3 -2
- package/dist/types/react/useProp.d.ts +2 -1
- package/dist/types/react/useStore.d.ts +2 -1
- package/package.json +12 -12
package/dist/es/persist.mjs
CHANGED
|
@@ -20,7 +20,7 @@ const isAncestor = (ancestor, path) => {
|
|
|
20
20
|
};
|
|
21
21
|
const split = (value, path) => {
|
|
22
22
|
const [first, ...rest] = path;
|
|
23
|
-
if (first ===
|
|
23
|
+
if (first === undefined) return [{ path: [], value }];
|
|
24
24
|
let entries;
|
|
25
25
|
if (value instanceof Map) {
|
|
26
26
|
entries = value;
|
|
@@ -37,7 +37,7 @@ const split = (value, path) => {
|
|
|
37
37
|
);
|
|
38
38
|
}
|
|
39
39
|
const subValue = entries.get(first);
|
|
40
|
-
if (subValue ===
|
|
40
|
+
if (subValue === undefined) return [{ path: [], value }];
|
|
41
41
|
return split(subValue, rest).map(({ path: path2, value: value2 }) => ({ path: [first, ...path2], value: value2 }));
|
|
42
42
|
};
|
|
43
43
|
|
|
@@ -115,14 +115,14 @@ class Persist {
|
|
|
115
115
|
this.watchStorage();
|
|
116
116
|
}
|
|
117
117
|
watchStore() {
|
|
118
|
-
const throttle = Math.min(...this.paths.map((p) => p.throttle ?? 0)) ||
|
|
118
|
+
const throttle = Math.min(...this.paths.map((p) => p.throttle ?? 0)) || undefined;
|
|
119
119
|
const cancel = subscribePatches.apply(this.store, [
|
|
120
120
|
(patches, reversePatches) => {
|
|
121
121
|
let i = 0;
|
|
122
122
|
for (const patch of patches) {
|
|
123
123
|
const reversePatch = reversePatches[i++];
|
|
124
124
|
const stringPath = JSON.stringify(patch.path);
|
|
125
|
-
if (this.updateInProgress.has(stringPath) && this.updateInProgress.get(stringPath) === (patch.op === "remove" ?
|
|
125
|
+
if (this.updateInProgress.has(stringPath) && this.updateInProgress.get(stringPath) === (patch.op === "remove" ? undefined : patch.value)) {
|
|
126
126
|
continue;
|
|
127
127
|
}
|
|
128
128
|
const matchingPaths = this.paths.filter(
|
|
@@ -230,7 +230,7 @@ class Persist {
|
|
|
230
230
|
value: !value || value === "undefined" ? void 0 : fromExtendedJsonString(value)
|
|
231
231
|
};
|
|
232
232
|
} catch {
|
|
233
|
-
return
|
|
233
|
+
return undefined;
|
|
234
234
|
}
|
|
235
235
|
}).filter(Boolean);
|
|
236
236
|
if (toWrite.length > 0) {
|
|
@@ -239,7 +239,7 @@ class Persist {
|
|
|
239
239
|
}
|
|
240
240
|
this.store.set((state) => {
|
|
241
241
|
for (const { path, value } of toWrite) {
|
|
242
|
-
if (value ===
|
|
242
|
+
if (value === undefined) {
|
|
243
243
|
state = remove(state, path);
|
|
244
244
|
} else {
|
|
245
245
|
state = set(state, path, value);
|
|
@@ -261,7 +261,7 @@ class Persist {
|
|
|
261
261
|
const key = this.buildKey({ type: "data", path });
|
|
262
262
|
const value = get(this.store.get(), path);
|
|
263
263
|
return promiseChain(value).then((value2) => {
|
|
264
|
-
if (value2 ===
|
|
264
|
+
if (value2 === undefined) {
|
|
265
265
|
return this.storage.removeItem(key);
|
|
266
266
|
} else {
|
|
267
267
|
return this.storage.setItem(key, toExtendedJsonString(value2));
|
package/dist/es/persist.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persist.mjs","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 then<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 then(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 {\n entries = new Map(Object.entries(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 .then((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 .then((keys) => {\n return keys.filter((key): key is string => typeof key === 'string');\n }).value;\n }\n })\n .then((keys) => {\n const results = keys.map(\n (key) =>\n promiseChain(storage.getItem(key)).then((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 .then((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 './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}\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: false, passive: true, throttle },\n ]);\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\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 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 }).then((value) => [key, value] as const).value,\n );\n\n return entries.some(isPromise)\n ? Promise.all(entries)\n : (entries as [Key, string | null][]);\n }).then((entries) => {\n return entries.filter((entry) => entry !== null) as [Key, string][];\n }).value;\n } else {\n return [...items.entries()];\n }\n }).then((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) => 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 .then((value) => {\n if (value === undefined) {\n return this.storage.removeItem(key);\n } else {\n return this.storage.setItem(key, toExtendedJsonString(value));\n }\n })\n .then(() => {\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"],"names":["value","path"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"persist.mjs","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 then<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 then(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 {\n entries = new Map(Object.entries(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 .then((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 .then((keys) => {\n return keys.filter((key): key is string => typeof key === 'string');\n }).value;\n }\n })\n .then((keys) => {\n const results = keys.map(\n (key) =>\n promiseChain(storage.getItem(key)).then((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 .then((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 './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}\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: false, passive: true, throttle },\n ]);\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\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 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 }).then((value) => [key, value] as const).value,\n );\n\n return entries.some(isPromise)\n ? Promise.all(entries)\n : (entries as [Key, string | null][]);\n }).then((entries) => {\n return entries.filter((entry) => entry !== null) as [Key, string][];\n }).value;\n } else {\n return [...items.entries()];\n }\n }).then((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) => 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 .then((value) => {\n if (value === undefined) {\n return this.storage.removeItem(key);\n } else {\n return this.storage.setItem(key, toExtendedJsonString(value));\n }\n })\n .then(() => {\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"],"names":["value","path"],"mappings":"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"}
|
package/dist/es/propAccess.mjs
CHANGED
|
@@ -84,7 +84,7 @@ function castArrayPath(path) {
|
|
|
84
84
|
function get(object, path) {
|
|
85
85
|
const _path = castArrayPath(path);
|
|
86
86
|
const [first, ...rest] = _path;
|
|
87
|
-
if (first ===
|
|
87
|
+
if (first === undefined || !object) {
|
|
88
88
|
return object;
|
|
89
89
|
}
|
|
90
90
|
if (object instanceof Map) {
|
|
@@ -101,7 +101,7 @@ function get(object, path) {
|
|
|
101
101
|
function set(object, path, value, rootPath = path) {
|
|
102
102
|
const _path = castArrayPath(path);
|
|
103
103
|
const [first, ...rest] = _path;
|
|
104
|
-
if (first ===
|
|
104
|
+
if (first === undefined) {
|
|
105
105
|
return value;
|
|
106
106
|
}
|
|
107
107
|
if (object instanceof Map) {
|
|
@@ -116,7 +116,7 @@ function set(object, path, value, rootPath = path) {
|
|
|
116
116
|
copy[Number(first)] = set(child, rest, value, rootPath);
|
|
117
117
|
return new Set(copy);
|
|
118
118
|
}
|
|
119
|
-
if (isObject(object) || object ===
|
|
119
|
+
if (isObject(object) || object === undefined) {
|
|
120
120
|
const copy = flatClone(object ?? {});
|
|
121
121
|
copy[first] = set(copy[first], rest, value, rootPath);
|
|
122
122
|
return copy;
|
|
@@ -126,7 +126,7 @@ function set(object, path, value, rootPath = path) {
|
|
|
126
126
|
function remove(object, path) {
|
|
127
127
|
const _path = castArrayPath(path);
|
|
128
128
|
if (_path.length === 0) {
|
|
129
|
-
return
|
|
129
|
+
return undefined;
|
|
130
130
|
}
|
|
131
131
|
const parentPath = _path.slice(0, -1);
|
|
132
132
|
const key = _path[_path.length - 1];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propAccess.mjs","sources":["../../src/lib/equals.ts","../../src/lib/helpers.ts","../../src/lib/clone.ts","../../src/lib/propAccess.ts"],"sourcesContent":["export function strictEqual(a: any, b: any): boolean {\n return a === b;\n}\n\nexport function shallowEqual(a: any, b: any): boolean {\n return internalEqual(strictEqual)(a, b);\n}\n\nexport function deepEqual(a: any, b: any): boolean {\n return internalEqual(deepEqual)(a, b);\n}\n\nconst internalEqual = (comp: (a: any, b: any) => boolean) => (a: any, b: any) => {\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 const entries1 = Object.entries(a);\n const entries2 = Object.entries(b);\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 return (\n a.size === b.size &&\n [...a.entries()].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 { 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 extends Path<T>>(object: T, path: P): 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 extends SettablePath<T>>(\n object: T,\n path: P,\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, 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, 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, rootPath);\n return copy;\n }\n\n throw new Error(`Could not set ${path} of ${object}`);\n}\n\nexport function remove<T, const P extends Path<T, true>>(object: T, path: P): 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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"propAccess.mjs","sources":["../../src/lib/equals.ts","../../src/lib/helpers.ts","../../src/lib/clone.ts","../../src/lib/propAccess.ts"],"sourcesContent":["export function strictEqual(a: any, b: any): boolean {\n return a === b;\n}\n\nexport function shallowEqual(a: any, b: any): boolean {\n return internalEqual(strictEqual)(a, b);\n}\n\nexport function deepEqual(a: any, b: any): boolean {\n return internalEqual(deepEqual)(a, b);\n}\n\nconst internalEqual = (comp: (a: any, b: any) => boolean) => (a: any, b: any) => {\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 const entries1 = Object.entries(a);\n const entries2 = Object.entries(b);\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 return (\n a.size === b.size &&\n [...a.entries()].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"],"names":[],"mappings":"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"}
|
package/dist/es/react/index.mjs
CHANGED
|
@@ -41,7 +41,7 @@ function CustomInput({ name, children, ...props }) {
|
|
|
41
41
|
function getWildCardMatches(object, path) {
|
|
42
42
|
const matches = {};
|
|
43
43
|
const [first, second, ...rest] = castArrayPath(path);
|
|
44
|
-
if (first ===
|
|
44
|
+
if (first === undefined) {
|
|
45
45
|
throw new Error("Path is empty");
|
|
46
46
|
}
|
|
47
47
|
if (!Array.isArray(object) && !isObject(object)) {
|
|
@@ -51,7 +51,7 @@ function getWildCardMatches(object, path) {
|
|
|
51
51
|
if (first !== "*" && first !== key) {
|
|
52
52
|
continue;
|
|
53
53
|
}
|
|
54
|
-
if (second ===
|
|
54
|
+
if (second === undefined) {
|
|
55
55
|
matches[key] = value;
|
|
56
56
|
continue;
|
|
57
57
|
}
|
|
@@ -85,7 +85,7 @@ function FormField({
|
|
|
85
85
|
if (serialize) {
|
|
86
86
|
return serialize(value2, getFormState());
|
|
87
87
|
}
|
|
88
|
-
if (value2 !==
|
|
88
|
+
if (value2 !== undefined) {
|
|
89
89
|
return value2;
|
|
90
90
|
}
|
|
91
91
|
return defaultValue;
|
|
@@ -93,12 +93,12 @@ function FormField({
|
|
|
93
93
|
const setValue = (x) => form.getField(name).setValue(deserialize(x, getFormState()));
|
|
94
94
|
const hasTriggeredValidations = this.useFormState((form2) => form2.hasTriggeredValidations);
|
|
95
95
|
useEffect(() => {
|
|
96
|
-
if (localValue ===
|
|
96
|
+
if (localValue === undefined || !commitDebounce) {
|
|
97
97
|
return;
|
|
98
98
|
}
|
|
99
99
|
const timeout = setTimeout(() => {
|
|
100
100
|
setValue(localValue);
|
|
101
|
-
setLocalValue(
|
|
101
|
+
setLocalValue(undefined);
|
|
102
102
|
}, commitDebounce);
|
|
103
103
|
return () => clearTimeout(timeout);
|
|
104
104
|
}, [localValue, commitDebounce]);
|
|
@@ -118,9 +118,9 @@ function FormField({
|
|
|
118
118
|
onChange?.(event, ...moreArgs);
|
|
119
119
|
},
|
|
120
120
|
onBlur(...args) {
|
|
121
|
-
if (localValue !==
|
|
121
|
+
if (localValue !== undefined) {
|
|
122
122
|
setValue(localValue);
|
|
123
|
-
setLocalValue(
|
|
123
|
+
setLocalValue(undefined);
|
|
124
124
|
}
|
|
125
125
|
onBlur?.(...args);
|
|
126
126
|
}
|
|
@@ -273,12 +273,12 @@ function FormContainer({
|
|
|
273
273
|
...formProps,
|
|
274
274
|
className: [
|
|
275
275
|
formProps.className,
|
|
276
|
-
hasTriggeredValidations ? formInstance.options.validatedClass ?? "validated" :
|
|
276
|
+
hasTriggeredValidations ? formInstance.options.validatedClass ?? "validated" : undefined
|
|
277
277
|
].filter(Boolean).join(" "),
|
|
278
278
|
onSubmit: (event) => {
|
|
279
279
|
event.preventDefault();
|
|
280
280
|
const formElement = event.currentTarget;
|
|
281
|
-
const buttonElement = event.nativeEvent instanceof SubmitEvent && event.nativeEvent.submitter instanceof HTMLButtonElement ? event.nativeEvent.submitter :
|
|
281
|
+
const buttonElement = event.nativeEvent instanceof SubmitEvent && event.nativeEvent.submitter instanceof HTMLButtonElement ? event.nativeEvent.submitter : undefined;
|
|
282
282
|
updateValidity(formInstance.derivedState.get().errors, buttonElement);
|
|
283
283
|
formElement.reportValidity();
|
|
284
284
|
const isValid = formInstance.validate();
|
|
@@ -295,7 +295,7 @@ function FormContainer({
|
|
|
295
295
|
function getField(derivedState, original, path) {
|
|
296
296
|
return {
|
|
297
297
|
get originalValue() {
|
|
298
|
-
return original !==
|
|
298
|
+
return original !== undefined ? get(original, path) : undefined;
|
|
299
299
|
},
|
|
300
300
|
get value() {
|
|
301
301
|
const { draft } = derivedState.get();
|
|
@@ -365,7 +365,7 @@ function getErrors(draft, original, validations) {
|
|
|
365
365
|
}
|
|
366
366
|
}
|
|
367
367
|
if (!matched && !path.includes("*")) {
|
|
368
|
-
if (!validate(
|
|
368
|
+
if (!validate(undefined, { draft, original, field: path })) {
|
|
369
369
|
const fieldErrors = errors.get(path) ?? [];
|
|
370
370
|
fieldErrors.push(validationName);
|
|
371
371
|
errors.set(path, fieldErrors);
|
|
@@ -429,7 +429,7 @@ class Form {
|
|
|
429
429
|
};
|
|
430
430
|
const formState = useMemo(() => {
|
|
431
431
|
return createStore({
|
|
432
|
-
draft:
|
|
432
|
+
draft: undefined,
|
|
433
433
|
hasTriggeredValidations: false,
|
|
434
434
|
saveScheduled: false,
|
|
435
435
|
saveInProgress: false
|
|
@@ -492,7 +492,7 @@ class Form {
|
|
|
492
492
|
return derivedState.get().isValid;
|
|
493
493
|
},
|
|
494
494
|
reset() {
|
|
495
|
-
formState.set("draft",
|
|
495
|
+
formState.set("draft", undefined);
|
|
496
496
|
formState.set("hasTriggeredValidations", false);
|
|
497
497
|
}
|
|
498
498
|
};
|
|
@@ -515,7 +515,7 @@ class Form {
|
|
|
515
515
|
typeof urlState === "object" ? urlState : { key: "form" }
|
|
516
516
|
);
|
|
517
517
|
}
|
|
518
|
-
return
|
|
518
|
+
return undefined;
|
|
519
519
|
}, [formState, simpleHash(urlState)]);
|
|
520
520
|
useEffect(() => {
|
|
521
521
|
const handles = options.transform?.map(({ trigger, update }) => {
|
|
@@ -524,7 +524,7 @@ class Form {
|
|
|
524
524
|
return triggerStore.subscribe(() => {
|
|
525
525
|
const value = trigger ? get(draft.get(), trigger) : draft.get();
|
|
526
526
|
const result = update(value, draft);
|
|
527
|
-
if (result !==
|
|
527
|
+
if (result !== undefined) {
|
|
528
528
|
draft.set(result);
|
|
529
529
|
}
|
|
530
530
|
});
|
|
@@ -570,7 +570,7 @@ function useDecoupledState(value, onChange, options = {}) {
|
|
|
570
570
|
const { onChange: onChange2, onCommit } = ref.current;
|
|
571
571
|
const update2 = (value2) => {
|
|
572
572
|
onChange2(value2);
|
|
573
|
-
setDirty(
|
|
573
|
+
setDirty(undefined);
|
|
574
574
|
onCommit?.(value2);
|
|
575
575
|
};
|
|
576
576
|
let delayedUpdate;
|