@legendapp/state 3.0.0-beta.2 → 3.0.0-beta.20
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 +13 -4
- package/index.d.ts +13 -4
- package/index.js +70 -22
- package/index.mjs +70 -22
- package/package.json +22 -1
- package/persist-plugins/async-storage.js +17 -9
- package/persist-plugins/async-storage.mjs +17 -9
- 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 +38 -20
- package/react.d.ts +38 -20
- package/react.js +36 -23
- package/react.mjs +37 -25
- package/sync-plugins/crud.d.mts +24 -9
- package/sync-plugins/crud.d.ts +24 -9
- package/sync-plugins/crud.js +199 -108
- package/sync-plugins/crud.mjs +200 -109
- 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 +9 -13
- package/sync-plugins/keel.d.ts +9 -13
- package/sync-plugins/keel.js +52 -41
- package/sync-plugins/keel.mjs +53 -37
- package/sync-plugins/supabase.d.mts +7 -3
- package/sync-plugins/supabase.d.ts +7 -3
- package/sync-plugins/supabase.js +87 -31
- package/sync-plugins/supabase.mjs +88 -32
- package/sync-plugins/tanstack-query.d.mts +5 -5
- package/sync-plugins/tanstack-query.d.ts +5 -5
- package/sync-plugins/tanstack-query.js +10 -1
- package/sync-plugins/tanstack-query.mjs +10 -1
- package/sync-plugins/tanstack-react-query.d.mts +4 -2
- package/sync-plugins/tanstack-react-query.d.ts +4 -2
- package/sync.d.mts +16 -8
- package/sync.d.ts +16 -8
- package/sync.js +267 -174
- package/sync.mjs +266 -174
- 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,6 +108,7 @@ declare function getNode(value$: ObservableParam): NodeInfo;
|
|
|
108
108
|
declare function setNodeValue(node: NodeInfo, newValue: any): {
|
|
109
109
|
prevValue: any;
|
|
110
110
|
newValue: any;
|
|
111
|
+
parentValue: any;
|
|
111
112
|
};
|
|
112
113
|
declare function getNodeValue(node: NodeInfo): any;
|
|
113
114
|
declare function ensureNodeValue(node: NodeInfo): any;
|
|
@@ -115,7 +116,7 @@ declare function findIDKey(obj: unknown | undefined, node: NodeInfo): string | (
|
|
|
115
116
|
|
|
116
117
|
type TrackingType = undefined | true | symbol;
|
|
117
118
|
interface GetOptions {
|
|
118
|
-
shallow
|
|
119
|
+
shallow?: boolean;
|
|
119
120
|
}
|
|
120
121
|
type OpaqueObject<T> = T & {
|
|
121
122
|
[symbolOpaque]: true;
|
|
@@ -152,6 +153,7 @@ type ObservableListenerDispose = () => void;
|
|
|
152
153
|
interface ObservableRoot {
|
|
153
154
|
_: any;
|
|
154
155
|
set?: (value: any) => void;
|
|
156
|
+
isLoadingLocal?: boolean;
|
|
155
157
|
}
|
|
156
158
|
type Primitive = boolean | string | number | Date;
|
|
157
159
|
type NotPrimitive<T> = T extends Primitive ? never : T;
|
|
@@ -187,6 +189,7 @@ interface BaseNodeInfo {
|
|
|
187
189
|
numListenersRecursive: number;
|
|
188
190
|
state?: Observable<ObservableSyncState>;
|
|
189
191
|
activated?: boolean;
|
|
192
|
+
isPlain?: boolean;
|
|
190
193
|
recursivelyAutoActivated?: boolean;
|
|
191
194
|
activationState?: LinkedOptions & {
|
|
192
195
|
onError?: () => void;
|
|
@@ -246,8 +249,13 @@ interface UpdateFnParams<T = any> {
|
|
|
246
249
|
value: T;
|
|
247
250
|
mode?: GetMode;
|
|
248
251
|
lastSync?: number | undefined;
|
|
252
|
+
changes?: Change[];
|
|
253
|
+
}
|
|
254
|
+
interface UpdateSetFnParams<T = any> extends UpdateFnParams<T> {
|
|
255
|
+
lastSync?: never;
|
|
249
256
|
}
|
|
250
257
|
type UpdateFn<T = any> = (params: UpdateFnParams<T>) => void;
|
|
258
|
+
type UpdateSetFn<T = any> = (params: UpdateSetFnParams<T>) => void;
|
|
251
259
|
type Linked<T> = T;
|
|
252
260
|
interface ObserveOptions {
|
|
253
261
|
immediate?: boolean;
|
|
@@ -288,6 +296,7 @@ interface RetryOptions {
|
|
|
288
296
|
declare const ObservableHint: {
|
|
289
297
|
opaque: <T extends object>(value: T) => OpaqueObject<T>;
|
|
290
298
|
plain: <T extends object>(value: T) => PlainObject<T>;
|
|
299
|
+
function: <T extends object>(value: T) => PlainObject<T>;
|
|
291
300
|
};
|
|
292
301
|
|
|
293
302
|
declare function getProxy(node: NodeInfo, p?: string, asFunction?: Function): Observable;
|
|
@@ -307,7 +316,7 @@ declare function computed<T, T2 = T>(get: (() => RecursiveValueOrFunction<T>) |
|
|
|
307
316
|
|
|
308
317
|
declare function event(): ObservableEvent;
|
|
309
318
|
|
|
310
|
-
declare function computeSelector<T>(selector: Selector<T>, e?: ObserveEvent<T>, retainObservable?: boolean): T;
|
|
319
|
+
declare function computeSelector<T>(selector: Selector<T>, getOptions?: GetOptions, e?: ObserveEvent<T>, retainObservable?: boolean): T;
|
|
311
320
|
declare function getObservableIndex(value$: ObservableParam): number;
|
|
312
321
|
declare function opaqueObject<T extends object>(value: T): OpaqueObject<T>;
|
|
313
322
|
declare function getValueAtPath(obj: Record<string, any>, path: string[]): any;
|
|
@@ -357,7 +366,7 @@ declare function proxy<T>(get: (key: string) => T): Observable<Record<string, T>
|
|
|
357
366
|
|
|
358
367
|
declare function syncState(obs: ObservableParam): Observable<ObservableSyncState>;
|
|
359
368
|
|
|
360
|
-
declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
|
|
369
|
+
declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, getOptions?: GetOptions, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
|
|
361
370
|
nodes: Map<NodeInfo, TrackingNode> | undefined;
|
|
362
371
|
value: T;
|
|
363
372
|
dispose: (() => void) | undefined;
|
|
@@ -426,4 +435,4 @@ declare const internal: {
|
|
|
426
435
|
};
|
|
427
436
|
};
|
|
428
437
|
|
|
429
|
-
export { type ArrayValue, type Change, type ChildNodeInfo, type ClassConstructor, type GetMode, type GetOptions, type ImmutableObservableBase, type Linked, type LinkedOptions, type ListenerFn, type ListenerParams, type NodeInfo, type NodeListener, type NotPrimitive, type Observable, type ObservableBoolean, type ObservableEvent, ObservableHint, type ObservableListenerDispose, type ObservableMap, type ObservableObject, type ObservableObjectFns, type ObservableParam, type ObservablePrimitive, type ObservableRoot, type ObservableState, type ObservableSyncState, type ObservableSyncStateBase, type ObservableValue, type ObserveEvent, type ObserveEventCallback, type ObserveOptions, type OpaqueObject, type PlainObject, type Primitive, type RecordValue, type RecursiveValueOrFunction, type RemoveObservables, type RetryOptions, type RootNodeInfo, type Selector, type SetParams, type TrackingNode, type TrackingState, type TrackingType, type TypeAtPath, type UpdateFn, type UpdateFnParams, type WaitForSet, type WaitForSetFnParams, applyChange, applyChanges, batch, beginBatch, computeSelector, computed, constructObjectWithPath, deconstructObjectWithPath, endBatch, event, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPlainObject, isPrimitive, isPromise, isSet, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, proxy, setAtPath, setSilently, shouldIgnoreUnobserved, syncState, trackSelector, when, whenReady };
|
|
438
|
+
export { type ArrayValue, type Change, type ChildNodeInfo, type ClassConstructor, type GetMode, type GetOptions, type ImmutableObservableBase, type Linked, type LinkedOptions, type ListenerFn, type ListenerParams, type NodeInfo, type NodeListener, type NotPrimitive, type Observable, type ObservableBoolean, type ObservableEvent, ObservableHint, type ObservableListenerDispose, type ObservableMap, type ObservableObject, type ObservableObjectFns, type ObservableParam, type ObservablePrimitive, type ObservableRoot, type ObservableState, type ObservableSyncState, type ObservableSyncStateBase, type ObservableValue, type ObserveEvent, type ObserveEventCallback, type ObserveOptions, type OpaqueObject, type PlainObject, type Primitive, type RecordValue, type RecursiveValueOrFunction, type RemoveObservables, type RetryOptions, type RootNodeInfo, type Selector, type SetParams, type TrackingNode, type TrackingState, type TrackingType, type TypeAtPath, type UpdateFn, type UpdateFnParams, type UpdateSetFn, type UpdateSetFnParams, type WaitForSet, type WaitForSetFnParams, applyChange, applyChanges, batch, beginBatch, computeSelector, computed, constructObjectWithPath, deconstructObjectWithPath, endBatch, event, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPlainObject, isPrimitive, isPromise, isSet, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, proxy, setAtPath, setSilently, shouldIgnoreUnobserved, syncState, trackSelector, when, whenReady };
|
package/index.d.ts
CHANGED
|
@@ -108,6 +108,7 @@ declare function getNode(value$: ObservableParam): NodeInfo;
|
|
|
108
108
|
declare function setNodeValue(node: NodeInfo, newValue: any): {
|
|
109
109
|
prevValue: any;
|
|
110
110
|
newValue: any;
|
|
111
|
+
parentValue: any;
|
|
111
112
|
};
|
|
112
113
|
declare function getNodeValue(node: NodeInfo): any;
|
|
113
114
|
declare function ensureNodeValue(node: NodeInfo): any;
|
|
@@ -115,7 +116,7 @@ declare function findIDKey(obj: unknown | undefined, node: NodeInfo): string | (
|
|
|
115
116
|
|
|
116
117
|
type TrackingType = undefined | true | symbol;
|
|
117
118
|
interface GetOptions {
|
|
118
|
-
shallow
|
|
119
|
+
shallow?: boolean;
|
|
119
120
|
}
|
|
120
121
|
type OpaqueObject<T> = T & {
|
|
121
122
|
[symbolOpaque]: true;
|
|
@@ -152,6 +153,7 @@ type ObservableListenerDispose = () => void;
|
|
|
152
153
|
interface ObservableRoot {
|
|
153
154
|
_: any;
|
|
154
155
|
set?: (value: any) => void;
|
|
156
|
+
isLoadingLocal?: boolean;
|
|
155
157
|
}
|
|
156
158
|
type Primitive = boolean | string | number | Date;
|
|
157
159
|
type NotPrimitive<T> = T extends Primitive ? never : T;
|
|
@@ -187,6 +189,7 @@ interface BaseNodeInfo {
|
|
|
187
189
|
numListenersRecursive: number;
|
|
188
190
|
state?: Observable<ObservableSyncState>;
|
|
189
191
|
activated?: boolean;
|
|
192
|
+
isPlain?: boolean;
|
|
190
193
|
recursivelyAutoActivated?: boolean;
|
|
191
194
|
activationState?: LinkedOptions & {
|
|
192
195
|
onError?: () => void;
|
|
@@ -246,8 +249,13 @@ interface UpdateFnParams<T = any> {
|
|
|
246
249
|
value: T;
|
|
247
250
|
mode?: GetMode;
|
|
248
251
|
lastSync?: number | undefined;
|
|
252
|
+
changes?: Change[];
|
|
253
|
+
}
|
|
254
|
+
interface UpdateSetFnParams<T = any> extends UpdateFnParams<T> {
|
|
255
|
+
lastSync?: never;
|
|
249
256
|
}
|
|
250
257
|
type UpdateFn<T = any> = (params: UpdateFnParams<T>) => void;
|
|
258
|
+
type UpdateSetFn<T = any> = (params: UpdateSetFnParams<T>) => void;
|
|
251
259
|
type Linked<T> = T;
|
|
252
260
|
interface ObserveOptions {
|
|
253
261
|
immediate?: boolean;
|
|
@@ -288,6 +296,7 @@ interface RetryOptions {
|
|
|
288
296
|
declare const ObservableHint: {
|
|
289
297
|
opaque: <T extends object>(value: T) => OpaqueObject<T>;
|
|
290
298
|
plain: <T extends object>(value: T) => PlainObject<T>;
|
|
299
|
+
function: <T extends object>(value: T) => PlainObject<T>;
|
|
291
300
|
};
|
|
292
301
|
|
|
293
302
|
declare function getProxy(node: NodeInfo, p?: string, asFunction?: Function): Observable;
|
|
@@ -307,7 +316,7 @@ declare function computed<T, T2 = T>(get: (() => RecursiveValueOrFunction<T>) |
|
|
|
307
316
|
|
|
308
317
|
declare function event(): ObservableEvent;
|
|
309
318
|
|
|
310
|
-
declare function computeSelector<T>(selector: Selector<T>, e?: ObserveEvent<T>, retainObservable?: boolean): T;
|
|
319
|
+
declare function computeSelector<T>(selector: Selector<T>, getOptions?: GetOptions, e?: ObserveEvent<T>, retainObservable?: boolean): T;
|
|
311
320
|
declare function getObservableIndex(value$: ObservableParam): number;
|
|
312
321
|
declare function opaqueObject<T extends object>(value: T): OpaqueObject<T>;
|
|
313
322
|
declare function getValueAtPath(obj: Record<string, any>, path: string[]): any;
|
|
@@ -357,7 +366,7 @@ declare function proxy<T>(get: (key: string) => T): Observable<Record<string, T>
|
|
|
357
366
|
|
|
358
367
|
declare function syncState(obs: ObservableParam): Observable<ObservableSyncState>;
|
|
359
368
|
|
|
360
|
-
declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
|
|
369
|
+
declare function trackSelector<T>(selector: Selector<T>, update: (params: ListenerParams) => void, getOptions?: GetOptions, observeEvent?: ObserveEvent<T>, observeOptions?: ObserveOptions, createResubscribe?: boolean): {
|
|
361
370
|
nodes: Map<NodeInfo, TrackingNode> | undefined;
|
|
362
371
|
value: T;
|
|
363
372
|
dispose: (() => void) | undefined;
|
|
@@ -426,4 +435,4 @@ declare const internal: {
|
|
|
426
435
|
};
|
|
427
436
|
};
|
|
428
437
|
|
|
429
|
-
export { type ArrayValue, type Change, type ChildNodeInfo, type ClassConstructor, type GetMode, type GetOptions, type ImmutableObservableBase, type Linked, type LinkedOptions, type ListenerFn, type ListenerParams, type NodeInfo, type NodeListener, type NotPrimitive, type Observable, type ObservableBoolean, type ObservableEvent, ObservableHint, type ObservableListenerDispose, type ObservableMap, type ObservableObject, type ObservableObjectFns, type ObservableParam, type ObservablePrimitive, type ObservableRoot, type ObservableState, type ObservableSyncState, type ObservableSyncStateBase, type ObservableValue, type ObserveEvent, type ObserveEventCallback, type ObserveOptions, type OpaqueObject, type PlainObject, type Primitive, type RecordValue, type RecursiveValueOrFunction, type RemoveObservables, type RetryOptions, type RootNodeInfo, type Selector, type SetParams, type TrackingNode, type TrackingState, type TrackingType, type TypeAtPath, type UpdateFn, type UpdateFnParams, type WaitForSet, type WaitForSetFnParams, applyChange, applyChanges, batch, beginBatch, computeSelector, computed, constructObjectWithPath, deconstructObjectWithPath, endBatch, event, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPlainObject, isPrimitive, isPromise, isSet, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, proxy, setAtPath, setSilently, shouldIgnoreUnobserved, syncState, trackSelector, when, whenReady };
|
|
438
|
+
export { type ArrayValue, type Change, type ChildNodeInfo, type ClassConstructor, type GetMode, type GetOptions, type ImmutableObservableBase, type Linked, type LinkedOptions, type ListenerFn, type ListenerParams, type NodeInfo, type NodeListener, type NotPrimitive, type Observable, type ObservableBoolean, type ObservableEvent, ObservableHint, type ObservableListenerDispose, type ObservableMap, type ObservableObject, type ObservableObjectFns, type ObservableParam, type ObservablePrimitive, type ObservableRoot, type ObservableState, type ObservableSyncState, type ObservableSyncStateBase, type ObservableValue, type ObserveEvent, type ObserveEventCallback, type ObserveOptions, type OpaqueObject, type PlainObject, type Primitive, type RecordValue, type RecursiveValueOrFunction, type RemoveObservables, type RetryOptions, type RootNodeInfo, type Selector, type SetParams, type TrackingNode, type TrackingState, type TrackingType, type TypeAtPath, type UpdateFn, type UpdateFnParams, type UpdateSetFn, type UpdateSetFnParams, type WaitForSet, type WaitForSetFnParams, applyChange, applyChanges, batch, beginBatch, computeSelector, computed, constructObjectWithPath, deconstructObjectWithPath, endBatch, event, getObservableIndex, hasOwnProperty, internal, isArray, isBoolean, isDate, isEmpty, isFunction, isMap, isNullOrUndefined, isNumber, isObject, isObservable, isObservableValueReady, isObserved, isPlainObject, isPrimitive, isPromise, isSet, isString, isSymbol, linked, mergeIntoObservable, observable, observablePrimitive, observe, opaqueObject, proxy, setAtPath, setSilently, shouldIgnoreUnobserved, syncState, trackSelector, when, whenReady };
|
package/index.js
CHANGED
|
@@ -181,7 +181,7 @@ function setNodeValue(node, newValue) {
|
|
|
181
181
|
parentNode.isSetting--;
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
|
-
return { prevValue, newValue };
|
|
184
|
+
return { prevValue, newValue, parentValue };
|
|
185
185
|
}
|
|
186
186
|
var arrNodeKeys = [];
|
|
187
187
|
function getNodeValue(node) {
|
|
@@ -276,16 +276,19 @@ var ObservableHint = {
|
|
|
276
276
|
},
|
|
277
277
|
plain: function plainObject(value) {
|
|
278
278
|
return addSymbol(value, symbolPlain);
|
|
279
|
+
},
|
|
280
|
+
function: function plainObject2(value) {
|
|
281
|
+
return addSymbol(value, symbolPlain);
|
|
279
282
|
}
|
|
280
283
|
};
|
|
281
284
|
|
|
282
285
|
// src/helpers.ts
|
|
283
|
-
function computeSelector(selector, e, retainObservable) {
|
|
286
|
+
function computeSelector(selector, getOptions, e, retainObservable) {
|
|
284
287
|
let c = selector;
|
|
285
288
|
if (!isObservable(c) && isFunction(c)) {
|
|
286
289
|
c = e ? c(e) : c();
|
|
287
290
|
}
|
|
288
|
-
return isObservable(c) && !retainObservable ? c.get() : c;
|
|
291
|
+
return isObservable(c) && !retainObservable ? c.get(getOptions) : c;
|
|
289
292
|
}
|
|
290
293
|
function getObservableIndex(value$) {
|
|
291
294
|
const node = getNode(value$);
|
|
@@ -384,7 +387,7 @@ function _mergeIntoObservable(target, source, levelsDeep) {
|
|
|
384
387
|
const isSourceSet = isSet(source);
|
|
385
388
|
if (isSourceSet && isSet(targetValue)) {
|
|
386
389
|
target.set(/* @__PURE__ */ new Set([...source, ...targetValue]));
|
|
387
|
-
} else if (isTargetObj && isObject(source)
|
|
390
|
+
} else if (isTargetObj && isObject(source) || isTargetArr && targetValue.length > 0) {
|
|
388
391
|
const keys = isSourceMap || isSourceSet ? Array.from(source.keys()) : Object.keys(source);
|
|
389
392
|
for (let i = 0; i < keys.length; i++) {
|
|
390
393
|
const key = keys[i];
|
|
@@ -969,13 +972,13 @@ function updateTracking(node, track) {
|
|
|
969
972
|
}
|
|
970
973
|
|
|
971
974
|
// src/trackSelector.ts
|
|
972
|
-
function trackSelector(selector, update, observeEvent, observeOptions, createResubscribe) {
|
|
975
|
+
function trackSelector(selector, update, getOptions, observeEvent, observeOptions, createResubscribe) {
|
|
973
976
|
var _a;
|
|
974
977
|
let dispose;
|
|
975
978
|
let resubscribe;
|
|
976
979
|
let updateFn = update;
|
|
977
980
|
beginTracking();
|
|
978
|
-
const value = selector ? computeSelector(selector, observeEvent, observeOptions == null ? void 0 : observeOptions.fromComputed) : selector;
|
|
981
|
+
const value = selector ? computeSelector(selector, getOptions, observeEvent, observeOptions == null ? void 0 : observeOptions.fromComputed) : selector;
|
|
979
982
|
const tracker = tracking.current;
|
|
980
983
|
const nodes = tracker.nodes;
|
|
981
984
|
endTracking();
|
|
@@ -1023,7 +1026,11 @@ function observe(selectorOrRun, reactionOrOptions, options) {
|
|
|
1023
1026
|
beginBatch();
|
|
1024
1027
|
delete e.value;
|
|
1025
1028
|
dispose == null ? void 0 : dispose();
|
|
1026
|
-
const {
|
|
1029
|
+
const {
|
|
1030
|
+
dispose: _dispose,
|
|
1031
|
+
value,
|
|
1032
|
+
nodes
|
|
1033
|
+
} = trackSelector(selectorOrRun, update, void 0, e, options);
|
|
1027
1034
|
dispose = _dispose;
|
|
1028
1035
|
e.value = value;
|
|
1029
1036
|
e.nodes = nodes;
|
|
@@ -1068,10 +1075,13 @@ function _when(predicate, effect, checkReady) {
|
|
|
1068
1075
|
let isOk = true;
|
|
1069
1076
|
if (isArray(ret)) {
|
|
1070
1077
|
for (let i = 0; i < ret.length; i++) {
|
|
1071
|
-
|
|
1072
|
-
|
|
1078
|
+
let item = ret[i];
|
|
1079
|
+
if (isObservable(item)) {
|
|
1080
|
+
item = computeSelector(item);
|
|
1081
|
+
} else if (isFunction(item)) {
|
|
1082
|
+
item = item();
|
|
1073
1083
|
}
|
|
1074
|
-
isOk = isOk && !!(checkReady ? isObservableValueReady(
|
|
1084
|
+
isOk = isOk && !!(checkReady ? isObservableValueReady(item) : item);
|
|
1075
1085
|
}
|
|
1076
1086
|
} else {
|
|
1077
1087
|
isOk = checkReady ? isObservableValueReady(ret) : ret;
|
|
@@ -1170,8 +1180,8 @@ function collectionSetter(node, target, prop, ...args) {
|
|
|
1170
1180
|
return ret;
|
|
1171
1181
|
}
|
|
1172
1182
|
}
|
|
1173
|
-
function getKeys(obj, isArr, isMap2) {
|
|
1174
|
-
return isArr ? void 0 : obj ? isMap2 ? Array.from(obj.keys()) : Object.keys(obj) : [];
|
|
1183
|
+
function getKeys(obj, isArr, isMap2, isSet2) {
|
|
1184
|
+
return isArr ? void 0 : obj ? isSet2 ? Array.from(obj) : isMap2 ? Array.from(obj.keys()) : Object.keys(obj) : [];
|
|
1175
1185
|
}
|
|
1176
1186
|
function updateNodes(parent, obj, prevValue) {
|
|
1177
1187
|
var _a, _b, _c;
|
|
@@ -1201,9 +1211,11 @@ function updateNodes(parent, obj, prevValue) {
|
|
|
1201
1211
|
let prevChildrenById;
|
|
1202
1212
|
let moved;
|
|
1203
1213
|
const isCurMap = isMap(obj);
|
|
1214
|
+
const isCurSet = isSet(obj);
|
|
1204
1215
|
const isPrevMap = isMap(prevValue);
|
|
1205
|
-
const
|
|
1206
|
-
const
|
|
1216
|
+
const isPrevSet = isSet(prevValue);
|
|
1217
|
+
const keys = getKeys(obj, isArr, isCurMap, isCurSet);
|
|
1218
|
+
const keysPrev = getKeys(prevValue, isArr, isPrevMap, isPrevSet);
|
|
1207
1219
|
const length = ((_a = keys || obj) == null ? void 0 : _a.length) || 0;
|
|
1208
1220
|
const lengthPrev = ((_b = keysPrev || prevValue) == null ? void 0 : _b.length) || 0;
|
|
1209
1221
|
let idField;
|
|
@@ -1553,7 +1565,9 @@ var proxyHandler = {
|
|
|
1553
1565
|
if (isObservable(thisArg)) {
|
|
1554
1566
|
thisArg = thisArg.peek();
|
|
1555
1567
|
}
|
|
1556
|
-
|
|
1568
|
+
const fnRaw = getNodeValue(target);
|
|
1569
|
+
const fn = isFunction(fnRaw) ? fnRaw : target.lazyFn || target;
|
|
1570
|
+
return Reflect.apply(fn, thisArg, argArray);
|
|
1557
1571
|
}
|
|
1558
1572
|
};
|
|
1559
1573
|
function set(node, newValue) {
|
|
@@ -1585,7 +1599,7 @@ function setKey(node, key, newValue, level) {
|
|
|
1585
1599
|
if (isObservable(newValue)) {
|
|
1586
1600
|
setToObservable(childNode, newValue);
|
|
1587
1601
|
} else {
|
|
1588
|
-
const { newValue: savedValue, prevValue } = setNodeValue(childNode, newValue);
|
|
1602
|
+
const { newValue: savedValue, prevValue, parentValue } = setNodeValue(childNode, newValue);
|
|
1589
1603
|
const isPrim = isPrimitive(savedValue) || savedValue instanceof Date;
|
|
1590
1604
|
if (!isPrim) {
|
|
1591
1605
|
let parent = childNode;
|
|
@@ -1597,7 +1611,17 @@ function setKey(node, key, newValue, level) {
|
|
|
1597
1611
|
const notify2 = !equals(savedValue, prevValue);
|
|
1598
1612
|
const forceNotify = !notify2 && childNode.isComputing && !isPrim;
|
|
1599
1613
|
if (notify2 || forceNotify) {
|
|
1600
|
-
updateNodesAndNotify(
|
|
1614
|
+
updateNodesAndNotify(
|
|
1615
|
+
node,
|
|
1616
|
+
savedValue,
|
|
1617
|
+
prevValue,
|
|
1618
|
+
childNode,
|
|
1619
|
+
parentValue,
|
|
1620
|
+
isPrim,
|
|
1621
|
+
isRoot,
|
|
1622
|
+
level,
|
|
1623
|
+
forceNotify
|
|
1624
|
+
);
|
|
1601
1625
|
}
|
|
1602
1626
|
extractFunctionOrComputed(node, key, savedValue);
|
|
1603
1627
|
}
|
|
@@ -1704,7 +1728,7 @@ function handlerMapSet(node, p, value) {
|
|
|
1704
1728
|
};
|
|
1705
1729
|
}
|
|
1706
1730
|
}
|
|
1707
|
-
function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRoot, level, forceNotify) {
|
|
1731
|
+
function updateNodesAndNotify(node, newValue, prevValue, childNode, parentValue, isPrim, isRoot, level, forceNotify) {
|
|
1708
1732
|
if (!childNode)
|
|
1709
1733
|
childNode = node;
|
|
1710
1734
|
beginBatch();
|
|
@@ -1713,15 +1737,29 @@ function updateNodesAndNotify(node, newValue, prevValue, childNode, isPrim, isRo
|
|
|
1713
1737
|
}
|
|
1714
1738
|
let hasADiff = forceNotify || isPrim;
|
|
1715
1739
|
let whenOptimizedOnlyIf = false;
|
|
1740
|
+
let valueAsArr;
|
|
1741
|
+
let valueAsMap;
|
|
1716
1742
|
if (!isPrim || prevValue && !isPrimitive(prevValue)) {
|
|
1717
1743
|
if ((process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test") && typeof __devUpdateNodes !== "undefined") {
|
|
1718
1744
|
__devUpdateNodes.clear();
|
|
1719
1745
|
}
|
|
1720
1746
|
hasADiff = hasADiff || updateNodes(childNode, newValue, prevValue);
|
|
1721
1747
|
if (isArray(newValue)) {
|
|
1722
|
-
|
|
1748
|
+
valueAsArr = newValue;
|
|
1749
|
+
} else if (isMap(newValue) || isSet(newValue)) {
|
|
1750
|
+
valueAsMap = newValue;
|
|
1723
1751
|
}
|
|
1724
1752
|
}
|
|
1753
|
+
if (isArray(parentValue)) {
|
|
1754
|
+
valueAsArr = parentValue;
|
|
1755
|
+
} else if (isMap(parentValue) || isSet(parentValue)) {
|
|
1756
|
+
valueAsMap = parentValue;
|
|
1757
|
+
}
|
|
1758
|
+
if (valueAsArr) {
|
|
1759
|
+
whenOptimizedOnlyIf = (valueAsArr == null ? void 0 : valueAsArr.length) !== (prevValue == null ? void 0 : prevValue.length);
|
|
1760
|
+
} else if (valueAsMap) {
|
|
1761
|
+
whenOptimizedOnlyIf = (valueAsMap == null ? void 0 : valueAsMap.size) !== (prevValue == null ? void 0 : prevValue.size);
|
|
1762
|
+
}
|
|
1725
1763
|
if (isPrim || !newValue || isEmpty(newValue) && !isEmpty(prevValue) ? newValue !== prevValue : hasADiff) {
|
|
1726
1764
|
notify(
|
|
1727
1765
|
isPrim && isRoot ? node : childNode,
|
|
@@ -1788,7 +1826,7 @@ function peek(node) {
|
|
|
1788
1826
|
}
|
|
1789
1827
|
var isFlushing = false;
|
|
1790
1828
|
function peekInternal(node, activateRecursive) {
|
|
1791
|
-
var _a;
|
|
1829
|
+
var _a, _b;
|
|
1792
1830
|
isFlushing = true;
|
|
1793
1831
|
if (activateRecursive && ((_a = node.dirtyChildren) == null ? void 0 : _a.size)) {
|
|
1794
1832
|
const dirty = Array.from(node.dirtyChildren);
|
|
@@ -1803,7 +1841,10 @@ function peekInternal(node, activateRecursive) {
|
|
|
1803
1841
|
}
|
|
1804
1842
|
isFlushing = false;
|
|
1805
1843
|
let value = getNodeValue(node);
|
|
1806
|
-
if (
|
|
1844
|
+
if (((_b = node.parent) == null ? void 0 : _b.isPlain) || isHintPlain(value)) {
|
|
1845
|
+
node.isPlain = true;
|
|
1846
|
+
}
|
|
1847
|
+
if (!node.root.isLoadingLocal && !node.isPlain) {
|
|
1807
1848
|
value = checkLazy(node, value, !!activateRecursive);
|
|
1808
1849
|
}
|
|
1809
1850
|
return value;
|
|
@@ -2274,7 +2315,14 @@ function syncState(obs) {
|
|
|
2274
2315
|
syncCount: 0,
|
|
2275
2316
|
resetPersistence: void 0,
|
|
2276
2317
|
reset: () => Promise.resolve(),
|
|
2277
|
-
sync: () =>
|
|
2318
|
+
sync: () => {
|
|
2319
|
+
var _a;
|
|
2320
|
+
obs.peek();
|
|
2321
|
+
if ((_a = node.state) == null ? void 0 : _a.isGetting.peek()) {
|
|
2322
|
+
return when(node.state.isLoaded);
|
|
2323
|
+
}
|
|
2324
|
+
return Promise.resolve();
|
|
2325
|
+
},
|
|
2278
2326
|
getPendingChanges: () => ({}),
|
|
2279
2327
|
// TODOV3 remove
|
|
2280
2328
|
clearPersist: void 0
|