@legendapp/state 3.0.0-beta.11 → 3.0.0-beta.13

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.
@@ -4,7 +4,9 @@ var react = require('@legendapp/state/react');
4
4
 
5
5
  // src/config/enableReactComponents.ts
6
6
  function enableReactComponents() {
7
- const bindInfo = { value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" } };
7
+ const bindInfo = {
8
+ value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" }
9
+ };
8
10
  const bindInfoInput = Object.assign(
9
11
  { checked: { handler: "onChange", getValue: (e) => e.target.checked } },
10
12
  bindInfo
@@ -2,7 +2,9 @@ import { configureReactive } from '@legendapp/state/react';
2
2
 
3
3
  // src/config/enableReactComponents.ts
4
4
  function enableReactComponents() {
5
- const bindInfo = { value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" } };
5
+ const bindInfo = {
6
+ value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" }
7
+ };
6
8
  const bindInfoInput = Object.assign(
7
9
  { checked: { handler: "onChange", getValue: (e) => e.target.checked } },
8
10
  bindInfo
package/index.d.mts CHANGED
@@ -108,6 +108,7 @@ declare function getNode(value$: ObservableParam): NodeInfo;
108
108
  declare function setNodeValue(node: NodeInfo, newValue: any): {
109
109
  prevValue: any;
110
110
  newValue: any;
111
+ parentValue: any;
111
112
  };
112
113
  declare function getNodeValue(node: NodeInfo): any;
113
114
  declare function ensureNodeValue(node: NodeInfo): any;
package/index.d.ts CHANGED
@@ -108,6 +108,7 @@ declare function getNode(value$: ObservableParam): NodeInfo;
108
108
  declare function setNodeValue(node: NodeInfo, newValue: any): {
109
109
  prevValue: any;
110
110
  newValue: any;
111
+ parentValue: any;
111
112
  };
112
113
  declare function getNodeValue(node: NodeInfo): any;
113
114
  declare function ensureNodeValue(node: NodeInfo): any;
package/index.js CHANGED
@@ -181,7 +181,7 @@ function setNodeValue(node, newValue) {
181
181
  parentNode.isSetting--;
182
182
  }
183
183
  }
184
- return { prevValue, newValue };
184
+ return { prevValue, newValue, parentValue };
185
185
  }
186
186
  var arrNodeKeys = [];
187
187
  function getNodeValue(node) {
@@ -1588,7 +1588,7 @@ function setKey(node, key, newValue, level) {
1588
1588
  if (isObservable(newValue)) {
1589
1589
  setToObservable(childNode, newValue);
1590
1590
  } else {
1591
- const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1591
+ const { newValue: savedValue, prevValue, parentValue } = setNodeValue(childNode, newValue);
1592
1592
  const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1593
1593
  if (!isPrim) {
1594
1594
  let parent = childNode;
@@ -1600,7 +1600,17 @@ function setKey(node, key, newValue, level) {
1600
1600
  const notify2 = !equals(savedValue, prevValue);
1601
1601
  const forceNotify = !notify2 && childNode.isComputing && !isPrim;
1602
1602
  if (notify2 || forceNotify) {
1603
- updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
1603
+ updateNodesAndNotify(
1604
+ node,
1605
+ savedValue,
1606
+ prevValue,
1607
+ childNode,
1608
+ parentValue,
1609
+ isPrim,
1610
+ isRoot,
1611
+ level,
1612
+ forceNotify
1613
+ );
1604
1614
  }
1605
1615
  extractFunctionOrComputed(node, key, savedValue);
1606
1616
  }
@@ -1707,7 +1717,7 @@ function handlerMapSet(node, p, value) {
1707
1717
  };
1708
1718
  }
1709
1719
  }
1710
- function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
1720
+ function updateNodesAndNotify(node, newValue, prevValue, childNode, parentValue, isPrim, isRoot, level, forceNotify) {
1711
1721
  if (!childNode)
1712
1722
  childNode = node;
1713
1723
  beginBatch();
@@ -1716,15 +1726,29 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
1716
1726
  }
1717
1727
  let hasADiff = forceNotify || isPrim;
1718
1728
  let whenOptimizedOnlyIf = false;
1729
+ let valueAsArr;
1730
+ let valueAsMap;
1719
1731
  if (!isPrim || prevValue && !isPrimitive(prevValue)) {
1720
1732
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
1721
1733
  __devUpdateNodes.clear();
1722
1734
  }
1723
1735
  hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
1724
1736
  if (isArray(newValue)) {
1725
- whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
1737
+ valueAsArr = newValue;
1738
+ } else if (isMap(newValue) || isSet(newValue)) {
1739
+ valueAsMap = newValue;
1726
1740
  }
1727
1741
  }
1742
+ if (isArray(parentValue)) {
1743
+ valueAsArr = parentValue;
1744
+ } else if (isMap(parentValue) || isSet(parentValue)) {
1745
+ valueAsMap = parentValue;
1746
+ }
1747
+ if (valueAsArr) {
1748
+ whenOptimizedOnlyIf = (valueAsArr == null ? void 0 : valueAsArr.length) !== (prevValue == null ? void 0 : prevValue.length);
1749
+ } else if (valueAsMap) {
1750
+ whenOptimizedOnlyIf = (valueAsMap == null ? void 0 : valueAsMap.size) !== (prevValue == null ? void 0 : prevValue.size);
1751
+ }
1728
1752
  if (isPrim || !newValue || isEmpty(newValue) && !isEmpty(prevValue) ? newValue !== prevValue : hasADiff) {
1729
1753
  notify(
1730
1754
  isPrim && isRoot ? node : childNode,
package/index.mjs CHANGED
@@ -179,7 +179,7 @@ function setNodeValue(node, newValue) {
179
179
  parentNode.isSetting--;
180
180
  }
181
181
  }
182
- return { prevValue, newValue };
182
+ return { prevValue, newValue, parentValue };
183
183
  }
184
184
  var arrNodeKeys = [];
185
185
  function getNodeValue(node) {
@@ -1586,7 +1586,7 @@ function setKey(node, key, newValue, level) {
1586
1586
  if (isObservable(newValue)) {
1587
1587
  setToObservable(childNode, newValue);
1588
1588
  } else {
1589
- const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1589
+ const { newValue: savedValue, prevValue, parentValue } = setNodeValue(childNode, newValue);
1590
1590
  const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1591
1591
  if (!isPrim) {
1592
1592
  let parent = childNode;
@@ -1598,7 +1598,17 @@ function setKey(node, key, newValue, level) {
1598
1598
  const notify2 = !equals(savedValue, prevValue);
1599
1599
  const forceNotify = !notify2 && childNode.isComputing && !isPrim;
1600
1600
  if (notify2 || forceNotify) {
1601
- updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
1601
+ updateNodesAndNotify(
1602
+ node,
1603
+ savedValue,
1604
+ prevValue,
1605
+ childNode,
1606
+ parentValue,
1607
+ isPrim,
1608
+ isRoot,
1609
+ level,
1610
+ forceNotify
1611
+ );
1602
1612
  }
1603
1613
  extractFunctionOrComputed(node, key, savedValue);
1604
1614
  }
@@ -1705,7 +1715,7 @@ function handlerMapSet(node, p, value) {
1705
1715
  };
1706
1716
  }
1707
1717
  }
1708
- function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
1718
+ function updateNodesAndNotify(node, newValue, prevValue, childNode, parentValue, isPrim, isRoot, level, forceNotify) {
1709
1719
  if (!childNode)
1710
1720
  childNode = node;
1711
1721
  beginBatch();
@@ -1714,15 +1724,29 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
1714
1724
  }
1715
1725
  let hasADiff = forceNotify || isPrim;
1716
1726
  let whenOptimizedOnlyIf = false;
1727
+ let valueAsArr;
1728
+ let valueAsMap;
1717
1729
  if (!isPrim || prevValue && !isPrimitive(prevValue)) {
1718
1730
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
1719
1731
  __devUpdateNodes.clear();
1720
1732
  }
1721
1733
  hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
1722
1734
  if (isArray(newValue)) {
1723
- whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
1735
+ valueAsArr = newValue;
1736
+ } else if (isMap(newValue) || isSet(newValue)) {
1737
+ valueAsMap = newValue;
1724
1738
  }
1725
1739
  }
1740
+ if (isArray(parentValue)) {
1741
+ valueAsArr = parentValue;
1742
+ } else if (isMap(parentValue) || isSet(parentValue)) {
1743
+ valueAsMap = parentValue;
1744
+ }
1745
+ if (valueAsArr) {
1746
+ whenOptimizedOnlyIf = (valueAsArr == null ? void 0 : valueAsArr.length) !== (prevValue == null ? void 0 : prevValue.length);
1747
+ } else if (valueAsMap) {
1748
+ whenOptimizedOnlyIf = (valueAsMap == null ? void 0 : valueAsMap.size) !== (prevValue == null ? void 0 : prevValue.size);
1749
+ }
1726
1750
  if (isPrim || !newValue || isEmpty(newValue) && !isEmpty(prevValue) ? newValue !== prevValue : hasADiff) {
1727
1751
  notify(
1728
1752
  isPrim && isRoot ? node : childNode,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@legendapp/state",
3
- "version": "3.0.0-beta.11",
3
+ "version": "3.0.0-beta.13",
4
4
  "description": "legend-state",
5
5
  "sideEffects": false,
6
6
  "private": false,
@@ -7,7 +7,9 @@ function enableReactComponents_(config) {
7
7
  return;
8
8
  }
9
9
  isEnabled = true;
10
- const bindInfo = { value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" } };
10
+ const bindInfo = {
11
+ value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" }
12
+ };
11
13
  const bindInfoInput = Object.assign(
12
14
  { checked: { handler: "onChange", getValue: (e) => e.target.checked } },
13
15
  bindInfo
@@ -5,7 +5,9 @@ function enableReactComponents_(config) {
5
5
  return;
6
6
  }
7
7
  isEnabled = true;
8
- const bindInfo = { value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" } };
8
+ const bindInfo = {
9
+ value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" }
10
+ };
9
11
  const bindInfoInput = Object.assign(
10
12
  { checked: { handler: "onChange", getValue: (e) => e.target.checked } },
11
13
  bindInfo
@@ -7,7 +7,9 @@ function enableReactComponents_(config) {
7
7
  return;
8
8
  }
9
9
  isEnabled = true;
10
- const bindInfo = { value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" } };
10
+ const bindInfo = {
11
+ value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" }
12
+ };
11
13
  const bindInfoInput = Object.assign(
12
14
  { checked: { handler: "onChange", getValue: (e) => e.target.checked } },
13
15
  bindInfo
@@ -5,7 +5,9 @@ function enableReactComponents_(config) {
5
5
  return;
6
6
  }
7
7
  isEnabled = true;
8
- const bindInfo = { value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" } };
8
+ const bindInfo = {
9
+ value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" }
10
+ };
9
11
  const bindInfoInput = Object.assign(
10
12
  { checked: { handler: "onChange", getValue: (e) => e.target.checked } },
11
13
  bindInfo
package/react.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
  import { ReactNode, ReactElement, FC, LegacyRef, DependencyList, ReducerWithoutAction, ReducerStateWithoutAction, DispatchWithoutAction, Reducer, ReducerState, Dispatch, ReducerAction, ComponentClass } from 'react';
3
3
  import { ObservableParam, Observable, ObservableBoolean, Selector, RecursiveValueOrFunction, ObserveOptions, ObserveEvent, ObserveEventCallback } from '@legendapp/state';
4
4
 
@@ -22,11 +22,11 @@ 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>>;
25
+ }) => React.FunctionComponentElement<React.ProviderProps<ObservableBoolean>>;
26
26
  isPaused$: ObservableBoolean;
27
27
  };
28
28
 
29
- declare const Memo: react.MemoExoticComponent<typeof Computed>;
29
+ declare const Memo: React.MemoExoticComponent<typeof Computed>;
30
30
 
31
31
  interface IReactive {
32
32
  }
@@ -71,13 +71,13 @@ type ShapeWithNew$<T> = Partial<Omit<T, 'children'>> & {
71
71
  } & {
72
72
  children?: Selector<ReactNode>;
73
73
  };
74
- interface BindKey<P> {
75
- handler?: keyof P;
76
- getValue?: (e: any) => any;
74
+ interface BindKey<P, K extends keyof P = keyof P> {
75
+ handler?: K;
76
+ getValue?: P[K] extends infer T ? T extends (...args: any) => any ? (params: Parameters<T>[0]) => any : (e: any) => any : (e: any) => any;
77
77
  defaultValue?: any;
78
78
  selector?: (propsOut: Record<string, any>, p: Observable<any>) => any;
79
79
  }
80
- type BindKeys<P = any> = Partial<Record<keyof P, BindKey<P>>>;
80
+ type BindKeys<P = any, K extends keyof P = keyof P> = Partial<Record<K, BindKey<P>>>;
81
81
  type FCReactiveObject<T> = {
82
82
  [K in keyof T]: FC<ShapeWithNew$<T[K]>>;
83
83
  };
@@ -99,12 +99,23 @@ type ObjectShapeWith$<T> = {
99
99
  [K in keyof T]: T[K] extends FC<infer P> ? FC<ShapeWith$<P>> : T[K];
100
100
  };
101
101
  type ExtractFCPropsType<T> = T extends FC<infer P> ? P : never;
102
+ type ReactifyProps<T, K extends keyof T> = Omit<T, K> & {
103
+ [P in K]: Selector<T[P]>;
104
+ };
102
105
  declare const hasSymbol: false | ((key: string) => symbol);
103
106
  declare function observer<P extends FC<any>>(component: P): P;
104
- declare function reactive<T extends FC<any>>(component: T, bindKeys?: BindKeys<ExtractFCPropsType<T>>): T & FC<ShapeWith$<ExtractFCPropsType<T>>>;
105
- declare function reactive<T extends FC<any>, T2 extends keyof ExtractFCPropsType<T>>(component: T, bindKeys?: BindKeys<ExtractFCPropsType<T>>): T & FC<ShapeWithPick$<ExtractFCPropsType<T>, T2>>;
106
- declare function reactiveObserver<T extends FC<any>>(component: T, bindKeys?: BindKeys<ExtractFCPropsType<T>>): T & FC<ShapeWith$<ExtractFCPropsType<T>>>;
107
- declare function reactiveObserver<T extends FC<any>, T2 extends keyof ExtractFCPropsType<T>>(component: T, bindKeys?: BindKeys<ExtractFCPropsType<T>>): T & FC<ShapeWithPick$<ExtractFCPropsType<T>, T2>>;
107
+ declare function reactive<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
108
+ declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
109
+ 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>>;
110
+ 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>>;
111
+ declare function reactive<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
112
+ declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
113
+ declare function reactiveObserver<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
114
+ declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
115
+ 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>>;
116
+ 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>>;
117
+ declare function reactiveObserver<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
118
+ declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
108
119
  declare function reactiveComponents<P extends Record<string, FC>>(components: P): ObjectShapeWith$<P>;
109
120
 
110
121
  declare function useComputed<T>(get: () => T | Promise<T>): Observable<T>;
@@ -161,4 +172,4 @@ declare function configureReactive({ components, binders, }: {
161
172
  binders?: Record<string, BindKeys>;
162
173
  }): void;
163
174
 
164
- export { type BindKey, type BindKeys, Computed, type ExtractFCPropsType, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, Reactive, type ShapeWith$, type ShapeWithNew$, type ShapeWithPick$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useComputed, useEffectOnce, useIsMounted, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useWhen, useWhenReady };
175
+ export { type BindKey, type BindKeys, Computed, type ExtractFCPropsType, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, type ShapeWithPick$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useComputed, useEffectOnce, useIsMounted, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useWhen, useWhenReady };
package/react.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import * as react from 'react';
1
+ import * as React from 'react';
2
2
  import { ReactNode, ReactElement, FC, LegacyRef, DependencyList, ReducerWithoutAction, ReducerStateWithoutAction, DispatchWithoutAction, Reducer, ReducerState, Dispatch, ReducerAction, ComponentClass } from 'react';
3
3
  import { ObservableParam, Observable, ObservableBoolean, Selector, RecursiveValueOrFunction, ObserveOptions, ObserveEvent, ObserveEventCallback } from '@legendapp/state';
4
4
 
@@ -22,11 +22,11 @@ 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>>;
25
+ }) => React.FunctionComponentElement<React.ProviderProps<ObservableBoolean>>;
26
26
  isPaused$: ObservableBoolean;
27
27
  };
28
28
 
29
- declare const Memo: react.MemoExoticComponent<typeof Computed>;
29
+ declare const Memo: React.MemoExoticComponent<typeof Computed>;
30
30
 
31
31
  interface IReactive {
32
32
  }
@@ -71,13 +71,13 @@ type ShapeWithNew$<T> = Partial<Omit<T, 'children'>> & {
71
71
  } & {
72
72
  children?: Selector<ReactNode>;
73
73
  };
74
- interface BindKey<P> {
75
- handler?: keyof P;
76
- getValue?: (e: any) => any;
74
+ interface BindKey<P, K extends keyof P = keyof P> {
75
+ handler?: K;
76
+ getValue?: P[K] extends infer T ? T extends (...args: any) => any ? (params: Parameters<T>[0]) => any : (e: any) => any : (e: any) => any;
77
77
  defaultValue?: any;
78
78
  selector?: (propsOut: Record<string, any>, p: Observable<any>) => any;
79
79
  }
80
- type BindKeys<P = any> = Partial<Record<keyof P, BindKey<P>>>;
80
+ type BindKeys<P = any, K extends keyof P = keyof P> = Partial<Record<K, BindKey<P>>>;
81
81
  type FCReactiveObject<T> = {
82
82
  [K in keyof T]: FC<ShapeWithNew$<T[K]>>;
83
83
  };
@@ -99,12 +99,23 @@ type ObjectShapeWith$<T> = {
99
99
  [K in keyof T]: T[K] extends FC<infer P> ? FC<ShapeWith$<P>> : T[K];
100
100
  };
101
101
  type ExtractFCPropsType<T> = T extends FC<infer P> ? P : never;
102
+ type ReactifyProps<T, K extends keyof T> = Omit<T, K> & {
103
+ [P in K]: Selector<T[P]>;
104
+ };
102
105
  declare const hasSymbol: false | ((key: string) => symbol);
103
106
  declare function observer<P extends FC<any>>(component: P): P;
104
- declare function reactive<T extends FC<any>>(component: T, bindKeys?: BindKeys<ExtractFCPropsType<T>>): T & FC<ShapeWith$<ExtractFCPropsType<T>>>;
105
- declare function reactive<T extends FC<any>, T2 extends keyof ExtractFCPropsType<T>>(component: T, bindKeys?: BindKeys<ExtractFCPropsType<T>>): T & FC<ShapeWithPick$<ExtractFCPropsType<T>, T2>>;
106
- declare function reactiveObserver<T extends FC<any>>(component: T, bindKeys?: BindKeys<ExtractFCPropsType<T>>): T & FC<ShapeWith$<ExtractFCPropsType<T>>>;
107
- declare function reactiveObserver<T extends FC<any>, T2 extends keyof ExtractFCPropsType<T>>(component: T, bindKeys?: BindKeys<ExtractFCPropsType<T>>): T & FC<ShapeWithPick$<ExtractFCPropsType<T>, T2>>;
107
+ declare function reactive<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
108
+ declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
109
+ 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>>;
110
+ 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>>;
111
+ declare function reactive<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
112
+ declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
113
+ declare function reactiveObserver<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
114
+ declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
115
+ 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>>;
116
+ 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>>;
117
+ declare function reactiveObserver<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
118
+ declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
108
119
  declare function reactiveComponents<P extends Record<string, FC>>(components: P): ObjectShapeWith$<P>;
109
120
 
110
121
  declare function useComputed<T>(get: () => T | Promise<T>): Observable<T>;
@@ -161,4 +172,4 @@ declare function configureReactive({ components, binders, }: {
161
172
  binders?: Record<string, BindKeys>;
162
173
  }): void;
163
174
 
164
- export { type BindKey, type BindKeys, Computed, type ExtractFCPropsType, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, Reactive, type ShapeWith$, type ShapeWithNew$, type ShapeWithPick$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useComputed, useEffectOnce, useIsMounted, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useWhen, useWhenReady };
175
+ export { type BindKey, type BindKeys, Computed, type ExtractFCPropsType, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, type ShapeWithPick$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useComputed, useEffectOnce, useIsMounted, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useWhen, useWhenReady };
package/react.js CHANGED
@@ -140,7 +140,7 @@ function Computed({ children }) {
140
140
  }
141
141
  var hasSymbol = typeof Symbol === "function" && Symbol.for;
142
142
  var didWarnProps = false;
143
- function createReactiveComponent(component, observe3, reactive2, bindKeys) {
143
+ function createReactiveComponent(component, observe3, reactive2, keysReactive, bindKeys) {
144
144
  const ReactForwardRefSymbol = hasSymbol ? Symbol.for("react.forward_ref") : (
145
145
  // eslint-disable-next-line react/display-name, @typescript-eslint/no-unused-vars
146
146
  typeof React.forwardRef === "function" && React.forwardRef((props) => null)["$$typeof"]
@@ -165,6 +165,7 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
165
165
  throw new Error(`[legend-state] \`render\` property of ForwardRef was not a function`);
166
166
  }
167
167
  }
168
+ const keysReactiveSet = keysReactive ? new Set(keysReactive) : void 0;
168
169
  const proxyHandler = {
169
170
  apply(target, thisArg, argArray) {
170
171
  if (reactive2) {
@@ -174,9 +175,10 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
174
175
  for (let i = 0; i < keys.length; i++) {
175
176
  const key = keys[i];
176
177
  const p = props[key];
178
+ const isReactiveKey = keysReactiveSet && keysReactiveSet.has(key);
177
179
  if (key === "children" && (state.isFunction(p) || state.isObservable(p))) {
178
180
  props[key] = useSelector(p, { skipCheck: true });
179
- } else if (key.startsWith("$") || key.endsWith("$")) {
181
+ } else if (isReactiveKey || key.startsWith("$") || key.endsWith("$")) {
180
182
  if (process.env.NODE_ENV === "development" && !didWarnProps && key.endsWith("$")) {
181
183
  didWarnProps = true;
182
184
  console.warn(
@@ -186,7 +188,7 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
186
188
  )}. See https://legendapp.com/open-source/state/migrating for more details.`
187
189
  );
188
190
  }
189
- const k = key.endsWith("$") ? key.slice(0, -1) : key.slice(1);
191
+ const k = isReactiveKey ? key : key.endsWith("$") ? key.slice(0, -1) : key.slice(1);
190
192
  const bind = bindKeys == null ? void 0 : bindKeys[k];
191
193
  const shouldBind = bind && state.isObservable(p);
192
194
  propsOut[k] = shouldBind && (bind == null ? void 0 : bind.selector) ? bind.selector(propsOut, p) : useSelector(p);
@@ -204,7 +206,9 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
204
206
  process.env.NODE_ENV === "development" ? handlerFn : React.useCallback(handlerFn, [props[bind.handler], bindKeys]);
205
207
  }
206
208
  }
207
- delete propsOut[key];
209
+ if (!isReactiveKey) {
210
+ delete propsOut[key];
211
+ }
208
212
  } else if (propsOut[key] === void 0) {
209
213
  propsOut[key] = p;
210
214
  }
@@ -241,11 +245,11 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
241
245
  function observer(component) {
242
246
  return createReactiveComponent(component, true);
243
247
  }
244
- function reactive(component, bindKeys) {
245
- return createReactiveComponent(component, false, true, bindKeys);
248
+ function reactive(component, keys, bindKeys) {
249
+ return createReactiveComponent(component, false, true, keys, bindKeys);
246
250
  }
247
- function reactiveObserver(component, bindKeys) {
248
- return createReactiveComponent(component, true, true, bindKeys);
251
+ function reactiveObserver(component, keys, bindKeys) {
252
+ return createReactiveComponent(component, true, true, keys, bindKeys);
249
253
  }
250
254
  function reactiveComponents(components) {
251
255
  return new Proxy(
@@ -371,7 +375,7 @@ var Reactive = new Proxy(
371
375
  }
372
376
  return React.createElement(Component, propsOut);
373
377
  });
374
- target[p] = reactive(render, ReactiveFnBinders.get(p));
378
+ target[p] = reactive(render, [], ReactiveFnBinders.get(p));
375
379
  }
376
380
  return target[p];
377
381
  }
package/react.mjs CHANGED
@@ -134,7 +134,7 @@ function Computed({ children }) {
134
134
  }
135
135
  var hasSymbol = typeof Symbol === "function" && Symbol.for;
136
136
  var didWarnProps = false;
137
- function createReactiveComponent(component, observe3, reactive2, bindKeys) {
137
+ function createReactiveComponent(component, observe3, reactive2, keysReactive, bindKeys) {
138
138
  const ReactForwardRefSymbol = hasSymbol ? Symbol.for("react.forward_ref") : (
139
139
  // eslint-disable-next-line react/display-name, @typescript-eslint/no-unused-vars
140
140
  typeof forwardRef === "function" && forwardRef((props) => null)["$$typeof"]
@@ -159,6 +159,7 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
159
159
  throw new Error(`[legend-state] \`render\` property of ForwardRef was not a function`);
160
160
  }
161
161
  }
162
+ const keysReactiveSet = keysReactive ? new Set(keysReactive) : void 0;
162
163
  const proxyHandler = {
163
164
  apply(target, thisArg, argArray) {
164
165
  if (reactive2) {
@@ -168,9 +169,10 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
168
169
  for (let i = 0; i < keys.length; i++) {
169
170
  const key = keys[i];
170
171
  const p = props[key];
172
+ const isReactiveKey = keysReactiveSet && keysReactiveSet.has(key);
171
173
  if (key === "children" && (isFunction(p) || isObservable(p))) {
172
174
  props[key] = useSelector(p, { skipCheck: true });
173
- } else if (key.startsWith("$") || key.endsWith("$")) {
175
+ } else if (isReactiveKey || key.startsWith("$") || key.endsWith("$")) {
174
176
  if (process.env.NODE_ENV === "development" && !didWarnProps && key.endsWith("$")) {
175
177
  didWarnProps = true;
176
178
  console.warn(
@@ -180,7 +182,7 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
180
182
  )}. See https://legendapp.com/open-source/state/migrating for more details.`
181
183
  );
182
184
  }
183
- const k = key.endsWith("$") ? key.slice(0, -1) : key.slice(1);
185
+ const k = isReactiveKey ? key : key.endsWith("$") ? key.slice(0, -1) : key.slice(1);
184
186
  const bind = bindKeys == null ? void 0 : bindKeys[k];
185
187
  const shouldBind = bind && isObservable(p);
186
188
  propsOut[k] = shouldBind && (bind == null ? void 0 : bind.selector) ? bind.selector(propsOut, p) : useSelector(p);
@@ -198,7 +200,9 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
198
200
  process.env.NODE_ENV === "development" ? handlerFn : useCallback(handlerFn, [props[bind.handler], bindKeys]);
199
201
  }
200
202
  }
201
- delete propsOut[key];
203
+ if (!isReactiveKey) {
204
+ delete propsOut[key];
205
+ }
202
206
  } else if (propsOut[key] === void 0) {
203
207
  propsOut[key] = p;
204
208
  }
@@ -235,11 +239,11 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
235
239
  function observer(component) {
236
240
  return createReactiveComponent(component, true);
237
241
  }
238
- function reactive(component, bindKeys) {
239
- return createReactiveComponent(component, false, true, bindKeys);
242
+ function reactive(component, keys, bindKeys) {
243
+ return createReactiveComponent(component, false, true, keys, bindKeys);
240
244
  }
241
- function reactiveObserver(component, bindKeys) {
242
- return createReactiveComponent(component, true, true, bindKeys);
245
+ function reactiveObserver(component, keys, bindKeys) {
246
+ return createReactiveComponent(component, true, true, keys, bindKeys);
243
247
  }
244
248
  function reactiveComponents(components) {
245
249
  return new Proxy(
@@ -365,7 +369,7 @@ var Reactive = new Proxy(
365
369
  }
366
370
  return createElement(Component, propsOut);
367
371
  });
368
- target[p] = reactive(render, ReactiveFnBinders.get(p));
372
+ target[p] = reactive(render, [], ReactiveFnBinders.get(p));
369
373
  }
370
374
  return target[p];
371
375
  }
@@ -5,11 +5,13 @@ type CrudAsOption = 'Map' | 'object' | 'value' | 'array';
5
5
  type CrudResult<T> = T;
6
6
  interface SyncedCrudPropsSingle<TRemote extends object, TLocal> {
7
7
  get?: (params: SyncedGetParams<TRemote>) => Promise<CrudResult<TRemote | null>> | CrudResult<TRemote | null>;
8
+ list?: never | undefined;
8
9
  initial?: InitialValue<TLocal, 'value'>;
9
10
  as?: never | 'value';
10
11
  }
11
12
  interface SyncedCrudPropsMany<TRemote extends object, TLocal, TAsOption extends CrudAsOption> {
12
13
  list?: (params: SyncedGetParams<TRemote>) => Promise<CrudResult<TRemote[] | null>> | CrudResult<TRemote[] | null>;
14
+ get?: never | undefined;
13
15
  as?: TAsOption;
14
16
  initial?: InitialValue<TLocal, TAsOption>;
15
17
  }
@@ -45,7 +47,8 @@ type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption ex
45
47
  } ? number : string, TLocal> : TAsOption extends 'object' ? Record<TLocal extends {
46
48
  id: number;
47
49
  } ? number : string, TLocal> : TAsOption extends 'value' ? TLocal : TLocal[];
48
- declare function syncedCrud<TRemote extends object, TLocal = TRemote>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsSingle<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
49
- declare function syncedCrud<TRemote extends object, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsMany<TRemote, TLocal, TAsOption>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
50
+ declare function syncedCrud<TRemote extends object, TLocal = TRemote>(props: SyncedCrudPropsSingle<TRemote, TLocal> & SyncedCrudPropsBase<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
51
+ declare function syncedCrud<TRemote extends object, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsMany<TRemote, TLocal, TAsOption> & SyncedCrudPropsBase<TRemote, TLocal>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
52
+ declare function syncedCrud<TRemote extends object, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: (SyncedCrudPropsSingle<TRemote, TLocal> | SyncedCrudPropsMany<TRemote, TLocal, TAsOption>) & SyncedCrudPropsBase<TRemote, TLocal>): SyncedCrudReturnType<TLocal, TAsOption>;
50
53
 
51
54
  export { type CrudAsOption, type CrudResult, type SyncedCrudOnSavedParams, type SyncedCrudPropsBase, type SyncedCrudPropsMany, type SyncedCrudPropsSingle, type SyncedCrudReturnType, type WaitForSetCrudFnParams, syncedCrud };
@@ -5,11 +5,13 @@ type CrudAsOption = 'Map' | 'object' | 'value' | 'array';
5
5
  type CrudResult<T> = T;
6
6
  interface SyncedCrudPropsSingle<TRemote extends object, TLocal> {
7
7
  get?: (params: SyncedGetParams<TRemote>) => Promise<CrudResult<TRemote | null>> | CrudResult<TRemote | null>;
8
+ list?: never | undefined;
8
9
  initial?: InitialValue<TLocal, 'value'>;
9
10
  as?: never | 'value';
10
11
  }
11
12
  interface SyncedCrudPropsMany<TRemote extends object, TLocal, TAsOption extends CrudAsOption> {
12
13
  list?: (params: SyncedGetParams<TRemote>) => Promise<CrudResult<TRemote[] | null>> | CrudResult<TRemote[] | null>;
14
+ get?: never | undefined;
13
15
  as?: TAsOption;
14
16
  initial?: InitialValue<TLocal, TAsOption>;
15
17
  }
@@ -45,7 +47,8 @@ type SyncedCrudReturnType<TLocal, TAsOption extends CrudAsOption> = TAsOption ex
45
47
  } ? number : string, TLocal> : TAsOption extends 'object' ? Record<TLocal extends {
46
48
  id: number;
47
49
  } ? number : string, TLocal> : TAsOption extends 'value' ? TLocal : TLocal[];
48
- declare function syncedCrud<TRemote extends object, TLocal = TRemote>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsSingle<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
49
- declare function syncedCrud<TRemote extends object, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsBase<TRemote, TLocal> & SyncedCrudPropsMany<TRemote, TLocal, TAsOption>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
50
+ declare function syncedCrud<TRemote extends object, TLocal = TRemote>(props: SyncedCrudPropsSingle<TRemote, TLocal> & SyncedCrudPropsBase<TRemote, TLocal>): SyncedCrudReturnType<TLocal, 'value'>;
51
+ declare function syncedCrud<TRemote extends object, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: SyncedCrudPropsMany<TRemote, TLocal, TAsOption> & SyncedCrudPropsBase<TRemote, TLocal>): SyncedCrudReturnType<TLocal, Exclude<TAsOption, 'value'>>;
52
+ declare function syncedCrud<TRemote extends object, TLocal = TRemote, TAsOption extends CrudAsOption = 'object'>(props: (SyncedCrudPropsSingle<TRemote, TLocal> | SyncedCrudPropsMany<TRemote, TLocal, TAsOption>) & SyncedCrudPropsBase<TRemote, TLocal>): SyncedCrudReturnType<TLocal, TAsOption>;
50
53
 
51
54
  export { type CrudAsOption, type CrudResult, type SyncedCrudOnSavedParams, type SyncedCrudPropsBase, type SyncedCrudPropsMany, type SyncedCrudPropsSingle, type SyncedCrudReturnType, type WaitForSetCrudFnParams, syncedCrud };
@@ -274,6 +274,7 @@ function syncedKeel(props) {
274
274
  } : subscribeParam;
275
275
  return crud.syncedCrud({
276
276
  ...rest,
277
+ // Workaround for type errors
277
278
  as: asType,
278
279
  mode: mode || "merge",
279
280
  list,
@@ -299,7 +300,6 @@ function syncedKeel(props) {
299
300
  updatePartial: true,
300
301
  subscribe,
301
302
  generateId: generateKeelId,
302
- // @ts-expect-error This errors because of the get/list union type
303
303
  get
304
304
  });
305
305
  }
@@ -268,6 +268,7 @@ function syncedKeel(props) {
268
268
  } : subscribeParam;
269
269
  return syncedCrud({
270
270
  ...rest,
271
+ // Workaround for type errors
271
272
  as: asType,
272
273
  mode: mode || "merge",
273
274
  list,
@@ -293,7 +294,6 @@ function syncedKeel(props) {
293
294
  updatePartial: true,
294
295
  subscribe,
295
296
  generateId: generateKeelId,
296
- // @ts-expect-error This errors because of the get/list union type
297
297
  get
298
298
  });
299
299
  }