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

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 +38 -5
  9. package/index.d.ts +38 -5
  10. package/index.js +202 -31
  11. package/index.mjs +202 -31
  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 +86 -63
  48. package/react.mjs +87 -65
  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/.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,14 +108,16 @@ 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;
114
115
  declare function findIDKey(obj: unknown | undefined, node: NodeInfo): string | ((value: any) => string) | undefined;
116
+ declare function getKeys(obj: Record<any, any> | Array<any> | undefined, isArr: boolean, isMap: boolean, isSet: boolean): string[];
115
117
 
116
118
  type TrackingType = undefined | true | symbol;
117
119
  interface GetOptions {
118
- shallow: boolean;
120
+ shallow?: boolean;
119
121
  }
120
122
  type OpaqueObject<T> = T & {
121
123
  [symbolOpaque]: true;
@@ -146,12 +148,13 @@ interface Change {
146
148
  type RecordValue<T> = T extends Record<string, infer t> ? t : never;
147
149
  type ArrayValue<T> = T extends Array<infer t> ? t : never;
148
150
  type ObservableValue<T> = T extends Observable<infer t> ? t : never;
149
- type Selector<T> = ObservableParam<T> | ObservableEvent | (() => T) | T;
151
+ type Selector<T> = ObservableParam<T> | ObservableEvent | (() => ObservableParam<T>) | (() => T) | T;
150
152
  type ClassConstructor<I, Args extends any[] = any[]> = new (...args: Args) => I;
151
153
  type ObservableListenerDispose = () => void;
152
154
  interface ObservableRoot {
153
155
  _: any;
154
156
  set?: (value: any) => void;
157
+ isLoadingLocal?: boolean;
155
158
  }
156
159
  type Primitive = boolean | string | number | Date;
157
160
  type NotPrimitive<T> = T extends Primitive ? never : T;
@@ -187,6 +190,7 @@ interface BaseNodeInfo {
187
190
  numListenersRecursive: number;
188
191
  state?: Observable<ObservableSyncState>;
189
192
  activated?: boolean;
193
+ isPlain?: boolean;
190
194
  recursivelyAutoActivated?: boolean;
191
195
  activationState?: LinkedOptions & {
192
196
  onError?: () => void;
@@ -246,8 +250,13 @@ interface UpdateFnParams<T = any> {
246
250
  value: T;
247
251
  mode?: GetMode;
248
252
  lastSync?: number | undefined;
253
+ changes?: Change[];
254
+ }
255
+ interface UpdateSetFnParams<T = any> extends UpdateFnParams<T> {
256
+ lastSync?: never;
249
257
  }
250
258
  type UpdateFn<T = any> = (params: UpdateFnParams<T>) => void;
259
+ type UpdateSetFn<T = any> = (params: UpdateSetFnParams<T>) => void;
251
260
  type Linked<T> = T;
252
261
  interface ObserveOptions {
253
262
  immediate?: boolean;
@@ -288,12 +297,15 @@ interface RetryOptions {
288
297
  declare const ObservableHint: {
289
298
  opaque: <T extends object>(value: T) => OpaqueObject<T>;
290
299
  plain: <T extends object>(value: T) => PlainObject<T>;
300
+ function: <T extends object>(value: T) => PlainObject<T>;
291
301
  };
292
302
 
293
303
  declare function getProxy(node: NodeInfo, p?: string, asFunction?: Function): Observable;
294
304
  declare function set(node: NodeInfo, newValue?: any): void;
295
305
  declare function get(node: NodeInfo, options?: TrackingType | GetOptions): any;
296
306
  declare function peek(node: NodeInfo): any;
307
+ declare function deactivateNode(node: NodeInfo): void;
308
+ declare function reactivateNode(node: NodeInfo, lazyFn: Function): void;
297
309
  declare function isObserved(node: NodeInfo): boolean;
298
310
  declare function shouldIgnoreUnobserved(node: NodeInfo, refreshFn: () => void): true | undefined;
299
311
 
@@ -307,7 +319,7 @@ declare function computed<T, T2 = T>(get: (() => RecursiveValueOrFunction<T>) |
307
319
 
308
320
  declare function event(): ObservableEvent;
309
321
 
310
- declare function computeSelector<T>(selector: Selector<T>, e?: ObserveEvent<T>, retainObservable?: boolean): T;
322
+ declare function computeSelector<T>(selector: Selector<T>, getOptions?: GetOptions, e?: ObserveEvent<T>, retainObservable?: boolean): T;
311
323
  declare function getObservableIndex(value$: ObservableParam): number;
312
324
  declare function opaqueObject<T extends object>(value: T): OpaqueObject<T>;
313
325
  declare function getValueAtPath(obj: Record<string, any>, path: string[]): any;
@@ -357,7 +369,7 @@ declare function proxy<T>(get: (key: string) => T): Observable<Record<string, T>
357
369
 
358
370
  declare function syncState(obs: ObservableParam): Observable<ObservableSyncState>;
359
371
 
360
- declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
372
+ declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, getOptions?: GetOptions, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
361
373
  nodes: Map<NodeInfo, TrackingNode> | undefined;
362
374
  value: T;
363
375
  dispose: (() => void) | undefined;
@@ -381,13 +393,32 @@ interface ObservablePrimitiveState {
381
393
  }
382
394
  declare function ObservablePrimitiveClass<T>(this: ObservablePrimitive<T> & ObservablePrimitiveState, node: NodeInfo): void;
383
395
 
396
+ type MiddlewareEventType = 'listener-added' | 'listener-removed' | 'listeners-cleared';
397
+ interface MiddlewareEvent {
398
+ type: MiddlewareEventType;
399
+ node: NodeInfo;
400
+ listener?: NodeListener;
401
+ timestamp: number;
402
+ }
403
+ type MiddlewareHandler = (event: MiddlewareEvent) => void;
404
+ /**
405
+ * Register a middleware handler for a specific node and event type
406
+ * @param node The node to register the middleware handler for
407
+ * @param type The event type to handle
408
+ * @param handler The middleware handler function
409
+ * @returns A function to remove the handler
410
+ */
411
+ declare function registerMiddleware(node: NodeInfo, type: MiddlewareEventType, handler: MiddlewareHandler): () => void;
412
+
384
413
  declare const internal: {
385
414
  createPreviousHandler: typeof createPreviousHandler;
386
415
  clone: typeof clone;
416
+ deactivateNode: typeof deactivateNode;
387
417
  deepMerge: typeof deepMerge;
388
418
  ensureNodeValue: typeof ensureNodeValue;
389
419
  findIDKey: typeof findIDKey;
390
420
  get: typeof get;
421
+ getKeys: typeof getKeys;
391
422
  getNode: typeof getNode;
392
423
  getNodeValue: typeof getNodeValue;
393
424
  getPathType: typeof getPathType;
@@ -414,6 +445,8 @@ declare const internal: {
414
445
  observableFns: Map<string, (node: NodeInfo, ...args: any[]) => any>;
415
446
  optimized: symbol;
416
447
  peek: typeof peek;
448
+ reactivateNode: typeof reactivateNode;
449
+ registerMiddleware: typeof registerMiddleware;
417
450
  safeParse: typeof safeParse;
418
451
  safeStringify: typeof safeStringify;
419
452
  set: typeof set;
@@ -426,4 +459,4 @@ declare const internal: {
426
459
  };
427
460
  };
428
461
 
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 };
462
+ 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,14 +108,16 @@ 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;
114
115
  declare function findIDKey(obj: unknown | undefined, node: NodeInfo): string | ((value: any) => string) | undefined;
116
+ declare function getKeys(obj: Record<any, any> | Array<any> | undefined, isArr: boolean, isMap: boolean, isSet: boolean): string[];
115
117
 
116
118
  type TrackingType = undefined | true | symbol;
117
119
  interface GetOptions {
118
- shallow: boolean;
120
+ shallow?: boolean;
119
121
  }
120
122
  type OpaqueObject<T> = T & {
121
123
  [symbolOpaque]: true;
@@ -146,12 +148,13 @@ interface Change {
146
148
  type RecordValue<T> = T extends Record<string, infer t> ? t : never;
147
149
  type ArrayValue<T> = T extends Array<infer t> ? t : never;
148
150
  type ObservableValue<T> = T extends Observable<infer t> ? t : never;
149
- type Selector<T> = ObservableParam<T> | ObservableEvent | (() => T) | T;
151
+ type Selector<T> = ObservableParam<T> | ObservableEvent | (() => ObservableParam<T>) | (() => T) | T;
150
152
  type ClassConstructor<I, Args extends any[] = any[]> = new (...args: Args) => I;
151
153
  type ObservableListenerDispose = () => void;
152
154
  interface ObservableRoot {
153
155
  _: any;
154
156
  set?: (value: any) => void;
157
+ isLoadingLocal?: boolean;
155
158
  }
156
159
  type Primitive = boolean | string | number | Date;
157
160
  type NotPrimitive<T> = T extends Primitive ? never : T;
@@ -187,6 +190,7 @@ interface BaseNodeInfo {
187
190
  numListenersRecursive: number;
188
191
  state?: Observable<ObservableSyncState>;
189
192
  activated?: boolean;
193
+ isPlain?: boolean;
190
194
  recursivelyAutoActivated?: boolean;
191
195
  activationState?: LinkedOptions & {
192
196
  onError?: () => void;
@@ -246,8 +250,13 @@ interface UpdateFnParams<T = any> {
246
250
  value: T;
247
251
  mode?: GetMode;
248
252
  lastSync?: number | undefined;
253
+ changes?: Change[];
254
+ }
255
+ interface UpdateSetFnParams<T = any> extends UpdateFnParams<T> {
256
+ lastSync?: never;
249
257
  }
250
258
  type UpdateFn<T = any> = (params: UpdateFnParams<T>) => void;
259
+ type UpdateSetFn<T = any> = (params: UpdateSetFnParams<T>) => void;
251
260
  type Linked<T> = T;
252
261
  interface ObserveOptions {
253
262
  immediate?: boolean;
@@ -288,12 +297,15 @@ interface RetryOptions {
288
297
  declare const ObservableHint: {
289
298
  opaque: <T extends object>(value: T) => OpaqueObject<T>;
290
299
  plain: <T extends object>(value: T) => PlainObject<T>;
300
+ function: <T extends object>(value: T) => PlainObject<T>;
291
301
  };
292
302
 
293
303
  declare function getProxy(node: NodeInfo, p?: string, asFunction?: Function): Observable;
294
304
  declare function set(node: NodeInfo, newValue?: any): void;
295
305
  declare function get(node: NodeInfo, options?: TrackingType | GetOptions): any;
296
306
  declare function peek(node: NodeInfo): any;
307
+ declare function deactivateNode(node: NodeInfo): void;
308
+ declare function reactivateNode(node: NodeInfo, lazyFn: Function): void;
297
309
  declare function isObserved(node: NodeInfo): boolean;
298
310
  declare function shouldIgnoreUnobserved(node: NodeInfo, refreshFn: () => void): true | undefined;
299
311
 
@@ -307,7 +319,7 @@ declare function computed<T, T2 = T>(get: (() => RecursiveValueOrFunction<T>) |
307
319
 
308
320
  declare function event(): ObservableEvent;
309
321
 
310
- declare function computeSelector<T>(selector: Selector<T>, e?: ObserveEvent<T>, retainObservable?: boolean): T;
322
+ declare function computeSelector<T>(selector: Selector<T>, getOptions?: GetOptions, e?: ObserveEvent<T>, retainObservable?: boolean): T;
311
323
  declare function getObservableIndex(value$: ObservableParam): number;
312
324
  declare function opaqueObject<T extends object>(value: T): OpaqueObject<T>;
313
325
  declare function getValueAtPath(obj: Record<string, any>, path: string[]): any;
@@ -357,7 +369,7 @@ declare function proxy<T>(get: (key: string) => T): Observable<Record<string, T>
357
369
 
358
370
  declare function syncState(obs: ObservableParam): Observable<ObservableSyncState>;
359
371
 
360
- declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
372
+ declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, getOptions?: GetOptions, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
361
373
  nodes: Map<NodeInfo, TrackingNode> | undefined;
362
374
  value: T;
363
375
  dispose: (() => void) | undefined;
@@ -381,13 +393,32 @@ interface ObservablePrimitiveState {
381
393
  }
382
394
  declare function ObservablePrimitiveClass<T>(this: ObservablePrimitive<T> & ObservablePrimitiveState, node: NodeInfo): void;
383
395
 
396
+ type MiddlewareEventType = 'listener-added' | 'listener-removed' | 'listeners-cleared';
397
+ interface MiddlewareEvent {
398
+ type: MiddlewareEventType;
399
+ node: NodeInfo;
400
+ listener?: NodeListener;
401
+ timestamp: number;
402
+ }
403
+ type MiddlewareHandler = (event: MiddlewareEvent) => void;
404
+ /**
405
+ * Register a middleware handler for a specific node and event type
406
+ * @param node The node to register the middleware handler for
407
+ * @param type The event type to handle
408
+ * @param handler The middleware handler function
409
+ * @returns A function to remove the handler
410
+ */
411
+ declare function registerMiddleware(node: NodeInfo, type: MiddlewareEventType, handler: MiddlewareHandler): () => void;
412
+
384
413
  declare const internal: {
385
414
  createPreviousHandler: typeof createPreviousHandler;
386
415
  clone: typeof clone;
416
+ deactivateNode: typeof deactivateNode;
387
417
  deepMerge: typeof deepMerge;
388
418
  ensureNodeValue: typeof ensureNodeValue;
389
419
  findIDKey: typeof findIDKey;
390
420
  get: typeof get;
421
+ getKeys: typeof getKeys;
391
422
  getNode: typeof getNode;
392
423
  getNodeValue: typeof getNodeValue;
393
424
  getPathType: typeof getPathType;
@@ -414,6 +445,8 @@ declare const internal: {
414
445
  observableFns: Map<string, (node: NodeInfo, ...args: any[]) => any>;
415
446
  optimized: symbol;
416
447
  peek: typeof peek;
448
+ reactivateNode: typeof reactivateNode;
449
+ registerMiddleware: typeof registerMiddleware;
417
450
  safeParse: typeof safeParse;
418
451
  safeStringify: typeof safeStringify;
419
452
  set: typeof set;
@@ -426,4 +459,4 @@ declare const internal: {
426
459
  };
427
460
  };
428
461
 
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 };
462
+ 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 };