@legendapp/state 3.0.0-alpha.3 → 3.0.0-alpha.31
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 +2066 -0
- package/config.mjs +2064 -0
- package/helpers/trackHistory.js +2 -2
- package/helpers/trackHistory.mjs +2 -2
- package/index.d.mts +25 -302
- package/index.d.ts +25 -302
- package/index.js +293 -322
- package/index.mjs +294 -321
- package/observableInterfaces-CZR3_8mM.d.mts +283 -0
- package/observableInterfaces-CZR3_8mM.d.ts +283 -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/crud.d.mts +21 -24
- package/sync-plugins/crud.d.ts +21 -24
- package/sync-plugins/crud.js +240 -139
- package/sync-plugins/crud.mjs +242 -141
- 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 +27 -10
- package/sync-plugins/keel.d.ts +27 -10
- package/sync-plugins/keel.js +51 -32
- package/sync-plugins/keel.mjs +52 -33
- 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 +71 -197
- package/sync.d.ts +71 -197
- package/sync.js +465 -284
- package/sync.mjs +471 -290
- 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
|
}
|
|
@@ -1004,16 +1022,30 @@ function _when(predicate, effect, checkReady) {
|
|
|
1004
1022
|
if (isPromise(predicate)) {
|
|
1005
1023
|
return effect ? predicate.then(effect) : predicate;
|
|
1006
1024
|
}
|
|
1025
|
+
const isPredicateArray = isArray(predicate);
|
|
1007
1026
|
let value;
|
|
1008
1027
|
let effectValue;
|
|
1009
1028
|
function run(e) {
|
|
1010
|
-
const ret = computeSelector(predicate);
|
|
1029
|
+
const ret = isPredicateArray ? predicate.map((p) => computeSelector(p)) : computeSelector(predicate);
|
|
1011
1030
|
if (isPromise(ret)) {
|
|
1012
1031
|
value = ret;
|
|
1013
1032
|
return void 0;
|
|
1014
|
-
} else
|
|
1015
|
-
|
|
1016
|
-
|
|
1033
|
+
} else {
|
|
1034
|
+
let isOk = true;
|
|
1035
|
+
if (isArray(ret)) {
|
|
1036
|
+
for (let i = 0; i < ret.length; i++) {
|
|
1037
|
+
if (isObservable(ret[i])) {
|
|
1038
|
+
ret[i] = computeSelector(ret[i]);
|
|
1039
|
+
}
|
|
1040
|
+
isOk = isOk && !!(checkReady ? isObservableValueReady(ret[i]) : ret[i]);
|
|
1041
|
+
}
|
|
1042
|
+
} else {
|
|
1043
|
+
isOk = checkReady ? isObservableValueReady(ret) : ret;
|
|
1044
|
+
}
|
|
1045
|
+
if (isOk) {
|
|
1046
|
+
value = ret;
|
|
1047
|
+
e.cancel = true;
|
|
1048
|
+
}
|
|
1017
1049
|
}
|
|
1018
1050
|
return value;
|
|
1019
1051
|
}
|
|
@@ -1065,6 +1097,7 @@ var ArrayLoopers = /* @__PURE__ */ new Set([
|
|
|
1065
1097
|
"filter",
|
|
1066
1098
|
"find",
|
|
1067
1099
|
"findIndex",
|
|
1100
|
+
"flatMap",
|
|
1068
1101
|
"forEach",
|
|
1069
1102
|
"join",
|
|
1070
1103
|
"map",
|
|
@@ -1094,7 +1127,7 @@ function collectionSetter(node, target, prop, ...args) {
|
|
|
1094
1127
|
const prevValue = target.slice();
|
|
1095
1128
|
const ret = target[prop].apply(target, args);
|
|
1096
1129
|
if (node) {
|
|
1097
|
-
const hasParent =
|
|
1130
|
+
const hasParent = isChildNode(node);
|
|
1098
1131
|
const key = hasParent ? node.key : "_";
|
|
1099
1132
|
const parentValue = hasParent ? getNodeValue(node.parent) : node.root;
|
|
1100
1133
|
parentValue[key] = prevValue;
|
|
@@ -1118,7 +1151,7 @@ function updateNodes(parent, obj, prevValue) {
|
|
|
1118
1151
|
}
|
|
1119
1152
|
__devUpdateNodes.add(obj);
|
|
1120
1153
|
}
|
|
1121
|
-
if (isObject(obj) && obj
|
|
1154
|
+
if (isObject(obj) && isOpaqueObject(obj) || isObject(prevValue) && isOpaqueObject(prevValue)) {
|
|
1122
1155
|
const isDiff = obj !== prevValue;
|
|
1123
1156
|
if (isDiff) {
|
|
1124
1157
|
if (parent.listeners || parent.listenersImmediate) {
|
|
@@ -1306,10 +1339,10 @@ var proxyHandler = {
|
|
|
1306
1339
|
if (p === symbolGetNode) {
|
|
1307
1340
|
return node;
|
|
1308
1341
|
}
|
|
1309
|
-
if (p === "apply") {
|
|
1342
|
+
if (p === "apply" || p === "call") {
|
|
1310
1343
|
const nodeValue = getNodeValue(node);
|
|
1311
1344
|
if (isFunction(nodeValue)) {
|
|
1312
|
-
return nodeValue
|
|
1345
|
+
return nodeValue[p];
|
|
1313
1346
|
}
|
|
1314
1347
|
}
|
|
1315
1348
|
let value = peekInternal(
|
|
@@ -1317,11 +1350,14 @@ var proxyHandler = {
|
|
|
1317
1350
|
/*activateRecursive*/
|
|
1318
1351
|
p === "get" || p === "peek"
|
|
1319
1352
|
);
|
|
1353
|
+
if (p === symbolIterator) {
|
|
1354
|
+
return !value || isPrimitive(value) ? void 0 : value[p];
|
|
1355
|
+
}
|
|
1320
1356
|
const targetNode = node.linkedToNode || (value == null ? void 0 : value[symbolGetNode]);
|
|
1321
1357
|
if (targetNode && p !== "onChange") {
|
|
1322
1358
|
return proxyHandler.get(targetNode, p, receiver);
|
|
1323
1359
|
}
|
|
1324
|
-
if (isMap(value) || value
|
|
1360
|
+
if (isMap(value) || isSet(value)) {
|
|
1325
1361
|
const ret = handlerMapSet(node, p, value);
|
|
1326
1362
|
if (ret !== void 0) {
|
|
1327
1363
|
return ret;
|
|
@@ -1351,7 +1387,7 @@ var proxyHandler = {
|
|
|
1351
1387
|
return property.get(node);
|
|
1352
1388
|
}
|
|
1353
1389
|
let vProp = value == null ? void 0 : value[p];
|
|
1354
|
-
if (isObject(value) && value
|
|
1390
|
+
if (isObject(value) && isOpaqueObject(value)) {
|
|
1355
1391
|
return vProp;
|
|
1356
1392
|
}
|
|
1357
1393
|
const fnOrComputed = (_a = node.functions) == null ? void 0 : _a.get(p);
|
|
@@ -1413,7 +1449,7 @@ var proxyHandler = {
|
|
|
1413
1449
|
return vProp.bind(value);
|
|
1414
1450
|
}
|
|
1415
1451
|
if (isPrimitive(vProp)) {
|
|
1416
|
-
if (
|
|
1452
|
+
if (p === "length" && isArray(value)) {
|
|
1417
1453
|
updateTracking(node, true);
|
|
1418
1454
|
return vProp;
|
|
1419
1455
|
}
|
|
@@ -1517,11 +1553,17 @@ function setKey(node, key, newValue, level) {
|
|
|
1517
1553
|
} else {
|
|
1518
1554
|
const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
|
|
1519
1555
|
const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
|
|
1520
|
-
if (!equals(savedValue, prevValue)) {
|
|
1521
|
-
updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level);
|
|
1522
|
-
}
|
|
1523
1556
|
if (!isPrim) {
|
|
1524
|
-
|
|
1557
|
+
let parent = childNode;
|
|
1558
|
+
do {
|
|
1559
|
+
parent.needsExtract = true;
|
|
1560
|
+
parent.recursivelyAutoActivated = false;
|
|
1561
|
+
} while (parent = parent.parent);
|
|
1562
|
+
}
|
|
1563
|
+
const notify2 = !equals(savedValue, prevValue);
|
|
1564
|
+
const forceNotify = !notify2 && childNode.isComputing && !isPrim;
|
|
1565
|
+
if (notify2 || forceNotify) {
|
|
1566
|
+
updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
|
|
1525
1567
|
}
|
|
1526
1568
|
extractFunctionOrComputed(node, key, savedValue);
|
|
1527
1569
|
}
|
|
@@ -1536,6 +1578,8 @@ function assign(node, value) {
|
|
|
1536
1578
|
const currentValue = getNodeValue(node);
|
|
1537
1579
|
if (isMap(currentValue)) {
|
|
1538
1580
|
value.forEach((value2, key) => currentValue.set(key, value2));
|
|
1581
|
+
} else {
|
|
1582
|
+
set(node, value);
|
|
1539
1583
|
}
|
|
1540
1584
|
} else {
|
|
1541
1585
|
node.isAssigning = (node.isAssigning || 0) + 1;
|
|
@@ -1549,7 +1593,7 @@ function assign(node, value) {
|
|
|
1549
1593
|
return proxy2;
|
|
1550
1594
|
}
|
|
1551
1595
|
function deleteFn(node, key) {
|
|
1552
|
-
if (key === void 0 &&
|
|
1596
|
+
if (key === void 0 && isChildNode(node)) {
|
|
1553
1597
|
key = node.key;
|
|
1554
1598
|
node = node.parent;
|
|
1555
1599
|
}
|
|
@@ -1569,7 +1613,8 @@ function deleteFn(node, key) {
|
|
|
1569
1613
|
function handlerMapSet(node, p, value) {
|
|
1570
1614
|
const vProp = value == null ? void 0 : value[p];
|
|
1571
1615
|
if (p === "size") {
|
|
1572
|
-
|
|
1616
|
+
updateTracking(node, true);
|
|
1617
|
+
return value[p];
|
|
1573
1618
|
} else if (isFunction(vProp)) {
|
|
1574
1619
|
return function(a, b, c) {
|
|
1575
1620
|
const l = arguments.length;
|
|
@@ -1580,23 +1625,16 @@ function handlerMapSet(node, p, value) {
|
|
|
1580
1625
|
}
|
|
1581
1626
|
} else if (p === "set") {
|
|
1582
1627
|
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;
|
|
1628
|
+
set(getChildNode(node, a), b);
|
|
1589
1629
|
} else if (l === 1 && isMap(value)) {
|
|
1590
1630
|
set(node, a);
|
|
1591
1631
|
}
|
|
1632
|
+
return getProxy(node);
|
|
1592
1633
|
} else if (p === "delete") {
|
|
1593
1634
|
if (l > 0) {
|
|
1594
1635
|
const prev = value.get ? valueMap.get(a) : a;
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
updateNodesAndNotify(getChildNode(node, a), void 0, prev);
|
|
1598
|
-
}
|
|
1599
|
-
return ret;
|
|
1636
|
+
deleteFn(node, a);
|
|
1637
|
+
return prev !== void 0;
|
|
1600
1638
|
}
|
|
1601
1639
|
} else if (p === "clear") {
|
|
1602
1640
|
const prev = new Map(valueMap);
|
|
@@ -1612,7 +1650,7 @@ function handlerMapSet(node, p, value) {
|
|
|
1612
1650
|
if (!value.has(p)) {
|
|
1613
1651
|
notify(node, ret, prev, 0);
|
|
1614
1652
|
}
|
|
1615
|
-
return
|
|
1653
|
+
return getProxy(node);
|
|
1616
1654
|
}
|
|
1617
1655
|
const fn = observableFns.get(p);
|
|
1618
1656
|
if (fn) {
|
|
@@ -1632,20 +1670,20 @@ function handlerMapSet(node, p, value) {
|
|
|
1632
1670
|
};
|
|
1633
1671
|
}
|
|
1634
1672
|
}
|
|
1635
|
-
function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level) {
|
|
1673
|
+
function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
|
|
1636
1674
|
if (!childNode)
|
|
1637
1675
|
childNode = node;
|
|
1638
1676
|
beginBatch();
|
|
1639
1677
|
if (isPrim === void 0) {
|
|
1640
1678
|
isPrim = isPrimitive(newValue);
|
|
1641
1679
|
}
|
|
1642
|
-
let hasADiff = isPrim;
|
|
1680
|
+
let hasADiff = forceNotify || isPrim;
|
|
1643
1681
|
let whenOptimizedOnlyIf = false;
|
|
1644
1682
|
if (!isPrim || prevValue && !isPrimitive(prevValue)) {
|
|
1645
1683
|
if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
|
|
1646
1684
|
__devUpdateNodes.clear();
|
|
1647
1685
|
}
|
|
1648
|
-
hasADiff = updateNodes(childNode, newValue, prevValue);
|
|
1686
|
+
hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
|
|
1649
1687
|
if (isArray(newValue)) {
|
|
1650
1688
|
whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
|
|
1651
1689
|
}
|
|
@@ -1662,6 +1700,7 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
|
|
|
1662
1700
|
endBatch();
|
|
1663
1701
|
}
|
|
1664
1702
|
function extractPromise(node, value, setter) {
|
|
1703
|
+
const numGets = node.numGets = (node.numGets || 0) + 1;
|
|
1665
1704
|
if (!node.state) {
|
|
1666
1705
|
node.state = createObservable(
|
|
1667
1706
|
{
|
|
@@ -1673,11 +1712,14 @@ function extractPromise(node, value, setter) {
|
|
|
1673
1712
|
);
|
|
1674
1713
|
}
|
|
1675
1714
|
value.then((value2) => {
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1715
|
+
if (numGets >= (node.getNumResolved || 0)) {
|
|
1716
|
+
node.getNumResolved = node.numGets;
|
|
1717
|
+
setter ? setter({ value: value2 }) : set(node, value2);
|
|
1718
|
+
node.state.assign({
|
|
1719
|
+
isLoaded: true,
|
|
1720
|
+
error: void 0
|
|
1721
|
+
});
|
|
1722
|
+
}
|
|
1681
1723
|
}).catch((error) => {
|
|
1682
1724
|
node.state.error.set(error);
|
|
1683
1725
|
});
|
|
@@ -1694,6 +1736,7 @@ function extractFunctionOrComputed(node, k, v) {
|
|
|
1694
1736
|
const childNode = getChildNode(node, k, fn);
|
|
1695
1737
|
const targetNode = getNode(v);
|
|
1696
1738
|
const initialValue = peek(targetNode);
|
|
1739
|
+
setToObservable(childNode, v);
|
|
1697
1740
|
setNodeValue(childNode, initialValue);
|
|
1698
1741
|
return getNodeValue(childNode);
|
|
1699
1742
|
} else if (typeof v === "function") {
|
|
@@ -1726,7 +1769,9 @@ function peekInternal(node, activateRecursive) {
|
|
|
1726
1769
|
}
|
|
1727
1770
|
isFlushing = false;
|
|
1728
1771
|
let value = getNodeValue(node);
|
|
1729
|
-
|
|
1772
|
+
if (!globalState.isLoadingLocal) {
|
|
1773
|
+
value = checkLazy(node, value, !!activateRecursive);
|
|
1774
|
+
}
|
|
1730
1775
|
return value;
|
|
1731
1776
|
}
|
|
1732
1777
|
function checkLazy(node, value, activateRecursive) {
|
|
@@ -1741,10 +1786,12 @@ function checkLazy(node, value, activateRecursive) {
|
|
|
1741
1786
|
} else {
|
|
1742
1787
|
if (node.parent) {
|
|
1743
1788
|
const parentValue = getNodeValue(node.parent);
|
|
1744
|
-
if (
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1789
|
+
if (isFunction(value)) {
|
|
1790
|
+
if (parentValue) {
|
|
1791
|
+
delete parentValue[node.key];
|
|
1792
|
+
} else {
|
|
1793
|
+
node.root._ = void 0;
|
|
1794
|
+
}
|
|
1748
1795
|
}
|
|
1749
1796
|
}
|
|
1750
1797
|
value = activateNodeFunction(node, lazyFn);
|
|
@@ -1833,7 +1880,9 @@ function activateNodeFunction(node, lazyFn) {
|
|
|
1833
1880
|
var _a, _b, _c, _d;
|
|
1834
1881
|
if (isFirst) {
|
|
1835
1882
|
isFirst = false;
|
|
1836
|
-
|
|
1883
|
+
if (isFunction(getNodeValue(node))) {
|
|
1884
|
+
setNodeValue(node, void 0);
|
|
1885
|
+
}
|
|
1837
1886
|
} else if (!isFlushing && refreshFn) {
|
|
1838
1887
|
if (shouldIgnoreUnobserved(node, refreshFn)) {
|
|
1839
1888
|
ignoreThisUpdate = true;
|
|
@@ -1842,14 +1891,15 @@ function activateNodeFunction(node, lazyFn) {
|
|
|
1842
1891
|
}
|
|
1843
1892
|
let value = activateFn();
|
|
1844
1893
|
let didSetToObs = false;
|
|
1845
|
-
|
|
1846
|
-
|
|
1894
|
+
const isObs = isObservable(value);
|
|
1895
|
+
if (isObs || node.linkedToNode) {
|
|
1896
|
+
didSetToObs = isObs;
|
|
1847
1897
|
value = setToObservable(node, value);
|
|
1848
1898
|
}
|
|
1849
|
-
if (isFunction(value)) {
|
|
1899
|
+
if (isFunction(value) && value.length === 0) {
|
|
1850
1900
|
value = value();
|
|
1851
1901
|
}
|
|
1852
|
-
const activated = !
|
|
1902
|
+
const activated = !isObs ? value == null ? void 0 : value[symbolLinked] : void 0;
|
|
1853
1903
|
if (activated) {
|
|
1854
1904
|
node.activationState = activated;
|
|
1855
1905
|
value = void 0;
|
|
@@ -1904,16 +1954,14 @@ function activateNodeFunction(node, lazyFn) {
|
|
|
1904
1954
|
}
|
|
1905
1955
|
} else {
|
|
1906
1956
|
activatedValue = value;
|
|
1907
|
-
|
|
1957
|
+
const isLoaded = node.state.isLoaded.peek();
|
|
1958
|
+
if (isLoaded || !isFunction(value)) {
|
|
1908
1959
|
node.isComputing = true;
|
|
1909
1960
|
set(node, value);
|
|
1910
1961
|
node.isComputing = false;
|
|
1911
|
-
}
|
|
1912
|
-
|
|
1913
|
-
node.state.assign({
|
|
1914
|
-
isLoaded: true,
|
|
1915
|
-
error: void 0
|
|
1916
|
-
});
|
|
1962
|
+
}
|
|
1963
|
+
if (!isLoaded) {
|
|
1964
|
+
node.state.assign({ isLoaded: true, error: void 0 });
|
|
1917
1965
|
}
|
|
1918
1966
|
}
|
|
1919
1967
|
}
|
|
@@ -1954,14 +2002,14 @@ function activateNodeBase(node, value) {
|
|
|
1954
2002
|
if (allChanges.length > 0) {
|
|
1955
2003
|
let changes;
|
|
1956
2004
|
let value2;
|
|
1957
|
-
let
|
|
1958
|
-
let
|
|
2005
|
+
let isFromPersist = false;
|
|
2006
|
+
let isFromSync = false;
|
|
1959
2007
|
let getPrevious;
|
|
1960
2008
|
if (listenerParams) {
|
|
1961
2009
|
changes = listenerParams.changes;
|
|
1962
2010
|
value2 = listenerParams.value;
|
|
1963
|
-
|
|
1964
|
-
|
|
2011
|
+
isFromPersist = listenerParams.isFromPersist;
|
|
2012
|
+
isFromSync = listenerParams.isFromSync;
|
|
1965
2013
|
getPrevious = listenerParams.getPrevious;
|
|
1966
2014
|
} else {
|
|
1967
2015
|
changes = allChanges;
|
|
@@ -1981,8 +2029,8 @@ function activateNodeBase(node, value) {
|
|
|
1981
2029
|
setFn({
|
|
1982
2030
|
value: value2,
|
|
1983
2031
|
changes,
|
|
1984
|
-
|
|
1985
|
-
|
|
2032
|
+
isFromPersist,
|
|
2033
|
+
isFromSync,
|
|
1986
2034
|
getPrevious
|
|
1987
2035
|
});
|
|
1988
2036
|
node.isComputing = false;
|
|
@@ -2017,26 +2065,31 @@ function activateNodeBase(node, value) {
|
|
|
2017
2065
|
}
|
|
2018
2066
|
function setToObservable(node, value) {
|
|
2019
2067
|
var _a;
|
|
2020
|
-
const linkedNode = getNode(value);
|
|
2068
|
+
const linkedNode = value ? getNode(value) : void 0;
|
|
2021
2069
|
if (linkedNode !== node && (linkedNode == null ? void 0 : linkedNode.linkedToNode) !== node) {
|
|
2022
2070
|
node.linkedToNode = linkedNode;
|
|
2023
|
-
linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
|
|
2024
|
-
linkedNode.linkedFromNodes.add(node);
|
|
2025
2071
|
(_a = node.linkedToNodeDispose) == null ? void 0 : _a.call(node);
|
|
2026
|
-
|
|
2027
|
-
linkedNode
|
|
2028
|
-
()
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2072
|
+
if (linkedNode) {
|
|
2073
|
+
linkedNode.linkedFromNodes || (linkedNode.linkedFromNodes = /* @__PURE__ */ new Set());
|
|
2074
|
+
linkedNode.linkedFromNodes.add(node);
|
|
2075
|
+
node.linkedToNodeDispose = onChange(
|
|
2076
|
+
linkedNode,
|
|
2077
|
+
() => {
|
|
2078
|
+
value = peekInternal(linkedNode);
|
|
2079
|
+
if (!isFunction(value)) {
|
|
2080
|
+
set(node, value);
|
|
2081
|
+
}
|
|
2082
|
+
},
|
|
2083
|
+
{ initial: true },
|
|
2084
|
+
/* @__PURE__ */ new Set([node])
|
|
2085
|
+
);
|
|
2086
|
+
}
|
|
2035
2087
|
}
|
|
2036
2088
|
return value;
|
|
2037
2089
|
}
|
|
2038
2090
|
function recursivelyAutoActivate(obj, node) {
|
|
2039
|
-
if (isObject(obj) || isArray(obj)) {
|
|
2091
|
+
if (!node.recursivelyAutoActivated && (isObject(obj) || isArray(obj)) && !isOpaqueObject(obj)) {
|
|
2092
|
+
node.recursivelyAutoActivated = true;
|
|
2040
2093
|
const pathStack = [];
|
|
2041
2094
|
const getNodeAtPath2 = () => {
|
|
2042
2095
|
var _a;
|
|
@@ -2054,27 +2107,29 @@ function recursivelyAutoActivate(obj, node) {
|
|
|
2054
2107
|
}
|
|
2055
2108
|
function recursivelyAutoActivateInner(obj, pathStack, getNodeAtPath2) {
|
|
2056
2109
|
var _a;
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2110
|
+
if ((isObject(obj) || isArray(obj)) && !isOpaqueObject(obj)) {
|
|
2111
|
+
for (const key in obj) {
|
|
2112
|
+
if (hasOwnProperty.call(obj, key)) {
|
|
2113
|
+
const value = obj[key];
|
|
2114
|
+
if (isObservable(value)) {
|
|
2115
|
+
const childNode = getNodeAtPath2();
|
|
2116
|
+
extractFunctionOrComputed(childNode, key, value);
|
|
2117
|
+
delete childNode.lazy;
|
|
2118
|
+
} else {
|
|
2119
|
+
const linkedOptions = isFunction(value) && ((_a = value.prototype) == null ? void 0 : _a[symbolLinked]);
|
|
2120
|
+
if (linkedOptions) {
|
|
2121
|
+
const activate = linkedOptions.activate;
|
|
2122
|
+
if (!activate || activate === "auto") {
|
|
2123
|
+
const childNode = getNodeAtPath2();
|
|
2124
|
+
peek(getChildNode(childNode, key, value));
|
|
2125
|
+
}
|
|
2071
2126
|
}
|
|
2072
2127
|
}
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2128
|
+
if (typeof value === "object") {
|
|
2129
|
+
pathStack.push({ key, value });
|
|
2130
|
+
recursivelyAutoActivateInner(value, pathStack, getNodeAtPath2);
|
|
2131
|
+
pathStack.pop();
|
|
2132
|
+
}
|
|
2078
2133
|
}
|
|
2079
2134
|
}
|
|
2080
2135
|
}
|
|
@@ -2130,16 +2185,6 @@ function observable(value) {
|
|
|
2130
2185
|
function observablePrimitive(value) {
|
|
2131
2186
|
return createObservable(value, true, extractPromise, getProxy, ObservablePrimitiveClass);
|
|
2132
2187
|
}
|
|
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
2188
|
|
|
2144
2189
|
// src/computed.ts
|
|
2145
2190
|
function computed(get2, set2) {
|
|
@@ -2148,45 +2193,6 @@ function computed(get2, set2) {
|
|
|
2148
2193
|
);
|
|
2149
2194
|
}
|
|
2150
2195
|
|
|
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
2196
|
// src/event.ts
|
|
2191
2197
|
function event() {
|
|
2192
2198
|
const obs = observable(0);
|
|
@@ -2217,66 +2223,34 @@ function proxy(get2, set2) {
|
|
|
2217
2223
|
);
|
|
2218
2224
|
}
|
|
2219
2225
|
|
|
2220
|
-
// src/
|
|
2221
|
-
function
|
|
2222
|
-
const
|
|
2223
|
-
if (
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
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();
|
|
2226
|
+
// src/syncState.ts
|
|
2227
|
+
function syncState(obs) {
|
|
2228
|
+
const node = getNode(obs);
|
|
2229
|
+
if (!node.state) {
|
|
2230
|
+
node.state = observable({
|
|
2231
|
+
isPersistLoaded: false,
|
|
2232
|
+
isLoaded: false,
|
|
2233
|
+
isPersistEnabled: true,
|
|
2234
|
+
isSyncEnabled: true,
|
|
2235
|
+
isGetting: false,
|
|
2236
|
+
isSetting: false,
|
|
2237
|
+
numPendingGets: 0,
|
|
2238
|
+
numPendingSets: 0,
|
|
2239
|
+
syncCount: 0,
|
|
2240
|
+
clearPersist: void 0,
|
|
2241
|
+
reset: () => Promise.resolve(),
|
|
2242
|
+
sync: () => Promise.resolve(),
|
|
2243
|
+
getPendingChanges: () => ({})
|
|
2271
2244
|
});
|
|
2272
2245
|
}
|
|
2273
|
-
return
|
|
2246
|
+
return node.state;
|
|
2274
2247
|
}
|
|
2275
2248
|
|
|
2276
2249
|
// index.ts
|
|
2277
2250
|
var internal = {
|
|
2278
2251
|
createPreviousHandler,
|
|
2279
2252
|
clone,
|
|
2253
|
+
deepMerge,
|
|
2280
2254
|
ensureNodeValue,
|
|
2281
2255
|
findIDKey,
|
|
2282
2256
|
get,
|
|
@@ -2290,7 +2264,6 @@ var internal = {
|
|
|
2290
2264
|
observableFns,
|
|
2291
2265
|
optimized,
|
|
2292
2266
|
peek,
|
|
2293
|
-
runWithRetry,
|
|
2294
2267
|
safeParse,
|
|
2295
2268
|
safeStringify,
|
|
2296
2269
|
set,
|
|
@@ -2301,4 +2274,4 @@ var internal = {
|
|
|
2301
2274
|
tracking
|
|
2302
2275
|
};
|
|
2303
2276
|
|
|
2304
|
-
export { ObservablePrimitiveClass, applyChange, applyChanges, batch, beginBatch, beginTracking, computeSelector, computed,
|
|
2277
|
+
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 };
|