cross-state 0.54.0 → 0.54.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/mutative/register.cjs.map +1 -1
  2. package/dist/mutative/register.d.cts +1 -1
  3. package/dist/mutative/register.d.ts +1 -1
  4. package/dist/mutative/register.js.map +1 -1
  5. package/dist/{patchMethods-Dxad6HF6.d.ts → patchMethods-CT9M507t.d.ts} +2 -2
  6. package/dist/patchMethods-D5YJwcpn.cjs.map +1 -1
  7. package/dist/patchMethods-DRPfkhAe.js.map +1 -1
  8. package/dist/{patchMethods-C3L7Kh8T.d.cts → patchMethods-pw_OcPA8.d.cts} +2 -2
  9. package/dist/patches/index.d.cts +1 -1
  10. package/dist/patches/index.d.ts +1 -1
  11. package/dist/patches/register.cjs.map +1 -1
  12. package/dist/patches/register.d.cts +2 -2
  13. package/dist/patches/register.d.ts +2 -2
  14. package/dist/patches/register.js.map +1 -1
  15. package/dist/persist/register.cjs.map +1 -1
  16. package/dist/persist/register.d.cts +1 -1
  17. package/dist/persist/register.d.ts +1 -1
  18. package/dist/persist/register.js.map +1 -1
  19. package/dist/react/index.cjs +22 -10
  20. package/dist/react/index.cjs.map +1 -1
  21. package/dist/react/index.d.cts +7 -6
  22. package/dist/react/index.d.ts +7 -6
  23. package/dist/react/index.js +22 -10
  24. package/dist/react/index.js.map +1 -1
  25. package/dist/react/register.cjs.map +1 -1
  26. package/dist/react/register.d.cts +2 -2
  27. package/dist/react/register.d.ts +2 -2
  28. package/dist/react/register.js.map +1 -1
  29. package/dist/storeMethods-AIJSwxHz.js.map +1 -1
  30. package/dist/{storeMethods-C4luym7C.d.ts → storeMethods-BjOAF4Pk.d.ts} +2 -2
  31. package/dist/{storeMethods-BQwU2Uia.d.cts → storeMethods-DIyKFgk1.d.cts} +2 -2
  32. package/dist/storeMethods-DVVsmUg1.cjs.map +1 -1
  33. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"register.cjs","names":["Store","mutativeMethods","autobind"],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { autobind } from '@lib/autobind';\nimport { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends MutativeMethods {}\n}\n\nObject.assign(Store.prototype, mutativeMethods);\nautobind(Store);\n"],"mappings":";;;;;AAWA,OAAO,OAAOA,oBAAM,WAAWC;AAC/BC,uBAASF"}
1
+ {"version":3,"file":"register.cjs","names":["Store","mutativeMethods","autobind"],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { autobind } from '@lib/autobind';\nimport { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends MutativeMethods {}\n}\n\nObject.assign(Store.prototype, mutativeMethods);\nautobind(Store);\n"],"mappings":";;;;;AAWA,OAAO,OAAOA,oBAAM,WAAWC;AAC/BC,uBAASF"}
@@ -3,7 +3,7 @@ import { mutativeMethods } from "../mutativeMethods-6QzygG3W.cjs";
3
3
 
4
4
  //#region src/mutative/register.d.ts
5
5
  type MutativeMethods = typeof mutativeMethods;
6
- declare module "@core" {
6
+ declare module ".." {
7
7
  interface Store<T> extends MutativeMethods {}
8
8
  }
9
9
  //#endregion
@@ -3,7 +3,7 @@ import { mutativeMethods } from "../mutativeMethods-Br3xN2Iq.js";
3
3
 
4
4
  //#region src/mutative/register.d.ts
5
5
  type MutativeMethods = typeof mutativeMethods;
6
- declare module "@core" {
6
+ declare module ".." {
7
7
  interface Store<T> extends MutativeMethods {}
8
8
  }
9
9
  //# sourceMappingURL=register.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","names":[],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { autobind } from '@lib/autobind';\nimport { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends MutativeMethods {}\n}\n\nObject.assign(Store.prototype, mutativeMethods);\nautobind(Store);\n"],"mappings":";;;;;AAWA,OAAO,OAAO,MAAM,WAAW;AAC/B,SAAS"}
1
+ {"version":3,"file":"register.js","names":[],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { autobind } from '@lib/autobind';\nimport { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends MutativeMethods {}\n}\n\nObject.assign(Store.prototype, mutativeMethods);\nautobind(Store);\n"],"mappings":";;;;;AAWA,OAAO,OAAO,MAAM,WAAW;AAC/B,SAAS"}
@@ -10,7 +10,7 @@ interface SyncMessage {
10
10
  interface HistoryEntry extends SyncMessage {
11
11
  reversePatches: Patch[];
12
12
  }
13
- declare module "@core" {
13
+ declare module ".." {
14
14
  interface Store<T> {
15
15
  __patches?: {
16
16
  value: T;
@@ -45,4 +45,4 @@ declare const patchMethods: {
45
45
  };
46
46
  //#endregion
47
47
  export { SubscribePatchOptions, SyncMessage, patchMethods };
48
- //# sourceMappingURL=patchMethods-Dxad6HF6.d.ts.map
48
+ //# sourceMappingURL=patchMethods-CT9M507t.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"patchMethods-D5YJwcpn.cjs","names":["remove","set","deepEqual","isObject","applyPatches","_applyPatches","toExtendedJson","fromExtendedJson","patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n}"],"sources":["../src/lib/applyPatches.ts","../src/lib/diff.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import { isObject } from '@lib/helpers';\nimport { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport interface DiffOptions {\n stopAt?: number | ((path: KeyType[]) => boolean);\n}\n\nexport function diff(\n a: any,\n b: any,\n options: DiffOptions = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b, options)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n options: DiffOptions,\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (\n (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n (typeof options.stopAt === 'function' && options.stopAt(prefix))\n ) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Date && b instanceof Date) {\n if (a.getTime() === b.getTime()) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (isObject(a) && isObject(b) && !Array.isArray(a) && !Array.isArray(b)) {\n return yield* objectDiff(a, b, options, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n const debounce =\n typeof options?.debounce === 'object' && 'wait' in options.debounce\n ? { ...options.debounce }\n : options?.debounce !== undefined\n ? { wait: options.debounce }\n : undefined;\n\n if (debounce) {\n debounce.waitOnRunNow ??= false;\n }\n\n return subscribePatches.apply<\n Store<T>,\n Parameters<typeof subscribePatches<T>>,\n ReturnType<typeof subscribePatches<T>>\n >(this, [\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, debounce, runNow: true },\n ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"patchMethods-D5YJwcpn.cjs","names":["remove","set","deepEqual","isObject","applyPatches","_applyPatches","toExtendedJson","fromExtendedJson","patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n}"],"sources":["../src/lib/applyPatches.ts","../src/lib/diff.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import { isObject } from '@lib/helpers';\nimport { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport interface DiffOptions {\n stopAt?: number | ((path: KeyType[]) => boolean);\n}\n\nexport function diff(\n a: any,\n b: any,\n options: DiffOptions = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b, options)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n options: DiffOptions,\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (\n (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n (typeof options.stopAt === 'function' && options.stopAt(prefix))\n ) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Date && b instanceof Date) {\n if (a.getTime() === b.getTime()) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (isObject(a) && isObject(b) && !Array.isArray(a) && !Array.isArray(b)) {\n return yield* objectDiff(a, b, options, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n const debounce =\n typeof options?.debounce === 'object' && 'wait' in options.debounce\n ? { ...options.debounce }\n : options?.debounce !== undefined\n ? { wait: options.debounce }\n : undefined;\n\n if (debounce) {\n debounce.waitOnRunNow ??= false;\n }\n\n return subscribePatches.apply<\n Store<T>,\n Parameters<typeof subscribePatches<T>>,\n ReturnType<typeof subscribePatches<T>>\n >(this, [\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, debounce, runNow: true },\n ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"patchMethods-DRPfkhAe.js","names":["applyPatches","_applyPatches","patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n}"],"sources":["../src/lib/applyPatches.ts","../src/lib/diff.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import { isObject } from '@lib/helpers';\nimport { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport interface DiffOptions {\n stopAt?: number | ((path: KeyType[]) => boolean);\n}\n\nexport function diff(\n a: any,\n b: any,\n options: DiffOptions = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b, options)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n options: DiffOptions,\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (\n (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n (typeof options.stopAt === 'function' && options.stopAt(prefix))\n ) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Date && b instanceof Date) {\n if (a.getTime() === b.getTime()) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (isObject(a) && isObject(b) && !Array.isArray(a) && !Array.isArray(b)) {\n return yield* objectDiff(a, b, options, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n const debounce =\n typeof options?.debounce === 'object' && 'wait' in options.debounce\n ? { ...options.debounce }\n : options?.debounce !== undefined\n ? { wait: options.debounce }\n : undefined;\n\n if (debounce) {\n debounce.waitOnRunNow ??= false;\n }\n\n return subscribePatches.apply<\n Store<T>,\n Parameters<typeof subscribePatches<T>>,\n ReturnType<typeof subscribePatches<T>>\n >(this, [\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, debounce, runNow: true },\n ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"patchMethods-DRPfkhAe.js","names":["applyPatches","_applyPatches","patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n}"],"sources":["../src/lib/applyPatches.ts","../src/lib/diff.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import { isObject } from '@lib/helpers';\nimport { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport interface DiffOptions {\n stopAt?: number | ((path: KeyType[]) => boolean);\n}\n\nexport function diff(\n a: any,\n b: any,\n options: DiffOptions = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b, options)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n options: DiffOptions,\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (\n (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n (typeof options.stopAt === 'function' && options.stopAt(prefix))\n ) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Date && b instanceof Date) {\n if (a.getTime() === b.getTime()) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (isObject(a) && isObject(b) && !Array.isArray(a) && !Array.isArray(b)) {\n return yield* objectDiff(a, b, options, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n const debounce =\n typeof options?.debounce === 'object' && 'wait' in options.debounce\n ? { ...options.debounce }\n : options?.debounce !== undefined\n ? { wait: options.debounce }\n : undefined;\n\n if (debounce) {\n debounce.waitOnRunNow ??= false;\n }\n\n return subscribePatches.apply<\n Store<T>,\n Parameters<typeof subscribePatches<T>>,\n ReturnType<typeof subscribePatches<T>>\n >(this, [\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, debounce, runNow: true },\n ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"mappings":"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"}
@@ -10,7 +10,7 @@ interface SyncMessage {
10
10
  interface HistoryEntry extends SyncMessage {
11
11
  reversePatches: Patch[];
12
12
  }
13
- declare module "@core" {
13
+ declare module ".." {
14
14
  interface Store<T> {
15
15
  __patches?: {
16
16
  value: T;
@@ -45,4 +45,4 @@ declare const patchMethods: {
45
45
  };
46
46
  //#endregion
47
47
  export { SubscribePatchOptions, SyncMessage, patchMethods };
48
- //# sourceMappingURL=patchMethods-C3L7Kh8T.d.cts.map
48
+ //# sourceMappingURL=patchMethods-pw_OcPA8.d.cts.map
@@ -1,4 +1,4 @@
1
1
  import "../store-BEsiS8y7.cjs";
2
2
  import "../diff-BQ8bB3Wk.cjs";
3
- import { SubscribePatchOptions, SyncMessage, patchMethods } from "../patchMethods-C3L7Kh8T.cjs";
3
+ import { SubscribePatchOptions, SyncMessage, patchMethods } from "../patchMethods-pw_OcPA8.cjs";
4
4
  export { type SubscribePatchOptions, type SyncMessage, patchMethods };
@@ -1,4 +1,4 @@
1
1
  import "../store-DKaeE840.js";
2
2
  import "../diff-gZezL04N.js";
3
- import { SubscribePatchOptions, SyncMessage, patchMethods } from "../patchMethods-Dxad6HF6.js";
3
+ import { SubscribePatchOptions, SyncMessage, patchMethods } from "../patchMethods-CT9M507t.js";
4
4
  export { type SubscribePatchOptions, type SyncMessage, patchMethods };
@@ -1 +1 @@
1
- {"version":3,"file":"register.cjs","names":["Store","patchMethods","autobind"],"sources":["../../src/patches/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { patchMethods } from './patchMethods';\n\ntype PatchMethods = typeof patchMethods;\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends PatchMethods {}\n}\n\nObject.assign(Store.prototype, patchMethods);\nautobind(Store);\n"],"mappings":";;;;;;AAWA,OAAO,OAAOA,oBAAM,WAAWC;AAC/BC,uBAASF"}
1
+ {"version":3,"file":"register.cjs","names":["Store","patchMethods","autobind"],"sources":["../../src/patches/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { patchMethods } from './patchMethods';\n\ntype PatchMethods = typeof patchMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends PatchMethods {}\n}\n\nObject.assign(Store.prototype, patchMethods);\nautobind(Store);\n"],"mappings":";;;;;;AAWA,OAAO,OAAOA,oBAAM,WAAWC;AAC/BC,uBAASF"}
@@ -1,10 +1,10 @@
1
1
  import "../store-BEsiS8y7.cjs";
2
2
  import "../diff-BQ8bB3Wk.cjs";
3
- import { patchMethods } from "../patchMethods-C3L7Kh8T.cjs";
3
+ import { patchMethods } from "../patchMethods-pw_OcPA8.cjs";
4
4
 
5
5
  //#region src/patches/register.d.ts
6
6
  type PatchMethods = typeof patchMethods;
7
- declare module "@core" {
7
+ declare module ".." {
8
8
  interface Store<T> extends PatchMethods {}
9
9
  }
10
10
  //#endregion
@@ -1,10 +1,10 @@
1
1
  import "../store-DKaeE840.js";
2
2
  import "../diff-gZezL04N.js";
3
- import { patchMethods } from "../patchMethods-Dxad6HF6.js";
3
+ import { patchMethods } from "../patchMethods-CT9M507t.js";
4
4
 
5
5
  //#region src/patches/register.d.ts
6
6
  type PatchMethods = typeof patchMethods;
7
- declare module "@core" {
7
+ declare module ".." {
8
8
  interface Store<T> extends PatchMethods {}
9
9
  }
10
10
  //# sourceMappingURL=register.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","names":[],"sources":["../../src/patches/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { patchMethods } from './patchMethods';\n\ntype PatchMethods = typeof patchMethods;\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends PatchMethods {}\n}\n\nObject.assign(Store.prototype, patchMethods);\nautobind(Store);\n"],"mappings":";;;;;;AAWA,OAAO,OAAO,MAAM,WAAW;AAC/B,SAAS"}
1
+ {"version":3,"file":"register.js","names":[],"sources":["../../src/patches/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { patchMethods } from './patchMethods';\n\ntype PatchMethods = typeof patchMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends PatchMethods {}\n}\n\nObject.assign(Store.prototype, patchMethods);\nautobind(Store);\n"],"mappings":";;;;;;AAWA,OAAO,OAAO,MAAM,WAAW;AAC/B,SAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"register.cjs","names":["Store","persist"],"sources":["../../src/persist/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { persist, type Persist, type PersistOptions } from '@persist/persist';\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface StoreOptions<T> {\n persist?: PersistOptions<T>;\n }\n\n interface Store<T> {\n persistance?: Persist<T>;\n }\n}\n\nStore.addHook((store) => {\n if (store.options.persist) {\n store.persistance = persist(store, store.options.persist);\n }\n});\n"],"mappings":";;;;;;;AAcAA,oBAAM,SAAS,UAAU;AACvB,KAAI,MAAM,QAAQ,QAChB,OAAM,cAAcC,wBAAQ,OAAO,MAAM,QAAQ"}
1
+ {"version":3,"file":"register.cjs","names":["Store","persist"],"sources":["../../src/persist/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { persist, type Persist, type PersistOptions } from '@persist/persist';\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface StoreOptions<T> {\n persist?: PersistOptions<T>;\n }\n\n interface Store<T> {\n persistance?: Persist<T>;\n }\n}\n\nStore.addHook((store) => {\n if (store.options.persist) {\n store.persistance = persist(store, store.options.persist);\n }\n});\n"],"mappings":";;;;;;;AAcAA,oBAAM,SAAS,UAAU;AACvB,KAAI,MAAM,QAAQ,QAChB,OAAM,cAAcC,wBAAQ,OAAO,MAAM,QAAQ"}
@@ -2,7 +2,7 @@ import "../store-BEsiS8y7.cjs";
2
2
  import { Persist, PersistOptions } from "../persist-D7MAsyyW.cjs";
3
3
 
4
4
  //#region src/persist/register.d.ts
5
- declare module "@core" {
5
+ declare module ".." {
6
6
  interface StoreOptions<T> {
7
7
  persist?: PersistOptions<T>;
8
8
  }
@@ -2,7 +2,7 @@ import "../store-DKaeE840.js";
2
2
  import { Persist, PersistOptions } from "../persist-CPjpg6D0.js";
3
3
 
4
4
  //#region src/persist/register.d.ts
5
- declare module "@core" {
5
+ declare module ".." {
6
6
  interface StoreOptions<T> {
7
7
  persist?: PersistOptions<T>;
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","names":[],"sources":["../../src/persist/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { persist, type Persist, type PersistOptions } from '@persist/persist';\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface StoreOptions<T> {\n persist?: PersistOptions<T>;\n }\n\n interface Store<T> {\n persistance?: Persist<T>;\n }\n}\n\nStore.addHook((store) => {\n if (store.options.persist) {\n store.persistance = persist(store, store.options.persist);\n }\n});\n"],"mappings":";;;;;;;AAcA,MAAM,SAAS,UAAU;AACvB,KAAI,MAAM,QAAQ,QAChB,OAAM,cAAc,QAAQ,OAAO,MAAM,QAAQ"}
1
+ {"version":3,"file":"register.js","names":[],"sources":["../../src/persist/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { persist, type Persist, type PersistOptions } from '@persist/persist';\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface StoreOptions<T> {\n persist?: PersistOptions<T>;\n }\n\n interface Store<T> {\n persistance?: Persist<T>;\n }\n}\n\nStore.addHook((store) => {\n if (store.options.persist) {\n store.persistance = persist(store, store.options.persist);\n }\n});\n"],"mappings":";;;;;;;AAcA,MAAM,SAAS,UAAU;AACvB,KAAI,MAAM,QAAQ,QAChB,OAAM,cAAc,QAAQ,OAAO,MAAM,QAAQ"}
@@ -468,15 +468,6 @@ function useUrlContext() {
468
468
  return context;
469
469
  }
470
470
 
471
- //#endregion
472
- //#region src/react/url/urlOptions.ts
473
- function createUrlOptions(options) {
474
- return {
475
- ...options,
476
- defaultValue: options.defaultValue
477
- };
478
- }
479
-
480
471
  //#endregion
481
472
  //#region src/react/url/urlHelpers.ts
482
473
  function defaultDeserializer(value) {
@@ -498,10 +489,25 @@ function createStorageKey(id, key) {
498
489
  return `cross-state:url:${id}:${key}`;
499
490
  }
500
491
 
492
+ //#endregion
493
+ //#region src/react/url/urlOptions.ts
494
+ function createUrlOptions({ key, type = "hash", serialize = defaultSerializer, deserialize = defaultDeserializer, defaultValue = void 0, writeDefaultValue = false, onCommit = () => void 0, persist = null }) {
495
+ return {
496
+ key,
497
+ type,
498
+ serialize,
499
+ deserialize,
500
+ defaultValue,
501
+ writeDefaultValue,
502
+ onCommit,
503
+ persist
504
+ };
505
+ }
506
+
501
507
  //#endregion
502
508
  //#region src/react/url/useUrlParam.ts
503
509
  function useUrlParam(input) {
504
- const { key, type = "hash", serialize = defaultSerializer, deserialize = defaultDeserializer, defaultValue, writeDefaultValue, onCommit, persist } = "options" in input ? input.options : input;
510
+ const { key, type, serialize, deserialize, defaultValue, writeDefaultValue, onCommit, persist } = createUrlOptions("options" in input ? input.options : input);
505
511
  const { location, navigate } = useUrlContext();
506
512
  const url = parseLocation(location);
507
513
  const params = new URLSearchParams(url[type].slice(1));
@@ -548,6 +554,12 @@ var UrlStore = class {
548
554
  useProp() {
549
555
  return useUrlParam(this);
550
556
  }
557
+ parse(location) {
558
+ const url = parseLocation(location);
559
+ const params = new URLSearchParams(url[this.options.type].slice(1));
560
+ const urlValue = params.get(this.options.key);
561
+ return urlValue !== null ? this.options.deserialize(urlValue) : void 0;
562
+ }
551
563
  };
552
564
  function createUrlStore(options) {
553
565
  return new UrlStore(createUrlOptions(options));