@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/.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;
@@ -152,6 +154,7 @@ 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,6 +297,7 @@ 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;
@@ -307,7 +317,7 @@ declare function computed<T, T2 = T>(get: (() => RecursiveValueOrFunction<T>) |
307
317
 
308
318
  declare function event(): ObservableEvent;
309
319
 
310
- declare function computeSelector<T>(selector: Selector<T>, e?: ObserveEvent<T>, retainObservable?: boolean): T;
320
+ declare function computeSelector<T>(selector: Selector<T>, getOptions?: GetOptions, e?: ObserveEvent<T>, retainObservable?: boolean): T;
311
321
  declare function getObservableIndex(value$: ObservableParam): number;
312
322
  declare function opaqueObject<T extends object>(value: T): OpaqueObject<T>;
313
323
  declare function getValueAtPath(obj: Record<string, any>, path: string[]): any;
@@ -357,7 +367,7 @@ declare function proxy<T>(get: (key: string) => T): Observable<Record<string, T>
357
367
 
358
368
  declare function syncState(obs: ObservableParam): Observable<ObservableSyncState>;
359
369
 
360
- declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
370
+ declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, getOptions?: GetOptions, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
361
371
  nodes: Map<NodeInfo, TrackingNode> | undefined;
362
372
  value: T;
363
373
  dispose: (() => void) | undefined;
@@ -381,6 +391,23 @@ interface ObservablePrimitiveState {
381
391
  }
382
392
  declare function ObservablePrimitiveClass<T>(this: ObservablePrimitive<T> & ObservablePrimitiveState, node: NodeInfo): void;
383
393
 
394
+ type MiddlewareEventType = 'listener-added' | 'listener-removed' | 'listeners-cleared';
395
+ interface MiddlewareEvent {
396
+ type: MiddlewareEventType;
397
+ node: NodeInfo;
398
+ listener?: NodeListener;
399
+ timestamp: number;
400
+ }
401
+ type MiddlewareHandler = (event: MiddlewareEvent) => void;
402
+ /**
403
+ * Register a middleware handler for a specific node and event type
404
+ * @param node The node to register the middleware handler for
405
+ * @param type The event type to handle
406
+ * @param handler The middleware handler function
407
+ * @returns A function to remove the handler
408
+ */
409
+ declare function registerMiddleware(node: NodeInfo, type: MiddlewareEventType, handler: MiddlewareHandler): () => void;
410
+
384
411
  declare const internal: {
385
412
  createPreviousHandler: typeof createPreviousHandler;
386
413
  clone: typeof clone;
@@ -388,6 +415,7 @@ declare const internal: {
388
415
  ensureNodeValue: typeof ensureNodeValue;
389
416
  findIDKey: typeof findIDKey;
390
417
  get: typeof get;
418
+ getKeys: typeof getKeys;
391
419
  getNode: typeof getNode;
392
420
  getNodeValue: typeof getNodeValue;
393
421
  getPathType: typeof getPathType;
@@ -414,6 +442,7 @@ declare const internal: {
414
442
  observableFns: Map<string, (node: NodeInfo, ...args: any[]) => any>;
415
443
  optimized: symbol;
416
444
  peek: typeof peek;
445
+ registerMiddleware: typeof registerMiddleware;
417
446
  safeParse: typeof safeParse;
418
447
  safeStringify: typeof safeStringify;
419
448
  set: typeof set;
@@ -426,4 +455,4 @@ declare const internal: {
426
455
  };
427
456
  };
428
457
 
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 };
458
+ 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;
@@ -152,6 +154,7 @@ 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,6 +297,7 @@ 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;
@@ -307,7 +317,7 @@ declare function computed<T, T2 = T>(get: (() => RecursiveValueOrFunction<T>) |
307
317
 
308
318
  declare function event(): ObservableEvent;
309
319
 
310
- declare function computeSelector<T>(selector: Selector<T>, e?: ObserveEvent<T>, retainObservable?: boolean): T;
320
+ declare function computeSelector<T>(selector: Selector<T>, getOptions?: GetOptions, e?: ObserveEvent<T>, retainObservable?: boolean): T;
311
321
  declare function getObservableIndex(value$: ObservableParam): number;
312
322
  declare function opaqueObject<T extends object>(value: T): OpaqueObject<T>;
313
323
  declare function getValueAtPath(obj: Record<string, any>, path: string[]): any;
@@ -357,7 +367,7 @@ declare function proxy<T>(get: (key: string) => T): Observable<Record<string, T>
357
367
 
358
368
  declare function syncState(obs: ObservableParam): Observable<ObservableSyncState>;
359
369
 
360
- declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
370
+ declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, getOptions?: GetOptions, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
361
371
  nodes: Map<NodeInfo, TrackingNode> | undefined;
362
372
  value: T;
363
373
  dispose: (() => void) | undefined;
@@ -381,6 +391,23 @@ interface ObservablePrimitiveState {
381
391
  }
382
392
  declare function ObservablePrimitiveClass<T>(this: ObservablePrimitive<T> & ObservablePrimitiveState, node: NodeInfo): void;
383
393
 
394
+ type MiddlewareEventType = 'listener-added' | 'listener-removed' | 'listeners-cleared';
395
+ interface MiddlewareEvent {
396
+ type: MiddlewareEventType;
397
+ node: NodeInfo;
398
+ listener?: NodeListener;
399
+ timestamp: number;
400
+ }
401
+ type MiddlewareHandler = (event: MiddlewareEvent) => void;
402
+ /**
403
+ * Register a middleware handler for a specific node and event type
404
+ * @param node The node to register the middleware handler for
405
+ * @param type The event type to handle
406
+ * @param handler The middleware handler function
407
+ * @returns A function to remove the handler
408
+ */
409
+ declare function registerMiddleware(node: NodeInfo, type: MiddlewareEventType, handler: MiddlewareHandler): () => void;
410
+
384
411
  declare const internal: {
385
412
  createPreviousHandler: typeof createPreviousHandler;
386
413
  clone: typeof clone;
@@ -388,6 +415,7 @@ declare const internal: {
388
415
  ensureNodeValue: typeof ensureNodeValue;
389
416
  findIDKey: typeof findIDKey;
390
417
  get: typeof get;
418
+ getKeys: typeof getKeys;
391
419
  getNode: typeof getNode;
392
420
  getNodeValue: typeof getNodeValue;
393
421
  getPathType: typeof getPathType;
@@ -414,6 +442,7 @@ declare const internal: {
414
442
  observableFns: Map<string, (node: NodeInfo, ...args: any[]) => any>;
415
443
  optimized: symbol;
416
444
  peek: typeof peek;
445
+ registerMiddleware: typeof registerMiddleware;
417
446
  safeParse: typeof safeParse;
418
447
  safeStringify: typeof safeStringify;
419
448
  set: typeof set;
@@ -426,4 +455,4 @@ declare const internal: {
426
455
  };
427
456
  };
428
457
 
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 };
458
+ 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 };