@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 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: ImmutableObservableBase<number>;
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 ObservableSet<T extends Set<any> | WeakSet<any>> = Omit<T, 'size'> & Omit<ObservablePrimitive<T>, 'size'> & {
27
- size: ImmutableObservableBase<number>;
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: ImmutableObservableBase<number>;
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 ObservableSet<T extends Set<any> | WeakSet<any>> = Omit<T, 'size'> & Omit<ObservablePrimitive<T>, 'size'> & {
27
- size: ImmutableObservableBase<number>;
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 prevValue = parentValue[key];
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
- const useMapFn2 = isMap(parentValue);
170
- if (useMapFn2) {
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 instanceof WeakMap || value instanceof Set || value instanceof WeakSet) {
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 (isArray(value) && p === "length") {
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
- return getProxy(node, p);
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
- const prev = valueMap.get(a);
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
- const ret = value.delete(a);
1652
- if (ret) {
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 ret;
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 prevValue = parentValue[key];
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
- const useMapFn2 = isMap(parentValue);
168
- if (useMapFn2) {
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 instanceof WeakMap || value instanceof Set || value instanceof WeakSet) {
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 (isArray(value) && p === "length") {
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
- return getProxy(node, p);
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
- const prev = valueMap.get(a);
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
- const ret = value.delete(a);
1650
- if (ret) {
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 ret;
1665
+ return getProxy(node);
1670
1666
  }
1671
1667
  const fn = observableFns.get(p);
1672
1668
  if (fn) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@legendapp/state",
3
- "version": "3.0.0-alpha.20",
3
+ "version": "3.0.0-alpha.22",
4
4
  "description": "legend-state",
5
5
  "sideEffects": false,
6
6
  "private": false,
@@ -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 == null ? void 0 : prevAtPath.id);
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 (deleteFn) {
297
- deleteFn(valuePrevious, params);
298
- } else if (fieldDeleted && updateFn) {
299
- const valueId = valuePrevious[fieldId];
300
- updateFn(
301
- { ...valueId ? { [fieldId]: valueId } : {}, [fieldDeleted]: true },
302
- params
303
- );
304
- } else {
305
- console.log("[legend-state] missing delete function");
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
  ]);
@@ -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 == null ? void 0 : prevAtPath.id);
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 (deleteFn) {
295
- deleteFn(valuePrevious, params);
296
- } else if (fieldDeleted && updateFn) {
297
- const valueId = valuePrevious[fieldId];
298
- updateFn(
299
- { ...valueId ? { [fieldId]: valueId } : {}, [fieldDeleted]: true },
300
- params
301
- );
302
- } else {
303
- console.log("[legend-state] missing delete function");
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
  ]);