@fluixi/devtools 0.2.0-alpha.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/LICENSE +21 -0
- package/README.md +33 -0
- package/dist/graph-view.d.ts +12 -0
- package/dist/graph-view.d.ts.map +1 -0
- package/dist/graph-view.js +165 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/instrument.d.ts +56 -0
- package/dist/instrument.d.ts.map +1 -0
- package/dist/instrument.js +215 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +30 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Fluixi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# @fluixi/devtools
|
|
2
|
+
|
|
3
|
+
Live inspector for the Fluixi reactive graph. Instrument `signal` / `memo` / `effect`, then render
|
|
4
|
+
the dependency graph and watch propagation animate — State → Memo → Effect, glitch-free, lazy.
|
|
5
|
+
|
|
6
|
+
```ts
|
|
7
|
+
import { createReactor, createGraphView, DEVTOOLS_CSS } from '@fluixi/devtools';
|
|
8
|
+
|
|
9
|
+
const reactor = createReactor();
|
|
10
|
+
reactor.run(({ createSignal, createMemo, createEffect }) => {
|
|
11
|
+
const [count, setCount] = createSignal(0, { name: 'count' });
|
|
12
|
+
const double = createMemo(() => count() * 2, { name: 'double' });
|
|
13
|
+
createEffect(() => console.log(double()), { name: 'log' });
|
|
14
|
+
setInterval(() => setCount((n) => n + 1), 1000);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const view = createGraphView(svgEl);
|
|
18
|
+
const tick = () => { reactor.sample(); view.update(reactor.graph); requestAnimationFrame(tick); };
|
|
19
|
+
tick();
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## How it works
|
|
23
|
+
|
|
24
|
+
The instrumented `signal`/`memo`/`effect` wrap the real `@fluixi/reactive` primitives. A read is a
|
|
25
|
+
subscription, so edges are recorded from actual reads — it's the genuine dependency graph, not a
|
|
26
|
+
reconstruction. Values are re-read untracked each frame and effects count their own re-runs, so the
|
|
27
|
+
inspector animates exactly as the core propagates.
|
|
28
|
+
|
|
29
|
+
## API
|
|
30
|
+
|
|
31
|
+
- `createReactor()` → `{ graph, run(setup), sample(), dispose() }`
|
|
32
|
+
- `createGraphView(svg)` → `{ update(graph, now?), clear() }`
|
|
33
|
+
- `DEVTOOLS_CSS` — default theme string (override the `fx-*` classes to restyle)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RNode } from './instrument.js';
|
|
2
|
+
export interface GraphViewOptions {
|
|
3
|
+
onSelect?: (node: RNode | null) => void;
|
|
4
|
+
}
|
|
5
|
+
export interface GraphView {
|
|
6
|
+
update(graph: Map<number, RNode>, now?: number): void;
|
|
7
|
+
clear(): void;
|
|
8
|
+
select(id: number | null): void;
|
|
9
|
+
}
|
|
10
|
+
export declare function createGraphView(svg: SVGSVGElement, options?: GraphViewOptions): GraphView;
|
|
11
|
+
export declare const DEVTOOLS_CSS = "\n.fx-edge { fill: none; stroke: #38415a; stroke-width: 1.6; opacity: .75; }\n.fx-wedge { fill: none; stroke: #fb7185; stroke-width: 1.4; stroke-dasharray: 3 4; opacity: .65; }\n.fx-node { color: #5eead4; filter: drop-shadow(0 0 calc(var(--pulse,0) * 13px) var(--glow, #5eead4)); }\n.fx-node.n-state { --glow: #34d399; }\n.fx-node.n-memo { --glow: #a78bfa; }\n.fx-node.n-effect { --glow: #fbbf24; }\n.fx-node.n-store { --glow: #38bdf8; }\n.fx-node.n-resource { --glow: #fb7185; }\n.fx-box { fill: #131722; stroke: var(--glow, #5eead4); stroke-width: 1.4; stroke-opacity: calc(.5 + var(--pulse,0) * .5); }\n.fx-node.selected .fx-box { fill: #1a2230; stroke-width: 2.4; }\n.fx-kind { fill: var(--glow, #5eead4); font-family: ui-monospace, monospace; font-size: 9.5px; opacity: .85; }\n.fx-label { fill: #e7e9ee; font-family: ui-sans-serif, system-ui, sans-serif; font-size: 13px; font-weight: 600; }\n.fx-value { fill: #8a90a2; font-family: ui-monospace, monospace; font-size: 12px; }\n.fx-node.n-effect .fx-value { fill: #fbbf24; }\n.fx-node.n-resource .fx-value { fill: #fb7185; }\n";
|
|
12
|
+
//# sourceMappingURL=graph-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-view.d.ts","sourceRoot":"","sources":["../src/graph-view.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAY,MAAM,iBAAiB,CAAC;AAmCvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,GAAE,gBAAqB,GAAG,SAAS,CA+G7F;AAGD,eAAO,MAAM,YAAY,+jCAgBxB,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
const SVGNS = 'http://www.w3.org/2000/svg';
|
|
2
|
+
const COL = 200;
|
|
3
|
+
const ROW = 92;
|
|
4
|
+
const NW = 132;
|
|
5
|
+
const NH = 56;
|
|
6
|
+
const PAD = 48;
|
|
7
|
+
const KIND_CLASS = { state: 'n-state', memo: 'n-memo', effect: 'n-effect', store: 'n-store', resource: 'n-resource' };
|
|
8
|
+
const KIND_GLYPH = { state: '◆ state', memo: 'ƒ memo', effect: '⚡ effect', store: '▤ store', resource: '⟳ resource' };
|
|
9
|
+
function el(tag, attrs = {}) {
|
|
10
|
+
const n = document.createElementNS(SVGNS, tag);
|
|
11
|
+
for (const k in attrs)
|
|
12
|
+
n.setAttribute(k, String(attrs[k]));
|
|
13
|
+
return n;
|
|
14
|
+
}
|
|
15
|
+
// Longest-path depth so every read edge points strictly rightward (the read graph is a DAG).
|
|
16
|
+
function computeDepths(graph) {
|
|
17
|
+
const memo = new Map();
|
|
18
|
+
const depth = (id, seen) => {
|
|
19
|
+
if (memo.has(id))
|
|
20
|
+
return memo.get(id);
|
|
21
|
+
if (seen.has(id))
|
|
22
|
+
return 0;
|
|
23
|
+
seen.add(id);
|
|
24
|
+
const node = graph.get(id);
|
|
25
|
+
let d = 0;
|
|
26
|
+
if (node)
|
|
27
|
+
for (const dep of node.deps)
|
|
28
|
+
d = Math.max(d, depth(dep, seen) + 1);
|
|
29
|
+
seen.delete(id);
|
|
30
|
+
memo.set(id, d);
|
|
31
|
+
return d;
|
|
32
|
+
};
|
|
33
|
+
for (const node of graph.values())
|
|
34
|
+
node.depth = depth(node.id, new Set());
|
|
35
|
+
}
|
|
36
|
+
export function createGraphView(svg, options = {}) {
|
|
37
|
+
let signature = '';
|
|
38
|
+
let selected = null;
|
|
39
|
+
const nodeEls = new Map();
|
|
40
|
+
let edgeLayer = el('g', { class: 'fx-edges' });
|
|
41
|
+
let nodeLayer = el('g', { class: 'fx-nodes' });
|
|
42
|
+
svg.append(edgeLayer, nodeLayer);
|
|
43
|
+
function applySelected() {
|
|
44
|
+
for (const [id, { g }] of nodeEls)
|
|
45
|
+
g.classList.toggle('selected', id === selected);
|
|
46
|
+
}
|
|
47
|
+
function rebuild(graph) {
|
|
48
|
+
computeDepths(graph);
|
|
49
|
+
edgeLayer.remove();
|
|
50
|
+
nodeLayer.remove();
|
|
51
|
+
nodeEls.clear();
|
|
52
|
+
edgeLayer = el('g', { class: 'fx-edges' });
|
|
53
|
+
nodeLayer = el('g', { class: 'fx-nodes' });
|
|
54
|
+
const byDepth = new Map();
|
|
55
|
+
let maxDepth = 0;
|
|
56
|
+
for (const node of graph.values()) {
|
|
57
|
+
const d = node.depth ?? 0;
|
|
58
|
+
(byDepth.get(d) ?? byDepth.set(d, []).get(d)).push(node);
|
|
59
|
+
maxDepth = Math.max(maxDepth, d);
|
|
60
|
+
}
|
|
61
|
+
let maxRows = 0;
|
|
62
|
+
for (const nodes of byDepth.values())
|
|
63
|
+
maxRows = Math.max(maxRows, nodes.length);
|
|
64
|
+
const pos = new Map();
|
|
65
|
+
for (const [d, nodes] of byDepth) {
|
|
66
|
+
const top = PAD + (maxRows * ROW - nodes.length * ROW) / 2;
|
|
67
|
+
nodes.forEach((node, i) => pos.set(node.id, { x: PAD + d * COL, y: top + i * ROW }));
|
|
68
|
+
}
|
|
69
|
+
const curve = (from, to) => {
|
|
70
|
+
const x1 = from.x + NW;
|
|
71
|
+
const y1 = from.y + NH / 2;
|
|
72
|
+
const x2 = to.x;
|
|
73
|
+
const y2 = to.y + NH / 2;
|
|
74
|
+
const mx = (x1 + x2) / 2;
|
|
75
|
+
return `M ${x1} ${y1} C ${mx} ${y1}, ${mx} ${y2}, ${x2} ${y2}`;
|
|
76
|
+
};
|
|
77
|
+
for (const node of graph.values()) {
|
|
78
|
+
const to = pos.get(node.id);
|
|
79
|
+
for (const dep of node.deps) {
|
|
80
|
+
const from = pos.get(dep);
|
|
81
|
+
if (from)
|
|
82
|
+
edgeLayer.appendChild(el('path', { class: 'fx-edge', d: curve(from, to) }));
|
|
83
|
+
}
|
|
84
|
+
// write edges: this node → the signal it sets (reverse direction, dashed)
|
|
85
|
+
for (const w of node.writes) {
|
|
86
|
+
const target = pos.get(w);
|
|
87
|
+
if (target)
|
|
88
|
+
edgeLayer.appendChild(el('path', { class: 'fx-wedge', d: curve(to, target) }));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for (const node of graph.values()) {
|
|
92
|
+
const p = pos.get(node.id);
|
|
93
|
+
const g = el('g', { class: `fx-node ${KIND_CLASS[node.kind]}`, transform: `translate(${p.x} ${p.y})`, 'data-id': node.id });
|
|
94
|
+
g.appendChild(el('rect', { class: 'fx-box', width: NW, height: NH, rx: 12 }));
|
|
95
|
+
const kind = el('text', { class: 'fx-kind', x: 12, y: 20 });
|
|
96
|
+
kind.textContent = KIND_GLYPH[node.kind];
|
|
97
|
+
const label = el('text', { class: 'fx-label', x: 12, y: 38 });
|
|
98
|
+
label.textContent = node.label;
|
|
99
|
+
const value = el('text', { class: 'fx-value', x: NW - 12, y: 38, 'text-anchor': 'end' });
|
|
100
|
+
value.textContent = node.value ?? '';
|
|
101
|
+
g.append(kind, label, value);
|
|
102
|
+
g.addEventListener('click', () => {
|
|
103
|
+
selected = node.id;
|
|
104
|
+
applySelected();
|
|
105
|
+
options.onSelect?.(node);
|
|
106
|
+
});
|
|
107
|
+
g.style.cursor = 'pointer';
|
|
108
|
+
nodeLayer.appendChild(g);
|
|
109
|
+
nodeEls.set(node.id, { g, value });
|
|
110
|
+
}
|
|
111
|
+
svg.append(edgeLayer, nodeLayer);
|
|
112
|
+
svg.setAttribute('viewBox', `0 0 ${Math.max(PAD * 2 + maxDepth * COL + NW, 400)} ${Math.max(PAD * 2 + maxRows * ROW, 240)}`);
|
|
113
|
+
applySelected();
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
update(graph, now = performance.now()) {
|
|
117
|
+
let sig = '';
|
|
118
|
+
for (const n of graph.values())
|
|
119
|
+
sig += `${n.id}:${n.kind}:${[...n.deps].sort().join(',')}>${[...n.writes].sort().join(',')};`;
|
|
120
|
+
if (sig !== signature) {
|
|
121
|
+
signature = sig;
|
|
122
|
+
rebuild(graph);
|
|
123
|
+
}
|
|
124
|
+
for (const node of graph.values()) {
|
|
125
|
+
const eles = nodeEls.get(node.id);
|
|
126
|
+
if (!eles)
|
|
127
|
+
continue;
|
|
128
|
+
if (node.value !== undefined && eles.value.textContent !== node.value)
|
|
129
|
+
eles.value.textContent = node.value;
|
|
130
|
+
const age = now - node.lastPulse;
|
|
131
|
+
eles.g.style.setProperty('--pulse', (age < 600 ? 1 - age / 600 : 0).toFixed(3));
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
clear() {
|
|
135
|
+
signature = '';
|
|
136
|
+
selected = null;
|
|
137
|
+
edgeLayer.replaceChildren();
|
|
138
|
+
nodeLayer.replaceChildren();
|
|
139
|
+
nodeEls.clear();
|
|
140
|
+
options.onSelect?.(null);
|
|
141
|
+
},
|
|
142
|
+
select(id) {
|
|
143
|
+
selected = id;
|
|
144
|
+
applySelected();
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// default theme; override the fx-* classes to restyle
|
|
149
|
+
export const DEVTOOLS_CSS = `
|
|
150
|
+
.fx-edge { fill: none; stroke: #38415a; stroke-width: 1.6; opacity: .75; }
|
|
151
|
+
.fx-wedge { fill: none; stroke: #fb7185; stroke-width: 1.4; stroke-dasharray: 3 4; opacity: .65; }
|
|
152
|
+
.fx-node { color: #5eead4; filter: drop-shadow(0 0 calc(var(--pulse,0) * 13px) var(--glow, #5eead4)); }
|
|
153
|
+
.fx-node.n-state { --glow: #34d399; }
|
|
154
|
+
.fx-node.n-memo { --glow: #a78bfa; }
|
|
155
|
+
.fx-node.n-effect { --glow: #fbbf24; }
|
|
156
|
+
.fx-node.n-store { --glow: #38bdf8; }
|
|
157
|
+
.fx-node.n-resource { --glow: #fb7185; }
|
|
158
|
+
.fx-box { fill: #131722; stroke: var(--glow, #5eead4); stroke-width: 1.4; stroke-opacity: calc(.5 + var(--pulse,0) * .5); }
|
|
159
|
+
.fx-node.selected .fx-box { fill: #1a2230; stroke-width: 2.4; }
|
|
160
|
+
.fx-kind { fill: var(--glow, #5eead4); font-family: ui-monospace, monospace; font-size: 9.5px; opacity: .85; }
|
|
161
|
+
.fx-label { fill: #e7e9ee; font-family: ui-sans-serif, system-ui, sans-serif; font-size: 13px; font-weight: 600; }
|
|
162
|
+
.fx-value { fill: #8a90a2; font-family: ui-monospace, monospace; font-size: 12px; }
|
|
163
|
+
.fx-node.n-effect .fx-value { fill: #fbbf24; }
|
|
164
|
+
.fx-node.n-resource .fx-value { fill: #fb7185; }
|
|
165
|
+
`;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createReactor, nodeVersion, nodeState } from './instrument.js';
|
|
2
|
+
export type { Reactor, ReactorApi, RNode, NodeKind, NodeState } from './instrument.js';
|
|
3
|
+
export { createGraphView, DEVTOOLS_CSS } from './graph-view.js';
|
|
4
|
+
export type { GraphView, GraphViewOptions } from './graph-view.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAChE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// @fluixi/devtools — live inspector for the Fluixi reactive graph.
|
|
2
|
+
// Instrumented signal/memo/effect register into a graph; createGraphView renders + animates the
|
|
3
|
+
// State → Memo → Effect propagation.
|
|
4
|
+
//
|
|
5
|
+
// import { createReactor, createGraphView } from '@fluixi/devtools';
|
|
6
|
+
//
|
|
7
|
+
// const reactor = createReactor();
|
|
8
|
+
// reactor.run(({ createSignal, createMemo, createEffect }) => {
|
|
9
|
+
// const [count, setCount] = createSignal(0, { name: 'count' });
|
|
10
|
+
// const double = createMemo(() => count() * 2, { name: 'double' });
|
|
11
|
+
// createEffect(() => console.log(double()), { name: 'log' });
|
|
12
|
+
// setInterval(() => setCount((n) => n + 1), 1000);
|
|
13
|
+
// });
|
|
14
|
+
//
|
|
15
|
+
// const view = createGraphView(svgEl);
|
|
16
|
+
// const tick = () => { reactor.sample(); view.update(reactor.graph); requestAnimationFrame(tick); };
|
|
17
|
+
// tick();
|
|
18
|
+
export { createReactor, nodeVersion, nodeState } from './instrument.js';
|
|
19
|
+
export { createGraphView, DEVTOOLS_CSS } from './graph-view.js';
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type NodeKind = 'state' | 'memo' | 'effect' | 'store' | 'resource';
|
|
2
|
+
export type NodeState = 'clean' | 'check' | 'dirty';
|
|
3
|
+
export interface RNode {
|
|
4
|
+
id: number;
|
|
5
|
+
label: string;
|
|
6
|
+
kind: NodeKind;
|
|
7
|
+
/** Source ids read on the last run (read edges: source → this). */
|
|
8
|
+
deps: Set<number>;
|
|
9
|
+
/** Signal ids written while this node ran (write edges: this → signal). */
|
|
10
|
+
writes: Set<number>;
|
|
11
|
+
/** Untracked snapshot reader (state / memo / resource). */
|
|
12
|
+
read?: () => unknown;
|
|
13
|
+
/** Last serialized value, for change detection / display. */
|
|
14
|
+
value?: string;
|
|
15
|
+
/** Times this node recomputed / re-ran. */
|
|
16
|
+
runs: number;
|
|
17
|
+
/** performance.now() of the last change — drives the flash. */
|
|
18
|
+
lastPulse: number;
|
|
19
|
+
/** Live core node, when reachable — gives the real version + state. */
|
|
20
|
+
core?: {
|
|
21
|
+
version?: number;
|
|
22
|
+
state?: number;
|
|
23
|
+
} | null;
|
|
24
|
+
/** Resource only. */
|
|
25
|
+
loading?: boolean;
|
|
26
|
+
depth?: number;
|
|
27
|
+
}
|
|
28
|
+
/** The real version (signals/memos) or recompute count fallback. */
|
|
29
|
+
export declare function nodeVersion(n: RNode): number;
|
|
30
|
+
/** The real CLEAN/CHECK/DIRTY state when the core node is reachable (memos), else undefined. */
|
|
31
|
+
export declare function nodeState(n: RNode): NodeState | undefined;
|
|
32
|
+
export interface ReactorApi {
|
|
33
|
+
createSignal<T>(value: T, options?: {
|
|
34
|
+
name?: string;
|
|
35
|
+
equals?: false | ((a: T, b: T) => boolean);
|
|
36
|
+
}): [() => T, (v: T | ((prev: T) => T)) => T];
|
|
37
|
+
createMemo<T>(fn: () => T, options?: {
|
|
38
|
+
name?: string;
|
|
39
|
+
}): () => T;
|
|
40
|
+
createEffect(fn: () => void, options?: {
|
|
41
|
+
name?: string;
|
|
42
|
+
}): void;
|
|
43
|
+
createStore<T extends object>(initial: T, options?: {
|
|
44
|
+
name?: string;
|
|
45
|
+
immutable?: boolean;
|
|
46
|
+
}): [T, (...args: unknown[]) => void];
|
|
47
|
+
createResource(...args: unknown[]): [((() => unknown) & Record<string, unknown>), unknown];
|
|
48
|
+
}
|
|
49
|
+
export interface Reactor {
|
|
50
|
+
readonly graph: Map<number, RNode>;
|
|
51
|
+
run(setup: (api: ReactorApi) => void): void;
|
|
52
|
+
sample(): number[];
|
|
53
|
+
dispose(): void;
|
|
54
|
+
}
|
|
55
|
+
export declare function createReactor(): Reactor;
|
|
56
|
+
//# sourceMappingURL=instrument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAC1E,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,mEAAmE;IACnE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,2EAA2E;IAC3E,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC;IACrB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnD,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAE5C;AACD,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAEzD;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,CAAA;KAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9I,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,CAAC;IACjE,YAAY,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChE,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;IAC/H,cAAc,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;CAC5F;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5C,MAAM,IAAI,MAAM,EAAE,CAAC;IACnB,OAAO,IAAI,IAAI,CAAC;CACjB;AAeD,wBAAgB,aAAa,IAAI,OAAO,CAqLvC"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// Instrumentation over the real @fluixi/reactive primitives.
|
|
2
|
+
// signal/memo/effect/store/resource behave like the core ones but register each node + each read
|
|
3
|
+
// into a graph. A read is a subscription, so edges come from real reads; writes (setX) made inside
|
|
4
|
+
// a consumer become write edges. Nodes carry the live core node so the inspector reads the real
|
|
5
|
+
// version + CLEAN/CHECK/DIRTY state, and onCleanup removes a node when its owner disposes.
|
|
6
|
+
import { createSignal, createMemo, createEffect, createResource, createRoot, untrack, onCleanup, Signal, } from '@fluixi/reactive/signal';
|
|
7
|
+
import { createStore } from '@fluixi/reactive/store';
|
|
8
|
+
const $NODE = Symbol.for('signal-node');
|
|
9
|
+
const CORE_STATE = { 0: 'clean', 1: 'check', 2: 'dirty' };
|
|
10
|
+
/** The real version (signals/memos) or recompute count fallback. */
|
|
11
|
+
export function nodeVersion(n) {
|
|
12
|
+
return n.core && typeof n.core.version === 'number' ? n.core.version : n.runs;
|
|
13
|
+
}
|
|
14
|
+
/** The real CLEAN/CHECK/DIRTY state when the core node is reachable (memos), else undefined. */
|
|
15
|
+
export function nodeState(n) {
|
|
16
|
+
return n.core && typeof n.core.state === 'number' ? CORE_STATE[n.core.state] : undefined;
|
|
17
|
+
}
|
|
18
|
+
const fmt = (v) => {
|
|
19
|
+
try {
|
|
20
|
+
if (typeof v === 'string')
|
|
21
|
+
return JSON.stringify(v);
|
|
22
|
+
if (typeof v === 'function')
|
|
23
|
+
return 'ƒ';
|
|
24
|
+
if (typeof v === 'bigint')
|
|
25
|
+
return `${v}n`;
|
|
26
|
+
if (typeof v === 'object' && v)
|
|
27
|
+
return JSON.stringify(v);
|
|
28
|
+
return String(v);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return '?';
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const short = (s, n = 18) => (s.length > n ? s.slice(0, n - 1) + '…' : s);
|
|
35
|
+
export function createReactor() {
|
|
36
|
+
const graph = new Map();
|
|
37
|
+
const consumerStack = [];
|
|
38
|
+
let seq = 0;
|
|
39
|
+
let dispose = () => { };
|
|
40
|
+
const recordRead = (sourceId) => {
|
|
41
|
+
const c = consumerStack[consumerStack.length - 1];
|
|
42
|
+
if (c != null)
|
|
43
|
+
graph.get(c)?.deps.add(sourceId);
|
|
44
|
+
};
|
|
45
|
+
const recordWrite = (targetId) => {
|
|
46
|
+
const c = consumerStack[consumerStack.length - 1];
|
|
47
|
+
if (c != null && c !== targetId)
|
|
48
|
+
graph.get(c)?.writes.add(targetId);
|
|
49
|
+
};
|
|
50
|
+
const base = (id, label, kind) => ({
|
|
51
|
+
id,
|
|
52
|
+
label,
|
|
53
|
+
kind,
|
|
54
|
+
deps: new Set(),
|
|
55
|
+
writes: new Set(),
|
|
56
|
+
runs: 0,
|
|
57
|
+
lastPulse: 0,
|
|
58
|
+
});
|
|
59
|
+
const trackedCreateSignal = (value, options) => {
|
|
60
|
+
const id = seq++;
|
|
61
|
+
const [get, set] = createSignal(value, options);
|
|
62
|
+
const node = base(id, options?.name ?? `s${id}`, 'state');
|
|
63
|
+
node.read = () => untrack(get);
|
|
64
|
+
node.value = short(fmt(value));
|
|
65
|
+
node.core = get[$NODE] ?? null;
|
|
66
|
+
graph.set(id, node);
|
|
67
|
+
onCleanup(() => graph.delete(id));
|
|
68
|
+
const read = () => {
|
|
69
|
+
recordRead(id);
|
|
70
|
+
return get();
|
|
71
|
+
};
|
|
72
|
+
const write = (v) => {
|
|
73
|
+
recordWrite(id);
|
|
74
|
+
return set((typeof v === 'function' ? v(untrack(get)) : v));
|
|
75
|
+
};
|
|
76
|
+
return [read, write];
|
|
77
|
+
};
|
|
78
|
+
const trackedCreateMemo = (fn, options) => {
|
|
79
|
+
const id = seq++;
|
|
80
|
+
const node = base(id, options?.name ?? `m${id}`, 'memo');
|
|
81
|
+
graph.set(id, node);
|
|
82
|
+
onCleanup(() => graph.delete(id));
|
|
83
|
+
const m = createMemo(() => {
|
|
84
|
+
node.core ??= Signal.subtle.currentComputed(); // capture the live Computed
|
|
85
|
+
node.deps.clear();
|
|
86
|
+
node.writes.clear();
|
|
87
|
+
node.runs++;
|
|
88
|
+
consumerStack.push(id);
|
|
89
|
+
try {
|
|
90
|
+
return fn();
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
consumerStack.pop();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
node.read = () => untrack(m);
|
|
97
|
+
return () => {
|
|
98
|
+
recordRead(id);
|
|
99
|
+
return m();
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
const trackedCreateEffect = (fn, options) => {
|
|
103
|
+
const id = seq++;
|
|
104
|
+
const node = base(id, options?.name ?? `e${id}`, 'effect');
|
|
105
|
+
graph.set(id, node);
|
|
106
|
+
onCleanup(() => graph.delete(id));
|
|
107
|
+
createEffect(() => {
|
|
108
|
+
node.core ??= Signal.subtle.currentComputed();
|
|
109
|
+
node.deps.clear();
|
|
110
|
+
node.writes.clear();
|
|
111
|
+
node.runs++;
|
|
112
|
+
node.lastPulse = performance.now();
|
|
113
|
+
consumerStack.push(id);
|
|
114
|
+
try {
|
|
115
|
+
fn();
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
consumerStack.pop();
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
const trackedCreateStore = (initial, options) => {
|
|
123
|
+
const id = seq++;
|
|
124
|
+
const [proxy, setter] = createStore(initial, { immutable: true, ...options });
|
|
125
|
+
const node = base(id, options?.name ?? `store${id}`, 'store');
|
|
126
|
+
node.read = () => {
|
|
127
|
+
try {
|
|
128
|
+
return untrack(() => JSON.stringify(proxy));
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return '{…}';
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
node.value = '{…}';
|
|
135
|
+
graph.set(id, node);
|
|
136
|
+
onCleanup(() => graph.delete(id));
|
|
137
|
+
const recording = new Proxy(proxy, {
|
|
138
|
+
get(t, p, r) {
|
|
139
|
+
recordRead(id);
|
|
140
|
+
return Reflect.get(t, p, r);
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
const write = (...args) => {
|
|
144
|
+
recordWrite(id);
|
|
145
|
+
return setter(...args);
|
|
146
|
+
};
|
|
147
|
+
return [recording, write];
|
|
148
|
+
};
|
|
149
|
+
const trackedCreateResource = (...args) => {
|
|
150
|
+
const id = seq++;
|
|
151
|
+
const last = args[args.length - 1];
|
|
152
|
+
const name = last && typeof last === 'object' && !Array.isArray(last) && typeof last !== 'function' ? last.name : undefined;
|
|
153
|
+
const node = base(id, name ?? `res${id}`, 'resource');
|
|
154
|
+
const [data, actions] = createResource(...args);
|
|
155
|
+
node.read = () => {
|
|
156
|
+
try {
|
|
157
|
+
return untrack(() => (data.loading ? '⏳ loading' : JSON.stringify(data.latest)));
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return '?';
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
node.value = '⏳ loading';
|
|
164
|
+
graph.set(id, node);
|
|
165
|
+
onCleanup(() => graph.delete(id));
|
|
166
|
+
const accessor = (() => {
|
|
167
|
+
recordRead(id);
|
|
168
|
+
return data();
|
|
169
|
+
});
|
|
170
|
+
for (const k of ['loading', 'error', 'latest', 'state']) {
|
|
171
|
+
Object.defineProperty(accessor, k, { get: () => data[k] });
|
|
172
|
+
}
|
|
173
|
+
return [accessor, actions];
|
|
174
|
+
};
|
|
175
|
+
const api = {
|
|
176
|
+
createSignal: trackedCreateSignal,
|
|
177
|
+
createMemo: trackedCreateMemo,
|
|
178
|
+
createEffect: trackedCreateEffect,
|
|
179
|
+
createStore: trackedCreateStore,
|
|
180
|
+
createResource: trackedCreateResource,
|
|
181
|
+
};
|
|
182
|
+
return {
|
|
183
|
+
graph,
|
|
184
|
+
run(setup) {
|
|
185
|
+
dispose();
|
|
186
|
+
graph.clear();
|
|
187
|
+
seq = 0;
|
|
188
|
+
consumerStack.length = 0;
|
|
189
|
+
createRoot((d) => {
|
|
190
|
+
dispose = d;
|
|
191
|
+
setup(api);
|
|
192
|
+
});
|
|
193
|
+
},
|
|
194
|
+
sample() {
|
|
195
|
+
const changed = [];
|
|
196
|
+
const now = performance.now();
|
|
197
|
+
for (const node of graph.values()) {
|
|
198
|
+
if (!node.read)
|
|
199
|
+
continue;
|
|
200
|
+
const next = short(fmt(node.read()));
|
|
201
|
+
if (next !== node.value) {
|
|
202
|
+
node.value = next;
|
|
203
|
+
node.runs++;
|
|
204
|
+
node.lastPulse = now;
|
|
205
|
+
changed.push(node.id);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return changed;
|
|
209
|
+
},
|
|
210
|
+
dispose() {
|
|
211
|
+
dispose();
|
|
212
|
+
dispose = () => { };
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.d.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/modules/index.d.ts","../../reactive/dist/lib/observable/types.d.ts","../../reactive/dist/lib/observable/subscription.d.ts","../../reactive/dist/lib/observable/observable.d.ts","../../reactive/dist/lib/signal/graph/detect.d.ts","../../reactive/dist/lib/signal/graph/derived.d.ts","../../reactive/dist/lib/signal/graph/runtime.d.ts","../../reactive/dist/lib/signal/graph/compat.d.ts","../../reactive/dist/lib/signal/graph/children.d.ts","../../reactive/dist/lib/signal/graph/ssr-hooks.d.ts","../../reactive/dist/lib/signal/signal.d.ts","../../reactive/dist/lib/signal/list.d.ts","../../reactive/dist/lib/signal/graph/resource.d.ts","../../reactive/dist/lib/signal/graph/suspense.d.ts","../../reactive/dist/lib/signal/graph/error-boundary.d.ts","../../reactive/dist/lib/signal/graph/core.d.ts","../../reactive/dist/lib/signal/graph/index.d.ts","../../reactive/dist/lib/signal/graph/signal-next.d.ts","../../reactive/dist/lib/signal/index.d.ts","../../utils/dist/lib/maths/types/basic.d.ts","../../utils/dist/lib/maths/types/advanced.d.ts","../../utils/dist/lib/maths/types/negative.d.ts","../../utils/dist/lib/maths/types/operations.d.ts","../../utils/dist/lib/maths/types/index.d.ts","../../utils/dist/lib/maths/constants.d.ts","../../utils/dist/lib/maths/guards.d.ts","../../utils/dist/lib/maths/fn/basic.d.ts","../../utils/dist/lib/maths/fn/advanced.d.ts","../../utils/dist/lib/maths/fn/vector.d.ts","../../utils/dist/lib/maths/fn/complex.d.ts","../../utils/dist/lib/maths/fn/trigo.d.ts","../../utils/dist/lib/maths/fn/index.d.ts","../../utils/dist/lib/maths/formatter.d.ts","../../utils/dist/lib/maths/random.d.ts","../../utils/dist/lib/maths/parser.d.ts","../../utils/dist/lib/maths/index.d.ts","../../utils/dist/lib/primitive/string/string.d.ts","../../utils/dist/lib/primitive/string/types.d.ts","../../utils/dist/lib/primitive/string/index.d.ts","../../utils/dist/lib/primitive/boolean/types.d.ts","../../utils/dist/lib/primitive/boolean/boolean.d.ts","../../utils/dist/lib/primitive/boolean/index.d.ts","../../utils/dist/lib/primitive/date/types.d.ts","../../utils/dist/lib/primitive/date/date.d.ts","../../utils/dist/lib/primitive/date/index.d.ts","../../utils/dist/lib/primitive/types.d.ts","../../utils/dist/lib/primitive/index.d.ts","../../utils/dist/lib/object/types.d.ts","../../utils/dist/lib/object/object.d.ts","../../utils/dist/lib/object/diff.d.ts","../../utils/dist/lib/object/selector.d.ts","../../utils/dist/lib/object/merge.d.ts","../../utils/dist/lib/object/clone.d.ts","../../utils/dist/lib/object/getter-setter.d.ts","../../utils/dist/lib/object/omit.d.ts","../../utils/dist/lib/object/transform.d.ts","../../utils/dist/lib/object/reconcile.d.ts","../../utils/dist/lib/object/sort.d.ts","../../utils/dist/lib/object/utils.d.ts","../../utils/dist/lib/object/index.d.ts","../../reactive/dist/lib/store/setter.types.d.ts","../../reactive/dist/lib/store/types.d.ts","../../reactive/dist/lib/store/store.d.ts","../../reactive/dist/lib/store/utils.d.ts","../../reactive/dist/lib/store/index.d.ts","../src/instrument.ts","../src/graph-view.ts","../src/index.ts"],"fileIdsList":[[53],[54,119],[54,119,120],[54,72,118],[56],[55],[61],[60],[64],[69],[58,59,60,61,62,63,64,65,66,67,68,70],[71],[57,58,59,62,63],[115,116,117],[113],[57,72,114,115],[115],[74],[73],[80,81,82,83,84],[77],[77,78,79,85,86,87,88],[73,74,76],[73,75],[101],[101,102,103,104,105,106,107,108,109,110,111,112],[89,100],[100,101],[93],[93,94],[96],[96,97],[92,95,98,99],[90,91]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"b8f34dd1757f68e03262b1ca3ddfa668a855b872f8bdd5224d6f993a7b37dc2c","impliedFormat":99},{"version":"e592cf1b998ce8043e72ca38e2f40c5631e65e937e3102223f7086140bf979a3","impliedFormat":99},{"version":"0ceea501c52cdf869e3562ea96fca2785a3394a9e1e446afb5e11092ad2dc7fc","impliedFormat":99},{"version":"ebe92631232ee90bd0cd2668b349a8ecf869a42f94aa5a80505aaf7833be6819","impliedFormat":99},{"version":"892323d83df6c419a9f961e7156e70184b4a27638de72f7b92931ab3c165298e","impliedFormat":99},{"version":"ed51ea7ddcddfe0523b5a8d3112c55f8494f3f419ad6b830a1aac7dfe499a8ab","impliedFormat":99},{"version":"f930ceeb25ec3a15c78ff12771c202a67164e232a5b588635c89603c6c961928","impliedFormat":99},{"version":"96e415a91946f00ac400e74dfeb26b575aade405169df35621a822e6b4d5abf0","impliedFormat":99},{"version":"e8be3e24c3b98c301590ee0fefc462accc9a0f1fa674f62a3b63be9786ef9a99","impliedFormat":99},{"version":"e08f70018aeffb92654e466522e4b194b712da2091b20bdb0922c8441f2a43b7","impliedFormat":99},{"version":"97b4ab5a8db570e67a3a764a456486d97b8808b658e0e0a3eb9e38b63270d086","impliedFormat":99},{"version":"1f33d92b487c119aee6f7cf04ac95c0dab317c228b388fead9d7d87540f8adf7","impliedFormat":99},{"version":"e972de4985925f07d08dfb7eb73a400506f75b3596cac60591fab948eade26b7","impliedFormat":99},{"version":"c03135439ad665f4a011a75586bf96098f6fe0b0716e78afc8cdf651bcc8f879","impliedFormat":99},{"version":"290111961dc134d534be036cd591c09a0e65ceed2fcf9aa9666ae2bcdac7034f","impliedFormat":99},{"version":"ac292cffbb31f9c76b09f7b0c630cfc2b9c7e5070dfc4472cfc60023ec447bd2","impliedFormat":99},{"version":"ac23329299d15c989ebe7e62bb1858a58de39aa3cd4fb1265e93ddc6d9631b07","impliedFormat":99},{"version":"16b49126ba492eb0b4abc93a518addf8ca7e850bed2fc56c111ffa768d23113e","impliedFormat":99},{"version":"1122b4ca26147813c76ac7a2f38911854cb2bd5cf0af003f578175f3db1c3aee","impliedFormat":99},{"version":"631287e5e4a8a6ff2348789b7d2d00944c0f09ff3fed60cc3642323a1ff0ed4a","impliedFormat":99},{"version":"4f24eafbd6e05dd55f4597c6d286171fbe5066785625c482ab5c5cbba2fc7487","impliedFormat":99},{"version":"e9ad8fb60df94fd4f929f944a12d496271d6523e69d5ad4de20fc080a0a30711","impliedFormat":99},{"version":"a928f91a183425984c472e4d2763f7649e8d63c92c74a2fa59482ad8905bc664","impliedFormat":99},{"version":"c323e45a420e39e384e86db3e4470969016e8f507e04a9ceff1f073d8e5efeff","impliedFormat":99},{"version":"120b522225d94dea3356d056952f0ca9c626a4643a7734fbff1b031f16a0cb65","impliedFormat":99},{"version":"52a743346fe3f9758188a0ba974989e2ec948d8bb145539b6b6d6058204f2612","impliedFormat":99},{"version":"b19bb5d1b4f1ed34aad8e57dc096f7f333dc2fccb0a86633b9c8405c4797b190","impliedFormat":99},{"version":"fde9c3aaca2fb4f489fe2c25d3d0a5d56c145272cf92c6fd1f39f41589d9d0b1","impliedFormat":99},{"version":"2289a9520455d5a74bff1f23ddf0bee2593baedb8b9cda9c3e8720ca66338f65","impliedFormat":99},{"version":"1ff7de3d6cb03553a07592092fcd7a0ed61a88c6be9f5344239ac247be712cfd","impliedFormat":99},{"version":"b071dcadeb17235e2a1116231ca370bac5c97ec090fc73b3736791cb0a2aa91d","impliedFormat":99},{"version":"b4ed0f4d07ca274437eb9d49400de8c81659760e59507f08b94442873eb49a25","impliedFormat":99},{"version":"88978beb444b1d65c0f48d1099717d2a935ce74d9e3e1411bcaa1fe497910ab6","impliedFormat":99},{"version":"712fdf289306e77c2c097843e29560d99ff83bd336da277498ea18ca8cd999f0","impliedFormat":99},{"version":"ceb05e55219637c8dcb77490777c52e537363adc0a060af39cc95d46310f2128","impliedFormat":99},{"version":"a1b05ca68a811afb49605cf1346a53efadc4ec6269caf9e19d97bee4543f1479","impliedFormat":99},{"version":"4e454ae8246e2b13c51c12adaccda8d0fe8e36e120d4e5bbc554021244240fdb","impliedFormat":99},{"version":"4edc87837b7285fe2141b92b492ecc6428a5fc152d7d013af9d0e7017e78befa","impliedFormat":99},{"version":"20e3c2b6bfdfbde9073c6309992943094ab954bd50954c2561daa4d377c78bbc","impliedFormat":99},{"version":"de969e2fcf0e6bfe70c844762f81e47e713dfdf3f1b8ed89378ff3865e78f16d","impliedFormat":99},{"version":"7349d52ef2d997de63d4298417883a9ae8d94ad2d6b0a1ad4a11971fbf01ec3d","impliedFormat":99},{"version":"1673bc6ee9b15e4bc9e4de777b1497bd1ec544d6939061ce7a25de9a0c09565d","impliedFormat":99},{"version":"73eae9a32499f88a8c73cedd49a43ecf441116bb55c7a150f346e333b35c687b","impliedFormat":99},{"version":"9b1c12fce85d708544c70e12e0d8ca6c4a9b27690a27448577b9f4053c49908d","impliedFormat":99},{"version":"68e1a72149e6384295c078bdb945bc3238afcaeb850be14f3ba0571661addf82","impliedFormat":99},{"version":"abc4efc89e29e107946fd0a40b96c4c862d4d340c4c26dd7647183568c3e33c3","impliedFormat":99},{"version":"e1cb7303d3d49535d39fac5d8ded4b5e5e430526eb8a44411cfec3694eae6223","impliedFormat":99},{"version":"1fb68873fd2a769163972685c0516cb3f88fcedd57409f285dfe7c71be13cbbd","impliedFormat":99},{"version":"6685db351c23e0cb6cec2426ea1680a41d29c1633d722c7d7621207c55f6491e","impliedFormat":99},{"version":"cc74864af16373ee02499f7e65758f13f903d37aa1e13e7ad5598facc70dc274","impliedFormat":99},{"version":"71830cf6fc186afa64f4d6d015eed23c78a3af68bd8dc770ffa4d5cee77744b3","impliedFormat":99},{"version":"72ff78881cb1d71790e047eba022ce05845b7dd05e94ba64267dc478ce1457f1","impliedFormat":99},{"version":"fdf1008f43e52d69c62571db0aaa782604dca7e7c2206825a9f46ada5154b610","impliedFormat":99},{"version":"9b3b063cf484aa4088728e28f73f98c7b8fa267debd6f289acec4d70f5977253","impliedFormat":99},{"version":"fe21672b2e8f8ad092ba5ca8ecc4c83f3952dd5144e459f1f001dfdac2f9e7a5","impliedFormat":99},{"version":"95b067197bb5c2f7ca7ee0ede9be77c4724aa09687b75d6e8cacf0904ff565f9","impliedFormat":99},{"version":"3ab7a86cdb01a3f6d3845a82add1feee0ec6b0620fde0224ada4ab929f459b61","impliedFormat":99},{"version":"0c40740c1cb8ae5f8a74182579c5a392f7e0ce20826d1a4907417e6929e20666","impliedFormat":99},{"version":"ea7a689828afde6f1565f81d9a675c48daa0b91c36020aaeef7193b8769cccf9","impliedFormat":99},{"version":"4c362ca187c7fc9d6a986d33da9966cac1738dc14f8da9f1315b0703214f7be5","impliedFormat":99},{"version":"45d0b9f6985725909f26094b518f6e5017ecc9fff784fb71792addb7c90c70bf","impliedFormat":99},{"version":"62512a36ef5e3ed8dca2f7ac0800e2d3bd461025c7b4ae5539cd871258dcd00c","impliedFormat":99},{"version":"f431bb373494e78c5e01546c80fc41921ca9b24386c388da802a2afbe9705392","impliedFormat":99},{"version":"07a2317b33ba403c06f14a9c8cf0ed93a83d85d22ffc64cab4452327a1e08e24","impliedFormat":99},{"version":"415f940ff9853f2e98ac9864385e88ac819ae9dda1a1ca69c8cdb170054b2820","impliedFormat":99},{"version":"a66b2998d14ea61f7d2fb99799b6087c107b855811b4beb98109a53269e7d0ce","signature":"318d73ba663e8e3de1a97ee1b0a201fd8c38888528a6bf86f716138a8f997fca","impliedFormat":99},{"version":"5e55a644605cf2d6be0474fe1a09d42ae4fbd9fbf7798696de3e352e58c0ea63","signature":"ec2e6c39957e447a64c083517935cb8447b5e9ef6d84fa24d9f98e2b1a67aae4","impliedFormat":99},{"version":"4ed996276ad33f6f200c2b92bc0efbb1ea5953d4078d8855940825a383b20dc9","signature":"0e995a4715125d5625973511c7c614af81cd3fe2cf58e888f70c3986398107d4","impliedFormat":99}],"root":[[119,121]],"options":{"composite":true,"declarationMap":true,"emitDeclarationOnly":false,"importHelpers":true,"module":199,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUnusedLocals":false,"noUnusedParameters":false,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./tsconfig.lib.tsbuildinfo"},"referencedMap":[[54,1],[120,2],[121,3],[119,4],[57,5],[56,6],[55,5],[62,7],[61,8],[59,9],[58,9],[68,8],[70,10],[71,11],[67,8],[72,12],[65,7],[64,13],[118,14],[114,15],[116,16],[117,17],[81,18],[80,19],[83,18],[85,20],[84,19],[82,18],[79,21],[89,22],[74,19],[77,23],[76,24],[103,25],[107,25],[113,26],[105,25],[102,25],[108,25],[104,25],[111,25],[109,25],[101,27],[112,28],[94,29],[95,30],[97,31],[98,32],[100,33],[92,34]],"latestChangedDtsFile":"./index.d.ts","version":"5.8.3"}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fluixi/devtools",
|
|
3
|
+
"version": "0.2.0-alpha.1",
|
|
4
|
+
"description": "Live inspector for the Fluixi reactive graph — instrument signals/memos/effects and visualize propagation.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
"./package.json": "./package.json",
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"registry": "https://registry.npmjs.org/",
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@fluixi/reactive": "1.0.0-alpha.53"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc -p tsconfig.lib.json",
|
|
28
|
+
"test": "vitest run"
|
|
29
|
+
}
|
|
30
|
+
}
|