@fluixi/devtools 0.2.0-alpha.3 → 0.2.0-alpha.5
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/dist/callsite.cjs +72 -0
- package/dist/callsite.d.ts +1 -1
- package/dist/callsite.js +1 -1
- package/dist/callsite.mjs +51 -0
- package/dist/change-view.cjs +134 -0
- package/dist/change-view.js +2 -2
- package/dist/change-view.mjs +111 -0
- package/dist/copy.cjs +63 -0
- package/dist/copy.mjs +42 -0
- package/dist/describe.cjs +55 -0
- package/dist/describe.js +2 -2
- package/dist/describe.mjs +34 -0
- package/dist/detail-panel.cjs +307 -0
- package/dist/detail-panel.d.ts +1 -1
- package/dist/detail-panel.d.ts.map +1 -1
- package/dist/detail-panel.js +1 -1
- package/dist/detail-panel.mjs +284 -0
- package/dist/diff.cjs +225 -0
- package/dist/diff.js +1 -1
- package/dist/diff.mjs +202 -0
- package/dist/dom.cjs +204 -0
- package/dist/dom.mjs +183 -0
- package/dist/export.cjs +221 -0
- package/dist/export.d.ts +2 -2
- package/dist/export.d.ts.map +1 -1
- package/dist/export.js +1 -1
- package/dist/export.mjs +209 -0
- package/dist/float.cjs +232 -0
- package/dist/float.d.ts +1 -1
- package/dist/float.js +3 -3
- package/dist/float.mjs +211 -0
- package/dist/format.cjs +175 -0
- package/dist/format.js +3 -3
- package/dist/format.mjs +154 -0
- package/dist/graph-view.cjs +893 -0
- package/dist/graph-view.mjs +870 -0
- package/dist/highlight.cjs +140 -0
- package/dist/highlight.mjs +119 -0
- package/dist/history.cjs +95 -0
- package/dist/history.d.ts +2 -2
- package/dist/history.js +2 -2
- package/dist/history.mjs +74 -0
- package/dist/hook.cjs +1562 -0
- package/dist/hook.d.ts +3 -3
- package/dist/hook.js +6 -6
- package/dist/hook.mjs +1553 -0
- package/dist/index.cjs +4552 -0
- package/dist/index.mjs +4544 -0
- package/dist/inspector.cjs +688 -0
- package/dist/inspector.d.ts +2 -2
- package/dist/inspector.js +7 -7
- package/dist/inspector.mjs +676 -0
- package/dist/instrument.cjs +497 -0
- package/dist/instrument.mjs +487 -0
- package/dist/kind-filter.cjs +172 -0
- package/dist/kind-filter.d.ts +2 -2
- package/dist/kind-filter.js +1 -1
- package/dist/kind-filter.mjs +151 -0
- package/dist/menu.cjs +141 -0
- package/dist/menu.mjs +120 -0
- package/dist/observe.cjs +1352 -0
- package/dist/observe.mjs +1345 -0
- package/dist/palette.cjs +52 -0
- package/dist/palette.mjs +31 -0
- package/dist/path.cjs +45 -0
- package/dist/path.d.ts +2 -2
- package/dist/path.js +2 -2
- package/dist/path.mjs +24 -0
- package/dist/plugin.cjs +87 -0
- package/dist/plugin.mjs +66 -0
- package/dist/plugins/context.cjs +98 -0
- package/dist/plugins/context.mjs +75 -0
- package/dist/plugins/directives.cjs +98 -0
- package/dist/plugins/directives.mjs +75 -0
- package/dist/plugins/index.cjs +162 -0
- package/dist/plugins/index.mjs +140 -0
- package/dist/source.cjs +111 -0
- package/dist/source.d.ts +2 -2
- package/dist/source.js +4 -4
- package/dist/source.mjs +90 -0
- package/dist/timeline.cjs +350 -0
- package/dist/timeline.js +3 -3
- package/dist/timeline.mjs +327 -0
- package/dist/tree.cjs +574 -0
- package/dist/tree.mjs +551 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/value-pane.cjs +223 -0
- package/dist/value-pane.mjs +200 -0
- package/dist/wire.cjs +109 -0
- package/dist/wire.mjs +89 -0
- package/package.json +19 -6
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/highlight.ts
|
|
21
|
+
var highlight_exports = {};
|
|
22
|
+
__export(highlight_exports, {
|
|
23
|
+
hideHighlight: () => hideHighlight,
|
|
24
|
+
removeHighlight: () => removeHighlight,
|
|
25
|
+
showHighlight: () => showHighlight,
|
|
26
|
+
startPicking: () => startPicking
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(highlight_exports);
|
|
29
|
+
var LAYER = "fx-highlight-layer";
|
|
30
|
+
var overlay = null;
|
|
31
|
+
function build(doc) {
|
|
32
|
+
const layer = doc.createElement("div");
|
|
33
|
+
layer.id = LAYER;
|
|
34
|
+
layer.style.cssText = "position:fixed;inset:0;z-index:2147483646;pointer-events:none;contain:strict;";
|
|
35
|
+
const label = doc.createElement("div");
|
|
36
|
+
label.style.cssText = "position:absolute;padding:1px 5px;border-radius:3px;background:#5eead4;color:#07131a;font:11px/1.5 ui-monospace,monospace;white-space:nowrap;";
|
|
37
|
+
layer.append(label);
|
|
38
|
+
doc.body.appendChild(layer);
|
|
39
|
+
return { layer, boxes: [], label };
|
|
40
|
+
}
|
|
41
|
+
function boxIn(overlay2, index) {
|
|
42
|
+
const held = overlay2.boxes[index];
|
|
43
|
+
if (held) return held;
|
|
44
|
+
const box = overlay2.layer.ownerDocument.createElement("div");
|
|
45
|
+
box.style.cssText = "position:absolute;border:1px solid #5eead4;background:rgba(94,234,212,.16);border-radius:2px;transition:none;";
|
|
46
|
+
overlay2.layer.append(box);
|
|
47
|
+
overlay2.boxes.push(box);
|
|
48
|
+
return box;
|
|
49
|
+
}
|
|
50
|
+
function showHighlight(target, text) {
|
|
51
|
+
const elements = (Array.isArray(target) ? target : [target]).filter(
|
|
52
|
+
(el) => el?.isConnected
|
|
53
|
+
);
|
|
54
|
+
const first = elements[0];
|
|
55
|
+
const doc = first?.ownerDocument;
|
|
56
|
+
if (!doc?.body) {
|
|
57
|
+
hideHighlight();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (!overlay || overlay.layer.ownerDocument !== doc || !overlay.layer.isConnected) {
|
|
61
|
+
overlay = build(doc);
|
|
62
|
+
}
|
|
63
|
+
const { label, layer } = overlay;
|
|
64
|
+
layer.style.display = "";
|
|
65
|
+
let top = Infinity;
|
|
66
|
+
let left = Infinity;
|
|
67
|
+
let bottom = 0;
|
|
68
|
+
elements.forEach((element, index) => {
|
|
69
|
+
const rect = element.getBoundingClientRect();
|
|
70
|
+
const box = boxIn(overlay, index);
|
|
71
|
+
box.style.display = "";
|
|
72
|
+
box.style.left = `${rect.left}px`;
|
|
73
|
+
box.style.top = `${rect.top}px`;
|
|
74
|
+
box.style.width = `${rect.width}px`;
|
|
75
|
+
box.style.height = `${rect.height}px`;
|
|
76
|
+
top = Math.min(top, rect.top);
|
|
77
|
+
left = Math.min(left, rect.left);
|
|
78
|
+
bottom = Math.max(bottom, rect.bottom);
|
|
79
|
+
});
|
|
80
|
+
for (let i = elements.length; i < overlay.boxes.length; i++) {
|
|
81
|
+
overlay.boxes[i].style.display = "none";
|
|
82
|
+
}
|
|
83
|
+
if (!text) {
|
|
84
|
+
label.style.display = "none";
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
label.style.display = "";
|
|
88
|
+
label.textContent = text;
|
|
89
|
+
label.style.left = `${Math.max(2, left)}px`;
|
|
90
|
+
label.style.top = top >= 20 ? `${top - 18}px` : `${bottom + 4}px`;
|
|
91
|
+
}
|
|
92
|
+
function hideHighlight() {
|
|
93
|
+
if (overlay) overlay.layer.style.display = "none";
|
|
94
|
+
}
|
|
95
|
+
function removeHighlight() {
|
|
96
|
+
overlay?.layer.remove();
|
|
97
|
+
overlay = null;
|
|
98
|
+
}
|
|
99
|
+
function startPicking(options) {
|
|
100
|
+
const doc = options.document ?? globalThis.document;
|
|
101
|
+
if (!doc?.body) return () => {
|
|
102
|
+
};
|
|
103
|
+
const was = doc.body.style.cursor;
|
|
104
|
+
doc.body.style.cursor = "crosshair";
|
|
105
|
+
const under = (event) => {
|
|
106
|
+
const target = event.target;
|
|
107
|
+
return target?.closest?.(`#${LAYER}`) ? null : target;
|
|
108
|
+
};
|
|
109
|
+
const move = (event) => {
|
|
110
|
+
const element = under(event);
|
|
111
|
+
const id = options.nodeAt(element);
|
|
112
|
+
if (element && id !== void 0) showHighlight(element, options.describe?.(id, element));
|
|
113
|
+
else hideHighlight();
|
|
114
|
+
};
|
|
115
|
+
const click = (event) => {
|
|
116
|
+
event.preventDefault();
|
|
117
|
+
event.stopPropagation();
|
|
118
|
+
const target = under(event);
|
|
119
|
+
const id = options.nodeAt(target);
|
|
120
|
+
if (!options.sticky) stop();
|
|
121
|
+
if (id !== void 0) options.onPick(id, target);
|
|
122
|
+
else if (!options.sticky) options.onCancel?.();
|
|
123
|
+
};
|
|
124
|
+
const key = (event) => {
|
|
125
|
+
if (event.key !== "Escape") return;
|
|
126
|
+
stop();
|
|
127
|
+
options.onCancel?.();
|
|
128
|
+
};
|
|
129
|
+
const stop = () => {
|
|
130
|
+
doc.body.style.cursor = was;
|
|
131
|
+
doc.removeEventListener("pointermove", move, true);
|
|
132
|
+
doc.removeEventListener("click", click, true);
|
|
133
|
+
doc.removeEventListener("keydown", key, true);
|
|
134
|
+
hideHighlight();
|
|
135
|
+
};
|
|
136
|
+
doc.addEventListener("pointermove", move, true);
|
|
137
|
+
doc.addEventListener("click", click, true);
|
|
138
|
+
doc.addEventListener("keydown", key, true);
|
|
139
|
+
return stop;
|
|
140
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// src/highlight.ts
|
|
2
|
+
var LAYER = "fx-highlight-layer";
|
|
3
|
+
var overlay = null;
|
|
4
|
+
function build(doc) {
|
|
5
|
+
const layer = doc.createElement("div");
|
|
6
|
+
layer.id = LAYER;
|
|
7
|
+
layer.style.cssText = "position:fixed;inset:0;z-index:2147483646;pointer-events:none;contain:strict;";
|
|
8
|
+
const label = doc.createElement("div");
|
|
9
|
+
label.style.cssText = "position:absolute;padding:1px 5px;border-radius:3px;background:#5eead4;color:#07131a;font:11px/1.5 ui-monospace,monospace;white-space:nowrap;";
|
|
10
|
+
layer.append(label);
|
|
11
|
+
doc.body.appendChild(layer);
|
|
12
|
+
return { layer, boxes: [], label };
|
|
13
|
+
}
|
|
14
|
+
function boxIn(overlay2, index) {
|
|
15
|
+
const held = overlay2.boxes[index];
|
|
16
|
+
if (held) return held;
|
|
17
|
+
const box = overlay2.layer.ownerDocument.createElement("div");
|
|
18
|
+
box.style.cssText = "position:absolute;border:1px solid #5eead4;background:rgba(94,234,212,.16);border-radius:2px;transition:none;";
|
|
19
|
+
overlay2.layer.append(box);
|
|
20
|
+
overlay2.boxes.push(box);
|
|
21
|
+
return box;
|
|
22
|
+
}
|
|
23
|
+
function showHighlight(target, text) {
|
|
24
|
+
const elements = (Array.isArray(target) ? target : [target]).filter(
|
|
25
|
+
(el) => el?.isConnected
|
|
26
|
+
);
|
|
27
|
+
const first = elements[0];
|
|
28
|
+
const doc = first?.ownerDocument;
|
|
29
|
+
if (!doc?.body) {
|
|
30
|
+
hideHighlight();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (!overlay || overlay.layer.ownerDocument !== doc || !overlay.layer.isConnected) {
|
|
34
|
+
overlay = build(doc);
|
|
35
|
+
}
|
|
36
|
+
const { label, layer } = overlay;
|
|
37
|
+
layer.style.display = "";
|
|
38
|
+
let top = Infinity;
|
|
39
|
+
let left = Infinity;
|
|
40
|
+
let bottom = 0;
|
|
41
|
+
elements.forEach((element, index) => {
|
|
42
|
+
const rect = element.getBoundingClientRect();
|
|
43
|
+
const box = boxIn(overlay, index);
|
|
44
|
+
box.style.display = "";
|
|
45
|
+
box.style.left = `${rect.left}px`;
|
|
46
|
+
box.style.top = `${rect.top}px`;
|
|
47
|
+
box.style.width = `${rect.width}px`;
|
|
48
|
+
box.style.height = `${rect.height}px`;
|
|
49
|
+
top = Math.min(top, rect.top);
|
|
50
|
+
left = Math.min(left, rect.left);
|
|
51
|
+
bottom = Math.max(bottom, rect.bottom);
|
|
52
|
+
});
|
|
53
|
+
for (let i = elements.length; i < overlay.boxes.length; i++) {
|
|
54
|
+
overlay.boxes[i].style.display = "none";
|
|
55
|
+
}
|
|
56
|
+
if (!text) {
|
|
57
|
+
label.style.display = "none";
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
label.style.display = "";
|
|
61
|
+
label.textContent = text;
|
|
62
|
+
label.style.left = `${Math.max(2, left)}px`;
|
|
63
|
+
label.style.top = top >= 20 ? `${top - 18}px` : `${bottom + 4}px`;
|
|
64
|
+
}
|
|
65
|
+
function hideHighlight() {
|
|
66
|
+
if (overlay) overlay.layer.style.display = "none";
|
|
67
|
+
}
|
|
68
|
+
function removeHighlight() {
|
|
69
|
+
overlay?.layer.remove();
|
|
70
|
+
overlay = null;
|
|
71
|
+
}
|
|
72
|
+
function startPicking(options) {
|
|
73
|
+
const doc = options.document ?? globalThis.document;
|
|
74
|
+
if (!doc?.body) return () => {
|
|
75
|
+
};
|
|
76
|
+
const was = doc.body.style.cursor;
|
|
77
|
+
doc.body.style.cursor = "crosshair";
|
|
78
|
+
const under = (event) => {
|
|
79
|
+
const target = event.target;
|
|
80
|
+
return target?.closest?.(`#${LAYER}`) ? null : target;
|
|
81
|
+
};
|
|
82
|
+
const move = (event) => {
|
|
83
|
+
const element = under(event);
|
|
84
|
+
const id = options.nodeAt(element);
|
|
85
|
+
if (element && id !== void 0) showHighlight(element, options.describe?.(id, element));
|
|
86
|
+
else hideHighlight();
|
|
87
|
+
};
|
|
88
|
+
const click = (event) => {
|
|
89
|
+
event.preventDefault();
|
|
90
|
+
event.stopPropagation();
|
|
91
|
+
const target = under(event);
|
|
92
|
+
const id = options.nodeAt(target);
|
|
93
|
+
if (!options.sticky) stop();
|
|
94
|
+
if (id !== void 0) options.onPick(id, target);
|
|
95
|
+
else if (!options.sticky) options.onCancel?.();
|
|
96
|
+
};
|
|
97
|
+
const key = (event) => {
|
|
98
|
+
if (event.key !== "Escape") return;
|
|
99
|
+
stop();
|
|
100
|
+
options.onCancel?.();
|
|
101
|
+
};
|
|
102
|
+
const stop = () => {
|
|
103
|
+
doc.body.style.cursor = was;
|
|
104
|
+
doc.removeEventListener("pointermove", move, true);
|
|
105
|
+
doc.removeEventListener("click", click, true);
|
|
106
|
+
doc.removeEventListener("keydown", key, true);
|
|
107
|
+
hideHighlight();
|
|
108
|
+
};
|
|
109
|
+
doc.addEventListener("pointermove", move, true);
|
|
110
|
+
doc.addEventListener("click", click, true);
|
|
111
|
+
doc.addEventListener("keydown", key, true);
|
|
112
|
+
return stop;
|
|
113
|
+
}
|
|
114
|
+
export {
|
|
115
|
+
hideHighlight,
|
|
116
|
+
removeHighlight,
|
|
117
|
+
showHighlight,
|
|
118
|
+
startPicking
|
|
119
|
+
};
|
package/dist/history.cjs
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/history.ts
|
|
21
|
+
var history_exports = {};
|
|
22
|
+
__export(history_exports, {
|
|
23
|
+
createHistory: () => createHistory,
|
|
24
|
+
toCommits: () => toCommits
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(history_exports);
|
|
27
|
+
var OFF = {
|
|
28
|
+
wrote() {
|
|
29
|
+
},
|
|
30
|
+
ran() {
|
|
31
|
+
},
|
|
32
|
+
created() {
|
|
33
|
+
},
|
|
34
|
+
disposed() {
|
|
35
|
+
},
|
|
36
|
+
take: () => [],
|
|
37
|
+
dropped: 0,
|
|
38
|
+
clear() {
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
function createHistory(limit) {
|
|
42
|
+
if (limit <= 0) return OFF;
|
|
43
|
+
let events = [];
|
|
44
|
+
let seq = 0;
|
|
45
|
+
let commit = 0;
|
|
46
|
+
let dropped = 0;
|
|
47
|
+
const push = (event) => {
|
|
48
|
+
events.push({ ...event, seq: seq++, t: Date.now(), commit });
|
|
49
|
+
if (events.length > limit) {
|
|
50
|
+
dropped += events.length - limit;
|
|
51
|
+
events = events.slice(-limit);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
wrote(id, by, detail) {
|
|
56
|
+
if (by === void 0) commit++;
|
|
57
|
+
push({ kind: "write", id, by, ...detail });
|
|
58
|
+
},
|
|
59
|
+
ran(id, by) {
|
|
60
|
+
push({ kind: "ran", id, by });
|
|
61
|
+
},
|
|
62
|
+
created(id, by, label) {
|
|
63
|
+
push({ kind: "created", id, by, label });
|
|
64
|
+
},
|
|
65
|
+
disposed(id, label) {
|
|
66
|
+
push({ kind: "disposed", id, label });
|
|
67
|
+
},
|
|
68
|
+
take() {
|
|
69
|
+
const taken = events;
|
|
70
|
+
events = [];
|
|
71
|
+
return taken;
|
|
72
|
+
},
|
|
73
|
+
get dropped() {
|
|
74
|
+
return dropped;
|
|
75
|
+
},
|
|
76
|
+
clear() {
|
|
77
|
+
events = [];
|
|
78
|
+
dropped = 0;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function toCommits(events) {
|
|
83
|
+
const byNumber = /* @__PURE__ */ new Map();
|
|
84
|
+
for (const event of events) {
|
|
85
|
+
const bucket = byNumber.get(event.commit);
|
|
86
|
+
if (bucket) bucket.push(event);
|
|
87
|
+
else byNumber.set(event.commit, [event]);
|
|
88
|
+
}
|
|
89
|
+
return [...byNumber.entries()].sort((a, b) => a[0] - b[0]).map(([commit, group]) => ({
|
|
90
|
+
commit,
|
|
91
|
+
t: group[0].t,
|
|
92
|
+
events: group,
|
|
93
|
+
cause: group.find((e) => e.kind === "write" && e.by === void 0)
|
|
94
|
+
}));
|
|
95
|
+
}
|
package/dist/history.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export interface GraphEvent {
|
|
|
19
19
|
readonly change?: ValueChange;
|
|
20
20
|
/**
|
|
21
21
|
* The name at the time. A consumer normally reads it off the graph, but a disposed node is
|
|
22
|
-
* no longer there
|
|
22
|
+
* no longer there: and a list re-render is mostly disposals, so it travels with the event.
|
|
23
23
|
*/
|
|
24
24
|
readonly label?: string;
|
|
25
25
|
}
|
|
@@ -52,7 +52,7 @@ export interface Commit {
|
|
|
52
52
|
readonly cause?: GraphEvent;
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
|
-
* Oldest first. A commit whose opening write has aged out still groups
|
|
55
|
+
* Oldest first. A commit whose opening write has aged out still groups, its events carry the
|
|
56
56
|
* number, and a partial commit beats dropping the runs after it.
|
|
57
57
|
*/
|
|
58
58
|
export declare function toCommits(events: readonly GraphEvent[]): Commit[];
|
package/dist/history.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// What happened, in order.
|
|
2
2
|
//
|
|
3
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
|
|
4
|
+
// everything reads as settled. So the observer's callbacks are recorded as they arrive, the
|
|
5
5
|
// runtime calls them from inside the write, so the order is real rather than reconstructed.
|
|
6
6
|
//
|
|
7
7
|
// Events group into commits: a write with nothing running came from a handler and opens one.
|
|
@@ -62,7 +62,7 @@ export function createHistory(limit) {
|
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
64
|
/**
|
|
65
|
-
* Oldest first. A commit whose opening write has aged out still groups
|
|
65
|
+
* Oldest first. A commit whose opening write has aged out still groups, its events carry the
|
|
66
66
|
* number, and a partial commit beats dropping the runs after it.
|
|
67
67
|
*/
|
|
68
68
|
export function toCommits(events) {
|
package/dist/history.mjs
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// src/history.ts
|
|
2
|
+
var OFF = {
|
|
3
|
+
wrote() {
|
|
4
|
+
},
|
|
5
|
+
ran() {
|
|
6
|
+
},
|
|
7
|
+
created() {
|
|
8
|
+
},
|
|
9
|
+
disposed() {
|
|
10
|
+
},
|
|
11
|
+
take: () => [],
|
|
12
|
+
dropped: 0,
|
|
13
|
+
clear() {
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
function createHistory(limit) {
|
|
17
|
+
if (limit <= 0) return OFF;
|
|
18
|
+
let events = [];
|
|
19
|
+
let seq = 0;
|
|
20
|
+
let commit = 0;
|
|
21
|
+
let dropped = 0;
|
|
22
|
+
const push = (event) => {
|
|
23
|
+
events.push({ ...event, seq: seq++, t: Date.now(), commit });
|
|
24
|
+
if (events.length > limit) {
|
|
25
|
+
dropped += events.length - limit;
|
|
26
|
+
events = events.slice(-limit);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
wrote(id, by, detail) {
|
|
31
|
+
if (by === void 0) commit++;
|
|
32
|
+
push({ kind: "write", id, by, ...detail });
|
|
33
|
+
},
|
|
34
|
+
ran(id, by) {
|
|
35
|
+
push({ kind: "ran", id, by });
|
|
36
|
+
},
|
|
37
|
+
created(id, by, label) {
|
|
38
|
+
push({ kind: "created", id, by, label });
|
|
39
|
+
},
|
|
40
|
+
disposed(id, label) {
|
|
41
|
+
push({ kind: "disposed", id, label });
|
|
42
|
+
},
|
|
43
|
+
take() {
|
|
44
|
+
const taken = events;
|
|
45
|
+
events = [];
|
|
46
|
+
return taken;
|
|
47
|
+
},
|
|
48
|
+
get dropped() {
|
|
49
|
+
return dropped;
|
|
50
|
+
},
|
|
51
|
+
clear() {
|
|
52
|
+
events = [];
|
|
53
|
+
dropped = 0;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function toCommits(events) {
|
|
58
|
+
const byNumber = /* @__PURE__ */ new Map();
|
|
59
|
+
for (const event of events) {
|
|
60
|
+
const bucket = byNumber.get(event.commit);
|
|
61
|
+
if (bucket) bucket.push(event);
|
|
62
|
+
else byNumber.set(event.commit, [event]);
|
|
63
|
+
}
|
|
64
|
+
return [...byNumber.entries()].sort((a, b) => a[0] - b[0]).map(([commit, group]) => ({
|
|
65
|
+
commit,
|
|
66
|
+
t: group[0].t,
|
|
67
|
+
events: group,
|
|
68
|
+
cause: group.find((e) => e.kind === "write" && e.by === void 0)
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
export {
|
|
72
|
+
createHistory,
|
|
73
|
+
toCommits
|
|
74
|
+
};
|