dev-inspector 1.0.3 → 1.0.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.
Files changed (82) hide show
  1. package/README.md +15 -48
  2. package/lib/index.d.ts +1 -6
  3. package/lib/index.js +1 -10
  4. package/lib/init.d.ts +11 -22
  5. package/lib/init.js +33 -24
  6. package/lib/logger/networkLogger.js +41 -11
  7. package/lib/ui/logList/createLogList.d.ts +2 -0
  8. package/lib/ui/logList/createLogList.js +67 -0
  9. package/lib/ui/logList/index.d.ts +2 -0
  10. package/lib/ui/logList/index.js +5 -0
  11. package/lib/ui/logList/networkDetails/copy.d.ts +2 -0
  12. package/lib/ui/logList/networkDetails/copy.js +101 -0
  13. package/lib/ui/logList/networkDetails/createNetworkDetails.d.ts +2 -0
  14. package/lib/ui/logList/networkDetails/createNetworkDetails.js +61 -0
  15. package/lib/ui/logList/networkDetails/index.d.ts +1 -0
  16. package/lib/ui/logList/networkDetails/index.js +5 -0
  17. package/lib/ui/logList/networkDetails/renderValue.d.ts +2 -0
  18. package/lib/ui/logList/networkDetails/renderValue.js +75 -0
  19. package/lib/ui/logList/networkDetails.d.ts +2 -0
  20. package/lib/ui/logList/networkDetails.js +227 -0
  21. package/lib/ui/logList/shared/consoleInspect.d.ts +1 -0
  22. package/lib/ui/logList/shared/consoleInspect.js +17 -0
  23. package/lib/ui/logList/shared/index.d.ts +3 -0
  24. package/lib/ui/logList/shared/index.js +11 -0
  25. package/lib/ui/logList/shared/time.d.ts +1 -0
  26. package/lib/ui/logList/shared/time.js +10 -0
  27. package/lib/ui/logList/shared/tone.d.ts +6 -0
  28. package/lib/ui/logList/shared/tone.js +36 -0
  29. package/lib/ui/logList/types.d.ts +6 -0
  30. package/lib/ui/logList/types.js +2 -0
  31. package/lib/ui/logList.js +6 -0
  32. package/lib/ui/panel/behavior/index.d.ts +1 -0
  33. package/lib/ui/panel/behavior/index.js +5 -0
  34. package/lib/ui/panel/behavior/setupPanelBehavior.d.ts +5 -0
  35. package/lib/ui/panel/behavior/setupPanelBehavior.js +75 -0
  36. package/lib/ui/panel/bindings/bindStorageToPanelView.d.ts +16 -0
  37. package/lib/ui/panel/bindings/bindStorageToPanelView.js +76 -0
  38. package/lib/ui/panel/bindings/index.d.ts +2 -0
  39. package/lib/ui/panel/bindings/index.js +5 -0
  40. package/lib/ui/panel/bindings/types.d.ts +5 -0
  41. package/lib/ui/panel/bindings/types.js +2 -0
  42. package/lib/ui/panel/dom/buildPanelDOM.d.ts +3 -0
  43. package/lib/ui/panel/dom/buildPanelDOM.js +73 -0
  44. package/lib/ui/panel/dom/constants.d.ts +3 -0
  45. package/lib/ui/panel/dom/constants.js +28 -0
  46. package/lib/ui/panel/dom/index.d.ts +2 -0
  47. package/lib/ui/panel/dom/index.js +5 -0
  48. package/lib/ui/panel/dom/types.d.ts +25 -0
  49. package/lib/ui/panel/dom/types.js +2 -0
  50. package/lib/ui/panel/index.d.ts +15 -0
  51. package/lib/ui/panel/index.js +16 -0
  52. package/lib/ui/panel/resize/attachResizeHandling.d.ts +2 -0
  53. package/lib/ui/panel/resize/attachResizeHandling.js +94 -0
  54. package/lib/ui/panel/resize/index.d.ts +2 -0
  55. package/lib/ui/panel/resize/index.js +5 -0
  56. package/lib/ui/panel/resize/types.d.ts +3 -0
  57. package/lib/ui/panel/resize/types.js +2 -0
  58. package/lib/ui/panel/shared/dom.d.ts +1 -0
  59. package/lib/ui/panel/shared/dom.js +9 -0
  60. package/lib/ui/panel/shared/ensureDocument.d.ts +1 -0
  61. package/lib/ui/panel/shared/ensureDocument.js +9 -0
  62. package/lib/ui/panel/shared/ensureStyle.d.ts +1 -0
  63. package/lib/ui/panel/shared/ensureStyle.js +14 -0
  64. package/lib/ui/panel/shared/index.d.ts +6 -0
  65. package/lib/ui/panel/shared/index.js +13 -0
  66. package/lib/ui/panel/shared/math.d.ts +1 -0
  67. package/lib/ui/panel/shared/math.js +6 -0
  68. package/lib/ui/panel/shared/types.d.ts +11 -0
  69. package/lib/ui/panel/shared/types.js +2 -0
  70. package/lib/ui/panel/shared/window.d.ts +2 -0
  71. package/lib/ui/panel/shared/window.js +6 -0
  72. package/lib/ui/panel/state/createPanelState.d.ts +2 -0
  73. package/lib/ui/panel/state/createPanelState.js +11 -0
  74. package/lib/ui/panel/state/index.d.ts +2 -0
  75. package/lib/ui/panel/state/index.js +5 -0
  76. package/lib/ui/panel/state/types.d.ts +8 -0
  77. package/lib/ui/panel/state/types.js +2 -0
  78. package/lib/ui/panel.js +219 -186
  79. package/lib/ui/panelStyles.d.ts +1 -1
  80. package/lib/ui/panelStyles.js +74 -0
  81. package/lib/utils/types.d.ts +3 -0
  82. package/package.json +9 -2
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.valueToElement = valueToElement;
4
+ exports.valueToCopyText = valueToCopyText;
5
+ const jsonViewer_1 = require("../../jsonViewer");
6
+ function tryParseJson(text) {
7
+ const t = text.trim();
8
+ if (t.length < 2)
9
+ return undefined;
10
+ const looksLikeObject = t.startsWith("{") && t.endsWith("}");
11
+ const looksLikeArray = t.startsWith("[") && t.endsWith("]");
12
+ if (!looksLikeObject && !looksLikeArray)
13
+ return undefined;
14
+ try {
15
+ return JSON.parse(t);
16
+ }
17
+ catch (_a) {
18
+ return undefined;
19
+ }
20
+ }
21
+ function safeStringify(value) {
22
+ const seen = new WeakSet();
23
+ const replacer = (_key, v) => {
24
+ if (typeof v === "object" && v !== null) {
25
+ const o = v;
26
+ if (seen.has(o))
27
+ return "[circular]";
28
+ seen.add(o);
29
+ }
30
+ return v;
31
+ };
32
+ try {
33
+ return JSON.stringify(value, replacer, 2);
34
+ }
35
+ catch (_a) {
36
+ try {
37
+ return String(value);
38
+ }
39
+ catch (_b) {
40
+ return "[unserializable]";
41
+ }
42
+ }
43
+ }
44
+ function valueToElement(doc, value) {
45
+ if (typeof value === "string") {
46
+ const parsed = tryParseJson(value);
47
+ if (parsed && typeof parsed === "object") {
48
+ return (0, jsonViewer_1.createJsonViewer)(doc, parsed, { maxDepth: 6, maxKeys: 200, maxNodes: 2000 });
49
+ }
50
+ const el = doc.createElement("div");
51
+ el.className = "di-netBodyText";
52
+ el.textContent = value;
53
+ return el;
54
+ }
55
+ if (value instanceof Error) {
56
+ const el = doc.createElement("div");
57
+ el.className = "di-netBodyText";
58
+ el.textContent = `${value.name}: ${value.message}`;
59
+ return el;
60
+ }
61
+ if (value === null || typeof value !== "object") {
62
+ const el = doc.createElement("div");
63
+ el.className = "di-netBodyText";
64
+ el.textContent = String(value);
65
+ return el;
66
+ }
67
+ return (0, jsonViewer_1.createJsonViewer)(doc, value, { maxDepth: 6, maxKeys: 200, maxNodes: 2000 });
68
+ }
69
+ function valueToCopyText(value) {
70
+ if (typeof value === "string")
71
+ return value;
72
+ if (value instanceof Error)
73
+ return `${value.name}: ${value.message}`;
74
+ return safeStringify(value);
75
+ }
@@ -0,0 +1,2 @@
1
+ import type { NetworkLogEntry } from "../../utils/types";
2
+ export declare function createNetworkDetails(doc: Document, entry: NetworkLogEntry): HTMLElement | null;
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNetworkDetails = createNetworkDetails;
4
+ const jsonViewer_1 = require("../jsonViewer");
5
+ function tryParseJson(text) {
6
+ const t = text.trim();
7
+ if (t.length < 2)
8
+ return undefined;
9
+ const looksLikeObject = t.startsWith("{") && t.endsWith("}");
10
+ const looksLikeArray = t.startsWith("[") && t.endsWith("]");
11
+ if (!looksLikeObject && !looksLikeArray)
12
+ return undefined;
13
+ try {
14
+ return JSON.parse(t);
15
+ }
16
+ catch (_a) {
17
+ return undefined;
18
+ }
19
+ }
20
+ function safeStringify(value) {
21
+ const seen = new WeakSet();
22
+ const replacer = (_key, v) => {
23
+ if (typeof v === "object" && v !== null) {
24
+ const o = v;
25
+ if (seen.has(o))
26
+ return "[circular]";
27
+ seen.add(o);
28
+ }
29
+ return v;
30
+ };
31
+ try {
32
+ return JSON.stringify(value, replacer, 2);
33
+ }
34
+ catch (_a) {
35
+ try {
36
+ return String(value);
37
+ }
38
+ catch (_b) {
39
+ return "[unserializable]";
40
+ }
41
+ }
42
+ }
43
+ async function copyText(text) {
44
+ var _a, _b;
45
+ try {
46
+ const nav = globalThis;
47
+ const fn = (_b = (_a = nav.navigator) === null || _a === void 0 ? void 0 : _a.clipboard) === null || _b === void 0 ? void 0 : _b.writeText;
48
+ if (typeof fn === "function") {
49
+ await fn(text);
50
+ return true;
51
+ }
52
+ }
53
+ catch (_c) {
54
+ void 0;
55
+ }
56
+ try {
57
+ if (typeof document === "undefined")
58
+ return false;
59
+ const ta = document.createElement("textarea");
60
+ ta.value = text;
61
+ ta.setAttribute("readonly", "true");
62
+ ta.style.position = "fixed";
63
+ ta.style.left = "-9999px";
64
+ ta.style.top = "0";
65
+ document.body.append(ta);
66
+ ta.select();
67
+ const ok = document.execCommand("copy");
68
+ ta.remove();
69
+ return ok;
70
+ }
71
+ catch (_d) {
72
+ return false;
73
+ }
74
+ }
75
+ function prefersReducedMotion() {
76
+ var _a, _b;
77
+ try {
78
+ const mm = globalThis;
79
+ return ((_b = (_a = mm.matchMedia) === null || _a === void 0 ? void 0 : _a.call(mm, "(prefers-reduced-motion: reduce)")) === null || _b === void 0 ? void 0 : _b.matches) === true;
80
+ }
81
+ catch (_c) {
82
+ return false;
83
+ }
84
+ }
85
+ function rand(min, max) {
86
+ return min + Math.random() * (max - min);
87
+ }
88
+ function launchMiniConfetti(anchor) {
89
+ if (prefersReducedMotion())
90
+ return;
91
+ if (typeof document === "undefined")
92
+ return;
93
+ const rect = anchor.getBoundingClientRect();
94
+ const cx = rect.left + rect.width / 2;
95
+ const cy = rect.top + rect.height / 2;
96
+ const root = document.createElement("div");
97
+ root.style.position = "fixed";
98
+ root.style.left = "0";
99
+ root.style.top = "0";
100
+ root.style.width = "0";
101
+ root.style.height = "0";
102
+ root.style.pointerEvents = "none";
103
+ root.style.zIndex = "2147483647";
104
+ document.body.append(root);
105
+ const colors = ["#a7ff00", "#7c5cff", "#00c4ff", "#ff9030", "#ef4444"];
106
+ const n = 14;
107
+ const duration = 520;
108
+ for (let i = 0; i < n; i += 1) {
109
+ const p = document.createElement("span");
110
+ const size = Math.round(rand(3, 6));
111
+ p.style.position = "fixed";
112
+ p.style.left = `${cx}px`;
113
+ p.style.top = `${cy}px`;
114
+ p.style.width = `${size}px`;
115
+ p.style.height = `${size}px`;
116
+ p.style.borderRadius = Math.random() < 0.35 ? "999px" : "2px";
117
+ p.style.background = colors[i % colors.length];
118
+ p.style.opacity = "1";
119
+ p.style.willChange = "transform, opacity";
120
+ root.append(p);
121
+ const angle = rand(0, Math.PI * 2);
122
+ const dist = rand(18, 46);
123
+ const dx = Math.cos(angle) * dist;
124
+ const dy = Math.sin(angle) * dist + rand(8, 16);
125
+ const rot = rand(-220, 220);
126
+ const delay = Math.round(rand(0, 60));
127
+ try {
128
+ const anim = p.animate([
129
+ { transform: `translate(-50%, -50%) translate(0px, 0px) rotate(0deg) scale(1)`, opacity: 1 },
130
+ { transform: `translate(-50%, -50%) translate(${dx}px, ${dy}px) rotate(${rot}deg) scale(0.9)`, opacity: 0 },
131
+ ], { duration, delay, easing: "cubic-bezier(0.2, 0.7, 0.2, 1)", fill: "forwards" });
132
+ anim.addEventListener("finish", () => p.remove());
133
+ }
134
+ catch (_a) {
135
+ globalThis.setTimeout(() => p.remove(), duration + delay + 50);
136
+ }
137
+ }
138
+ globalThis.setTimeout(() => root.remove(), duration + 120);
139
+ }
140
+ function valueToElement(doc, value) {
141
+ if (typeof value === "string") {
142
+ const parsed = tryParseJson(value);
143
+ if (parsed && typeof parsed === "object") {
144
+ return (0, jsonViewer_1.createJsonViewer)(doc, parsed, { maxDepth: 6, maxKeys: 200, maxNodes: 2000 });
145
+ }
146
+ const el = doc.createElement("div");
147
+ el.className = "di-netBodyText";
148
+ el.textContent = value;
149
+ return el;
150
+ }
151
+ if (value instanceof Error) {
152
+ const el = doc.createElement("div");
153
+ el.className = "di-netBodyText";
154
+ el.textContent = `${value.name}: ${value.message}`;
155
+ return el;
156
+ }
157
+ if (value === null || typeof value !== "object") {
158
+ const el = doc.createElement("div");
159
+ el.className = "di-netBodyText";
160
+ el.textContent = String(value);
161
+ return el;
162
+ }
163
+ return (0, jsonViewer_1.createJsonViewer)(doc, value, { maxDepth: 6, maxKeys: 200, maxNodes: 2000 });
164
+ }
165
+ function valueToCopyText(value) {
166
+ if (typeof value === "string")
167
+ return value;
168
+ if (value instanceof Error)
169
+ return `${value.name}: ${value.message}`;
170
+ return safeStringify(value);
171
+ }
172
+ function createBodyDetails(doc, title, value, truncated, maxLen) {
173
+ const details = doc.createElement("details");
174
+ details.className = "di-details di-netBodyDetails";
175
+ const summary = doc.createElement("summary");
176
+ summary.className = "di-detailsSummary di-netDetailsSummary";
177
+ const titleEl = doc.createElement("span");
178
+ titleEl.className = "di-netDetailsTitle";
179
+ titleEl.textContent = title;
180
+ const copyBtn = doc.createElement("button");
181
+ copyBtn.type = "button";
182
+ copyBtn.className = "di-copyBtn";
183
+ copyBtn.textContent = "Copy";
184
+ copyBtn.setAttribute("aria-label", `Copy ${title.toLowerCase()}`);
185
+ copyBtn.addEventListener("click", (ev) => {
186
+ ev.preventDefault();
187
+ ev.stopPropagation();
188
+ const txt = valueToCopyText(value);
189
+ void copyText(txt).then((ok) => {
190
+ if (!ok)
191
+ return;
192
+ launchMiniConfetti(copyBtn);
193
+ const prev = copyBtn.textContent;
194
+ copyBtn.textContent = "Copied";
195
+ globalThis.setTimeout(() => {
196
+ copyBtn.textContent = prev !== null && prev !== void 0 ? prev : "Copy";
197
+ }, 900);
198
+ });
199
+ });
200
+ summary.append(titleEl, copyBtn);
201
+ const body = doc.createElement("div");
202
+ body.className = "di-detailsBody";
203
+ if (truncated) {
204
+ const warn = doc.createElement("div");
205
+ warn.className = "di-netTrunc";
206
+ warn.textContent = typeof maxLen === "number" ? `Truncated to first ${maxLen} characters.` : "Truncated.";
207
+ body.append(warn);
208
+ }
209
+ body.append(valueToElement(doc, value));
210
+ details.append(summary, body);
211
+ return details;
212
+ }
213
+ function createNetworkDetails(doc, entry) {
214
+ const hasReq = typeof entry.requestBody !== "undefined";
215
+ const hasRes = typeof entry.responseBody !== "undefined";
216
+ if (!hasReq && !hasRes)
217
+ return null;
218
+ const wrap = doc.createElement("div");
219
+ wrap.className = "di-netDetailsWrap";
220
+ if (hasReq) {
221
+ wrap.append(createBodyDetails(doc, "Request", entry.requestBody, entry.requestBodyTruncated === true, entry.bodyMaxLength));
222
+ }
223
+ if (hasRes) {
224
+ wrap.append(createBodyDetails(doc, "Response", entry.responseBody, entry.responseBodyTruncated === true, entry.bodyMaxLength));
225
+ }
226
+ return wrap;
227
+ }
@@ -0,0 +1 @@
1
+ export declare function getInspectableArgs(args: unknown[]): unknown[];
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getInspectableArgs = getInspectableArgs;
4
+ function isInspectableValue(value) {
5
+ if (typeof value !== "object" || value === null)
6
+ return false;
7
+ if (value instanceof Error)
8
+ return false;
9
+ if (value instanceof Date)
10
+ return false;
11
+ if (value instanceof RegExp)
12
+ return false;
13
+ return true;
14
+ }
15
+ function getInspectableArgs(args) {
16
+ return args.filter(isInspectableValue);
17
+ }
@@ -0,0 +1,3 @@
1
+ export { fmtTime } from "./time";
2
+ export { toneForEntry, classForTone, isNetworkFailure } from "./tone";
3
+ export { getInspectableArgs } from "./consoleInspect";
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getInspectableArgs = exports.isNetworkFailure = exports.classForTone = exports.toneForEntry = exports.fmtTime = void 0;
4
+ var time_1 = require("./time");
5
+ Object.defineProperty(exports, "fmtTime", { enumerable: true, get: function () { return time_1.fmtTime; } });
6
+ var tone_1 = require("./tone");
7
+ Object.defineProperty(exports, "toneForEntry", { enumerable: true, get: function () { return tone_1.toneForEntry; } });
8
+ Object.defineProperty(exports, "classForTone", { enumerable: true, get: function () { return tone_1.classForTone; } });
9
+ Object.defineProperty(exports, "isNetworkFailure", { enumerable: true, get: function () { return tone_1.isNetworkFailure; } });
10
+ var consoleInspect_1 = require("./consoleInspect");
11
+ Object.defineProperty(exports, "getInspectableArgs", { enumerable: true, get: function () { return consoleInspect_1.getInspectableArgs; } });
@@ -0,0 +1 @@
1
+ export declare function fmtTime(ts: number): string;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fmtTime = fmtTime;
4
+ function fmtTime(ts) {
5
+ const d = new Date(ts);
6
+ const hh = String(d.getHours()).padStart(2, "0");
7
+ const mm = String(d.getMinutes()).padStart(2, "0");
8
+ const ss = String(d.getSeconds()).padStart(2, "0");
9
+ return `${hh}:${mm}:${ss}`;
10
+ }
@@ -0,0 +1,6 @@
1
+ import type { LogEntry } from "../../../utils/types";
2
+ type Tone = "neutral" | "warning" | "error" | "success";
3
+ export declare function toneForEntry(entry: LogEntry): Tone;
4
+ export declare function classForTone(tone: Tone): string;
5
+ export declare function isNetworkFailure(entry: LogEntry): boolean;
6
+ export {};
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toneForEntry = toneForEntry;
4
+ exports.classForTone = classForTone;
5
+ exports.isNetworkFailure = isNetworkFailure;
6
+ function toneForEntry(entry) {
7
+ if (entry.source === "console") {
8
+ if (entry.level === "error")
9
+ return "error";
10
+ if (entry.level === "warn")
11
+ return "warning";
12
+ return "neutral";
13
+ }
14
+ const s = entry.status;
15
+ if (typeof s !== "number")
16
+ return "error";
17
+ if (s >= 400)
18
+ return "error";
19
+ if (s >= 300)
20
+ return "warning";
21
+ return "success";
22
+ }
23
+ function classForTone(tone) {
24
+ if (tone === "error")
25
+ return "di-itemToneError";
26
+ if (tone === "warning")
27
+ return "di-itemToneWarning";
28
+ if (tone === "success")
29
+ return "di-itemToneSuccess";
30
+ return "di-itemToneNeutral";
31
+ }
32
+ function isNetworkFailure(entry) {
33
+ if (entry.source !== "network")
34
+ return false;
35
+ return typeof entry.status !== "number" || entry.status >= 400;
36
+ }
@@ -0,0 +1,6 @@
1
+ import type { LogEntry } from "../../utils/types";
2
+ export type LogList = {
3
+ el: HTMLUListElement;
4
+ append: (entry: LogEntry) => void;
5
+ clear: () => void;
6
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/lib/ui/logList.js CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createLogList = createLogList;
4
4
  const jsonViewer_1 = require("./jsonViewer");
5
+ const networkDetails_1 = require("./logList/networkDetails");
5
6
  function fmtTime(ts) {
6
7
  const d = new Date(ts);
7
8
  const hh = String(d.getHours()).padStart(2, "0");
@@ -102,6 +103,11 @@ function createLogList(doc) {
102
103
  li.append(details);
103
104
  }
104
105
  }
106
+ if (entry.source === "network") {
107
+ const details = (0, networkDetails_1.createNetworkDetails)(doc, entry);
108
+ if (details)
109
+ li.append(details);
110
+ }
105
111
  el.append(li);
106
112
  };
107
113
  const clear = () => {
@@ -0,0 +1 @@
1
+ export { setupPanelBehavior } from "./setupPanelBehavior";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupPanelBehavior = void 0;
4
+ var setupPanelBehavior_1 = require("./setupPanelBehavior");
5
+ Object.defineProperty(exports, "setupPanelBehavior", { enumerable: true, get: function () { return setupPanelBehavior_1.setupPanelBehavior; } });
@@ -0,0 +1,5 @@
1
+ import type { LogStorage } from "../../../storage/logStorage";
2
+ import type { PanelHandle } from "..";
3
+ import type { PanelDOM } from "../dom/types";
4
+ import type { PanelState } from "../state/types";
5
+ export declare function setupPanelBehavior(dom: PanelDOM, state: PanelState, storage: LogStorage): PanelHandle;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupPanelBehavior = setupPanelBehavior;
4
+ const bindings_1 = require("../bindings");
5
+ const resize_1 = require("../resize");
6
+ function setupPanelBehavior(dom, state, storage) {
7
+ const applyVisibility = () => {
8
+ if (state.open)
9
+ dom.panel.classList.remove("di-hidden");
10
+ else
11
+ dom.panel.classList.add("di-hidden");
12
+ };
13
+ const updateTabStyles = () => {
14
+ if (state.tab === "console") {
15
+ dom.consoleTab.classList.add("di-tabActive");
16
+ dom.networkTab.classList.remove("di-tabActive");
17
+ }
18
+ else {
19
+ dom.networkTab.classList.add("di-tabActive");
20
+ dom.consoleTab.classList.remove("di-tabActive");
21
+ }
22
+ };
23
+ const bindings = (0, bindings_1.bindStorageToPanelView)({
24
+ storage,
25
+ state,
26
+ list: dom.list,
27
+ body: dom.body,
28
+ counters: dom.counters,
29
+ updateTabStyles,
30
+ });
31
+ applyVisibility();
32
+ updateTabStyles();
33
+ const resizeControls = (0, resize_1.attachResizeHandling)(dom.panel, dom.resizeHandle);
34
+ const open = () => {
35
+ state.open = true;
36
+ applyVisibility();
37
+ };
38
+ const close = () => {
39
+ state.open = false;
40
+ applyVisibility();
41
+ };
42
+ const toggle = () => {
43
+ state.open = !state.open;
44
+ applyVisibility();
45
+ };
46
+ const onToggleClick = () => toggle();
47
+ const onCloseClick = () => close();
48
+ const onClearClick = () => storage.clear();
49
+ const onConsoleTab = () => {
50
+ state.tab = "console";
51
+ updateTabStyles();
52
+ bindings.renderActiveTab();
53
+ };
54
+ const onNetworkTab = () => {
55
+ state.tab = "network";
56
+ updateTabStyles();
57
+ bindings.renderActiveTab();
58
+ };
59
+ dom.toggleBtn.addEventListener("click", onToggleClick);
60
+ dom.closeBtn.addEventListener("click", onCloseClick);
61
+ dom.clearBtn.addEventListener("click", onClearClick);
62
+ dom.consoleTab.addEventListener("click", onConsoleTab);
63
+ dom.networkTab.addEventListener("click", onNetworkTab);
64
+ const destroy = () => {
65
+ dom.toggleBtn.removeEventListener("click", onToggleClick);
66
+ dom.closeBtn.removeEventListener("click", onCloseClick);
67
+ dom.clearBtn.removeEventListener("click", onClearClick);
68
+ dom.consoleTab.removeEventListener("click", onConsoleTab);
69
+ dom.networkTab.removeEventListener("click", onNetworkTab);
70
+ resizeControls.destroy();
71
+ bindings.destroy();
72
+ dom.root.remove();
73
+ };
74
+ return { open, close, toggle, destroy, isOpen: () => state.open };
75
+ }
@@ -0,0 +1,16 @@
1
+ import type { LogEntry } from "../../../utils/types";
2
+ import type { LogStorage } from "../../../storage/logStorage";
3
+ import type { PanelCountersDOM } from "../dom/types";
4
+ import type { PanelState } from "../state/types";
5
+ import type { DataBindings } from "./types";
6
+ export declare function bindStorageToPanelView(args: {
7
+ storage: LogStorage;
8
+ state: PanelState;
9
+ list: {
10
+ clear: () => void;
11
+ append: (entry: LogEntry) => void;
12
+ };
13
+ body: HTMLElement;
14
+ counters: PanelCountersDOM;
15
+ updateTabStyles: () => void;
16
+ }): DataBindings;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bindStorageToPanelView = bindStorageToPanelView;
4
+ function bindStorageToPanelView(args) {
5
+ const isConsoleError = (e) => e.source === "console" && e.level === "error";
6
+ const isNetworkError = (e) => e.source === "network" && (typeof e.status !== "number" || e.status >= 400);
7
+ const updateCounts = () => {
8
+ args.counters.headerConsoleCount.textContent = String(args.state.entries.console.length);
9
+ args.counters.headerNetworkCount.textContent = String(args.state.entries.network.length);
10
+ args.counters.toggleConsoleCount.textContent = String(args.state.entries.console.length);
11
+ args.counters.toggleNetworkCount.textContent = String(args.state.entries.network.length);
12
+ args.counters.toggleConsoleErrorCount.textContent = String(args.state.errorCounts.console);
13
+ args.counters.toggleNetworkErrorCount.textContent = String(args.state.errorCounts.network);
14
+ args.counters.toggleConsoleErrorWrap.style.display = args.state.errorCounts.console > 0 ? "inline-flex" : "none";
15
+ args.counters.toggleNetworkErrorWrap.style.display = args.state.errorCounts.network > 0 ? "inline-flex" : "none";
16
+ };
17
+ const renderActiveTab = () => {
18
+ args.list.clear();
19
+ args.state.entries[args.state.tab].forEach((e) => args.list.append(e));
20
+ args.body.scrollTop = args.body.scrollHeight;
21
+ };
22
+ const hydrate = () => {
23
+ args.state.entries.console = [];
24
+ args.state.entries.network = [];
25
+ args.state.errorCounts.console = 0;
26
+ args.state.errorCounts.network = 0;
27
+ args.storage.getAll().forEach((e) => {
28
+ if (e.source === "network") {
29
+ args.state.entries.network.push(e);
30
+ if (isNetworkError(e))
31
+ args.state.errorCounts.network += 1;
32
+ }
33
+ else {
34
+ args.state.entries.console.push(e);
35
+ if (isConsoleError(e))
36
+ args.state.errorCounts.console += 1;
37
+ }
38
+ });
39
+ updateCounts();
40
+ args.updateTabStyles();
41
+ renderActiveTab();
42
+ };
43
+ const onNewLog = (entry) => {
44
+ if (entry.source === "network") {
45
+ args.state.entries.network.push(entry);
46
+ if (isNetworkError(entry))
47
+ args.state.errorCounts.network += 1;
48
+ }
49
+ else {
50
+ args.state.entries.console.push(entry);
51
+ if (isConsoleError(entry))
52
+ args.state.errorCounts.console += 1;
53
+ }
54
+ updateCounts();
55
+ if (entry.source === args.state.tab) {
56
+ args.list.append(entry);
57
+ args.body.scrollTop = args.body.scrollHeight;
58
+ }
59
+ };
60
+ const unsub = args.storage.onNewLog(onNewLog);
61
+ const onCleared = () => {
62
+ args.state.entries.console = [];
63
+ args.state.entries.network = [];
64
+ args.state.errorCounts.console = 0;
65
+ args.state.errorCounts.network = 0;
66
+ updateCounts();
67
+ renderActiveTab();
68
+ };
69
+ args.storage.addEventListener("cleared", onCleared);
70
+ hydrate();
71
+ const destroy = () => {
72
+ args.storage.removeEventListener("cleared", onCleared);
73
+ unsub();
74
+ };
75
+ return { destroy, renderActiveTab, hydrate };
76
+ }
@@ -0,0 +1,2 @@
1
+ export { bindStorageToPanelView } from "./bindStorageToPanelView";
2
+ export type { DataBindings } from "./types";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bindStorageToPanelView = void 0;
4
+ var bindStorageToPanelView_1 = require("./bindStorageToPanelView");
5
+ Object.defineProperty(exports, "bindStorageToPanelView", { enumerable: true, get: function () { return bindStorageToPanelView_1.bindStorageToPanelView; } });
@@ -0,0 +1,5 @@
1
+ export type DataBindings = {
2
+ destroy: () => void;
3
+ renderActiveTab: () => void;
4
+ hydrate: () => void;
5
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ import type { PanelOptions } from "..";
2
+ import type { PanelDOM } from "./types";
3
+ export declare function buildPanelDOM(doc: Document, options: PanelOptions): PanelDOM;