@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.
- package/.DS_Store +0 -0
- package/config/enableReactComponents.js +3 -1
- package/config/enableReactComponents.mjs +3 -1
- package/config/enableReactTracking.d.mts +2 -1
- package/config/enableReactTracking.d.ts +2 -1
- package/config/enableReactTracking.js +32 -13
- package/config/enableReactTracking.mjs +32 -13
- package/index.d.mts +38 -5
- package/index.d.ts +38 -5
- package/index.js +202 -31
- package/index.mjs +202 -31
- package/package.json +35 -1
- package/persist-plugins/async-storage.js +17 -9
- package/persist-plugins/async-storage.mjs +17 -9
- package/persist-plugins/expo-sqlite.d.mts +19 -0
- package/persist-plugins/expo-sqlite.d.ts +19 -0
- package/persist-plugins/expo-sqlite.js +72 -0
- package/persist-plugins/expo-sqlite.mjs +69 -0
- package/react-native.d.mts +4 -0
- package/react-native.d.ts +4 -0
- package/react-native.js +53 -0
- package/react-native.mjs +40 -0
- package/react-reactive/Components.d.mts +19 -0
- package/react-reactive/Components.d.ts +19 -0
- package/react-reactive/Components.js +53 -0
- package/react-reactive/Components.mjs +40 -0
- package/react-reactive/enableReactComponents.d.mts +3 -2
- package/react-reactive/enableReactComponents.d.ts +3 -2
- package/react-reactive/enableReactComponents.js +10 -3
- package/react-reactive/enableReactComponents.mjs +10 -3
- package/react-reactive/enableReactNativeComponents.d.mts +3 -20
- package/react-reactive/enableReactNativeComponents.d.ts +3 -20
- package/react-reactive/enableReactNativeComponents.js +8 -3
- package/react-reactive/enableReactNativeComponents.mjs +8 -3
- package/react-reactive/enableReactive.js +10 -3
- package/react-reactive/enableReactive.mjs +10 -3
- package/react-reactive/enableReactive.native.js +8 -3
- package/react-reactive/enableReactive.native.mjs +8 -3
- package/react-reactive/enableReactive.web.js +8 -3
- package/react-reactive/enableReactive.web.mjs +8 -3
- package/react-web.d.mts +6 -0
- package/react-web.d.ts +6 -0
- package/react-web.js +39 -0
- package/react-web.mjs +37 -0
- package/react.d.mts +41 -21
- package/react.d.ts +41 -21
- package/react.js +86 -63
- package/react.mjs +87 -65
- package/sync-plugins/crud.d.mts +24 -9
- package/sync-plugins/crud.d.ts +24 -9
- package/sync-plugins/crud.js +250 -116
- package/sync-plugins/crud.mjs +251 -117
- package/sync-plugins/firebase.d.mts +7 -3
- package/sync-plugins/firebase.d.ts +7 -3
- package/sync-plugins/firebase.js +4 -2
- package/sync-plugins/firebase.mjs +4 -2
- package/sync-plugins/keel.d.mts +12 -13
- package/sync-plugins/keel.d.ts +12 -13
- package/sync-plugins/keel.js +60 -52
- package/sync-plugins/keel.mjs +61 -48
- package/sync-plugins/supabase.d.mts +7 -3
- package/sync-plugins/supabase.d.ts +7 -3
- package/sync-plugins/supabase.js +90 -33
- package/sync-plugins/supabase.mjs +91 -34
- package/sync-plugins/tanstack-query.d.mts +3 -3
- package/sync-plugins/tanstack-query.d.ts +3 -3
- package/sync.d.mts +16 -8
- package/sync.d.ts +16 -8
- package/sync.js +324 -215
- package/sync.mjs +323 -215
- package/trace.js +5 -6
- package/trace.mjs +5 -6
- package/types/reactive-native.d.ts +19 -0
- 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 = {
|
|
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 = {
|
|
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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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 (
|
|
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
|
|
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
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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 };
|