@legendapp/state 0.11.0-next.4 → 0.11.1
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/babel.d.ts +2 -0
- package/babel.js +17849 -0
- package/babel.js.map +1 -0
- package/index.d.ts +1 -1
- package/index.js +95 -37
- package/index.js.map +1 -1
- package/index.mjs +95 -37
- package/index.mjs.map +1 -1
- package/package.json +11 -2
- package/persist.js +1 -1
- package/persist.js.map +1 -1
- package/persist.mjs +1 -1
- package/persist.mjs.map +1 -1
- package/react.d.ts +1 -0
- package/react.js +62 -29
- package/react.js.map +1 -1
- package/react.mjs +61 -31
- package/react.mjs.map +1 -1
- package/src/babel/index.d.ts +11 -0
- package/src/globals.d.ts +1 -0
- package/src/observableBatcher.d.ts +2 -1
- package/src/observableInterfaces.d.ts +11 -7
- package/src/react/Isolate.d.ts +13 -0
- package/src/react/observer.d.ts +2 -2
- package/src/react/useObserver.d.ts +1 -0
- package/src/trace/traceHelpers.d.ts +2 -0
- package/src/trace/traceListeners.d.ts +1 -0
- package/src/trace/traceUpdates.d.ts +1 -0
- package/src/tracking.d.ts +8 -0
- package/trace.d.ts +2 -0
- package/trace.js +45 -0
- package/trace.js.map +1 -0
- package/trace.mjs +40 -0
- package/trace.mjs.map +1 -0
- package/types.d.ts +6 -0
- package/src/react/listenWhileCalling.d.ts +0 -2
- package/src/state.d.ts +0 -5
package/react.js
CHANGED
|
@@ -5,39 +5,55 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var state = require('@legendapp/state');
|
|
7
7
|
|
|
8
|
-
function
|
|
8
|
+
function useForceRender() {
|
|
9
|
+
const [, forceRender] = react.useReducer((s) => s + 1, 0);
|
|
10
|
+
return react.useCallback(() => forceRender(), []);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function useObserver(fn, updateFn) {
|
|
9
14
|
var _a;
|
|
10
15
|
// Cache previous tracking nodes since this might be nested from another observing component
|
|
11
16
|
const trackingPrev = state.tracking.nodes;
|
|
12
17
|
// Reset tracking nodes
|
|
13
18
|
state.tracking.nodes = new Map();
|
|
19
|
+
let nodes;
|
|
20
|
+
// Create the listener effect before calling fn so that it gets called before
|
|
21
|
+
// effects in the component
|
|
22
|
+
react.useEffect(() => {
|
|
23
|
+
const listeners = [];
|
|
24
|
+
// Listen to tracked nodes
|
|
25
|
+
for (let tracked of nodes) {
|
|
26
|
+
const { node, shallow } = tracked[1];
|
|
27
|
+
listeners.push(shallow ? state.onChangeShallow(node, updateFn) : state.onChange(node, updateFn));
|
|
28
|
+
}
|
|
29
|
+
// Cleanup listeners
|
|
30
|
+
return () => {
|
|
31
|
+
for (let i = 0; i < listeners.length; i++) {
|
|
32
|
+
listeners[i]();
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
});
|
|
14
36
|
// Calling the function fills up the tracking nodes
|
|
15
37
|
const ret = fn();
|
|
16
|
-
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// Listen to this path if not already listening
|
|
23
|
-
if (!((_a = node.listeners) === null || _a === void 0 ? void 0 : _a.has(updateFn))) {
|
|
24
|
-
listeners.add(shallow ? state.onChangeShallow(node, updateFn) : state.onChange(node, updateFn));
|
|
38
|
+
nodes = state.tracking.nodes;
|
|
39
|
+
// Do tracing if it was requested
|
|
40
|
+
if (process.env.NODE_ENV === 'development') {
|
|
41
|
+
(_a = state.tracking.listeners) === null || _a === void 0 ? void 0 : _a.call(state.tracking, nodes);
|
|
42
|
+
if (state.tracking.updates) {
|
|
43
|
+
updateFn = state.tracking.updates(updateFn);
|
|
25
44
|
}
|
|
26
45
|
}
|
|
46
|
+
// Restore previous tracking nodes
|
|
47
|
+
state.tracking.nodes = trackingPrev;
|
|
27
48
|
return ret;
|
|
28
49
|
}
|
|
29
50
|
|
|
30
|
-
function useForceRender() {
|
|
31
|
-
const [, forceRender] = react.useReducer((s) => s + 1, 0);
|
|
32
|
-
return () => forceRender();
|
|
33
|
-
}
|
|
34
|
-
|
|
35
51
|
const hasSymbol = typeof Symbol === 'function' && Symbol.for;
|
|
36
52
|
// Extracting the forwardRef inspired by https://github.com/mobxjs/mobx/blob/main/packages/mobx-react-lite/src/observer.ts
|
|
37
53
|
const ReactForwardRefSymbol = hasSymbol
|
|
38
54
|
? Symbol.for('react.forward_ref')
|
|
39
55
|
: typeof react.forwardRef === 'function' && react.forwardRef((props) => null)['$$typeof'];
|
|
40
|
-
function observer(component) {
|
|
56
|
+
function observer(component, propsAreEqual) {
|
|
41
57
|
// Unwrap forwardRef on the component
|
|
42
58
|
let useForwardRef;
|
|
43
59
|
if (ReactForwardRefSymbol && component['$$typeof'] === ReactForwardRefSymbol) {
|
|
@@ -50,14 +66,9 @@ function observer(component) {
|
|
|
50
66
|
const componentName = component.displayName || component.name;
|
|
51
67
|
// Create a wrapper observer component
|
|
52
68
|
let observer = function (props, ref) {
|
|
53
|
-
const refListeners = react.useRef();
|
|
54
|
-
if (!refListeners.current)
|
|
55
|
-
refListeners.current = new Set();
|
|
56
69
|
const forceRender = useForceRender();
|
|
57
|
-
// Clean up listeners on the way out
|
|
58
|
-
react.useEffect(() => () => refListeners.current.forEach((dispose) => dispose()), []);
|
|
59
70
|
// Set up all the listeners while rendering the component
|
|
60
|
-
return
|
|
71
|
+
return useObserver(() => component(props, ref), forceRender);
|
|
61
72
|
};
|
|
62
73
|
if (componentName !== '') {
|
|
63
74
|
observer.displayName = componentName;
|
|
@@ -66,13 +77,10 @@ function observer(component) {
|
|
|
66
77
|
if (useForwardRef) {
|
|
67
78
|
observer = react.forwardRef(observer);
|
|
68
79
|
}
|
|
69
|
-
return react.memo(observer);
|
|
80
|
+
return react.memo(observer, propsAreEqual);
|
|
70
81
|
}
|
|
71
82
|
|
|
72
83
|
function useComputed(selector, deps) {
|
|
73
|
-
const ref = react.useRef();
|
|
74
|
-
if (!ref.current)
|
|
75
|
-
ref.current = new Set();
|
|
76
84
|
// Do all the computed magic inside a useMemo so we can get an initial value
|
|
77
85
|
const initial = react.useMemo(() => {
|
|
78
86
|
let prevValue;
|
|
@@ -85,12 +93,10 @@ function useComputed(selector, deps) {
|
|
|
85
93
|
}
|
|
86
94
|
};
|
|
87
95
|
// Set up all the listeners while computing the value
|
|
88
|
-
prevValue =
|
|
96
|
+
prevValue = useObserver(selector, onChange);
|
|
89
97
|
return prevValue;
|
|
90
98
|
}, deps || []);
|
|
91
99
|
const [value, setValue] = react.useState(initial);
|
|
92
|
-
// Clean up listeners on the way out
|
|
93
|
-
react.useEffect(() => () => ref.current.forEach((dispose) => dispose()), []);
|
|
94
100
|
return value;
|
|
95
101
|
}
|
|
96
102
|
|
|
@@ -106,6 +112,33 @@ function useObservable(initialValue) {
|
|
|
106
112
|
return react.useMemo(() => state.observable(state.isFunction(initialValue) ? initialValue() : initialValue), []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
107
113
|
}
|
|
108
114
|
|
|
115
|
+
const symbolIsObservable = Symbol('isObservable');
|
|
116
|
+
|
|
117
|
+
function isObservable(obs) {
|
|
118
|
+
return obs && !!obs[symbolIsObservable];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const Isolate = observer(function Isolate({ children, }) {
|
|
122
|
+
return children();
|
|
123
|
+
});
|
|
124
|
+
const Memo = observer(function Memo({ children }) {
|
|
125
|
+
return children();
|
|
126
|
+
}, () => true);
|
|
127
|
+
const Show = observer(function Show({ if: if_, else: else_, children, memo, }) {
|
|
128
|
+
if_ = if_();
|
|
129
|
+
if (isObservable(if_)) {
|
|
130
|
+
if_ = if_.observe(true);
|
|
131
|
+
}
|
|
132
|
+
return if_
|
|
133
|
+
? (memo ? react.useMemo(() => children, []) : children)()
|
|
134
|
+
: else_
|
|
135
|
+
? else_()
|
|
136
|
+
: null;
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
exports.Isolate = Isolate;
|
|
140
|
+
exports.Memo = Memo;
|
|
141
|
+
exports.Show = Show;
|
|
109
142
|
exports.observer = observer;
|
|
110
143
|
exports.useComputed = useComputed;
|
|
111
144
|
exports.useObservable = useObservable;
|
package/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sources":["../../src/react/
|
|
1
|
+
{"version":3,"file":"react.js","sources":["../../src/react/useForceRender.ts","../../src/react/useObserver.ts","../../src/react/observer.ts","../../src/react/useComputed.ts","../../src/react/useObservable.ts","../../src/globals.ts","../../src/helpers.ts","../../src/react/Isolate.tsx"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":["useReducer","useCallback","tracking","useEffect","onChangeShallow","onChange","forwardRef","memo","useMemo","useState","observable","isFunction"],"mappings":"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"}
|
package/react.mjs
CHANGED
|
@@ -1,39 +1,55 @@
|
|
|
1
|
-
import { useReducer,
|
|
1
|
+
import { useReducer, useCallback, useEffect, forwardRef, memo, useMemo, useState } from 'react';
|
|
2
2
|
import { tracking, onChangeShallow, onChange, observable, isFunction } from '@legendapp/state';
|
|
3
3
|
|
|
4
|
-
function
|
|
4
|
+
function useForceRender() {
|
|
5
|
+
const [, forceRender] = useReducer((s) => s + 1, 0);
|
|
6
|
+
return useCallback(() => forceRender(), []);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function useObserver(fn, updateFn) {
|
|
5
10
|
var _a;
|
|
6
11
|
// Cache previous tracking nodes since this might be nested from another observing component
|
|
7
12
|
const trackingPrev = tracking.nodes;
|
|
8
13
|
// Reset tracking nodes
|
|
9
14
|
tracking.nodes = new Map();
|
|
15
|
+
let nodes;
|
|
16
|
+
// Create the listener effect before calling fn so that it gets called before
|
|
17
|
+
// effects in the component
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const listeners = [];
|
|
20
|
+
// Listen to tracked nodes
|
|
21
|
+
for (let tracked of nodes) {
|
|
22
|
+
const { node, shallow } = tracked[1];
|
|
23
|
+
listeners.push(shallow ? onChangeShallow(node, updateFn) : onChange(node, updateFn));
|
|
24
|
+
}
|
|
25
|
+
// Cleanup listeners
|
|
26
|
+
return () => {
|
|
27
|
+
for (let i = 0; i < listeners.length; i++) {
|
|
28
|
+
listeners[i]();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
});
|
|
10
32
|
// Calling the function fills up the tracking nodes
|
|
11
33
|
const ret = fn();
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
// Listen to this path if not already listening
|
|
19
|
-
if (!((_a = node.listeners) === null || _a === void 0 ? void 0 : _a.has(updateFn))) {
|
|
20
|
-
listeners.add(shallow ? onChangeShallow(node, updateFn) : onChange(node, updateFn));
|
|
34
|
+
nodes = tracking.nodes;
|
|
35
|
+
// Do tracing if it was requested
|
|
36
|
+
if (process.env.NODE_ENV === 'development') {
|
|
37
|
+
(_a = tracking.listeners) === null || _a === void 0 ? void 0 : _a.call(tracking, nodes);
|
|
38
|
+
if (tracking.updates) {
|
|
39
|
+
updateFn = tracking.updates(updateFn);
|
|
21
40
|
}
|
|
22
41
|
}
|
|
42
|
+
// Restore previous tracking nodes
|
|
43
|
+
tracking.nodes = trackingPrev;
|
|
23
44
|
return ret;
|
|
24
45
|
}
|
|
25
46
|
|
|
26
|
-
function useForceRender() {
|
|
27
|
-
const [, forceRender] = useReducer((s) => s + 1, 0);
|
|
28
|
-
return () => forceRender();
|
|
29
|
-
}
|
|
30
|
-
|
|
31
47
|
const hasSymbol = typeof Symbol === 'function' && Symbol.for;
|
|
32
48
|
// Extracting the forwardRef inspired by https://github.com/mobxjs/mobx/blob/main/packages/mobx-react-lite/src/observer.ts
|
|
33
49
|
const ReactForwardRefSymbol = hasSymbol
|
|
34
50
|
? Symbol.for('react.forward_ref')
|
|
35
51
|
: typeof forwardRef === 'function' && forwardRef((props) => null)['$$typeof'];
|
|
36
|
-
function observer(component) {
|
|
52
|
+
function observer(component, propsAreEqual) {
|
|
37
53
|
// Unwrap forwardRef on the component
|
|
38
54
|
let useForwardRef;
|
|
39
55
|
if (ReactForwardRefSymbol && component['$$typeof'] === ReactForwardRefSymbol) {
|
|
@@ -46,14 +62,9 @@ function observer(component) {
|
|
|
46
62
|
const componentName = component.displayName || component.name;
|
|
47
63
|
// Create a wrapper observer component
|
|
48
64
|
let observer = function (props, ref) {
|
|
49
|
-
const refListeners = useRef();
|
|
50
|
-
if (!refListeners.current)
|
|
51
|
-
refListeners.current = new Set();
|
|
52
65
|
const forceRender = useForceRender();
|
|
53
|
-
// Clean up listeners on the way out
|
|
54
|
-
useEffect(() => () => refListeners.current.forEach((dispose) => dispose()), []);
|
|
55
66
|
// Set up all the listeners while rendering the component
|
|
56
|
-
return
|
|
67
|
+
return useObserver(() => component(props, ref), forceRender);
|
|
57
68
|
};
|
|
58
69
|
if (componentName !== '') {
|
|
59
70
|
observer.displayName = componentName;
|
|
@@ -62,13 +73,10 @@ function observer(component) {
|
|
|
62
73
|
if (useForwardRef) {
|
|
63
74
|
observer = forwardRef(observer);
|
|
64
75
|
}
|
|
65
|
-
return memo(observer);
|
|
76
|
+
return memo(observer, propsAreEqual);
|
|
66
77
|
}
|
|
67
78
|
|
|
68
79
|
function useComputed(selector, deps) {
|
|
69
|
-
const ref = useRef();
|
|
70
|
-
if (!ref.current)
|
|
71
|
-
ref.current = new Set();
|
|
72
80
|
// Do all the computed magic inside a useMemo so we can get an initial value
|
|
73
81
|
const initial = useMemo(() => {
|
|
74
82
|
let prevValue;
|
|
@@ -81,12 +89,10 @@ function useComputed(selector, deps) {
|
|
|
81
89
|
}
|
|
82
90
|
};
|
|
83
91
|
// Set up all the listeners while computing the value
|
|
84
|
-
prevValue =
|
|
92
|
+
prevValue = useObserver(selector, onChange);
|
|
85
93
|
return prevValue;
|
|
86
94
|
}, deps || []);
|
|
87
95
|
const [value, setValue] = useState(initial);
|
|
88
|
-
// Clean up listeners on the way out
|
|
89
|
-
useEffect(() => () => ref.current.forEach((dispose) => dispose()), []);
|
|
90
96
|
return value;
|
|
91
97
|
}
|
|
92
98
|
|
|
@@ -102,5 +108,29 @@ function useObservable(initialValue) {
|
|
|
102
108
|
return useMemo(() => observable(isFunction(initialValue) ? initialValue() : initialValue), []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
103
109
|
}
|
|
104
110
|
|
|
105
|
-
|
|
111
|
+
const symbolIsObservable = Symbol('isObservable');
|
|
112
|
+
|
|
113
|
+
function isObservable(obs) {
|
|
114
|
+
return obs && !!obs[symbolIsObservable];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const Isolate = observer(function Isolate({ children, }) {
|
|
118
|
+
return children();
|
|
119
|
+
});
|
|
120
|
+
const Memo = observer(function Memo({ children }) {
|
|
121
|
+
return children();
|
|
122
|
+
}, () => true);
|
|
123
|
+
const Show = observer(function Show({ if: if_, else: else_, children, memo, }) {
|
|
124
|
+
if_ = if_();
|
|
125
|
+
if (isObservable(if_)) {
|
|
126
|
+
if_ = if_.observe(true);
|
|
127
|
+
}
|
|
128
|
+
return if_
|
|
129
|
+
? (memo ? useMemo(() => children, []) : children)()
|
|
130
|
+
: else_
|
|
131
|
+
? else_()
|
|
132
|
+
: null;
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
export { Isolate, Memo, Show, observer, useComputed, useObservable };
|
|
106
136
|
//# sourceMappingURL=react.mjs.map
|
package/react.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.mjs","sources":["../../src/react/
|
|
1
|
+
{"version":3,"file":"react.mjs","sources":["../../src/react/useForceRender.ts","../../src/react/useObserver.ts","../../src/react/observer.ts","../../src/react/useComputed.ts","../../src/react/useObservable.ts","../../src/globals.ts","../../src/helpers.ts","../../src/react/Isolate.tsx"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
|
package/src/globals.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export declare const symbolIsObservable: unique symbol;
|
|
|
4
4
|
export declare const nextNodeID: {
|
|
5
5
|
current: number;
|
|
6
6
|
};
|
|
7
|
+
export declare function getOutputValue(node: NodeValue): any;
|
|
7
8
|
export declare function get(node: NodeValue): any;
|
|
8
9
|
export declare function observe(node: NodeValue, shallow?: boolean): any;
|
|
9
10
|
export declare function getNodeValue(node: NodeValue): any;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ListenerFn } from './observableInterfaces';
|
|
1
|
+
import { ListenerFn, NodeValue } from './observableInterfaces';
|
|
2
2
|
interface BatchItem {
|
|
3
3
|
cb: ListenerFn<any>;
|
|
4
4
|
value: any;
|
|
@@ -6,6 +6,7 @@ interface BatchItem {
|
|
|
6
6
|
path: (string | number)[];
|
|
7
7
|
valueAtPath: any;
|
|
8
8
|
prevAtPath: any;
|
|
9
|
+
node: NodeValue;
|
|
9
10
|
}
|
|
10
11
|
export declare function observableBatcherNotify(b: BatchItem): void;
|
|
11
12
|
export declare namespace observableBatcher {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export declare type ObservableEventType = 'change' | 'changeShallow' | 'equals' | 'hasValue' | 'true';
|
|
2
2
|
export interface ObservableBaseFns<T> {
|
|
3
3
|
get(): T;
|
|
4
|
+
ref(): ObservableChild<T>;
|
|
5
|
+
observe(): T;
|
|
4
6
|
onChange(cb: ListenerFn<T>): ObservableListenerDispose;
|
|
5
7
|
onChangeShallow(cb: ListenerFn<T>): ObservableListenerDispose;
|
|
6
8
|
onEquals(value: T, cb?: (value?: T) => void): OnReturnValue<T>;
|
|
@@ -8,14 +10,13 @@ export interface ObservableBaseFns<T> {
|
|
|
8
10
|
onHasValue(cb?: (value?: T) => void): OnReturnValue<T>;
|
|
9
11
|
}
|
|
10
12
|
export interface ObservablePrimitiveFns<T> extends ObservableBaseFns<T> {
|
|
11
|
-
set(value: T): ObservableChild<T>;
|
|
12
|
-
obs(): ObservablePrimitiveFns<T>;
|
|
13
|
+
set(value: T | ((prev: T) => T)): ObservableChild<T>;
|
|
13
14
|
}
|
|
14
|
-
export interface ObservableFns<T> extends
|
|
15
|
+
export interface ObservableFns<T> extends ObservablePrimitiveFns<T> {
|
|
15
16
|
observe(shallow?: boolean): T;
|
|
16
|
-
|
|
17
|
-
set(value: T): ObservableChild<T>;
|
|
18
|
-
set<K extends keyof T>(key: K,
|
|
17
|
+
prop<K extends keyof T>(prop: K): ObservableObject<T[K]>;
|
|
18
|
+
set(value: T | ((prev: T) => T)): ObservableChild<T>;
|
|
19
|
+
set<K extends keyof T>(key: K, prev: T[K] | ((prev: T[K]) => T[K])): ObservableChild<T[K]>;
|
|
19
20
|
set<V>(key: string | number, value: V): ObservableChild<V>;
|
|
20
21
|
assign(value: T | Partial<T>): ObservableChild<T>;
|
|
21
22
|
delete(): ObservableChild<T>;
|
|
@@ -23,6 +24,7 @@ export interface ObservableFns<T> extends Omit<ObservablePrimitiveFns<T>, 'obs'>
|
|
|
23
24
|
}
|
|
24
25
|
export interface ObservableComputedFns<T> {
|
|
25
26
|
get(): T;
|
|
27
|
+
observe(shallow?: boolean): T;
|
|
26
28
|
onChange(cb: ListenerFn<T>): ObservableListenerDispose;
|
|
27
29
|
onEquals(value: T, cb?: (value?: T) => void): OnReturnValue<T>;
|
|
28
30
|
onTrue(cb?: (value?: T) => void): OnReturnValue<T>;
|
|
@@ -43,7 +45,7 @@ export interface ObservableArrayOverride<T> extends Omit<Array<T>, ArrayOverride
|
|
|
43
45
|
*/
|
|
44
46
|
map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
|
|
45
47
|
}
|
|
46
|
-
export declare type ListenerFn<T = any> = (value: T, getPrevious: () => T, path: (string | number)[], valueAtPath: any, prevAtPath: any) => void;
|
|
48
|
+
export declare type ListenerFn<T = any> = (value: T, getPrevious: () => T, path: (string | number)[], valueAtPath: any, prevAtPath: any, node: NodeValue) => void;
|
|
47
49
|
export declare type ListenerFnSaved<T = any> = {
|
|
48
50
|
shallow?: boolean;
|
|
49
51
|
} & ListenerFn<T>;
|
|
@@ -55,6 +57,7 @@ export interface ObservableEvent {
|
|
|
55
57
|
dispatch(): void;
|
|
56
58
|
on(cb?: () => void): ObservableListenerDispose;
|
|
57
59
|
on(eventType: 'change', cb?: () => void): ObservableListenerDispose;
|
|
60
|
+
observe(): void;
|
|
58
61
|
}
|
|
59
62
|
export declare type QueryByModified<T> = boolean | '*' | {
|
|
60
63
|
'*': '*' | true;
|
|
@@ -171,5 +174,6 @@ export interface NodeValue {
|
|
|
171
174
|
export interface TrackingNode {
|
|
172
175
|
node: NodeValue;
|
|
173
176
|
shallow?: boolean;
|
|
177
|
+
manual?: boolean;
|
|
174
178
|
}
|
|
175
179
|
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ReactElement, ReactNode } from 'react';
|
|
2
|
+
export declare const Isolate: ({ children, }: {
|
|
3
|
+
children: ReactNode | (() => ReactNode);
|
|
4
|
+
}) => ReactElement;
|
|
5
|
+
export declare const Memo: ({ children }: {
|
|
6
|
+
children: ReactNode | (() => ReactNode);
|
|
7
|
+
}) => ReactElement;
|
|
8
|
+
export declare const Show: ({ if: if_, else: else_, children, memo, }: {
|
|
9
|
+
if: any;
|
|
10
|
+
else?: any;
|
|
11
|
+
memo?: boolean;
|
|
12
|
+
children: ReactNode | (() => ReactNode);
|
|
13
|
+
}) => ReactElement;
|
package/src/react/observer.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { FC } from 'react';
|
|
2
|
-
export declare function observer<T extends FC<any>>(component: T): T;
|
|
1
|
+
import { ComponentProps, FC } from 'react';
|
|
2
|
+
export declare function observer<T extends FC<any>>(component: T, propsAreEqual?: (prevProps: Readonly<ComponentProps<T>>, nextProps: Readonly<ComponentProps<T>>) => boolean): T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useObserver<T>(fn: () => T, updateFn: () => void): T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function traceListeners(name?: string): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function traceUpdates(name?: string): void;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NodeValue, TrackingNode } from './observableInterfaces';
|
|
2
|
+
export declare const tracking: {
|
|
3
|
+
nodes: Map<number, TrackingNode>;
|
|
4
|
+
listeners: (nodes: Map<number, TrackingNode>) => void;
|
|
5
|
+
updates: (fn: () => void) => () => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function updateTracking(node: NodeValue, parent?: NodeValue, shallow?: boolean, manual?: boolean): void;
|
|
8
|
+
export declare function untrack(node: NodeValue): void;
|
package/trace.d.ts
ADDED
package/trace.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var state = require('@legendapp/state');
|
|
6
|
+
|
|
7
|
+
function getNodePath(node) {
|
|
8
|
+
const arr = [];
|
|
9
|
+
let n = node;
|
|
10
|
+
while ((n === null || n === void 0 ? void 0 : n.key) !== undefined) {
|
|
11
|
+
arr.splice(0, 0, n.key);
|
|
12
|
+
n = n.parent;
|
|
13
|
+
}
|
|
14
|
+
return arr.join('.');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function traceListeners(name) {
|
|
18
|
+
state.tracking.listeners = traceNodes.bind(this, name);
|
|
19
|
+
}
|
|
20
|
+
function traceNodes(name, nodes) {
|
|
21
|
+
state.tracking.listeners = undefined;
|
|
22
|
+
const arr = [];
|
|
23
|
+
for (let tracked of nodes) {
|
|
24
|
+
const { node, shallow } = tracked[1];
|
|
25
|
+
arr.push(`${arr.length + 1}: ${getNodePath(node)}${shallow ? ' (shallow)' : ''}`);
|
|
26
|
+
}
|
|
27
|
+
console.log(`[legend-state] ${name ? name + ' ' : ''}tracking ${arr.length} observable${arr.length > 1 ? 's' : ''}:\n${arr.join('\n')}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function traceUpdates(name) {
|
|
31
|
+
state.tracking.updates = replaceUpdateFn.bind(this, name);
|
|
32
|
+
}
|
|
33
|
+
function replaceUpdateFn(name, updateFn) {
|
|
34
|
+
return onChange.bind(this, name, updateFn);
|
|
35
|
+
}
|
|
36
|
+
function onChange(name, updateFn, value, getPrevious, path, valueAtPath, prevAtPath, node) {
|
|
37
|
+
console.log(`[legend-state] Rendering ${name ? name + ' ' : ''}because "${getNodePath(node)}" changed:
|
|
38
|
+
from: ${JSON.stringify(getPrevious())}
|
|
39
|
+
to: ${JSON.stringify(value)}`);
|
|
40
|
+
updateFn();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
exports.traceListeners = traceListeners;
|
|
44
|
+
exports.traceUpdates = traceUpdates;
|
|
45
|
+
//# sourceMappingURL=trace.js.map
|
package/trace.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sources":["../../src/trace/traceHelpers.ts","../../src/trace/traceListeners.ts","../../src/trace/traceUpdates.ts"],"sourcesContent":[null,null,null],"names":["tracking"],"mappings":";;;;;;AAEM,SAAU,WAAW,CAAC,IAAe,EAAA;IACvC,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,OAAO,CAAA,CAAC,KAAA,IAAA,IAAD,CAAC,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAD,CAAC,CAAE,GAAG,MAAK,SAAS,EAAE;QACzB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AACxB,QAAA,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AAChB,KAAA;AACD,IAAA,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB;;ACPM,SAAU,cAAc,CAAC,IAAa,EAAA;IACxCA,cAAQ,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAgC,EAAA;AAC9D,IAAAA,cAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;AACzB,IAAA,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;QACvB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,CAAG,EAAA,GAAG,CAAC,MAAM,GAAG,CAAC,CAAK,EAAA,EAAA,WAAW,CAAC,IAAI,CAAC,CAAG,EAAA,OAAO,GAAG,YAAY,GAAG,EAAE,CAAE,CAAA,CAAC,CAAC;AACrF,KAAA;AAED,IAAA,OAAO,CAAC,GAAG,CACP,kBAAkB,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,YAAY,GAAG,CAAC,MAAM,CAC1D,WAAA,EAAA,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,EAC3B,CAAM,GAAA,EAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CACzB,CAAC;AACN;;ACjBM,SAAU,YAAY,CAAC,IAAa,EAAA;IACtCA,cAAQ,CAAC,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAAoB,EAAA;IACvD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,QAAQ,CACb,IAAY,EACZ,QAAoB,EACpB,KAAU,EACV,WAAsB,EACtB,IAAyB,EACzB,WAAgB,EAChB,UAAe,EACf,IAAe,EAAA;AAEf,IAAA,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,YAAY,WAAW,CAAC,IAAI,CAAC,CAAA;AACvF,MAAA,EAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;AAC/B,IAAA,EAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA,CAAE,CAAC,CAAC;AAC3B,IAAA,QAAQ,EAAE,CAAC;AACf;;;;;"}
|
package/trace.mjs
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { tracking } from '@legendapp/state';
|
|
2
|
+
|
|
3
|
+
function getNodePath(node) {
|
|
4
|
+
const arr = [];
|
|
5
|
+
let n = node;
|
|
6
|
+
while ((n === null || n === void 0 ? void 0 : n.key) !== undefined) {
|
|
7
|
+
arr.splice(0, 0, n.key);
|
|
8
|
+
n = n.parent;
|
|
9
|
+
}
|
|
10
|
+
return arr.join('.');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function traceListeners(name) {
|
|
14
|
+
tracking.listeners = traceNodes.bind(this, name);
|
|
15
|
+
}
|
|
16
|
+
function traceNodes(name, nodes) {
|
|
17
|
+
tracking.listeners = undefined;
|
|
18
|
+
const arr = [];
|
|
19
|
+
for (let tracked of nodes) {
|
|
20
|
+
const { node, shallow } = tracked[1];
|
|
21
|
+
arr.push(`${arr.length + 1}: ${getNodePath(node)}${shallow ? ' (shallow)' : ''}`);
|
|
22
|
+
}
|
|
23
|
+
console.log(`[legend-state] ${name ? name + ' ' : ''}tracking ${arr.length} observable${arr.length > 1 ? 's' : ''}:\n${arr.join('\n')}`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function traceUpdates(name) {
|
|
27
|
+
tracking.updates = replaceUpdateFn.bind(this, name);
|
|
28
|
+
}
|
|
29
|
+
function replaceUpdateFn(name, updateFn) {
|
|
30
|
+
return onChange.bind(this, name, updateFn);
|
|
31
|
+
}
|
|
32
|
+
function onChange(name, updateFn, value, getPrevious, path, valueAtPath, prevAtPath, node) {
|
|
33
|
+
console.log(`[legend-state] Rendering ${name ? name + ' ' : ''}because "${getNodePath(node)}" changed:
|
|
34
|
+
from: ${JSON.stringify(getPrevious())}
|
|
35
|
+
to: ${JSON.stringify(value)}`);
|
|
36
|
+
updateFn();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { traceListeners, traceUpdates };
|
|
40
|
+
//# sourceMappingURL=trace.mjs.map
|
package/trace.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.mjs","sources":["../../src/trace/traceHelpers.ts","../../src/trace/traceListeners.ts","../../src/trace/traceUpdates.ts"],"sourcesContent":[null,null,null],"names":[],"mappings":";;AAEM,SAAU,WAAW,CAAC,IAAe,EAAA;IACvC,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,OAAO,CAAA,CAAC,KAAA,IAAA,IAAD,CAAC,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAD,CAAC,CAAE,GAAG,MAAK,SAAS,EAAE;QACzB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AACxB,QAAA,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;AAChB,KAAA;AACD,IAAA,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB;;ACPM,SAAU,cAAc,CAAC,IAAa,EAAA;IACxC,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAgC,EAAA;AAC9D,IAAA,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;AACzB,IAAA,KAAK,IAAI,OAAO,IAAI,KAAK,EAAE;QACvB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,CAAG,EAAA,GAAG,CAAC,MAAM,GAAG,CAAC,CAAK,EAAA,EAAA,WAAW,CAAC,IAAI,CAAC,CAAG,EAAA,OAAO,GAAG,YAAY,GAAG,EAAE,CAAE,CAAA,CAAC,CAAC;AACrF,KAAA;AAED,IAAA,OAAO,CAAC,GAAG,CACP,kBAAkB,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,YAAY,GAAG,CAAC,MAAM,CAC1D,WAAA,EAAA,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,EAC3B,CAAM,GAAA,EAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CACzB,CAAC;AACN;;ACjBM,SAAU,YAAY,CAAC,IAAa,EAAA;IACtC,QAAQ,CAAC,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,QAAoB,EAAA;IACvD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,QAAQ,CACb,IAAY,EACZ,QAAoB,EACpB,KAAU,EACV,WAAsB,EACtB,IAAyB,EACzB,WAAgB,EAChB,UAAe,EACf,IAAe,EAAA;AAEf,IAAA,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,YAAY,WAAW,CAAC,IAAI,CAAC,CAAA;AACvF,MAAA,EAAA,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;AAC/B,IAAA,EAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA,CAAE,CAAC,CAAC;AAC3B,IAAA,QAAQ,EAAE,CAAC;AACf;;;;"}
|
package/types.d.ts
ADDED