@legendapp/state 3.0.0-alpha.3 → 3.0.0-alpha.30
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/CHANGELOG.md +831 -1
- package/LICENSE +21 -1
- package/README.md +141 -1
- package/babel.js +0 -2
- package/babel.mjs +0 -2
- 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/config.d.mts +13 -0
- package/config.d.ts +13 -0
- package/config.js +2052 -0
- package/config.mjs +2050 -0
- package/helpers/trackHistory.js +2 -2
- package/helpers/trackHistory.mjs +2 -2
- package/index.d.mts +21 -302
- package/index.d.ts +21 -302
- package/index.js +274 -318
- package/index.mjs +275 -317
- package/observableInterfaces-Dilj6F92.d.mts +282 -0
- package/observableInterfaces-Dilj6F92.d.ts +282 -0
- package/package.json +11 -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 +12 -4
- package/persist-plugins/async-storage.mjs +12 -5
- package/persist-plugins/indexeddb.d.mts +6 -4
- package/persist-plugins/indexeddb.d.ts +6 -4
- package/persist-plugins/indexeddb.js +16 -6
- package/persist-plugins/indexeddb.mjs +16 -7
- package/persist-plugins/mmkv.d.mts +5 -1
- package/persist-plugins/mmkv.d.ts +5 -1
- package/persist-plugins/mmkv.js +14 -5
- package/persist-plugins/mmkv.mjs +14 -6
- package/react.d.mts +18 -14
- package/react.d.ts +18 -14
- package/react.js +57 -32
- package/react.mjs +58 -33
- package/sync-plugins/_transformObjectFields.d.mts +31 -0
- package/sync-plugins/_transformObjectFields.d.ts +31 -0
- package/sync-plugins/_transformObjectFields.js +114 -0
- package/sync-plugins/_transformObjectFields.mjs +110 -0
- package/sync-plugins/crud.d.mts +15 -23
- package/sync-plugins/crud.d.ts +15 -23
- package/sync-plugins/crud.js +213 -134
- package/sync-plugins/crud.mjs +214 -135
- package/sync-plugins/fetch.js +12 -8
- package/sync-plugins/fetch.mjs +13 -9
- package/sync-plugins/firebase.d.mts +26 -0
- package/sync-plugins/firebase.d.ts +26 -0
- package/sync-plugins/firebase.js +373 -0
- package/sync-plugins/firebase.mjs +368 -0
- package/sync-plugins/keel.d.mts +27 -10
- package/sync-plugins/keel.d.ts +27 -10
- package/sync-plugins/keel.js +40 -21
- package/sync-plugins/keel.mjs +40 -21
- package/sync-plugins/supabase.d.mts +12 -7
- package/sync-plugins/supabase.d.ts +12 -7
- package/sync-plugins/supabase.js +24 -13
- package/sync-plugins/supabase.mjs +25 -14
- package/sync-plugins/tanstack-query.d.mts +2 -2
- package/sync-plugins/tanstack-query.d.ts +2 -2
- package/sync-plugins/tanstack-query.js +3 -2
- package/sync-plugins/tanstack-query.mjs +3 -2
- package/sync-plugins/tanstack-react-query.d.mts +1 -1
- package/sync-plugins/tanstack-react-query.d.ts +1 -1
- package/sync.d.mts +68 -197
- package/sync.d.ts +68 -197
- package/sync.js +448 -283
- package/sync.mjs +454 -289
- package/types/babel.d.ts +12 -1
- package/.DS_Store +0 -0
- /package/config/{enable_GetSet.d.mts → enable$GetSet.d.mts} +0 -0
- /package/config/{enable_GetSet.d.ts → enable$GetSet.d.ts} +0 -0
package/index.mjs
CHANGED
|
@@ -29,17 +29,22 @@ function isPromise(obj) {
|
|
|
29
29
|
return obj instanceof Promise;
|
|
30
30
|
}
|
|
31
31
|
function isMap(obj) {
|
|
32
|
-
return obj instanceof Map;
|
|
32
|
+
return obj instanceof Map || obj instanceof WeakMap;
|
|
33
|
+
}
|
|
34
|
+
function isSet(obj) {
|
|
35
|
+
return obj instanceof Set || obj instanceof WeakSet;
|
|
33
36
|
}
|
|
34
37
|
function isNumber(obj) {
|
|
35
38
|
const n = obj;
|
|
36
|
-
return n - n < 1;
|
|
39
|
+
return typeof n === "number" && n - n < 1;
|
|
37
40
|
}
|
|
38
41
|
function isEmpty(obj) {
|
|
39
42
|
if (!obj)
|
|
40
43
|
return false;
|
|
41
44
|
if (isArray(obj))
|
|
42
45
|
return obj.length === 0;
|
|
46
|
+
if (isMap(obj) || isSet(obj))
|
|
47
|
+
return obj.size === 0;
|
|
43
48
|
for (const key in obj) {
|
|
44
49
|
if (hasOwnProperty.call(obj, key)) {
|
|
45
50
|
return false;
|
|
@@ -54,27 +59,25 @@ var setPrimitives = /* @__PURE__ */ new Set(["boolean", "string", "number"]);
|
|
|
54
59
|
function isActualPrimitive(arg) {
|
|
55
60
|
return setPrimitives.has(typeof arg);
|
|
56
61
|
}
|
|
57
|
-
function
|
|
62
|
+
function isChildNode(node) {
|
|
58
63
|
return !!node.parent;
|
|
59
64
|
}
|
|
60
65
|
|
|
61
66
|
// src/globals.ts
|
|
62
67
|
var symbolToPrimitive = Symbol.toPrimitive;
|
|
68
|
+
var symbolIterator = Symbol.iterator;
|
|
63
69
|
var symbolGetNode = Symbol("getNode");
|
|
64
70
|
var symbolDelete = /* @__PURE__ */ Symbol("delete");
|
|
65
71
|
var symbolOpaque = Symbol("opaque");
|
|
66
72
|
var optimized = Symbol("optimized");
|
|
67
73
|
var symbolLinked = Symbol("linked");
|
|
68
74
|
var globalState = {
|
|
69
|
-
isLoadingLocal: false,
|
|
70
|
-
isMerging: false,
|
|
71
|
-
isLoadingRemote: false,
|
|
72
|
-
activateSyncedNode: void 0,
|
|
73
75
|
pendingNodes: /* @__PURE__ */ new Map(),
|
|
74
|
-
dirtyNodes: /* @__PURE__ */ new Set()
|
|
75
|
-
replacer: void 0,
|
|
76
|
-
reviver: void 0
|
|
76
|
+
dirtyNodes: /* @__PURE__ */ new Set()
|
|
77
77
|
};
|
|
78
|
+
function isOpaqueObject(value) {
|
|
79
|
+
return value && (value[symbolOpaque] || value["$$typeof"]);
|
|
80
|
+
}
|
|
78
81
|
function getPathType(value) {
|
|
79
82
|
return isArray(value) ? "array" : isMap(value) ? "map" : value instanceof Set ? "set" : "object";
|
|
80
83
|
}
|
|
@@ -116,10 +119,10 @@ function reviver(key, value) {
|
|
|
116
119
|
return value;
|
|
117
120
|
}
|
|
118
121
|
function safeStringify(value) {
|
|
119
|
-
return JSON.stringify(value, replacer);
|
|
122
|
+
return value ? JSON.stringify(value, replacer) : value;
|
|
120
123
|
}
|
|
121
124
|
function safeParse(value) {
|
|
122
|
-
return JSON.parse(value, reviver);
|
|
125
|
+
return value ? JSON.parse(value, reviver) : value;
|
|
123
126
|
}
|
|
124
127
|
function clone(value) {
|
|
125
128
|
return safeParse(safeStringify(value));
|
|
@@ -135,29 +138,31 @@ function isEvent(value$) {
|
|
|
135
138
|
return value$ && ((_a = value$[symbolGetNode]) == null ? void 0 : _a.isEvent);
|
|
136
139
|
}
|
|
137
140
|
function setNodeValue(node, newValue) {
|
|
138
|
-
var _a
|
|
141
|
+
var _a;
|
|
139
142
|
const parentNode = (_a = node.parent) != null ? _a : node;
|
|
140
143
|
const key = node.parent ? node.key : "_";
|
|
141
144
|
const isDelete = newValue === symbolDelete;
|
|
142
145
|
if (isDelete)
|
|
143
146
|
newValue = void 0;
|
|
144
147
|
const parentValue = node.parent ? ensureNodeValue(parentNode) : parentNode.root;
|
|
145
|
-
const
|
|
148
|
+
const useSetFn = isSet(parentValue);
|
|
149
|
+
const useMapFn = isMap(parentValue);
|
|
150
|
+
const prevValue = useSetFn ? key : useMapFn ? parentValue.get(key) : parentValue[key];
|
|
146
151
|
const isFunc = isFunction(newValue);
|
|
147
152
|
newValue = !parentNode.isAssigning && isFunc && !isFunction(prevValue) ? newValue(prevValue) : newValue;
|
|
148
|
-
if (
|
|
153
|
+
if (newValue !== prevValue) {
|
|
149
154
|
try {
|
|
150
155
|
parentNode.isSetting = (parentNode.isSetting || 0) + 1;
|
|
151
|
-
const useMapFn = isMap(parentValue);
|
|
152
156
|
if (isDelete) {
|
|
153
|
-
if (useMapFn) {
|
|
157
|
+
if (useMapFn || useSetFn) {
|
|
154
158
|
parentValue.delete(key);
|
|
155
159
|
} else {
|
|
156
160
|
delete parentValue[key];
|
|
157
161
|
}
|
|
158
162
|
} else {
|
|
159
|
-
|
|
160
|
-
|
|
163
|
+
if (useSetFn) {
|
|
164
|
+
parentValue.add(newValue);
|
|
165
|
+
} else if (useMapFn) {
|
|
161
166
|
parentValue.set(key, newValue);
|
|
162
167
|
} else {
|
|
163
168
|
parentValue[key] = newValue;
|
|
@@ -173,7 +178,7 @@ var arrNodeKeys = [];
|
|
|
173
178
|
function getNodeValue(node) {
|
|
174
179
|
let count = 0;
|
|
175
180
|
let n = node;
|
|
176
|
-
while (
|
|
181
|
+
while (isChildNode(n)) {
|
|
177
182
|
arrNodeKeys[count++] = n.key;
|
|
178
183
|
n = n.parent;
|
|
179
184
|
}
|
|
@@ -213,7 +218,7 @@ function getChildNode(node, key, asFunction) {
|
|
|
213
218
|
function ensureNodeValue(node) {
|
|
214
219
|
let value = getNodeValue(node);
|
|
215
220
|
if (!value || isFunction(value)) {
|
|
216
|
-
if (
|
|
221
|
+
if (isChildNode(node)) {
|
|
217
222
|
const parent = ensureNodeValue(node.parent);
|
|
218
223
|
value = parent[node.key] = {};
|
|
219
224
|
} else {
|
|
@@ -282,11 +287,16 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
|
|
|
282
287
|
return obj;
|
|
283
288
|
} else if (o[p] === void 0 && value === void 0 && i === path.length - 1) {
|
|
284
289
|
return obj;
|
|
285
|
-
} else if (o[p] === void 0 || o[p] === null) {
|
|
286
|
-
|
|
290
|
+
} else if (i < path.length - 1 && (o[p] === void 0 || o[p] === null)) {
|
|
291
|
+
const child = initializePathType(pathTypes[i]);
|
|
292
|
+
if (isMap(o)) {
|
|
293
|
+
o.set(p, child);
|
|
294
|
+
} else {
|
|
295
|
+
o[p] = child;
|
|
296
|
+
}
|
|
287
297
|
}
|
|
288
298
|
if (i < path.length - 1) {
|
|
289
|
-
o = o[p];
|
|
299
|
+
o = isMap(o) ? o.get(p) : o[p];
|
|
290
300
|
if (oFull) {
|
|
291
301
|
oFull = oFull[p];
|
|
292
302
|
}
|
|
@@ -295,13 +305,13 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
|
|
|
295
305
|
}
|
|
296
306
|
if (p === void 0) {
|
|
297
307
|
if (mode === "merge") {
|
|
298
|
-
obj =
|
|
308
|
+
obj = deepMerge(obj, value);
|
|
299
309
|
} else {
|
|
300
310
|
obj = value;
|
|
301
311
|
}
|
|
302
312
|
} else {
|
|
303
313
|
if (mode === "merge") {
|
|
304
|
-
o[p] =
|
|
314
|
+
o[p] = deepMerge(o[p], value);
|
|
305
315
|
} else if (isMap(o)) {
|
|
306
316
|
o.set(p, value);
|
|
307
317
|
} else {
|
|
@@ -310,80 +320,59 @@ function setAtPath(obj, path, pathTypes, value, mode, fullObj, restore) {
|
|
|
310
320
|
}
|
|
311
321
|
return obj;
|
|
312
322
|
}
|
|
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
323
|
function mergeIntoObservable(target, ...sources) {
|
|
324
|
+
if (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") {
|
|
325
|
+
if (!isObservable(target)) {
|
|
326
|
+
console.error("[legend-state] should only use mergeIntoObservable with observables");
|
|
327
|
+
}
|
|
328
|
+
}
|
|
335
329
|
beginBatch();
|
|
336
|
-
globalState.isMerging = true;
|
|
337
330
|
for (let i = 0; i < sources.length; i++) {
|
|
338
|
-
|
|
331
|
+
_mergeIntoObservable(
|
|
339
332
|
target,
|
|
340
333
|
sources[i],
|
|
341
334
|
/*assign*/
|
|
342
|
-
i < sources.length - 1
|
|
335
|
+
i < sources.length - 1,
|
|
336
|
+
0
|
|
343
337
|
);
|
|
344
338
|
}
|
|
345
|
-
globalState.isMerging = false;
|
|
346
339
|
endBatch();
|
|
347
340
|
return target;
|
|
348
341
|
}
|
|
349
|
-
function _mergeIntoObservable(target, source, assign2) {
|
|
350
|
-
var _a;
|
|
342
|
+
function _mergeIntoObservable(target, source, assign2, levelsDeep) {
|
|
351
343
|
if (isObservable(source)) {
|
|
352
344
|
source = source.peek();
|
|
353
345
|
}
|
|
354
|
-
const
|
|
355
|
-
const targetValue = needsSet ? target.peek() : target;
|
|
346
|
+
const targetValue = target.peek();
|
|
356
347
|
const isTargetArr = isArray(targetValue);
|
|
357
348
|
const isTargetObj = !isTargetArr && isObject(targetValue);
|
|
358
|
-
|
|
359
|
-
|
|
349
|
+
const isSourceMap = isMap(source);
|
|
350
|
+
const isSourceSet = isSet(source);
|
|
351
|
+
if (isSourceSet && isSet(targetValue)) {
|
|
352
|
+
target.set(/* @__PURE__ */ new Set([...source, ...targetValue]));
|
|
353
|
+
} else if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
|
|
354
|
+
const keys = isSourceMap || isSourceSet ? Array.from(source.keys()) : Object.keys(source);
|
|
360
355
|
for (let i = 0; i < keys.length; i++) {
|
|
361
356
|
const key = keys[i];
|
|
362
|
-
const sourceValue = source[key];
|
|
357
|
+
const sourceValue = isSourceSet ? key : isSourceMap ? source.get(key) : source[key];
|
|
363
358
|
if (sourceValue === symbolDelete) {
|
|
364
|
-
|
|
359
|
+
target[key].delete();
|
|
365
360
|
} else {
|
|
366
361
|
const isObj = isObject(sourceValue);
|
|
367
362
|
const isArr = !isObj && isArray(sourceValue);
|
|
368
363
|
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) {
|
|
364
|
+
if ((isObj || isArr) && targetChild) {
|
|
365
|
+
if (levelsDeep > 0 && isEmpty(sourceValue)) {
|
|
377
366
|
targetChild.set(sourceValue);
|
|
378
|
-
} else {
|
|
379
|
-
const toSet = isObject(sourceValue) ? { ...sourceValue } : isArray(sourceValue) ? [...sourceValue] : sourceValue;
|
|
380
|
-
target[key] = toSet;
|
|
381
367
|
}
|
|
368
|
+
_mergeIntoObservable(targetChild, sourceValue, false, levelsDeep + 1);
|
|
369
|
+
} else {
|
|
370
|
+
targetChild.set(sourceValue);
|
|
382
371
|
}
|
|
383
372
|
}
|
|
384
373
|
}
|
|
385
374
|
} else if (source !== void 0) {
|
|
386
|
-
|
|
375
|
+
target.set(source);
|
|
387
376
|
}
|
|
388
377
|
return target;
|
|
389
378
|
}
|
|
@@ -420,12 +409,13 @@ function initializePathType(pathType) {
|
|
|
420
409
|
switch (pathType) {
|
|
421
410
|
case "array":
|
|
422
411
|
return [];
|
|
423
|
-
case "object":
|
|
424
|
-
return {};
|
|
425
412
|
case "map":
|
|
426
413
|
return /* @__PURE__ */ new Map();
|
|
427
414
|
case "set":
|
|
428
415
|
return /* @__PURE__ */ new Set();
|
|
416
|
+
case "object":
|
|
417
|
+
default:
|
|
418
|
+
return {};
|
|
429
419
|
}
|
|
430
420
|
}
|
|
431
421
|
function applyChange(value, change, applyPrevious) {
|
|
@@ -438,6 +428,33 @@ function applyChanges(value, changes, applyPrevious) {
|
|
|
438
428
|
}
|
|
439
429
|
return value;
|
|
440
430
|
}
|
|
431
|
+
function deepMerge(target, ...sources) {
|
|
432
|
+
if (isPrimitive(target)) {
|
|
433
|
+
return sources[sources.length - 1];
|
|
434
|
+
}
|
|
435
|
+
let result = isArray(target) ? [...target] : { ...target };
|
|
436
|
+
for (let i = 0; i < sources.length; i++) {
|
|
437
|
+
const obj2 = sources[i];
|
|
438
|
+
if (isObject(obj2) || isArray(obj2)) {
|
|
439
|
+
const objTarget = obj2;
|
|
440
|
+
for (const key in objTarget) {
|
|
441
|
+
if (hasOwnProperty.call(objTarget, key)) {
|
|
442
|
+
if (objTarget[key] instanceof Object && !isObservable(objTarget[key]) && Object.keys(objTarget[key]).length > 0) {
|
|
443
|
+
result[key] = deepMerge(
|
|
444
|
+
result[key] || (isArray(objTarget[key]) ? [] : {}),
|
|
445
|
+
objTarget[key]
|
|
446
|
+
);
|
|
447
|
+
} else {
|
|
448
|
+
result[key] = objTarget[key];
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
} else {
|
|
453
|
+
result = obj2;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return result;
|
|
457
|
+
}
|
|
441
458
|
|
|
442
459
|
// src/batching.ts
|
|
443
460
|
var timeout;
|
|
@@ -484,9 +501,9 @@ function notify(node, value, prev, level, whenOptimizedOnlyIf) {
|
|
|
484
501
|
changesInBatch,
|
|
485
502
|
node,
|
|
486
503
|
/*loading*/
|
|
487
|
-
globalState.isLoadingLocal,
|
|
504
|
+
!!globalState.isLoadingLocal,
|
|
488
505
|
/*remote*/
|
|
489
|
-
globalState.isLoadingRemote,
|
|
506
|
+
!!globalState.isLoadingRemote,
|
|
490
507
|
value,
|
|
491
508
|
[],
|
|
492
509
|
[],
|
|
@@ -497,31 +514,35 @@ function notify(node, value, prev, level, whenOptimizedOnlyIf) {
|
|
|
497
514
|
level,
|
|
498
515
|
whenOptimizedOnlyIf
|
|
499
516
|
);
|
|
500
|
-
if (changesInBatch.size) {
|
|
501
|
-
batchNotifyChanges(
|
|
502
|
-
changesInBatch,
|
|
503
|
-
/*immediate*/
|
|
504
|
-
true
|
|
505
|
-
);
|
|
506
|
-
}
|
|
507
517
|
const existing = _batchMap.get(node);
|
|
508
518
|
if (existing) {
|
|
509
|
-
existing.
|
|
519
|
+
if (existing.prev === value) {
|
|
520
|
+
_batchMap.delete(node);
|
|
521
|
+
} else {
|
|
522
|
+
existing.value = value;
|
|
523
|
+
}
|
|
510
524
|
} else {
|
|
511
525
|
_batchMap.set(node, {
|
|
512
526
|
value,
|
|
513
527
|
prev,
|
|
514
528
|
level,
|
|
515
529
|
whenOptimizedOnlyIf,
|
|
516
|
-
|
|
517
|
-
|
|
530
|
+
isFromSync: !!globalState.isLoadingRemote,
|
|
531
|
+
isFromPersist: !!globalState.isLoadingLocal
|
|
518
532
|
});
|
|
519
533
|
}
|
|
534
|
+
if (changesInBatch.size) {
|
|
535
|
+
batchNotifyChanges(
|
|
536
|
+
changesInBatch,
|
|
537
|
+
/*immediate*/
|
|
538
|
+
true
|
|
539
|
+
);
|
|
540
|
+
}
|
|
520
541
|
if (numInBatch <= 0) {
|
|
521
542
|
runBatch();
|
|
522
543
|
}
|
|
523
544
|
}
|
|
524
|
-
function computeChangesAtNode(changesInBatch, node,
|
|
545
|
+
function computeChangesAtNode(changesInBatch, node, isFromPersist, isFromSync, value, path, pathTypes, valueAtPath, prevAtPath, immediate, level, whenOptimizedOnlyIf) {
|
|
525
546
|
if (immediate ? node.listenersImmediate : node.listeners) {
|
|
526
547
|
const change = {
|
|
527
548
|
path,
|
|
@@ -534,13 +555,14 @@ function computeChangesAtNode(changesInBatch, node, loading, remote, value, path
|
|
|
534
555
|
const { changes } = changeInBatch;
|
|
535
556
|
if (!isArraySubset(changes[0].path, change.path)) {
|
|
536
557
|
changes.push(change);
|
|
558
|
+
changeInBatch.level = Math.min(changeInBatch.level, level);
|
|
537
559
|
}
|
|
538
560
|
} else {
|
|
539
561
|
changesInBatch.set(node, {
|
|
540
562
|
level,
|
|
541
563
|
value,
|
|
542
|
-
|
|
543
|
-
|
|
564
|
+
isFromSync,
|
|
565
|
+
isFromPersist,
|
|
544
566
|
whenOptimizedOnlyIf,
|
|
545
567
|
changes: [change]
|
|
546
568
|
});
|
|
@@ -604,7 +626,7 @@ function computeChangesRecursive(changesInBatch, node, loading, remote, value, p
|
|
|
604
626
|
}
|
|
605
627
|
function batchNotifyChanges(changesInBatch, immediate) {
|
|
606
628
|
const listenersNotified = /* @__PURE__ */ new Set();
|
|
607
|
-
changesInBatch.forEach(({ changes, level, value,
|
|
629
|
+
changesInBatch.forEach(({ changes, level, value, isFromPersist, isFromSync, whenOptimizedOnlyIf }, node) => {
|
|
608
630
|
const listeners = immediate ? node.listenersImmediate : node.listeners;
|
|
609
631
|
if (listeners) {
|
|
610
632
|
let listenerParams;
|
|
@@ -618,8 +640,8 @@ function batchNotifyChanges(changesInBatch, immediate) {
|
|
|
618
640
|
if (!noArgs && !listenerParams) {
|
|
619
641
|
listenerParams = {
|
|
620
642
|
value,
|
|
621
|
-
|
|
622
|
-
|
|
643
|
+
isFromPersist,
|
|
644
|
+
isFromSync,
|
|
623
645
|
getPrevious: createPreviousHandler(value, changes),
|
|
624
646
|
changes
|
|
625
647
|
};
|
|
@@ -647,12 +669,12 @@ function runBatch() {
|
|
|
647
669
|
const map = _batchMap;
|
|
648
670
|
_batchMap = /* @__PURE__ */ new Map();
|
|
649
671
|
const changesInBatch = /* @__PURE__ */ new Map();
|
|
650
|
-
map.forEach(({ value, prev, level,
|
|
672
|
+
map.forEach(({ value, prev, level, isFromPersist, isFromSync, whenOptimizedOnlyIf }, node) => {
|
|
651
673
|
computeChangesRecursive(
|
|
652
674
|
changesInBatch,
|
|
653
675
|
node,
|
|
654
|
-
|
|
655
|
-
|
|
676
|
+
isFromPersist,
|
|
677
|
+
isFromSync,
|
|
656
678
|
value,
|
|
657
679
|
[],
|
|
658
680
|
[],
|
|
@@ -711,21 +733,6 @@ function getNodeAtPath(obj, path) {
|
|
|
711
733
|
return o;
|
|
712
734
|
}
|
|
713
735
|
|
|
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
736
|
// src/createObservable.ts
|
|
730
737
|
function createObservable(value, makePrimitive, extractPromise2, createObject, createPrimitive) {
|
|
731
738
|
if (isObservable(value)) {
|
|
@@ -755,6 +762,21 @@ function createObservable(value, makePrimitive, extractPromise2, createObject, c
|
|
|
755
762
|
return obs;
|
|
756
763
|
}
|
|
757
764
|
|
|
765
|
+
// src/linked.ts
|
|
766
|
+
function linked(params, options) {
|
|
767
|
+
if (isFunction(params)) {
|
|
768
|
+
params = { get: params };
|
|
769
|
+
}
|
|
770
|
+
if (options) {
|
|
771
|
+
params = { ...params, ...options };
|
|
772
|
+
}
|
|
773
|
+
const ret = function() {
|
|
774
|
+
return { [symbolLinked]: params };
|
|
775
|
+
};
|
|
776
|
+
ret.prototype[symbolLinked] = params;
|
|
777
|
+
return ret;
|
|
778
|
+
}
|
|
779
|
+
|
|
758
780
|
// src/onChange.ts
|
|
759
781
|
function onChange(node, callback, options = {}, fromLinks) {
|
|
760
782
|
var _a;
|
|
@@ -779,8 +801,8 @@ function onChange(node, callback, options = {}, fromLinks) {
|
|
|
779
801
|
const value = getNodeValue(node);
|
|
780
802
|
callback({
|
|
781
803
|
value,
|
|
782
|
-
|
|
783
|
-
|
|
804
|
+
isFromPersist: true,
|
|
805
|
+
isFromSync: false,
|
|
784
806
|
changes: [
|
|
785
807
|
{
|
|
786
808
|
path: [],
|
|
@@ -836,14 +858,14 @@ function onChange(node, callback, options = {}, fromLinks) {
|
|
|
836
858
|
};
|
|
837
859
|
}
|
|
838
860
|
function createCb(linkedFromNode, path, callback) {
|
|
839
|
-
let
|
|
840
|
-
return function({ value: valueA,
|
|
841
|
-
const
|
|
861
|
+
let prevAtPath = deconstructObjectWithPath(path, [], getNodeValue(linkedFromNode));
|
|
862
|
+
return function({ value: valueA, isFromPersist, isFromSync }) {
|
|
863
|
+
const valueAtPath = deconstructObjectWithPath(path, [], valueA);
|
|
842
864
|
if (valueAtPath !== prevAtPath) {
|
|
843
865
|
callback({
|
|
844
866
|
value: valueAtPath,
|
|
845
|
-
|
|
846
|
-
|
|
867
|
+
isFromPersist,
|
|
868
|
+
isFromSync,
|
|
847
869
|
changes: [
|
|
848
870
|
{
|
|
849
871
|
path: [],
|
|
@@ -858,16 +880,6 @@ function createCb(linkedFromNode, path, callback) {
|
|
|
858
880
|
prevAtPath = valueAtPath;
|
|
859
881
|
};
|
|
860
882
|
}
|
|
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
883
|
|
|
872
884
|
// src/setupTracking.ts
|
|
873
885
|
function setupTracking(nodes, update, noArgs, immediate) {
|
|
@@ -963,12 +975,17 @@ function observe(selectorOrRun, reactionOrOptions, options) {
|
|
|
963
975
|
options = reactionOrOptions;
|
|
964
976
|
}
|
|
965
977
|
let dispose;
|
|
978
|
+
let isRunning = false;
|
|
966
979
|
const e = { num: 0 };
|
|
967
980
|
const update = function() {
|
|
981
|
+
if (isRunning) {
|
|
982
|
+
return;
|
|
983
|
+
}
|
|
968
984
|
if (e.onCleanup) {
|
|
969
985
|
e.onCleanup();
|
|
970
986
|
e.onCleanup = void 0;
|
|
971
987
|
}
|
|
988
|
+
isRunning = true;
|
|
972
989
|
beginBatch();
|
|
973
990
|
delete e.value;
|
|
974
991
|
dispose == null ? void 0 : dispose();
|
|
@@ -982,6 +999,7 @@ function observe(selectorOrRun, reactionOrOptions, options) {
|
|
|
982
999
|
e.onCleanupReaction = void 0;
|
|
983
1000
|
}
|
|
984
1001
|
endBatch();
|
|
1002
|
+
isRunning = false;
|
|
985
1003
|
if (reaction && ((options == null ? void 0 : options.fromComputed) || (e.num > 0 || !isEvent(selectorOrRun)) && (e.previous !== e.value || typeof e.value === "object"))) {
|
|
986
1004
|
reaction(e);
|
|
987
1005
|
}
|
|
@@ -1065,6 +1083,7 @@ var ArrayLoopers = /* @__PURE__ */ new Set([
|
|
|
1065
1083
|
"filter",
|
|
1066
1084
|
"find",
|
|
1067
1085
|
"findIndex",
|
|
1086
|
+
"flatMap",
|
|
1068
1087
|
"forEach",
|
|
1069
1088
|
"join",
|
|
1070
1089
|
"map",
|
|
@@ -1094,7 +1113,7 @@ function collectionSetter(node, target, prop, ...args) {
|
|
|
1094
1113
|
const prevValue = target.slice();
|
|
1095
1114
|
const ret = target[prop].apply(target, args);
|
|
1096
1115
|
if (node) {
|
|
1097
|
-
const hasParent =
|
|
1116
|
+
const hasParent = isChildNode(node);
|
|
1098
1117
|
const key = hasParent ? node.key : "_";
|
|
1099
1118
|
const parentValue = hasParent ? getNodeValue(node.parent) : node.root;
|
|
1100
1119
|
parentValue[key] = prevValue;
|
|
@@ -1118,7 +1137,7 @@ function updateNodes(parent, obj, prevValue) {
|
|
|
1118
1137
|
}
|
|
1119
1138
|
__devUpdateNodes.add(obj);
|
|
1120
1139
|
}
|
|
1121
|
-
if (isObject(obj) && obj
|
|
1140
|
+
if (isObject(obj) && isOpaqueObject(obj) || isObject(prevValue) && isOpaqueObject(prevValue)) {
|
|
1122
1141
|
const isDiff = obj !== prevValue;
|
|
1123
1142
|
if (isDiff) {
|
|
1124
1143
|
if (parent.listeners || parent.listenersImmediate) {
|
|
@@ -1306,10 +1325,10 @@ var proxyHandler = {
|
|
|
1306
1325
|
if (p === symbolGetNode) {
|
|
1307
1326
|
return node;
|
|
1308
1327
|
}
|
|
1309
|
-
if (p === "apply") {
|
|
1328
|
+
if (p === "apply" || p === "call") {
|
|
1310
1329
|
const nodeValue = getNodeValue(node);
|
|
1311
1330
|
if (isFunction(nodeValue)) {
|
|
1312
|
-
return nodeValue
|
|
1331
|
+
return nodeValue[p];
|
|
1313
1332
|
}
|
|
1314
1333
|
}
|
|
1315
1334
|
let value = peekInternal(
|
|
@@ -1317,11 +1336,14 @@ var proxyHandler = {
|
|
|
1317
1336
|
/*activateRecursive*/
|
|
1318
1337
|
p === "get" || p === "peek"
|
|
1319
1338
|
);
|
|
1339
|
+
if (p === symbolIterator) {
|
|
1340
|
+
return !value || isPrimitive(value) ? void 0 : value[p];
|
|
1341
|
+
}
|
|
1320
1342
|
const targetNode = node.linkedToNode || (value == null ? void 0 : value[symbolGetNode]);
|
|
1321
1343
|
if (targetNode && p !== "onChange") {
|
|
1322
1344
|
return proxyHandler.get(targetNode, p, receiver);
|
|
1323
1345
|
}
|
|
1324
|
-
if (isMap(value) || value
|
|
1346
|
+
if (isMap(value) || isSet(value)) {
|
|
1325
1347
|
const ret = handlerMapSet(node, p, value);
|
|
1326
1348
|
if (ret !== void 0) {
|
|
1327
1349
|
return ret;
|
|
@@ -1351,7 +1373,7 @@ var proxyHandler = {
|
|
|
1351
1373
|
return property.get(node);
|
|
1352
1374
|
}
|
|
1353
1375
|
let vProp = value == null ? void 0 : value[p];
|
|
1354
|
-
if (isObject(value) && value
|
|
1376
|
+
if (isObject(value) && isOpaqueObject(value)) {
|
|
1355
1377
|
return vProp;
|
|
1356
1378
|
}
|
|
1357
1379
|
const fnOrComputed = (_a = node.functions) == null ? void 0 : _a.get(p);
|
|
@@ -1413,7 +1435,7 @@ var proxyHandler = {
|
|
|
1413
1435
|
return vProp.bind(value);
|
|
1414
1436
|
}
|
|
1415
1437
|
if (isPrimitive(vProp)) {
|
|
1416
|
-
if (
|
|
1438
|
+
if (p === "length" && isArray(value)) {
|
|
1417
1439
|
updateTracking(node, true);
|
|
1418
1440
|
return vProp;
|
|
1419
1441
|
}
|
|
@@ -1517,11 +1539,17 @@ function setKey(node, key, newValue, level) {
|
|
|
1517
1539
|
} else {
|
|
1518
1540
|
const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
|
|
1519
1541
|
const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
|
|
1520
|
-
if (!equals(savedValue, prevValue)) {
|
|
1521
|
-
updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level);
|
|
1522
|
-
}
|
|
1523
1542
|
if (!isPrim) {
|
|
1524
|
-
|
|
1543
|
+
let parent = childNode;
|
|
1544
|
+
do {
|
|
1545
|
+
parent.needsExtract = true;
|
|
1546
|
+
parent.recursivelyAutoActivated = false;
|
|
1547
|
+
} while (parent = parent.parent);
|
|
1548
|
+
}
|
|
1549
|
+
const notify2 = !equals(savedValue, prevValue);
|
|
1550
|
+
const forceNotify = !notify2 && childNode.isComputing && !isPrim;
|
|
1551
|
+
if (notify2 || forceNotify) {
|
|
1552
|
+
updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
|
|
1525
1553
|
}
|
|
1526
1554
|
extractFunctionOrComputed(node, key, savedValue);
|
|
1527
1555
|
}
|
|
@@ -1536,6 +1564,8 @@ function assign(node, value) {
|
|
|
1536
1564
|
const currentValue = getNodeValue(node);
|
|
1537
1565
|
if (isMap(currentValue)) {
|
|
1538
1566
|
value.forEach((value2, key) => currentValue.set(key, value2));
|
|
1567
|
+
} else {
|
|
1568
|
+
set(node, value);
|
|
1539
1569
|
}
|
|
1540
1570
|
} else {
|
|
1541
1571
|
node.isAssigning = (node.isAssigning || 0) + 1;
|
|
@@ -1549,7 +1579,7 @@ function assign(node, value) {
|
|
|
1549
1579
|
return proxy2;
|
|
1550
1580
|
}
|
|
1551
1581
|
function deleteFn(node, key) {
|
|
1552
|
-
if (key === void 0 &&
|
|
1582
|
+
if (key === void 0 && isChildNode(node)) {
|
|
1553
1583
|
key = node.key;
|
|
1554
1584
|
node = node.parent;
|
|
1555
1585
|
}
|
|
@@ -1569,7 +1599,8 @@ function deleteFn(node, key) {
|
|
|
1569
1599
|
function handlerMapSet(node, p, value) {
|
|
1570
1600
|
const vProp = value == null ? void 0 : value[p];
|
|
1571
1601
|
if (p === "size") {
|
|
1572
|
-
|
|
1602
|
+
updateTracking(node, true);
|
|
1603
|
+
return value[p];
|
|
1573
1604
|
} else if (isFunction(vProp)) {
|
|
1574
1605
|
return function(a, b, c) {
|
|
1575
1606
|
const l = arguments.length;
|
|
@@ -1580,23 +1611,16 @@ function handlerMapSet(node, p, value) {
|
|
|
1580
1611
|
}
|
|
1581
1612
|
} else if (p === "set") {
|
|
1582
1613
|
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;
|
|
1614
|
+
set(getChildNode(node, a), b);
|
|
1589
1615
|
} else if (l === 1 && isMap(value)) {
|
|
1590
1616
|
set(node, a);
|
|
1591
1617
|
}
|
|
1618
|
+
return getProxy(node);
|
|
1592
1619
|
} else if (p === "delete") {
|
|
1593
1620
|
if (l > 0) {
|
|
1594
1621
|
const prev = value.get ? valueMap.get(a) : a;
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
updateNodesAndNotify(getChildNode(node, a), void 0, prev);
|
|
1598
|
-
}
|
|
1599
|
-
return ret;
|
|
1622
|
+
deleteFn(node, a);
|
|
1623
|
+
return prev !== void 0;
|
|
1600
1624
|
}
|
|
1601
1625
|
} else if (p === "clear") {
|
|
1602
1626
|
const prev = new Map(valueMap);
|
|
@@ -1612,7 +1636,7 @@ function handlerMapSet(node, p, value) {
|
|
|
1612
1636
|
if (!value.has(p)) {
|
|
1613
1637
|
notify(node, ret, prev, 0);
|
|
1614
1638
|
}
|
|
1615
|
-
return
|
|
1639
|
+
return getProxy(node);
|
|
1616
1640
|
}
|
|
1617
1641
|
const fn = observableFns.get(p);
|
|
1618
1642
|
if (fn) {
|
|
@@ -1632,20 +1656,20 @@ function handlerMapSet(node, p, value) {
|
|
|
1632
1656
|
};
|
|
1633
1657
|
}
|
|
1634
1658
|
}
|
|
1635
|
-
function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level) {
|
|
1659
|
+
function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
|
|
1636
1660
|
if (!childNode)
|
|
1637
1661
|
childNode = node;
|
|
1638
1662
|
beginBatch();
|
|
1639
1663
|
if (isPrim === void 0) {
|
|
1640
1664
|
isPrim = isPrimitive(newValue);
|
|
1641
1665
|
}
|
|
1642
|
-
let hasADiff = isPrim;
|
|
1666
|
+
let hasADiff = forceNotify || isPrim;
|
|
1643
1667
|
let whenOptimizedOnlyIf = false;
|
|
1644
1668
|
if (!isPrim || prevValue && !isPrimitive(prevValue)) {
|
|
1645
1669
|
if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
|
|
1646
1670
|
__devUpdateNodes.clear();
|
|
1647
1671
|
}
|
|
1648
|
-
hasADiff = updateNodes(childNode, newValue, prevValue);
|
|
1672
|
+
hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
|
|
1649
1673
|
if (isArray(newValue)) {
|
|
1650
1674
|
whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
|
|
1651
1675
|
}
|
|
@@ -1662,6 +1686,7 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
|
|
|
1662
1686
|
endBatch();
|
|
1663
1687
|
}
|
|
1664
1688
|
function extractPromise(node, value, setter) {
|
|
1689
|
+
const numGets = node.numGets = (node.numGets || 0) + 1;
|
|
1665
1690
|
if (!node.state) {
|
|
1666
1691
|
node.state = createObservable(
|
|
1667
1692
|
{
|
|
@@ -1673,11 +1698,14 @@ function extractPromise(node, value, setter) {
|
|
|
1673
1698
|
);
|
|
1674
1699
|
}
|
|
1675
1700
|
value.then((value2) => {
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1701
|
+
if (numGets >= (node.getNumResolved || 0)) {
|
|
1702
|
+
node.getNumResolved = node.numGets;
|
|
1703
|
+
setter ? setter({ value: value2 }) : set(node, value2);
|
|
1704
|
+
node.state.assign({
|
|
1705
|
+
isLoaded: true,
|
|
1706
|
+
error: void 0
|
|
1707
|
+
});
|
|
1708
|
+
}
|
|
1681
1709
|
}).catch((error) => {
|
|
1682
1710
|
node.state.error.set(error);
|
|
1683
1711
|
});
|
|
@@ -1694,6 +1722,7 @@ function extractFunctionOrComputed(node, k, v) {
|
|
|
1694
1722
|
const childNode = getChildNode(node, k, fn);
|
|
1695
1723
|
const targetNode = getNode(v);
|
|
1696
1724
|
const initialValue = peek(targetNode);
|
|
1725
|
+
setToObservable(childNode, v);
|
|
1697
1726
|
setNodeValue(childNode, initialValue);
|
|
1698
1727
|
return getNodeValue(childNode);
|
|
1699
1728
|
} else if (typeof v === "function") {
|
|
@@ -1726,7 +1755,9 @@ function peekInternal(node, activateRecursive) {
|
|
|
1726
1755
|
}
|
|
1727
1756
|
isFlushing = false;
|
|
1728
1757
|
let value = getNodeValue(node);
|
|
1729
|
-
|
|
1758
|
+
if (!globalState.isLoadingLocal) {
|
|
1759
|
+
value = checkLazy(node, value, !!activateRecursive);
|
|
1760
|
+
}
|
|
1730
1761
|
return value;
|
|
1731
1762
|
}
|
|
1732
1763
|
function checkLazy(node, value, activateRecursive) {
|
|
@@ -1741,10 +1772,12 @@ function checkLazy(node, value, activateRecursive) {
|
|
|
1741
1772
|
} else {
|
|
1742
1773
|
if (node.parent) {
|
|
1743
1774
|
const parentValue = getNodeValue(node.parent);
|
|
1744
|
-
if (
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1775
|
+
if (isFunction(value)) {
|
|
1776
|
+
if (parentValue) {
|
|
1777
|
+
delete parentValue[node.key];
|
|
1778
|
+
} else {
|
|
1779
|
+
node.root._ = void 0;
|
|
1780
|
+
}
|
|
1748
1781
|
}
|
|
1749
1782
|
}
|
|
1750
1783
|
value = activateNodeFunction(node, lazyFn);
|
|
@@ -1833,7 +1866,9 @@ function activateNodeFunction(node, lazyFn) {
|
|
|
1833
1866
|
var _a, _b, _c, _d;
|
|
1834
1867
|
if (isFirst) {
|
|
1835
1868
|
isFirst = false;
|
|
1836
|
-
|
|
1869
|
+
if (isFunction(getNodeValue(node))) {
|
|
1870
|
+
setNodeValue(node, void 0);
|
|
1871
|
+
}
|
|
1837
1872
|
} else if (!isFlushing && refreshFn) {
|
|
1838
1873
|
if (shouldIgnoreUnobserved(node, refreshFn)) {
|
|
1839
1874
|
ignoreThisUpdate = true;
|
|
@@ -1842,14 +1877,15 @@ function activateNodeFunction(node, lazyFn) {
|
|
|
1842
1877
|
}
|
|
1843
1878
|
let value = activateFn();
|
|
1844
1879
|
let didSetToObs = false;
|
|
1845
|
-
|
|
1846
|
-
|
|
1880
|
+
const isObs = isObservable(value);
|
|
1881
|
+
if (isObs || node.linkedToNode) {
|
|
1882
|
+
didSetToObs = isObs;
|
|
1847
1883
|
value = setToObservable(node, value);
|
|
1848
1884
|
}
|
|
1849
|
-
if (isFunction(value)) {
|
|
1885
|
+
if (isFunction(value) && value.length === 0) {
|
|
1850
1886
|
value = value();
|
|
1851
1887
|
}
|
|
1852
|
-
const activated = !
|
|
1888
|
+
const activated = !isObs ? value == null ? void 0 : value[symbolLinked] : void 0;
|
|
1853
1889
|
if (activated) {
|
|
1854
1890
|
node.activationState = activated;
|
|
1855
1891
|
value = void 0;
|
|
@@ -1904,16 +1940,14 @@ function activateNodeFunction(node, lazyFn) {
|
|
|
1904
1940
|
}
|
|
1905
1941
|
} else {
|
|
1906
1942
|
activatedValue = value;
|
|
1907
|
-
|
|
1943
|
+
const isLoaded = node.state.isLoaded.peek();
|
|
1944
|
+
if (isLoaded || !isFunction(value)) {
|
|
1908
1945
|
node.isComputing = true;
|
|
1909
1946
|
set(node, value);
|
|
1910
1947
|
node.isComputing = false;
|
|
1911
|
-
}
|
|
1912
|
-
|
|
1913
|
-
node.state.assign({
|
|
1914
|
-
isLoaded: true,
|
|
1915
|
-
error: void 0
|
|
1916
|
-
});
|
|
1948
|
+
}
|
|
1949
|
+
if (!isLoaded) {
|
|
1950
|
+
node.state.assign({ isLoaded: true, error: void 0 });
|
|
1917
1951
|
}
|
|
1918
1952
|
}
|
|
1919
1953
|
}
|
|
@@ -1954,14 +1988,14 @@ function activateNodeBase(node, value) {
|
|
|
1954
1988
|
if (allChanges.length > 0) {
|
|
1955
1989
|
let changes;
|
|
1956
1990
|
let value2;
|
|
1957
|
-
let
|
|
1958
|
-
let
|
|
1991
|
+
let isFromPersist = false;
|
|
1992
|
+
let isFromSync = false;
|
|
1959
1993
|
let getPrevious;
|
|
1960
1994
|
if (listenerParams) {
|
|
1961
1995
|
changes = listenerParams.changes;
|
|
1962
1996
|
value2 = listenerParams.value;
|
|
1963
|
-
|
|
1964
|
-
|
|
1997
|
+
isFromPersist = listenerParams.isFromPersist;
|
|
1998
|
+
isFromSync = listenerParams.isFromSync;
|
|
1965
1999
|
getPrevious = listenerParams.getPrevious;
|
|
1966
2000
|
} else {
|
|
1967
2001
|
changes = allChanges;
|
|
@@ -1981,8 +2015,8 @@ function activateNodeBase(node, value) {
|
|
|
1981
2015
|
setFn({
|
|
1982
2016
|
value: value2,
|
|
1983
2017
|
changes,
|
|
1984
|
-
|
|
1985
|
-
|
|
2018
|
+
isFromPersist,
|
|
2019
|
+
isFromSync,
|
|
1986
2020
|
getPrevious
|
|
1987
2021
|
});
|
|
1988
2022
|
node.isComputing = false;
|
|
@@ -2017,26 +2051,31 @@ function activateNodeBase(node, value) {
|
|
|
2017
2051
|
}
|
|
2018
2052
|
function setToObservable(node, value) {
|
|
2019
2053
|
var _a;
|
|
2020
|
-
const linkedNode = getNode(value);
|
|
2054
|
+
const linkedNode = value ? getNode(value) : void 0;
|
|
2021
2055
|
if (linkedNode !== node && (linkedNode == null ? void 0 : linkedNode.linkedToNode) !== node) {
|
|
2022
2056
|
node.linkedToNode = linkedNode;
|
|
2023
|
-
linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
|
|
2024
|
-
linkedNode.linkedFromNodes.add(node);
|
|
2025
2057
|
(_a = node.linkedToNodeDispose) == null ? void 0 : _a.call(node);
|
|
2026
|
-
|
|
2027
|
-
linkedNode
|
|
2028
|
-
()
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2058
|
+
if (linkedNode) {
|
|
2059
|
+
linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
|
|
2060
|
+
linkedNode.linkedFromNodes.add(node);
|
|
2061
|
+
node.linkedToNodeDispose = onChange(
|
|
2062
|
+
linkedNode,
|
|
2063
|
+
() => {
|
|
2064
|
+
value = peekInternal(linkedNode);
|
|
2065
|
+
if (!isFunction(value)) {
|
|
2066
|
+
set(node, value);
|
|
2067
|
+
}
|
|
2068
|
+
},
|
|
2069
|
+
{ initial: true },
|
|
2070
|
+
/* @__PURE__ */ new Set([node])
|
|
2071
|
+
);
|
|
2072
|
+
}
|
|
2035
2073
|
}
|
|
2036
2074
|
return value;
|
|
2037
2075
|
}
|
|
2038
2076
|
function recursivelyAutoActivate(obj, node) {
|
|
2039
|
-
if (isObject(obj) || isArray(obj)) {
|
|
2077
|
+
if (!node.recursivelyAutoActivated && (isObject(obj) || isArray(obj)) && !isOpaqueObject(obj)) {
|
|
2078
|
+
node.recursivelyAutoActivated = true;
|
|
2040
2079
|
const pathStack = [];
|
|
2041
2080
|
const getNodeAtPath2 = () => {
|
|
2042
2081
|
var _a;
|
|
@@ -2054,27 +2093,29 @@ function recursivelyAutoActivate(obj, node) {
|
|
|
2054
2093
|
}
|
|
2055
2094
|
function recursivelyAutoActivateInner(obj, pathStack, getNodeAtPath2) {
|
|
2056
2095
|
var _a;
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2096
|
+
if ((isObject(obj) || isArray(obj)) && !isOpaqueObject(obj)) {
|
|
2097
|
+
for (const key in obj) {
|
|
2098
|
+
if (hasOwnProperty.call(obj, key)) {
|
|
2099
|
+
const value = obj[key];
|
|
2100
|
+
if (isObservable(value)) {
|
|
2101
|
+
const childNode = getNodeAtPath2();
|
|
2102
|
+
extractFunctionOrComputed(childNode, key, value);
|
|
2103
|
+
delete childNode.lazy;
|
|
2104
|
+
} else {
|
|
2105
|
+
const linkedOptions = isFunction(value) && ((_a = value.prototype) == null ? void 0 : _a[symbolLinked]);
|
|
2106
|
+
if (linkedOptions) {
|
|
2107
|
+
const activate = linkedOptions.activate;
|
|
2108
|
+
if (!activate || activate === "auto") {
|
|
2109
|
+
const childNode = getNodeAtPath2();
|
|
2110
|
+
peek(getChildNode(childNode, key, value));
|
|
2111
|
+
}
|
|
2071
2112
|
}
|
|
2072
2113
|
}
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2114
|
+
if (typeof value === "object") {
|
|
2115
|
+
pathStack.push({ key, value });
|
|
2116
|
+
recursivelyAutoActivateInner(value, pathStack, getNodeAtPath2);
|
|
2117
|
+
pathStack.pop();
|
|
2118
|
+
}
|
|
2078
2119
|
}
|
|
2079
2120
|
}
|
|
2080
2121
|
}
|
|
@@ -2130,16 +2171,6 @@ function observable(value) {
|
|
|
2130
2171
|
function observablePrimitive(value) {
|
|
2131
2172
|
return createObservable(value, true, extractPromise, getProxy, ObservablePrimitiveClass);
|
|
2132
2173
|
}
|
|
2133
|
-
function syncState(obs) {
|
|
2134
|
-
const node = getNode(obs);
|
|
2135
|
-
if (!node.state) {
|
|
2136
|
-
peekInternal(node);
|
|
2137
|
-
}
|
|
2138
|
-
if (!node.state) {
|
|
2139
|
-
node.state = observable({});
|
|
2140
|
-
}
|
|
2141
|
-
return node.state;
|
|
2142
|
-
}
|
|
2143
2174
|
|
|
2144
2175
|
// src/computed.ts
|
|
2145
2176
|
function computed(get2, set2) {
|
|
@@ -2148,45 +2179,6 @@ function computed(get2, set2) {
|
|
|
2148
2179
|
);
|
|
2149
2180
|
}
|
|
2150
2181
|
|
|
2151
|
-
// src/config.ts
|
|
2152
|
-
function configureLegendState({
|
|
2153
|
-
observableFunctions,
|
|
2154
|
-
observableProperties: observableProperties2,
|
|
2155
|
-
jsonReplacer,
|
|
2156
|
-
jsonReviver
|
|
2157
|
-
}) {
|
|
2158
|
-
if (observableFunctions) {
|
|
2159
|
-
for (const key in observableFunctions) {
|
|
2160
|
-
const fn = observableFunctions[key];
|
|
2161
|
-
observableFns.set(key, fn);
|
|
2162
|
-
ObservablePrimitiveClass.prototype[key] = function(...args) {
|
|
2163
|
-
return fn.call(this, this._node, ...args);
|
|
2164
|
-
};
|
|
2165
|
-
}
|
|
2166
|
-
}
|
|
2167
|
-
if (observableProperties2) {
|
|
2168
|
-
for (const key in observableProperties2) {
|
|
2169
|
-
const fns2 = observableProperties2[key];
|
|
2170
|
-
observableProperties.set(key, fns2);
|
|
2171
|
-
Object.defineProperty(ObservablePrimitiveClass.prototype, key, {
|
|
2172
|
-
configurable: true,
|
|
2173
|
-
get() {
|
|
2174
|
-
return fns2.get.call(this, this._node);
|
|
2175
|
-
},
|
|
2176
|
-
set(value) {
|
|
2177
|
-
return fns2.set.call(this, this._node, value);
|
|
2178
|
-
}
|
|
2179
|
-
});
|
|
2180
|
-
}
|
|
2181
|
-
}
|
|
2182
|
-
if (jsonReplacer) {
|
|
2183
|
-
globalState.replacer = jsonReplacer;
|
|
2184
|
-
}
|
|
2185
|
-
if (jsonReviver) {
|
|
2186
|
-
globalState.reviver = jsonReviver;
|
|
2187
|
-
}
|
|
2188
|
-
}
|
|
2189
|
-
|
|
2190
2182
|
// src/event.ts
|
|
2191
2183
|
function event() {
|
|
2192
2184
|
const obs = observable(0);
|
|
@@ -2217,66 +2209,33 @@ function proxy(get2, set2) {
|
|
|
2217
2209
|
);
|
|
2218
2210
|
}
|
|
2219
2211
|
|
|
2220
|
-
// src/
|
|
2221
|
-
function
|
|
2222
|
-
const
|
|
2223
|
-
if (
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
const { retry } = state;
|
|
2238
|
-
const e = { cancel: false };
|
|
2239
|
-
let value = void 0;
|
|
2240
|
-
if (waitFor) {
|
|
2241
|
-
value = whenReady(waitFor, () => {
|
|
2242
|
-
node.activationState.waitFor = void 0;
|
|
2243
|
-
return fn(e);
|
|
2244
|
-
});
|
|
2245
|
-
} else {
|
|
2246
|
-
value = fn(e);
|
|
2247
|
-
}
|
|
2248
|
-
if (isPromise(value) && retry) {
|
|
2249
|
-
let timeoutRetry;
|
|
2250
|
-
return new Promise((resolve) => {
|
|
2251
|
-
const run = () => {
|
|
2252
|
-
value.then((val) => {
|
|
2253
|
-
node.activationState.persistedRetry = false;
|
|
2254
|
-
resolve(val);
|
|
2255
|
-
}).catch(() => {
|
|
2256
|
-
state.attemptNum++;
|
|
2257
|
-
if (timeoutRetry) {
|
|
2258
|
-
clearTimeout(timeoutRetry);
|
|
2259
|
-
}
|
|
2260
|
-
if (!e.cancel) {
|
|
2261
|
-
timeoutRetry = createRetryTimeout(retry, state.attemptNum, () => {
|
|
2262
|
-
value = fn(e);
|
|
2263
|
-
run();
|
|
2264
|
-
});
|
|
2265
|
-
}
|
|
2266
|
-
}).finally(() => {
|
|
2267
|
-
node.activationState.persistedRetry = false;
|
|
2268
|
-
});
|
|
2269
|
-
};
|
|
2270
|
-
run();
|
|
2212
|
+
// src/syncState.ts
|
|
2213
|
+
function syncState(obs) {
|
|
2214
|
+
const node = getNode(obs);
|
|
2215
|
+
if (!node.state) {
|
|
2216
|
+
node.state = observable({
|
|
2217
|
+
isPersistLoaded: false,
|
|
2218
|
+
isLoaded: false,
|
|
2219
|
+
isPersistEnabled: true,
|
|
2220
|
+
isSyncEnabled: true,
|
|
2221
|
+
isGetting: false,
|
|
2222
|
+
isSetting: false,
|
|
2223
|
+
numPendingSets: 0,
|
|
2224
|
+
syncCount: 0,
|
|
2225
|
+
clearPersist: void 0,
|
|
2226
|
+
reset: () => Promise.resolve(),
|
|
2227
|
+
sync: () => Promise.resolve(),
|
|
2228
|
+
getPendingChanges: () => ({})
|
|
2271
2229
|
});
|
|
2272
2230
|
}
|
|
2273
|
-
return
|
|
2231
|
+
return node.state;
|
|
2274
2232
|
}
|
|
2275
2233
|
|
|
2276
2234
|
// index.ts
|
|
2277
2235
|
var internal = {
|
|
2278
2236
|
createPreviousHandler,
|
|
2279
2237
|
clone,
|
|
2238
|
+
deepMerge,
|
|
2280
2239
|
ensureNodeValue,
|
|
2281
2240
|
findIDKey,
|
|
2282
2241
|
get,
|
|
@@ -2290,7 +2249,6 @@ var internal = {
|
|
|
2290
2249
|
observableFns,
|
|
2291
2250
|
optimized,
|
|
2292
2251
|
peek,
|
|
2293
|
-
runWithRetry,
|
|
2294
2252
|
safeParse,
|
|
2295
2253
|
safeStringify,
|
|
2296
2254
|
set,
|
|
@@ -2301,4 +2259,4 @@ var internal = {
|
|
|
2301
2259
|
tracking
|
|
2302
2260
|
};
|
|
2303
2261
|
|
|
2304
|
-
export { ObservablePrimitiveClass, applyChange, applyChanges, batch, beginBatch, beginTracking, computeSelector, computed,
|
|
2262
|
+
export { 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, isPrimitive, isPromise, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, optimized, proxy, setAtPath, setSilently, setupTracking, shouldIgnoreUnobserved, symbolDelete, syncState, trackSelector, tracking, updateTracking, when, whenReady };
|