@legendapp/state 2.0.0 → 2.0.2

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 (64) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/config/enableDirectAccess.js +6 -3
  3. package/config/enableDirectAccess.js.map +1 -1
  4. package/config/enableDirectAccess.mjs +7 -4
  5. package/config/enableDirectAccess.mjs.map +1 -1
  6. package/config/enableReactDirectRender.d.ts +2 -0
  7. package/config/enableReactDirectRender.js +78 -0
  8. package/config/enableReactDirectRender.js.map +1 -0
  9. package/config/enableReactDirectRender.mjs +75 -0
  10. package/config/enableReactDirectRender.mjs.map +1 -0
  11. package/config/enableReactTracking.d.ts +15 -0
  12. package/config/enableReactTracking.js +47 -0
  13. package/config/enableReactTracking.js.map +1 -0
  14. package/config/enableReactTracking.mjs +45 -0
  15. package/config/enableReactTracking.mjs.map +1 -0
  16. package/history.js +1 -1
  17. package/history.js.map +1 -1
  18. package/history.mjs +1 -1
  19. package/history.mjs.map +1 -1
  20. package/index.d.ts +1 -0
  21. package/index.js +67 -33
  22. package/index.js.map +1 -1
  23. package/index.mjs +66 -34
  24. package/index.mjs.map +1 -1
  25. package/package.json +19 -1
  26. package/persist-plugins/firebase.js +8 -8
  27. package/persist-plugins/firebase.js.map +1 -1
  28. package/persist-plugins/firebase.mjs +8 -8
  29. package/persist-plugins/firebase.mjs.map +1 -1
  30. package/persist-plugins/query.d.ts +1 -3
  31. package/persist-plugins/query.js +7 -17
  32. package/persist-plugins/query.js.map +1 -1
  33. package/persist-plugins/query.mjs +7 -17
  34. package/persist-plugins/query.mjs.map +1 -1
  35. package/persist.js +27 -20
  36. package/persist.js.map +1 -1
  37. package/persist.mjs +28 -21
  38. package/persist.mjs.map +1 -1
  39. package/react-hooks/useObservableNextRouter.js +6 -6
  40. package/react-hooks/useObservableNextRouter.js.map +1 -1
  41. package/react-hooks/useObservableNextRouter.mjs +6 -6
  42. package/react-hooks/useObservableNextRouter.mjs.map +1 -1
  43. package/react-hooks/usePersistedObservable.d.ts +3 -2
  44. package/react-hooks/usePersistedObservable.js.map +1 -1
  45. package/react-hooks/usePersistedObservable.mjs.map +1 -1
  46. package/react.js +57 -24
  47. package/react.js.map +1 -1
  48. package/react.mjs +58 -25
  49. package/react.mjs.map +1 -1
  50. package/src/ObservableObject.d.ts +3 -3
  51. package/src/config/enableReactDirectRender.d.ts +2 -0
  52. package/src/config/enableReactTracking.d.ts +15 -0
  53. package/src/createObservable.d.ts +2 -0
  54. package/src/globals.d.ts +2 -0
  55. package/src/helpers.d.ts +3 -3
  56. package/src/observable.d.ts +3 -3
  57. package/src/observableInterfaces.d.ts +29 -18
  58. package/src/observe.d.ts +0 -1
  59. package/src/persist/observablePersistRemoteFunctionsAdapter.d.ts +1 -1
  60. package/src/persist/persistObservable.d.ts +6 -3
  61. package/src/persist-plugins/query.d.ts +1 -3
  62. package/src/react/For.d.ts +7 -5
  63. package/src/react/useMount.d.ts +1 -2
  64. package/src/react-hooks/usePersistedObservable.d.ts +3 -2
@@ -1,12 +1,12 @@
1
- import type { NodeValue, TrackingType } from './observableInterfaces';
1
+ import type { GetOptions, NodeValue, ObservableObject, TrackingType } from './observableInterfaces';
2
2
  export declare const observableProperties: Map<string, {
3
3
  get: (node: NodeValue, ...args: any[]) => any;
4
4
  set: (node: NodeValue, value: any) => any;
5
5
  }>;
6
6
  export declare const observableFns: Map<string, (node: NodeValue, ...args: any[]) => any>;
7
- export declare function getProxy(node: NodeValue, p?: string): object;
7
+ export declare function getProxy(node: NodeValue, p?: string): ObservableObject;
8
8
  export declare function set(node: NodeValue, newValue?: any): any;
9
9
  export declare function extractPromise(node: NodeValue, value: Promise<any>): void;
10
10
  export declare function extractFunctionOrComputed(node: NodeValue, obj: Record<string, any>, k: string, v: any): true | undefined;
11
- export declare function get(node: NodeValue, track?: TrackingType): any;
11
+ export declare function get(node: NodeValue, options?: TrackingType | GetOptions): any;
12
12
  export declare function peek(node: NodeValue): any;
@@ -0,0 +1,2 @@
1
+ export declare const hasSymbol: false | ((key: string) => symbol);
2
+ export declare function enableReactDirectRender(): void;
@@ -0,0 +1,15 @@
1
+ import { type TrackingType } from '@legendapp/state';
2
+ interface ReactTrackingOptions {
3
+ auto?: boolean;
4
+ warnUnobserved?: boolean;
5
+ }
6
+ export declare function enableReactTracking({ auto, warnUnobserved }: ReactTrackingOptions): void;
7
+ import type { GetOptions } from '@legendapp/state';
8
+ declare module '@legendapp/state' {
9
+ interface ObservableBaseFns<T> {
10
+ get(options?: TrackingType | (GetOptions & {
11
+ suspense?: boolean;
12
+ })): T;
13
+ }
14
+ }
15
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { ObservableObjectOrArray, ObservablePrimitive } from './observableInterfaces';
2
+ export declare function createObservable<T>(value: T | undefined, makePrimitive: boolean, createObject: Function, createPrimitive?: Function): ObservablePrimitive<T> | ObservableObjectOrArray<T>;
package/src/globals.d.ts CHANGED
@@ -4,6 +4,8 @@ export declare const symbolGetNode: unique symbol;
4
4
  export declare const symbolDelete: unique symbol;
5
5
  export declare const symbolOpaque: unique symbol;
6
6
  export declare const optimized: unique symbol;
7
+ export declare const extraPrimitiveActivators: Map<string | symbol, boolean>;
8
+ export declare const extraPrimitiveProps: Map<string | symbol, any>;
7
9
  export declare const globalState: {
8
10
  isLoadingLocal: boolean;
9
11
  isLoadingRemote: boolean;
package/src/helpers.d.ts CHANGED
@@ -7,9 +7,9 @@ export declare function getObservableIndex(obs: ObservableReadable): number;
7
7
  export declare function opaqueObject<T extends object>(value: T): OpaqueObject<T>;
8
8
  export declare function lockObservable(obs: ObservableReadable, value: boolean): void;
9
9
  export declare function setAtPath<T extends object>(obj: T, path: string[], pathTypes: TypeAtPath[], value: any, fullObj?: T, restore?: (path: string[], value: any) => void): T;
10
- export declare function setInObservableAtPath(obs: ObservableWriteable, path: string[], value: any, mode: 'assign' | 'set'): void;
10
+ export declare function setInObservableAtPath(obs: ObservableWriteable, path: string[], pathTypes: string[], value: any, mode: 'assign' | 'set'): void;
11
11
  export declare function mergeIntoObservable<T extends ObservableObject | object>(target: T, ...sources: any[]): T;
12
- export declare function constructObjectWithPath(path: string[], value: any, pathTypes: TypeAtPath[]): object;
13
- export declare function deconstructObjectWithPath(path: string[], value: any): object;
12
+ export declare function constructObjectWithPath(path: string[], pathTypes: TypeAtPath[], value: any): object;
13
+ export declare function deconstructObjectWithPath(path: string[], pathTypes: TypeAtPath[], value: any): object;
14
14
  export declare function isObservableValueReady(value: any): boolean;
15
15
  export declare function setSilently(obs: ObservableReadable, newValue: any): any;
@@ -1,5 +1,5 @@
1
- import type { Observable, ObservablePrimitive, PromiseInfo } from './observableInterfaces';
2
- export declare function observable<T>(value: Promise<T>): Observable<T & PromiseInfo>;
1
+ import type { Observable, ObservablePrimitive, WithState } from './observableInterfaces';
2
+ export declare function observable<T>(value: Promise<T>): Observable<T & WithState>;
3
3
  export declare function observable<T>(value?: T): Observable<T>;
4
- export declare function observablePrimitive<T>(value: Promise<T>): ObservablePrimitive<T & PromiseInfo>;
4
+ export declare function observablePrimitive<T>(value: Promise<T>): ObservablePrimitive<T & WithState>;
5
5
  export declare function observablePrimitive<T>(value?: T): ObservablePrimitive<T>;
@@ -42,9 +42,12 @@ export interface MapGet<T extends Map<any, any> | WeakMap<any, any>> {
42
42
  get(): T;
43
43
  size: ObservableChild<number>;
44
44
  }
45
+ export interface GetOptions {
46
+ shallow: boolean;
47
+ }
45
48
  export interface ObservableBaseFns<T> {
46
49
  peek(): T;
47
- get(trackingType?: TrackingType): T;
50
+ get(options?: TrackingType | GetOptions): T;
48
51
  onChange(cb: ListenerFn<T>, options?: {
49
52
  trackingType?: TrackingType;
50
53
  initial?: boolean;
@@ -93,7 +96,7 @@ type PrimitiveKeys<T> = Pick<T, {
93
96
  type NonPrimitiveKeys<T> = Pick<T, {
94
97
  [K in keyof T]-?: T[K] extends Primitive ? never : K;
95
98
  }[keyof T]>;
96
- type Recurse<T, K extends keyof T, TRecurse> = T[K] extends ObservableReadable ? T[K] : T[K] extends Promise<infer t> ? Observable<t & PromiseInfo> : T[K] extends Function ? T[K] : T[K] extends ObservableProxyTwoWay<infer t, infer t2> ? ObservableProxyTwoWay<t, t2> : T[K] extends ObservableProxy<infer t> ? ObservableProxy<t> : T[K] extends ObservableProxyLink<infer t> ? ObservableProxyLink<t> : T[K] extends Map<any, any> | WeakMap<any, any> ? ObservableMap<T[K]> : T[K] extends Set<any> | WeakSet<any> ? ObservableSet<T[K]> : T[K] extends Set<any> | WeakSet<any> ? T[K] & ObservablePrimitiveBaseFns<T[K]> : T[K] extends OpaqueObject<T[K]> ? T[K] & ObservablePrimitiveChildFns<T[K]> : T[K] extends Primitive ? ObservablePrimitiveChild<T[K]> : T[K] extends Array<any> ? ObservableObjectFns<T[K]> & ObservableArrayOverride<T[K][number]> : T extends object ? TRecurse : T[K];
99
+ type Recurse<T, K extends keyof T, TRecurse> = T[K] extends ObservableReadable ? T[K] : T[K] extends Promise<infer t> ? Observable<t & WithState> : T[K] extends Function ? T[K] : T[K] extends ObservableProxyTwoWay<infer t, infer t2> ? ObservableProxyTwoWay<t, t2> : T[K] extends ObservableProxy<infer t> ? ObservableProxy<t> : T[K] extends ObservableProxyLink<infer t> ? ObservableProxyLink<t> : T[K] extends Map<any, any> | WeakMap<any, any> ? ObservableMap<T[K]> : T[K] extends Set<any> | WeakSet<any> ? ObservableSet<T[K]> : T[K] extends Set<any> | WeakSet<any> ? T[K] & ObservablePrimitiveBaseFns<T[K]> : T[K] extends OpaqueObject<T[K]> ? T[K] & ObservablePrimitiveChildFns<T[K]> : T[K] extends Primitive ? ObservablePrimitiveChild<T[K]> : T[K] extends Array<any> ? ObservableObjectFns<T[K]> & ObservableArrayOverride<T[K][number]> : T extends object ? TRecurse : T[K];
97
100
  type ObservableFnsRecursiveUnsafe<T> = {
98
101
  [K in keyof T]-?: Recurse<T, K, ObservableObject<NonNullable<T[K]>>>;
99
102
  };
@@ -190,11 +193,11 @@ export interface ObservablePersistenceConfig {
190
193
  localOptions?: ObservablePersistenceConfigLocalGlobalOptions;
191
194
  remoteOptions?: ObservablePersistenceConfigRemoteGlobalOptions;
192
195
  }
193
- export interface PersistOptions<T = any, TState = {}> {
196
+ export interface PersistOptions<T = any> {
194
197
  local?: string | PersistOptionsLocal<T>;
195
198
  remote?: PersistOptionsRemote<T>;
196
199
  pluginLocal?: ClassConstructor<ObservablePersistLocal>;
197
- pluginRemote?: ClassConstructor<ObservablePersistRemoteClass> | ObservablePersistRemoteFunctions<T, TState>;
200
+ pluginRemote?: ClassConstructor<ObservablePersistRemoteClass> | ObservablePersistRemoteFunctions<T>;
198
201
  }
199
202
  export interface PersistMetadata {
200
203
  id?: '__legend_metadata';
@@ -218,10 +221,10 @@ export interface ObservablePersistRemoteSetParams<T> {
218
221
  changes: Change[];
219
222
  value: T;
220
223
  }
221
- export interface ObservablePersistRemoteGetParams<T, TState = {}> {
222
- state: Observable<ObservablePersistState & TState>;
224
+ export interface ObservablePersistRemoteGetParams<T> {
225
+ state: Observable<ObservablePersistState>;
223
226
  obs: ObservableReadable<T>;
224
- options: PersistOptions<T, TState>;
227
+ options: PersistOptions<T>;
225
228
  dateModified?: number;
226
229
  onGet: () => void;
227
230
  onChange: (params: {
@@ -232,27 +235,33 @@ export interface ObservablePersistRemoteGetParams<T, TState = {}> {
232
235
  dateModified?: number | undefined;
233
236
  }) => void | Promise<void>;
234
237
  }
235
- export interface ObservablePersistRemoteClass<TState = {}> {
236
- get<T>(params: ObservablePersistRemoteGetParams<T, TState>): void;
238
+ export interface ObservablePersistRemoteClass {
239
+ get<T>(params: ObservablePersistRemoteGetParams<T>): void;
237
240
  set?<T>(params: ObservablePersistRemoteSetParams<T>): Promise<void | {
238
241
  changes?: object;
239
242
  dateModified?: number;
240
243
  pathStrs?: string[];
241
244
  }>;
242
245
  }
243
- export interface ObservablePersistRemoteFunctions<T = any, TState = {}> {
244
- get(params: ObservablePersistRemoteGetParams<T, TState>): T | Promise<T>;
246
+ export interface ObservablePersistRemoteFunctions<T = any> {
247
+ get(params: ObservablePersistRemoteGetParams<T>): T | Promise<T>;
245
248
  set?(params: ObservablePersistRemoteSetParams<T>): Promise<void | {
246
249
  changes?: object | undefined;
247
250
  dateModified?: number;
248
251
  }>;
249
252
  }
250
- export interface ObservablePersistState {
253
+ export interface ObservableState {
254
+ isLoaded: boolean;
255
+ error?: Error;
256
+ }
257
+ export interface WithState {
258
+ state?: ObservableState;
259
+ _state?: ObservableState;
260
+ }
261
+ export interface ObservablePersistState extends ObservableState {
251
262
  isLoadedLocal: boolean;
252
- isLoadedRemote: boolean;
253
263
  isEnabledLocal: boolean;
254
264
  isEnabledRemote: boolean;
255
- remoteError?: Error;
256
265
  dateModified?: number;
257
266
  clearLocal: () => Promise<void>;
258
267
  sync: () => Promise<void>;
@@ -261,6 +270,10 @@ export interface ObservablePersistState {
261
270
  v?: any;
262
271
  }> | undefined;
263
272
  }
273
+ export interface WithPersistState {
274
+ state?: ObservablePersistState;
275
+ _state?: ObservablePersistState;
276
+ }
264
277
  export type RecordValue<T> = T extends Record<string, infer t> ? t : never;
265
278
  export type ArrayValue<T> = T extends Array<infer t> ? t : never;
266
279
  export type ObservableValue<T> = T extends Observable<infer t> ? t : never;
@@ -326,6 +339,7 @@ export interface NodeValueListener {
326
339
  interface BaseNodeValue {
327
340
  children?: Map<string, ChildNodeValue>;
328
341
  proxy?: object;
342
+ isActivatedPrimitive?: boolean;
329
343
  root: ObservableRoot;
330
344
  listeners?: Set<NodeValueListener>;
331
345
  listenersImmediate?: Set<NodeValueListener>;
@@ -339,6 +353,7 @@ interface BaseNodeValue {
339
353
  parentOther?: NodeValue;
340
354
  functions?: Map<string, Function | ObservableComputed<any>>;
341
355
  lazy?: boolean;
356
+ state?: Observable<ObservableState>;
342
357
  }
343
358
  export interface RootNodeValue extends BaseNodeValue {
344
359
  parent?: undefined;
@@ -378,8 +393,4 @@ export type ObservableProxyTwoWay<T extends Record<string, any>, T2> = {
378
393
  } & ObservableBaseFns<T> & {
379
394
  [symbolGetNode]: NodeValue;
380
395
  };
381
- export type PromiseInfo = {
382
- error?: any;
383
- status?: 'pending' | 'rejected';
384
- };
385
396
  export {};
package/src/observe.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { ObserveEvent, ObserveEventCallback, Selector } from './observableInterfaces';
2
2
  export interface ObserveOptions {
3
3
  immediate?: boolean;
4
- retainObservable?: boolean;
5
4
  }
6
5
  export declare function observe<T>(run: (e: ObserveEvent<T>) => T | void, options?: ObserveOptions): () => void;
7
6
  export declare function observe<T>(selector: Selector<T> | ((e: ObserveEvent<T>) => any), reaction?: (e: ObserveEventCallback<T>) => any, options?: ObserveOptions): () => void;
@@ -1,2 +1,2 @@
1
1
  import type { ObservablePersistRemoteClass, ObservablePersistRemoteFunctions } from '@legendapp/state';
2
- export declare function observablePersistRemoteFunctionsAdapter<T = {}, TState = {}>({ get, set, }: ObservablePersistRemoteFunctions<T, TState>): ObservablePersistRemoteClass;
2
+ export declare function observablePersistRemoteFunctionsAdapter<T = {}>({ get, set, }: ObservablePersistRemoteFunctions<T>): ObservablePersistRemoteClass;
@@ -1,4 +1,4 @@
1
- import type { ClassConstructor, FieldTransforms, Observable, ObservableObject, ObservablePersistLocal, ObservablePersistRemoteClass, ObservablePersistState, ObservableWriteable, PersistOptions, PersistTransform, TypeAtPath } from '@legendapp/state';
1
+ import type { ClassConstructor, FieldTransforms, Observable, ObservableObject, ObservablePersistLocal, ObservablePersistRemoteClass, ObservableWriteable, PersistOptions, PersistTransform, Primitive, TypeAtPath, WithPersistState } from '@legendapp/state';
2
2
  export declare const mapPersistences: WeakMap<ClassConstructor<ObservablePersistLocal | ObservablePersistRemoteClass>, {
3
3
  persist: ObservablePersistLocal | ObservablePersistRemoteClass;
4
4
  initialized?: Observable<boolean>;
@@ -21,5 +21,8 @@ export declare function transformLoadData(value: any, { transform, fieldTransfor
21
21
  transform?: PersistTransform;
22
22
  }, doUserTransform: boolean): Promise<any> | any;
23
23
  export declare function onChangeRemote(cb: () => void): void;
24
- export declare function persistObservable<T, TState = {}>(observable: ObservableWriteable<T>, persistOptions: PersistOptions<T, TState>): [Observable<T>, ObservableObject<ObservablePersistState & TState>];
25
- export declare function persistObservable<T, TState = {}>(initial: T | (() => T) | (() => Promise<T>), persistOptions: PersistOptions<T, TState>): [Observable<T>, ObservableObject<ObservablePersistState & TState>];
24
+ export type WithoutState = any[] | Primitive | (Record<string, any> & {
25
+ _state?: never;
26
+ });
27
+ export declare function persistObservable<T extends WithoutState>(observable: ObservableWriteable<T>, persistOptions: PersistOptions<T>): Observable<WithPersistState & T>;
28
+ export declare function persistObservable<T extends WithoutState>(initial: T | (() => T) | (() => Promise<T>), persistOptions: PersistOptions<T>): Observable<WithPersistState & T>;
@@ -14,7 +14,5 @@ type Params<TQueryFnData, TError, TData, TQueryData, TQueryKey extends QueryKey>
14
14
  queryClient?: QueryClient;
15
15
  useContext?: true;
16
16
  });
17
- export declare function persistPluginQuery<TObs, TQueryFnData, TError, TData, TQueryData, TQueryKey extends QueryKey>({ query: options, mutation: mutationOptions, type, queryClient, useContext, }: Params<TQueryFnData, TError, TData, TQueryData, TQueryKey>): ObservablePersistRemoteFunctions<TObs, {
18
- query: UseBaseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>;
19
- }>;
17
+ export declare function persistPluginQuery<TObs, TQueryFnData, TError, TData, TQueryData, TQueryKey extends QueryKey>({ query: options, mutation: mutationOptions, type, queryClient, useContext, }: Params<TQueryFnData, TError, TData, TQueryData, TQueryKey>): ObservablePersistRemoteFunctions<TObs>;
20
18
  export {};
@@ -1,13 +1,15 @@
1
1
  import type { Observable, ObservableReadable } from '@legendapp/state';
2
2
  import { FC, ReactElement } from 'react';
3
+ type ForItemProps<T, TProps = {}> = {
4
+ item$: Observable<T>;
5
+ id?: string;
6
+ } & TProps;
3
7
  export declare function For<T, TProps>({ each, optimized: isOptimized, item, itemProps, sortValues, children, }: {
4
8
  each?: ObservableReadable<T[] | Record<any, T> | Map<any, T>>;
5
9
  optimized?: boolean;
6
- item?: FC<{
7
- item: Observable<T>;
8
- id?: string;
9
- } & TProps>;
10
+ item?: FC<ForItemProps<T, TProps>>;
10
11
  itemProps?: TProps;
11
12
  sortValues?: (A: T, B: T, AKey: string, BKey: string) => number;
12
- children?: (value: Observable<T>) => ReactElement;
13
+ children?: (value: Observable<T>, id: string | undefined) => ReactElement;
13
14
  }): ReactElement | null;
15
+ export {};
@@ -1,3 +1,2 @@
1
- import type { EffectCallback } from 'react';
2
- export declare function useMount(fn: EffectCallback): void;
1
+ export declare function useMount(fn: () => (void | (() => void)) | Promise<void>): void;
3
2
  export declare const useMountOnce: (effect: () => void | (() => void)) => void;
@@ -1,4 +1,5 @@
1
- import { Observable, ObservableObject, ObservablePersistState, PersistOptions } from '@legendapp/state';
1
+ import { Observable, PersistOptions, WithPersistState } from '@legendapp/state';
2
+ import type { WithoutState } from '../persist/persistObservable';
2
3
  /**
3
4
  * A React hook that creates a new observable and can optionally listen or persist its state.
4
5
  *
@@ -7,4 +8,4 @@ import { Observable, ObservableObject, ObservablePersistState, PersistOptions }
7
8
  *
8
9
  * @see https://www.legendapp.com/dev/state/react/#useObservable
9
10
  */
10
- export declare function usePersistedObservable<T>(initialValue: T | (() => T) | (() => Promise<T>), options: PersistOptions<T>): [Observable<T>, ObservableObject<ObservablePersistState>];
11
+ export declare function usePersistedObservable<T extends WithoutState>(initialValue: T | (() => T) | (() => Promise<T>), options: PersistOptions<T>): Observable<WithPersistState & T>;