@legendapp/state 3.0.0-beta.42 → 3.0.0-beta.44

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.
@@ -1,4 +1,5 @@
1
1
  import { FCReactiveObject } from '@legendapp/state/react';
2
+ import { JSX } from 'react';
2
3
 
3
4
  declare function enableReactComponents(): void;
4
5
  declare module '@legendapp/state/react' {
@@ -1,4 +1,5 @@
1
1
  import { FCReactiveObject } from '@legendapp/state/react';
2
+ import { JSX } from 'react';
2
3
 
3
4
  declare function enableReactComponents(): void;
4
5
  declare module '@legendapp/state/react' {
@@ -1,3 +1,4 @@
1
+ import { JSX } from 'react';
1
2
  import { FCReactiveObject, FCReactive } from '@legendapp/state/react';
2
3
  import { ActivityIndicator, ActivityIndicatorProps, Button, ButtonProps, FlatList, FlatListProps, Image, ImageProps, Pressable, PressableProps, ScrollView, ScrollViewProps, SectionList, SectionListProps, Switch, SwitchProps, Text, TextProps, TextInput, TextInputProps, TouchableWithoutFeedback, TouchableWithoutFeedbackProps, View, ViewProps } from 'react-native';
3
4
 
@@ -1,3 +1,4 @@
1
+ import { JSX } from 'react';
1
2
  import { FCReactiveObject, FCReactive } from '@legendapp/state/react';
2
3
  import { ActivityIndicator, ActivityIndicatorProps, Button, ButtonProps, FlatList, FlatListProps, Image, ImageProps, Pressable, PressableProps, ScrollView, ScrollViewProps, SectionList, SectionListProps, Switch, SwitchProps, Text, TextProps, TextInput, TextInputProps, TouchableWithoutFeedback, TouchableWithoutFeedbackProps, View, ViewProps } from 'react-native';
3
4
 
package/index.d.mts CHANGED
@@ -5,9 +5,9 @@ type RemoveIndex<T> = {
5
5
  };
6
6
  type BuiltIns = String | Boolean | Number | Date | Error | RegExp | Array<any> | Function | Promise<any>;
7
7
  type IsUserDefinedObject<T> = T extends Function | BuiltIns | any[] ? false : T extends object ? true : false;
8
- type RemoveObservables<T> = T extends ImmutableObservableBase<infer t> ? t : T extends ImmutableObservableBase<infer t>[] ? t[] : IsUserDefinedObject<T> extends true ? {
8
+ type RemoveObservables<T> = T extends OpaqueObject<infer t> ? t : T extends ImmutableObservableBase<infer t> ? t : T extends ImmutableObservableBase<infer t>[] ? t[] : IsUserDefinedObject<T> extends true ? {
9
9
  [K in keyof T]: RemoveObservables<T[K]>;
10
- } : T extends ImmutableObservableBase<infer TObs> ? TObs : T extends () => infer TRet ? RemoveObservables<TRet> & T : T extends (key: infer TKey extends string | number) => infer TRet ? Record<TKey, RemoveObservables<TRet>> & T : T extends OpaqueObject<infer TObj> ? TObj : T;
10
+ } : T extends ImmutableObservableBase<infer TObs> ? TObs : T extends () => infer TRet ? RemoveObservables<TRet> & T : T extends (key: infer TKey extends string | number) => infer TRet ? Record<TKey, RemoveObservables<TRet>> & T : T;
11
11
  interface ObservableArray<T, U> extends ObservablePrimitive<T>, Pick<Array<Observable<U>>, ArrayOverrideFnNames>, Omit<RemoveIndex<Array<U>>, ArrayOverrideFnNames> {
12
12
  }
13
13
  interface ObservableObjectFns<T> {
@@ -29,7 +29,7 @@ type ObservableSet<T extends Set<any> | WeakSet<any>> = Omit<T, 'size' | 'add'>
29
29
  size: number;
30
30
  add: (value: SetValue<T>) => Observable<T>;
31
31
  };
32
- interface ObservableBoolean extends ObservablePrimitive<boolean> {
32
+ interface ObservableBoolean<T = any> extends ObservablePrimitive<T> {
33
33
  toggle(): void;
34
34
  }
35
35
  interface ObservablePrimitive<T> extends ImmutableObservableBase<T>, MutableObservableBase<T> {
@@ -87,7 +87,7 @@ type ObservableFunction<T> = T extends () => infer t ? t | (() => t) : T;
87
87
  type IsLookupFunction<T> = T extends (...args: infer P) => any ? P extends {
88
88
  length: 1;
89
89
  } ? P[0] extends string | ObservablePrimitive<string> | number | ObservablePrimitive<number> ? true : false : false : false;
90
- type ObservableNode<T, NT = NonNullable<T>> = [NT] extends [never] ? ObservablePrimitive<T> : IsStrictAny<T> extends true ? ObservableAny : [T] extends [Promise<infer t>] ? ObservableNode<t> : [T] extends [(key: infer K extends string) => infer t] ? [t] extends [ImmutableObservableBase<any>] ? IsLookupFunction<T> extends true ? Observable<Record<K, t>> : t : IsLookupFunction<T> extends true ? Observable<Record<K, t>> & T : Observable<ObservableFunction<t>> : [NT] extends [ImmutableObservableBase<any>] ? NT : [NT] extends [Primitive$1] ? [NT] extends [boolean] ? ObservableBoolean : ObservablePrimitive<T> : NT extends Map<any, any> | WeakMap<any, any> ? ObservableMap<NT> : NT extends Set<infer U> ? ObservableSet<Set<UndefinedIf<U, IsNullable<T>>>> : NT extends WeakSet<any> ? ObservableSet<NT> : NT extends Array<infer U> ? ObservableArray<T, U> & ObservableChildren<T> : ObservableObject<T> & {};
90
+ type ObservableNode<T, NT = NonNullable<T>> = [NT] extends [never] ? ObservablePrimitive<T> : IsStrictAny<T> extends true ? ObservableAny : [T] extends [Promise<infer t>] ? ObservableNode<t> : [T] extends [(key: infer K extends string) => infer t] ? [t] extends [ImmutableObservableBase<any>] ? IsLookupFunction<T> extends true ? Observable<Record<K, t>> : t : IsLookupFunction<T> extends true ? Observable<Record<K, t>> & T : Observable<ObservableFunction<t>> : [NT] extends [ImmutableObservableBase<any>] ? NT : [NT] extends [Primitive$1] ? [NT] extends [boolean] ? ObservableBoolean<T> : ObservablePrimitive<T> : NT extends Map<any, any> | WeakMap<any, any> ? ObservableMap<NT> : NT extends Set<infer U> ? ObservableSet<Set<UndefinedIf<U, IsNullable<T>>>> : NT extends WeakSet<any> ? ObservableSet<NT> : NT extends Array<infer U> ? ObservableArray<T, U> & ObservableChildren<T> : ObservableObject<T> & {};
91
91
  type Observable<T = any> = ObservableNode<T> & {};
92
92
  type ObservableParam<T = any> = ImmutableObservableSimple<T> & MutableObservableSimple;
93
93
  type FixExpanded<T> = [T] extends [boolean] ? boolean : T;
@@ -146,6 +146,9 @@ interface Change {
146
146
  valueAtPath: any;
147
147
  prevAtPath: any;
148
148
  }
149
+ interface ChangeWithPathStr extends Change {
150
+ pathStr: string;
151
+ }
149
152
  type RecordValue<T> = T extends Record<string, infer t> ? t : never;
150
153
  type ArrayValue<T> = T extends Array<infer t> ? t : never;
151
154
  type ObservableValue<T> = T extends Observable<infer t> ? t : never;
@@ -253,8 +256,13 @@ interface UpdateFnParams<T = any> {
253
256
  lastSync?: number | undefined;
254
257
  changes?: Change[];
255
258
  }
256
- interface UpdateSetFnParams<T = any> extends UpdateFnParams<T> {
259
+ type DeepPartial<T> = T extends readonly (infer U)[] ? ReadonlyArray<DeepPartial<U>> : T extends Array<infer U> ? Array<DeepPartial<U>> : T extends object ? {
260
+ [K in keyof T]?: DeepPartial<T[K]>;
261
+ } : T;
262
+ interface UpdateSetFnParams<T = any> extends Omit<UpdateFnParams<T>, 'value'> {
263
+ value: DeepPartial<T>;
257
264
  lastSync?: never;
265
+ changes?: ChangeWithPathStr[];
258
266
  }
259
267
  type UpdateFn<T = any> = (params: UpdateFnParams<T>) => void;
260
268
  type UpdateSetFn<T = any> = (params: UpdateSetFnParams<T>) => void;
@@ -464,4 +472,4 @@ declare const internal: {
464
472
  };
465
473
  };
466
474
 
467
- export { type ArrayValue, type Change, type ChildNodeInfo, type ClassConstructor, type GetMode, type GetOptions, type ImmutableObservableBase, type Linked, type LinkedOptions, type ListenerFn, type ListenerParams, type NodeInfo, type NodeListener, type NotPrimitive, type Observable, type ObservableBoolean, type ObservableEvent, ObservableHint, type ObservableListenerDispose, type ObservableMap, type ObservableObject, type ObservableObjectFns, type ObservableParam, type ObservablePrimitive, type ObservableRoot, type ObservableState, type ObservableSyncState, type ObservableSyncStateBase, type ObservableSyncStateOptions, type ObservableValue, type ObserveEvent, type ObserveEventCallback, type ObserveOptions, type OpaqueObject, type PlainObject, type Primitive, type RecordValue, type RecursiveValueOrFunction, type RemoveObservables, type RetryOptions, type RootNodeInfo, type Selector, type SetParams, type TrackingNode, type TrackingState, type TrackingType, type TypeAtPath, type UpdateFn, type UpdateFnParams, type UpdateSetFn, type UpdateSetFnParams, type WaitForSet, type WaitForSetFnParams, applyChange, applyChanges, batch, beginBatch, computeSelector, computed, constructObjectWithPath, deconstructObjectWithPath, endBatch, event, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPlainObject, isPrimitive, isPromise, isSet, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, proxy, setAtPath, setSilently, shouldIgnoreUnobserved, syncState, trackSelector, when, whenReady };
475
+ export { type ArrayValue, type Change, type ChangeWithPathStr, type ChildNodeInfo, type ClassConstructor, type GetMode, type GetOptions, type ImmutableObservableBase, type Linked, type LinkedOptions, type ListenerFn, type ListenerParams, type NodeInfo, type NodeListener, type NotPrimitive, type Observable, type ObservableBoolean, type ObservableEvent, ObservableHint, type ObservableListenerDispose, type ObservableMap, type ObservableObject, type ObservableObjectFns, type ObservableParam, type ObservablePrimitive, type ObservableRoot, type ObservableState, type ObservableSyncState, type ObservableSyncStateBase, type ObservableSyncStateOptions, type ObservableValue, type ObserveEvent, type ObserveEventCallback, type ObserveOptions, type OpaqueObject, type PlainObject, type Primitive, type RecordValue, type RecursiveValueOrFunction, type RemoveObservables, type RetryOptions, type RootNodeInfo, type Selector, type SetParams, type TrackingNode, type TrackingState, type TrackingType, type TypeAtPath, type UpdateFn, type UpdateFnParams, type UpdateSetFn, type UpdateSetFnParams, type WaitForSet, type WaitForSetFnParams, applyChange, applyChanges, batch, beginBatch, computeSelector, computed, constructObjectWithPath, deconstructObjectWithPath, endBatch, event, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPlainObject, isPrimitive, isPromise, isSet, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, proxy, setAtPath, setSilently, shouldIgnoreUnobserved, syncState, trackSelector, when, whenReady };
package/index.d.ts CHANGED
@@ -5,9 +5,9 @@ type RemoveIndex<T> = {
5
5
  };
6
6
  type BuiltIns = String | Boolean | Number | Date | Error | RegExp | Array<any> | Function | Promise<any>;
7
7
  type IsUserDefinedObject<T> = T extends Function | BuiltIns | any[] ? false : T extends object ? true : false;
8
- type RemoveObservables<T> = T extends ImmutableObservableBase<infer t> ? t : T extends ImmutableObservableBase<infer t>[] ? t[] : IsUserDefinedObject<T> extends true ? {
8
+ type RemoveObservables<T> = T extends OpaqueObject<infer t> ? t : T extends ImmutableObservableBase<infer t> ? t : T extends ImmutableObservableBase<infer t>[] ? t[] : IsUserDefinedObject<T> extends true ? {
9
9
  [K in keyof T]: RemoveObservables<T[K]>;
10
- } : T extends ImmutableObservableBase<infer TObs> ? TObs : T extends () => infer TRet ? RemoveObservables<TRet> & T : T extends (key: infer TKey extends string | number) => infer TRet ? Record<TKey, RemoveObservables<TRet>> & T : T extends OpaqueObject<infer TObj> ? TObj : T;
10
+ } : T extends ImmutableObservableBase<infer TObs> ? TObs : T extends () => infer TRet ? RemoveObservables<TRet> & T : T extends (key: infer TKey extends string | number) => infer TRet ? Record<TKey, RemoveObservables<TRet>> & T : T;
11
11
  interface ObservableArray<T, U> extends ObservablePrimitive<T>, Pick<Array<Observable<U>>, ArrayOverrideFnNames>, Omit<RemoveIndex<Array<U>>, ArrayOverrideFnNames> {
12
12
  }
13
13
  interface ObservableObjectFns<T> {
@@ -29,7 +29,7 @@ type ObservableSet<T extends Set<any> | WeakSet<any>> = Omit<T, 'size' | 'add'>
29
29
  size: number;
30
30
  add: (value: SetValue<T>) => Observable<T>;
31
31
  };
32
- interface ObservableBoolean extends ObservablePrimitive<boolean> {
32
+ interface ObservableBoolean<T = any> extends ObservablePrimitive<T> {
33
33
  toggle(): void;
34
34
  }
35
35
  interface ObservablePrimitive<T> extends ImmutableObservableBase<T>, MutableObservableBase<T> {
@@ -87,7 +87,7 @@ type ObservableFunction<T> = T extends () => infer t ? t | (() => t) : T;
87
87
  type IsLookupFunction<T> = T extends (...args: infer P) => any ? P extends {
88
88
  length: 1;
89
89
  } ? P[0] extends string | ObservablePrimitive<string> | number | ObservablePrimitive<number> ? true : false : false : false;
90
- type ObservableNode<T, NT = NonNullable<T>> = [NT] extends [never] ? ObservablePrimitive<T> : IsStrictAny<T> extends true ? ObservableAny : [T] extends [Promise<infer t>] ? ObservableNode<t> : [T] extends [(key: infer K extends string) => infer t] ? [t] extends [ImmutableObservableBase<any>] ? IsLookupFunction<T> extends true ? Observable<Record<K, t>> : t : IsLookupFunction<T> extends true ? Observable<Record<K, t>> & T : Observable<ObservableFunction<t>> : [NT] extends [ImmutableObservableBase<any>] ? NT : [NT] extends [Primitive$1] ? [NT] extends [boolean] ? ObservableBoolean : ObservablePrimitive<T> : NT extends Map<any, any> | WeakMap<any, any> ? ObservableMap<NT> : NT extends Set<infer U> ? ObservableSet<Set<UndefinedIf<U, IsNullable<T>>>> : NT extends WeakSet<any> ? ObservableSet<NT> : NT extends Array<infer U> ? ObservableArray<T, U> & ObservableChildren<T> : ObservableObject<T> & {};
90
+ type ObservableNode<T, NT = NonNullable<T>> = [NT] extends [never] ? ObservablePrimitive<T> : IsStrictAny<T> extends true ? ObservableAny : [T] extends [Promise<infer t>] ? ObservableNode<t> : [T] extends [(key: infer K extends string) => infer t] ? [t] extends [ImmutableObservableBase<any>] ? IsLookupFunction<T> extends true ? Observable<Record<K, t>> : t : IsLookupFunction<T> extends true ? Observable<Record<K, t>> & T : Observable<ObservableFunction<t>> : [NT] extends [ImmutableObservableBase<any>] ? NT : [NT] extends [Primitive$1] ? [NT] extends [boolean] ? ObservableBoolean<T> : ObservablePrimitive<T> : NT extends Map<any, any> | WeakMap<any, any> ? ObservableMap<NT> : NT extends Set<infer U> ? ObservableSet<Set<UndefinedIf<U, IsNullable<T>>>> : NT extends WeakSet<any> ? ObservableSet<NT> : NT extends Array<infer U> ? ObservableArray<T, U> & ObservableChildren<T> : ObservableObject<T> & {};
91
91
  type Observable<T = any> = ObservableNode<T> & {};
92
92
  type ObservableParam<T = any> = ImmutableObservableSimple<T> & MutableObservableSimple;
93
93
  type FixExpanded<T> = [T] extends [boolean] ? boolean : T;
@@ -146,6 +146,9 @@ interface Change {
146
146
  valueAtPath: any;
147
147
  prevAtPath: any;
148
148
  }
149
+ interface ChangeWithPathStr extends Change {
150
+ pathStr: string;
151
+ }
149
152
  type RecordValue<T> = T extends Record<string, infer t> ? t : never;
150
153
  type ArrayValue<T> = T extends Array<infer t> ? t : never;
151
154
  type ObservableValue<T> = T extends Observable<infer t> ? t : never;
@@ -253,8 +256,13 @@ interface UpdateFnParams<T = any> {
253
256
  lastSync?: number | undefined;
254
257
  changes?: Change[];
255
258
  }
256
- interface UpdateSetFnParams<T = any> extends UpdateFnParams<T> {
259
+ type DeepPartial<T> = T extends readonly (infer U)[] ? ReadonlyArray<DeepPartial<U>> : T extends Array<infer U> ? Array<DeepPartial<U>> : T extends object ? {
260
+ [K in keyof T]?: DeepPartial<T[K]>;
261
+ } : T;
262
+ interface UpdateSetFnParams<T = any> extends Omit<UpdateFnParams<T>, 'value'> {
263
+ value: DeepPartial<T>;
257
264
  lastSync?: never;
265
+ changes?: ChangeWithPathStr[];
258
266
  }
259
267
  type UpdateFn<T = any> = (params: UpdateFnParams<T>) => void;
260
268
  type UpdateSetFn<T = any> = (params: UpdateSetFnParams<T>) => void;
@@ -464,4 +472,4 @@ declare const internal: {
464
472
  };
465
473
  };
466
474
 
467
- export { type ArrayValue, type Change, type ChildNodeInfo, type ClassConstructor, type GetMode, type GetOptions, type ImmutableObservableBase, type Linked, type LinkedOptions, type ListenerFn, type ListenerParams, type NodeInfo, type NodeListener, type NotPrimitive, type Observable, type ObservableBoolean, type ObservableEvent, ObservableHint, type ObservableListenerDispose, type ObservableMap, type ObservableObject, type ObservableObjectFns, type ObservableParam, type ObservablePrimitive, type ObservableRoot, type ObservableState, type ObservableSyncState, type ObservableSyncStateBase, type ObservableSyncStateOptions, type ObservableValue, type ObserveEvent, type ObserveEventCallback, type ObserveOptions, type OpaqueObject, type PlainObject, type Primitive, type RecordValue, type RecursiveValueOrFunction, type RemoveObservables, type RetryOptions, type RootNodeInfo, type Selector, type SetParams, type TrackingNode, type TrackingState, type TrackingType, type TypeAtPath, type UpdateFn, type UpdateFnParams, type UpdateSetFn, type UpdateSetFnParams, type WaitForSet, type WaitForSetFnParams, applyChange, applyChanges, batch, beginBatch, computeSelector, computed, constructObjectWithPath, deconstructObjectWithPath, endBatch, event, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPlainObject, isPrimitive, isPromise, isSet, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, proxy, setAtPath, setSilently, shouldIgnoreUnobserved, syncState, trackSelector, when, whenReady };
475
+ export { type ArrayValue, type Change, type ChangeWithPathStr, type ChildNodeInfo, type ClassConstructor, type GetMode, type GetOptions, type ImmutableObservableBase, type Linked, type LinkedOptions, type ListenerFn, type ListenerParams, type NodeInfo, type NodeListener, type NotPrimitive, type Observable, type ObservableBoolean, type ObservableEvent, ObservableHint, type ObservableListenerDispose, type ObservableMap, type ObservableObject, type ObservableObjectFns, type ObservableParam, type ObservablePrimitive, type ObservableRoot, type ObservableState, type ObservableSyncState, type ObservableSyncStateBase, type ObservableSyncStateOptions, type ObservableValue, type ObserveEvent, type ObserveEventCallback, type ObserveOptions, type OpaqueObject, type PlainObject, type Primitive, type RecordValue, type RecursiveValueOrFunction, type RemoveObservables, type RetryOptions, type RootNodeInfo, type Selector, type SetParams, type TrackingNode, type TrackingState, type TrackingType, type TypeAtPath, type UpdateFn, type UpdateFnParams, type UpdateSetFn, type UpdateSetFnParams, type WaitForSet, type WaitForSetFnParams, applyChange, applyChanges, batch, beginBatch, computeSelector, computed, constructObjectWithPath, deconstructObjectWithPath, endBatch, event, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPlainObject, isPrimitive, isPromise, isSet, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, proxy, setAtPath, setSilently, shouldIgnoreUnobserved, syncState, trackSelector, when, whenReady };
package/index.js CHANGED
@@ -416,10 +416,19 @@ function _mergeIntoObservable(target, source, levelsDeep) {
416
416
  const isArr = !isObj && isArray(sourceValue);
417
417
  const targetChild = target[key];
418
418
  if ((isObj || isArr) && targetChild) {
419
- if (levelsDeep > 0 && isEmpty(sourceValue)) {
419
+ if (isArr) {
420
+ const sourceArr = sourceValue;
421
+ const isSparseArray = Object.keys(sourceArr).length < sourceArr.length;
422
+ if (isSparseArray) {
423
+ _mergeIntoObservable(targetChild, sourceValue, levelsDeep + 1);
424
+ } else {
425
+ targetChild.set(sourceValue);
426
+ }
427
+ } else if (levelsDeep > 0 && isEmpty(sourceValue)) {
420
428
  targetChild.set(sourceValue);
429
+ } else {
430
+ _mergeIntoObservable(targetChild, sourceValue, levelsDeep + 1);
421
431
  }
422
- _mergeIntoObservable(targetChild, sourceValue, levelsDeep + 1);
423
432
  } else {
424
433
  targetChild.set(sourceValue);
425
434
  }
@@ -1501,7 +1510,7 @@ function flushPending() {
1501
1510
  }
1502
1511
  var proxyHandler = {
1503
1512
  get(node, p, receiver) {
1504
- var _a, _b;
1513
+ var _a, _b, _c;
1505
1514
  if (p === symbolToPrimitive) {
1506
1515
  throw new Error(
1507
1516
  process.env.NODE_ENV === "development" ? "[legend-state] observable should not be used as a primitive. You may have forgotten to use .get() or .peek() to get the value of the observable." : "[legend-state] observable is not a primitive."
@@ -1516,6 +1525,10 @@ var proxyHandler = {
1516
1525
  return nodeValue[p];
1517
1526
  }
1518
1527
  }
1528
+ if (p === "constructor") {
1529
+ const ctor = (_a = peekInternal(node)) == null ? void 0 : _a.constructor;
1530
+ return typeof ctor === "function" ? ctor : Object;
1531
+ }
1519
1532
  let value = peekInternal(
1520
1533
  node,
1521
1534
  /*activateRecursive*/
@@ -1561,7 +1574,7 @@ var proxyHandler = {
1561
1574
  if (isObject(value) && isHintOpaque(value)) {
1562
1575
  return vProp;
1563
1576
  }
1564
- const fnOrComputed = (_a = node.functions) == null ? void 0 : _a.get(p);
1577
+ const fnOrComputed = (_b = node.functions) == null ? void 0 : _b.get(p);
1565
1578
  if (fnOrComputed) {
1566
1579
  if (isObservable(fnOrComputed)) {
1567
1580
  return fnOrComputed;
@@ -1614,7 +1627,7 @@ var proxyHandler = {
1614
1627
  }
1615
1628
  }
1616
1629
  extractFunctionOrComputed(node, p, vProp);
1617
- const fnOrComputed2 = (_b = node.functions) == null ? void 0 : _b.get(p);
1630
+ const fnOrComputed2 = (_c = node.functions) == null ? void 0 : _c.get(p);
1618
1631
  if (fnOrComputed2) {
1619
1632
  return getProxy(node, p, fnOrComputed2);
1620
1633
  }
@@ -1689,7 +1702,13 @@ var proxyHandler = {
1689
1702
  },
1690
1703
  has(node, prop) {
1691
1704
  const value = getNodeValue(node);
1692
- return Reflect.has(value, prop);
1705
+ if (value === void 0 || value === null) {
1706
+ return false;
1707
+ }
1708
+ if (typeof value === "object" || typeof value === "function") {
1709
+ return Reflect.has(value, prop);
1710
+ }
1711
+ return false;
1693
1712
  },
1694
1713
  apply(target, thisArg, argArray) {
1695
1714
  if (isObservable(thisArg)) {
package/index.mjs CHANGED
@@ -414,10 +414,19 @@ function _mergeIntoObservable(target, source, levelsDeep) {
414
414
  const isArr = !isObj && isArray(sourceValue);
415
415
  const targetChild = target[key];
416
416
  if ((isObj || isArr) && targetChild) {
417
- if (levelsDeep > 0 && isEmpty(sourceValue)) {
417
+ if (isArr) {
418
+ const sourceArr = sourceValue;
419
+ const isSparseArray = Object.keys(sourceArr).length < sourceArr.length;
420
+ if (isSparseArray) {
421
+ _mergeIntoObservable(targetChild, sourceValue, levelsDeep + 1);
422
+ } else {
423
+ targetChild.set(sourceValue);
424
+ }
425
+ } else if (levelsDeep > 0 && isEmpty(sourceValue)) {
418
426
  targetChild.set(sourceValue);
427
+ } else {
428
+ _mergeIntoObservable(targetChild, sourceValue, levelsDeep + 1);
419
429
  }
420
- _mergeIntoObservable(targetChild, sourceValue, levelsDeep + 1);
421
430
  } else {
422
431
  targetChild.set(sourceValue);
423
432
  }
@@ -1499,7 +1508,7 @@ function flushPending() {
1499
1508
  }
1500
1509
  var proxyHandler = {
1501
1510
  get(node, p, receiver) {
1502
- var _a, _b;
1511
+ var _a, _b, _c;
1503
1512
  if (p === symbolToPrimitive) {
1504
1513
  throw new Error(
1505
1514
  process.env.NODE_ENV === "development" ? "[legend-state] observable should not be used as a primitive. You may have forgotten to use .get() or .peek() to get the value of the observable." : "[legend-state] observable is not a primitive."
@@ -1514,6 +1523,10 @@ var proxyHandler = {
1514
1523
  return nodeValue[p];
1515
1524
  }
1516
1525
  }
1526
+ if (p === "constructor") {
1527
+ const ctor = (_a = peekInternal(node)) == null ? void 0 : _a.constructor;
1528
+ return typeof ctor === "function" ? ctor : Object;
1529
+ }
1517
1530
  let value = peekInternal(
1518
1531
  node,
1519
1532
  /*activateRecursive*/
@@ -1559,7 +1572,7 @@ var proxyHandler = {
1559
1572
  if (isObject(value) && isHintOpaque(value)) {
1560
1573
  return vProp;
1561
1574
  }
1562
- const fnOrComputed = (_a = node.functions) == null ? void 0 : _a.get(p);
1575
+ const fnOrComputed = (_b = node.functions) == null ? void 0 : _b.get(p);
1563
1576
  if (fnOrComputed) {
1564
1577
  if (isObservable(fnOrComputed)) {
1565
1578
  return fnOrComputed;
@@ -1612,7 +1625,7 @@ var proxyHandler = {
1612
1625
  }
1613
1626
  }
1614
1627
  extractFunctionOrComputed(node, p, vProp);
1615
- const fnOrComputed2 = (_b = node.functions) == null ? void 0 : _b.get(p);
1628
+ const fnOrComputed2 = (_c = node.functions) == null ? void 0 : _c.get(p);
1616
1629
  if (fnOrComputed2) {
1617
1630
  return getProxy(node, p, fnOrComputed2);
1618
1631
  }
@@ -1687,7 +1700,13 @@ var proxyHandler = {
1687
1700
  },
1688
1701
  has(node, prop) {
1689
1702
  const value = getNodeValue(node);
1690
- return Reflect.has(value, prop);
1703
+ if (value === void 0 || value === null) {
1704
+ return false;
1705
+ }
1706
+ if (typeof value === "object" || typeof value === "function") {
1707
+ return Reflect.has(value, prop);
1708
+ }
1709
+ return false;
1691
1710
  },
1692
1711
  apply(target, thisArg, argArray) {
1693
1712
  if (isObservable(thisArg)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@legendapp/state",
3
- "version": "3.0.0-beta.42",
3
+ "version": "3.0.0-beta.44",
4
4
  "description": "legend-state",
5
5
  "sideEffects": false,
6
6
  "private": false,
@@ -1,12 +1,13 @@
1
1
  import { Change } from '@legendapp/state';
2
2
  import { ObservablePersistPlugin, PersistOptions, PersistMetadata } from '@legendapp/state/sync';
3
- import { MMKVConfiguration } from 'react-native-mmkv';
3
+ import * as mmkv from 'react-native-mmkv';
4
4
 
5
+ type Configuration = mmkv.Configuration;
5
6
  declare class ObservablePersistMMKV implements ObservablePersistPlugin {
6
7
  private data;
7
8
  private storages;
8
9
  private configuration;
9
- constructor(configuration: MMKVConfiguration);
10
+ constructor(configuration: Configuration);
10
11
  getTable<T = any>(table: string, init: object, config: PersistOptions): T;
11
12
  getMetadata(table: string, config: PersistOptions): PersistMetadata;
12
13
  set(table: string, changes: Change[], config: PersistOptions): void;
@@ -17,6 +18,6 @@ declare class ObservablePersistMMKV implements ObservablePersistPlugin {
17
18
  private setValue;
18
19
  private save;
19
20
  }
20
- declare function observablePersistMMKV(configuration: MMKVConfiguration): ObservablePersistMMKV;
21
+ declare function observablePersistMMKV(configuration: Configuration): ObservablePersistMMKV;
21
22
 
22
23
  export { ObservablePersistMMKV, observablePersistMMKV };
@@ -1,12 +1,13 @@
1
1
  import { Change } from '@legendapp/state';
2
2
  import { ObservablePersistPlugin, PersistOptions, PersistMetadata } from '@legendapp/state/sync';
3
- import { MMKVConfiguration } from 'react-native-mmkv';
3
+ import * as mmkv from 'react-native-mmkv';
4
4
 
5
+ type Configuration = mmkv.Configuration;
5
6
  declare class ObservablePersistMMKV implements ObservablePersistPlugin {
6
7
  private data;
7
8
  private storages;
8
9
  private configuration;
9
- constructor(configuration: MMKVConfiguration);
10
+ constructor(configuration: Configuration);
10
11
  getTable<T = any>(table: string, init: object, config: PersistOptions): T;
11
12
  getMetadata(table: string, config: PersistOptions): PersistMetadata;
12
13
  set(table: string, changes: Change[], config: PersistOptions): void;
@@ -17,6 +18,6 @@ declare class ObservablePersistMMKV implements ObservablePersistPlugin {
17
18
  private setValue;
18
19
  private save;
19
20
  }
20
- declare function observablePersistMMKV(configuration: MMKVConfiguration): ObservablePersistMMKV;
21
+ declare function observablePersistMMKV(configuration: Configuration): ObservablePersistMMKV;
21
22
 
22
23
  export { ObservablePersistMMKV, observablePersistMMKV };
@@ -1,19 +1,55 @@
1
1
  'use strict';
2
2
 
3
3
  var state = require('@legendapp/state');
4
- var reactNativeMmkv = require('react-native-mmkv');
4
+ var mmkv = require('react-native-mmkv');
5
+
6
+ function _interopNamespace(e) {
7
+ if (e && e.__esModule) return e;
8
+ var n = Object.create(null);
9
+ if (e) {
10
+ Object.keys(e).forEach(function (k) {
11
+ if (k !== 'default') {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () { return e[k]; }
16
+ });
17
+ }
18
+ });
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+
24
+ var mmkv__namespace = /*#__PURE__*/_interopNamespace(mmkv);
5
25
 
6
26
  // src/persist-plugins/mmkv.ts
7
27
  var symbolDefault = Symbol();
8
28
  var MetadataSuffix = "__m";
9
29
  var { safeParse, safeStringify } = state.internal;
30
+ function createMMKVInstance(config) {
31
+ const hasCreateFunction = "createMMKV" in mmkv__namespace;
32
+ if (hasCreateFunction) {
33
+ return mmkv__namespace.createMMKV(config);
34
+ } else {
35
+ const { MMKV: MMKVConstructor } = mmkv__namespace;
36
+ return new MMKVConstructor(config);
37
+ }
38
+ }
39
+ function deleteFromMMKV(storage, key) {
40
+ if ("remove" in storage) {
41
+ storage.remove(key);
42
+ } else {
43
+ storage.delete(key);
44
+ }
45
+ }
10
46
  var ObservablePersistMMKV = class {
11
47
  constructor(configuration) {
12
48
  this.data = {};
13
49
  this.storages = /* @__PURE__ */ new Map([
14
50
  [
15
51
  symbolDefault,
16
- new reactNativeMmkv.MMKV({
52
+ createMMKVInstance({
17
53
  id: `obsPersist`
18
54
  })
19
55
  ]
@@ -53,7 +89,7 @@ var ObservablePersistMMKV = class {
53
89
  deleteTable(table, config) {
54
90
  const storage = this.getStorage(config);
55
91
  delete this.data[table];
56
- storage.delete(table);
92
+ deleteFromMMKV(storage, table);
57
93
  }
58
94
  deleteMetadata(table, config) {
59
95
  this.deleteTable(table + MetadataSuffix, config);
@@ -65,7 +101,7 @@ var ObservablePersistMMKV = class {
65
101
  const key = JSON.stringify(configuration);
66
102
  let storage = this.storages.get(key);
67
103
  if (!storage) {
68
- storage = new reactNativeMmkv.MMKV(configuration);
104
+ storage = createMMKVInstance(configuration);
69
105
  this.storages.set(key, storage);
70
106
  }
71
107
  return storage;
@@ -87,7 +123,7 @@ var ObservablePersistMMKV = class {
87
123
  console.error(err);
88
124
  }
89
125
  } else {
90
- storage.delete(table);
126
+ deleteFromMMKV(storage, table);
91
127
  }
92
128
  }
93
129
  };
@@ -1,17 +1,33 @@
1
1
  import { setAtPath, internal } from '@legendapp/state';
2
- import { MMKV } from 'react-native-mmkv';
2
+ import * as mmkv from 'react-native-mmkv';
3
3
 
4
4
  // src/persist-plugins/mmkv.ts
5
5
  var symbolDefault = Symbol();
6
6
  var MetadataSuffix = "__m";
7
7
  var { safeParse, safeStringify } = internal;
8
+ function createMMKVInstance(config) {
9
+ const hasCreateFunction = "createMMKV" in mmkv;
10
+ if (hasCreateFunction) {
11
+ return mmkv.createMMKV(config);
12
+ } else {
13
+ const { MMKV: MMKVConstructor } = mmkv;
14
+ return new MMKVConstructor(config);
15
+ }
16
+ }
17
+ function deleteFromMMKV(storage, key) {
18
+ if ("remove" in storage) {
19
+ storage.remove(key);
20
+ } else {
21
+ storage.delete(key);
22
+ }
23
+ }
8
24
  var ObservablePersistMMKV = class {
9
25
  constructor(configuration) {
10
26
  this.data = {};
11
27
  this.storages = /* @__PURE__ */ new Map([
12
28
  [
13
29
  symbolDefault,
14
- new MMKV({
30
+ createMMKVInstance({
15
31
  id: `obsPersist`
16
32
  })
17
33
  ]
@@ -51,7 +67,7 @@ var ObservablePersistMMKV = class {
51
67
  deleteTable(table, config) {
52
68
  const storage = this.getStorage(config);
53
69
  delete this.data[table];
54
- storage.delete(table);
70
+ deleteFromMMKV(storage, table);
55
71
  }
56
72
  deleteMetadata(table, config) {
57
73
  this.deleteTable(table + MetadataSuffix, config);
@@ -63,7 +79,7 @@ var ObservablePersistMMKV = class {
63
79
  const key = JSON.stringify(configuration);
64
80
  let storage = this.storages.get(key);
65
81
  if (!storage) {
66
- storage = new MMKV(configuration);
82
+ storage = createMMKVInstance(configuration);
67
83
  this.storages.set(key, storage);
68
84
  }
69
85
  return storage;
@@ -85,7 +101,7 @@ var ObservablePersistMMKV = class {
85
101
  console.error(err);
86
102
  }
87
103
  } else {
88
- storage.delete(table);
104
+ deleteFromMMKV(storage, table);
89
105
  }
90
106
  }
91
107
  };
@@ -29,7 +29,7 @@ function createObservableHook(fn) {
29
29
  const _useState = React__default.default.useState;
30
30
  const _useReducer = React__default.default.useReducer;
31
31
  return function(...args) {
32
- const refObs = React__default.default.useRef();
32
+ const refObs = React__default.default.useRef(void 0);
33
33
  overrideHooks(refObs);
34
34
  fn(...args);
35
35
  React__default.default.useState = _useState;
@@ -23,7 +23,7 @@ function createObservableHook(fn) {
23
23
  const _useState = React.useState;
24
24
  const _useReducer = React.useReducer;
25
25
  return function(...args) {
26
- const refObs = React.useRef();
26
+ const refObs = React.useRef(void 0);
27
27
  overrideHooks(refObs);
28
28
  fn(...args);
29
29
  React.useState = _useState;
@@ -1,4 +1,5 @@
1
1
  import { FCReactiveObject, configureReactive } from '@legendapp/state/react';
2
+ import { JSX } from 'react';
2
3
 
3
4
  declare function enableReactComponents_(config: typeof configureReactive): void;
4
5
 
@@ -1,4 +1,5 @@
1
1
  import { FCReactiveObject, configureReactive } from '@legendapp/state/react';
2
+ import { JSX } from 'react';
2
3
 
3
4
  declare function enableReactComponents_(config: typeof configureReactive): void;
4
5
 
package/react.d.mts CHANGED
@@ -22,8 +22,8 @@ declare function For<T, TProps>({ each, optimized: isOptimized, item, itemProps,
22
22
  declare function usePauseProvider(): {
23
23
  PauseProvider: ({ children }: {
24
24
  children: ReactNode;
25
- }) => React.FunctionComponentElement<React.ProviderProps<ObservableBoolean>>;
26
- isPaused$: ObservableBoolean;
25
+ }) => React.FunctionComponentElement<React.ProviderProps<ObservableBoolean<boolean>>>;
26
+ isPaused$: ObservableBoolean<boolean>;
27
27
  };
28
28
 
29
29
  declare const Memo: NamedExoticComponent<{
@@ -71,18 +71,20 @@ declare function Switch<T>({ value, children, }: {
71
71
  children: Partial<Record<'undefined' | 'default', () => ReactNode>>;
72
72
  }): ReactElement | null;
73
73
 
74
+ type KeysOfUnion<T> = T extends T ? keyof T : never;
75
+ type ValueOfUnionKey$1<P, K extends PropertyKey> = P extends any ? (K extends keyof P ? P[K] : never) : never;
74
76
  type ShapeWithNew$<T> = Partial<Omit<T, 'children'>> & {
75
77
  [K in keyof T as K extends `$${string & K}` ? K : `$${string & K}`]?: Selector<T[K]>;
76
78
  } & {
77
79
  children?: Selector<ReactNode>;
78
80
  };
79
- interface BindKey<P, K extends keyof P = keyof P> {
81
+ interface BindKey<P, K extends KeysOfUnion<P> = KeysOfUnion<P>> {
80
82
  handler?: K;
81
- getValue?: P[K] extends infer T ? T extends (...args: any) => any ? (params: Parameters<T>[0]) => any : (e: any) => any : (e: any) => any;
83
+ getValue?: ValueOfUnionKey$1<P, K> extends infer T ? T extends (...args: any) => any ? (params: Parameters<T>[0]) => any : (e: any) => any : (e: any) => any;
82
84
  defaultValue?: any;
83
85
  selector?: (propsOut: Record<string, any>, p: Observable<any>) => any;
84
86
  }
85
- type BindKeys<P = any, K extends keyof P = keyof P> = Partial<Record<K, BindKey<P>>>;
87
+ type BindKeys<P = any, K extends KeysOfUnion<P> = KeysOfUnion<P>> = Partial<Record<K, BindKey<P, K>>>;
86
88
  type FCReactiveObject<T> = {
87
89
  [K in keyof T]: FC<ShapeWithNew$<T[K]>>;
88
90
  };
@@ -109,23 +111,24 @@ type ShapeWith$<T> = WithSelectorChildren<Partial<T>> & {
109
111
  type ObjectShapeWith$<T> = {
110
112
  [K in keyof T]: T[K] extends FC<infer P> ? FC<ShapeWith$<P>> : T[K];
111
113
  };
112
- type ReactifyProps<T, K extends keyof T> = T & {
113
- [P in K as `$${string & P}`]?: Selector<T[P]>;
114
+ type ValueOfUnionKey<T, K extends PropertyKey> = T extends any ? (K extends keyof T ? T[K] : never) : never;
115
+ type ReactifyProps<T, K extends KeysOfUnion<T>> = T & {
116
+ [P in K as `$${string & P}`]?: Selector<ValueOfUnionKey<T, P>>;
114
117
  };
115
118
  declare const hasSymbol: false | ((key: string) => symbol);
116
119
  declare function observer<P extends FC<any>>(component: P): P;
117
120
  declare function reactive<T extends object>(component: React.ComponentClass<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
118
121
  declare function reactive<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
119
122
  declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
120
- declare function reactive<T extends object, K extends keyof T>(component: React.FC<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
121
- declare function reactive<T extends object, K extends keyof T>(component: React.ForwardRefExoticComponent<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
123
+ declare function reactive<T extends object, K extends KeysOfUnion<T>>(component: React.FC<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
124
+ declare function reactive<T extends object, K extends KeysOfUnion<T>>(component: React.ForwardRefExoticComponent<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
122
125
  declare function reactive<T extends object>(component: React.ComponentClass<T>): React.ComponentClass<ShapeWith$<T>>;
123
126
  declare function reactive<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
124
127
  declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
125
128
  declare function reactiveObserver<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
126
129
  declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
127
- declare function reactiveObserver<T extends object, K extends keyof T>(component: React.FC<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
128
- declare function reactiveObserver<T extends object, K extends keyof T>(component: React.ForwardRefExoticComponent<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
130
+ declare function reactiveObserver<T extends object, K extends KeysOfUnion<T>>(component: React.FC<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
131
+ declare function reactiveObserver<T extends object, K extends KeysOfUnion<T>>(component: React.ForwardRefExoticComponent<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
129
132
  declare function reactiveObserver<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
130
133
  declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
131
134
  declare function reactiveComponents<P extends Record<string, any>>(components: P): ObjectShapeWith$<P>;
@@ -192,4 +195,4 @@ declare function configureReactive({ components, binders, }: {
192
195
  binders?: Record<string, BindKeys>;
193
196
  }): void;
194
197
 
195
- export { type BindKey, type BindKeys, Computed, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useObservable as useLocalObservable, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useSelector as useValue, useWhen, useWhenReady };
198
+ export { type BindKey, type BindKeys, Computed, type FCReactive, type FCReactiveObject, For, type IReactive, type KeysOfUnion, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useObservable as useLocalObservable, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useSelector as useValue, useWhen, useWhenReady };