cross-state 0.37.19 → 0.38.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/cjs/index.cjs +76 -44
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/{diff.cjs → index2.cjs} +80 -3
  4. package/dist/cjs/index2.cjs.map +1 -0
  5. package/dist/cjs/patches/index.cjs +3 -53
  6. package/dist/cjs/patches/index.cjs.map +1 -1
  7. package/dist/cjs/patches/register.cjs +1 -1
  8. package/dist/cjs/react/index.cjs +1 -1
  9. package/dist/cjs/react/index.cjs.map +1 -1
  10. package/dist/cjs/react/register.cjs +1 -1
  11. package/dist/cjs/store.cjs +37 -26
  12. package/dist/cjs/store.cjs.map +1 -1
  13. package/dist/cjs/storeMethods.cjs +1 -1
  14. package/dist/cjs/storeMethods.cjs.map +1 -1
  15. package/dist/cjs/urlStore.cjs +5 -5
  16. package/dist/cjs/urlStore.cjs.map +1 -1
  17. package/dist/es/index.mjs +67 -35
  18. package/dist/es/index.mjs.map +1 -1
  19. package/dist/es/{diff.mjs → index2.mjs} +80 -4
  20. package/dist/es/index2.mjs.map +1 -0
  21. package/dist/es/patches/index.mjs +1 -55
  22. package/dist/es/patches/index.mjs.map +1 -1
  23. package/dist/es/patches/register.mjs +1 -1
  24. package/dist/es/propAccess.mjs +1 -1
  25. package/dist/es/react/index.mjs +2 -2
  26. package/dist/es/react/index.mjs.map +1 -1
  27. package/dist/es/react/register.mjs +1 -1
  28. package/dist/es/scope.mjs +1 -1
  29. package/dist/es/store.mjs +38 -28
  30. package/dist/es/store.mjs.map +1 -1
  31. package/dist/es/storeMethods.mjs +1 -1
  32. package/dist/es/storeMethods.mjs.map +1 -1
  33. package/dist/es/urlStore.mjs +3 -3
  34. package/dist/es/urlStore.mjs.map +1 -1
  35. package/dist/types/core/store.d.ts +2 -1
  36. package/dist/types/core/urlStore.d.ts +3 -3
  37. package/dist/types/patches/patchMethods.d.ts +19 -10
  38. package/dist/types/persist/persist.d.ts +5 -5
  39. package/dist/types/react/form/useFormAutosave.d.ts +1 -1
  40. package/dist/types/react/scope.d.ts +3 -3
  41. package/dist/types/react/useCache.d.ts +1 -1
  42. package/dist/types/react/useProp.d.ts +1 -1
  43. package/package.json +18 -17
  44. package/dist/cjs/diff.cjs.map +0 -1
  45. package/dist/es/diff.mjs.map +0 -1
@@ -2,11 +2,11 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const diff = require('./diff.cjs');
6
- const store = require('./store.cjs');
7
- const propAccess = require('./propAccess.cjs');
8
5
  const scope = require('./scope.cjs');
6
+ const store = require('./store.cjs');
9
7
  const urlStore = require('./urlStore.cjs');
8
+ const patches_index = require('./index2.cjs');
9
+ const propAccess = require('./propAccess.cjs');
10
10
 
11
11
  function findOrDefault(array, predicate, defaultValue) {
12
12
  const index = array.findIndex(predicate);
@@ -18,10 +18,6 @@ function findOrDefault(array, predicate, defaultValue) {
18
18
  return value;
19
19
  }
20
20
 
21
- const isAncestor = (ancestor, path) => {
22
- return ancestor.length <= path.length && ancestor.every((v, i) => v === "*" || path[i] === "*" || v === path[i]);
23
- };
24
-
25
21
  function maybeAsync(value, action) {
26
22
  if (store.isPromise(value)) {
27
23
  return value.then(action);
@@ -39,6 +35,10 @@ function maybeAsyncArray(values) {
39
35
  return run(values, []);
40
36
  }
41
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
42
  function normalizeStorage(storage) {
43
43
  return {
44
44
  getItem: storage.getItem.bind(storage),
@@ -74,18 +74,27 @@ class Persist {
74
74
  this.storage = normalizeStorage(options.storage);
75
75
  this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);
76
76
  this.prefix = `${options.id}:`;
77
+ if (Symbol.dispose) {
78
+ this[Symbol.dispose] = () => this.stop();
79
+ }
77
80
  this.paths = (options.paths ?? []).map((p) => {
78
81
  if (isPlainPath(p)) {
79
- return { path: propAccess.castArrayPath(p) };
82
+ return {
83
+ path: propAccess.castArrayPath(p),
84
+ throttle: options.throttle && store.calcDuration(options.throttle)
85
+ };
80
86
  }
81
87
  const _p = p;
82
88
  return {
83
89
  path: propAccess.castArrayPath(_p.path),
84
- throttleMs: _p.throttleMs
90
+ throttle: (_p.throttle && store.calcDuration(_p.throttle)) ?? (options.throttle && store.calcDuration(options.throttle))
85
91
  };
86
92
  }).sort((a, b) => b.path.length - a.path.length);
87
93
  if (this.paths.length === 0) {
88
- this.paths.push({ path: ["*"] });
94
+ this.paths.push({
95
+ path: ["*"],
96
+ throttle: options.throttle && store.calcDuration(options.throttle)
97
+ });
89
98
  }
90
99
  this.initialized = new Promise((resolve) => {
91
100
  this.resolveInitialized = resolve;
@@ -94,11 +103,9 @@ class Persist {
94
103
  this.watchStorage();
95
104
  }
96
105
  watchStore() {
97
- let committed = this.store.get();
98
- const cancel = this.store.subscribe(
99
- (value) => {
100
- const [patches] = diff.diff(committed, value);
101
- committed = value;
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) => {
102
109
  for (const patch of patches) {
103
110
  if (this.updateInProgress && propAccess.shallowEqual(this.updateInProgress[0], patch.path) && this.updateInProgress[1] === (patch.op === "remove" ? void 0 : patch.value)) {
104
111
  continue;
@@ -111,8 +118,8 @@ class Persist {
111
118
  this.queue(() => this.save(pathToSave), pathToSave);
112
119
  }
113
120
  },
114
- { runNow: false }
115
- );
121
+ { runNow: false, throttle }
122
+ ]);
116
123
  this.handles.add(cancel);
117
124
  }
118
125
  async watchStorage() {
@@ -132,28 +139,45 @@ class Persist {
132
139
  }
133
140
  this.queue(() => this.resolveInitialized?.());
134
141
  const listener = (event) => {
135
- this.queue(() => this.load(event.data));
142
+ this.queue(() => this.load({ type: "data", path: event.data }));
136
143
  };
137
144
  this.channel.addEventListener("message", listener);
138
145
  this.handles.add(() => this.channel.removeEventListener("message", listener));
139
146
  }
140
- buildKey(path) {
141
- return `${this.prefix}${JSON.stringify(path)}`;
147
+ buildKey({ type, path }) {
148
+ return `${this.prefix}${type === "internal" ? path : JSON.stringify(path)}`;
142
149
  }
143
150
  parseKey(key) {
144
151
  if (!key.startsWith(this.prefix)) {
145
152
  return;
146
153
  }
147
- return JSON.parse(key.slice(this.prefix.length));
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) };
148
159
  }
149
- load(path) {
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
+ }
150
174
  const matchingPath = this.paths.find(
151
175
  (p) => p.path.length === path.length && isAncestor(p.path, path)
152
176
  );
153
177
  if (!matchingPath) {
154
178
  return;
155
179
  }
156
- const key = this.buildKey(path);
180
+ const key = this.buildKey({ type: "data", path });
157
181
  return maybeAsync(this.storage.getItem(key), (value) => {
158
182
  if (this.stopped || !value) {
159
183
  return;
@@ -169,18 +193,26 @@ class Persist {
169
193
  });
170
194
  }
171
195
  save(path) {
172
- const key = this.buildKey(path);
196
+ const key = this.buildKey({ type: "data", path });
173
197
  const value = propAccess.get(this.store.get(), path);
174
198
  const serializedValue = value === void 0 ? "undefined" : JSON.stringify(value);
175
199
  return maybeAsync(this.storage.setItem(key, serializedValue), () => {
176
200
  this.channel.postMessage(path);
177
- return maybeAsync(this.storage.keys(), (keys) => {
178
- const toRemove = keys.filter((k) => {
179
- const parsedKey = this.parseKey(k);
180
- return parsedKey && parsedKey.length > path.length && isAncestor(path, parsedKey);
181
- });
182
- return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));
183
- });
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
+ );
184
216
  });
185
217
  }
186
218
  async stop() {
@@ -199,8 +231,14 @@ function isPlainPath(p) {
199
231
  return typeof p === "string" || Array.isArray(p);
200
232
  }
201
233
 
202
- exports.applyPatches = diff.applyPatches;
203
- exports.diff = diff.diff;
234
+ exports.Cache = scope.Cache;
235
+ exports.InstanceCache = scope.InstanceCache;
236
+ exports.ResourceGroup = scope.ResourceGroup;
237
+ exports.Scope = scope.Scope;
238
+ exports.allResources = scope.allResources;
239
+ exports.createCache = scope.createCache;
240
+ exports.createResourceGroup = scope.createResourceGroup;
241
+ exports.createScope = scope.createScope;
204
242
  exports.Store = store.Store;
205
243
  exports.arrayMethods = store.arrayMethods;
206
244
  exports.calcDuration = store.calcDuration;
@@ -208,22 +246,16 @@ exports.createStore = store.createStore;
208
246
  exports.mapMethods = store.mapMethods;
209
247
  exports.recordMethods = store.recordMethods;
210
248
  exports.setMethods = store.setMethods;
249
+ exports.connectUrl = urlStore.connectUrl;
250
+ exports.createUrlStore = urlStore.createUrlStore;
251
+ exports.updateUrlStore = urlStore.updateUrlStore;
252
+ exports.applyPatches = patches_index.applyPatches;
253
+ exports.diff = patches_index.diff;
211
254
  exports.deepEqual = propAccess.deepEqual;
212
255
  exports.get = propAccess.get;
213
256
  exports.set = propAccess.set;
214
257
  exports.shallowEqual = propAccess.shallowEqual;
215
258
  exports.strictEqual = propAccess.strictEqual;
216
- exports.Cache = scope.Cache;
217
- exports.InstanceCache = scope.InstanceCache;
218
- exports.ResourceGroup = scope.ResourceGroup;
219
- exports.Scope = scope.Scope;
220
- exports.allResources = scope.allResources;
221
- exports.createCache = scope.createCache;
222
- exports.createResourceGroup = scope.createResourceGroup;
223
- exports.createScope = scope.createScope;
224
- exports.connectUrl = urlStore.connectUrl;
225
- exports.createUrlStore = urlStore.createUrlStore;
226
- exports.updateUrlStore = urlStore.updateUrlStore;
227
259
  exports.findOrDefault = findOrDefault;
228
260
  exports.persist = persist;
229
261
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/lib/updateHelpers.ts","../../src/persist/persistPathHelpers.ts","../../src/lib/maybeAsync.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 { 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 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 { 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 { isAncestor } from './persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithKeys,\n} from './persistStorage';\nimport { type Cancel, type Store } from '@core';\nimport { diff } from '@lib/diff';\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';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n throttleMs?: number;\n };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttleMs?: number;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithKeys;\n\n readonly paths: {\n path: KeyType[];\n throttleMs?: 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 this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttleMs?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return { path: castArrayPath(p) };\n }\n\n const _p = p as { path: KeyType[]; throttleMs?: number };\n\n return {\n path: castArrayPath(_p.path),\n throttleMs: _p.throttleMs,\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({ path: ['*'] });\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 let committed = this.store.get();\n\n const cancel = this.store.subscribe(\n (value) => {\n const [patches] = diff(committed, value);\n committed = value;\n\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 },\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(event.data));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey(path: KeyType[]) {\n return `${this.prefix}${JSON.stringify(path)}`;\n }\n\n private parseKey(key: string) {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n return JSON.parse(key.slice(this.prefix.length)) as KeyType[];\n }\n\n private load(path: KeyType[]) {\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(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(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(this.storage.keys(), (keys) => {\n const toRemove = keys.filter((k) => {\n const parsedKey = this.parseKey(k);\n return (\n parsedKey && parsedKey.length > path.length && isAncestor(path, parsedKey)\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 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","diff","shallowEqual","set","get"],"mappings":"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"}
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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"}
@@ -8,7 +8,7 @@ function applySinglePatch(target, patch) {
8
8
  }
9
9
  return propAccess.set(target, patch.path, patch.value);
10
10
  }
11
- function applyPatches(target, ...patches) {
11
+ function applyPatches$1(target, ...patches) {
12
12
  for (const patch of patches) {
13
13
  target = applySinglePatch(target, patch);
14
14
  }
@@ -91,6 +91,83 @@ function* objectDiff(a, b, options, prefix) {
91
91
  }
92
92
  }
93
93
 
94
- exports.applyPatches = applyPatches;
94
+ const genId = () => Math.random().toString(36).slice(2);
95
+ 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
+ }
114
+ 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;
122
+ }
123
+ const index = p.history.findIndex((h) => h.fromVersion === cursor);
124
+ let forward, backward, previousVersion;
125
+ if (index === -1) {
126
+ [forward, backward] = diff(void 0, this.get(), options);
127
+ previousVersion = void 0;
128
+ } else {
129
+ forward = p.history.slice(index).flatMap((h) => h.patches);
130
+ backward = p.history.slice(index).flatMap((h) => h.reversePatches);
131
+ previousVersion = cursor;
132
+ }
133
+ cursor = p.version;
134
+ if (forward.length > 0) {
135
+ listener(forward, backward, cursor, previousVersion);
136
+ }
137
+ }, options);
138
+ }
139
+ function applyPatches(...patches) {
140
+ this.set((value) => applyPatches$1(value, ...patches.flat()));
141
+ }
142
+ function sync(listener, options) {
143
+ return this.subscribePatches(
144
+ (patches, _, version, previousVersion) => {
145
+ listener({
146
+ fromVersion: previousVersion,
147
+ toVersion: version,
148
+ patches
149
+ });
150
+ },
151
+ { ...options, runNow: true }
152
+ );
153
+ }
154
+ function acceptSync(message) {
155
+ if (message.fromVersion && message.fromVersion !== this.version) {
156
+ throw new Error(
157
+ `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`
158
+ );
159
+ }
160
+ this.version = message.toVersion;
161
+ this.applyPatches(...message.patches);
162
+ }
163
+ const patchMethods = {
164
+ subscribePatches,
165
+ applyPatches,
166
+ sync,
167
+ acceptSync
168
+ };
169
+
170
+ exports.applyPatches = applyPatches$1;
95
171
  exports.diff = diff;
96
- //# sourceMappingURL=diff.cjs.map
172
+ exports.patchMethods = patchMethods;
173
+ //# sourceMappingURL=index2.cjs.map
@@ -0,0 +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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"}
@@ -2,59 +2,9 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const diff = require('../diff.cjs');
5
+ const patches_index = require('../index2.cjs');
6
6
 
7
- const genId = () => Math.random().toString(36).slice(2);
8
- function subscribePatches(listener, options) {
9
- if (!this.__patches) {
10
- let previousValue = this.get();
11
- this.__patches = this.map((value) => {
12
- const result = diff.diff(previousValue, value, options);
13
- previousValue = value;
14
- return result;
15
- });
16
- }
17
- const { stopAt, runNow, ...subscribeOptions } = options ?? {};
18
- const cancel = this.__patches.subscribe((p) => listener(...p), {
19
- ...subscribeOptions,
20
- runNow: false
21
- });
22
- if (runNow) {
23
- listener(...diff.diff(void 0, this.get(), options));
24
- }
25
- return cancel;
26
- }
27
- function applyPatches(...patches) {
28
- this.set((value) => diff.applyPatches(value, ...patches.flat()));
29
- }
30
- function sync(listener, options) {
31
- let previousId;
32
- return this.subscribePatches(
33
- (patches) => {
34
- const id = genId();
35
- const message = { id, previousId, patches };
36
- previousId = id;
37
- listener(message);
38
- },
39
- { ...options, runNow: true }
40
- );
41
- }
42
- function acceptSync() {
43
- let previousId;
44
- return (message) => {
45
- if (message.previousId && message.previousId !== previousId) {
46
- throw new Error("previousId mismatch");
47
- }
48
- previousId = message.id;
49
- this.applyPatches(...message.patches);
50
- };
51
- }
52
- const patchMethods = {
53
- subscribePatches,
54
- applyPatches,
55
- sync,
56
- acceptSync
57
- };
58
7
 
59
- exports.patchMethods = patchMethods;
8
+
9
+ exports.patchMethods = patches_index.patchMethods;
60
10
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/patches/patchMethods.ts"],"sourcesContent":["import type { Cancel, 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\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: Store<[Patch[], Patch[]]>;\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n}\n\nexport interface SyncMessage {\n id: string;\n previousId?: string;\n patches: Patch[];\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: (patches: Patch[], reversePatches: Patch[]) => void,\n options?: SubscribePatchOptions,\n): Cancel {\n if (!this.__patches) {\n let previousValue = this.get();\n\n this.__patches = this.map((value) => {\n const result = diff(previousValue, value, options);\n previousValue = value;\n return result;\n });\n }\n\n const { stopAt, runNow, ...subscribeOptions } = options ?? {};\n\n const cancel = this.__patches.subscribe((p) => listener(...p), {\n ...subscribeOptions,\n runNow: false,\n });\n\n if (runNow) {\n listener(...diff(undefined, this.get(), options));\n }\n\n return cancel;\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): Cancel {\n let previousId: string | undefined;\n\n return this.subscribePatches(\n (patches) => {\n const id = genId();\n const message = { id, previousId, patches };\n previousId = id;\n\n listener(message);\n },\n { ...options, runNow: true },\n );\n}\n\nfunction acceptSync<T>(this: Store<T>): (message: SyncMessage) => void {\n let previousId: string | undefined;\n\n return (message) => {\n if (message.previousId && message.previousId !== previousId) {\n throw new Error('previousId mismatch');\n }\n\n previousId = message.id;\n this.applyPatches(...message.patches);\n };\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":["diff","_applyPatches"],"mappings":";;;;;;AAyBA,MAAM,KAAA,GAAQ,MAAM,IAAK,CAAA,MAAA,GAAS,QAAS,CAAA,EAAE,CAAE,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAEtD,SAAS,gBAAA,CAEP,UACA,OACQ,EAAA;AACR,EAAI,IAAA,CAAC,KAAK,SAAW,EAAA;AACnB,IAAI,IAAA,aAAA,GAAgB,KAAK,GAAI,EAAA,CAAA;AAE7B,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAK,GAAI,CAAA,CAAC,KAAU,KAAA;AACnC,MAAA,MAAM,MAAS,GAAAA,SAAA,CAAK,aAAe,EAAA,KAAA,EAAO,OAAO,CAAA,CAAA;AACjD,MAAgB,aAAA,GAAA,KAAA,CAAA;AAChB,MAAO,OAAA,MAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH;AAEA,EAAA,MAAM,EAAE,MAAQ,EAAA,MAAA,EAAQ,GAAG,gBAAiB,EAAA,GAAI,WAAW,EAAC,CAAA;AAE5D,EAAM,MAAA,MAAA,GAAS,KAAK,SAAU,CAAA,SAAA,CAAU,CAAC,CAAM,KAAA,QAAA,CAAS,GAAG,CAAC,CAAG,EAAA;AAAA,IAC7D,GAAG,gBAAA;AAAA,IACH,MAAQ,EAAA,KAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,QAAA,CAAS,GAAGA,SAAK,CAAA,KAAA,CAAA,EAAW,KAAK,GAAI,EAAA,EAAG,OAAO,CAAC,CAAA,CAAA;AAAA,GAClD;AAEA,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAIA,SAAS,gBAAmC,OAAkD,EAAA;AAC5F,EAAK,IAAA,CAAA,GAAA,CAAI,CAAC,KAAU,KAAAC,iBAAA,CAAc,OAAO,GAAI,OAAA,CAAQ,IAAK,EAAa,CAAC,CAAA,CAAA;AAC1E,CAAA;AAEA,SAAS,IAAA,CAEP,UACA,OACQ,EAAA;AACR,EAAI,IAAA,UAAA,CAAA;AAEJ,EAAA,OAAO,IAAK,CAAA,gBAAA;AAAA,IACV,CAAC,OAAY,KAAA;AACX,MAAA,MAAM,KAAK,KAAM,EAAA,CAAA;AACjB,MAAA,MAAM,OAAU,GAAA,EAAE,EAAI,EAAA,UAAA,EAAY,OAAQ,EAAA,CAAA;AAC1C,MAAa,UAAA,GAAA,EAAA,CAAA;AAEb,MAAA,QAAA,CAAS,OAAO,CAAA,CAAA;AAAA,KAClB;AAAA,IACA,EAAE,GAAG,OAAS,EAAA,MAAA,EAAQ,IAAK,EAAA;AAAA,GAC7B,CAAA;AACF,CAAA;AAEA,SAAS,UAA8D,GAAA;AACrE,EAAI,IAAA,UAAA,CAAA;AAEJ,EAAA,OAAO,CAAC,OAAY,KAAA;AAClB,IAAA,IAAI,OAAQ,CAAA,UAAA,IAAc,OAAQ,CAAA,UAAA,KAAe,UAAY,EAAA;AAC3D,MAAM,MAAA,IAAI,MAAM,qBAAqB,CAAA,CAAA;AAAA,KACvC;AAEA,IAAA,UAAA,GAAa,OAAQ,CAAA,EAAA,CAAA;AACrB,IAAK,IAAA,CAAA,YAAA,CAAa,GAAG,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,GACtC,CAAA;AACF,CAAA;AAEO,MAAM,YAKT,GAAA;AAAA,EACF,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const store = require('../store.cjs');
4
- const patches_index = require('./index.cjs');
4
+ const patches_index = require('../index2.cjs');
5
5
 
6
6
  Object.assign(store.Store.prototype, patches_index.patchMethods);
7
7
  store.autobind(store.Store);
@@ -7,8 +7,8 @@ const require$$0 = require('react');
7
7
  const store = require('../store.cjs');
8
8
  const hash = require('../hash.cjs');
9
9
  const jsxRuntime = require('react/jsx-runtime');
10
- const propAccess = require('../propAccess.cjs');
11
10
  const urlStore = require('../urlStore.cjs');
11
+ const propAccess = require('../propAccess.cjs');
12
12
 
13
13
  function CustomInput({ name, children, ...props }) {
14
14
  return /* @__PURE__ */ jsxRuntime.jsxs(