@fluixi/devtools 0.2.0-alpha.2 → 0.2.0-alpha.3
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/README.md +80 -2
- package/dist/callsite.d.ts +22 -0
- package/dist/callsite.d.ts.map +1 -0
- package/dist/callsite.js +82 -0
- package/dist/change-view.d.ts +10 -0
- package/dist/change-view.d.ts.map +1 -0
- package/dist/change-view.js +102 -0
- package/dist/copy.d.ts +9 -0
- package/dist/copy.d.ts.map +1 -0
- package/dist/copy.js +52 -0
- package/dist/describe.d.ts +3 -0
- package/dist/describe.d.ts.map +1 -0
- package/dist/describe.js +47 -0
- package/dist/detail-panel.d.ts +17 -0
- package/dist/detail-panel.d.ts.map +1 -0
- package/dist/detail-panel.js +217 -0
- package/dist/diff.d.ts +31 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +132 -0
- package/dist/dom.d.ts +81 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +269 -0
- package/dist/export.d.ts +55 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +90 -0
- package/dist/float.d.ts +54 -0
- package/dist/float.d.ts.map +1 -0
- package/dist/float.js +256 -0
- package/dist/format.d.ts +16 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +188 -0
- package/dist/graph-view.d.ts +79 -2
- package/dist/graph-view.d.ts.map +1 -1
- package/dist/graph-view.js +866 -50
- package/dist/highlight.d.ts +56 -0
- package/dist/highlight.d.ts.map +1 -0
- package/dist/highlight.js +154 -0
- package/dist/history.d.ts +59 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +85 -0
- package/dist/hook.d.ts +60 -0
- package/dist/hook.d.ts.map +1 -0
- package/dist/hook.js +142 -0
- package/dist/index.d.ts +44 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -1
- package/dist/inspector.d.ts +60 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/inspector.js +415 -0
- package/dist/instrument.d.ts +147 -5
- package/dist/instrument.d.ts.map +1 -1
- package/dist/instrument.js +164 -44
- package/dist/kind-filter.d.ts +39 -0
- package/dist/kind-filter.d.ts.map +1 -0
- package/dist/kind-filter.js +151 -0
- package/dist/menu.d.ts +37 -0
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +125 -0
- package/dist/observe.d.ts +80 -0
- package/dist/observe.d.ts.map +1 -0
- package/dist/observe.js +893 -0
- package/dist/palette.d.ts +11 -0
- package/dist/palette.d.ts.map +1 -0
- package/dist/palette.js +27 -0
- package/dist/path.d.ts +19 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +49 -0
- package/dist/plugin.d.ts +121 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +74 -0
- package/dist/plugins/context.d.ts +10 -0
- package/dist/plugins/context.d.ts.map +1 -0
- package/dist/plugins/context.js +80 -0
- package/dist/plugins/directives.d.ts +25 -0
- package/dist/plugins/directives.d.ts.map +1 -0
- package/dist/plugins/directives.js +78 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +9 -0
- package/dist/source.d.ts +72 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +153 -0
- package/dist/timeline.d.ts +30 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +271 -0
- package/dist/tree.d.ts +128 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +645 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/value-pane.d.ts +10 -0
- package/dist/value-pane.d.ts.map +1 -0
- package/dist/value-pane.js +61 -0
- package/dist/wire.d.ts +100 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +93 -0
- package/package.json +7 -2
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Showing where something is on the page.
|
|
3
|
+
*
|
|
4
|
+
* Two things use this. Hovering a node in a panel draws a box round what it writes into, and
|
|
5
|
+
* picking works the other way: move over the page and the box follows whatever is under the
|
|
6
|
+
* pointer, until a click says which one.
|
|
7
|
+
*
|
|
8
|
+
* The overlay is not part of the application: it sits in its own fixed layer, takes no
|
|
9
|
+
* pointer events, and is torn down with `stop`. Nothing it holds outlives a call.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Draw over everything `target` covers.
|
|
13
|
+
*
|
|
14
|
+
* A box each, rather than one around the lot: a component's regions are usually not
|
|
15
|
+
* adjacent, and a rectangle spanning them covers plenty it has nothing to do with. The
|
|
16
|
+
* label sits above the topmost.
|
|
17
|
+
*
|
|
18
|
+
* Called repeatedly while a pointer moves, so the boxes are reused rather than remade.
|
|
19
|
+
*/
|
|
20
|
+
export declare function showHighlight(target: Element | readonly Element[], text?: string): void;
|
|
21
|
+
export declare function hideHighlight(): void;
|
|
22
|
+
/** Take the overlay off the page. Safe to call when there is none. */
|
|
23
|
+
export declare function removeHighlight(): void;
|
|
24
|
+
export interface PickOptions {
|
|
25
|
+
/** The node under the pointer, for the box's label and for what a click reports. */
|
|
26
|
+
nodeAt: (element: Element | null) => number | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* What the box is labelled. The element comes too, because the owning tag alone reads
|
|
29
|
+
* `App` over every heading and input that component wrote.
|
|
30
|
+
*/
|
|
31
|
+
describe?: (id: number, element: Element) => string;
|
|
32
|
+
/**
|
|
33
|
+
* A click on something the graph knows. Picking stops first unless `sticky`.
|
|
34
|
+
*
|
|
35
|
+
* The element comes too: the owning tag alone is too coarse to be useful, since every
|
|
36
|
+
* `<h3>` and `<input>` a component wrote answers with that component.
|
|
37
|
+
*/
|
|
38
|
+
onPick: (id: number, element: Element | null) => void;
|
|
39
|
+
/** Picking has ended: escape, or a click on nothing when it is not sticky. */
|
|
40
|
+
onCancel?: () => void;
|
|
41
|
+
/**
|
|
42
|
+
* Stay armed after a pick, so several elements can be chosen in a row. Escape and the
|
|
43
|
+
* returned stop still end it, and a click on nothing is ignored rather than cancelling.
|
|
44
|
+
*/
|
|
45
|
+
sticky?: boolean;
|
|
46
|
+
/** Defaults to the page this module is running in. */
|
|
47
|
+
document?: Document;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Follow the pointer until something is clicked.
|
|
51
|
+
*
|
|
52
|
+
* Listeners are on the capture phase so the application never sees the click that chose an
|
|
53
|
+
* element, since picking a button should not press it. Returns a function that stops early.
|
|
54
|
+
*/
|
|
55
|
+
export declare function startPicking(options: PickOptions): () => void;
|
|
56
|
+
//# sourceMappingURL=highlight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAyCH;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,OAAO,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CA6CvF;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,sEAAsE;AACtE,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,MAAM,GAAG,SAAS,CAAC;IACxD;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IACpD;;;;;OAKG;IACH,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IACtD,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,IAAI,CAkD7D"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Showing where something is on the page.
|
|
3
|
+
*
|
|
4
|
+
* Two things use this. Hovering a node in a panel draws a box round what it writes into, and
|
|
5
|
+
* picking works the other way: move over the page and the box follows whatever is under the
|
|
6
|
+
* pointer, until a click says which one.
|
|
7
|
+
*
|
|
8
|
+
* The overlay is not part of the application: it sits in its own fixed layer, takes no
|
|
9
|
+
* pointer events, and is torn down with `stop`. Nothing it holds outlives a call.
|
|
10
|
+
*/
|
|
11
|
+
const LAYER = 'fx-highlight-layer';
|
|
12
|
+
let overlay = null;
|
|
13
|
+
function build(doc) {
|
|
14
|
+
const layer = doc.createElement('div');
|
|
15
|
+
layer.id = LAYER;
|
|
16
|
+
layer.style.cssText =
|
|
17
|
+
'position:fixed;inset:0;z-index:2147483646;pointer-events:none;contain:strict;';
|
|
18
|
+
const label = doc.createElement('div');
|
|
19
|
+
label.style.cssText =
|
|
20
|
+
'position:absolute;padding:1px 5px;border-radius:3px;background:#5eead4;color:#07131a;' +
|
|
21
|
+
"font:11px/1.5 ui-monospace,monospace;white-space:nowrap;";
|
|
22
|
+
layer.append(label);
|
|
23
|
+
doc.body.appendChild(layer);
|
|
24
|
+
return { layer, boxes: [], label };
|
|
25
|
+
}
|
|
26
|
+
function boxIn(overlay, index) {
|
|
27
|
+
const held = overlay.boxes[index];
|
|
28
|
+
if (held)
|
|
29
|
+
return held;
|
|
30
|
+
const box = overlay.layer.ownerDocument.createElement('div');
|
|
31
|
+
box.style.cssText =
|
|
32
|
+
'position:absolute;border:1px solid #5eead4;background:rgba(94,234,212,.16);' +
|
|
33
|
+
'border-radius:2px;transition:none;';
|
|
34
|
+
overlay.layer.append(box);
|
|
35
|
+
overlay.boxes.push(box);
|
|
36
|
+
return box;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Draw over everything `target` covers.
|
|
40
|
+
*
|
|
41
|
+
* A box each, rather than one around the lot: a component's regions are usually not
|
|
42
|
+
* adjacent, and a rectangle spanning them covers plenty it has nothing to do with. The
|
|
43
|
+
* label sits above the topmost.
|
|
44
|
+
*
|
|
45
|
+
* Called repeatedly while a pointer moves, so the boxes are reused rather than remade.
|
|
46
|
+
*/
|
|
47
|
+
export function showHighlight(target, text) {
|
|
48
|
+
const elements = (Array.isArray(target) ? target : [target]).filter((el) => el?.isConnected);
|
|
49
|
+
const first = elements[0];
|
|
50
|
+
const doc = first?.ownerDocument;
|
|
51
|
+
if (!doc?.body) {
|
|
52
|
+
hideHighlight();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Rebuilt when the document changed, or when the page removed the layer from under us.
|
|
56
|
+
if (!overlay || overlay.layer.ownerDocument !== doc || !overlay.layer.isConnected) {
|
|
57
|
+
overlay = build(doc);
|
|
58
|
+
}
|
|
59
|
+
const { label, layer } = overlay;
|
|
60
|
+
layer.style.display = '';
|
|
61
|
+
let top = Infinity;
|
|
62
|
+
let left = Infinity;
|
|
63
|
+
let bottom = 0;
|
|
64
|
+
elements.forEach((element, index) => {
|
|
65
|
+
const rect = element.getBoundingClientRect();
|
|
66
|
+
const box = boxIn(overlay, index);
|
|
67
|
+
box.style.display = '';
|
|
68
|
+
box.style.left = `${rect.left}px`;
|
|
69
|
+
box.style.top = `${rect.top}px`;
|
|
70
|
+
box.style.width = `${rect.width}px`;
|
|
71
|
+
box.style.height = `${rect.height}px`;
|
|
72
|
+
top = Math.min(top, rect.top);
|
|
73
|
+
left = Math.min(left, rect.left);
|
|
74
|
+
bottom = Math.max(bottom, rect.bottom);
|
|
75
|
+
});
|
|
76
|
+
// Whatever the last target needed and this one does not.
|
|
77
|
+
for (let i = elements.length; i < overlay.boxes.length; i++) {
|
|
78
|
+
overlay.boxes[i].style.display = 'none';
|
|
79
|
+
}
|
|
80
|
+
if (!text) {
|
|
81
|
+
label.style.display = 'none';
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
label.style.display = '';
|
|
85
|
+
label.textContent = text;
|
|
86
|
+
label.style.left = `${Math.max(2, left)}px`;
|
|
87
|
+
label.style.top = top >= 20 ? `${top - 18}px` : `${bottom + 4}px`;
|
|
88
|
+
}
|
|
89
|
+
export function hideHighlight() {
|
|
90
|
+
if (overlay)
|
|
91
|
+
overlay.layer.style.display = 'none';
|
|
92
|
+
}
|
|
93
|
+
/** Take the overlay off the page. Safe to call when there is none. */
|
|
94
|
+
export function removeHighlight() {
|
|
95
|
+
overlay?.layer.remove();
|
|
96
|
+
overlay = null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Follow the pointer until something is clicked.
|
|
100
|
+
*
|
|
101
|
+
* Listeners are on the capture phase so the application never sees the click that chose an
|
|
102
|
+
* element, since picking a button should not press it. Returns a function that stops early.
|
|
103
|
+
*/
|
|
104
|
+
export function startPicking(options) {
|
|
105
|
+
const doc = options.document ?? globalThis.document;
|
|
106
|
+
if (!doc?.body)
|
|
107
|
+
return () => { };
|
|
108
|
+
const was = doc.body.style.cursor;
|
|
109
|
+
doc.body.style.cursor = 'crosshair';
|
|
110
|
+
const under = (event) => {
|
|
111
|
+
const target = event.target;
|
|
112
|
+
// Inside the overlay is not a pick; it should not be hit anyway, but a page can move it.
|
|
113
|
+
return target?.closest?.(`#${LAYER}`) ? null : target;
|
|
114
|
+
};
|
|
115
|
+
const move = (event) => {
|
|
116
|
+
const element = under(event);
|
|
117
|
+
const id = options.nodeAt(element);
|
|
118
|
+
if (element && id !== undefined)
|
|
119
|
+
showHighlight(element, options.describe?.(id, element));
|
|
120
|
+
else
|
|
121
|
+
hideHighlight();
|
|
122
|
+
};
|
|
123
|
+
const click = (event) => {
|
|
124
|
+
event.preventDefault();
|
|
125
|
+
event.stopPropagation();
|
|
126
|
+
const target = under(event);
|
|
127
|
+
const id = options.nodeAt(target);
|
|
128
|
+
if (!options.sticky)
|
|
129
|
+
stop();
|
|
130
|
+
if (id !== undefined)
|
|
131
|
+
options.onPick(id, target);
|
|
132
|
+
// Only a real end reports a cancel. A sticky miss leaves the pointer armed, so saying
|
|
133
|
+
// it ended would put the toolbar out of step with the listeners still attached.
|
|
134
|
+
else if (!options.sticky)
|
|
135
|
+
options.onCancel?.();
|
|
136
|
+
};
|
|
137
|
+
const key = (event) => {
|
|
138
|
+
if (event.key !== 'Escape')
|
|
139
|
+
return;
|
|
140
|
+
stop();
|
|
141
|
+
options.onCancel?.();
|
|
142
|
+
};
|
|
143
|
+
const stop = () => {
|
|
144
|
+
doc.body.style.cursor = was;
|
|
145
|
+
doc.removeEventListener('pointermove', move, true);
|
|
146
|
+
doc.removeEventListener('click', click, true);
|
|
147
|
+
doc.removeEventListener('keydown', key, true);
|
|
148
|
+
hideHighlight();
|
|
149
|
+
};
|
|
150
|
+
doc.addEventListener('pointermove', move, true);
|
|
151
|
+
doc.addEventListener('click', click, true);
|
|
152
|
+
doc.addEventListener('keydown', key, true);
|
|
153
|
+
return stop;
|
|
154
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ValueChange } from './diff.js';
|
|
2
|
+
export type GraphEventKind = 'write' | 'ran' | 'created' | 'disposed';
|
|
3
|
+
export interface GraphEvent {
|
|
4
|
+
/** Monotonic across the session, so a consumer folding deltas never reorders them. */
|
|
5
|
+
readonly seq: number;
|
|
6
|
+
/** Producer clock, matching the snapshot's. */
|
|
7
|
+
readonly t: number;
|
|
8
|
+
readonly kind: GraphEventKind;
|
|
9
|
+
/** The node it happened to. */
|
|
10
|
+
readonly id: number;
|
|
11
|
+
/** What caused it. Absent on a write means nothing was running: an event handler did it. */
|
|
12
|
+
readonly by?: number;
|
|
13
|
+
/** One write from outside and everything it caused. Commit 0 is the first render. */
|
|
14
|
+
readonly commit: number;
|
|
15
|
+
/** Writes only: the value before and after, already formatted and short. */
|
|
16
|
+
readonly from?: string;
|
|
17
|
+
readonly to?: string;
|
|
18
|
+
/** Writes only, and only when the two sides differ structurally: which entries moved. */
|
|
19
|
+
readonly change?: ValueChange;
|
|
20
|
+
/**
|
|
21
|
+
* The name at the time. A consumer normally reads it off the graph, but a disposed node is
|
|
22
|
+
* no longer there — and a list re-render is mostly disposals — so it travels with the event.
|
|
23
|
+
*/
|
|
24
|
+
readonly label?: string;
|
|
25
|
+
}
|
|
26
|
+
/** What a write is worth recording about, beyond who did it. */
|
|
27
|
+
export interface WriteDetail {
|
|
28
|
+
from?: string;
|
|
29
|
+
to?: string;
|
|
30
|
+
change?: ValueChange;
|
|
31
|
+
label?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface History {
|
|
34
|
+
wrote(id: number, by: number | undefined, detail?: WriteDetail): void;
|
|
35
|
+
ran(id: number, by?: number): void;
|
|
36
|
+
created(id: number, by?: number, label?: string): void;
|
|
37
|
+
disposed(id: number, label?: string): void;
|
|
38
|
+
/** Everything since the last call. Draining is what keeps a producer nobody polls bounded. */
|
|
39
|
+
take(): GraphEvent[];
|
|
40
|
+
/** How many events were dropped for being older than the limit. */
|
|
41
|
+
readonly dropped: number;
|
|
42
|
+
clear(): void;
|
|
43
|
+
}
|
|
44
|
+
/** Keep the last `limit`. An app nobody is polling still runs effects. */
|
|
45
|
+
export declare function createHistory(limit: number): History;
|
|
46
|
+
/** One commit, as a reader of the timeline sees it. */
|
|
47
|
+
export interface Commit {
|
|
48
|
+
readonly commit: number;
|
|
49
|
+
readonly t: number;
|
|
50
|
+
readonly events: GraphEvent[];
|
|
51
|
+
/** The write that opened it, if the buffer still holds it. */
|
|
52
|
+
readonly cause?: GraphEvent;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Oldest first. A commit whose opening write has aged out still groups — its events carry the
|
|
56
|
+
* number, and a partial commit beats dropping the runs after it.
|
|
57
|
+
*/
|
|
58
|
+
export declare function toCommits(events: readonly GraphEvent[]): Commit[];
|
|
59
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,UAAU;IACzB,sFAAsF;IACtF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACtE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,8FAA8F;IAC9F,IAAI,IAAI,UAAU,EAAE,CAAC;IACrB,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;CACf;AAaD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CA4CpD;AAED,uDAAuD;AACvD,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;IAC9B,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,EAAE,CAejE"}
|
package/dist/history.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// What happened, in order.
|
|
2
|
+
//
|
|
3
|
+
// A snapshot says what the graph is; by the time a panel polls, the propagation is over and
|
|
4
|
+
// everything reads as settled. So the observer's callbacks are recorded as they arrive — the
|
|
5
|
+
// runtime calls them from inside the write, so the order is real rather than reconstructed.
|
|
6
|
+
//
|
|
7
|
+
// Events group into commits: a write with nothing running came from a handler and opens one.
|
|
8
|
+
// Deferred effects land in the commit that scheduled them.
|
|
9
|
+
/** Records nothing and costs nothing, for `history: 0`. */
|
|
10
|
+
const OFF = {
|
|
11
|
+
wrote() { },
|
|
12
|
+
ran() { },
|
|
13
|
+
created() { },
|
|
14
|
+
disposed() { },
|
|
15
|
+
take: () => [],
|
|
16
|
+
dropped: 0,
|
|
17
|
+
clear() { },
|
|
18
|
+
};
|
|
19
|
+
/** Keep the last `limit`. An app nobody is polling still runs effects. */
|
|
20
|
+
export function createHistory(limit) {
|
|
21
|
+
if (limit <= 0)
|
|
22
|
+
return OFF;
|
|
23
|
+
let events = [];
|
|
24
|
+
let seq = 0;
|
|
25
|
+
let commit = 0;
|
|
26
|
+
let dropped = 0;
|
|
27
|
+
const push = (event) => {
|
|
28
|
+
events.push({ ...event, seq: seq++, t: Date.now(), commit });
|
|
29
|
+
if (events.length > limit) {
|
|
30
|
+
dropped += events.length - limit;
|
|
31
|
+
events = events.slice(-limit);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
wrote(id, by, detail) {
|
|
36
|
+
// Nothing running: it came from outside, which is where a reader wants the cut.
|
|
37
|
+
if (by === undefined)
|
|
38
|
+
commit++;
|
|
39
|
+
push({ kind: 'write', id, by, ...detail });
|
|
40
|
+
},
|
|
41
|
+
ran(id, by) {
|
|
42
|
+
push({ kind: 'ran', id, by });
|
|
43
|
+
},
|
|
44
|
+
created(id, by, label) {
|
|
45
|
+
push({ kind: 'created', id, by, label });
|
|
46
|
+
},
|
|
47
|
+
disposed(id, label) {
|
|
48
|
+
push({ kind: 'disposed', id, label });
|
|
49
|
+
},
|
|
50
|
+
take() {
|
|
51
|
+
const taken = events;
|
|
52
|
+
events = [];
|
|
53
|
+
return taken;
|
|
54
|
+
},
|
|
55
|
+
get dropped() {
|
|
56
|
+
return dropped;
|
|
57
|
+
},
|
|
58
|
+
clear() {
|
|
59
|
+
events = [];
|
|
60
|
+
dropped = 0;
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Oldest first. A commit whose opening write has aged out still groups — its events carry the
|
|
66
|
+
* number, and a partial commit beats dropping the runs after it.
|
|
67
|
+
*/
|
|
68
|
+
export function toCommits(events) {
|
|
69
|
+
const byNumber = new Map();
|
|
70
|
+
for (const event of events) {
|
|
71
|
+
const bucket = byNumber.get(event.commit);
|
|
72
|
+
if (bucket)
|
|
73
|
+
bucket.push(event);
|
|
74
|
+
else
|
|
75
|
+
byNumber.set(event.commit, [event]);
|
|
76
|
+
}
|
|
77
|
+
return [...byNumber.entries()]
|
|
78
|
+
.sort((a, b) => a[0] - b[0])
|
|
79
|
+
.map(([commit, group]) => ({
|
|
80
|
+
commit,
|
|
81
|
+
t: group[0].t,
|
|
82
|
+
events: group,
|
|
83
|
+
cause: group.find((e) => e.kind === 'write' && e.by === undefined),
|
|
84
|
+
}));
|
|
85
|
+
}
|
package/dist/hook.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type ObservedGraph } from './observe.js';
|
|
2
|
+
import { type GraphSnapshot } from './wire.js';
|
|
3
|
+
export interface DevtoolsHook {
|
|
4
|
+
/**
|
|
5
|
+
* Called by the runtime when it loads.
|
|
6
|
+
*
|
|
7
|
+
* `watch` is how the caller says it brought its own devtools. Two copies live on a page
|
|
8
|
+
* routinely — a browser extension injects one at document_start and an application's own
|
|
9
|
+
* agent loads another — and the first to arrive owns the hook. Without this the graph is
|
|
10
|
+
* built by whichever copy got there first, which for an installed extension is a build
|
|
11
|
+
* that knows nothing of the compiler that made the application.
|
|
12
|
+
*/
|
|
13
|
+
inject(runtime: {
|
|
14
|
+
observeReactiveNodes: (o: never) => () => void;
|
|
15
|
+
version: string;
|
|
16
|
+
watch?: (options: {
|
|
17
|
+
observe: (o: never) => () => void;
|
|
18
|
+
}) => ObservedGraph;
|
|
19
|
+
}): void;
|
|
20
|
+
/** The graph, once a runtime has turned up. */
|
|
21
|
+
readonly observed: ObservedGraph | null;
|
|
22
|
+
/** The version of the runtime that injected, for a panel reporting what it is attached to. */
|
|
23
|
+
readonly version: string | null;
|
|
24
|
+
/**
|
|
25
|
+
* How many copies of this module tried to install one.
|
|
26
|
+
*
|
|
27
|
+
* Ordinarily two: an extension's and the application's own. Worth having for a panel
|
|
28
|
+
* reporting what it is attached to; which one watches is settled by `inject`.
|
|
29
|
+
*/
|
|
30
|
+
readonly copies: number;
|
|
31
|
+
/**
|
|
32
|
+
* Everything, or only what moved after `since`.
|
|
33
|
+
*
|
|
34
|
+
* The cursor comes back on every snapshot; a consumer folding in deltas keeps it and
|
|
35
|
+
* hands it back. Asking consumes nothing, so a page with a browser panel and an editor
|
|
36
|
+
* panel watching at the same time gives each of them every change. Draining a shared
|
|
37
|
+
* one meant whichever polled first took them.
|
|
38
|
+
*
|
|
39
|
+
* A cursor older than the removal log gets a full snapshot instead, since there is no
|
|
40
|
+
* longer any way to say what went missing.
|
|
41
|
+
*/
|
|
42
|
+
snapshot(options?: {
|
|
43
|
+
partial?: boolean;
|
|
44
|
+
since?: number;
|
|
45
|
+
}): GraphSnapshot | null;
|
|
46
|
+
/**
|
|
47
|
+
* Draw the overlay over something in the page, for a panel that is not in it.
|
|
48
|
+
*
|
|
49
|
+
* A number is a node, and covers everywhere it reaches. A string is one element, written
|
|
50
|
+
* as the tree keys them: the tag's id, the index of the root it rendered, then a child
|
|
51
|
+
* index per step — `12:0/1/2`. Null clears it.
|
|
52
|
+
*/
|
|
53
|
+
highlight(target: number | string | null): void;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Install the hook. Returns the existing one if something got there first, so two agents on
|
|
57
|
+
* one page share a graph rather than each seeing half of it.
|
|
58
|
+
*/
|
|
59
|
+
export declare function installDevtoolsHook(): DevtoolsHook;
|
|
60
|
+
//# sourceMappingURL=hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../src/hook.ts"],"names":[],"mappings":"AAYA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAmC,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAQhF,MAAM,WAAW,YAAY;IAC3B;;;;;;;;OAQG;IACH,MAAM,CAAC,OAAO,EAAE;QACd,oBAAoB,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,IAAI,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,IAAI,CAAA;SAAE,KAAK,aAAa,CAAC;KAC3E,GAAG,IAAI,CAAC;IACT,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC,8FAA8F;IAC9F,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,GAAG,IAAI,CAAC;IAChF;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CACjD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,YAAY,CAiHlD"}
|
package/dist/hook.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// The agent side of the rendezvous.
|
|
2
|
+
//
|
|
3
|
+
// A browser extension or a dev-server injection runs this before the application loads. It
|
|
4
|
+
// leaves a global behind; when the app's copy of @fluixi/reactive is first evaluated, the
|
|
5
|
+
// runtime finds it and hands over its own `observeReactiveNodes`. The graph is then built
|
|
6
|
+
// from the app's framework rather than this bundle's — two copies of the runtime each keep
|
|
7
|
+
// their own nodes, so watching the wrong one shows an empty graph.
|
|
8
|
+
//
|
|
9
|
+
// The app imports nothing and knows nothing about this. It also works against a production
|
|
10
|
+
// build: the reporting calls are unconditional, so only the names and source locations are
|
|
11
|
+
// missing there.
|
|
12
|
+
import { withoutElements } from './dom.js';
|
|
13
|
+
import { observeGraph } from './observe.js';
|
|
14
|
+
import { hideHighlight, showHighlight } from './highlight.js';
|
|
15
|
+
import { serializeGraph } from './wire.js';
|
|
16
|
+
/** A few hundred interactions' worth. */
|
|
17
|
+
const HISTORY = 500;
|
|
18
|
+
/** Kept in step with the name in @fluixi/reactive's observe.ts. */
|
|
19
|
+
const HOOK = '__FLUIXI_DEVTOOLS_HOOK__';
|
|
20
|
+
/**
|
|
21
|
+
* Install the hook. Returns the existing one if something got there first, so two agents on
|
|
22
|
+
* one page share a graph rather than each seeing half of it.
|
|
23
|
+
*/
|
|
24
|
+
export function installDevtoolsHook() {
|
|
25
|
+
const host = globalThis;
|
|
26
|
+
const existing = host[HOOK];
|
|
27
|
+
if (existing) {
|
|
28
|
+
// Counted, not complained about. Two copies is the ordinary case — an extension injects
|
|
29
|
+
// one before anything else runs and the application's agent loads another — and `inject`
|
|
30
|
+
// sorts out which of them ends up watching.
|
|
31
|
+
existing.copies = (existing.copies ?? 1) + 1;
|
|
32
|
+
return existing;
|
|
33
|
+
}
|
|
34
|
+
let observed = null;
|
|
35
|
+
/** Whether whoever is watching brought its own devtools, rather than being given this one. */
|
|
36
|
+
let owned = false;
|
|
37
|
+
let version = null;
|
|
38
|
+
/** What has happened, for whoever asks. Bounded: nothing here is ever consumed. */
|
|
39
|
+
const history = [];
|
|
40
|
+
const hook = {
|
|
41
|
+
copies: 1,
|
|
42
|
+
inject(runtime) {
|
|
43
|
+
version = runtime.version;
|
|
44
|
+
if (!observed) {
|
|
45
|
+
observed = (runtime.watch ?? observeGraph)({ observe: runtime.observeReactiveNodes });
|
|
46
|
+
owned = runtime.watch !== undefined;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// The runtime injects the moment it is evaluated, and it brings no devtools of its
|
|
50
|
+
// own — so an extension's copy starts watching first. The application's agent runs
|
|
51
|
+
// straight after, before any of its own modules have made a node, and hands over an
|
|
52
|
+
// observer that matches the compiler that built it. That one takes over.
|
|
53
|
+
if (owned || !runtime.watch)
|
|
54
|
+
return;
|
|
55
|
+
observed.detach();
|
|
56
|
+
observed = runtime.watch({ observe: runtime.observeReactiveNodes });
|
|
57
|
+
owned = true;
|
|
58
|
+
},
|
|
59
|
+
get observed() {
|
|
60
|
+
return observed;
|
|
61
|
+
},
|
|
62
|
+
get version() {
|
|
63
|
+
return version;
|
|
64
|
+
},
|
|
65
|
+
highlight(target) {
|
|
66
|
+
if (!observed || target === null) {
|
|
67
|
+
hideHighlight();
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (typeof target === 'number') {
|
|
71
|
+
const found = observed.elementsFor(target);
|
|
72
|
+
if (found.length)
|
|
73
|
+
showHighlight(found, observed.graph.get(target)?.label);
|
|
74
|
+
else
|
|
75
|
+
hideHighlight();
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Walked through the description rather than the elements, because that is what the
|
|
79
|
+
// keys were built from: a tag's roots there include what it was mounted into and what
|
|
80
|
+
// it writes to, neither of which it rendered.
|
|
81
|
+
const [head, ...steps] = target.split('/');
|
|
82
|
+
const [tag, root] = (head ?? '').split(':');
|
|
83
|
+
let node = observed.domFor(Number(tag))[Number(root)];
|
|
84
|
+
for (const step of steps)
|
|
85
|
+
node = node?.children[Number(step)];
|
|
86
|
+
const element = node?.element;
|
|
87
|
+
if (element)
|
|
88
|
+
showHighlight(element, element.tagName.toLowerCase());
|
|
89
|
+
else
|
|
90
|
+
hideHighlight();
|
|
91
|
+
},
|
|
92
|
+
snapshot({ partial = false, since } = {}) {
|
|
93
|
+
if (!observed)
|
|
94
|
+
return null;
|
|
95
|
+
// Detection is shared and has to run: it is what notices anything moved at all.
|
|
96
|
+
const changed = observed.sample();
|
|
97
|
+
const cursor = observed.revision;
|
|
98
|
+
// Kept, not handed out once. The hook can have more than one reader — a dev server
|
|
99
|
+
// agent polling and a browser panel open at the same time — and draining here gave
|
|
100
|
+
// each of them whichever events the other had not taken yet. Every event carries a
|
|
101
|
+
// seq, so a reader keeps what is new to it.
|
|
102
|
+
history.push(...observed.takeEvents());
|
|
103
|
+
if (history.length > HISTORY)
|
|
104
|
+
history.splice(0, history.length - HISTORY);
|
|
105
|
+
const events = history.slice();
|
|
106
|
+
// Described, not held: whoever reads this snapshot is usually not in the page, and the
|
|
107
|
+
// elements would only cross as empty objects anyway.
|
|
108
|
+
const dom = (id) => {
|
|
109
|
+
const described = observed.domFor(id);
|
|
110
|
+
return described.length ? withoutElements(described) : undefined;
|
|
111
|
+
};
|
|
112
|
+
// The observer can be older than this hook. The application hands its own over and the
|
|
113
|
+
// two are built separately, so a cursor is only offered when it can be honoured.
|
|
114
|
+
const cursors = typeof observed.changedSince === 'function';
|
|
115
|
+
// Everything, and the cursor to come back with. Also the answer for a consumer that
|
|
116
|
+
// has fallen further behind than the log reaches.
|
|
117
|
+
const whole = partial === false || since === undefined || !cursors || observed.outrun(since);
|
|
118
|
+
if (whole) {
|
|
119
|
+
// An older observer cannot say what was dropped after a revision, so a delta from
|
|
120
|
+
// it would quietly keep nodes that are gone. Everything, every time, is correct.
|
|
121
|
+
if (partial && !cursors) {
|
|
122
|
+
return serializeGraph(observed.graph, Date.now(), {
|
|
123
|
+
ids: changed,
|
|
124
|
+
removed: observed.takeRemoved(),
|
|
125
|
+
events,
|
|
126
|
+
dom,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return serializeGraph(observed.graph, Date.now(), { events, dom, cursor });
|
|
130
|
+
}
|
|
131
|
+
return serializeGraph(observed.graph, Date.now(), {
|
|
132
|
+
ids: observed.changedSince(since),
|
|
133
|
+
removed: observed.removedSince(since),
|
|
134
|
+
events,
|
|
135
|
+
dom,
|
|
136
|
+
cursor,
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
host[HOOK] = hook;
|
|
141
|
+
return hook;
|
|
142
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
export { createReactor, nodeVersion, nodeState } from './instrument.js';
|
|
2
2
|
export type { Reactor, ReactorApi, RNode, NodeKind, NodeState } from './instrument.js';
|
|
3
|
+
export { observeGraph } from './observe.js';
|
|
4
|
+
export type { ObservedGraph, ObserveOptions } from './observe.js';
|
|
5
|
+
export { installDevtoolsHook } from './hook.js';
|
|
6
|
+
export type { DevtoolsHook } from './hook.js';
|
|
7
|
+
export { formatValue, shorten } from './format.js';
|
|
8
|
+
export { callSite, currentCallSite } from './callsite.js';
|
|
9
|
+
export { serializeGraph, snapshotToRenderMap, applySnapshot } from './wire.js';
|
|
10
|
+
export type { GraphSnapshot, WireNode, SerializeOptions } from './wire.js';
|
|
11
|
+
export { toCommits } from './history.js';
|
|
12
|
+
export type { GraphEvent, GraphEventKind, Commit, History } from './history.js';
|
|
13
|
+
export { markReactiveSource } from './source.js';
|
|
14
|
+
export type { ReactiveSourceLocation, ReactiveSourceMetadata } from './source.js';
|
|
3
15
|
export { createGraphView, DEVTOOLS_CSS } from './graph-view.js';
|
|
4
|
-
export
|
|
16
|
+
export { createInspector, INSPECTOR_CSS } from './inspector.js';
|
|
17
|
+
export { createValuePane, VALUE_PANE_CSS } from './value-pane.js';
|
|
18
|
+
export type { ValuePane } from './value-pane.js';
|
|
19
|
+
export { indentValue } from './format.js';
|
|
20
|
+
export type { Inspector, InspectorOptions, ElementInspection } from './inspector.js';
|
|
21
|
+
export { createTimeline, TIMELINE_CSS } from './timeline.js';
|
|
22
|
+
export type { Timeline, TimelineOptions } from './timeline.js';
|
|
23
|
+
export { shortenPath } from './path.js';
|
|
24
|
+
export { registerDevtoolsPlugin, devtoolsPlugins, annotationOf, pluginRows, pluginBadge } from './plugin.js';
|
|
25
|
+
export type { DevtoolsPlugin, CollectContext, DirectiveReport, PluginNode, PluginRow, } from './plugin.js';
|
|
26
|
+
export { createComponentTree, componentTree, TREE_KINDS, TREE_CSS } from './tree.js';
|
|
27
|
+
export { showHighlight, hideHighlight, removeHighlight, startPicking } from './highlight.js';
|
|
28
|
+
export { makeFloatable, FLOAT_CSS } from './float.js';
|
|
29
|
+
export type { Floatable, FloatOptions } from './float.js';
|
|
30
|
+
export type { PickOptions } from './highlight.js';
|
|
31
|
+
export type { ComponentTree, ComponentTreeOptions, TreeNode, ElementPick } from './tree.js';
|
|
32
|
+
export { createKindFilter, FILTERABLE_KINDS, DROPDOWN_FILTER_CSS, KIND_FILTER_CSS } from './kind-filter.js';
|
|
33
|
+
export type { KindFilter, KindFilterOptions } from './kind-filter.js';
|
|
34
|
+
export type { DomNode } from './dom.js';
|
|
35
|
+
export { createMenu, MENU_CSS } from './menu.js';
|
|
36
|
+
export type { Menu, MenuItem, MenuOptions } from './menu.js';
|
|
37
|
+
export { createDetailPanel, DETAIL_PANEL_CSS } from './detail-panel.js';
|
|
38
|
+
export type { DetailPanel, DetailPanelOptions } from './detail-panel.js';
|
|
39
|
+
export { changeRows, handleCopyClick, CHANGE_CSS } from './change-view.js';
|
|
40
|
+
export { copyText } from './copy.js';
|
|
41
|
+
export { exportGraph, graphToJson } from './export.js';
|
|
42
|
+
export type { ExportedGraph, ExportOptions } from './export.js';
|
|
43
|
+
export { diffValues } from './diff.js';
|
|
44
|
+
export type { ValueChange, ChangeEntry, ChangeOp } from './diff.js';
|
|
45
|
+
export { describeNode } from './describe.js';
|
|
46
|
+
export type { DomTarget } from './instrument.js';
|
|
47
|
+
export type { GraphView, GraphViewOptions, GraphDirection } from './graph-view.js';
|
|
5
48
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|