@legendapp/state 3.0.0-beta.2 → 3.0.0-beta.21

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 +13 -4
  9. package/index.d.ts +13 -4
  10. package/index.js +70 -22
  11. package/index.mjs +70 -22
  12. package/package.json +22 -1
  13. package/persist-plugins/async-storage.js +17 -9
  14. package/persist-plugins/async-storage.mjs +17 -9
  15. package/react-native.d.mts +4 -0
  16. package/react-native.d.ts +4 -0
  17. package/react-native.js +53 -0
  18. package/react-native.mjs +40 -0
  19. package/react-reactive/Components.d.mts +19 -0
  20. package/react-reactive/Components.d.ts +19 -0
  21. package/react-reactive/Components.js +53 -0
  22. package/react-reactive/Components.mjs +40 -0
  23. package/react-reactive/enableReactComponents.d.mts +3 -2
  24. package/react-reactive/enableReactComponents.d.ts +3 -2
  25. package/react-reactive/enableReactComponents.js +10 -3
  26. package/react-reactive/enableReactComponents.mjs +10 -3
  27. package/react-reactive/enableReactNativeComponents.d.mts +3 -20
  28. package/react-reactive/enableReactNativeComponents.d.ts +3 -20
  29. package/react-reactive/enableReactNativeComponents.js +8 -3
  30. package/react-reactive/enableReactNativeComponents.mjs +8 -3
  31. package/react-reactive/enableReactive.js +10 -3
  32. package/react-reactive/enableReactive.mjs +10 -3
  33. package/react-reactive/enableReactive.native.js +8 -3
  34. package/react-reactive/enableReactive.native.mjs +8 -3
  35. package/react-reactive/enableReactive.web.js +8 -3
  36. package/react-reactive/enableReactive.web.mjs +8 -3
  37. package/react-web.d.mts +6 -0
  38. package/react-web.d.ts +6 -0
  39. package/react-web.js +39 -0
  40. package/react-web.mjs +37 -0
  41. package/react.d.mts +38 -20
  42. package/react.d.ts +38 -20
  43. package/react.js +36 -23
  44. package/react.mjs +37 -25
  45. package/sync-plugins/crud.d.mts +24 -9
  46. package/sync-plugins/crud.d.ts +24 -9
  47. package/sync-plugins/crud.js +199 -108
  48. package/sync-plugins/crud.mjs +200 -109
  49. package/sync-plugins/firebase.d.mts +7 -3
  50. package/sync-plugins/firebase.d.ts +7 -3
  51. package/sync-plugins/firebase.js +4 -2
  52. package/sync-plugins/firebase.mjs +4 -2
  53. package/sync-plugins/keel.d.mts +9 -13
  54. package/sync-plugins/keel.d.ts +9 -13
  55. package/sync-plugins/keel.js +52 -41
  56. package/sync-plugins/keel.mjs +53 -37
  57. package/sync-plugins/supabase.d.mts +7 -3
  58. package/sync-plugins/supabase.d.ts +7 -3
  59. package/sync-plugins/supabase.js +87 -31
  60. package/sync-plugins/supabase.mjs +88 -32
  61. package/sync-plugins/tanstack-query.d.mts +5 -5
  62. package/sync-plugins/tanstack-query.d.ts +5 -5
  63. package/sync-plugins/tanstack-query.js +10 -1
  64. package/sync-plugins/tanstack-query.mjs +10 -1
  65. package/sync-plugins/tanstack-react-query.d.mts +4 -2
  66. package/sync-plugins/tanstack-react-query.d.ts +4 -2
  67. package/sync.d.mts +16 -8
  68. package/sync.d.ts +16 -8
  69. package/sync.js +267 -174
  70. package/sync.mjs +266 -174
  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/.DS_Store CHANGED
Binary file
@@ -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
@@ -1,7 +1,8 @@
1
1
  interface ReactTrackingOptions {
2
2
  auto?: boolean;
3
3
  warnUnobserved?: boolean;
4
+ warnMissingUse?: boolean;
4
5
  }
5
- declare function enableReactTracking({ auto, warnUnobserved }: ReactTrackingOptions): void;
6
+ declare function enableReactTracking({ auto, warnUnobserved, warnMissingUse }: ReactTrackingOptions): void;
6
7
 
7
8
  export { enableReactTracking };
@@ -1,7 +1,8 @@
1
1
  interface ReactTrackingOptions {
2
2
  auto?: boolean;
3
3
  warnUnobserved?: boolean;
4
+ warnMissingUse?: boolean;
4
5
  }
5
- declare function enableReactTracking({ auto, warnUnobserved }: ReactTrackingOptions): void;
6
+ declare function enableReactTracking({ auto, warnUnobserved, warnMissingUse }: ReactTrackingOptions): void;
6
7
 
7
8
  export { enableReactTracking };
@@ -6,32 +6,51 @@ var react$1 = require('@legendapp/state/react');
6
6
  var react = require('react');
7
7
 
8
8
  // src/config/enableReactTracking.ts
9
- function enableReactTracking({ auto, warnUnobserved }) {
9
+ function enableReactTracking({ auto, warnUnobserved, warnMissingUse }) {
10
10
  const { get } = state.internal;
11
- if (auto || process.env.NODE_ENV === "development" && warnUnobserved) {
11
+ if (auto || process.env.NODE_ENV === "development" && (warnUnobserved || warnMissingUse)) {
12
12
  const ReactRenderContext = react.createContext(0);
13
- const needsSelector = () => {
14
- if (!state.tracking.current) {
15
- try {
16
- const dispatcher = react.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentDispatcher.current;
17
- if (dispatcher) {
18
- react.useContext(ReactRenderContext);
19
- return true;
20
- }
21
- } catch (e) {
13
+ const isInRender = () => {
14
+ try {
15
+ const dispatcher = react.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentDispatcher.current;
16
+ if (dispatcher) {
17
+ react.useContext(ReactRenderContext);
18
+ return true;
22
19
  }
20
+ } catch (e) {
21
+ }
22
+ return false;
23
+ };
24
+ const isObserved = () => {
25
+ return !!state.tracking.current;
26
+ };
27
+ const needsSelector = () => {
28
+ if (!isObserved()) {
29
+ return isInRender();
23
30
  }
24
31
  return false;
25
32
  };
26
33
  configureLegendState.configureLegendState({
27
34
  observableFunctions: {
28
35
  get: (node, options) => {
29
- if (needsSelector()) {
36
+ if (process.env.NODE_ENV === "development" && warnMissingUse) {
37
+ if (isInRender()) {
38
+ if (isObserved()) {
39
+ console.warn(
40
+ "[legend-state] Detected a `get()` call in an observer component. It is recommended to use the `use$` hook instead to be compatible with React Compiler: https://legendapp.com/open-source/state/v3/react/react-api/#use$"
41
+ );
42
+ } else {
43
+ console.warn(
44
+ "[legend-state] Detected a `get()` call in a component. You likely want to use the `use$` hook to be reactive to it changing, or change `get()` to `peek()` to get the value without tracking: https://legendapp.com/open-source/state/v3/react/react-api/#use$"
45
+ );
46
+ }
47
+ }
48
+ } else if (needsSelector()) {
30
49
  if (auto) {
31
50
  return react$1.useSelector(() => get(node, options), state.isObject(options) ? options : void 0);
32
51
  } else if (process.env.NODE_ENV === "development" && warnUnobserved) {
33
52
  console.warn(
34
- "[legend-state] Detected a `get()` call in an unobserved component. You may want to wrap it in observer: https://legendapp.com/open-source/state/react-api/#observer-hoc"
53
+ "[legend-state] Detected a `get()` call in an unobserved component. You may want to wrap it in observer: https://legendapp.com/open-source/state/v3/react/react-api/#observer"
35
54
  );
36
55
  }
37
56
  }
@@ -4,32 +4,51 @@ import { useSelector } from '@legendapp/state/react';
4
4
  import { createContext, __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, useContext } from 'react';
5
5
 
6
6
  // src/config/enableReactTracking.ts
7
- function enableReactTracking({ auto, warnUnobserved }) {
7
+ function enableReactTracking({ auto, warnUnobserved, warnMissingUse }) {
8
8
  const { get } = internal;
9
- if (auto || process.env.NODE_ENV === "development" && warnUnobserved) {
9
+ if (auto || process.env.NODE_ENV === "development" && (warnUnobserved || warnMissingUse)) {
10
10
  const ReactRenderContext = createContext(0);
11
- const needsSelector = () => {
12
- if (!tracking.current) {
13
- try {
14
- const dispatcher = __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentDispatcher.current;
15
- if (dispatcher) {
16
- useContext(ReactRenderContext);
17
- return true;
18
- }
19
- } catch (e) {
11
+ const isInRender = () => {
12
+ try {
13
+ const dispatcher = __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentDispatcher.current;
14
+ if (dispatcher) {
15
+ useContext(ReactRenderContext);
16
+ return true;
20
17
  }
18
+ } catch (e) {
19
+ }
20
+ return false;
21
+ };
22
+ const isObserved = () => {
23
+ return !!tracking.current;
24
+ };
25
+ const needsSelector = () => {
26
+ if (!isObserved()) {
27
+ return isInRender();
21
28
  }
22
29
  return false;
23
30
  };
24
31
  configureLegendState({
25
32
  observableFunctions: {
26
33
  get: (node, options) => {
27
- if (needsSelector()) {
34
+ if (process.env.NODE_ENV === "development" && warnMissingUse) {
35
+ if (isInRender()) {
36
+ if (isObserved()) {
37
+ console.warn(
38
+ "[legend-state] Detected a `get()` call in an observer component. It is recommended to use the `use$` hook instead to be compatible with React Compiler: https://legendapp.com/open-source/state/v3/react/react-api/#use$"
39
+ );
40
+ } else {
41
+ console.warn(
42
+ "[legend-state] Detected a `get()` call in a component. You likely want to use the `use$` hook to be reactive to it changing, or change `get()` to `peek()` to get the value without tracking: https://legendapp.com/open-source/state/v3/react/react-api/#use$"
43
+ );
44
+ }
45
+ }
46
+ } else if (needsSelector()) {
28
47
  if (auto) {
29
48
  return useSelector(() => get(node, options), isObject(options) ? options : void 0);
30
49
  } else if (process.env.NODE_ENV === "development" && warnUnobserved) {
31
50
  console.warn(
32
- "[legend-state] Detected a `get()` call in an unobserved component. You may want to wrap it in observer: https://legendapp.com/open-source/state/react-api/#observer-hoc"
51
+ "[legend-state] Detected a `get()` call in an unobserved component. You may want to wrap it in observer: https://legendapp.com/open-source/state/v3/react/react-api/#observer"
33
52
  );
34
53
  }
35
54
  }
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;
@@ -115,7 +116,7 @@ declare function findIDKey(obj: unknown | undefined, node: NodeInfo): string | (
115
116
 
116
117
  type TrackingType = undefined | true | symbol;
117
118
  interface GetOptions {
118
- shallow: boolean;
119
+ shallow?: boolean;
119
120
  }
120
121
  type OpaqueObject<T> = T & {
121
122
  [symbolOpaque]: true;
@@ -152,6 +153,7 @@ type ObservableListenerDispose = () => void;
152
153
  interface ObservableRoot {
153
154
  _: any;
154
155
  set?: (value: any) => void;
156
+ isLoadingLocal?: boolean;
155
157
  }
156
158
  type Primitive = boolean | string | number | Date;
157
159
  type NotPrimitive<T> = T extends Primitive ? never : T;
@@ -187,6 +189,7 @@ interface BaseNodeInfo {
187
189
  numListenersRecursive: number;
188
190
  state?: Observable<ObservableSyncState>;
189
191
  activated?: boolean;
192
+ isPlain?: boolean;
190
193
  recursivelyAutoActivated?: boolean;
191
194
  activationState?: LinkedOptions & {
192
195
  onError?: () => void;
@@ -246,8 +249,13 @@ interface UpdateFnParams<T = any> {
246
249
  value: T;
247
250
  mode?: GetMode;
248
251
  lastSync?: number | undefined;
252
+ changes?: Change[];
253
+ }
254
+ interface UpdateSetFnParams<T = any> extends UpdateFnParams<T> {
255
+ lastSync?: never;
249
256
  }
250
257
  type UpdateFn<T = any> = (params: UpdateFnParams<T>) => void;
258
+ type UpdateSetFn<T = any> = (params: UpdateSetFnParams<T>) => void;
251
259
  type Linked<T> = T;
252
260
  interface ObserveOptions {
253
261
  immediate?: boolean;
@@ -288,6 +296,7 @@ interface RetryOptions {
288
296
  declare const ObservableHint: {
289
297
  opaque: <T extends object>(value: T) => OpaqueObject<T>;
290
298
  plain: <T extends object>(value: T) => PlainObject<T>;
299
+ function: <T extends object>(value: T) => PlainObject<T>;
291
300
  };
292
301
 
293
302
  declare function getProxy(node: NodeInfo, p?: string, asFunction?: Function): Observable;
@@ -307,7 +316,7 @@ declare function computed<T, T2 = T>(get: (() => RecursiveValueOrFunction<T>) |
307
316
 
308
317
  declare function event(): ObservableEvent;
309
318
 
310
- declare function computeSelector<T>(selector: Selector<T>, e?: ObserveEvent<T>, retainObservable?: boolean): T;
319
+ declare function computeSelector<T>(selector: Selector<T>, getOptions?: GetOptions, e?: ObserveEvent<T>, retainObservable?: boolean): T;
311
320
  declare function getObservableIndex(value$: ObservableParam): number;
312
321
  declare function opaqueObject<T extends object>(value: T): OpaqueObject<T>;
313
322
  declare function getValueAtPath(obj: Record<string, any>, path: string[]): any;
@@ -357,7 +366,7 @@ declare function proxy<T>(get: (key: string) => T): Observable<Record<string, T>
357
366
 
358
367
  declare function syncState(obs: ObservableParam): Observable<ObservableSyncState>;
359
368
 
360
- declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
369
+ declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, getOptions?: GetOptions, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
361
370
  nodes: Map<NodeInfo, TrackingNode> | undefined;
362
371
  value: T;
363
372
  dispose: (() => void) | undefined;
@@ -426,4 +435,4 @@ declare const internal: {
426
435
  };
427
436
  };
428
437
 
429
- 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 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 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 };
438
+ 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 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
@@ -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;
@@ -115,7 +116,7 @@ declare function findIDKey(obj: unknown | undefined, node: NodeInfo): string | (
115
116
 
116
117
  type TrackingType = undefined | true | symbol;
117
118
  interface GetOptions {
118
- shallow: boolean;
119
+ shallow?: boolean;
119
120
  }
120
121
  type OpaqueObject<T> = T & {
121
122
  [symbolOpaque]: true;
@@ -152,6 +153,7 @@ type ObservableListenerDispose = () => void;
152
153
  interface ObservableRoot {
153
154
  _: any;
154
155
  set?: (value: any) => void;
156
+ isLoadingLocal?: boolean;
155
157
  }
156
158
  type Primitive = boolean | string | number | Date;
157
159
  type NotPrimitive<T> = T extends Primitive ? never : T;
@@ -187,6 +189,7 @@ interface BaseNodeInfo {
187
189
  numListenersRecursive: number;
188
190
  state?: Observable<ObservableSyncState>;
189
191
  activated?: boolean;
192
+ isPlain?: boolean;
190
193
  recursivelyAutoActivated?: boolean;
191
194
  activationState?: LinkedOptions & {
192
195
  onError?: () => void;
@@ -246,8 +249,13 @@ interface UpdateFnParams<T = any> {
246
249
  value: T;
247
250
  mode?: GetMode;
248
251
  lastSync?: number | undefined;
252
+ changes?: Change[];
253
+ }
254
+ interface UpdateSetFnParams<T = any> extends UpdateFnParams<T> {
255
+ lastSync?: never;
249
256
  }
250
257
  type UpdateFn<T = any> = (params: UpdateFnParams<T>) => void;
258
+ type UpdateSetFn<T = any> = (params: UpdateSetFnParams<T>) => void;
251
259
  type Linked<T> = T;
252
260
  interface ObserveOptions {
253
261
  immediate?: boolean;
@@ -288,6 +296,7 @@ interface RetryOptions {
288
296
  declare const ObservableHint: {
289
297
  opaque: <T extends object>(value: T) => OpaqueObject<T>;
290
298
  plain: <T extends object>(value: T) => PlainObject<T>;
299
+ function: <T extends object>(value: T) => PlainObject<T>;
291
300
  };
292
301
 
293
302
  declare function getProxy(node: NodeInfo, p?: string, asFunction?: Function): Observable;
@@ -307,7 +316,7 @@ declare function computed<T, T2 = T>(get: (() => RecursiveValueOrFunction<T>) |
307
316
 
308
317
  declare function event(): ObservableEvent;
309
318
 
310
- declare function computeSelector<T>(selector: Selector<T>, e?: ObserveEvent<T>, retainObservable?: boolean): T;
319
+ declare function computeSelector<T>(selector: Selector<T>, getOptions?: GetOptions, e?: ObserveEvent<T>, retainObservable?: boolean): T;
311
320
  declare function getObservableIndex(value$: ObservableParam): number;
312
321
  declare function opaqueObject<T extends object>(value: T): OpaqueObject<T>;
313
322
  declare function getValueAtPath(obj: Record<string, any>, path: string[]): any;
@@ -357,7 +366,7 @@ declare function proxy<T>(get: (key: string) => T): Observable<Record<string, T>
357
366
 
358
367
  declare function syncState(obs: ObservableParam): Observable<ObservableSyncState>;
359
368
 
360
- declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
369
+ declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, getOptions?: GetOptions, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
361
370
  nodes: Map<NodeInfo, TrackingNode> | undefined;
362
371
  value: T;
363
372
  dispose: (() => void) | undefined;
@@ -426,4 +435,4 @@ declare const internal: {
426
435
  };
427
436
  };
428
437
 
429
- 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 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 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 };
438
+ 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 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
@@ -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) {
@@ -276,16 +276,19 @@ var ObservableHint = {
276
276
  },
277
277
  plain: function plainObject(value) {
278
278
  return addSymbol(value, symbolPlain);
279
+ },
280
+ function: function plainObject2(value) {
281
+ return addSymbol(value, symbolPlain);
279
282
  }
280
283
  };
281
284
 
282
285
  // src/helpers.ts
283
- function computeSelector(selector, e, retainObservable) {
286
+ function computeSelector(selector, getOptions, e, retainObservable) {
284
287
  let c = selector;
285
288
  if (!isObservable(c) && isFunction(c)) {
286
289
  c = e ? c(e) : c();
287
290
  }
288
- return isObservable(c) && !retainObservable ? c.get() : c;
291
+ return isObservable(c) && !retainObservable ? c.get(getOptions) : c;
289
292
  }
290
293
  function getObservableIndex(value$) {
291
294
  const node = getNode(value$);
@@ -384,7 +387,7 @@ function _mergeIntoObservable(target, source, levelsDeep) {
384
387
  const isSourceSet = isSet(source);
385
388
  if (isSourceSet && isSet(targetValue)) {
386
389
  target.set(/* @__PURE__ */ new Set([...source, ...targetValue]));
387
- } else if (isTargetObj && isObject(source) && !isEmpty(targetValue) || isTargetArr && targetValue.length > 0) {
390
+ } else if (isTargetObj && isObject(source) || isTargetArr && targetValue.length > 0) {
388
391
  const keys = isSourceMap || isSourceSet ? Array.from(source.keys()) : Object.keys(source);
389
392
  for (let i = 0; i < keys.length; i++) {
390
393
  const key = keys[i];
@@ -969,13 +972,13 @@ function updateTracking(node, track) {
969
972
  }
970
973
 
971
974
  // src/trackSelector.ts
972
- function trackSelector(selector, update, observeEvent, observeOptions, createResubscribe) {
975
+ function trackSelector(selector, update, getOptions, observeEvent, observeOptions, createResubscribe) {
973
976
  var _a;
974
977
  let dispose;
975
978
  let resubscribe;
976
979
  let updateFn = update;
977
980
  beginTracking();
978
- const value = selector ? computeSelector(selector, observeEvent, observeOptions == null ? void 0 : observeOptions.fromComputed) : selector;
981
+ const value = selector ? computeSelector(selector, getOptions, observeEvent, observeOptions == null ? void 0 : observeOptions.fromComputed) : selector;
979
982
  const tracker = tracking.current;
980
983
  const nodes = tracker.nodes;
981
984
  endTracking();
@@ -1023,7 +1026,11 @@ function observe(selectorOrRun, reactionOrOptions, options) {
1023
1026
  beginBatch();
1024
1027
  delete e.value;
1025
1028
  dispose == null ? void 0 : dispose();
1026
- const { dispose: _dispose, value, nodes } = trackSelector(selectorOrRun, update, e, options);
1029
+ const {
1030
+ dispose: _dispose,
1031
+ value,
1032
+ nodes
1033
+ } = trackSelector(selectorOrRun, update, void 0, e, options);
1027
1034
  dispose = _dispose;
1028
1035
  e.value = value;
1029
1036
  e.nodes = nodes;
@@ -1068,10 +1075,13 @@ function _when(predicate, effect, checkReady) {
1068
1075
  let isOk = true;
1069
1076
  if (isArray(ret)) {
1070
1077
  for (let i = 0; i < ret.length; i++) {
1071
- if (isObservable(ret[i])) {
1072
- ret[i] = computeSelector(ret[i]);
1078
+ let item = ret[i];
1079
+ if (isObservable(item)) {
1080
+ item = computeSelector(item);
1081
+ } else if (isFunction(item)) {
1082
+ item = item();
1073
1083
  }
1074
- isOk = isOk && !!(checkReady ? isObservableValueReady(ret[i]) : ret[i]);
1084
+ isOk = isOk && !!(checkReady ? isObservableValueReady(item) : item);
1075
1085
  }
1076
1086
  } else {
1077
1087
  isOk = checkReady ? isObservableValueReady(ret) : ret;
@@ -1170,8 +1180,8 @@ function collectionSetter(node, target, prop, ...args) {
1170
1180
  return ret;
1171
1181
  }
1172
1182
  }
1173
- function getKeys(obj, isArr, isMap2) {
1174
- return isArr ? void 0 : obj ? isMap2 ? Array.from(obj.keys()) : Object.keys(obj) : [];
1183
+ function getKeys(obj, isArr, isMap2, isSet2) {
1184
+ return isArr ? void 0 : obj ? isSet2 ? Array.from(obj) : isMap2 ? Array.from(obj.keys()) : Object.keys(obj) : [];
1175
1185
  }
1176
1186
  function updateNodes(parent, obj, prevValue) {
1177
1187
  var _a, _b, _c;
@@ -1201,9 +1211,11 @@ function updateNodes(parent, obj, prevValue) {
1201
1211
  let prevChildrenById;
1202
1212
  let moved;
1203
1213
  const isCurMap = isMap(obj);
1214
+ const isCurSet = isSet(obj);
1204
1215
  const isPrevMap = isMap(prevValue);
1205
- const keys = getKeys(obj, isArr, isCurMap);
1206
- const keysPrev = getKeys(prevValue, isArr, isPrevMap);
1216
+ const isPrevSet = isSet(prevValue);
1217
+ const keys = getKeys(obj, isArr, isCurMap, isCurSet);
1218
+ const keysPrev = getKeys(prevValue, isArr, isPrevMap, isPrevSet);
1207
1219
  const length = ((_a = keys || obj) == null ? void 0 : _a.length) || 0;
1208
1220
  const lengthPrev = ((_b = keysPrev || prevValue) == null ? void 0 : _b.length) || 0;
1209
1221
  let idField;
@@ -1553,7 +1565,9 @@ var proxyHandler = {
1553
1565
  if (isObservable(thisArg)) {
1554
1566
  thisArg = thisArg.peek();
1555
1567
  }
1556
- return Reflect.apply(target.lazyFn || target, thisArg, argArray);
1568
+ const fnRaw = getNodeValue(target);
1569
+ const fn = isFunction(fnRaw) ? fnRaw : target.lazyFn || target;
1570
+ return Reflect.apply(fn, thisArg, argArray);
1557
1571
  }
1558
1572
  };
1559
1573
  function set(node, newValue) {
@@ -1585,7 +1599,7 @@ function setKey(node, key, newValue, level) {
1585
1599
  if (isObservable(newValue)) {
1586
1600
  setToObservable(childNode, newValue);
1587
1601
  } else {
1588
- const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
1602
+ const { newValue: savedValue, prevValue, parentValue } = setNodeValue(childNode, newValue);
1589
1603
  const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
1590
1604
  if (!isPrim) {
1591
1605
  let parent = childNode;
@@ -1597,7 +1611,17 @@ function setKey(node, key, newValue, level) {
1597
1611
  const notify2 = !equals(savedValue, prevValue);
1598
1612
  const forceNotify = !notify2 && childNode.isComputing && !isPrim;
1599
1613
  if (notify2 || forceNotify) {
1600
- updateNodesAndNotify(node, savedValue, prevValue, childNode, isPrim, isRoot, level, forceNotify);
1614
+ updateNodesAndNotify(
1615
+ node,
1616
+ savedValue,
1617
+ prevValue,
1618
+ childNode,
1619
+ parentValue,
1620
+ isPrim,
1621
+ isRoot,
1622
+ level,
1623
+ forceNotify
1624
+ );
1601
1625
  }
1602
1626
  extractFunctionOrComputed(node, key, savedValue);
1603
1627
  }
@@ -1704,7 +1728,7 @@ function handlerMapSet(node, p, value) {
1704
1728
  };
1705
1729
  }
1706
1730
  }
1707
- function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
1731
+ function updateNodesAndNotify(node, newValue, prevValue, childNode, parentValue, isPrim, isRoot, level, forceNotify) {
1708
1732
  if (!childNode)
1709
1733
  childNode = node;
1710
1734
  beginBatch();
@@ -1713,15 +1737,29 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
1713
1737
  }
1714
1738
  let hasADiff = forceNotify || isPrim;
1715
1739
  let whenOptimizedOnlyIf = false;
1740
+ let valueAsArr;
1741
+ let valueAsMap;
1716
1742
  if (!isPrim || prevValue && !isPrimitive(prevValue)) {
1717
1743
  if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
1718
1744
  __devUpdateNodes.clear();
1719
1745
  }
1720
1746
  hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
1721
1747
  if (isArray(newValue)) {
1722
- whenOptimizedOnlyIf = (newValue == null ? void 0 : newValue.length) !== (prevValue == null ? void 0 : prevValue.length);
1748
+ valueAsArr = newValue;
1749
+ } else if (isMap(newValue) || isSet(newValue)) {
1750
+ valueAsMap = newValue;
1723
1751
  }
1724
1752
  }
1753
+ if (isArray(parentValue)) {
1754
+ valueAsArr = parentValue;
1755
+ } else if (isMap(parentValue) || isSet(parentValue)) {
1756
+ valueAsMap = parentValue;
1757
+ }
1758
+ if (valueAsArr) {
1759
+ whenOptimizedOnlyIf = (valueAsArr == null ? void 0 : valueAsArr.length) !== (prevValue == null ? void 0 : prevValue.length);
1760
+ } else if (valueAsMap) {
1761
+ whenOptimizedOnlyIf = (valueAsMap == null ? void 0 : valueAsMap.size) !== (prevValue == null ? void 0 : prevValue.size);
1762
+ }
1725
1763
  if (isPrim || !newValue || isEmpty(newValue) && !isEmpty(prevValue) ? newValue !== prevValue : hasADiff) {
1726
1764
  notify(
1727
1765
  isPrim && isRoot ? node : childNode,
@@ -1788,7 +1826,7 @@ function peek(node) {
1788
1826
  }
1789
1827
  var isFlushing = false;
1790
1828
  function peekInternal(node, activateRecursive) {
1791
- var _a;
1829
+ var _a, _b;
1792
1830
  isFlushing = true;
1793
1831
  if (activateRecursive && ((_a = node.dirtyChildren) == null ? void 0 : _a.size)) {
1794
1832
  const dirty = Array.from(node.dirtyChildren);
@@ -1803,7 +1841,10 @@ function peekInternal(node, activateRecursive) {
1803
1841
  }
1804
1842
  isFlushing = false;
1805
1843
  let value = getNodeValue(node);
1806
- if (!globalState.isLoadingLocal) {
1844
+ if (((_b = node.parent) == null ? void 0 : _b.isPlain) || isHintPlain(value)) {
1845
+ node.isPlain = true;
1846
+ }
1847
+ if (!node.root.isLoadingLocal && !node.isPlain) {
1807
1848
  value = checkLazy(node, value, !!activateRecursive);
1808
1849
  }
1809
1850
  return value;
@@ -2274,7 +2315,14 @@ function syncState(obs) {
2274
2315
  syncCount: 0,
2275
2316
  resetPersistence: void 0,
2276
2317
  reset: () => Promise.resolve(),
2277
- sync: () => Promise.resolve(),
2318
+ sync: () => {
2319
+ var _a;
2320
+ obs.peek();
2321
+ if ((_a = node.state) == null ? void 0 : _a.isGetting.peek()) {
2322
+ return when(node.state.isLoaded);
2323
+ }
2324
+ return Promise.resolve();
2325
+ },
2278
2326
  getPendingChanges: () => ({}),
2279
2327
  // TODOV3 remove
2280
2328
  clearPersist: void 0