@legendapp/state 3.0.0-alpha.20 → 3.0.0-alpha.22
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/index.d.mts +7 -4
- package/index.d.ts +7 -4
- package/index.js +18 -22
- package/index.mjs +18 -22
- package/package.json +1 -1
- package/sync-plugins/crud.js +17 -11
- package/sync-plugins/crud.mjs +18 -12
package/index.d.mts
CHANGED
|
@@ -17,14 +17,17 @@ interface ObservableObjectFunctions<T = Record<string, any>> extends ObservableP
|
|
|
17
17
|
}
|
|
18
18
|
type MapKey<T extends Map<any, any> | WeakMap<any, any>> = Parameters<T['has']>[0];
|
|
19
19
|
type MapValue<T extends Map<any, any> | WeakMap<any, any>> = Parameters<T['get']>[0];
|
|
20
|
-
type ObservableMap<T extends Map<any, any> | WeakMap<any, any>> = Omit<T, 'get' | 'size'> & Omit<ObservablePrimitive<T>, 'get' | 'size'> & {
|
|
20
|
+
type ObservableMap<T extends Map<any, any> | WeakMap<any, any>> = Omit<T, 'get' | 'size' | 'set'> & Omit<ObservablePrimitive<T>, 'get' | 'size'> & {
|
|
21
21
|
get(key: Parameters<T['get']>[0]): Observable<Parameters<T['set']>[1]>;
|
|
22
22
|
get(): T;
|
|
23
|
-
size:
|
|
23
|
+
size: number;
|
|
24
|
+
set(key: MapKey<T>, value: MapValue<T>): Observable<T>;
|
|
24
25
|
assign(value: Record<MapKey<T>, MapValue<T>> | Map<MapKey<T>, MapValue<T>> | WeakMap<MapKey<T>, MapValue<T>>): Observable<T>;
|
|
25
26
|
};
|
|
26
|
-
type
|
|
27
|
-
|
|
27
|
+
type SetValue<T extends Set<any> | WeakSet<any>> = Parameters<T['has']>[0];
|
|
28
|
+
type ObservableSet<T extends Set<any> | WeakSet<any>> = Omit<T, 'size' | 'add'> & Omit<ObservablePrimitive<T>, 'size'> & {
|
|
29
|
+
size: number;
|
|
30
|
+
add: (value: SetValue<T>) => Observable<T>;
|
|
28
31
|
};
|
|
29
32
|
interface ObservableBoolean extends ObservablePrimitive<boolean> {
|
|
30
33
|
toggle(): void;
|
package/index.d.ts
CHANGED
|
@@ -17,14 +17,17 @@ interface ObservableObjectFunctions<T = Record<string, any>> extends ObservableP
|
|
|
17
17
|
}
|
|
18
18
|
type MapKey<T extends Map<any, any> | WeakMap<any, any>> = Parameters<T['has']>[0];
|
|
19
19
|
type MapValue<T extends Map<any, any> | WeakMap<any, any>> = Parameters<T['get']>[0];
|
|
20
|
-
type ObservableMap<T extends Map<any, any> | WeakMap<any, any>> = Omit<T, 'get' | 'size'> & Omit<ObservablePrimitive<T>, 'get' | 'size'> & {
|
|
20
|
+
type ObservableMap<T extends Map<any, any> | WeakMap<any, any>> = Omit<T, 'get' | 'size' | 'set'> & Omit<ObservablePrimitive<T>, 'get' | 'size'> & {
|
|
21
21
|
get(key: Parameters<T['get']>[0]): Observable<Parameters<T['set']>[1]>;
|
|
22
22
|
get(): T;
|
|
23
|
-
size:
|
|
23
|
+
size: number;
|
|
24
|
+
set(key: MapKey<T>, value: MapValue<T>): Observable<T>;
|
|
24
25
|
assign(value: Record<MapKey<T>, MapValue<T>> | Map<MapKey<T>, MapValue<T>> | WeakMap<MapKey<T>, MapValue<T>>): Observable<T>;
|
|
25
26
|
};
|
|
26
|
-
type
|
|
27
|
-
|
|
27
|
+
type SetValue<T extends Set<any> | WeakSet<any>> = Parameters<T['has']>[0];
|
|
28
|
+
type ObservableSet<T extends Set<any> | WeakSet<any>> = Omit<T, 'size' | 'add'> & Omit<ObservablePrimitive<T>, 'size'> & {
|
|
29
|
+
size: number;
|
|
30
|
+
add: (value: SetValue<T>) => Observable<T>;
|
|
28
31
|
};
|
|
29
32
|
interface ObservableBoolean extends ObservablePrimitive<boolean> {
|
|
30
33
|
toggle(): void;
|
package/index.js
CHANGED
|
@@ -31,10 +31,10 @@ function isPromise(obj) {
|
|
|
31
31
|
return obj instanceof Promise;
|
|
32
32
|
}
|
|
33
33
|
function isMap(obj) {
|
|
34
|
-
return obj instanceof Map;
|
|
34
|
+
return obj instanceof Map || obj instanceof WeakMap;
|
|
35
35
|
}
|
|
36
36
|
function isSet(obj) {
|
|
37
|
-
return obj instanceof Set;
|
|
37
|
+
return obj instanceof Set || obj instanceof WeakSet;
|
|
38
38
|
}
|
|
39
39
|
function isNumber(obj) {
|
|
40
40
|
const n = obj;
|
|
@@ -152,22 +152,24 @@ function setNodeValue(node, newValue) {
|
|
|
152
152
|
if (isDelete)
|
|
153
153
|
newValue = void 0;
|
|
154
154
|
const parentValue = node.parent ? ensureNodeValue(parentNode) : parentNode.root;
|
|
155
|
-
const
|
|
155
|
+
const useSetFn = isSet(parentValue);
|
|
156
|
+
const useMapFn = isMap(parentValue);
|
|
157
|
+
const prevValue = useSetFn ? key : useMapFn ? parentValue.get(key) : parentValue[key];
|
|
156
158
|
const isFunc = isFunction(newValue);
|
|
157
159
|
newValue = !parentNode.isAssigning && isFunc && !isFunction(prevValue) ? newValue(prevValue) : newValue;
|
|
158
160
|
if (newValue !== prevValue) {
|
|
159
161
|
try {
|
|
160
162
|
parentNode.isSetting = (parentNode.isSetting || 0) + 1;
|
|
161
|
-
const useMapFn = isMap(parentValue);
|
|
162
163
|
if (isDelete) {
|
|
163
|
-
if (useMapFn) {
|
|
164
|
+
if (useMapFn || useSetFn) {
|
|
164
165
|
parentValue.delete(key);
|
|
165
166
|
} else {
|
|
166
167
|
delete parentValue[key];
|
|
167
168
|
}
|
|
168
169
|
} else {
|
|
169
|
-
|
|
170
|
-
|
|
170
|
+
if (useSetFn) {
|
|
171
|
+
parentValue.add(newValue);
|
|
172
|
+
} else if (useMapFn) {
|
|
171
173
|
parentValue.set(key, newValue);
|
|
172
174
|
} else {
|
|
173
175
|
parentValue[key] = newValue;
|
|
@@ -1369,7 +1371,7 @@ var proxyHandler = {
|
|
|
1369
1371
|
if (targetNode && p !== "onChange") {
|
|
1370
1372
|
return proxyHandler.get(targetNode, p, receiver);
|
|
1371
1373
|
}
|
|
1372
|
-
if (isMap(value) || value
|
|
1374
|
+
if (isMap(value) || isSet(value)) {
|
|
1373
1375
|
const ret = handlerMapSet(node, p, value);
|
|
1374
1376
|
if (ret !== void 0) {
|
|
1375
1377
|
return ret;
|
|
@@ -1461,7 +1463,7 @@ var proxyHandler = {
|
|
|
1461
1463
|
return vProp.bind(value);
|
|
1462
1464
|
}
|
|
1463
1465
|
if (isPrimitive(vProp)) {
|
|
1464
|
-
if (
|
|
1466
|
+
if (p === "length" && isArray(value)) {
|
|
1465
1467
|
updateTracking(node, true);
|
|
1466
1468
|
return vProp;
|
|
1467
1469
|
}
|
|
@@ -1625,7 +1627,8 @@ function deleteFn(node, key) {
|
|
|
1625
1627
|
function handlerMapSet(node, p, value) {
|
|
1626
1628
|
const vProp = value == null ? void 0 : value[p];
|
|
1627
1629
|
if (p === "size") {
|
|
1628
|
-
|
|
1630
|
+
updateTracking(node, true);
|
|
1631
|
+
return value[p];
|
|
1629
1632
|
} else if (isFunction(vProp)) {
|
|
1630
1633
|
return function(a, b, c) {
|
|
1631
1634
|
const l = arguments.length;
|
|
@@ -1636,23 +1639,16 @@ function handlerMapSet(node, p, value) {
|
|
|
1636
1639
|
}
|
|
1637
1640
|
} else if (p === "set") {
|
|
1638
1641
|
if (l === 2) {
|
|
1639
|
-
|
|
1640
|
-
const ret = valueMap.set(a, b);
|
|
1641
|
-
if (prev !== b) {
|
|
1642
|
-
updateNodesAndNotify(getChildNode(node, a), b, prev);
|
|
1643
|
-
}
|
|
1644
|
-
return ret;
|
|
1642
|
+
set(getChildNode(node, a), b);
|
|
1645
1643
|
} else if (l === 1 && isMap(value)) {
|
|
1646
1644
|
set(node, a);
|
|
1647
1645
|
}
|
|
1646
|
+
return getProxy(node);
|
|
1648
1647
|
} else if (p === "delete") {
|
|
1649
1648
|
if (l > 0) {
|
|
1650
1649
|
const prev = value.get ? valueMap.get(a) : a;
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
updateNodesAndNotify(getChildNode(node, a), void 0, prev);
|
|
1654
|
-
}
|
|
1655
|
-
return ret;
|
|
1650
|
+
deleteFn(node, a);
|
|
1651
|
+
return prev !== void 0;
|
|
1656
1652
|
}
|
|
1657
1653
|
} else if (p === "clear") {
|
|
1658
1654
|
const prev = new Map(valueMap);
|
|
@@ -1668,7 +1664,7 @@ function handlerMapSet(node, p, value) {
|
|
|
1668
1664
|
if (!value.has(p)) {
|
|
1669
1665
|
notify(node, ret, prev, 0);
|
|
1670
1666
|
}
|
|
1671
|
-
return
|
|
1667
|
+
return getProxy(node);
|
|
1672
1668
|
}
|
|
1673
1669
|
const fn = observableFns.get(p);
|
|
1674
1670
|
if (fn) {
|
package/index.mjs
CHANGED
|
@@ -29,10 +29,10 @@ 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
33
|
}
|
|
34
34
|
function isSet(obj) {
|
|
35
|
-
return obj instanceof Set;
|
|
35
|
+
return obj instanceof Set || obj instanceof WeakSet;
|
|
36
36
|
}
|
|
37
37
|
function isNumber(obj) {
|
|
38
38
|
const n = obj;
|
|
@@ -150,22 +150,24 @@ function setNodeValue(node, newValue) {
|
|
|
150
150
|
if (isDelete)
|
|
151
151
|
newValue = void 0;
|
|
152
152
|
const parentValue = node.parent ? ensureNodeValue(parentNode) : parentNode.root;
|
|
153
|
-
const
|
|
153
|
+
const useSetFn = isSet(parentValue);
|
|
154
|
+
const useMapFn = isMap(parentValue);
|
|
155
|
+
const prevValue = useSetFn ? key : useMapFn ? parentValue.get(key) : parentValue[key];
|
|
154
156
|
const isFunc = isFunction(newValue);
|
|
155
157
|
newValue = !parentNode.isAssigning && isFunc && !isFunction(prevValue) ? newValue(prevValue) : newValue;
|
|
156
158
|
if (newValue !== prevValue) {
|
|
157
159
|
try {
|
|
158
160
|
parentNode.isSetting = (parentNode.isSetting || 0) + 1;
|
|
159
|
-
const useMapFn = isMap(parentValue);
|
|
160
161
|
if (isDelete) {
|
|
161
|
-
if (useMapFn) {
|
|
162
|
+
if (useMapFn || useSetFn) {
|
|
162
163
|
parentValue.delete(key);
|
|
163
164
|
} else {
|
|
164
165
|
delete parentValue[key];
|
|
165
166
|
}
|
|
166
167
|
} else {
|
|
167
|
-
|
|
168
|
-
|
|
168
|
+
if (useSetFn) {
|
|
169
|
+
parentValue.add(newValue);
|
|
170
|
+
} else if (useMapFn) {
|
|
169
171
|
parentValue.set(key, newValue);
|
|
170
172
|
} else {
|
|
171
173
|
parentValue[key] = newValue;
|
|
@@ -1367,7 +1369,7 @@ var proxyHandler = {
|
|
|
1367
1369
|
if (targetNode && p !== "onChange") {
|
|
1368
1370
|
return proxyHandler.get(targetNode, p, receiver);
|
|
1369
1371
|
}
|
|
1370
|
-
if (isMap(value) || value
|
|
1372
|
+
if (isMap(value) || isSet(value)) {
|
|
1371
1373
|
const ret = handlerMapSet(node, p, value);
|
|
1372
1374
|
if (ret !== void 0) {
|
|
1373
1375
|
return ret;
|
|
@@ -1459,7 +1461,7 @@ var proxyHandler = {
|
|
|
1459
1461
|
return vProp.bind(value);
|
|
1460
1462
|
}
|
|
1461
1463
|
if (isPrimitive(vProp)) {
|
|
1462
|
-
if (
|
|
1464
|
+
if (p === "length" && isArray(value)) {
|
|
1463
1465
|
updateTracking(node, true);
|
|
1464
1466
|
return vProp;
|
|
1465
1467
|
}
|
|
@@ -1623,7 +1625,8 @@ function deleteFn(node, key) {
|
|
|
1623
1625
|
function handlerMapSet(node, p, value) {
|
|
1624
1626
|
const vProp = value == null ? void 0 : value[p];
|
|
1625
1627
|
if (p === "size") {
|
|
1626
|
-
|
|
1628
|
+
updateTracking(node, true);
|
|
1629
|
+
return value[p];
|
|
1627
1630
|
} else if (isFunction(vProp)) {
|
|
1628
1631
|
return function(a, b, c) {
|
|
1629
1632
|
const l = arguments.length;
|
|
@@ -1634,23 +1637,16 @@ function handlerMapSet(node, p, value) {
|
|
|
1634
1637
|
}
|
|
1635
1638
|
} else if (p === "set") {
|
|
1636
1639
|
if (l === 2) {
|
|
1637
|
-
|
|
1638
|
-
const ret = valueMap.set(a, b);
|
|
1639
|
-
if (prev !== b) {
|
|
1640
|
-
updateNodesAndNotify(getChildNode(node, a), b, prev);
|
|
1641
|
-
}
|
|
1642
|
-
return ret;
|
|
1640
|
+
set(getChildNode(node, a), b);
|
|
1643
1641
|
} else if (l === 1 && isMap(value)) {
|
|
1644
1642
|
set(node, a);
|
|
1645
1643
|
}
|
|
1644
|
+
return getProxy(node);
|
|
1646
1645
|
} else if (p === "delete") {
|
|
1647
1646
|
if (l > 0) {
|
|
1648
1647
|
const prev = value.get ? valueMap.get(a) : a;
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
updateNodesAndNotify(getChildNode(node, a), void 0, prev);
|
|
1652
|
-
}
|
|
1653
|
-
return ret;
|
|
1648
|
+
deleteFn(node, a);
|
|
1649
|
+
return prev !== void 0;
|
|
1654
1650
|
}
|
|
1655
1651
|
} else if (p === "clear") {
|
|
1656
1652
|
const prev = new Map(valueMap);
|
|
@@ -1666,7 +1662,7 @@ function handlerMapSet(node, p, value) {
|
|
|
1666
1662
|
if (!value.has(p)) {
|
|
1667
1663
|
notify(node, ret, prev, 0);
|
|
1668
1664
|
}
|
|
1669
|
-
return
|
|
1665
|
+
return getProxy(node);
|
|
1670
1666
|
}
|
|
1671
1667
|
const fn = observableFns.get(p);
|
|
1672
1668
|
if (fn) {
|
package/package.json
CHANGED
package/sync-plugins/crud.js
CHANGED
|
@@ -154,7 +154,7 @@ function syncedCrud(props) {
|
|
|
154
154
|
if (valueAtPath) {
|
|
155
155
|
updates.set(id, getUpdateValue(valueAtPath, prevAtPath));
|
|
156
156
|
} else if (prevAtPath) {
|
|
157
|
-
deletes.add(prevAtPath
|
|
157
|
+
deletes.add(prevAtPath);
|
|
158
158
|
}
|
|
159
159
|
} else if (!updates.has(id)) {
|
|
160
160
|
const previous = state.applyChanges(
|
|
@@ -293,16 +293,22 @@ function syncedCrud(props) {
|
|
|
293
293
|
}
|
|
294
294
|
}),
|
|
295
295
|
...Array.from(deletes).map((valuePrevious) => {
|
|
296
|
-
if (
|
|
297
|
-
deleteFn
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
296
|
+
if (valuePrevious !== state.symbolDelete) {
|
|
297
|
+
if (deleteFn) {
|
|
298
|
+
deleteFn(valuePrevious, params);
|
|
299
|
+
} else if (fieldDeleted && updateFn) {
|
|
300
|
+
const valueId = valuePrevious[fieldId];
|
|
301
|
+
if (valueId) {
|
|
302
|
+
updateFn(
|
|
303
|
+
{ ...valueId ? { [fieldId]: valueId } : {}, [fieldDeleted]: true },
|
|
304
|
+
params
|
|
305
|
+
);
|
|
306
|
+
} else {
|
|
307
|
+
console.error("[legend-state]: deleting item without an id");
|
|
308
|
+
}
|
|
309
|
+
} else {
|
|
310
|
+
console.log("[legend-state] missing delete function");
|
|
311
|
+
}
|
|
306
312
|
}
|
|
307
313
|
})
|
|
308
314
|
]);
|
package/sync-plugins/crud.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isPromise, applyChanges, isNullOrUndefined, setAtPath, isArray, internal, isObservable, getNodeValue } from '@legendapp/state';
|
|
1
|
+
import { isPromise, applyChanges, isNullOrUndefined, setAtPath, symbolDelete, isArray, internal, isObservable, getNodeValue } from '@legendapp/state';
|
|
2
2
|
import { synced, deepEqual, diffObjects } from '@legendapp/state/sync';
|
|
3
3
|
|
|
4
4
|
// src/sync-plugins/crud.ts
|
|
@@ -152,7 +152,7 @@ function syncedCrud(props) {
|
|
|
152
152
|
if (valueAtPath) {
|
|
153
153
|
updates.set(id, getUpdateValue(valueAtPath, prevAtPath));
|
|
154
154
|
} else if (prevAtPath) {
|
|
155
|
-
deletes.add(prevAtPath
|
|
155
|
+
deletes.add(prevAtPath);
|
|
156
156
|
}
|
|
157
157
|
} else if (!updates.has(id)) {
|
|
158
158
|
const previous = applyChanges(
|
|
@@ -291,16 +291,22 @@ function syncedCrud(props) {
|
|
|
291
291
|
}
|
|
292
292
|
}),
|
|
293
293
|
...Array.from(deletes).map((valuePrevious) => {
|
|
294
|
-
if (
|
|
295
|
-
deleteFn
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
294
|
+
if (valuePrevious !== symbolDelete) {
|
|
295
|
+
if (deleteFn) {
|
|
296
|
+
deleteFn(valuePrevious, params);
|
|
297
|
+
} else if (fieldDeleted && updateFn) {
|
|
298
|
+
const valueId = valuePrevious[fieldId];
|
|
299
|
+
if (valueId) {
|
|
300
|
+
updateFn(
|
|
301
|
+
{ ...valueId ? { [fieldId]: valueId } : {}, [fieldDeleted]: true },
|
|
302
|
+
params
|
|
303
|
+
);
|
|
304
|
+
} else {
|
|
305
|
+
console.error("[legend-state]: deleting item without an id");
|
|
306
|
+
}
|
|
307
|
+
} else {
|
|
308
|
+
console.log("[legend-state] missing delete function");
|
|
309
|
+
}
|
|
304
310
|
}
|
|
305
311
|
})
|
|
306
312
|
]);
|