cross-state 0.37.19 → 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.
- package/dist/cjs/index.cjs +18 -198
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index2.cjs +247 -0
- package/dist/cjs/index2.cjs.map +1 -0
- package/dist/cjs/patches/index.cjs +3 -53
- package/dist/cjs/patches/index.cjs.map +1 -1
- package/dist/cjs/patches/register.cjs +1 -1
- package/dist/cjs/persist/register.cjs +11 -0
- package/dist/cjs/persist/register.cjs.map +1 -0
- package/dist/cjs/persist.cjs +278 -0
- package/dist/cjs/persist.cjs.map +1 -0
- package/dist/cjs/propAccess.cjs +2 -0
- package/dist/cjs/propAccess.cjs.map +1 -1
- package/dist/cjs/react/index.cjs +1 -1
- package/dist/cjs/react/index.cjs.map +1 -1
- package/dist/cjs/react/register.cjs +1 -1
- package/dist/cjs/scope.cjs.map +1 -1
- package/dist/cjs/store.cjs +53 -29
- package/dist/cjs/store.cjs.map +1 -1
- package/dist/cjs/storeMethods.cjs +1 -1
- package/dist/cjs/storeMethods.cjs.map +1 -1
- package/dist/cjs/urlStore.cjs +5 -5
- package/dist/cjs/urlStore.cjs.map +1 -1
- package/dist/es/index.mjs +5 -188
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/index2.mjs +241 -0
- package/dist/es/index2.mjs.map +1 -0
- package/dist/es/mutative/register.mjs +1 -1
- package/dist/es/patches/index.mjs +1 -55
- package/dist/es/patches/index.mjs.map +1 -1
- package/dist/es/patches/register.mjs +2 -2
- package/dist/es/persist/register.mjs +9 -0
- package/dist/es/persist/register.mjs.map +1 -0
- package/dist/es/persist.mjs +276 -0
- package/dist/es/persist.mjs.map +1 -0
- package/dist/es/propAccess.mjs +3 -1
- package/dist/es/propAccess.mjs.map +1 -1
- package/dist/es/react/index.mjs +2 -2
- package/dist/es/react/index.mjs.map +1 -1
- package/dist/es/react/register.mjs +2 -2
- package/dist/es/scope.mjs +1 -1
- package/dist/es/scope.mjs.map +1 -1
- package/dist/es/store.mjs +54 -31
- package/dist/es/store.mjs.map +1 -1
- package/dist/es/storeMethods.mjs +2 -2
- package/dist/es/storeMethods.mjs.map +1 -1
- package/dist/es/urlStore.mjs +3 -3
- package/dist/es/urlStore.mjs.map +1 -1
- package/dist/types/core/cache.d.ts +2 -2
- package/dist/types/core/commonTypes.d.ts +2 -2
- package/dist/types/core/store.d.ts +15 -8
- package/dist/types/core/urlStore.d.ts +4 -4
- package/dist/types/lib/extendedJson.d.ts +4 -0
- package/dist/types/patches/patchMethods.d.ts +20 -10
- package/dist/types/persist/persist.d.ts +6 -6
- package/dist/types/persist/persistPathHelpers.d.ts +2 -2
- package/dist/types/persist/persistStorage.d.ts +2 -2
- package/dist/types/persist/register.d.ts +9 -0
- package/dist/types/react/form/useFormAutosave.d.ts +1 -1
- package/dist/types/react/scope.d.ts +3 -3
- package/dist/types/react/useCache.d.ts +1 -1
- package/dist/types/react/useProp.d.ts +1 -1
- package/package.json +26 -27
- package/dist/cjs/diff.cjs +0 -96
- package/dist/cjs/diff.cjs.map +0 -1
- package/dist/es/diff.mjs +0 -93
- package/dist/es/diff.mjs.map +0 -1
- package/dist/types/lib/maybeAsync.d.ts +0 -3
package/dist/cjs/index.cjs
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
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
|
+
const persist = require('./persist.cjs');
|
|
10
11
|
|
|
11
12
|
function findOrDefault(array, predicate, defaultValue) {
|
|
12
13
|
const index = array.findIndex(predicate);
|
|
@@ -18,189 +19,14 @@ function findOrDefault(array, predicate, defaultValue) {
|
|
|
18
19
|
return value;
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return action(value);
|
|
30
|
-
}
|
|
31
|
-
function maybeAsyncArray(values) {
|
|
32
|
-
const run = (remainingValues, results) => {
|
|
33
|
-
const [first, ...rest] = remainingValues;
|
|
34
|
-
if (!first) {
|
|
35
|
-
return results;
|
|
36
|
-
}
|
|
37
|
-
return maybeAsync(first(), (result) => run(rest, results.concat(result)));
|
|
38
|
-
};
|
|
39
|
-
return run(values, []);
|
|
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
|
-
this.paths = (options.paths ?? []).map((p) => {
|
|
78
|
-
if (isPlainPath(p)) {
|
|
79
|
-
return { path: propAccess.castArrayPath(p) };
|
|
80
|
-
}
|
|
81
|
-
const _p = p;
|
|
82
|
-
return {
|
|
83
|
-
path: propAccess.castArrayPath(_p.path),
|
|
84
|
-
throttleMs: _p.throttleMs
|
|
85
|
-
};
|
|
86
|
-
}).sort((a, b) => b.path.length - a.path.length);
|
|
87
|
-
if (this.paths.length === 0) {
|
|
88
|
-
this.paths.push({ path: ["*"] });
|
|
89
|
-
}
|
|
90
|
-
this.initialized = new Promise((resolve) => {
|
|
91
|
-
this.resolveInitialized = resolve;
|
|
92
|
-
});
|
|
93
|
-
this.watchStore();
|
|
94
|
-
this.watchStorage();
|
|
95
|
-
}
|
|
96
|
-
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;
|
|
102
|
-
for (const patch of patches) {
|
|
103
|
-
if (this.updateInProgress && propAccess.shallowEqual(this.updateInProgress[0], patch.path) && this.updateInProgress[1] === (patch.op === "remove" ? void 0 : patch.value)) {
|
|
104
|
-
continue;
|
|
105
|
-
}
|
|
106
|
-
const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));
|
|
107
|
-
if (!ancestor) {
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
const pathToSave = patch.path.slice(0, ancestor.path.length);
|
|
111
|
-
this.queue(() => this.save(pathToSave), pathToSave);
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
{ runNow: false }
|
|
115
|
-
);
|
|
116
|
-
this.handles.add(cancel);
|
|
117
|
-
}
|
|
118
|
-
async watchStorage() {
|
|
119
|
-
let keys = this.storage.keys();
|
|
120
|
-
if (store.isPromise(keys)) {
|
|
121
|
-
keys = await keys;
|
|
122
|
-
}
|
|
123
|
-
if (this.stopped) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
for (const key of keys) {
|
|
127
|
-
const path = this.parseKey(key);
|
|
128
|
-
if (!path) {
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
this.queue(() => this.load(path));
|
|
132
|
-
}
|
|
133
|
-
this.queue(() => this.resolveInitialized?.());
|
|
134
|
-
const listener = (event) => {
|
|
135
|
-
this.queue(() => this.load(event.data));
|
|
136
|
-
};
|
|
137
|
-
this.channel.addEventListener("message", listener);
|
|
138
|
-
this.handles.add(() => this.channel.removeEventListener("message", listener));
|
|
139
|
-
}
|
|
140
|
-
buildKey(path) {
|
|
141
|
-
return `${this.prefix}${JSON.stringify(path)}`;
|
|
142
|
-
}
|
|
143
|
-
parseKey(key) {
|
|
144
|
-
if (!key.startsWith(this.prefix)) {
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
return JSON.parse(key.slice(this.prefix.length));
|
|
148
|
-
}
|
|
149
|
-
load(path) {
|
|
150
|
-
const matchingPath = this.paths.find(
|
|
151
|
-
(p) => p.path.length === path.length && isAncestor(p.path, path)
|
|
152
|
-
);
|
|
153
|
-
if (!matchingPath) {
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
const key = this.buildKey(path);
|
|
157
|
-
return maybeAsync(this.storage.getItem(key), (value) => {
|
|
158
|
-
if (this.stopped || !value) {
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
const inSaveQueue = this.queue.getRefs().find((ref) => isAncestor(ref, path) || isAncestor(path, ref));
|
|
162
|
-
if (inSaveQueue) {
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
const parsedValue = value === "undefined" ? void 0 : JSON.parse(value);
|
|
166
|
-
this.updateInProgress = [path, parsedValue];
|
|
167
|
-
this.store.set((state) => propAccess.set(state, path, parsedValue));
|
|
168
|
-
this.updateInProgress = void 0;
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
save(path) {
|
|
172
|
-
const key = this.buildKey(path);
|
|
173
|
-
const value = propAccess.get(this.store.get(), path);
|
|
174
|
-
const serializedValue = value === void 0 ? "undefined" : JSON.stringify(value);
|
|
175
|
-
return maybeAsync(this.storage.setItem(key, serializedValue), () => {
|
|
176
|
-
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
|
-
});
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
async stop() {
|
|
187
|
-
this.stopped = true;
|
|
188
|
-
for (const handle of this.handles) {
|
|
189
|
-
handle();
|
|
190
|
-
}
|
|
191
|
-
await this.queue.whenDone();
|
|
192
|
-
this.channel.close();
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
function persist(store, options) {
|
|
196
|
-
return new Persist(store, options);
|
|
197
|
-
}
|
|
198
|
-
function isPlainPath(p) {
|
|
199
|
-
return typeof p === "string" || Array.isArray(p);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
exports.applyPatches = diff.applyPatches;
|
|
203
|
-
exports.diff = diff.diff;
|
|
22
|
+
exports.Cache = scope.Cache;
|
|
23
|
+
exports.InstanceCache = scope.InstanceCache;
|
|
24
|
+
exports.ResourceGroup = scope.ResourceGroup;
|
|
25
|
+
exports.Scope = scope.Scope;
|
|
26
|
+
exports.allResources = scope.allResources;
|
|
27
|
+
exports.createCache = scope.createCache;
|
|
28
|
+
exports.createResourceGroup = scope.createResourceGroup;
|
|
29
|
+
exports.createScope = scope.createScope;
|
|
204
30
|
exports.Store = store.Store;
|
|
205
31
|
exports.arrayMethods = store.arrayMethods;
|
|
206
32
|
exports.calcDuration = store.calcDuration;
|
|
@@ -208,22 +34,16 @@ exports.createStore = store.createStore;
|
|
|
208
34
|
exports.mapMethods = store.mapMethods;
|
|
209
35
|
exports.recordMethods = store.recordMethods;
|
|
210
36
|
exports.setMethods = store.setMethods;
|
|
37
|
+
exports.connectUrl = urlStore.connectUrl;
|
|
38
|
+
exports.createUrlStore = urlStore.createUrlStore;
|
|
39
|
+
exports.updateUrlStore = urlStore.updateUrlStore;
|
|
40
|
+
exports.applyPatches = patches_index.applyPatches;
|
|
41
|
+
exports.diff = patches_index.diff;
|
|
211
42
|
exports.deepEqual = propAccess.deepEqual;
|
|
212
43
|
exports.get = propAccess.get;
|
|
213
44
|
exports.set = propAccess.set;
|
|
214
45
|
exports.shallowEqual = propAccess.shallowEqual;
|
|
215
46
|
exports.strictEqual = propAccess.strictEqual;
|
|
216
|
-
exports.
|
|
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;
|
|
47
|
+
exports.persist = persist.persist;
|
|
227
48
|
exports.findOrDefault = findOrDefault;
|
|
228
|
-
exports.persist = persist;
|
|
229
49
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;;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;;ACXa,MAAA,UAAA,GAAa,CAAC,QAAA,EAAqB,IAA6B,KAAA;AAC3E,EAAA,OACE,SAAS,MAAU,IAAA,IAAA,CAAK,UACxB,QAAS,CAAA,KAAA,CAAM,CAAC,CAAG,EAAA,CAAA,KAAM,CAAM,KAAA,GAAA,IAAO,KAAK,CAAC,CAAA,KAAM,OAAO,CAAM,KAAA,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAE1E,CAAA;;ACLgB,SAAA,UAAA,CACd,OACA,MACiB,EAAA;AACjB,EAAI,IAAAA,eAAA,CAAU,KAAK,CAAG,EAAA;AACpB,IAAO,OAAA,KAAA,CAAM,KAAK,MAAM,CAAA,CAAA;AAAA,GAC1B;AACA,EAAA,OAAO,OAAO,KAAK,CAAA,CAAA;AACrB,CAAA;AAEO,SAAS,gBAAmB,MAAsD,EAAA;AACvF,EAAM,MAAA,GAAA,GAAM,CAAC,eAAA,EAA4C,OAAoC,KAAA;AAC3F,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,IAAI,CAAI,GAAA,eAAA,CAAA;AACzB,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAO,OAAA,OAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,UAAA,CAAW,KAAM,EAAA,EAAG,CAAC,MAAA,KAAW,GAAI,CAAA,IAAA,EAAM,OAAQ,CAAA,MAAA,CAAO,MAAM,CAAC,CAAC,CAAA,CAAA;AAAA,GAC1E,CAAA;AAEA,EAAO,OAAA,GAAA,CAAI,MAAQ,EAAA,EAAE,CAAA,CAAA;AACvB;;ACJO,SAAS,iBAAiB,OAAiD,EAAA;AAChF,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA,IACrC,OAAS,EAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA,IACrC,UAAY,EAAA,OAAA,CAAQ,UAAW,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA,IAE3C,IAAqC,GAAA;AACnC,MAAA,IAAI,UAAU,OAAS,EAAA;AACrB,QAAA,OAAO,QAAQ,IAAK,EAAA,CAAA;AAAA,OACtB;AAEA,MAAO,OAAA,UAAA;AAAA,QACL,QAAQ,MAAkB,YAAA,QAAA,GAAW,OAAQ,CAAA,MAAA,KAAW,OAAQ,CAAA,MAAA;AAAA,QAChE,CAAC,MAAW,KAAA;AACV,UAAA,MAAM,WAAc,GAAA,eAAA;AAAA,YAClB,KAAM,CAAA,IAAA,CAAK,EAAE,MAAA,EAAU,EAAA,CAAC,CAAG,EAAA,KAAA,KAAU,MAAM,OAAA,CAAQ,GAAI,CAAA,KAAK,CAAC,CAAA;AAAA,WAC/D,CAAA;AAEA,UAAO,OAAA,UAAA;AAAA,YAAW,WAAA;AAAA,YAAa,CAAC,SAC9B,IAAK,CAAA,MAAA,CAAO,CAAC,GAAuB,KAAA,OAAO,QAAQ,QAAQ,CAAA;AAAA,WAC7D,CAAA;AAAA,SACF;AAAA,OACF,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AACF;;AChBO,MAAM,OAAW,CAAA;AAAA,EAwBtB,WAAA,CACkBC,SACA,OAChB,EAAA;AAFgB,IAAA,IAAA,CAAA,KAAA,GAAAA,OAAA,CAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA,CAAA;AAZlB,IAAA,IAAA,CAAQ,QAAQC,WAAM,EAAA,CAAA;AAEtB,IAAQ,IAAA,CAAA,OAAA,uBAAc,GAAY,EAAA,CAAA;AAElC,IAAA,IAAA,CAAQ,OAAU,GAAA,KAAA,CAAA;AAUhB,IAAK,IAAA,CAAA,OAAA,GAAU,gBAAiB,CAAA,OAAA,CAAQ,OAAO,CAAA,CAAA;AAC/C,IAAA,IAAA,CAAK,UAAU,IAAI,gBAAA,CAAiB,CAAuB,oBAAA,EAAA,OAAA,CAAQ,EAAE,CAAE,CAAA,CAAA,CAAA;AACvE,IAAK,IAAA,CAAA,MAAA,GAAS,CAAG,EAAA,OAAA,CAAQ,EAAE,CAAA,CAAA,CAAA,CAAA;AAE3B,IAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,KAAA,IAAS,EAC5B,EAAA,GAAA,CAGE,CAAC,CAAM,KAAA;AACR,MAAI,IAAA,WAAA,CAAY,CAAC,CAAG,EAAA;AAClB,QAAA,OAAO,EAAE,IAAA,EAAMC,wBAAc,CAAA,CAAC,CAAE,EAAA,CAAA;AAAA,OAClC;AAEA,MAAA,MAAM,EAAK,GAAA,CAAA,CAAA;AAEX,MAAO,OAAA;AAAA,QACL,IAAA,EAAMA,wBAAc,CAAA,EAAA,CAAG,IAAI,CAAA;AAAA,QAC3B,YAAY,EAAG,CAAA,UAAA;AAAA,OACjB,CAAA;AAAA,KACD,CACA,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,IAAK,CAAA,MAAA,GAAS,CAAE,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAE/C,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAC3B,MAAA,IAAA,CAAK,MAAM,IAAK,CAAA,EAAE,MAAM,CAAC,GAAG,GAAG,CAAA,CAAA;AAAA,KACjC;AAEA,IAAA,IAAA,CAAK,WAAc,GAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAC1C,MAAA,IAAA,CAAK,kBAAqB,GAAA,OAAA,CAAA;AAAA,KAC3B,CAAA,CAAA;AAED,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAChB,IAAA,IAAA,CAAK,YAAa,EAAA,CAAA;AAAA,GACpB;AAAA,EAEQ,UAAa,GAAA;AACnB,IAAI,IAAA,SAAA,GAAY,IAAK,CAAA,KAAA,CAAM,GAAI,EAAA,CAAA;AAE/B,IAAM,MAAA,MAAA,GAAS,KAAK,KAAM,CAAA,SAAA;AAAA,MACxB,CAAC,KAAU,KAAA;AACT,QAAA,MAAM,CAAC,OAAO,CAAI,GAAAC,SAAA,CAAK,WAAW,KAAK,CAAA,CAAA;AACvC,QAAY,SAAA,GAAA,KAAA,CAAA;AAEZ,QAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,UAAA,IACE,KAAK,gBACL,IAAAC,uBAAA,CAAa,KAAK,gBAAiB,CAAA,CAAC,GAAG,KAAM,CAAA,IAAI,KACjD,IAAK,CAAA,gBAAA,CAAiB,CAAC,CAAO,MAAA,KAAA,CAAM,OAAO,QAAW,GAAA,KAAA,CAAA,GAAY,MAAM,KACxE,CAAA,EAAA;AACA,YAAA,SAAA;AAAA,WACF;AAEA,UAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,CAAC,CAAM,KAAA,UAAA,CAAW,CAAE,CAAA,IAAA,EAAM,KAAM,CAAA,IAAI,CAAC,CAAA,CAAA;AAEtE,UAAA,IAAI,CAAC,QAAU,EAAA;AACb,YAAA,SAAA;AAAA,WACF;AAEA,UAAA,MAAM,aAAa,KAAM,CAAA,IAAA,CAAK,MAAM,CAAG,EAAA,QAAA,CAAS,KAAK,MAAM,CAAA,CAAA;AAC3D,UAAA,IAAA,CAAK,MAAM,MAAM,IAAA,CAAK,IAAK,CAAA,UAAU,GAAG,UAAU,CAAA,CAAA;AAAA,SACpD;AAAA,OACF;AAAA,MACA,EAAE,QAAQ,KAAM,EAAA;AAAA,KAClB,CAAA;AAEA,IAAK,IAAA,CAAA,OAAA,CAAQ,IAAI,MAAM,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,MAAc,YAAe,GAAA;AAC3B,IAAI,IAAA,IAAA,GAAO,IAAK,CAAA,OAAA,CAAQ,IAAK,EAAA,CAAA;AAC7B,IAAI,IAAAL,eAAA,CAAU,IAAI,CAAG,EAAA;AACnB,MAAA,IAAA,GAAO,MAAM,IAAA,CAAA;AAAA,KACf;AAEA,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,MAAM,MAAA,IAAA,GAAO,IAAK,CAAA,QAAA,CAAS,GAAG,CAAA,CAAA;AAC9B,MAAA,IAAI,CAAC,IAAM,EAAA;AACT,QAAA,SAAA;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,KAAM,CAAA,MAAM,IAAK,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,KAClC;AAEA,IAAA,IAAA,CAAK,KAAM,CAAA,MAAM,IAAK,CAAA,kBAAA,IAAsB,CAAA,CAAA;AAE5C,IAAM,MAAA,QAAA,GAAW,CAAC,KAAwB,KAAA;AACxC,MAAA,IAAA,CAAK,MAAM,MAAM,IAAA,CAAK,IAAK,CAAA,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA;AAAA,KACxC,CAAA;AAEA,IAAK,IAAA,CAAA,OAAA,CAAQ,gBAAiB,CAAA,SAAA,EAAW,QAAQ,CAAA,CAAA;AACjD,IAAK,IAAA,CAAA,OAAA,CAAQ,IAAI,MAAM,IAAA,CAAK,QAAQ,mBAAoB,CAAA,SAAA,EAAW,QAAQ,CAAC,CAAA,CAAA;AAAA,GAC9E;AAAA,EAEQ,SAAS,IAAiB,EAAA;AAChC,IAAA,OAAO,GAAG,IAAK,CAAA,MAAM,GAAG,IAAK,CAAA,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,GAC9C;AAAA,EAEQ,SAAS,GAAa,EAAA;AAC5B,IAAA,IAAI,CAAC,GAAA,CAAI,UAAW,CAAA,IAAA,CAAK,MAAM,CAAG,EAAA;AAChC,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,OAAO,KAAK,KAAM,CAAA,GAAA,CAAI,MAAM,IAAK,CAAA,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,GACjD;AAAA,EAEQ,KAAK,IAAiB,EAAA;AAC5B,IAAM,MAAA,YAAA,GAAe,KAAK,KAAM,CAAA,IAAA;AAAA,MAC9B,CAAC,CAAM,KAAA,CAAA,CAAE,IAAK,CAAA,MAAA,KAAW,KAAK,MAAU,IAAA,UAAA,CAAW,CAAE,CAAA,IAAA,EAAM,IAAI,CAAA;AAAA,KACjE,CAAA;AACA,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAA,OAAA;AAAA,KACF;AAEA,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAE9B,IAAA,OAAO,WAAW,IAAK,CAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA,EAAG,CAAC,KAAU,KAAA;AACtD,MAAI,IAAA,IAAA,CAAK,OAAW,IAAA,CAAC,KAAO,EAAA;AAC1B,QAAA,OAAA;AAAA,OACF;AAEA,MAAA,MAAM,WAAc,GAAA,IAAA,CAAK,KACtB,CAAA,OAAA,GACA,IAAK,CAAA,CAAC,GAAQ,KAAA,UAAA,CAAW,KAAK,IAAI,CAAA,IAAK,UAAW,CAAA,IAAA,EAAM,GAAG,CAAC,CAAA,CAAA;AAC/D,MAAA,IAAI,WAAa,EAAA;AACf,QAAA,OAAA;AAAA,OACF;AAEA,MAAA,MAAM,cAAc,KAAU,KAAA,WAAA,GAAc,KAAY,CAAA,GAAA,IAAA,CAAK,MAAM,KAAK,CAAA,CAAA;AAExE,MAAK,IAAA,CAAA,gBAAA,GAAmB,CAAC,IAAA,EAAM,WAAW,CAAA,CAAA;AAC1C,MAAK,IAAA,CAAA,KAAA,CAAM,IAAI,CAAC,KAAA,KAAUM,eAAI,KAAO,EAAA,IAAA,EAAa,WAAW,CAAC,CAAA,CAAA;AAC9D,MAAA,IAAA,CAAK,gBAAmB,GAAA,KAAA,CAAA,CAAA;AAAA,KACzB,CAAA,CAAA;AAAA,GACH;AAAA,EAEQ,KAAK,IAAiB,EAAA;AAC5B,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAC9B,IAAA,MAAM,QAAQC,cAAI,CAAA,IAAA,CAAK,KAAM,CAAA,GAAA,IAAO,IAAW,CAAA,CAAA;AAC/C,IAAA,MAAM,kBAAkB,KAAU,KAAA,KAAA,CAAA,GAAY,WAAc,GAAA,IAAA,CAAK,UAAU,KAAK,CAAA,CAAA;AAEhF,IAAA,OAAO,WAAW,IAAK,CAAA,OAAA,CAAQ,QAAQ,GAAK,EAAA,eAAe,GAAG,MAAM;AAClE,MAAK,IAAA,CAAA,OAAA,CAAQ,YAAY,IAAI,CAAA,CAAA;AAE7B,MAAA,OAAO,WAAW,IAAK,CAAA,OAAA,CAAQ,IAAK,EAAA,EAAG,CAAC,IAAS,KAAA;AAC/C,QAAA,MAAM,QAAW,GAAA,IAAA,CAAK,MAAO,CAAA,CAAC,CAAM,KAAA;AAClC,UAAM,MAAA,SAAA,GAAY,IAAK,CAAA,QAAA,CAAS,CAAC,CAAA,CAAA;AACjC,UAAA,OACE,aAAa,SAAU,CAAA,MAAA,GAAS,KAAK,MAAU,IAAA,UAAA,CAAW,MAAM,SAAS,CAAA,CAAA;AAAA,SAG5E,CAAA,CAAA;AAED,QAAO,OAAA,eAAA,CAAgB,QAAS,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,MAAM,IAAA,CAAK,OAAQ,CAAA,UAAA,CAAW,CAAC,CAAC,CAAC,CAAA,CAAA;AAAA,OAC7E,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAM,IAAsB,GAAA;AAC1B,IAAA,IAAA,CAAK,OAAU,GAAA,IAAA,CAAA;AAEf,IAAW,KAAA,MAAA,MAAA,IAAU,KAAK,OAAS,EAAA;AACjC,MAAO,MAAA,EAAA,CAAA;AAAA,KACT;AAEA,IAAM,MAAA,IAAA,CAAK,MAAM,QAAS,EAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,QAAQ,KAAM,EAAA,CAAA;AAAA,GACrB;AACF,CAAA;AAEgB,SAAA,OAAA,CAAW,OAAiB,OAAwC,EAAA;AAClF,EAAO,OAAA,IAAI,OAAW,CAAA,KAAA,EAAO,OAAO,CAAA,CAAA;AACtC,CAAA;AAEA,SAAS,YAAe,CAA+D,EAAA;AACrF,EAAA,OAAO,OAAO,CAAA,KAAM,QAAY,IAAA,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAA;AACjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const propAccess = require('./propAccess.cjs');
|
|
4
|
+
|
|
5
|
+
function applySinglePatch(target, patch) {
|
|
6
|
+
if (patch.op === "remove") {
|
|
7
|
+
return propAccess.remove(target, patch.path);
|
|
8
|
+
}
|
|
9
|
+
return propAccess.set(target, patch.path, patch.value);
|
|
10
|
+
}
|
|
11
|
+
function applyPatches$1(target, ...patches) {
|
|
12
|
+
for (const patch of patches) {
|
|
13
|
+
target = applySinglePatch(target, patch);
|
|
14
|
+
}
|
|
15
|
+
return target;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function diff(a, b, options = {}) {
|
|
19
|
+
const result = [..._diff(a, b, options)];
|
|
20
|
+
const patches = result.map(([patch]) => patch);
|
|
21
|
+
const reversePatches = result.map(([, reversePatch]) => reversePatch);
|
|
22
|
+
return [patches, reversePatches];
|
|
23
|
+
}
|
|
24
|
+
function* _diff(a, b, options, prefix = []) {
|
|
25
|
+
if (a === b) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (typeof options.stopAt === "number" && prefix.length >= options.stopAt || typeof options.stopAt === "function" && options.stopAt(prefix)) {
|
|
29
|
+
if (propAccess.deepEqual(a, b)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
return yield [
|
|
33
|
+
{ op: "replace", path: prefix, value: b },
|
|
34
|
+
{ op: "replace", path: prefix, value: a }
|
|
35
|
+
];
|
|
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
|
+
}
|
|
46
|
+
if (a instanceof Map && b instanceof Map) {
|
|
47
|
+
return yield* mapDiff(a, b, options, prefix);
|
|
48
|
+
}
|
|
49
|
+
if (a instanceof Set && b instanceof Set) {
|
|
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
|
+
];
|
|
57
|
+
}
|
|
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)) {
|
|
68
|
+
return yield* objectDiff(a, b, options, prefix);
|
|
69
|
+
}
|
|
70
|
+
yield [
|
|
71
|
+
{ op: "replace", path: prefix, value: b },
|
|
72
|
+
{ op: "replace", path: prefix, value: a }
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
function* mapDiff(a, b, options, prefix) {
|
|
76
|
+
for (const [key, value] of a) {
|
|
77
|
+
if (!b.has(key)) {
|
|
78
|
+
yield [
|
|
79
|
+
{ op: "remove", path: [...prefix, key] },
|
|
80
|
+
{ op: "add", path: [...prefix, key], value }
|
|
81
|
+
];
|
|
82
|
+
} else {
|
|
83
|
+
yield* _diff(value, b.get(key), options, [...prefix, key]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (const [key, value] of b) {
|
|
87
|
+
if (!a.has(key)) {
|
|
88
|
+
yield [
|
|
89
|
+
{ op: "add", path: [...prefix, key], value },
|
|
90
|
+
{ op: "remove", path: [...prefix, key] }
|
|
91
|
+
];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function* objectDiff(a, b, options, prefix) {
|
|
96
|
+
for (const [key, value] of Object.entries(a)) {
|
|
97
|
+
if (!(key in b)) {
|
|
98
|
+
yield [
|
|
99
|
+
{ op: "remove", path: [...prefix, key] },
|
|
100
|
+
{ op: "add", path: [...prefix, key], value }
|
|
101
|
+
];
|
|
102
|
+
} else {
|
|
103
|
+
yield* _diff(value, b[key], options, [...prefix, key]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const [key, value] of Object.entries(b)) {
|
|
107
|
+
if (!(key in a)) {
|
|
108
|
+
yield [
|
|
109
|
+
{ op: "add", path: [...prefix, key], value },
|
|
110
|
+
{ op: "remove", path: [...prefix, key] }
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
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
|
+
|
|
170
|
+
const genId = () => Math.random().toString(36).slice(2);
|
|
171
|
+
function subscribePatches(listener, options = {}) {
|
|
172
|
+
const patches = this.__patches ??= {
|
|
173
|
+
value: this.get(),
|
|
174
|
+
version: genId(),
|
|
175
|
+
history: []
|
|
176
|
+
};
|
|
177
|
+
options = { ...options };
|
|
178
|
+
options.runNow ??= false;
|
|
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
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (cursor === patches.version) return;
|
|
196
|
+
const index = patches.history.findIndex((h) => h.fromVersion === cursor);
|
|
197
|
+
let forward, backward, previousVersion;
|
|
198
|
+
if (index === -1) {
|
|
199
|
+
[forward, backward] = diff(void 0, value, options);
|
|
200
|
+
previousVersion = void 0;
|
|
201
|
+
} else {
|
|
202
|
+
forward = patches.history.slice(index).flatMap((h) => h.patches);
|
|
203
|
+
backward = patches.history.slice(index).flatMap((h) => h.reversePatches);
|
|
204
|
+
previousVersion = cursor;
|
|
205
|
+
}
|
|
206
|
+
cursor = patches.version;
|
|
207
|
+
listener(forward, backward, cursor, previousVersion);
|
|
208
|
+
}, options);
|
|
209
|
+
}
|
|
210
|
+
function applyPatches(...patches) {
|
|
211
|
+
this.set((value) => applyPatches$1(value, ...patches.flat()));
|
|
212
|
+
}
|
|
213
|
+
function sync(listener, options) {
|
|
214
|
+
return this.subscribePatches(
|
|
215
|
+
(patches, _, version, previousVersion) => {
|
|
216
|
+
listener({
|
|
217
|
+
fromVersion: previousVersion,
|
|
218
|
+
toVersion: version,
|
|
219
|
+
patches: toExtendedJson(patches)
|
|
220
|
+
});
|
|
221
|
+
},
|
|
222
|
+
{ ...options, runNow: true }
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
function acceptSync(message) {
|
|
226
|
+
if (message.fromVersion && message.fromVersion !== this.version) {
|
|
227
|
+
throw new Error(
|
|
228
|
+
`version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
const patches = fromExtendedJson(message.patches);
|
|
232
|
+
this.version = message.toVersion;
|
|
233
|
+
this.applyPatches(...patches);
|
|
234
|
+
}
|
|
235
|
+
const patchMethods = {
|
|
236
|
+
subscribePatches,
|
|
237
|
+
applyPatches,
|
|
238
|
+
sync,
|
|
239
|
+
acceptSync
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
exports.applyPatches = applyPatches$1;
|
|
243
|
+
exports.diff = diff;
|
|
244
|
+
exports.fromExtendedJsonString = fromExtendedJsonString;
|
|
245
|
+
exports.patchMethods = patchMethods;
|
|
246
|
+
exports.toExtendedJsonString = toExtendedJsonString;
|
|
247
|
+
//# sourceMappingURL=index2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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":"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"}
|
|
@@ -2,59 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
|
-
const
|
|
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
|
-
|
|
8
|
+
|
|
9
|
+
exports.patchMethods = patches_index.patchMethods;
|
|
60
10
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|