@legendapp/state 3.0.0-alpha.9 → 3.0.0-beta.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/.DS_Store +0 -0
- package/config/configureLegendState.d.mts +13 -0
- package/config/configureLegendState.d.ts +13 -0
- package/config/configureLegendState.js +45 -0
- package/config/configureLegendState.mjs +43 -0
- package/config/enable$GetSet.js +2 -1
- package/config/enable$GetSet.mjs +2 -1
- package/config/enableReactTracking.js +2 -1
- package/config/enableReactTracking.mjs +2 -1
- package/config/enableReactUse.js +2 -1
- package/config/enableReactUse.mjs +2 -1
- package/config/enable_PeekAssign.js +2 -1
- package/config/enable_PeekAssign.mjs +2 -1
- package/helpers/trackHistory.js +2 -2
- package/helpers/trackHistory.mjs +2 -2
- package/index.d.mts +103 -79
- package/index.d.ts +103 -79
- package/index.js +326 -316
- package/index.mjs +323 -314
- package/package.json +36 -1
- package/persist-plugins/async-storage.d.mts +6 -3
- package/persist-plugins/async-storage.d.ts +6 -3
- package/persist-plugins/async-storage.js +8 -4
- package/persist-plugins/async-storage.mjs +8 -5
- package/persist-plugins/indexeddb.d.mts +6 -4
- package/persist-plugins/indexeddb.d.ts +6 -4
- package/persist-plugins/indexeddb.js +35 -15
- package/persist-plugins/indexeddb.mjs +35 -16
- package/persist-plugins/mmkv.d.mts +5 -1
- package/persist-plugins/mmkv.d.ts +5 -1
- package/persist-plugins/mmkv.js +10 -5
- package/persist-plugins/mmkv.mjs +10 -6
- package/react-reactive/enableReactComponents.d.mts +9 -0
- package/react-reactive/enableReactComponents.d.ts +9 -0
- package/react-reactive/enableReactComponents.js +19 -0
- package/react-reactive/enableReactComponents.mjs +17 -0
- package/react-reactive/enableReactNativeComponents.d.mts +22 -0
- package/react-reactive/enableReactNativeComponents.d.ts +22 -0
- package/react-reactive/enableReactNativeComponents.js +53 -0
- package/react-reactive/enableReactNativeComponents.mjs +51 -0
- package/react-reactive/enableReactive.d.mts +5 -0
- package/react-reactive/enableReactive.d.ts +5 -0
- package/react-reactive/enableReactive.js +24 -0
- package/react-reactive/enableReactive.mjs +22 -0
- package/react-reactive/enableReactive.native.d.mts +5 -0
- package/react-reactive/enableReactive.native.d.ts +5 -0
- package/react-reactive/enableReactive.native.js +58 -0
- package/react-reactive/enableReactive.native.mjs +56 -0
- package/react-reactive/enableReactive.web.d.mts +5 -0
- package/react-reactive/enableReactive.web.d.ts +5 -0
- package/react-reactive/enableReactive.web.js +58 -0
- package/react-reactive/enableReactive.web.mjs +56 -0
- package/react.d.mts +39 -34
- package/react.d.ts +39 -34
- package/react.js +39 -17
- package/react.mjs +39 -17
- package/sync-plugins/crud.d.mts +21 -23
- package/sync-plugins/crud.d.ts +21 -23
- package/sync-plugins/crud.js +224 -112
- package/sync-plugins/crud.mjs +226 -114
- package/sync-plugins/fetch.js +12 -8
- package/sync-plugins/fetch.mjs +13 -9
- package/sync-plugins/firebase.d.mts +27 -0
- package/sync-plugins/firebase.d.ts +27 -0
- package/sync-plugins/firebase.js +373 -0
- package/sync-plugins/firebase.mjs +368 -0
- package/sync-plugins/keel.d.mts +43 -26
- package/sync-plugins/keel.d.ts +43 -26
- package/sync-plugins/keel.js +145 -99
- package/sync-plugins/keel.mjs +147 -99
- package/sync-plugins/supabase.d.mts +19 -9
- package/sync-plugins/supabase.d.ts +19 -9
- package/sync-plugins/supabase.js +52 -21
- package/sync-plugins/supabase.mjs +53 -22
- package/sync-plugins/tanstack-query.d.mts +2 -2
- package/sync-plugins/tanstack-query.d.ts +2 -2
- package/sync-plugins/tanstack-query.js +22 -5
- package/sync-plugins/tanstack-query.mjs +22 -5
- package/sync-plugins/tanstack-react-query.d.mts +1 -1
- package/sync-plugins/tanstack-react-query.d.ts +1 -1
- package/sync-plugins/tanstack-react-query.js +8 -1
- package/sync-plugins/tanstack-react-query.mjs +8 -1
- package/sync.d.mts +74 -200
- package/sync.d.ts +74 -200
- package/sync.js +495 -281
- package/sync.mjs +500 -286
package/index.mjs
CHANGED
|
@@ -9,6 +9,9 @@ function isString(obj) {
|
|
|
9
9
|
function isObject(obj) {
|
|
10
10
|
return !!obj && typeof obj === "object" && !(obj instanceof Date) && !isArray(obj);
|
|
11
11
|
}
|
|
12
|
+
function isPlainObject(obj) {
|
|
13
|
+
return isObject(obj) && obj.constructor === Object;
|
|
14
|
+
}
|
|
12
15
|
function isFunction(obj) {
|
|
13
16
|
return typeof obj === "function";
|
|
14
17
|
}
|
|
@@ -29,17 +32,22 @@ function isPromise(obj) {
|
|
|
29
32
|
return obj instanceof Promise;
|
|
30
33
|
}
|
|
31
34
|
function isMap(obj) {
|
|
32
|
-
return obj instanceof Map;
|
|
35
|
+
return obj instanceof Map || obj instanceof WeakMap;
|
|
36
|
+
}
|
|
37
|
+
function isSet(obj) {
|
|
38
|
+
return obj instanceof Set || obj instanceof WeakSet;
|
|
33
39
|
}
|
|
34
40
|
function isNumber(obj) {
|
|
35
41
|
const n = obj;
|
|
36
|
-
return n - n < 1;
|
|
42
|
+
return typeof n === "number" && n - n < 1;
|
|
37
43
|
}
|
|
38
44
|
function isEmpty(obj) {
|
|
39
45
|
if (!obj)
|
|
40
46
|
return false;
|
|
41
47
|
if (isArray(obj))
|
|
42
48
|
return obj.length === 0;
|
|
49
|
+
if (isMap(obj) || isSet(obj))
|
|
50
|
+
return obj.size === 0;
|
|
43
51
|
for (const key in obj) {
|
|
44
52
|
if (hasOwnProperty.call(obj, key)) {
|
|
45
53
|
return false;
|
|
@@ -54,27 +62,29 @@ var setPrimitives = /* @__PURE__ */ new Set(["boolean", "string", "number"]);
|
|
|
54
62
|
function isActualPrimitive(arg) {
|
|
55
63
|
return setPrimitives.has(typeof arg);
|
|
56
64
|
}
|
|
57
|
-
function
|
|
65
|
+
function isChildNode(node) {
|
|
58
66
|
return !!node.parent;
|
|
59
67
|
}
|
|
60
68
|
|
|
61
69
|
// src/globals.ts
|
|
62
70
|
var symbolToPrimitive = Symbol.toPrimitive;
|
|
71
|
+
var symbolIterator = Symbol.iterator;
|
|
63
72
|
var symbolGetNode = Symbol("getNode");
|
|
64
73
|
var symbolDelete = /* @__PURE__ */ Symbol("delete");
|
|
65
74
|
var symbolOpaque = Symbol("opaque");
|
|
75
|
+
var symbolPlain = Symbol("plain");
|
|
66
76
|
var optimized = Symbol("optimized");
|
|
67
77
|
var symbolLinked = Symbol("linked");
|
|
68
78
|
var globalState = {
|
|
69
|
-
isLoadingLocal: false,
|
|
70
|
-
isMerging: false,
|
|
71
|
-
isLoadingRemote: false,
|
|
72
|
-
activateSyncedNode: void 0,
|
|
73
79
|
pendingNodes: /* @__PURE__ */ new Map(),
|
|
74
|
-
dirtyNodes: /* @__PURE__ */ new Set()
|
|
75
|
-
replacer: void 0,
|
|
76
|
-
reviver: void 0
|
|
80
|
+
dirtyNodes: /* @__PURE__ */ new Set()
|
|
77
81
|
};
|
|
82
|
+
function isHintOpaque(value) {
|
|
83
|
+
return value && (value[symbolOpaque] || value["$$typeof"]);
|
|
84
|
+
}
|
|
85
|
+
function isHintPlain(value) {
|
|
86
|
+
return value && value[symbolPlain];
|
|
87
|
+
}
|
|
78
88
|
function getPathType(value) {
|
|
79
89
|
return isArray(value) ? "array" : isMap(value) ? "map" : value instanceof Set ? "set" : "object";
|
|
80
90
|
}
|
|
@@ -135,29 +145,31 @@ function isEvent(value$) {
|
|
|
135
145
|
return value$ && ((_a = value$[symbolGetNode]) == null ? void 0 : _a.isEvent);
|
|
136
146
|
}
|
|
137
147
|
function setNodeValue(node, newValue) {
|
|
138
|
-
var _a
|
|
148
|
+
var _a;
|
|
139
149
|
const parentNode = (_a = node.parent) != null ? _a : node;
|
|
140
150
|
const key = node.parent ? node.key : "_";
|
|
141
151
|
const isDelete = newValue === symbolDelete;
|
|
142
152
|
if (isDelete)
|
|
143
153
|
newValue = void 0;
|
|
144
154
|
const parentValue = node.parent ? ensureNodeValue(parentNode) : parentNode.root;
|
|
145
|
-
const
|
|
155
|
+
const useSetFn = isSet(parentValue);
|
|
156
|
+
const useMapFn = isMap(parentValue);
|
|
157
|
+
const prevValue = useSetFn ? key : useMapFn ? parentValue.get(key) : parentValue[key];
|
|
146
158
|
const isFunc = isFunction(newValue);
|
|
147
159
|
newValue = !parentNode.isAssigning && isFunc && !isFunction(prevValue) ? newValue(prevValue) : newValue;
|
|
148
|
-
if (
|
|
160
|
+
if (newValue !== prevValue) {
|
|
149
161
|
try {
|
|
150
162
|
parentNode.isSetting = (parentNode.isSetting || 0) + 1;
|
|
151
|
-
const useMapFn = isMap(parentValue);
|
|
152
163
|
if (isDelete) {
|
|
153
|
-
if (useMapFn) {
|
|
164
|
+
if (useMapFn || useSetFn) {
|
|
154
165
|
parentValue.delete(key);
|
|
155
166
|
} else {
|
|
156
167
|
delete parentValue[key];
|
|
157
168
|
}
|
|
158
169
|
} else {
|
|
159
|
-
|
|
160
|
-
|
|
170
|
+
if (useSetFn) {
|
|
171
|
+
parentValue.add(newValue);
|
|
172
|
+
} else if (useMapFn) {
|
|
161
173
|
parentValue.set(key, newValue);
|
|
162
174
|
} else {
|
|
163
175
|
parentValue[key] = newValue;
|
|
@@ -173,7 +185,7 @@ var arrNodeKeys = [];
|
|
|
173
185
|
function getNodeValue(node) {
|
|
174
186
|
let count = 0;
|
|
175
187
|
let n = node;
|
|
176
|
-
while (
|
|
188
|
+
while (isChildNode(n)) {
|
|
177
189
|
arrNodeKeys[count++] = n.key;
|
|
178
190
|
n = n.parent;
|
|
179
191
|
}
|
|
@@ -213,7 +225,7 @@ function getChildNode(node, key, asFunction) {
|
|
|
213
225
|
function ensureNodeValue(node) {
|
|
214
226
|
let value = getNodeValue(node);
|
|
215
227
|
if (!value || isFunction(value)) {
|
|
216
|
-
if (
|
|
228
|
+
if (isChildNode(node)) {
|
|
217
229
|
const parent = ensureNodeValue(node.parent);
|
|
218
230
|
value = parent[node.key] = {};
|
|
219
231
|
} else {
|
|
@@ -244,6 +256,27 @@ function equals(a, b) {
|
|
|
244
256
|
return a === b || isDate(a) && isDate(b) && +a === +b;
|
|
245
257
|
}
|
|
246
258
|
|
|
259
|
+
// src/ObservableHint.ts
|
|
260
|
+
function addSymbol(value, symbol) {
|
|
261
|
+
if (value) {
|
|
262
|
+
Object.defineProperty(value, symbol, {
|
|
263
|
+
value: true,
|
|
264
|
+
enumerable: false,
|
|
265
|
+
writable: true,
|
|
266
|
+
configurable: true
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
return value;
|
|
270
|
+
}
|
|
271
|
+
var ObservableHint = {
|
|
272
|
+
opaque: function opaqueObject(value) {
|
|
273
|
+
return addSymbol(value, symbolOpaque);
|
|
274
|
+
},
|
|
275
|
+
plain: function plainObject(value) {
|
|
276
|
+
return addSymbol(value, symbolPlain);
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
|
|
247
280
|
// src/helpers.ts
|
|
248
281
|
function computeSelector(selector, e, retainObservable) {
|
|
249
282
|
let c = selector;
|
|
@@ -257,7 +290,10 @@ function getObservableIndex(value$) {
|
|
|
257
290
|
const n = +node.key;
|
|
258
291
|
return isNumber(n) ? n : -1;
|
|
259
292
|
}
|
|
260
|
-
function
|
|
293
|
+
function opaqueObject2(value) {
|
|
294
|
+
if (process.env.NODE_ENV === "development") {
|
|
295
|
+
console.warn("[legend-state]: In version 3.0 opaqueObject is moved to ObservableHint.opaque");
|
|
296
|
+
}
|
|
261
297
|
if (value) {
|
|
262
298
|
value[symbolOpaque] = true;
|
|
263
299
|
}
|
|
@@ -274,34 +310,46 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
|
|
|
274
310
|
let oFull = fullObj;
|
|
275
311
|
for (let i = 0; i < path.length; i++) {
|
|
276
312
|
p = path[i];
|
|
277
|
-
|
|
313
|
+
const map = isMap(o);
|
|
314
|
+
let child = o ? map ? o.get(p) : o[p] : void 0;
|
|
315
|
+
const fullChild = oFull ? map ? oFull.get(p) : oFull[p] : void 0;
|
|
316
|
+
if (child === symbolDelete) {
|
|
278
317
|
if (oFull) {
|
|
279
|
-
|
|
280
|
-
|
|
318
|
+
if (map) {
|
|
319
|
+
o.set(p, fullChild);
|
|
320
|
+
} else {
|
|
321
|
+
o[p] = fullChild;
|
|
322
|
+
}
|
|
323
|
+
restore == null ? void 0 : restore(path.slice(0, i + 1), fullChild);
|
|
281
324
|
}
|
|
282
325
|
return obj;
|
|
283
|
-
} else if (
|
|
326
|
+
} else if (child === void 0 && value === void 0 && i === path.length - 1) {
|
|
284
327
|
return obj;
|
|
285
|
-
} else if (
|
|
286
|
-
|
|
328
|
+
} else if (i < path.length - 1 && (child === void 0 || child === null)) {
|
|
329
|
+
child = initializePathType(pathTypes[i]);
|
|
330
|
+
if (isMap(o)) {
|
|
331
|
+
o.set(p, child);
|
|
332
|
+
} else {
|
|
333
|
+
o[p] = child;
|
|
334
|
+
}
|
|
287
335
|
}
|
|
288
336
|
if (i < path.length - 1) {
|
|
289
|
-
o =
|
|
337
|
+
o = child;
|
|
290
338
|
if (oFull) {
|
|
291
|
-
oFull =
|
|
339
|
+
oFull = fullChild;
|
|
292
340
|
}
|
|
293
341
|
}
|
|
294
342
|
}
|
|
295
343
|
}
|
|
296
344
|
if (p === void 0) {
|
|
297
345
|
if (mode === "merge") {
|
|
298
|
-
obj =
|
|
346
|
+
obj = deepMerge(obj, value);
|
|
299
347
|
} else {
|
|
300
348
|
obj = value;
|
|
301
349
|
}
|
|
302
350
|
} else {
|
|
303
351
|
if (mode === "merge") {
|
|
304
|
-
o[p] =
|
|
352
|
+
o[p] = deepMerge(o[p], value);
|
|
305
353
|
} else if (isMap(o)) {
|
|
306
354
|
o.set(p, value);
|
|
307
355
|
} else {
|
|
@@ -310,80 +358,53 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
|
|
|
310
358
|
}
|
|
311
359
|
return obj;
|
|
312
360
|
}
|
|
313
|
-
function setInObservableAtPath(value$, path, pathTypes, value, mode) {
|
|
314
|
-
let o = value$;
|
|
315
|
-
let v = value;
|
|
316
|
-
for (let i = 0; i < path.length; i++) {
|
|
317
|
-
const p = path[i];
|
|
318
|
-
if (!o.peek()[p]) {
|
|
319
|
-
o[p].set(initializePathType(pathTypes[i]));
|
|
320
|
-
}
|
|
321
|
-
o = o[p];
|
|
322
|
-
v = v[p];
|
|
323
|
-
}
|
|
324
|
-
if (v === symbolDelete) {
|
|
325
|
-
o.delete();
|
|
326
|
-
} else if (mode === "assign" && o.assign && isObject(o.peek())) {
|
|
327
|
-
o.assign(v);
|
|
328
|
-
} else if (mode === "merge") {
|
|
329
|
-
mergeIntoObservable(o, v);
|
|
330
|
-
} else {
|
|
331
|
-
o.set(v);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
361
|
function mergeIntoObservable(target, ...sources) {
|
|
362
|
+
if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
|
|
363
|
+
if (!isObservable(target)) {
|
|
364
|
+
console.error("[legend-state] should only use mergeIntoObservable with observables");
|
|
365
|
+
}
|
|
366
|
+
}
|
|
335
367
|
beginBatch();
|
|
336
|
-
globalState.isMerging = true;
|
|
337
368
|
for (let i = 0; i < sources.length; i++) {
|
|
338
|
-
target
|
|
339
|
-
target,
|
|
340
|
-
sources[i],
|
|
341
|
-
/*assign*/
|
|
342
|
-
i < sources.length - 1
|
|
343
|
-
);
|
|
369
|
+
_mergeIntoObservable(target, sources[i], 0);
|
|
344
370
|
}
|
|
345
|
-
globalState.isMerging = false;
|
|
346
371
|
endBatch();
|
|
347
372
|
return target;
|
|
348
373
|
}
|
|
349
|
-
function _mergeIntoObservable(target, source,
|
|
350
|
-
var _a;
|
|
374
|
+
function _mergeIntoObservable(target, source, levelsDeep) {
|
|
351
375
|
if (isObservable(source)) {
|
|
352
376
|
source = source.peek();
|
|
353
377
|
}
|
|
354
|
-
const
|
|
355
|
-
const targetValue = needsSet ? target.peek() : target;
|
|
378
|
+
const targetValue = target.peek();
|
|
356
379
|
const isTargetArr = isArray(targetValue);
|
|
357
380
|
const isTargetObj = !isTargetArr && isObject(targetValue);
|
|
358
|
-
|
|
359
|
-
|
|
381
|
+
const isSourceMap = isMap(source);
|
|
382
|
+
const isSourceSet = isSet(source);
|
|
383
|
+
if (isSourceSet && isSet(targetValue)) {
|
|
384
|
+
target.set(/* @__PURE__ */ new Set([...source, ...targetValue]));
|
|
385
|
+
} else if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
|
|
386
|
+
const keys = isSourceMap || isSourceSet ? Array.from(source.keys()) : Object.keys(source);
|
|
360
387
|
for (let i = 0; i < keys.length; i++) {
|
|
361
388
|
const key = keys[i];
|
|
362
|
-
const sourceValue = source[key];
|
|
389
|
+
const sourceValue = isSourceSet ? key : isSourceMap ? source.get(key) : source[key];
|
|
363
390
|
if (sourceValue === symbolDelete) {
|
|
364
|
-
|
|
391
|
+
target[key].delete();
|
|
365
392
|
} else {
|
|
366
393
|
const isObj = isObject(sourceValue);
|
|
367
394
|
const isArr = !isObj && isArray(sourceValue);
|
|
368
395
|
const targetChild = target[key];
|
|
369
|
-
if ((isObj || isArr) && targetChild
|
|
370
|
-
if (
|
|
371
|
-
target[key] = assign2 ? isArr ? [...sourceValue] : { ...sourceValue } : sourceValue;
|
|
372
|
-
} else {
|
|
373
|
-
_mergeIntoObservable(targetChild, sourceValue);
|
|
374
|
-
}
|
|
375
|
-
} else {
|
|
376
|
-
if (needsSet) {
|
|
396
|
+
if ((isObj || isArr) && targetChild) {
|
|
397
|
+
if (levelsDeep > 0 && isEmpty(sourceValue)) {
|
|
377
398
|
targetChild.set(sourceValue);
|
|
378
|
-
} else {
|
|
379
|
-
const toSet = isObject(sourceValue) ? { ...sourceValue } : isArray(sourceValue) ? [...sourceValue] : sourceValue;
|
|
380
|
-
target[key] = toSet;
|
|
381
399
|
}
|
|
400
|
+
_mergeIntoObservable(targetChild, sourceValue, levelsDeep + 1);
|
|
401
|
+
} else {
|
|
402
|
+
targetChild.set(sourceValue);
|
|
382
403
|
}
|
|
383
404
|
}
|
|
384
405
|
}
|
|
385
406
|
} else if (source !== void 0) {
|
|
386
|
-
|
|
407
|
+
target.set(source);
|
|
387
408
|
}
|
|
388
409
|
return target;
|
|
389
410
|
}
|
|
@@ -420,12 +441,13 @@ function initializePathType(pathType) {
|
|
|
420
441
|
switch (pathType) {
|
|
421
442
|
case "array":
|
|
422
443
|
return [];
|
|
423
|
-
case "object":
|
|
424
|
-
return {};
|
|
425
444
|
case "map":
|
|
426
445
|
return /* @__PURE__ */ new Map();
|
|
427
446
|
case "set":
|
|
428
447
|
return /* @__PURE__ */ new Set();
|
|
448
|
+
case "object":
|
|
449
|
+
default:
|
|
450
|
+
return {};
|
|
429
451
|
}
|
|
430
452
|
}
|
|
431
453
|
function applyChange(value, change, applyPrevious) {
|
|
@@ -438,6 +460,33 @@ function applyChanges(value, changes, applyPrevious) {
|
|
|
438
460
|
}
|
|
439
461
|
return value;
|
|
440
462
|
}
|
|
463
|
+
function deepMerge(target, ...sources) {
|
|
464
|
+
if (isPrimitive(target)) {
|
|
465
|
+
return sources[sources.length - 1];
|
|
466
|
+
}
|
|
467
|
+
let result = isArray(target) ? [...target] : { ...target };
|
|
468
|
+
for (let i = 0; i < sources.length; i++) {
|
|
469
|
+
const obj2 = sources[i];
|
|
470
|
+
if (isPlainObject(obj2) || isArray(obj2)) {
|
|
471
|
+
const objTarget = obj2;
|
|
472
|
+
for (const key in objTarget) {
|
|
473
|
+
if (hasOwnProperty.call(objTarget, key)) {
|
|
474
|
+
if (objTarget[key] instanceof Object && !isObservable(objTarget[key]) && Object.keys(objTarget[key]).length > 0) {
|
|
475
|
+
result[key] = deepMerge(
|
|
476
|
+
result[key] || (isArray(objTarget[key]) ? [] : {}),
|
|
477
|
+
objTarget[key]
|
|
478
|
+
);
|
|
479
|
+
} else {
|
|
480
|
+
result[key] = objTarget[key];
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
} else {
|
|
485
|
+
result = obj2;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
return result;
|
|
489
|
+
}
|
|
441
490
|
|
|
442
491
|
// src/batching.ts
|
|
443
492
|
var timeout;
|
|
@@ -484,9 +533,9 @@ function notify(node, value, prev, level, whenOptimizedOnlyIf) {
|
|
|
484
533
|
changesInBatch,
|
|
485
534
|
node,
|
|
486
535
|
/*loading*/
|
|
487
|
-
globalState.isLoadingLocal,
|
|
536
|
+
!!globalState.isLoadingLocal,
|
|
488
537
|
/*remote*/
|
|
489
|
-
globalState.isLoadingRemote,
|
|
538
|
+
!!globalState.isLoadingRemote,
|
|
490
539
|
value,
|
|
491
540
|
[],
|
|
492
541
|
[],
|
|
@@ -497,31 +546,35 @@ function notify(node, value, prev, level, whenOptimizedOnlyIf) {
|
|
|
497
546
|
level,
|
|
498
547
|
whenOptimizedOnlyIf
|
|
499
548
|
);
|
|
500
|
-
if (changesInBatch.size) {
|
|
501
|
-
batchNotifyChanges(
|
|
502
|
-
changesInBatch,
|
|
503
|
-
/*immediate*/
|
|
504
|
-
true
|
|
505
|
-
);
|
|
506
|
-
}
|
|
507
549
|
const existing = _batchMap.get(node);
|
|
508
550
|
if (existing) {
|
|
509
|
-
existing.
|
|
551
|
+
if (existing.prev === value) {
|
|
552
|
+
_batchMap.delete(node);
|
|
553
|
+
} else {
|
|
554
|
+
existing.value = value;
|
|
555
|
+
}
|
|
510
556
|
} else {
|
|
511
557
|
_batchMap.set(node, {
|
|
512
558
|
value,
|
|
513
559
|
prev,
|
|
514
560
|
level,
|
|
515
561
|
whenOptimizedOnlyIf,
|
|
516
|
-
|
|
517
|
-
|
|
562
|
+
isFromSync: !!globalState.isLoadingRemote,
|
|
563
|
+
isFromPersist: !!globalState.isLoadingLocal
|
|
518
564
|
});
|
|
519
565
|
}
|
|
566
|
+
if (changesInBatch.size) {
|
|
567
|
+
batchNotifyChanges(
|
|
568
|
+
changesInBatch,
|
|
569
|
+
/*immediate*/
|
|
570
|
+
true
|
|
571
|
+
);
|
|
572
|
+
}
|
|
520
573
|
if (numInBatch <= 0) {
|
|
521
574
|
runBatch();
|
|
522
575
|
}
|
|
523
576
|
}
|
|
524
|
-
function computeChangesAtNode(changesInBatch, node,
|
|
577
|
+
function computeChangesAtNode(changesInBatch, node, isFromPersist, isFromSync, value, path, pathTypes, valueAtPath, prevAtPath, immediate, level, whenOptimizedOnlyIf) {
|
|
525
578
|
if (immediate ? node.listenersImmediate : node.listeners) {
|
|
526
579
|
const change = {
|
|
527
580
|
path,
|
|
@@ -534,13 +587,14 @@ function computeChangesAtNode(changesInBatch, node, loading, remote, value, path
|
|
|
534
587
|
const { changes } = changeInBatch;
|
|
535
588
|
if (!isArraySubset(changes[0].path, change.path)) {
|
|
536
589
|
changes.push(change);
|
|
590
|
+
changeInBatch.level = Math.min(changeInBatch.level, level);
|
|
537
591
|
}
|
|
538
592
|
} else {
|
|
539
593
|
changesInBatch.set(node, {
|
|
540
594
|
level,
|
|
541
595
|
value,
|
|
542
|
-
|
|
543
|
-
|
|
596
|
+
isFromSync,
|
|
597
|
+
isFromPersist,
|
|
544
598
|
whenOptimizedOnlyIf,
|
|
545
599
|
changes: [change]
|
|
546
600
|
});
|
|
@@ -604,7 +658,7 @@ function computeChangesRecursive(changesInBatch, node, loading, remote, value, p
|
|
|
604
658
|
}
|
|
605
659
|
function batchNotifyChanges(changesInBatch, immediate) {
|
|
606
660
|
const listenersNotified = /* @__PURE__ */ new Set();
|
|
607
|
-
changesInBatch.forEach(({ changes, level, value,
|
|
661
|
+
changesInBatch.forEach(({ changes, level, value, isFromPersist, isFromSync, whenOptimizedOnlyIf }, node) => {
|
|
608
662
|
const listeners = immediate ? node.listenersImmediate : node.listeners;
|
|
609
663
|
if (listeners) {
|
|
610
664
|
let listenerParams;
|
|
@@ -618,8 +672,8 @@ function batchNotifyChanges(changesInBatch, immediate) {
|
|
|
618
672
|
if (!noArgs && !listenerParams) {
|
|
619
673
|
listenerParams = {
|
|
620
674
|
value,
|
|
621
|
-
|
|
622
|
-
|
|
675
|
+
isFromPersist,
|
|
676
|
+
isFromSync,
|
|
623
677
|
getPrevious: createPreviousHandler(value, changes),
|
|
624
678
|
changes
|
|
625
679
|
};
|
|
@@ -647,12 +701,12 @@ function runBatch() {
|
|
|
647
701
|
const map = _batchMap;
|
|
648
702
|
_batchMap = /* @__PURE__ */ new Map();
|
|
649
703
|
const changesInBatch = /* @__PURE__ */ new Map();
|
|
650
|
-
map.forEach(({ value, prev, level,
|
|
704
|
+
map.forEach(({ value, prev, level, isFromPersist, isFromSync, whenOptimizedOnlyIf }, node) => {
|
|
651
705
|
computeChangesRecursive(
|
|
652
706
|
changesInBatch,
|
|
653
707
|
node,
|
|
654
|
-
|
|
655
|
-
|
|
708
|
+
isFromPersist,
|
|
709
|
+
isFromSync,
|
|
656
710
|
value,
|
|
657
711
|
[],
|
|
658
712
|
[],
|
|
@@ -711,21 +765,6 @@ function getNodeAtPath(obj, path) {
|
|
|
711
765
|
return o;
|
|
712
766
|
}
|
|
713
767
|
|
|
714
|
-
// src/linked.ts
|
|
715
|
-
function linked(params, options) {
|
|
716
|
-
if (isFunction(params)) {
|
|
717
|
-
params = { get: params };
|
|
718
|
-
}
|
|
719
|
-
if (options) {
|
|
720
|
-
params = { ...params, ...options };
|
|
721
|
-
}
|
|
722
|
-
const ret = function() {
|
|
723
|
-
return { [symbolLinked]: params };
|
|
724
|
-
};
|
|
725
|
-
ret.prototype[symbolLinked] = params;
|
|
726
|
-
return ret;
|
|
727
|
-
}
|
|
728
|
-
|
|
729
768
|
// src/createObservable.ts
|
|
730
769
|
function createObservable(value, makePrimitive, extractPromise2, createObject, createPrimitive) {
|
|
731
770
|
if (isObservable(value)) {
|
|
@@ -755,6 +794,21 @@ function createObservable(value, makePrimitive, extractPromise2, createObject, c
|
|
|
755
794
|
return obs;
|
|
756
795
|
}
|
|
757
796
|
|
|
797
|
+
// src/linked.ts
|
|
798
|
+
function linked(params, options) {
|
|
799
|
+
if (isFunction(params)) {
|
|
800
|
+
params = { get: params };
|
|
801
|
+
}
|
|
802
|
+
if (options) {
|
|
803
|
+
params = { ...params, ...options };
|
|
804
|
+
}
|
|
805
|
+
const ret = function() {
|
|
806
|
+
return { [symbolLinked]: params };
|
|
807
|
+
};
|
|
808
|
+
ret.prototype[symbolLinked] = params;
|
|
809
|
+
return ret;
|
|
810
|
+
}
|
|
811
|
+
|
|
758
812
|
// src/onChange.ts
|
|
759
813
|
function onChange(node, callback, options = {}, fromLinks) {
|
|
760
814
|
var _a;
|
|
@@ -779,8 +833,8 @@ function onChange(node, callback, options = {}, fromLinks) {
|
|
|
779
833
|
const value = getNodeValue(node);
|
|
780
834
|
callback({
|
|
781
835
|
value,
|
|
782
|
-
|
|
783
|
-
|
|
836
|
+
isFromPersist: true,
|
|
837
|
+
isFromSync: false,
|
|
784
838
|
changes: [
|
|
785
839
|
{
|
|
786
840
|
path: [],
|
|
@@ -836,14 +890,14 @@ function onChange(node, callback, options = {}, fromLinks) {
|
|
|
836
890
|
};
|
|
837
891
|
}
|
|
838
892
|
function createCb(linkedFromNode, path, callback) {
|
|
839
|
-
let
|
|
840
|
-
return function({ value: valueA,
|
|
841
|
-
const
|
|
893
|
+
let prevAtPath = deconstructObjectWithPath(path, [], getNodeValue(linkedFromNode));
|
|
894
|
+
return function({ value: valueA, isFromPersist, isFromSync }) {
|
|
895
|
+
const valueAtPath = deconstructObjectWithPath(path, [], valueA);
|
|
842
896
|
if (valueAtPath !== prevAtPath) {
|
|
843
897
|
callback({
|
|
844
898
|
value: valueAtPath,
|
|
845
|
-
|
|
846
|
-
|
|
899
|
+
isFromPersist,
|
|
900
|
+
isFromSync,
|
|
847
901
|
changes: [
|
|
848
902
|
{
|
|
849
903
|
path: [],
|
|
@@ -858,16 +912,6 @@ function createCb(linkedFromNode, path, callback) {
|
|
|
858
912
|
prevAtPath = valueAtPath;
|
|
859
913
|
};
|
|
860
914
|
}
|
|
861
|
-
function getValueAtPath2(obj, path) {
|
|
862
|
-
let o = obj;
|
|
863
|
-
const pathTypes = [];
|
|
864
|
-
for (let i = 0; o && i < path.length; i++) {
|
|
865
|
-
pathTypes.push(isArray(o) ? "array" : "object");
|
|
866
|
-
const p = path[i];
|
|
867
|
-
o = o[p];
|
|
868
|
-
}
|
|
869
|
-
return { valueAtPath: o, pathTypes };
|
|
870
|
-
}
|
|
871
915
|
|
|
872
916
|
// src/setupTracking.ts
|
|
873
917
|
function setupTracking(nodes, update, noArgs, immediate) {
|
|
@@ -963,12 +1007,17 @@ function observe(selectorOrRun, reactionOrOptions, options) {
|
|
|
963
1007
|
options = reactionOrOptions;
|
|
964
1008
|
}
|
|
965
1009
|
let dispose;
|
|
1010
|
+
let isRunning = false;
|
|
966
1011
|
const e = { num: 0 };
|
|
967
1012
|
const update = function() {
|
|
1013
|
+
if (isRunning) {
|
|
1014
|
+
return;
|
|
1015
|
+
}
|
|
968
1016
|
if (e.onCleanup) {
|
|
969
1017
|
e.onCleanup();
|
|
970
1018
|
e.onCleanup = void 0;
|
|
971
1019
|
}
|
|
1020
|
+
isRunning = true;
|
|
972
1021
|
beginBatch();
|
|
973
1022
|
delete e.value;
|
|
974
1023
|
dispose == null ? void 0 : dispose();
|
|
@@ -982,6 +1031,7 @@ function observe(selectorOrRun, reactionOrOptions, options) {
|
|
|
982
1031
|
e.onCleanupReaction = void 0;
|
|
983
1032
|
}
|
|
984
1033
|
endBatch();
|
|
1034
|
+
isRunning = false;
|
|
985
1035
|
if (reaction && ((options == null ? void 0 : options.fromComputed) || (e.num > 0 || !isEvent(selectorOrRun)) && (e.previous !== e.value || typeof e.value === "object"))) {
|
|
986
1036
|
reaction(e);
|
|
987
1037
|
}
|
|
@@ -1004,16 +1054,30 @@ function _when(predicate, effect, checkReady) {
|
|
|
1004
1054
|
if (isPromise(predicate)) {
|
|
1005
1055
|
return effect ? predicate.then(effect) : predicate;
|
|
1006
1056
|
}
|
|
1057
|
+
const isPredicateArray = isArray(predicate);
|
|
1007
1058
|
let value;
|
|
1008
1059
|
let effectValue;
|
|
1009
1060
|
function run(e) {
|
|
1010
|
-
const ret = computeSelector(predicate);
|
|
1061
|
+
const ret = isPredicateArray ? predicate.map((p) => computeSelector(p)) : computeSelector(predicate);
|
|
1011
1062
|
if (isPromise(ret)) {
|
|
1012
1063
|
value = ret;
|
|
1013
1064
|
return void 0;
|
|
1014
|
-
} else
|
|
1015
|
-
|
|
1016
|
-
|
|
1065
|
+
} else {
|
|
1066
|
+
let isOk = true;
|
|
1067
|
+
if (isArray(ret)) {
|
|
1068
|
+
for (let i = 0; i < ret.length; i++) {
|
|
1069
|
+
if (isObservable(ret[i])) {
|
|
1070
|
+
ret[i] = computeSelector(ret[i]);
|
|
1071
|
+
}
|
|
1072
|
+
isOk = isOk && !!(checkReady ? isObservableValueReady(ret[i]) : ret[i]);
|
|
1073
|
+
}
|
|
1074
|
+
} else {
|
|
1075
|
+
isOk = checkReady ? isObservableValueReady(ret) : ret;
|
|
1076
|
+
}
|
|
1077
|
+
if (isOk) {
|
|
1078
|
+
value = ret;
|
|
1079
|
+
e.cancel = true;
|
|
1080
|
+
}
|
|
1017
1081
|
}
|
|
1018
1082
|
return value;
|
|
1019
1083
|
}
|
|
@@ -1065,6 +1129,7 @@ var ArrayLoopers = /* @__PURE__ */ new Set([
|
|
|
1065
1129
|
"filter",
|
|
1066
1130
|
"find",
|
|
1067
1131
|
"findIndex",
|
|
1132
|
+
"flatMap",
|
|
1068
1133
|
"forEach",
|
|
1069
1134
|
"join",
|
|
1070
1135
|
"map",
|
|
@@ -1094,7 +1159,7 @@ function collectionSetter(node, target, prop, ...args) {
|
|
|
1094
1159
|
const prevValue = target.slice();
|
|
1095
1160
|
const ret = target[prop].apply(target, args);
|
|
1096
1161
|
if (node) {
|
|
1097
|
-
const hasParent =
|
|
1162
|
+
const hasParent = isChildNode(node);
|
|
1098
1163
|
const key = hasParent ? node.key : "_";
|
|
1099
1164
|
const parentValue = hasParent ? getNodeValue(node.parent) : node.root;
|
|
1100
1165
|
parentValue[key] = prevValue;
|
|
@@ -1118,7 +1183,7 @@ function updateNodes(parent, obj, prevValue) {
|
|
|
1118
1183
|
}
|
|
1119
1184
|
__devUpdateNodes.add(obj);
|
|
1120
1185
|
}
|
|
1121
|
-
if (isObject(obj) && obj
|
|
1186
|
+
if (isObject(obj) && isHintOpaque(obj) || isObject(prevValue) && isHintOpaque(prevValue)) {
|
|
1122
1187
|
const isDiff = obj !== prevValue;
|
|
1123
1188
|
if (isDiff) {
|
|
1124
1189
|
if (parent.listeners || parent.listenersImmediate) {
|
|
@@ -1306,10 +1371,10 @@ var proxyHandler = {
|
|
|
1306
1371
|
if (p === symbolGetNode) {
|
|
1307
1372
|
return node;
|
|
1308
1373
|
}
|
|
1309
|
-
if (p === "apply") {
|
|
1374
|
+
if (p === "apply" || p === "call") {
|
|
1310
1375
|
const nodeValue = getNodeValue(node);
|
|
1311
1376
|
if (isFunction(nodeValue)) {
|
|
1312
|
-
return nodeValue
|
|
1377
|
+
return nodeValue[p];
|
|
1313
1378
|
}
|
|
1314
1379
|
}
|
|
1315
1380
|
let value = peekInternal(
|
|
@@ -1317,11 +1382,14 @@ var proxyHandler = {
|
|
|
1317
1382
|
/*activateRecursive*/
|
|
1318
1383
|
p === "get" || p === "peek"
|
|
1319
1384
|
);
|
|
1385
|
+
if (p === symbolIterator) {
|
|
1386
|
+
return !value || isPrimitive(value) ? void 0 : value[p];
|
|
1387
|
+
}
|
|
1320
1388
|
const targetNode = node.linkedToNode || (value == null ? void 0 : value[symbolGetNode]);
|
|
1321
1389
|
if (targetNode && p !== "onChange") {
|
|
1322
1390
|
return proxyHandler.get(targetNode, p, receiver);
|
|
1323
1391
|
}
|
|
1324
|
-
if (isMap(value) || value
|
|
1392
|
+
if (isMap(value) || isSet(value)) {
|
|
1325
1393
|
const ret = handlerMapSet(node, p, value);
|
|
1326
1394
|
if (ret !== void 0) {
|
|
1327
1395
|
return ret;
|
|
@@ -1351,7 +1419,7 @@ var proxyHandler = {
|
|
|
1351
1419
|
return property.get(node);
|
|
1352
1420
|
}
|
|
1353
1421
|
let vProp = value == null ? void 0 : value[p];
|
|
1354
|
-
if (isObject(value) && value
|
|
1422
|
+
if (isObject(value) && isHintOpaque(value)) {
|
|
1355
1423
|
return vProp;
|
|
1356
1424
|
}
|
|
1357
1425
|
const fnOrComputed = (_a = node.functions) == null ? void 0 : _a.get(p);
|
|
@@ -1413,7 +1481,7 @@ var proxyHandler = {
|
|
|
1413
1481
|
return vProp.bind(value);
|
|
1414
1482
|
}
|
|
1415
1483
|
if (isPrimitive(vProp)) {
|
|
1416
|
-
if (
|
|
1484
|
+
if (p === "length" && isArray(value)) {
|
|
1417
1485
|
updateTracking(node, true);
|
|
1418
1486
|
return vProp;
|
|
1419
1487
|
}
|
|
@@ -1517,11 +1585,17 @@ function setKey(node, key, newValue, level) {
|
|
|
1517
1585
|
} else {
|
|
1518
1586
|
const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
|
|
1519
1587
|
const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
|
|
1520
|
-
if (!equals(savedValue, prevValue)) {
|
|
1521
|
-
updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level);
|
|
1522
|
-
}
|
|
1523
1588
|
if (!isPrim) {
|
|
1524
|
-
|
|
1589
|
+
let parent = childNode;
|
|
1590
|
+
do {
|
|
1591
|
+
parent.needsExtract = true;
|
|
1592
|
+
parent.recursivelyAutoActivated = false;
|
|
1593
|
+
} while (parent = parent.parent);
|
|
1594
|
+
}
|
|
1595
|
+
const notify2 = !equals(savedValue, prevValue);
|
|
1596
|
+
const forceNotify = !notify2 && childNode.isComputing && !isPrim;
|
|
1597
|
+
if (notify2 || forceNotify) {
|
|
1598
|
+
updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
|
|
1525
1599
|
}
|
|
1526
1600
|
extractFunctionOrComputed(node, key, savedValue);
|
|
1527
1601
|
}
|
|
@@ -1536,6 +1610,8 @@ function assign(node, value) {
|
|
|
1536
1610
|
const currentValue = getNodeValue(node);
|
|
1537
1611
|
if (isMap(currentValue)) {
|
|
1538
1612
|
value.forEach((value2, key) => currentValue.set(key, value2));
|
|
1613
|
+
} else {
|
|
1614
|
+
set(node, value);
|
|
1539
1615
|
}
|
|
1540
1616
|
} else {
|
|
1541
1617
|
node.isAssigning = (node.isAssigning || 0) + 1;
|
|
@@ -1549,7 +1625,7 @@ function assign(node, value) {
|
|
|
1549
1625
|
return proxy2;
|
|
1550
1626
|
}
|
|
1551
1627
|
function deleteFn(node, key) {
|
|
1552
|
-
if (key === void 0 &&
|
|
1628
|
+
if (key === void 0 && isChildNode(node)) {
|
|
1553
1629
|
key = node.key;
|
|
1554
1630
|
node = node.parent;
|
|
1555
1631
|
}
|
|
@@ -1569,7 +1645,8 @@ function deleteFn(node, key) {
|
|
|
1569
1645
|
function handlerMapSet(node, p, value) {
|
|
1570
1646
|
const vProp = value == null ? void 0 : value[p];
|
|
1571
1647
|
if (p === "size") {
|
|
1572
|
-
|
|
1648
|
+
updateTracking(node, true);
|
|
1649
|
+
return value[p];
|
|
1573
1650
|
} else if (isFunction(vProp)) {
|
|
1574
1651
|
return function(a, b, c) {
|
|
1575
1652
|
const l = arguments.length;
|
|
@@ -1580,23 +1657,16 @@ function handlerMapSet(node, p, value) {
|
|
|
1580
1657
|
}
|
|
1581
1658
|
} else if (p === "set") {
|
|
1582
1659
|
if (l === 2) {
|
|
1583
|
-
|
|
1584
|
-
const ret = valueMap.set(a, b);
|
|
1585
|
-
if (prev !== b) {
|
|
1586
|
-
updateNodesAndNotify(getChildNode(node, a), b, prev);
|
|
1587
|
-
}
|
|
1588
|
-
return ret;
|
|
1660
|
+
set(getChildNode(node, a), b);
|
|
1589
1661
|
} else if (l === 1 && isMap(value)) {
|
|
1590
1662
|
set(node, a);
|
|
1591
1663
|
}
|
|
1664
|
+
return getProxy(node);
|
|
1592
1665
|
} else if (p === "delete") {
|
|
1593
1666
|
if (l > 0) {
|
|
1594
1667
|
const prev = value.get ? valueMap.get(a) : a;
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
updateNodesAndNotify(getChildNode(node, a), void 0, prev);
|
|
1598
|
-
}
|
|
1599
|
-
return ret;
|
|
1668
|
+
deleteFn(node, a);
|
|
1669
|
+
return prev !== void 0;
|
|
1600
1670
|
}
|
|
1601
1671
|
} else if (p === "clear") {
|
|
1602
1672
|
const prev = new Map(valueMap);
|
|
@@ -1612,7 +1682,7 @@ function handlerMapSet(node, p, value) {
|
|
|
1612
1682
|
if (!value.has(p)) {
|
|
1613
1683
|
notify(node, ret, prev, 0);
|
|
1614
1684
|
}
|
|
1615
|
-
return
|
|
1685
|
+
return getProxy(node);
|
|
1616
1686
|
}
|
|
1617
1687
|
const fn = observableFns.get(p);
|
|
1618
1688
|
if (fn) {
|
|
@@ -1632,20 +1702,20 @@ function handlerMapSet(node, p, value) {
|
|
|
1632
1702
|
};
|
|
1633
1703
|
}
|
|
1634
1704
|
}
|
|
1635
|
-
function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level) {
|
|
1705
|
+
function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
|
|
1636
1706
|
if (!childNode)
|
|
1637
1707
|
childNode = node;
|
|
1638
1708
|
beginBatch();
|
|
1639
1709
|
if (isPrim === void 0) {
|
|
1640
1710
|
isPrim = isPrimitive(newValue);
|
|
1641
1711
|
}
|
|
1642
|
-
let hasADiff = isPrim;
|
|
1712
|
+
let hasADiff = forceNotify || isPrim;
|
|
1643
1713
|
let whenOptimizedOnlyIf = false;
|
|
1644
1714
|
if (!isPrim || prevValue && !isPrimitive(prevValue)) {
|
|
1645
1715
|
if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
|
|
1646
1716
|
__devUpdateNodes.clear();
|
|
1647
1717
|
}
|
|
1648
|
-
hasADiff = updateNodes(childNode, newValue, prevValue);
|
|
1718
|
+
hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
|
|
1649
1719
|
if (isArray(newValue)) {
|
|
1650
1720
|
whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
|
|
1651
1721
|
}
|
|
@@ -1662,6 +1732,7 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
|
|
|
1662
1732
|
endBatch();
|
|
1663
1733
|
}
|
|
1664
1734
|
function extractPromise(node, value, setter) {
|
|
1735
|
+
const numGets = node.numGets = (node.numGets || 0) + 1;
|
|
1665
1736
|
if (!node.state) {
|
|
1666
1737
|
node.state = createObservable(
|
|
1667
1738
|
{
|
|
@@ -1673,11 +1744,14 @@ function extractPromise(node, value, setter) {
|
|
|
1673
1744
|
);
|
|
1674
1745
|
}
|
|
1675
1746
|
value.then((value2) => {
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1747
|
+
if (numGets >= (node.getNumResolved || 0)) {
|
|
1748
|
+
node.getNumResolved = node.numGets;
|
|
1749
|
+
setter ? setter({ value: value2 }) : set(node, value2);
|
|
1750
|
+
node.state.assign({
|
|
1751
|
+
isLoaded: true,
|
|
1752
|
+
error: void 0
|
|
1753
|
+
});
|
|
1754
|
+
}
|
|
1681
1755
|
}).catch((error) => {
|
|
1682
1756
|
node.state.error.set(error);
|
|
1683
1757
|
});
|
|
@@ -1694,6 +1768,7 @@ function extractFunctionOrComputed(node, k, v) {
|
|
|
1694
1768
|
const childNode = getChildNode(node, k, fn);
|
|
1695
1769
|
const targetNode = getNode(v);
|
|
1696
1770
|
const initialValue = peek(targetNode);
|
|
1771
|
+
setToObservable(childNode, v);
|
|
1697
1772
|
setNodeValue(childNode, initialValue);
|
|
1698
1773
|
return getNodeValue(childNode);
|
|
1699
1774
|
} else if (typeof v === "function") {
|
|
@@ -1726,7 +1801,9 @@ function peekInternal(node, activateRecursive) {
|
|
|
1726
1801
|
}
|
|
1727
1802
|
isFlushing = false;
|
|
1728
1803
|
let value = getNodeValue(node);
|
|
1729
|
-
|
|
1804
|
+
if (!globalState.isLoadingLocal) {
|
|
1805
|
+
value = checkLazy(node, value, !!activateRecursive);
|
|
1806
|
+
}
|
|
1730
1807
|
return value;
|
|
1731
1808
|
}
|
|
1732
1809
|
function checkLazy(node, value, activateRecursive) {
|
|
@@ -1741,10 +1818,12 @@ function checkLazy(node, value, activateRecursive) {
|
|
|
1741
1818
|
} else {
|
|
1742
1819
|
if (node.parent) {
|
|
1743
1820
|
const parentValue = getNodeValue(node.parent);
|
|
1744
|
-
if (
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1821
|
+
if (isFunction(value)) {
|
|
1822
|
+
if (parentValue) {
|
|
1823
|
+
delete parentValue[node.key];
|
|
1824
|
+
} else {
|
|
1825
|
+
node.root._ = void 0;
|
|
1826
|
+
}
|
|
1748
1827
|
}
|
|
1749
1828
|
}
|
|
1750
1829
|
value = activateNodeFunction(node, lazyFn);
|
|
@@ -1833,7 +1912,9 @@ function activateNodeFunction(node, lazyFn) {
|
|
|
1833
1912
|
var _a, _b, _c, _d;
|
|
1834
1913
|
if (isFirst) {
|
|
1835
1914
|
isFirst = false;
|
|
1836
|
-
|
|
1915
|
+
if (isFunction(getNodeValue(node))) {
|
|
1916
|
+
setNodeValue(node, void 0);
|
|
1917
|
+
}
|
|
1837
1918
|
} else if (!isFlushing && refreshFn) {
|
|
1838
1919
|
if (shouldIgnoreUnobserved(node, refreshFn)) {
|
|
1839
1920
|
ignoreThisUpdate = true;
|
|
@@ -1842,14 +1923,15 @@ function activateNodeFunction(node, lazyFn) {
|
|
|
1842
1923
|
}
|
|
1843
1924
|
let value = activateFn();
|
|
1844
1925
|
let didSetToObs = false;
|
|
1845
|
-
|
|
1846
|
-
|
|
1926
|
+
const isObs = isObservable(value);
|
|
1927
|
+
if (isObs || node.linkedToNode) {
|
|
1928
|
+
didSetToObs = isObs;
|
|
1847
1929
|
value = setToObservable(node, value);
|
|
1848
1930
|
}
|
|
1849
|
-
if (isFunction(value)) {
|
|
1931
|
+
if (isFunction(value) && value.length === 0) {
|
|
1850
1932
|
value = value();
|
|
1851
1933
|
}
|
|
1852
|
-
const activated = !
|
|
1934
|
+
const activated = !isObs ? value == null ? void 0 : value[symbolLinked] : void 0;
|
|
1853
1935
|
if (activated) {
|
|
1854
1936
|
node.activationState = activated;
|
|
1855
1937
|
value = void 0;
|
|
@@ -1904,16 +1986,14 @@ function activateNodeFunction(node, lazyFn) {
|
|
|
1904
1986
|
}
|
|
1905
1987
|
} else {
|
|
1906
1988
|
activatedValue = value;
|
|
1907
|
-
|
|
1989
|
+
const isLoaded = node.state.isLoaded.peek();
|
|
1990
|
+
if (isLoaded || !isFunction(value)) {
|
|
1908
1991
|
node.isComputing = true;
|
|
1909
1992
|
set(node, value);
|
|
1910
1993
|
node.isComputing = false;
|
|
1911
|
-
}
|
|
1912
|
-
|
|
1913
|
-
node.state.assign({
|
|
1914
|
-
isLoaded: true,
|
|
1915
|
-
error: void 0
|
|
1916
|
-
});
|
|
1994
|
+
}
|
|
1995
|
+
if (!isLoaded) {
|
|
1996
|
+
node.state.assign({ isLoaded: true, error: void 0 });
|
|
1917
1997
|
}
|
|
1918
1998
|
}
|
|
1919
1999
|
}
|
|
@@ -1954,14 +2034,14 @@ function activateNodeBase(node, value) {
|
|
|
1954
2034
|
if (allChanges.length > 0) {
|
|
1955
2035
|
let changes;
|
|
1956
2036
|
let value2;
|
|
1957
|
-
let
|
|
1958
|
-
let
|
|
2037
|
+
let isFromPersist = false;
|
|
2038
|
+
let isFromSync = false;
|
|
1959
2039
|
let getPrevious;
|
|
1960
2040
|
if (listenerParams) {
|
|
1961
2041
|
changes = listenerParams.changes;
|
|
1962
2042
|
value2 = listenerParams.value;
|
|
1963
|
-
|
|
1964
|
-
|
|
2043
|
+
isFromPersist = listenerParams.isFromPersist;
|
|
2044
|
+
isFromSync = listenerParams.isFromSync;
|
|
1965
2045
|
getPrevious = listenerParams.getPrevious;
|
|
1966
2046
|
} else {
|
|
1967
2047
|
changes = allChanges;
|
|
@@ -1981,8 +2061,8 @@ function activateNodeBase(node, value) {
|
|
|
1981
2061
|
setFn({
|
|
1982
2062
|
value: value2,
|
|
1983
2063
|
changes,
|
|
1984
|
-
|
|
1985
|
-
|
|
2064
|
+
isFromPersist,
|
|
2065
|
+
isFromSync,
|
|
1986
2066
|
getPrevious
|
|
1987
2067
|
});
|
|
1988
2068
|
node.isComputing = false;
|
|
@@ -2017,32 +2097,37 @@ function activateNodeBase(node, value) {
|
|
|
2017
2097
|
}
|
|
2018
2098
|
function setToObservable(node, value) {
|
|
2019
2099
|
var _a;
|
|
2020
|
-
const linkedNode = getNode(value);
|
|
2100
|
+
const linkedNode = value ? getNode(value) : void 0;
|
|
2021
2101
|
if (linkedNode !== node && (linkedNode == null ? void 0 : linkedNode.linkedToNode) !== node) {
|
|
2022
2102
|
node.linkedToNode = linkedNode;
|
|
2023
|
-
linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
|
|
2024
|
-
linkedNode.linkedFromNodes.add(node);
|
|
2025
2103
|
(_a = node.linkedToNodeDispose) == null ? void 0 : _a.call(node);
|
|
2026
|
-
|
|
2027
|
-
linkedNode
|
|
2028
|
-
()
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2104
|
+
if (linkedNode) {
|
|
2105
|
+
linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
|
|
2106
|
+
linkedNode.linkedFromNodes.add(node);
|
|
2107
|
+
node.linkedToNodeDispose = onChange(
|
|
2108
|
+
linkedNode,
|
|
2109
|
+
() => {
|
|
2110
|
+
value = peekInternal(linkedNode);
|
|
2111
|
+
if (!isFunction(value)) {
|
|
2112
|
+
set(node, value);
|
|
2113
|
+
}
|
|
2114
|
+
},
|
|
2115
|
+
{ initial: true },
|
|
2116
|
+
/* @__PURE__ */ new Set([node])
|
|
2117
|
+
);
|
|
2118
|
+
}
|
|
2035
2119
|
}
|
|
2036
2120
|
return value;
|
|
2037
2121
|
}
|
|
2038
2122
|
function recursivelyAutoActivate(obj, node) {
|
|
2039
|
-
if ((isObject(obj) || isArray(obj)) && !obj
|
|
2123
|
+
if (!node.recursivelyAutoActivated && (isObject(obj) || isArray(obj)) && !isHintOpaque(obj)) {
|
|
2124
|
+
node.recursivelyAutoActivated = true;
|
|
2040
2125
|
const pathStack = [];
|
|
2041
2126
|
const getNodeAtPath2 = () => {
|
|
2042
2127
|
var _a;
|
|
2043
2128
|
let childNode = node;
|
|
2044
2129
|
for (let i = 0; i < pathStack.length; i++) {
|
|
2045
|
-
const
|
|
2130
|
+
const key = pathStack[i];
|
|
2046
2131
|
const value = (_a = getNodeValue(childNode)) == null ? void 0 : _a[key];
|
|
2047
2132
|
childNode = getChildNode(childNode, key, isFunction(value) ? value : void 0);
|
|
2048
2133
|
peekInternal(childNode);
|
|
@@ -2054,7 +2139,7 @@ function recursivelyAutoActivate(obj, node) {
|
|
|
2054
2139
|
}
|
|
2055
2140
|
function recursivelyAutoActivateInner(obj, pathStack, getNodeAtPath2) {
|
|
2056
2141
|
var _a;
|
|
2057
|
-
if ((isObject(obj) || isArray(obj)) && !obj
|
|
2142
|
+
if ((isObject(obj) || isArray(obj)) && !isHintOpaque(obj) && !isHintPlain(obj)) {
|
|
2058
2143
|
for (const key in obj) {
|
|
2059
2144
|
if (hasOwnProperty.call(obj, key)) {
|
|
2060
2145
|
const value = obj[key];
|
|
@@ -2073,7 +2158,7 @@ function recursivelyAutoActivateInner(obj, pathStack, getNodeAtPath2) {
|
|
|
2073
2158
|
}
|
|
2074
2159
|
}
|
|
2075
2160
|
if (typeof value === "object") {
|
|
2076
|
-
pathStack.push(
|
|
2161
|
+
pathStack.push(key);
|
|
2077
2162
|
recursivelyAutoActivateInner(value, pathStack, getNodeAtPath2);
|
|
2078
2163
|
pathStack.pop();
|
|
2079
2164
|
}
|
|
@@ -2132,16 +2217,6 @@ function observable(value) {
|
|
|
2132
2217
|
function observablePrimitive(value) {
|
|
2133
2218
|
return createObservable(value, true, extractPromise, getProxy, ObservablePrimitiveClass);
|
|
2134
2219
|
}
|
|
2135
|
-
function syncState(obs) {
|
|
2136
|
-
const node = getNode(obs);
|
|
2137
|
-
if (!node.state) {
|
|
2138
|
-
peekInternal(node);
|
|
2139
|
-
}
|
|
2140
|
-
if (!node.state) {
|
|
2141
|
-
node.state = observable({});
|
|
2142
|
-
}
|
|
2143
|
-
return node.state;
|
|
2144
|
-
}
|
|
2145
2220
|
|
|
2146
2221
|
// src/computed.ts
|
|
2147
2222
|
function computed(get2, set2) {
|
|
@@ -2150,45 +2225,6 @@ function computed(get2, set2) {
|
|
|
2150
2225
|
);
|
|
2151
2226
|
}
|
|
2152
2227
|
|
|
2153
|
-
// src/config.ts
|
|
2154
|
-
function configureLegendState({
|
|
2155
|
-
observableFunctions,
|
|
2156
|
-
observableProperties: observableProperties2,
|
|
2157
|
-
jsonReplacer,
|
|
2158
|
-
jsonReviver
|
|
2159
|
-
}) {
|
|
2160
|
-
if (observableFunctions) {
|
|
2161
|
-
for (const key in observableFunctions) {
|
|
2162
|
-
const fn = observableFunctions[key];
|
|
2163
|
-
observableFns.set(key, fn);
|
|
2164
|
-
ObservablePrimitiveClass.prototype[key] = function(...args) {
|
|
2165
|
-
return fn.call(this, this._node, ...args);
|
|
2166
|
-
};
|
|
2167
|
-
}
|
|
2168
|
-
}
|
|
2169
|
-
if (observableProperties2) {
|
|
2170
|
-
for (const key in observableProperties2) {
|
|
2171
|
-
const fns2 = observableProperties2[key];
|
|
2172
|
-
observableProperties.set(key, fns2);
|
|
2173
|
-
Object.defineProperty(ObservablePrimitiveClass.prototype, key, {
|
|
2174
|
-
configurable: true,
|
|
2175
|
-
get() {
|
|
2176
|
-
return fns2.get.call(this, this._node);
|
|
2177
|
-
},
|
|
2178
|
-
set(value) {
|
|
2179
|
-
return fns2.set.call(this, this._node, value);
|
|
2180
|
-
}
|
|
2181
|
-
});
|
|
2182
|
-
}
|
|
2183
|
-
}
|
|
2184
|
-
if (jsonReplacer) {
|
|
2185
|
-
globalState.replacer = jsonReplacer;
|
|
2186
|
-
}
|
|
2187
|
-
if (jsonReviver) {
|
|
2188
|
-
globalState.reviver = jsonReviver;
|
|
2189
|
-
}
|
|
2190
|
-
}
|
|
2191
|
-
|
|
2192
2228
|
// src/event.ts
|
|
2193
2229
|
function event() {
|
|
2194
2230
|
const obs = observable(0);
|
|
@@ -2219,66 +2255,38 @@ function proxy(get2, set2) {
|
|
|
2219
2255
|
);
|
|
2220
2256
|
}
|
|
2221
2257
|
|
|
2222
|
-
// src/
|
|
2223
|
-
function
|
|
2224
|
-
const
|
|
2225
|
-
if (
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
return fn(e);
|
|
2246
|
-
});
|
|
2247
|
-
} else {
|
|
2248
|
-
value = fn(e);
|
|
2249
|
-
}
|
|
2250
|
-
if (isPromise(value) && retry) {
|
|
2251
|
-
let timeoutRetry;
|
|
2252
|
-
return new Promise((resolve) => {
|
|
2253
|
-
const run = () => {
|
|
2254
|
-
value.then((val) => {
|
|
2255
|
-
node.activationState.persistedRetry = false;
|
|
2256
|
-
resolve(val);
|
|
2257
|
-
}).catch(() => {
|
|
2258
|
-
state.attemptNum++;
|
|
2259
|
-
if (timeoutRetry) {
|
|
2260
|
-
clearTimeout(timeoutRetry);
|
|
2261
|
-
}
|
|
2262
|
-
if (!e.cancel) {
|
|
2263
|
-
timeoutRetry = createRetryTimeout(retry, state.attemptNum, () => {
|
|
2264
|
-
value = fn(e);
|
|
2265
|
-
run();
|
|
2266
|
-
});
|
|
2267
|
-
}
|
|
2268
|
-
}).finally(() => {
|
|
2269
|
-
node.activationState.persistedRetry = false;
|
|
2270
|
-
});
|
|
2271
|
-
};
|
|
2272
|
-
run();
|
|
2273
|
-
});
|
|
2258
|
+
// src/syncState.ts
|
|
2259
|
+
function syncState(obs) {
|
|
2260
|
+
const node = getNode(obs);
|
|
2261
|
+
if (!node.state) {
|
|
2262
|
+
node.state = observable(
|
|
2263
|
+
ObservableHint.plain({
|
|
2264
|
+
isPersistLoaded: false,
|
|
2265
|
+
isLoaded: false,
|
|
2266
|
+
isPersistEnabled: true,
|
|
2267
|
+
isSyncEnabled: true,
|
|
2268
|
+
isGetting: false,
|
|
2269
|
+
isSetting: false,
|
|
2270
|
+
numPendingGets: 0,
|
|
2271
|
+
numPendingSets: 0,
|
|
2272
|
+
syncCount: 0,
|
|
2273
|
+
resetPersistence: void 0,
|
|
2274
|
+
reset: () => Promise.resolve(),
|
|
2275
|
+
sync: () => Promise.resolve(),
|
|
2276
|
+
getPendingChanges: () => ({}),
|
|
2277
|
+
// TODOV3 remove
|
|
2278
|
+
clearPersist: void 0
|
|
2279
|
+
})
|
|
2280
|
+
);
|
|
2274
2281
|
}
|
|
2275
|
-
return
|
|
2282
|
+
return node.state;
|
|
2276
2283
|
}
|
|
2277
2284
|
|
|
2278
2285
|
// index.ts
|
|
2279
2286
|
var internal = {
|
|
2280
2287
|
createPreviousHandler,
|
|
2281
2288
|
clone,
|
|
2289
|
+
deepMerge,
|
|
2282
2290
|
ensureNodeValue,
|
|
2283
2291
|
findIDKey,
|
|
2284
2292
|
get,
|
|
@@ -2289,10 +2297,11 @@ var internal = {
|
|
|
2289
2297
|
getValueAtPath,
|
|
2290
2298
|
globalState,
|
|
2291
2299
|
initializePathType,
|
|
2300
|
+
ObservablePrimitiveClass,
|
|
2301
|
+
observableProperties,
|
|
2292
2302
|
observableFns,
|
|
2293
2303
|
optimized,
|
|
2294
2304
|
peek,
|
|
2295
|
-
runWithRetry,
|
|
2296
2305
|
safeParse,
|
|
2297
2306
|
safeStringify,
|
|
2298
2307
|
set,
|
|
@@ -2303,4 +2312,4 @@ var internal = {
|
|
|
2303
2312
|
tracking
|
|
2304
2313
|
};
|
|
2305
2314
|
|
|
2306
|
-
export { ObservablePrimitiveClass, applyChange, applyChanges, batch, beginBatch, beginTracking, computeSelector, computed,
|
|
2315
|
+
export { ObservableHint, ObservablePrimitiveClass, applyChange, applyChanges, batch, beginBatch, beginTracking, computeSelector, computed, constructObjectWithPath, deconstructObjectWithPath, endBatch, endTracking, event, findIDKey, getNode, getNodeValue, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPlainObject, isPrimitive, isPromise, isSet, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject2 as opaqueObject, optimized, proxy, setAtPath, setSilently, setupTracking, shouldIgnoreUnobserved, symbolDelete, syncState, trackSelector, tracking, updateTracking, when, whenReady };
|