@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/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 listenWhileCalling(fn, listeners, updateFn) {
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
- const nodes = state.tracking.nodes;
17
- // Restore previous tracking nodes
18
- state.tracking.nodes = trackingPrev;
19
- // Listen to any nodes not already listened
20
- for (let tracked of nodes) {
21
- const { node, shallow } = tracked[1];
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 listenWhileCalling(() => component(props, ref), refListeners.current, forceRender);
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 = listenWhileCalling(selector, ref.current, onChange);
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/listenWhileCalling.ts","../../src/react/useForceRender.ts","../../src/react/observer.ts","../../src/react/useComputed.ts","../../src/react/useObservable.ts"],"sourcesContent":[null,null,null,null,null],"names":["tracking","onChangeShallow","onChange","useReducer","forwardRef","useRef","useEffect","memo","useMemo","useState","observable","isFunction"],"mappings":"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"}
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, forwardRef, memo, useRef, useEffect, useMemo, useState } from 'react';
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 listenWhileCalling(fn, listeners, updateFn) {
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
- const nodes = tracking.nodes;
13
- // Restore previous tracking nodes
14
- tracking.nodes = trackingPrev;
15
- // Listen to any nodes not already listened
16
- for (let tracked of nodes) {
17
- const { node, shallow } = tracked[1];
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 listenWhileCalling(() => component(props, ref), refListeners.current, forceRender);
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 = listenWhileCalling(selector, ref.current, onChange);
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
- export { observer, useComputed, useObservable };
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/listenWhileCalling.ts","../../src/react/useForceRender.ts","../../src/react/observer.ts","../../src/react/useComputed.ts","../../src/react/useObservable.ts"],"sourcesContent":[null,null,null,null,null],"names":[],"mappings":"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"}
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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"}
@@ -0,0 +1,11 @@
1
+ export default function (): {
2
+ visitor: {
3
+ Program(path: any): void;
4
+ ImportDeclaration: {
5
+ enter(path: any): void;
6
+ };
7
+ JSXElement: {
8
+ enter(path: any): void;
9
+ };
10
+ };
11
+ };
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 Omit<ObservablePrimitiveFns<T>, 'obs'> {
15
+ export interface ObservableFns<T> extends ObservablePrimitiveFns<T> {
15
16
  observe(shallow?: boolean): T;
16
- obs<K extends keyof T>(prop: K): ObservableChild<T[K]>;
17
- set(value: T): ObservableChild<T>;
18
- set<K extends keyof T>(key: K, value: T[K]): ObservableChild<T[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;
@@ -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,2 @@
1
+ import { NodeValue } from '@legendapp/state';
2
+ export declare function getNodePath(node: NodeValue): string;
@@ -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
@@ -0,0 +1,2 @@
1
+ export * from './src/trace/traceListeners';
2
+ export * from './src/trace/traceUpdates';
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
@@ -0,0 +1,6 @@
1
+ declare namespace React {
2
+ interface DOMAttributes<T> {
3
+ isolate?: boolean;
4
+ memo?: boolean;
5
+ }
6
+ }
@@ -1,2 +0,0 @@
1
- import { ObservableListenerDispose } from '@legendapp/state';
2
- export declare function listenWhileCalling<T>(fn: () => T, listeners: Set<ObservableListenerDispose>, updateFn: () => void): T;
package/src/state.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import type { NodeValue, TrackingNode } from './observableInterfaces';
2
- export declare const tracking: {
3
- nodes: Map<number, TrackingNode>;
4
- };
5
- export declare function updateTracking(node: NodeValue, shallow?: boolean): void;