@legendapp/state 3.0.0-beta.3 → 3.0.0-beta.30

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.
Files changed (74) hide show
  1. package/.DS_Store +0 -0
  2. package/config/enableReactComponents.js +3 -1
  3. package/config/enableReactComponents.mjs +3 -1
  4. package/config/enableReactTracking.d.mts +2 -1
  5. package/config/enableReactTracking.d.ts +2 -1
  6. package/config/enableReactTracking.js +32 -13
  7. package/config/enableReactTracking.mjs +32 -13
  8. package/index.d.mts +33 -4
  9. package/index.d.ts +33 -4
  10. package/index.js +191 -29
  11. package/index.mjs +191 -29
  12. package/package.json +35 -1
  13. package/persist-plugins/async-storage.js +17 -9
  14. package/persist-plugins/async-storage.mjs +17 -9
  15. package/persist-plugins/expo-sqlite.d.mts +19 -0
  16. package/persist-plugins/expo-sqlite.d.ts +19 -0
  17. package/persist-plugins/expo-sqlite.js +72 -0
  18. package/persist-plugins/expo-sqlite.mjs +69 -0
  19. package/react-native.d.mts +4 -0
  20. package/react-native.d.ts +4 -0
  21. package/react-native.js +53 -0
  22. package/react-native.mjs +40 -0
  23. package/react-reactive/Components.d.mts +19 -0
  24. package/react-reactive/Components.d.ts +19 -0
  25. package/react-reactive/Components.js +53 -0
  26. package/react-reactive/Components.mjs +40 -0
  27. package/react-reactive/enableReactComponents.d.mts +3 -2
  28. package/react-reactive/enableReactComponents.d.ts +3 -2
  29. package/react-reactive/enableReactComponents.js +10 -3
  30. package/react-reactive/enableReactComponents.mjs +10 -3
  31. package/react-reactive/enableReactNativeComponents.d.mts +3 -20
  32. package/react-reactive/enableReactNativeComponents.d.ts +3 -20
  33. package/react-reactive/enableReactNativeComponents.js +8 -3
  34. package/react-reactive/enableReactNativeComponents.mjs +8 -3
  35. package/react-reactive/enableReactive.js +10 -3
  36. package/react-reactive/enableReactive.mjs +10 -3
  37. package/react-reactive/enableReactive.native.js +8 -3
  38. package/react-reactive/enableReactive.native.mjs +8 -3
  39. package/react-reactive/enableReactive.web.js +8 -3
  40. package/react-reactive/enableReactive.web.mjs +8 -3
  41. package/react-web.d.mts +6 -0
  42. package/react-web.d.ts +6 -0
  43. package/react-web.js +39 -0
  44. package/react-web.mjs +37 -0
  45. package/react.d.mts +41 -21
  46. package/react.d.ts +41 -21
  47. package/react.js +36 -23
  48. package/react.mjs +37 -25
  49. package/sync-plugins/crud.d.mts +24 -9
  50. package/sync-plugins/crud.d.ts +24 -9
  51. package/sync-plugins/crud.js +250 -116
  52. package/sync-plugins/crud.mjs +251 -117
  53. package/sync-plugins/firebase.d.mts +7 -3
  54. package/sync-plugins/firebase.d.ts +7 -3
  55. package/sync-plugins/firebase.js +4 -2
  56. package/sync-plugins/firebase.mjs +4 -2
  57. package/sync-plugins/keel.d.mts +12 -13
  58. package/sync-plugins/keel.d.ts +12 -13
  59. package/sync-plugins/keel.js +60 -52
  60. package/sync-plugins/keel.mjs +61 -48
  61. package/sync-plugins/supabase.d.mts +7 -3
  62. package/sync-plugins/supabase.d.ts +7 -3
  63. package/sync-plugins/supabase.js +90 -33
  64. package/sync-plugins/supabase.mjs +91 -34
  65. package/sync-plugins/tanstack-query.d.mts +3 -3
  66. package/sync-plugins/tanstack-query.d.ts +3 -3
  67. package/sync.d.mts +16 -8
  68. package/sync.d.ts +16 -8
  69. package/sync.js +324 -215
  70. package/sync.mjs +323 -215
  71. package/trace.js +5 -6
  72. package/trace.mjs +5 -6
  73. package/types/reactive-native.d.ts +19 -0
  74. package/types/reactive-web.d.ts +7 -0
package/react-web.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import { FCReactiveObject } from '@legendapp/state/react';
2
+
3
+ type IReactive = FCReactiveObject<JSX.IntrinsicElements>;
4
+ declare const $React: IReactive;
5
+
6
+ export { $React };
package/react-web.js ADDED
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ var state = require('@legendapp/state');
4
+ var react$1 = require('@legendapp/state/react');
5
+ var react = require('react');
6
+
7
+ // src/react-web/$React.tsx
8
+ var bindInfoOneWay = {
9
+ value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" }
10
+ };
11
+ var bindInfoInput = Object.assign(
12
+ { checked: { handler: "onChange", getValue: (e) => e.target.checked } },
13
+ bindInfoOneWay
14
+ );
15
+ var binders = /* @__PURE__ */ new Map([
16
+ ["input", bindInfoInput],
17
+ ["textarea", bindInfoOneWay],
18
+ ["select", bindInfoOneWay]
19
+ ]);
20
+ var $React = new Proxy(
21
+ {},
22
+ {
23
+ get(target, p) {
24
+ if (!target[p]) {
25
+ const render = react.forwardRef((props, ref) => {
26
+ const propsOut = { ...props };
27
+ if (ref && (state.isFunction(ref) || !state.isEmpty(ref))) {
28
+ propsOut.ref = ref;
29
+ }
30
+ return react.createElement(p, propsOut);
31
+ });
32
+ target[p] = react$1.reactive(render, [], binders.get(p));
33
+ }
34
+ return target[p];
35
+ }
36
+ }
37
+ );
38
+
39
+ exports.$React = $React;
package/react-web.mjs ADDED
@@ -0,0 +1,37 @@
1
+ import { isFunction, isEmpty } from '@legendapp/state';
2
+ import { reactive } from '@legendapp/state/react';
3
+ import { forwardRef, createElement } from 'react';
4
+
5
+ // src/react-web/$React.tsx
6
+ var bindInfoOneWay = {
7
+ value: { handler: "onChange", getValue: (e) => e.target.value, defaultValue: "" }
8
+ };
9
+ var bindInfoInput = Object.assign(
10
+ { checked: { handler: "onChange", getValue: (e) => e.target.checked } },
11
+ bindInfoOneWay
12
+ );
13
+ var binders = /* @__PURE__ */ new Map([
14
+ ["input", bindInfoInput],
15
+ ["textarea", bindInfoOneWay],
16
+ ["select", bindInfoOneWay]
17
+ ]);
18
+ var $React = new Proxy(
19
+ {},
20
+ {
21
+ get(target, p) {
22
+ if (!target[p]) {
23
+ const render = forwardRef((props, ref) => {
24
+ const propsOut = { ...props };
25
+ if (ref && (isFunction(ref) || !isEmpty(ref))) {
26
+ propsOut.ref = ref;
27
+ }
28
+ return createElement(p, propsOut);
29
+ });
30
+ target[p] = reactive(render, [], binders.get(p));
31
+ }
32
+ return target[p];
33
+ }
34
+ }
35
+ );
36
+
37
+ export { $React };
package/react.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import * as react from 'react';
2
- import { ReactNode, ReactElement, FC, LegacyRef, DependencyList, ReducerWithoutAction, ReducerStateWithoutAction, DispatchWithoutAction, Reducer, ReducerState, Dispatch, ReducerAction, ComponentClass } from 'react';
3
- import { ObservableParam, Observable, ObservableBoolean, Selector, RecursiveValueOrFunction, ObserveOptions, ObserveEvent, ObserveEventCallback } from '@legendapp/state';
1
+ import * as React from 'react';
2
+ import { ReactNode, ReactElement, FC, NamedExoticComponent, LegacyRef, DependencyList, ReducerWithoutAction, ReducerStateWithoutAction, DispatchWithoutAction, Reducer, ReducerState, Dispatch, ReducerAction, ComponentClass } from 'react';
3
+ import { ObservableParam, Observable, ObservableBoolean, Selector, GetOptions, RecursiveValueOrFunction, ObserveOptions, ObserveEvent, ObserveEventCallback } from '@legendapp/state';
4
4
 
5
5
  declare function Computed({ children }: {
6
6
  children: ObservableParam | (() => ReactNode);
@@ -22,11 +22,14 @@ 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: NamedExoticComponent<{
30
+ children: any;
31
+ scoped?: boolean;
32
+ }>;
30
33
 
31
34
  interface IReactive {
32
35
  }
@@ -43,7 +46,9 @@ interface PropsIfReady<T> {
43
46
  interface PropsBase<T> {
44
47
  else?: ReactNode | (() => ReactNode);
45
48
  $value?: Observable<T>;
46
- wrap?: FC;
49
+ wrap?: FC<{
50
+ children: ReactNode;
51
+ }>;
47
52
  children: ReactNode | ((value?: T) => ReactNode);
48
53
  }
49
54
  type Props<T> = PropsBase<T> & (PropsIf<T> | PropsIfReady<T>);
@@ -54,11 +59,11 @@ declare function Switch<T extends object>({ value, children, }: {
54
59
  children: Partial<Record<keyof T | 'null' | 'undefined' | 'default', () => ReactNode>>;
55
60
  }): ReactElement | null;
56
61
  declare function Switch<T extends string | number | symbol>({ value, children, }: {
57
- value?: Selector<T>;
62
+ value?: Selector<T | undefined | null>;
58
63
  children: Partial<Record<T | 'null' | 'undefined' | 'default', () => ReactNode>>;
59
64
  }): ReactElement | null;
60
65
  declare function Switch<T extends boolean>({ value, children, }: {
61
- value?: Selector<T>;
66
+ value?: Selector<T | undefined | null>;
62
67
  children: Partial<Record<'false' | 'true' | 'null' | 'undefined' | 'default', () => ReactNode>>;
63
68
  }): ReactElement | null;
64
69
  declare function Switch<T>({ value, children, }: {
@@ -71,20 +76,20 @@ type ShapeWithNew$<T> = Partial<Omit<T, 'children'>> & {
71
76
  } & {
72
77
  children?: Selector<ReactNode>;
73
78
  };
74
- interface BindKey<P> {
75
- handler?: keyof P;
76
- getValue?: (e: any) => any;
79
+ interface BindKey<P, K extends keyof P = keyof P> {
80
+ 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;
77
82
  defaultValue?: any;
78
83
  selector?: (propsOut: Record<string, any>, p: Observable<any>) => any;
79
84
  }
80
- type BindKeys<P = any> = Record<keyof P, BindKey<P>>;
85
+ type BindKeys<P = any, K extends keyof P = keyof P> = Partial<Record<K, BindKey<P>>>;
81
86
  type FCReactiveObject<T> = {
82
87
  [K in keyof T]: FC<ShapeWithNew$<T[K]>>;
83
88
  };
84
89
  type FCReactive<P, P2> = P & FC<ShapeWithNew$<P2> & {
85
90
  ref?: LegacyRef<P> | undefined;
86
91
  }>;
87
- interface UseSelectorOptions {
92
+ interface UseSelectorOptions extends GetOptions {
88
93
  suspense?: boolean;
89
94
  skipCheck?: boolean;
90
95
  }
@@ -99,13 +104,26 @@ type ObjectShapeWith$<T> = {
99
104
  [K in keyof T]: T[K] extends FC<infer P> ? FC<ShapeWith$<P>> : T[K];
100
105
  };
101
106
  type ExtractFCPropsType<T> = T extends FC<infer P> ? P : never;
107
+ type ReactifyProps<T, K extends keyof T> = Omit<T, K> & {
108
+ [P in K]: Selector<T[P]>;
109
+ };
102
110
  declare const hasSymbol: false | ((key: string) => symbol);
103
111
  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>>;
108
- declare function reactiveComponents<P extends Record<string, FC>>(components: P): ObjectShapeWith$<P>;
112
+ declare function reactive<T extends object>(component: React.ComponentClass<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
113
+ declare function reactive<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
114
+ declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
115
+ 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>>;
116
+ 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>>;
117
+ declare function reactive<T extends object>(component: React.ComponentClass<T>): React.ComponentClass<ShapeWith$<T>>;
118
+ declare function reactive<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
119
+ declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
120
+ declare function reactiveObserver<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
121
+ declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
122
+ 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>>;
123
+ 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>>;
124
+ declare function reactiveObserver<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
125
+ declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
126
+ declare function reactiveComponents<P extends Record<string, any>>(components: P): ObjectShapeWith$<P>;
109
127
 
110
128
  declare function useComputed<T>(get: () => T | Promise<T>): Observable<T>;
111
129
  declare function useComputed<T>(get: () => T | Promise<T>, deps: any[]): Observable<T>;
@@ -151,12 +169,14 @@ declare function useSelector<T>(selector: Selector<T>, options?: UseSelectorOpti
151
169
  declare function useUnmount(fn: () => void): void;
152
170
  declare const useUnmountOnce: typeof useUnmount;
153
171
 
154
- declare function useWhen<T>(predicate: Selector<T>, effect: (value: T) => any | (() => any)): Promise<any>;
155
- declare function useWhenReady<T>(predicate: Selector<T>, effect: (value: T) => any | (() => any)): Promise<any>;
172
+ declare function useWhen<T>(predicate: Selector<T>): Promise<T>;
173
+ declare function useWhen<T, T2>(predicate: Selector<T>, effect: (value: T) => T2): Promise<T2>;
174
+ declare function useWhenReady<T>(predicate: Selector<T>): Promise<T>;
175
+ declare function useWhenReady<T, T2>(predicate: Selector<T>, effect: (value: T) => T2 | (() => T2)): Promise<T2>;
156
176
 
157
177
  declare function configureReactive({ components, binders, }: {
158
178
  components?: Record<string, FC | ComponentClass<any>>;
159
179
  binders?: Record<string, BindKeys>;
160
180
  }): void;
161
181
 
162
- 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 };
182
+ 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, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useWhen, useWhenReady };
package/react.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import * as react from 'react';
2
- import { ReactNode, ReactElement, FC, LegacyRef, DependencyList, ReducerWithoutAction, ReducerStateWithoutAction, DispatchWithoutAction, Reducer, ReducerState, Dispatch, ReducerAction, ComponentClass } from 'react';
3
- import { ObservableParam, Observable, ObservableBoolean, Selector, RecursiveValueOrFunction, ObserveOptions, ObserveEvent, ObserveEventCallback } from '@legendapp/state';
1
+ import * as React from 'react';
2
+ import { ReactNode, ReactElement, FC, NamedExoticComponent, LegacyRef, DependencyList, ReducerWithoutAction, ReducerStateWithoutAction, DispatchWithoutAction, Reducer, ReducerState, Dispatch, ReducerAction, ComponentClass } from 'react';
3
+ import { ObservableParam, Observable, ObservableBoolean, Selector, GetOptions, RecursiveValueOrFunction, ObserveOptions, ObserveEvent, ObserveEventCallback } from '@legendapp/state';
4
4
 
5
5
  declare function Computed({ children }: {
6
6
  children: ObservableParam | (() => ReactNode);
@@ -22,11 +22,14 @@ 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: NamedExoticComponent<{
30
+ children: any;
31
+ scoped?: boolean;
32
+ }>;
30
33
 
31
34
  interface IReactive {
32
35
  }
@@ -43,7 +46,9 @@ interface PropsIfReady<T> {
43
46
  interface PropsBase<T> {
44
47
  else?: ReactNode | (() => ReactNode);
45
48
  $value?: Observable<T>;
46
- wrap?: FC;
49
+ wrap?: FC<{
50
+ children: ReactNode;
51
+ }>;
47
52
  children: ReactNode | ((value?: T) => ReactNode);
48
53
  }
49
54
  type Props<T> = PropsBase<T> & (PropsIf<T> | PropsIfReady<T>);
@@ -54,11 +59,11 @@ declare function Switch<T extends object>({ value, children, }: {
54
59
  children: Partial<Record<keyof T | 'null' | 'undefined' | 'default', () => ReactNode>>;
55
60
  }): ReactElement | null;
56
61
  declare function Switch<T extends string | number | symbol>({ value, children, }: {
57
- value?: Selector<T>;
62
+ value?: Selector<T | undefined | null>;
58
63
  children: Partial<Record<T | 'null' | 'undefined' | 'default', () => ReactNode>>;
59
64
  }): ReactElement | null;
60
65
  declare function Switch<T extends boolean>({ value, children, }: {
61
- value?: Selector<T>;
66
+ value?: Selector<T | undefined | null>;
62
67
  children: Partial<Record<'false' | 'true' | 'null' | 'undefined' | 'default', () => ReactNode>>;
63
68
  }): ReactElement | null;
64
69
  declare function Switch<T>({ value, children, }: {
@@ -71,20 +76,20 @@ type ShapeWithNew$<T> = Partial<Omit<T, 'children'>> & {
71
76
  } & {
72
77
  children?: Selector<ReactNode>;
73
78
  };
74
- interface BindKey<P> {
75
- handler?: keyof P;
76
- getValue?: (e: any) => any;
79
+ interface BindKey<P, K extends keyof P = keyof P> {
80
+ 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;
77
82
  defaultValue?: any;
78
83
  selector?: (propsOut: Record<string, any>, p: Observable<any>) => any;
79
84
  }
80
- type BindKeys<P = any> = Record<keyof P, BindKey<P>>;
85
+ type BindKeys<P = any, K extends keyof P = keyof P> = Partial<Record<K, BindKey<P>>>;
81
86
  type FCReactiveObject<T> = {
82
87
  [K in keyof T]: FC<ShapeWithNew$<T[K]>>;
83
88
  };
84
89
  type FCReactive<P, P2> = P & FC<ShapeWithNew$<P2> & {
85
90
  ref?: LegacyRef<P> | undefined;
86
91
  }>;
87
- interface UseSelectorOptions {
92
+ interface UseSelectorOptions extends GetOptions {
88
93
  suspense?: boolean;
89
94
  skipCheck?: boolean;
90
95
  }
@@ -99,13 +104,26 @@ type ObjectShapeWith$<T> = {
99
104
  [K in keyof T]: T[K] extends FC<infer P> ? FC<ShapeWith$<P>> : T[K];
100
105
  };
101
106
  type ExtractFCPropsType<T> = T extends FC<infer P> ? P : never;
107
+ type ReactifyProps<T, K extends keyof T> = Omit<T, K> & {
108
+ [P in K]: Selector<T[P]>;
109
+ };
102
110
  declare const hasSymbol: false | ((key: string) => symbol);
103
111
  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>>;
108
- declare function reactiveComponents<P extends Record<string, FC>>(components: P): ObjectShapeWith$<P>;
112
+ declare function reactive<T extends object>(component: React.ComponentClass<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
113
+ declare function reactive<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
114
+ declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
115
+ 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>>;
116
+ 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>>;
117
+ declare function reactive<T extends object>(component: React.ComponentClass<T>): React.ComponentClass<ShapeWith$<T>>;
118
+ declare function reactive<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
119
+ declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
120
+ declare function reactiveObserver<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
121
+ declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
122
+ 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>>;
123
+ 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>>;
124
+ declare function reactiveObserver<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
125
+ declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
126
+ declare function reactiveComponents<P extends Record<string, any>>(components: P): ObjectShapeWith$<P>;
109
127
 
110
128
  declare function useComputed<T>(get: () => T | Promise<T>): Observable<T>;
111
129
  declare function useComputed<T>(get: () => T | Promise<T>, deps: any[]): Observable<T>;
@@ -151,12 +169,14 @@ declare function useSelector<T>(selector: Selector<T>, options?: UseSelectorOpti
151
169
  declare function useUnmount(fn: () => void): void;
152
170
  declare const useUnmountOnce: typeof useUnmount;
153
171
 
154
- declare function useWhen<T>(predicate: Selector<T>, effect: (value: T) => any | (() => any)): Promise<any>;
155
- declare function useWhenReady<T>(predicate: Selector<T>, effect: (value: T) => any | (() => any)): Promise<any>;
172
+ declare function useWhen<T>(predicate: Selector<T>): Promise<T>;
173
+ declare function useWhen<T, T2>(predicate: Selector<T>, effect: (value: T) => T2): Promise<T2>;
174
+ declare function useWhenReady<T>(predicate: Selector<T>): Promise<T>;
175
+ declare function useWhenReady<T, T2>(predicate: Selector<T>, effect: (value: T) => T2 | (() => T2)): Promise<T2>;
156
176
 
157
177
  declare function configureReactive({ components, binders, }: {
158
178
  components?: Record<string, FC | ComponentClass<any>>;
159
179
  binders?: Record<string, BindKeys>;
160
180
  }): void;
161
181
 
162
- 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 };
182
+ 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, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useWhen, useWhenReady };
package/react.js CHANGED
@@ -45,6 +45,7 @@ function createSelectorFunctions(options, isPaused$) {
45
45
  } = state.trackSelector(
46
46
  _selector,
47
47
  _update,
48
+ options,
48
49
  void 0,
49
50
  void 0,
50
51
  /*createResubscribe*/
@@ -100,12 +101,24 @@ function createSelectorFunctions(options, isPaused$) {
100
101
  }
101
102
  };
102
103
  }
104
+ function doSuspense(selector) {
105
+ const vProm = state.when(selector);
106
+ if (React__default.default.use) {
107
+ React__default.default.use(vProm);
108
+ } else {
109
+ throw vProm;
110
+ }
111
+ }
103
112
  function useSelector(selector, options) {
104
113
  var _a;
114
+ let value;
105
115
  if (reactGlobals.inObserver && state.isObservable(selector) && !(options == null ? void 0 : options.suspense)) {
106
- return state.computeSelector(selector);
116
+ value = state.computeSelector(selector, options);
117
+ if ((options == null ? void 0 : options.suspense) && value === void 0) {
118
+ doSuspense(selector);
119
+ }
120
+ return value;
107
121
  }
108
- let value;
109
122
  try {
110
123
  const isPaused$ = React.useContext(getPauseContext());
111
124
  const selectorFn = React.useMemo(() => createSelectorFunctions(options, isPaused$), []);
@@ -120,16 +133,8 @@ function useSelector(selector, options) {
120
133
  }
121
134
  throw err;
122
135
  }
123
- if (options == null ? void 0 : options.suspense) {
124
- const isProm = state.isPromise(value);
125
- if (state.isPromise(value) || !value && state.isObservable(selector)) {
126
- const vProm = isProm ? value : state.when(selector);
127
- if (React__default.default.use) {
128
- React__default.default.use(vProm);
129
- } else {
130
- throw vProm;
131
- }
132
- }
136
+ if ((options == null ? void 0 : options.suspense) && value === void 0) {
137
+ doSuspense(selector);
133
138
  }
134
139
  return value;
135
140
  }
@@ -140,7 +145,7 @@ function Computed({ children }) {
140
145
  }
141
146
  var hasSymbol = typeof Symbol === "function" && Symbol.for;
142
147
  var didWarnProps = false;
143
- function createReactiveComponent(component, observe3, reactive2, bindKeys) {
148
+ function createReactiveComponent(component, observe3, reactive2, keysReactive, bindKeys) {
144
149
  const ReactForwardRefSymbol = hasSymbol ? Symbol.for("react.forward_ref") : (
145
150
  // eslint-disable-next-line react/display-name, @typescript-eslint/no-unused-vars
146
151
  typeof React.forwardRef === "function" && React.forwardRef((props) => null)["$$typeof"]
@@ -165,6 +170,7 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
165
170
  throw new Error(`[legend-state] \`render\` property of ForwardRef was not a function`);
166
171
  }
167
172
  }
173
+ const keysReactiveSet = keysReactive ? new Set(keysReactive) : void 0;
168
174
  const proxyHandler = {
169
175
  apply(target, thisArg, argArray) {
170
176
  if (reactive2) {
@@ -174,9 +180,10 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
174
180
  for (let i = 0; i < keys.length; i++) {
175
181
  const key = keys[i];
176
182
  const p = props[key];
183
+ const isReactiveKey = keysReactiveSet && keysReactiveSet.has(key);
177
184
  if (key === "children" && (state.isFunction(p) || state.isObservable(p))) {
178
185
  props[key] = useSelector(p, { skipCheck: true });
179
- } else if (key.startsWith("$") || key.endsWith("$")) {
186
+ } else if (isReactiveKey || key.startsWith("$") || key.endsWith("$")) {
180
187
  if (process.env.NODE_ENV === "development" && !didWarnProps && key.endsWith("$")) {
181
188
  didWarnProps = true;
182
189
  console.warn(
@@ -186,7 +193,7 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
186
193
  )}. See https://legendapp.com/open-source/state/migrating for more details.`
187
194
  );
188
195
  }
189
- const k = key.endsWith("$") ? key.slice(0, -1) : key.slice(1);
196
+ const k = isReactiveKey ? key : key.endsWith("$") ? key.slice(0, -1) : key.slice(1);
190
197
  const bind = bindKeys == null ? void 0 : bindKeys[k];
191
198
  const shouldBind = bind && state.isObservable(p);
192
199
  propsOut[k] = shouldBind && (bind == null ? void 0 : bind.selector) ? bind.selector(propsOut, p) : useSelector(p);
@@ -204,7 +211,9 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
204
211
  process.env.NODE_ENV === "development" ? handlerFn : React.useCallback(handlerFn, [props[bind.handler], bindKeys]);
205
212
  }
206
213
  }
207
- delete propsOut[key];
214
+ if (!isReactiveKey) {
215
+ delete propsOut[key];
216
+ }
208
217
  } else if (propsOut[key] === void 0) {
209
218
  propsOut[key] = p;
210
219
  }
@@ -241,11 +250,11 @@ function createReactiveComponent(component, observe3, reactive2, bindKeys) {
241
250
  function observer(component) {
242
251
  return createReactiveComponent(component, true);
243
252
  }
244
- function reactive(component, bindKeys) {
245
- return createReactiveComponent(component, false, true, bindKeys);
253
+ function reactive(component, keys, bindKeys) {
254
+ return createReactiveComponent(component, false, true, keys, bindKeys);
246
255
  }
247
- function reactiveObserver(component, bindKeys) {
248
- return createReactiveComponent(component, true, true, bindKeys);
256
+ function reactiveObserver(component, keys, bindKeys) {
257
+ return createReactiveComponent(component, true, true, keys, bindKeys);
249
258
  }
250
259
  function reactiveComponents(components) {
251
260
  return new Proxy(
@@ -336,7 +345,10 @@ function For({
336
345
  }
337
346
  return out;
338
347
  }
339
- var Memo = React.memo(Computed, () => true);
348
+ var Memo = React.memo(
349
+ Computed,
350
+ (prev, next) => next.scoped ? prev.children === next.children : true
351
+ );
340
352
 
341
353
  // src/react/configureReactive.ts
342
354
  var ReactiveFns = /* @__PURE__ */ new Map();
@@ -371,7 +383,7 @@ var Reactive = new Proxy(
371
383
  }
372
384
  return React.createElement(Component, propsOut);
373
385
  });
374
- target[p] = reactive(render, ReactiveFnBinders.get(p));
386
+ target[p] = reactive(render, [], ReactiveFnBinders.get(p));
375
387
  }
376
388
  return target[p];
377
389
  }
@@ -516,7 +528,7 @@ function useObserve(selector, reactionOrOptions, options) {
516
528
  ref.current.reaction = reaction;
517
529
  if (!ref.current.dispose) {
518
530
  ref.current.dispose = state.observe(
519
- (e) => state.computeSelector(ref.current.selector, e),
531
+ (e) => state.computeSelector(ref.current.selector, void 0, e),
520
532
  (e) => {
521
533
  var _a, _b;
522
534
  return (_b = (_a = ref.current).reaction) == null ? void 0 : _b.call(_a, e);
@@ -578,6 +590,7 @@ exports.observer = observer;
578
590
  exports.reactive = reactive;
579
591
  exports.reactiveComponents = reactiveComponents;
580
592
  exports.reactiveObserver = reactiveObserver;
593
+ exports.use$ = useSelector;
581
594
  exports.useComputed = useComputed;
582
595
  exports.useEffectOnce = useEffectOnce;
583
596
  exports.useIsMounted = useIsMounted;