cross-state 0.38.1 → 0.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/cjs/index.cjs +2 -214
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index2.cjs +118 -44
  4. package/dist/cjs/index2.cjs.map +1 -1
  5. package/dist/cjs/persist/register.cjs +11 -0
  6. package/dist/cjs/persist/register.cjs.map +1 -0
  7. package/dist/cjs/persist.cjs +278 -0
  8. package/dist/cjs/persist.cjs.map +1 -0
  9. package/dist/cjs/propAccess.cjs +2 -0
  10. package/dist/cjs/propAccess.cjs.map +1 -1
  11. package/dist/cjs/scope.cjs.map +1 -1
  12. package/dist/cjs/store.cjs +16 -3
  13. package/dist/cjs/store.cjs.map +1 -1
  14. package/dist/cjs/urlStore.cjs.map +1 -1
  15. package/dist/es/index.mjs +4 -219
  16. package/dist/es/index.mjs.map +1 -1
  17. package/dist/es/index2.mjs +118 -46
  18. package/dist/es/index2.mjs.map +1 -1
  19. package/dist/es/mutative/register.mjs +1 -1
  20. package/dist/es/patches/register.mjs +1 -1
  21. package/dist/es/persist/register.mjs +9 -0
  22. package/dist/es/persist/register.mjs.map +1 -0
  23. package/dist/es/persist.mjs +276 -0
  24. package/dist/es/persist.mjs.map +1 -0
  25. package/dist/es/propAccess.mjs +3 -1
  26. package/dist/es/propAccess.mjs.map +1 -1
  27. package/dist/es/react/index.mjs +1 -1
  28. package/dist/es/react/register.mjs +1 -1
  29. package/dist/es/scope.mjs +1 -1
  30. package/dist/es/scope.mjs.map +1 -1
  31. package/dist/es/store.mjs +18 -5
  32. package/dist/es/store.mjs.map +1 -1
  33. package/dist/es/storeMethods.mjs +1 -1
  34. package/dist/es/urlStore.mjs +1 -1
  35. package/dist/es/urlStore.mjs.map +1 -1
  36. package/dist/types/core/cache.d.ts +2 -2
  37. package/dist/types/core/commonTypes.d.ts +2 -2
  38. package/dist/types/core/store.d.ts +14 -8
  39. package/dist/types/core/urlStore.d.ts +1 -1
  40. package/dist/types/lib/extendedJson.d.ts +4 -0
  41. package/dist/types/patches/patchMethods.d.ts +3 -2
  42. package/dist/types/persist/persist.d.ts +1 -1
  43. package/dist/types/persist/persistPathHelpers.d.ts +2 -2
  44. package/dist/types/persist/persistStorage.d.ts +2 -2
  45. package/dist/types/persist/register.d.ts +9 -0
  46. package/package.json +12 -14
  47. package/dist/types/lib/maybeAsync.d.ts +0 -3
@@ -7,6 +7,7 @@ const store = require('./store.cjs');
7
7
  const urlStore = require('./urlStore.cjs');
8
8
  const patches_index = require('./index2.cjs');
9
9
  const propAccess = require('./propAccess.cjs');
10
+ const persist = require('./persist.cjs');
10
11
 
11
12
  function findOrDefault(array, predicate, defaultValue) {
12
13
  const index = array.findIndex(predicate);
@@ -18,219 +19,6 @@ function findOrDefault(array, predicate, defaultValue) {
18
19
  return value;
19
20
  }
20
21
 
21
- function maybeAsync(value, action) {
22
- if (store.isPromise(value)) {
23
- return value.then(action);
24
- }
25
- return action(value);
26
- }
27
- function maybeAsyncArray(values) {
28
- const run = (remainingValues, results) => {
29
- const [first, ...rest] = remainingValues;
30
- if (!first) {
31
- return results;
32
- }
33
- return maybeAsync(first(), (result) => run(rest, results.concat(result)));
34
- };
35
- return run(values, []);
36
- }
37
-
38
- const isAncestor = (ancestor, path) => {
39
- return ancestor.length <= path.length && ancestor.every((v, i) => v === "*" || path[i] === "*" || v === path[i]);
40
- };
41
-
42
- function normalizeStorage(storage) {
43
- return {
44
- getItem: storage.getItem.bind(storage),
45
- setItem: storage.setItem.bind(storage),
46
- removeItem: storage.removeItem.bind(storage),
47
- keys() {
48
- if ("keys" in storage) {
49
- return storage.keys();
50
- }
51
- return maybeAsync(
52
- storage.length instanceof Function ? storage.length() : storage.length,
53
- (length) => {
54
- const keyPromises = maybeAsyncArray(
55
- Array.from({ length }, (_, index) => () => storage.key(index))
56
- );
57
- return maybeAsync(
58
- keyPromises,
59
- (keys) => keys.filter((key) => typeof key === "string")
60
- );
61
- }
62
- );
63
- }
64
- };
65
- }
66
-
67
- class Persist {
68
- constructor(store$1, options) {
69
- this.store = store$1;
70
- this.options = options;
71
- this.queue = store.queue();
72
- this.handles = /* @__PURE__ */ new Set();
73
- this.stopped = false;
74
- this.storage = normalizeStorage(options.storage);
75
- this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);
76
- this.prefix = `${options.id}:`;
77
- if (Symbol.dispose) {
78
- this[Symbol.dispose] = () => this.stop();
79
- }
80
- this.paths = (options.paths ?? []).map((p) => {
81
- if (isPlainPath(p)) {
82
- return {
83
- path: propAccess.castArrayPath(p),
84
- throttle: options.throttle && store.calcDuration(options.throttle)
85
- };
86
- }
87
- const _p = p;
88
- return {
89
- path: propAccess.castArrayPath(_p.path),
90
- throttle: (_p.throttle && store.calcDuration(_p.throttle)) ?? (options.throttle && store.calcDuration(options.throttle))
91
- };
92
- }).sort((a, b) => b.path.length - a.path.length);
93
- if (this.paths.length === 0) {
94
- this.paths.push({
95
- path: ["*"],
96
- throttle: options.throttle && store.calcDuration(options.throttle)
97
- });
98
- }
99
- this.initialized = new Promise((resolve) => {
100
- this.resolveInitialized = resolve;
101
- });
102
- this.watchStore();
103
- this.watchStorage();
104
- }
105
- watchStore() {
106
- const throttle = Math.min(...this.paths.map((p) => p.throttle ?? 0)) || void 0;
107
- const cancel = patches_index.patchMethods.subscribePatches.apply(this.store, [
108
- (patches) => {
109
- for (const patch of patches) {
110
- if (this.updateInProgress && propAccess.shallowEqual(this.updateInProgress[0], patch.path) && this.updateInProgress[1] === (patch.op === "remove" ? void 0 : patch.value)) {
111
- continue;
112
- }
113
- const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));
114
- if (!ancestor) {
115
- continue;
116
- }
117
- const pathToSave = patch.path.slice(0, ancestor.path.length);
118
- this.queue(() => this.save(pathToSave), pathToSave);
119
- }
120
- },
121
- { runNow: false, throttle }
122
- ]);
123
- this.handles.add(cancel);
124
- }
125
- async watchStorage() {
126
- let keys = this.storage.keys();
127
- if (store.isPromise(keys)) {
128
- keys = await keys;
129
- }
130
- if (this.stopped) {
131
- return;
132
- }
133
- for (const key of keys) {
134
- const path = this.parseKey(key);
135
- if (!path) {
136
- continue;
137
- }
138
- this.queue(() => this.load(path));
139
- }
140
- this.queue(() => this.resolveInitialized?.());
141
- const listener = (event) => {
142
- this.queue(() => this.load({ type: "data", path: event.data }));
143
- };
144
- this.channel.addEventListener("message", listener);
145
- this.handles.add(() => this.channel.removeEventListener("message", listener));
146
- }
147
- buildKey({ type, path }) {
148
- return `${this.prefix}${type === "internal" ? path : JSON.stringify(path)}`;
149
- }
150
- parseKey(key) {
151
- if (!key.startsWith(this.prefix)) {
152
- return;
153
- }
154
- key = key.slice(this.prefix.length);
155
- if (!key.startsWith("[")) {
156
- return { type: "internal", path: key };
157
- }
158
- return { type: "data", path: JSON.parse(key) };
159
- }
160
- load({ type, path }) {
161
- if (type === "internal") {
162
- switch (path) {
163
- case "version":
164
- return maybeAsync(
165
- this.storage.getItem(this.buildKey({ type: "internal", path: "version" })),
166
- (value) => {
167
- this.store.version = value || void 0;
168
- }
169
- );
170
- default:
171
- return;
172
- }
173
- }
174
- const matchingPath = this.paths.find(
175
- (p) => p.path.length === path.length && isAncestor(p.path, path)
176
- );
177
- if (!matchingPath) {
178
- return;
179
- }
180
- const key = this.buildKey({ type: "data", path });
181
- return maybeAsync(this.storage.getItem(key), (value) => {
182
- if (this.stopped || !value) {
183
- return;
184
- }
185
- const inSaveQueue = this.queue.getRefs().find((ref) => isAncestor(ref, path) || isAncestor(path, ref));
186
- if (inSaveQueue) {
187
- return;
188
- }
189
- const parsedValue = value === "undefined" ? void 0 : JSON.parse(value);
190
- this.updateInProgress = [path, parsedValue];
191
- this.store.set((state) => propAccess.set(state, path, parsedValue));
192
- this.updateInProgress = void 0;
193
- });
194
- }
195
- save(path) {
196
- const key = this.buildKey({ type: "data", path });
197
- const value = propAccess.get(this.store.get(), path);
198
- const serializedValue = value === void 0 ? "undefined" : JSON.stringify(value);
199
- return maybeAsync(this.storage.setItem(key, serializedValue), () => {
200
- this.channel.postMessage(path);
201
- return maybeAsync(
202
- this.store.version ? this.storage.setItem(
203
- this.buildKey({ type: "internal", path: "version" }),
204
- this.store.version ?? ""
205
- ) : this.storage.removeItem(this.buildKey({ type: "internal", path: "version" })),
206
- () => {
207
- return maybeAsync(this.storage.keys(), (keys) => {
208
- const toRemove = keys.filter((k) => {
209
- const parsedKey = this.parseKey(k);
210
- return parsedKey?.type === "data" && parsedKey.path.length > path.length && isAncestor(path, parsedKey.path);
211
- });
212
- return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));
213
- });
214
- }
215
- );
216
- });
217
- }
218
- async stop() {
219
- this.stopped = true;
220
- for (const handle of this.handles) {
221
- handle();
222
- }
223
- await this.queue.whenDone();
224
- this.channel.close();
225
- }
226
- }
227
- function persist(store, options) {
228
- return new Persist(store, options);
229
- }
230
- function isPlainPath(p) {
231
- return typeof p === "string" || Array.isArray(p);
232
- }
233
-
234
22
  exports.Cache = scope.Cache;
235
23
  exports.InstanceCache = scope.InstanceCache;
236
24
  exports.ResourceGroup = scope.ResourceGroup;
@@ -256,6 +44,6 @@ exports.get = propAccess.get;
256
44
  exports.set = propAccess.set;
257
45
  exports.shallowEqual = propAccess.shallowEqual;
258
46
  exports.strictEqual = propAccess.strictEqual;
47
+ exports.persist = persist.persist;
259
48
  exports.findOrDefault = findOrDefault;
260
- exports.persist = persist;
261
49
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/lib/updateHelpers.ts","../../src/lib/maybeAsync.ts","../../src/persist/persistPathHelpers.ts","../../src/persist/persistStorage.ts","../../src/persist/persist.ts"],"sourcesContent":["export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n","import isPromise from '@lib/isPromise';\nimport type { MaybePromise } from './maybePromise';\n\nexport function maybeAsync<T, R>(\n value: MaybePromise<T>,\n action: (value: T) => MaybePromise<R>,\n): MaybePromise<R> {\n if (isPromise(value)) {\n return value.then(action);\n }\n return action(value);\n}\n\nexport function maybeAsyncArray<T>(values: (() => MaybePromise<T>)[]): MaybePromise<T[]> {\n const run = (remainingValues: (() => MaybePromise<T>)[], results: T[]): MaybePromise<T[]> => {\n const [first, ...rest] = remainingValues;\n if (!first) {\n return results;\n }\n\n return maybeAsync(first(), (result) => run(rest, results.concat(result)));\n };\n\n return run(values, []);\n}\n","import { isObject } from '@lib/helpers';\nimport 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 = (\n value: any,\n path: KeyType[],\n): [value: unknown, subValues: { path: KeyType[]; value: unknown }[]] => {\n const [first, ...rest] = path;\n if (first === undefined) return [value, []];\n\n if (rest.length === 0) {\n if (first === '*')\n return [{}, Object.entries(value).map(([k, v]) => ({ path: [k], value: v }))];\n if (!(first in value)) return [value, []];\n const { [first]: subValue, ...newValue } = value;\n return [newValue, [{ path: [first], value: subValue }]];\n }\n\n const newValue = { ...value };\n const subValues = new Array<{ path: KeyType[]; value: unknown }>();\n for (const key of first === '*' ? Object.keys(value) : [first]) {\n if (!isObject(newValue[key])) return [value, []];\n const result = split(newValue[key], rest);\n newValue[key] = result[0];\n subValues.push(...result[1].map((s) => ({ path: [key, ...s.path], value: s.value })));\n }\n return [newValue, subValues];\n};\n","import { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | 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 type PersistStorage = PersistStorageBase &\n (PersistStorageWithKeys | PersistStorageWithLength);\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithKeys {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n keys(): string[] | Promise<string[]> {\n if ('keys' in storage) {\n return storage.keys();\n }\n\n return maybeAsync(\n storage.length instanceof Function ? storage.length() : storage.length,\n (length) => {\n const keyPromises = maybeAsyncArray(\n Array.from({ length }, (_, index) => () => storage.key(index)),\n );\n\n return maybeAsync(keyPromises, (keys) =>\n keys.filter((key): key is string => typeof key === 'string'),\n );\n },\n );\n },\n };\n}\n","import { type Cancel, type Duration, type Store } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { shallowEqual } from '@lib/equals';\nimport isPromise from '@lib/isPromise';\nimport { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport { castArrayPath, get, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\nimport { patchMethods } from '@patches';\nimport { isAncestor } from './persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithKeys,\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: PersistStorageWithKeys;\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?: [any, any];\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 = patchMethods.subscribePatches.apply(this.store as Store<unknown>, [\n (patches) => {\n for (const patch of patches) {\n if (\n this.updateInProgress &&\n shallowEqual(this.updateInProgress[0], patch.path) &&\n this.updateInProgress[1] === (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));\n\n if (!ancestor) {\n continue;\n }\n\n const pathToSave = patch.path.slice(0, ancestor.path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n }\n },\n { runNow: false, throttle },\n ]);\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n let keys = this.storage.keys();\n if (isPromise(keys)) {\n keys = await keys;\n }\n\n if (this.stopped) {\n return;\n }\n\n for (const key of keys) {\n const path = this.parseKey(key);\n if (!path) {\n continue;\n }\n\n this.queue(() => this.load(path));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load({ type: 'data', path: event.data }));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey({ type, path }: Key) {\n return `${this.prefix}${type === 'internal' ? path : JSON.stringify(path)}`;\n }\n\n private parseKey(key: string): Key | undefined {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n key = key.slice(this.prefix.length);\n\n if (!key.startsWith('[')) {\n return { type: 'internal', path: key };\n }\n\n return { type: 'data', path: JSON.parse(key) as KeyType[] };\n }\n\n private load({ type, path }: Key) {\n if (type === 'internal') {\n switch (path) {\n case 'version':\n return maybeAsync(\n this.storage.getItem(this.buildKey({ type: 'internal', path: 'version' })),\n (value) => {\n this.store.version = value || undefined;\n },\n );\n default:\n return;\n }\n }\n\n const matchingPath = this.paths.find(\n (p) => p.path.length === path.length && isAncestor(p.path, path),\n );\n if (!matchingPath) {\n return;\n }\n\n const key = this.buildKey({ type: 'data', path });\n\n return maybeAsync(this.storage.getItem(key), (value) => {\n if (this.stopped || !value) {\n return;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, path) || isAncestor(path, ref));\n if (inSaveQueue) {\n return;\n }\n\n const parsedValue = value === 'undefined' ? undefined : JSON.parse(value);\n\n this.updateInProgress = [path, parsedValue];\n this.store.set((state) => set(state, path as any, parsedValue));\n this.updateInProgress = undefined;\n });\n }\n\n private save(path: KeyType[]) {\n const key = this.buildKey({ type: 'data', path });\n const value = get(this.store.get(), path as any);\n const serializedValue = value === undefined ? 'undefined' : JSON.stringify(value);\n\n return maybeAsync(this.storage.setItem(key, serializedValue), () => {\n this.channel.postMessage(path);\n\n return maybeAsync(\n this.store.version\n ? this.storage.setItem(\n this.buildKey({ type: 'internal', path: 'version' }),\n this.store.version ?? '',\n )\n : this.storage.removeItem(this.buildKey({ type: 'internal', path: 'version' })),\n () => {\n return maybeAsync(this.storage.keys(), (keys) => {\n const toRemove = keys.filter((k) => {\n const parsedKey = this.parseKey(k);\n return (\n parsedKey?.type === 'data' &&\n parsedKey.path.length > path.length &&\n isAncestor(path, parsedKey.path)\n // !this.queue.getRefs().find((ref) => isAncestor(ref, parsedKey))\n );\n });\n\n return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));\n });\n },\n );\n });\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":["isPromise","store","queue","castArrayPath","calcDuration","patchMethods","shallowEqual","set","get"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/lib/updateHelpers.ts"],"sourcesContent":["export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAAgB,SAAA,aAAA,CACd,KACA,EAAA,SAAA,EACA,YACG,EAAA;AACH,EAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,SAAA,CAAU,SAAS,CAAA,CAAA;AAEvC,EAAA,IAAI,SAAS,CAAG,EAAA;AACd,IAAA,OAAO,MAAM,KAAK,CAAA,CAAA;AAAA,GACpB;AAEA,EAAA,MAAM,KAAQ,GAAA,YAAA,YAAwB,QAAW,GAAA,YAAA,EAAiB,GAAA,YAAA,CAAA;AAClE,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA,CAAA;AAChB,EAAO,OAAA,KAAA,CAAA;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -34,14 +34,37 @@ function* _diff(a, b, options, prefix = []) {
34
34
  { op: "replace", path: prefix, value: a }
35
35
  ];
36
36
  }
37
+ if (a instanceof Date && b instanceof Date) {
38
+ if (a.getTime() === b.getTime()) {
39
+ return;
40
+ }
41
+ return yield [
42
+ { op: "replace", path: prefix, value: b },
43
+ { op: "replace", path: prefix, value: a }
44
+ ];
45
+ }
37
46
  if (a instanceof Map && b instanceof Map) {
38
47
  return yield* mapDiff(a, b, options, prefix);
39
48
  }
40
49
  if (a instanceof Set && b instanceof Set) {
41
- a = [...a];
42
- b = [...b];
50
+ if (propAccess.deepEqual(a, b)) {
51
+ return;
52
+ }
53
+ return yield [
54
+ { op: "replace", path: prefix, value: b },
55
+ { op: "replace", path: prefix, value: a }
56
+ ];
43
57
  }
44
- if (propAccess.isObject(a) && propAccess.isObject(b) && Array.isArray(a) === Array.isArray(b)) {
58
+ if (Array.isArray(a) && Array.isArray(b)) {
59
+ if (propAccess.deepEqual(a, b)) {
60
+ return;
61
+ }
62
+ return yield [
63
+ { op: "replace", path: prefix, value: b },
64
+ { op: "replace", path: prefix, value: a }
65
+ ];
66
+ }
67
+ if (propAccess.isObject(a) && propAccess.isObject(b) && !Array.isArray(a) && !Array.isArray(b)) {
45
68
  return yield* objectDiff(a, b, options, prefix);
46
69
  }
47
70
  yield [
@@ -70,70 +93,118 @@ function* mapDiff(a, b, options, prefix) {
70
93
  }
71
94
  }
72
95
  function* objectDiff(a, b, options, prefix) {
73
- const castKey = (key) => Array.isArray(a) ? Number(key) : key;
74
96
  for (const [key, value] of Object.entries(a)) {
75
97
  if (!(key in b)) {
76
98
  yield [
77
- { op: "remove", path: [...prefix, castKey(key)] },
78
- { op: "add", path: [...prefix, castKey(key)], value }
99
+ { op: "remove", path: [...prefix, key] },
100
+ { op: "add", path: [...prefix, key], value }
79
101
  ];
80
102
  } else {
81
- yield* _diff(value, b[key], options, [...prefix, castKey(key)]);
103
+ yield* _diff(value, b[key], options, [...prefix, key]);
82
104
  }
83
105
  }
84
106
  for (const [key, value] of Object.entries(b)) {
85
107
  if (!(key in a)) {
86
108
  yield [
87
- { op: "add", path: [...prefix, castKey(key)], value },
88
- { op: "remove", path: [...prefix, castKey(key)] }
109
+ { op: "add", path: [...prefix, key], value },
110
+ { op: "remove", path: [...prefix, key] }
89
111
  ];
90
112
  }
91
113
  }
92
114
  }
93
115
 
116
+ function toExtendedJson(value) {
117
+ if (value instanceof Map) {
118
+ return {
119
+ __map: [...value].map(([k, v]) => [toExtendedJson(k), toExtendedJson(v)])
120
+ };
121
+ }
122
+ if (value instanceof Set) {
123
+ return {
124
+ __set: [...value].map(toExtendedJson)
125
+ };
126
+ }
127
+ if (value instanceof Date) {
128
+ return {
129
+ __date: value.toISOString()
130
+ };
131
+ }
132
+ if (Array.isArray(value)) {
133
+ return value.map(toExtendedJson);
134
+ }
135
+ if (typeof value === "object" && value !== null) {
136
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, toExtendedJson(v)]));
137
+ }
138
+ return value;
139
+ }
140
+ function toExtendedJsonString(value) {
141
+ return JSON.stringify(toExtendedJson(value));
142
+ }
143
+ function fromExtendedJson(value) {
144
+ if (typeof value !== "object" || value === null) {
145
+ return value;
146
+ }
147
+ if ("__map" in value) {
148
+ return new Map(
149
+ value.__map.map(([k, v]) => [
150
+ fromExtendedJson(k),
151
+ fromExtendedJson(v)
152
+ ])
153
+ );
154
+ }
155
+ if ("__set" in value) {
156
+ return new Set(value.__set.map(fromExtendedJson));
157
+ }
158
+ if ("__date" in value) {
159
+ return new Date(value.__date);
160
+ }
161
+ if (Array.isArray(value)) {
162
+ return value.map(fromExtendedJson);
163
+ }
164
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, fromExtendedJson(v)]));
165
+ }
166
+ function fromExtendedJsonString(value) {
167
+ return fromExtendedJson(JSON.parse(value));
168
+ }
169
+
94
170
  const genId = () => Math.random().toString(36).slice(2);
95
171
  function subscribePatches(listener, options = {}) {
96
- if (!this.__patches) {
97
- let version = genId();
98
- let previousValue = this.get();
99
- let patches = [];
100
- this.__patches = this.map((value) => {
101
- const result = diff(previousValue, value, options);
102
- previousValue = value;
103
- const newVersion = genId();
104
- patches = patches.concat({
105
- fromVersion: version,
106
- toVersion: newVersion,
107
- patches: result[0],
108
- reversePatches: result[1]
109
- }).slice(-1e3);
110
- version = newVersion;
111
- return { version, history: patches };
112
- });
113
- }
172
+ const patches = this.__patches ??= {
173
+ value: this.get(),
174
+ version: genId(),
175
+ history: []
176
+ };
177
+ options = { ...options };
114
178
  options.runNow ??= false;
115
- let cursor = options.startAt;
116
- if (!options.runNow && !options.startAt) {
117
- cursor = this.__patches.get().version;
118
- }
119
- return this.__patches.subscribe((p) => {
120
- if (cursor === p.version) {
121
- return;
179
+ let cursor = options.startAt ?? (options.runNow ? void 0 : this.__patches.version);
180
+ return this.subscribe((value) => {
181
+ if (patches.value !== value) {
182
+ const result = diff(patches.value, value, options);
183
+ patches.value = value;
184
+ if (result[0].length > 0) {
185
+ const newVersion = genId();
186
+ patches.history = patches.history.concat({
187
+ fromVersion: patches.version,
188
+ toVersion: newVersion,
189
+ patches: result[0],
190
+ reversePatches: result[1]
191
+ }).slice(-1e3);
192
+ patches.version = newVersion;
193
+ }
122
194
  }
123
- const index = p.history.findIndex((h) => h.fromVersion === cursor);
195
+ if (cursor === patches.version) return;
196
+ const index = patches.history.findIndex((h) => h.fromVersion === cursor);
124
197
  let forward, backward, previousVersion;
125
198
  if (index === -1) {
126
- [forward, backward] = diff(void 0, this.get(), options);
199
+ [forward, backward] = diff(void 0, value, options);
127
200
  previousVersion = void 0;
128
201
  } else {
129
- forward = p.history.slice(index).flatMap((h) => h.patches);
130
- backward = p.history.slice(index).flatMap((h) => h.reversePatches);
202
+ forward = patches.history.slice(index).flatMap((h) => h.patches);
203
+ backward = patches.history.slice(index).flatMap((h) => h.reversePatches);
131
204
  previousVersion = cursor;
132
205
  }
133
- cursor = p.version;
134
- if (forward.length > 0) {
135
- listener(forward, backward, cursor, previousVersion);
136
- }
206
+ cursor = patches.version;
207
+ listener(forward, backward, cursor, previousVersion);
137
208
  }, options);
138
209
  }
139
210
  function applyPatches(...patches) {
@@ -145,7 +216,7 @@ function sync(listener, options) {
145
216
  listener({
146
217
  fromVersion: previousVersion,
147
218
  toVersion: version,
148
- patches
219
+ patches: toExtendedJson(patches)
149
220
  });
150
221
  },
151
222
  { ...options, runNow: true }
@@ -157,8 +228,9 @@ function acceptSync(message) {
157
228
  `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`
158
229
  );
159
230
  }
231
+ const patches = fromExtendedJson(message.patches);
160
232
  this.version = message.toVersion;
161
- this.applyPatches(...message.patches);
233
+ this.applyPatches(...patches);
162
234
  }
163
235
  const patchMethods = {
164
236
  subscribePatches,
@@ -169,5 +241,7 @@ const patchMethods = {
169
241
 
170
242
  exports.applyPatches = applyPatches$1;
171
243
  exports.diff = diff;
244
+ exports.fromExtendedJsonString = fromExtendedJsonString;
172
245
  exports.patchMethods = patchMethods;
246
+ exports.toExtendedJsonString = toExtendedJsonString;
173
247
  //# sourceMappingURL=index2.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index2.cjs","sources":["../../src/lib/applyPatches.ts","../../src/lib/diff.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 Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n a = [...a];\n b = [...b];\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 const castKey = (key: string) => (Array.isArray(a) ? Number(key) : key);\n\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, castKey(key)] },\n { op: 'add', path: [...prefix, castKey(key)], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, castKey(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, castKey(key)], value },\n { op: 'remove', path: [...prefix, castKey(key)] },\n ];\n }\n }\n}\n","import type { 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';\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?: Store<{\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\nfunction subscribePatches<T>(\n this: Store<T>,\n listener: (\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n if (!this.__patches) {\n let version = genId();\n let previousValue = this.get();\n let patches: HistoryEntry[] = [];\n\n this.__patches = this.map((value) => {\n const result = diff(previousValue, value, options);\n previousValue = value;\n const newVersion = genId();\n\n patches = patches\n .concat({\n fromVersion: version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n version = newVersion;\n return { version, history: patches };\n });\n }\n\n options.runNow ??= false;\n let cursor = options.startAt;\n\n if (!options.runNow && !options.startAt) {\n cursor = this.__patches.get().version;\n }\n\n return this.__patches.subscribe((p) => {\n if (cursor === p.version) {\n return;\n }\n\n const index = p.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, this.get(), options);\n previousVersion = undefined;\n } else {\n forward = p.history.slice(index).flatMap((h) => h.patches);\n backward = p.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = p.version;\n if (forward.length > 0) {\n listener(forward, backward, cursor, previousVersion);\n }\n }, options);\n}\n\nfunction applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nfunction applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nfunction applyPatches<T>(this: Store<T>, ...patches: (InteropPatch | InteropPatch[])[]): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nfunction sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n return this.subscribePatches(\n (patches, _, version, previousVersion) => {\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches,\n });\n },\n { ...options, runNow: true },\n );\n}\n\nfunction 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 this.version = message.toVersion;\n this.applyPatches(...message.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"],"names":["remove","set","applyPatches","deepEqual","isObject","_applyPatches"],"mappings":"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"}
1
+ {"version":3,"file":"index2.cjs","sources":["../../src/lib/applyPatches.ts","../../src/lib/diff.ts","../../src/lib/extendedJson.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","export function toExtendedJson(value: unknown): unknown {\n if (value instanceof Map) {\n return {\n __map: [...value].map(([k, v]) => [toExtendedJson(k), toExtendedJson(v)]),\n };\n }\n\n if (value instanceof Set) {\n return {\n __set: [...value].map(toExtendedJson),\n };\n }\n\n if (value instanceof Date) {\n return {\n __date: value.toISOString(),\n };\n }\n\n if (Array.isArray(value)) {\n return value.map(toExtendedJson);\n }\n\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, toExtendedJson(v)]));\n }\n\n return value;\n}\n\nexport function toExtendedJsonString(value: unknown): string {\n return JSON.stringify(toExtendedJson(value));\n}\n\nexport function fromExtendedJson(value: unknown): unknown {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n\n if ('__map' in value) {\n return new Map(\n (value.__map as [unknown, unknown][]).map(([k, v]) => [\n fromExtendedJson(k),\n fromExtendedJson(v),\n ]),\n );\n }\n\n if ('__set' in value) {\n return new Set((value.__set as unknown[]).map(fromExtendedJson));\n }\n\n if ('__date' in value) {\n return new Date(value.__date as string);\n }\n\n if (Array.isArray(value)) {\n return value.map(fromExtendedJson);\n }\n\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, fromExtendedJson(v)]));\n}\n\nexport function fromExtendedJsonString(value: string): unknown {\n return fromExtendedJson(JSON.parse(value));\n}\n","import type { 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';\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\nfunction subscribePatches<T>(\n this: Store<T>,\n listener: (\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((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(forward, backward, cursor, previousVersion);\n }, options);\n}\n\nfunction applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nfunction applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nfunction applyPatches<T>(this: Store<T>, ...patches: (InteropPatch | InteropPatch[])[]): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nfunction sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n return this.subscribePatches(\n (patches, _, version, previousVersion) => {\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, runNow: true },\n );\n}\n\nfunction 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 this.applyPatches(...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"],"names":["remove","set","applyPatches","deepEqual","isObject","_applyPatches"],"mappings":";;;;AAGA,SAAS,gBAAA,CAAoB,QAAW,KAAiB,EAAA;AACvD,EAAI,IAAA,KAAA,CAAM,OAAO,QAAU,EAAA;AACzB,IAAO,OAAAA,iBAAA,CAAO,MAAQ,EAAA,KAAA,CAAM,IAAW,CAAA,CAAA;AAAA,GACzC;AAEA,EAAA,OAAOC,cAAI,CAAA,MAAA,EAAQ,KAAM,CAAA,IAAA,EAAa,MAAM,KAAK,CAAA,CAAA;AACnD,CAAA;AAEgB,SAAAC,cAAA,CAAgB,WAAc,OAAqB,EAAA;AACjE,EAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,IAAS,MAAA,GAAA,gBAAA,CAAiB,QAAQ,KAAK,CAAA,CAAA;AAAA,GACzC;AAEA,EAAO,OAAA,MAAA,CAAA;AACT;;ACJO,SAAS,IACd,CAAA,CAAA,EACA,CACA,EAAA,OAAA,GAAuB,EACsB,EAAA;AAC7C,EAAA,MAAM,SAAS,CAAC,GAAG,MAAM,CAAG,EAAA,CAAA,EAAG,OAAO,CAAC,CAAA,CAAA;AACvC,EAAA,MAAM,UAAU,MAAO,CAAA,GAAA,CAAI,CAAC,CAAC,KAAK,MAAM,KAAK,CAAA,CAAA;AAC7C,EAAM,MAAA,cAAA,GAAiB,OAAO,GAAI,CAAA,CAAC,GAAG,YAAY,MAAM,YAAY,CAAA,CAAA;AAEpE,EAAO,OAAA,CAAC,SAAS,cAAc,CAAA,CAAA;AACjC,CAAA;AAEA,UAAU,MACR,CACA,EAAA,CAAA,EACA,OACA,EAAA,MAAA,GAAoB,EAC2B,EAAA;AAC/C,EAAA,IAAI,MAAM,CAAG,EAAA;AACX,IAAA,OAAA;AAAA,GACF;AAEA,EAAA,IACG,OAAO,OAAA,CAAQ,MAAW,KAAA,QAAA,IAAY,OAAO,MAAU,IAAA,OAAA,CAAQ,MAC/D,IAAA,OAAO,QAAQ,MAAW,KAAA,UAAA,IAAc,OAAQ,CAAA,MAAA,CAAO,MAAM,CAC9D,EAAA;AACA,IAAI,IAAAC,oBAAA,CAAU,CAAG,EAAA,CAAC,CAAG,EAAA;AACnB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,OAAO,MAAM;AAAA,MACX,EAAE,EAAI,EAAA,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAE,EAAA;AAAA,MACxC,EAAE,EAAI,EAAA,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAE,EAAA;AAAA,KAC1C,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,CAAA,YAAa,IAAQ,IAAA,CAAA,YAAa,IAAM,EAAA;AAC1C,IAAA,IAAI,CAAE,CAAA,OAAA,EAAc,KAAA,CAAA,CAAE,SAAW,EAAA;AAC/B,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,OAAO,MAAM;AAAA,MACX,EAAE,EAAI,EAAA,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAE,EAAA;AAAA,MACxC,EAAE,EAAI,EAAA,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAE,EAAA;AAAA,KAC1C,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,CAAA,YAAa,GAAO,IAAA,CAAA,YAAa,GAAK,EAAA;AACxC,IAAA,OAAO,OAAO,OAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,SAAS,MAAM,CAAA,CAAA;AAAA,GAC7C;AAEA,EAAI,IAAA,CAAA,YAAa,GAAO,IAAA,CAAA,YAAa,GAAK,EAAA;AACxC,IAAI,IAAAA,oBAAA,CAAU,CAAG,EAAA,CAAC,CAAG,EAAA;AACnB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,OAAO,MAAM;AAAA,MACX,EAAE,EAAI,EAAA,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAE,EAAA;AAAA,MACxC,EAAE,EAAI,EAAA,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAE,EAAA;AAAA,KAC1C,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,MAAM,OAAQ,CAAA,CAAC,KAAK,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAG,EAAA;AACxC,IAAI,IAAAA,oBAAA,CAAU,CAAG,EAAA,CAAC,CAAG,EAAA;AACnB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,OAAO,MAAM;AAAA,MACX,EAAE,EAAI,EAAA,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAE,EAAA;AAAA,MACxC,EAAE,EAAI,EAAA,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAE,EAAA;AAAA,KAC1C,CAAA;AAAA,GACF;AAEA,EAAA,IAAIC,mBAAS,CAAA,CAAC,CAAK,IAAAA,mBAAA,CAAS,CAAC,CAAK,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAK,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAG,EAAA;AACxE,IAAA,OAAO,OAAO,UAAA,CAAW,CAAG,EAAA,CAAA,EAAG,SAAS,MAAM,CAAA,CAAA;AAAA,GAChD;AAEA,EAAM,MAAA;AAAA,IACJ,EAAE,EAAI,EAAA,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAE,EAAA;AAAA,IACxC,EAAE,EAAI,EAAA,SAAA,EAAW,IAAM,EAAA,MAAA,EAAQ,OAAO,CAAE,EAAA;AAAA,GAC1C,CAAA;AACF,CAAA;AAEA,UAAU,OACR,CAAA,CAAA,EACA,CACA,EAAA,OAAA,EACA,MAC+C,EAAA;AAC/C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,CAAG,EAAA;AAC5B,IAAA,IAAI,CAAC,CAAA,CAAE,GAAI,CAAA,GAAG,CAAG,EAAA;AACf,MAAM,MAAA;AAAA,QACJ,EAAE,IAAI,QAAU,EAAA,IAAA,EAAM,CAAC,GAAG,MAAA,EAAQ,GAAG,CAAE,EAAA;AAAA,QACvC,EAAE,IAAI,KAAO,EAAA,IAAA,EAAM,CAAC,GAAG,MAAA,EAAQ,GAAG,CAAA,EAAG,KAAM,EAAA;AAAA,OAC7C,CAAA;AAAA,KACK,MAAA;AACL,MAAO,OAAA,KAAA,CAAM,KAAO,EAAA,CAAA,CAAE,GAAI,CAAA,GAAG,CAAG,EAAA,OAAA,EAAS,CAAC,GAAG,MAAQ,EAAA,GAAG,CAAC,CAAA,CAAA;AAAA,KAC3D;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,CAAG,EAAA;AAC5B,IAAA,IAAI,CAAC,CAAA,CAAE,GAAI,CAAA,GAAG,CAAG,EAAA;AACf,MAAM,MAAA;AAAA,QACJ,EAAE,IAAI,KAAO,EAAA,IAAA,EAAM,CAAC,GAAG,MAAA,EAAQ,GAAG,CAAA,EAAG,KAAM,EAAA;AAAA,QAC3C,EAAE,IAAI,QAAU,EAAA,IAAA,EAAM,CAAC,GAAG,MAAA,EAAQ,GAAG,CAAE,EAAA;AAAA,OACzC,CAAA;AAAA,KACF;AAAA,GACF;AACF,CAAA;AAEA,UAAU,UACR,CAAA,CAAA,EACA,CACA,EAAA,OAAA,EACA,MAC+C,EAAA;AAC/C,EAAA,KAAA,MAAW,CAAC,GAAK,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,CAAC,CAAG,EAAA;AAC5C,IAAI,IAAA,EAAE,OAAO,CAAI,CAAA,EAAA;AACf,MAAM,MAAA;AAAA,QACJ,EAAE,IAAI,QAAU,EAAA,IAAA,EAAM,CAAC,GAAG,MAAA,EAAQ,GAAG,CAAE,EAAA;AAAA,QACvC,EAAE,IAAI,KAAO,EAAA,IAAA,EAAM,CAAC,GAAG,MAAA,EAAQ,GAAG,CAAA,EAAG,KAAM,EAAA;AAAA,OAC7C,CAAA;AAAA,KACK,MAAA;AACL,MAAO,OAAA,KAAA,CAAM,KAAO,EAAA,CAAA,CAAE,GAAG,CAAA,EAAG,SAAS,CAAC,GAAG,MAAQ,EAAA,GAAG,CAAC,CAAA,CAAA;AAAA,KACvD;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAK,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,CAAC,CAAG,EAAA;AAC5C,IAAI,IAAA,EAAE,OAAO,CAAI,CAAA,EAAA;AACf,MAAM,MAAA;AAAA,QACJ,EAAE,IAAI,KAAO,EAAA,IAAA,EAAM,CAAC,GAAG,MAAA,EAAQ,GAAG,CAAA,EAAG,KAAM,EAAA;AAAA,QAC3C,EAAE,IAAI,QAAU,EAAA,IAAA,EAAM,CAAC,GAAG,MAAA,EAAQ,GAAG,CAAE,EAAA;AAAA,OACzC,CAAA;AAAA,KACF;AAAA,GACF;AACF;;ACpJO,SAAS,eAAe,KAAyB,EAAA;AACtD,EAAA,IAAI,iBAAiB,GAAK,EAAA;AACxB,IAAO,OAAA;AAAA,MACL,OAAO,CAAC,GAAG,KAAK,CAAE,CAAA,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAC,cAAe,CAAA,CAAC,GAAG,cAAe,CAAA,CAAC,CAAC,CAAC,CAAA;AAAA,KAC1E,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,iBAAiB,GAAK,EAAA;AACxB,IAAO,OAAA;AAAA,MACL,OAAO,CAAC,GAAG,KAAK,CAAA,CAAE,IAAI,cAAc,CAAA;AAAA,KACtC,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,iBAAiB,IAAM,EAAA;AACzB,IAAO,OAAA;AAAA,MACL,MAAA,EAAQ,MAAM,WAAY,EAAA;AAAA,KAC5B,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACxB,IAAO,OAAA,KAAA,CAAM,IAAI,cAAc,CAAA,CAAA;AAAA,GACjC;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAY,IAAA,KAAA,KAAU,IAAM,EAAA;AAC/C,IAAA,OAAO,OAAO,WAAY,CAAA,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,CAAG,EAAA,CAAC,MAAM,CAAC,CAAA,EAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA;AAAA,GACzF;AAEA,EAAO,OAAA,KAAA,CAAA;AACT,CAAA;AAEO,SAAS,qBAAqB,KAAwB,EAAA;AAC3D,EAAA,OAAO,IAAK,CAAA,SAAA,CAAU,cAAe,CAAA,KAAK,CAAC,CAAA,CAAA;AAC7C,CAAA;AAEO,SAAS,iBAAiB,KAAyB,EAAA;AACxD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAY,IAAA,KAAA,KAAU,IAAM,EAAA;AAC/C,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,IAAI,WAAW,KAAO,EAAA;AACpB,IAAA,OAAO,IAAI,GAAA;AAAA,MACR,MAAM,KAA+B,CAAA,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAM,KAAA;AAAA,QACpD,iBAAiB,CAAC,CAAA;AAAA,QAClB,iBAAiB,CAAC,CAAA;AAAA,OACnB,CAAA;AAAA,KACH,CAAA;AAAA,GACF;AAEA,EAAA,IAAI,WAAW,KAAO,EAAA;AACpB,IAAA,OAAO,IAAI,GAAK,CAAA,KAAA,CAAM,KAAoB,CAAA,GAAA,CAAI,gBAAgB,CAAC,CAAA,CAAA;AAAA,GACjE;AAEA,EAAA,IAAI,YAAY,KAAO,EAAA;AACrB,IAAO,OAAA,IAAI,IAAK,CAAA,KAAA,CAAM,MAAgB,CAAA,CAAA;AAAA,GACxC;AAEA,EAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACxB,IAAO,OAAA,KAAA,CAAM,IAAI,gBAAgB,CAAA,CAAA;AAAA,GACnC;AAEA,EAAA,OAAO,OAAO,WAAY,CAAA,MAAA,CAAO,QAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,CAAG,EAAA,CAAC,MAAM,CAAC,CAAA,EAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA;AAC3F,CAAA;AAEO,SAAS,uBAAuB,KAAwB,EAAA;AAC7D,EAAA,OAAO,gBAAiB,CAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAAC,CAAA,CAAA;AAC3C;;AC5BA,MAAM,KAAA,GAAQ,MAAM,IAAK,CAAA,MAAA,GAAS,QAAS,CAAA,EAAE,CAAE,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAEtD,SAAS,gBAEP,CAAA,QAAA,EAMA,OAAiC,GAAA,EACf,EAAA;AAClB,EAAM,MAAA,OAAA,GAAW,KAAK,SAAc,KAAA;AAAA,IAClC,KAAA,EAAO,KAAK,GAAI,EAAA;AAAA,IAChB,SAAS,KAAM,EAAA;AAAA,IACf,SAAS,EAAC;AAAA,GACZ,CAAA;AAEA,EAAU,OAAA,GAAA,EAAE,GAAG,OAAQ,EAAA,CAAA;AACvB,EAAA,OAAA,CAAQ,MAAW,KAAA,KAAA,CAAA;AACnB,EAAA,IAAI,SAAS,OAAQ,CAAA,OAAA,KAAY,QAAQ,MAAS,GAAA,KAAA,CAAA,GAAY,KAAK,SAAU,CAAA,OAAA,CAAA,CAAA;AAE7E,EAAO,OAAA,IAAA,CAAK,SAAU,CAAA,CAAC,KAAU,KAAA;AAC/B,IAAI,IAAA,OAAA,CAAQ,UAAU,KAAO,EAAA;AAC3B,MAAA,MAAM,MAAS,GAAA,IAAA,CAAK,OAAQ,CAAA,KAAA,EAAO,OAAO,OAAO,CAAA,CAAA;AACjD,MAAA,OAAA,CAAQ,KAAQ,GAAA,KAAA,CAAA;AAEhB,MAAA,IAAI,MAAO,CAAA,CAAC,CAAE,CAAA,MAAA,GAAS,CAAG,EAAA;AACxB,QAAA,MAAM,aAAa,KAAM,EAAA,CAAA;AAEzB,QAAQ,OAAA,CAAA,OAAA,GAAU,OAAQ,CAAA,OAAA,CACvB,MAAO,CAAA;AAAA,UACN,aAAa,OAAQ,CAAA,OAAA;AAAA,UACrB,SAAW,EAAA,UAAA;AAAA,UACX,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,UACjB,cAAA,EAAgB,OAAO,CAAC,CAAA;AAAA,SACzB,CACA,CAAA,KAAA,CAAM,CAAK,GAAA,CAAA,CAAA;AAEd,QAAA,OAAA,CAAQ,OAAU,GAAA,UAAA,CAAA;AAAA,OACpB;AAAA,KACF;AAEA,IAAI,IAAA,MAAA,KAAW,QAAQ,OAAS,EAAA,OAAA;AAChC,IAAM,MAAA,KAAA,GAAQ,QAAQ,OAAQ,CAAA,SAAA,CAAU,CAAC,CAAM,KAAA,CAAA,CAAE,gBAAgB,MAAM,CAAA,CAAA;AACvE,IAAA,IAAI,SAAS,QAAU,EAAA,eAAA,CAAA;AAEvB,IAAA,IAAI,UAAU,CAAI,CAAA,EAAA;AAChB,MAAA,CAAC,SAAS,QAAQ,CAAA,GAAI,IAAK,CAAA,KAAA,CAAA,EAAW,OAAO,OAAO,CAAA,CAAA;AACpD,MAAkB,eAAA,GAAA,KAAA,CAAA,CAAA;AAAA,KACb,MAAA;AACL,MAAU,OAAA,GAAA,OAAA,CAAQ,QAAQ,KAAM,CAAA,KAAK,EAAE,OAAQ,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,CAAA,CAAA;AAC/D,MAAW,QAAA,GAAA,OAAA,CAAQ,QAAQ,KAAM,CAAA,KAAK,EAAE,OAAQ,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,cAAc,CAAA,CAAA;AACvE,MAAkB,eAAA,GAAA,MAAA,CAAA;AAAA,KACpB;AAEA,IAAA,MAAA,GAAS,OAAQ,CAAA,OAAA,CAAA;AACjB,IAAS,QAAA,CAAA,OAAA,EAAS,QAAU,EAAA,MAAA,EAAQ,eAAe,CAAA,CAAA;AAAA,KAClD,OAAO,CAAA,CAAA;AACZ,CAAA;AAIA,SAAS,gBAAmC,OAAkD,EAAA;AAC5F,EAAK,IAAA,CAAA,GAAA,CAAI,CAAC,KAAU,KAAAC,cAAA,CAAc,OAAO,GAAI,OAAA,CAAQ,IAAK,EAAa,CAAC,CAAA,CAAA;AAC1E,CAAA;AAEA,SAAS,IAAA,CAEP,UACA,OACkB,EAAA;AAClB,EAAA,OAAO,IAAK,CAAA,gBAAA;AAAA,IACV,CAAC,OAAA,EAAS,CAAG,EAAA,OAAA,EAAS,eAAoB,KAAA;AACxC,MAAS,QAAA,CAAA;AAAA,QACP,WAAa,EAAA,eAAA;AAAA,QACb,SAAW,EAAA,OAAA;AAAA,QACX,OAAA,EAAS,eAAe,OAAO,CAAA;AAAA,OAChC,CAAA,CAAA;AAAA,KACH;AAAA,IACA,EAAE,GAAG,OAAS,EAAA,MAAA,EAAQ,IAAK,EAAA;AAAA,GAC7B,CAAA;AACF,CAAA;AAEA,SAAS,WAA8B,OAA4B,EAAA;AACjE,EAAA,IAAI,OAAQ,CAAA,WAAA,IAAe,OAAQ,CAAA,WAAA,KAAgB,KAAK,OAAS,EAAA;AAC/D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAA6B,0BAAA,EAAA,IAAA,CAAK,OAAO,CAAA,cAAA,EAAiB,QAAQ,WAAW,CAAA,CAAA;AAAA,KAC/E,CAAA;AAAA,GACF;AAEA,EAAM,MAAA,OAAA,GAAU,gBAAiB,CAAA,OAAA,CAAQ,OAAO,CAAA,CAAA;AAEhD,EAAA,IAAA,CAAK,UAAU,OAAQ,CAAA,SAAA,CAAA;AACvB,EAAK,IAAA,CAAA,YAAA,CAAa,GAAG,OAAO,CAAA,CAAA;AAC9B,CAAA;AAEO,MAAM,YAKT,GAAA;AAAA,EACF,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AACF;;;;;;;;"}
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ const store = require('../store.cjs');
4
+ const persist = require('../persist.cjs');
5
+
6
+ store.Store.addHook((store) => {
7
+ if (store.options.persist) {
8
+ store.persistance = persist.persist(store, store.options.persist);
9
+ }
10
+ });
11
+ //# sourceMappingURL=register.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.cjs","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"],"names":["Store","persist"],"mappings":";;;;;AAcAA,WAAM,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AACvB,EAAI,IAAA,KAAA,CAAM,QAAQ,OAAS,EAAA;AACzB,IAAA,KAAA,CAAM,WAAc,GAAAC,eAAA,CAAQ,KAAO,EAAA,KAAA,CAAM,QAAQ,OAAO,CAAA,CAAA;AAAA,GAC1D;AACF,CAAC,CAAA;;"}