cross-state 0.38.1 → 0.39.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.
- package/dist/cjs/index.cjs +2 -214
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index2.cjs +118 -44
- package/dist/cjs/index2.cjs.map +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/scope.cjs.map +1 -1
- package/dist/cjs/store.cjs +16 -3
- package/dist/cjs/store.cjs.map +1 -1
- package/dist/cjs/urlStore.cjs.map +1 -1
- package/dist/es/index.mjs +4 -219
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/index2.mjs +118 -46
- package/dist/es/index2.mjs.map +1 -1
- package/dist/es/mutative/register.mjs +1 -1
- package/dist/es/patches/register.mjs +1 -1
- 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 +1 -1
- package/dist/es/react/register.mjs +1 -1
- package/dist/es/scope.mjs +1 -1
- package/dist/es/scope.mjs.map +1 -1
- package/dist/es/store.mjs +18 -5
- package/dist/es/store.mjs.map +1 -1
- package/dist/es/storeMethods.mjs +1 -1
- package/dist/es/urlStore.mjs +1 -1
- 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 +14 -8
- package/dist/types/core/urlStore.d.ts +1 -1
- package/dist/types/lib/extendedJson.d.ts +4 -0
- package/dist/types/patches/patchMethods.d.ts +3 -2
- package/dist/types/persist/persist.d.ts +1 -1
- 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/package.json +15 -14
- package/dist/types/lib/maybeAsync.d.ts +0 -3
package/dist/cjs/index.cjs
CHANGED
|
@@ -7,6 +7,7 @@ const store = require('./store.cjs');
|
|
|
7
7
|
const urlStore = require('./urlStore.cjs');
|
|
8
8
|
const patches_index = require('./index2.cjs');
|
|
9
9
|
const propAccess = require('./propAccess.cjs');
|
|
10
|
+
const persist = require('./persist.cjs');
|
|
10
11
|
|
|
11
12
|
function findOrDefault(array, predicate, defaultValue) {
|
|
12
13
|
const index = array.findIndex(predicate);
|
|
@@ -18,219 +19,6 @@ function findOrDefault(array, predicate, defaultValue) {
|
|
|
18
19
|
return value;
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
function maybeAsync(value, action) {
|
|
22
|
-
if (store.isPromise(value)) {
|
|
23
|
-
return value.then(action);
|
|
24
|
-
}
|
|
25
|
-
return action(value);
|
|
26
|
-
}
|
|
27
|
-
function maybeAsyncArray(values) {
|
|
28
|
-
const run = (remainingValues, results) => {
|
|
29
|
-
const [first, ...rest] = remainingValues;
|
|
30
|
-
if (!first) {
|
|
31
|
-
return results;
|
|
32
|
-
}
|
|
33
|
-
return maybeAsync(first(), (result) => run(rest, results.concat(result)));
|
|
34
|
-
};
|
|
35
|
-
return run(values, []);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const isAncestor = (ancestor, path) => {
|
|
39
|
-
return ancestor.length <= path.length && ancestor.every((v, i) => v === "*" || path[i] === "*" || v === path[i]);
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
function normalizeStorage(storage) {
|
|
43
|
-
return {
|
|
44
|
-
getItem: storage.getItem.bind(storage),
|
|
45
|
-
setItem: storage.setItem.bind(storage),
|
|
46
|
-
removeItem: storage.removeItem.bind(storage),
|
|
47
|
-
keys() {
|
|
48
|
-
if ("keys" in storage) {
|
|
49
|
-
return storage.keys();
|
|
50
|
-
}
|
|
51
|
-
return maybeAsync(
|
|
52
|
-
storage.length instanceof Function ? storage.length() : storage.length,
|
|
53
|
-
(length) => {
|
|
54
|
-
const keyPromises = maybeAsyncArray(
|
|
55
|
-
Array.from({ length }, (_, index) => () => storage.key(index))
|
|
56
|
-
);
|
|
57
|
-
return maybeAsync(
|
|
58
|
-
keyPromises,
|
|
59
|
-
(keys) => keys.filter((key) => typeof key === "string")
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
class Persist {
|
|
68
|
-
constructor(store$1, options) {
|
|
69
|
-
this.store = store$1;
|
|
70
|
-
this.options = options;
|
|
71
|
-
this.queue = store.queue();
|
|
72
|
-
this.handles = /* @__PURE__ */ new Set();
|
|
73
|
-
this.stopped = false;
|
|
74
|
-
this.storage = normalizeStorage(options.storage);
|
|
75
|
-
this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);
|
|
76
|
-
this.prefix = `${options.id}:`;
|
|
77
|
-
if (Symbol.dispose) {
|
|
78
|
-
this[Symbol.dispose] = () => this.stop();
|
|
79
|
-
}
|
|
80
|
-
this.paths = (options.paths ?? []).map((p) => {
|
|
81
|
-
if (isPlainPath(p)) {
|
|
82
|
-
return {
|
|
83
|
-
path: propAccess.castArrayPath(p),
|
|
84
|
-
throttle: options.throttle && store.calcDuration(options.throttle)
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
const _p = p;
|
|
88
|
-
return {
|
|
89
|
-
path: propAccess.castArrayPath(_p.path),
|
|
90
|
-
throttle: (_p.throttle && store.calcDuration(_p.throttle)) ?? (options.throttle && store.calcDuration(options.throttle))
|
|
91
|
-
};
|
|
92
|
-
}).sort((a, b) => b.path.length - a.path.length);
|
|
93
|
-
if (this.paths.length === 0) {
|
|
94
|
-
this.paths.push({
|
|
95
|
-
path: ["*"],
|
|
96
|
-
throttle: options.throttle && store.calcDuration(options.throttle)
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
this.initialized = new Promise((resolve) => {
|
|
100
|
-
this.resolveInitialized = resolve;
|
|
101
|
-
});
|
|
102
|
-
this.watchStore();
|
|
103
|
-
this.watchStorage();
|
|
104
|
-
}
|
|
105
|
-
watchStore() {
|
|
106
|
-
const throttle = Math.min(...this.paths.map((p) => p.throttle ?? 0)) || void 0;
|
|
107
|
-
const cancel = patches_index.patchMethods.subscribePatches.apply(this.store, [
|
|
108
|
-
(patches) => {
|
|
109
|
-
for (const patch of patches) {
|
|
110
|
-
if (this.updateInProgress && propAccess.shallowEqual(this.updateInProgress[0], patch.path) && this.updateInProgress[1] === (patch.op === "remove" ? void 0 : patch.value)) {
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));
|
|
114
|
-
if (!ancestor) {
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
const pathToSave = patch.path.slice(0, ancestor.path.length);
|
|
118
|
-
this.queue(() => this.save(pathToSave), pathToSave);
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
{ runNow: false, throttle }
|
|
122
|
-
]);
|
|
123
|
-
this.handles.add(cancel);
|
|
124
|
-
}
|
|
125
|
-
async watchStorage() {
|
|
126
|
-
let keys = this.storage.keys();
|
|
127
|
-
if (store.isPromise(keys)) {
|
|
128
|
-
keys = await keys;
|
|
129
|
-
}
|
|
130
|
-
if (this.stopped) {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
for (const key of keys) {
|
|
134
|
-
const path = this.parseKey(key);
|
|
135
|
-
if (!path) {
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
this.queue(() => this.load(path));
|
|
139
|
-
}
|
|
140
|
-
this.queue(() => this.resolveInitialized?.());
|
|
141
|
-
const listener = (event) => {
|
|
142
|
-
this.queue(() => this.load({ type: "data", path: event.data }));
|
|
143
|
-
};
|
|
144
|
-
this.channel.addEventListener("message", listener);
|
|
145
|
-
this.handles.add(() => this.channel.removeEventListener("message", listener));
|
|
146
|
-
}
|
|
147
|
-
buildKey({ type, path }) {
|
|
148
|
-
return `${this.prefix}${type === "internal" ? path : JSON.stringify(path)}`;
|
|
149
|
-
}
|
|
150
|
-
parseKey(key) {
|
|
151
|
-
if (!key.startsWith(this.prefix)) {
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
key = key.slice(this.prefix.length);
|
|
155
|
-
if (!key.startsWith("[")) {
|
|
156
|
-
return { type: "internal", path: key };
|
|
157
|
-
}
|
|
158
|
-
return { type: "data", path: JSON.parse(key) };
|
|
159
|
-
}
|
|
160
|
-
load({ type, path }) {
|
|
161
|
-
if (type === "internal") {
|
|
162
|
-
switch (path) {
|
|
163
|
-
case "version":
|
|
164
|
-
return maybeAsync(
|
|
165
|
-
this.storage.getItem(this.buildKey({ type: "internal", path: "version" })),
|
|
166
|
-
(value) => {
|
|
167
|
-
this.store.version = value || void 0;
|
|
168
|
-
}
|
|
169
|
-
);
|
|
170
|
-
default:
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
const matchingPath = this.paths.find(
|
|
175
|
-
(p) => p.path.length === path.length && isAncestor(p.path, path)
|
|
176
|
-
);
|
|
177
|
-
if (!matchingPath) {
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
const key = this.buildKey({ type: "data", path });
|
|
181
|
-
return maybeAsync(this.storage.getItem(key), (value) => {
|
|
182
|
-
if (this.stopped || !value) {
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
const inSaveQueue = this.queue.getRefs().find((ref) => isAncestor(ref, path) || isAncestor(path, ref));
|
|
186
|
-
if (inSaveQueue) {
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const parsedValue = value === "undefined" ? void 0 : JSON.parse(value);
|
|
190
|
-
this.updateInProgress = [path, parsedValue];
|
|
191
|
-
this.store.set((state) => propAccess.set(state, path, parsedValue));
|
|
192
|
-
this.updateInProgress = void 0;
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
save(path) {
|
|
196
|
-
const key = this.buildKey({ type: "data", path });
|
|
197
|
-
const value = propAccess.get(this.store.get(), path);
|
|
198
|
-
const serializedValue = value === void 0 ? "undefined" : JSON.stringify(value);
|
|
199
|
-
return maybeAsync(this.storage.setItem(key, serializedValue), () => {
|
|
200
|
-
this.channel.postMessage(path);
|
|
201
|
-
return maybeAsync(
|
|
202
|
-
this.store.version ? this.storage.setItem(
|
|
203
|
-
this.buildKey({ type: "internal", path: "version" }),
|
|
204
|
-
this.store.version ?? ""
|
|
205
|
-
) : this.storage.removeItem(this.buildKey({ type: "internal", path: "version" })),
|
|
206
|
-
() => {
|
|
207
|
-
return maybeAsync(this.storage.keys(), (keys) => {
|
|
208
|
-
const toRemove = keys.filter((k) => {
|
|
209
|
-
const parsedKey = this.parseKey(k);
|
|
210
|
-
return parsedKey?.type === "data" && parsedKey.path.length > path.length && isAncestor(path, parsedKey.path);
|
|
211
|
-
});
|
|
212
|
-
return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
);
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
async stop() {
|
|
219
|
-
this.stopped = true;
|
|
220
|
-
for (const handle of this.handles) {
|
|
221
|
-
handle();
|
|
222
|
-
}
|
|
223
|
-
await this.queue.whenDone();
|
|
224
|
-
this.channel.close();
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
function persist(store, options) {
|
|
228
|
-
return new Persist(store, options);
|
|
229
|
-
}
|
|
230
|
-
function isPlainPath(p) {
|
|
231
|
-
return typeof p === "string" || Array.isArray(p);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
22
|
exports.Cache = scope.Cache;
|
|
235
23
|
exports.InstanceCache = scope.InstanceCache;
|
|
236
24
|
exports.ResourceGroup = scope.ResourceGroup;
|
|
@@ -256,6 +44,6 @@ exports.get = propAccess.get;
|
|
|
256
44
|
exports.set = propAccess.set;
|
|
257
45
|
exports.shallowEqual = propAccess.shallowEqual;
|
|
258
46
|
exports.strictEqual = propAccess.strictEqual;
|
|
47
|
+
exports.persist = persist.persist;
|
|
259
48
|
exports.findOrDefault = findOrDefault;
|
|
260
|
-
exports.persist = persist;
|
|
261
49
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/lib/updateHelpers.ts","../../src/lib/maybeAsync.ts","../../src/persist/persistPathHelpers.ts","../../src/persist/persistStorage.ts","../../src/persist/persist.ts"],"sourcesContent":["export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n","import isPromise from '@lib/isPromise';\nimport type { MaybePromise } from './maybePromise';\n\nexport function maybeAsync<T, R>(\n value: MaybePromise<T>,\n action: (value: T) => MaybePromise<R>,\n): MaybePromise<R> {\n if (isPromise(value)) {\n return value.then(action);\n }\n return action(value);\n}\n\nexport function maybeAsyncArray<T>(values: (() => MaybePromise<T>)[]): MaybePromise<T[]> {\n const run = (remainingValues: (() => MaybePromise<T>)[], results: T[]): MaybePromise<T[]> => {\n const [first, ...rest] = remainingValues;\n if (!first) {\n return results;\n }\n\n return maybeAsync(first(), (result) => run(rest, results.concat(result)));\n };\n\n return run(values, []);\n}\n","import { isObject } from '@lib/helpers';\nimport type { KeyType } from '@lib/path';\n\nexport const isAncestor = (ancestor: KeyType[], path: KeyType[]): boolean => {\n return (\n ancestor.length <= path.length &&\n ancestor.every((v, i) => v === '*' || path[i] === '*' || v === path[i])\n );\n};\n\nexport const split = (\n value: any,\n path: KeyType[],\n): [value: unknown, subValues: { path: KeyType[]; value: unknown }[]] => {\n const [first, ...rest] = path;\n if (first === undefined) return [value, []];\n\n if (rest.length === 0) {\n if (first === '*')\n return [{}, Object.entries(value).map(([k, v]) => ({ path: [k], value: v }))];\n if (!(first in value)) return [value, []];\n const { [first]: subValue, ...newValue } = value;\n return [newValue, [{ path: [first], value: subValue }]];\n }\n\n const newValue = { ...value };\n const subValues = new Array<{ path: KeyType[]; value: unknown }>();\n for (const key of first === '*' ? Object.keys(value) : [first]) {\n if (!isObject(newValue[key])) return [value, []];\n const result = split(newValue[key], rest);\n newValue[key] = result[0];\n subValues.push(...result[1].map((s) => ({ path: [key, ...s.path], value: s.value })));\n }\n return [newValue, subValues];\n};\n","import { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\n\nexport interface PersistStorageBase {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => unknown | Promise<unknown>;\n removeItem: (key: string) => unknown | Promise<unknown>;\n}\n\nexport interface PersistStorageWithKeys extends PersistStorageBase {\n keys: () => string[] | Promise<string[]>;\n}\n\nexport interface PersistStorageWithLength extends PersistStorageBase {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n}\n\nexport type PersistStorage = PersistStorageBase &\n (PersistStorageWithKeys | PersistStorageWithLength);\n\nexport function normalizeStorage(storage: PersistStorage): PersistStorageWithKeys {\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n\n keys(): string[] | Promise<string[]> {\n if ('keys' in storage) {\n return storage.keys();\n }\n\n return maybeAsync(\n storage.length instanceof Function ? storage.length() : storage.length,\n (length) => {\n const keyPromises = maybeAsyncArray(\n Array.from({ length }, (_, index) => () => storage.key(index)),\n );\n\n return maybeAsync(keyPromises, (keys) =>\n keys.filter((key): key is string => typeof key === 'string'),\n );\n },\n );\n },\n };\n}\n","import { type Cancel, type Duration, type Store } from '@core';\nimport { calcDuration } from '@lib/calcDuration';\nimport { shallowEqual } from '@lib/equals';\nimport isPromise from '@lib/isPromise';\nimport { maybeAsync, maybeAsyncArray } from '@lib/maybeAsync';\nimport type { KeyType, WildcardPath } from '@lib/path';\nimport { castArrayPath, get, set } from '@lib/propAccess';\nimport { queue } from '@lib/queue';\nimport { patchMethods } from '@patches';\nimport { isAncestor } from './persistPathHelpers';\nimport {\n normalizeStorage,\n type PersistStorage,\n type PersistStorageWithKeys,\n} from './persistStorage';\n\ntype PathOption<T> =\n | WildcardPath<T>\n | {\n path: WildcardPath<T>;\n // throttle?: Duration;\n };\n\ntype Key = { type: 'internal'; path: string } | { type: 'data'; path: KeyType[] };\n\nexport interface PersistOptions<T> {\n id: string;\n storage: PersistStorage;\n paths?: PathOption<T>[];\n throttle?: Duration;\n}\n\nexport class Persist<T> {\n readonly storage: PersistStorageWithKeys;\n readonly [Symbol.dispose]!: Cancel;\n\n readonly paths: {\n path: KeyType[];\n throttle?: number;\n }[];\n\n readonly initialized: Promise<void>;\n\n private resolveInitialized?: () => void;\n\n private channel: BroadcastChannel;\n\n private queue = queue();\n\n private handles = new Set<Cancel>();\n\n private stopped = false;\n\n private updateInProgress?: [any, any];\n\n private prefix;\n\n constructor(\n public readonly store: Store<T>,\n public readonly options: PersistOptions<T>,\n ) {\n this.storage = normalizeStorage(options.storage);\n this.channel = new BroadcastChannel(`cross-state-persist_${options.id}`);\n this.prefix = `${options.id}:`;\n\n if (Symbol.dispose) {\n this[Symbol.dispose] = () => this.stop();\n }\n\n this.paths = (options.paths ?? [])\n .map<{\n path: KeyType[];\n throttle?: number;\n }>((p) => {\n if (isPlainPath(p)) {\n return {\n path: castArrayPath(p),\n throttle: options.throttle && calcDuration(options.throttle),\n };\n }\n\n const _p = p as { path: KeyType[]; throttle?: Duration };\n\n return {\n path: castArrayPath(_p.path),\n throttle:\n (_p.throttle && calcDuration(_p.throttle)) ??\n (options.throttle && calcDuration(options.throttle)),\n };\n })\n .sort((a, b) => b.path.length - a.path.length);\n\n if (this.paths.length === 0) {\n this.paths.push({\n path: ['*'],\n throttle: options.throttle && calcDuration(options.throttle),\n });\n }\n\n this.initialized = new Promise((resolve) => {\n this.resolveInitialized = resolve;\n });\n\n this.watchStore();\n this.watchStorage();\n }\n\n private watchStore() {\n const throttle = Math.min(...this.paths.map((p) => p.throttle ?? 0)) || undefined;\n\n const cancel = patchMethods.subscribePatches.apply(this.store as Store<unknown>, [\n (patches) => {\n for (const patch of patches) {\n if (\n this.updateInProgress &&\n shallowEqual(this.updateInProgress[0], patch.path) &&\n this.updateInProgress[1] === (patch.op === 'remove' ? undefined : patch.value)\n ) {\n continue;\n }\n\n const ancestor = this.paths.find((p) => isAncestor(p.path, patch.path));\n\n if (!ancestor) {\n continue;\n }\n\n const pathToSave = patch.path.slice(0, ancestor.path.length);\n this.queue(() => this.save(pathToSave), pathToSave);\n }\n },\n { runNow: false, throttle },\n ]);\n\n this.handles.add(cancel);\n }\n\n private async watchStorage() {\n let keys = this.storage.keys();\n if (isPromise(keys)) {\n keys = await keys;\n }\n\n if (this.stopped) {\n return;\n }\n\n for (const key of keys) {\n const path = this.parseKey(key);\n if (!path) {\n continue;\n }\n\n this.queue(() => this.load(path));\n }\n\n this.queue(() => this.resolveInitialized?.());\n\n const listener = (event: MessageEvent) => {\n this.queue(() => this.load({ type: 'data', path: event.data }));\n };\n\n this.channel.addEventListener('message', listener);\n this.handles.add(() => this.channel.removeEventListener('message', listener));\n }\n\n private buildKey({ type, path }: Key) {\n return `${this.prefix}${type === 'internal' ? path : JSON.stringify(path)}`;\n }\n\n private parseKey(key: string): Key | undefined {\n if (!key.startsWith(this.prefix)) {\n return;\n }\n\n key = key.slice(this.prefix.length);\n\n if (!key.startsWith('[')) {\n return { type: 'internal', path: key };\n }\n\n return { type: 'data', path: JSON.parse(key) as KeyType[] };\n }\n\n private load({ type, path }: Key) {\n if (type === 'internal') {\n switch (path) {\n case 'version':\n return maybeAsync(\n this.storage.getItem(this.buildKey({ type: 'internal', path: 'version' })),\n (value) => {\n this.store.version = value || undefined;\n },\n );\n default:\n return;\n }\n }\n\n const matchingPath = this.paths.find(\n (p) => p.path.length === path.length && isAncestor(p.path, path),\n );\n if (!matchingPath) {\n return;\n }\n\n const key = this.buildKey({ type: 'data', path });\n\n return maybeAsync(this.storage.getItem(key), (value) => {\n if (this.stopped || !value) {\n return;\n }\n\n const inSaveQueue = this.queue\n .getRefs()\n .find((ref) => isAncestor(ref, path) || isAncestor(path, ref));\n if (inSaveQueue) {\n return;\n }\n\n const parsedValue = value === 'undefined' ? undefined : JSON.parse(value);\n\n this.updateInProgress = [path, parsedValue];\n this.store.set((state) => set(state, path as any, parsedValue));\n this.updateInProgress = undefined;\n });\n }\n\n private save(path: KeyType[]) {\n const key = this.buildKey({ type: 'data', path });\n const value = get(this.store.get(), path as any);\n const serializedValue = value === undefined ? 'undefined' : JSON.stringify(value);\n\n return maybeAsync(this.storage.setItem(key, serializedValue), () => {\n this.channel.postMessage(path);\n\n return maybeAsync(\n this.store.version\n ? this.storage.setItem(\n this.buildKey({ type: 'internal', path: 'version' }),\n this.store.version ?? '',\n )\n : this.storage.removeItem(this.buildKey({ type: 'internal', path: 'version' })),\n () => {\n return maybeAsync(this.storage.keys(), (keys) => {\n const toRemove = keys.filter((k) => {\n const parsedKey = this.parseKey(k);\n return (\n parsedKey?.type === 'data' &&\n parsedKey.path.length > path.length &&\n isAncestor(path, parsedKey.path)\n // !this.queue.getRefs().find((ref) => isAncestor(ref, parsedKey))\n );\n });\n\n return maybeAsyncArray(toRemove.map((k) => () => this.storage.removeItem(k)));\n });\n },\n );\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n\n for (const handle of this.handles) {\n handle();\n }\n\n await this.queue.whenDone();\n this.channel.close();\n }\n}\n\nexport function persist<T>(store: Store<T>, options: PersistOptions<T>): Persist<T> {\n return new Persist<T>(store, options);\n}\n\nfunction isPlainPath<T>(p: PathOption<T>): p is WildcardPath<T> & (KeyType[] | string) {\n return typeof p === 'string' || Array.isArray(p);\n}\n"],"names":["isPromise","store","queue","castArrayPath","calcDuration","patchMethods","shallowEqual","set","get"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/lib/updateHelpers.ts"],"sourcesContent":["export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAAgB,SAAA,aAAA,CACd,KACA,EAAA,SAAA,EACA,YACG,EAAA;AACH,EAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,SAAA,CAAU,SAAS,CAAA,CAAA;AAEvC,EAAA,IAAI,SAAS,CAAG,EAAA;AACd,IAAA,OAAO,MAAM,KAAK,CAAA,CAAA;AAAA,GACpB;AAEA,EAAA,MAAM,KAAQ,GAAA,YAAA,YAAwB,QAAW,GAAA,YAAA,EAAiB,GAAA,YAAA,CAAA;AAClE,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA,CAAA;AAChB,EAAO,OAAA,KAAA,CAAA;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/cjs/index2.cjs
CHANGED
|
@@ -34,14 +34,37 @@ function* _diff(a, b, options, prefix = []) {
|
|
|
34
34
|
{ op: "replace", path: prefix, value: a }
|
|
35
35
|
];
|
|
36
36
|
}
|
|
37
|
+
if (a instanceof Date && b instanceof Date) {
|
|
38
|
+
if (a.getTime() === b.getTime()) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
return yield [
|
|
42
|
+
{ op: "replace", path: prefix, value: b },
|
|
43
|
+
{ op: "replace", path: prefix, value: a }
|
|
44
|
+
];
|
|
45
|
+
}
|
|
37
46
|
if (a instanceof Map && b instanceof Map) {
|
|
38
47
|
return yield* mapDiff(a, b, options, prefix);
|
|
39
48
|
}
|
|
40
49
|
if (a instanceof Set && b instanceof Set) {
|
|
41
|
-
a
|
|
42
|
-
|
|
50
|
+
if (propAccess.deepEqual(a, b)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
return yield [
|
|
54
|
+
{ op: "replace", path: prefix, value: b },
|
|
55
|
+
{ op: "replace", path: prefix, value: a }
|
|
56
|
+
];
|
|
43
57
|
}
|
|
44
|
-
if (
|
|
58
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
59
|
+
if (propAccess.deepEqual(a, b)) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
return yield [
|
|
63
|
+
{ op: "replace", path: prefix, value: b },
|
|
64
|
+
{ op: "replace", path: prefix, value: a }
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
if (propAccess.isObject(a) && propAccess.isObject(b) && !Array.isArray(a) && !Array.isArray(b)) {
|
|
45
68
|
return yield* objectDiff(a, b, options, prefix);
|
|
46
69
|
}
|
|
47
70
|
yield [
|
|
@@ -70,70 +93,118 @@ function* mapDiff(a, b, options, prefix) {
|
|
|
70
93
|
}
|
|
71
94
|
}
|
|
72
95
|
function* objectDiff(a, b, options, prefix) {
|
|
73
|
-
const castKey = (key) => Array.isArray(a) ? Number(key) : key;
|
|
74
96
|
for (const [key, value] of Object.entries(a)) {
|
|
75
97
|
if (!(key in b)) {
|
|
76
98
|
yield [
|
|
77
|
-
{ op: "remove", path: [...prefix,
|
|
78
|
-
{ op: "add", path: [...prefix,
|
|
99
|
+
{ op: "remove", path: [...prefix, key] },
|
|
100
|
+
{ op: "add", path: [...prefix, key], value }
|
|
79
101
|
];
|
|
80
102
|
} else {
|
|
81
|
-
yield* _diff(value, b[key], options, [...prefix,
|
|
103
|
+
yield* _diff(value, b[key], options, [...prefix, key]);
|
|
82
104
|
}
|
|
83
105
|
}
|
|
84
106
|
for (const [key, value] of Object.entries(b)) {
|
|
85
107
|
if (!(key in a)) {
|
|
86
108
|
yield [
|
|
87
|
-
{ op: "add", path: [...prefix,
|
|
88
|
-
{ op: "remove", path: [...prefix,
|
|
109
|
+
{ op: "add", path: [...prefix, key], value },
|
|
110
|
+
{ op: "remove", path: [...prefix, key] }
|
|
89
111
|
];
|
|
90
112
|
}
|
|
91
113
|
}
|
|
92
114
|
}
|
|
93
115
|
|
|
116
|
+
function toExtendedJson(value) {
|
|
117
|
+
if (value instanceof Map) {
|
|
118
|
+
return {
|
|
119
|
+
__map: [...value].map(([k, v]) => [toExtendedJson(k), toExtendedJson(v)])
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (value instanceof Set) {
|
|
123
|
+
return {
|
|
124
|
+
__set: [...value].map(toExtendedJson)
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (value instanceof Date) {
|
|
128
|
+
return {
|
|
129
|
+
__date: value.toISOString()
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (Array.isArray(value)) {
|
|
133
|
+
return value.map(toExtendedJson);
|
|
134
|
+
}
|
|
135
|
+
if (typeof value === "object" && value !== null) {
|
|
136
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, toExtendedJson(v)]));
|
|
137
|
+
}
|
|
138
|
+
return value;
|
|
139
|
+
}
|
|
140
|
+
function toExtendedJsonString(value) {
|
|
141
|
+
return JSON.stringify(toExtendedJson(value));
|
|
142
|
+
}
|
|
143
|
+
function fromExtendedJson(value) {
|
|
144
|
+
if (typeof value !== "object" || value === null) {
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
if ("__map" in value) {
|
|
148
|
+
return new Map(
|
|
149
|
+
value.__map.map(([k, v]) => [
|
|
150
|
+
fromExtendedJson(k),
|
|
151
|
+
fromExtendedJson(v)
|
|
152
|
+
])
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
if ("__set" in value) {
|
|
156
|
+
return new Set(value.__set.map(fromExtendedJson));
|
|
157
|
+
}
|
|
158
|
+
if ("__date" in value) {
|
|
159
|
+
return new Date(value.__date);
|
|
160
|
+
}
|
|
161
|
+
if (Array.isArray(value)) {
|
|
162
|
+
return value.map(fromExtendedJson);
|
|
163
|
+
}
|
|
164
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, fromExtendedJson(v)]));
|
|
165
|
+
}
|
|
166
|
+
function fromExtendedJsonString(value) {
|
|
167
|
+
return fromExtendedJson(JSON.parse(value));
|
|
168
|
+
}
|
|
169
|
+
|
|
94
170
|
const genId = () => Math.random().toString(36).slice(2);
|
|
95
171
|
function subscribePatches(listener, options = {}) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
previousValue = value;
|
|
103
|
-
const newVersion = genId();
|
|
104
|
-
patches = patches.concat({
|
|
105
|
-
fromVersion: version,
|
|
106
|
-
toVersion: newVersion,
|
|
107
|
-
patches: result[0],
|
|
108
|
-
reversePatches: result[1]
|
|
109
|
-
}).slice(-1e3);
|
|
110
|
-
version = newVersion;
|
|
111
|
-
return { version, history: patches };
|
|
112
|
-
});
|
|
113
|
-
}
|
|
172
|
+
const patches = this.__patches ??= {
|
|
173
|
+
value: this.get(),
|
|
174
|
+
version: genId(),
|
|
175
|
+
history: []
|
|
176
|
+
};
|
|
177
|
+
options = { ...options };
|
|
114
178
|
options.runNow ??= false;
|
|
115
|
-
let cursor = options.startAt;
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
179
|
+
let cursor = options.startAt ?? (options.runNow ? void 0 : this.__patches.version);
|
|
180
|
+
return this.subscribe((value) => {
|
|
181
|
+
if (patches.value !== value) {
|
|
182
|
+
const result = diff(patches.value, value, options);
|
|
183
|
+
patches.value = value;
|
|
184
|
+
if (result[0].length > 0) {
|
|
185
|
+
const newVersion = genId();
|
|
186
|
+
patches.history = patches.history.concat({
|
|
187
|
+
fromVersion: patches.version,
|
|
188
|
+
toVersion: newVersion,
|
|
189
|
+
patches: result[0],
|
|
190
|
+
reversePatches: result[1]
|
|
191
|
+
}).slice(-1e3);
|
|
192
|
+
patches.version = newVersion;
|
|
193
|
+
}
|
|
122
194
|
}
|
|
123
|
-
|
|
195
|
+
if (cursor === patches.version) return;
|
|
196
|
+
const index = patches.history.findIndex((h) => h.fromVersion === cursor);
|
|
124
197
|
let forward, backward, previousVersion;
|
|
125
198
|
if (index === -1) {
|
|
126
|
-
[forward, backward] = diff(void 0,
|
|
199
|
+
[forward, backward] = diff(void 0, value, options);
|
|
127
200
|
previousVersion = void 0;
|
|
128
201
|
} else {
|
|
129
|
-
forward =
|
|
130
|
-
backward =
|
|
202
|
+
forward = patches.history.slice(index).flatMap((h) => h.patches);
|
|
203
|
+
backward = patches.history.slice(index).flatMap((h) => h.reversePatches);
|
|
131
204
|
previousVersion = cursor;
|
|
132
205
|
}
|
|
133
|
-
cursor =
|
|
134
|
-
|
|
135
|
-
listener(forward, backward, cursor, previousVersion);
|
|
136
|
-
}
|
|
206
|
+
cursor = patches.version;
|
|
207
|
+
listener(forward, backward, cursor, previousVersion);
|
|
137
208
|
}, options);
|
|
138
209
|
}
|
|
139
210
|
function applyPatches(...patches) {
|
|
@@ -145,7 +216,7 @@ function sync(listener, options) {
|
|
|
145
216
|
listener({
|
|
146
217
|
fromVersion: previousVersion,
|
|
147
218
|
toVersion: version,
|
|
148
|
-
patches
|
|
219
|
+
patches: toExtendedJson(patches)
|
|
149
220
|
});
|
|
150
221
|
},
|
|
151
222
|
{ ...options, runNow: true }
|
|
@@ -157,8 +228,9 @@ function acceptSync(message) {
|
|
|
157
228
|
`version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`
|
|
158
229
|
);
|
|
159
230
|
}
|
|
231
|
+
const patches = fromExtendedJson(message.patches);
|
|
160
232
|
this.version = message.toVersion;
|
|
161
|
-
this.applyPatches(...
|
|
233
|
+
this.applyPatches(...patches);
|
|
162
234
|
}
|
|
163
235
|
const patchMethods = {
|
|
164
236
|
subscribePatches,
|
|
@@ -169,5 +241,7 @@ const patchMethods = {
|
|
|
169
241
|
|
|
170
242
|
exports.applyPatches = applyPatches$1;
|
|
171
243
|
exports.diff = diff;
|
|
244
|
+
exports.fromExtendedJsonString = fromExtendedJsonString;
|
|
172
245
|
exports.patchMethods = patchMethods;
|
|
246
|
+
exports.toExtendedJsonString = toExtendedJsonString;
|
|
173
247
|
//# sourceMappingURL=index2.cjs.map
|
package/dist/cjs/index2.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.cjs","sources":["../../src/lib/applyPatches.ts","../../src/lib/diff.ts","../../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import { isObject } from '@lib/helpers';\nimport { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport interface DiffOptions {\n stopAt?: number | ((path: KeyType[]) => boolean);\n}\n\nexport function diff(\n a: any,\n b: any,\n options: DiffOptions = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b, options)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n options: DiffOptions,\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (\n (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n (typeof options.stopAt === 'function' && options.stopAt(prefix))\n ) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n a = [...a];\n b = [...b];\n }\n\n if (isObject(a) && isObject(b) && Array.isArray(a) === Array.isArray(b)) {\n return yield* objectDiff(a, b, options, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n const castKey = (key: string) => (Array.isArray(a) ? Number(key) : key);\n\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, castKey(key)] },\n { op: 'add', path: [...prefix, castKey(key)], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, castKey(key)]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, castKey(key)], value },\n { op: 'remove', path: [...prefix, castKey(key)] },\n ];\n }\n }\n}\n","import type { DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: Store<{\n version: string;\n history: HistoryEntry[];\n }>;\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nfunction subscribePatches<T>(\n this: Store<T>,\n listener: (\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n if (!this.__patches) {\n let version = genId();\n let previousValue = this.get();\n let patches: HistoryEntry[] = [];\n\n this.__patches = this.map((value) => {\n const result = diff(previousValue, value, options);\n previousValue = value;\n const newVersion = genId();\n\n patches = patches\n .concat({\n fromVersion: version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n version = newVersion;\n return { version, history: patches };\n });\n }\n\n options.runNow ??= false;\n let cursor = options.startAt;\n\n if (!options.runNow && !options.startAt) {\n cursor = this.__patches.get().version;\n }\n\n return this.__patches.subscribe((p) => {\n if (cursor === p.version) {\n return;\n }\n\n const index = p.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, this.get(), options);\n previousVersion = undefined;\n } else {\n forward = p.history.slice(index).flatMap((h) => h.patches);\n backward = p.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = p.version;\n if (forward.length > 0) {\n listener(forward, backward, cursor, previousVersion);\n }\n }, options);\n}\n\nfunction applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nfunction applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nfunction applyPatches<T>(this: Store<T>, ...patches: (InteropPatch | InteropPatch[])[]): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nfunction sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n return this.subscribePatches(\n (patches, _, version, previousVersion) => {\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches,\n });\n },\n { ...options, runNow: true },\n );\n}\n\nfunction acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n this.version = message.toVersion;\n this.applyPatches(...message.patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"names":["remove","set","applyPatches","deepEqual","isObject","_applyPatches"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index2.cjs","sources":["../../src/lib/applyPatches.ts","../../src/lib/diff.ts","../../src/lib/extendedJson.ts","../../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import { isObject } from '@lib/helpers';\nimport { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n | { op: 'add'; path: KeyType[]; value: any }\n | { op: 'remove'; path: KeyType[] }\n | { op: 'replace'; path: KeyType[]; value: any };\n\nexport interface DiffOptions {\n stopAt?: number | ((path: KeyType[]) => boolean);\n}\n\nexport function diff(\n a: any,\n b: any,\n options: DiffOptions = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n const result = [..._diff(a, b, options)];\n const patches = result.map(([patch]) => patch);\n const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n return [patches, reversePatches];\n}\n\nfunction* _diff(\n a: any,\n b: any,\n options: DiffOptions,\n prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n if (a === b) {\n return;\n }\n\n if (\n (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n (typeof options.stopAt === 'function' && options.stopAt(prefix))\n ) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Date && b instanceof Date) {\n if (a.getTime() === b.getTime()) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (a instanceof Map && b instanceof Map) {\n return yield* mapDiff(a, b, options, prefix);\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (deepEqual(a, b)) {\n return;\n }\n\n return yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n }\n\n if (isObject(a) && isObject(b) && !Array.isArray(a) && !Array.isArray(b)) {\n return yield* objectDiff(a, b, options, prefix);\n }\n\n yield [\n { op: 'replace', path: prefix, value: b },\n { op: 'replace', path: prefix, value: a },\n ];\n}\n\nfunction* mapDiff(\n a: Map<any, any>,\n b: Map<any, any>,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of a) {\n if (!b.has(key)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b.get(key), options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of b) {\n if (!a.has(key)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n\nfunction* objectDiff(\n a: any,\n b: any,\n options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n for (const [key, value] of Object.entries(a)) {\n if (!(key in b)) {\n yield [\n { op: 'remove', path: [...prefix, key] },\n { op: 'add', path: [...prefix, key], value },\n ];\n } else {\n yield* _diff(value, b[key], options, [...prefix, key]);\n }\n }\n\n for (const [key, value] of Object.entries(b)) {\n if (!(key in a)) {\n yield [\n { op: 'add', path: [...prefix, key], value },\n { op: 'remove', path: [...prefix, key] },\n ];\n }\n }\n}\n","export function toExtendedJson(value: unknown): unknown {\n if (value instanceof Map) {\n return {\n __map: [...value].map(([k, v]) => [toExtendedJson(k), toExtendedJson(v)]),\n };\n }\n\n if (value instanceof Set) {\n return {\n __set: [...value].map(toExtendedJson),\n };\n }\n\n if (value instanceof Date) {\n return {\n __date: value.toISOString(),\n };\n }\n\n if (Array.isArray(value)) {\n return value.map(toExtendedJson);\n }\n\n if (typeof value === 'object' && value !== null) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, toExtendedJson(v)]));\n }\n\n return value;\n}\n\nexport function toExtendedJsonString(value: unknown): string {\n return JSON.stringify(toExtendedJson(value));\n}\n\nexport function fromExtendedJson(value: unknown): unknown {\n if (typeof value !== 'object' || value === null) {\n return value;\n }\n\n if ('__map' in value) {\n return new Map(\n (value.__map as [unknown, unknown][]).map(([k, v]) => [\n fromExtendedJson(k),\n fromExtendedJson(v),\n ]),\n );\n }\n\n if ('__set' in value) {\n return new Set((value.__set as unknown[]).map(fromExtendedJson));\n }\n\n if ('__date' in value) {\n return new Date(value.__date as string);\n }\n\n if (Array.isArray(value)) {\n return value.map(fromExtendedJson);\n }\n\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, fromExtendedJson(v)]));\n}\n\nexport function fromExtendedJsonString(value: string): unknown {\n return fromExtendedJson(JSON.parse(value));\n}\n","import type { DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nfunction subscribePatches<T>(\n this: Store<T>,\n listener: (\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe((value) => {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener(forward, backward, cursor, previousVersion);\n }, options);\n}\n\nfunction applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nfunction applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nfunction applyPatches<T>(this: Store<T>, ...patches: (InteropPatch | InteropPatch[])[]): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nfunction sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n return this.subscribePatches(\n (patches, _, version, previousVersion) => {\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, runNow: true },\n );\n}\n\nfunction acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n this.applyPatches(...patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"names":["remove","set","applyPatches","deepEqual","isObject","_applyPatches"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const store = require('../store.cjs');
|
|
4
|
+
const persist = require('../persist.cjs');
|
|
5
|
+
|
|
6
|
+
store.Store.addHook((store) => {
|
|
7
|
+
if (store.options.persist) {
|
|
8
|
+
store.persistance = persist.persist(store, store.options.persist);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=register.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.cjs","sources":["../../../src/persist/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { persist, type Persist, type PersistOptions } from '@persist/persist';\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface StoreOptions<T> {\n persist?: PersistOptions<T>;\n }\n\n interface Store<T> {\n persistance?: Persist<T>;\n }\n}\n\nStore.addHook((store) => {\n if (store.options.persist) {\n store.persistance = persist(store, store.options.persist);\n }\n});\n"],"names":["Store","persist"],"mappings":";;;;;AAcAA,WAAM,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AACvB,EAAI,IAAA,KAAA,CAAM,QAAQ,OAAS,EAAA;AACzB,IAAA,KAAA,CAAM,WAAc,GAAAC,eAAA,CAAQ,KAAO,EAAA,KAAA,CAAM,QAAQ,OAAO,CAAA,CAAA;AAAA,GAC1D;AACF,CAAC,CAAA;;"}
|