dev-inspector 1.0.4 → 1.1.0

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 (86) hide show
  1. package/README.md +22 -1
  2. package/lib/init.d.ts +5 -2
  3. package/lib/init.js +5 -2
  4. package/lib/integrations/index.d.ts +2 -0
  5. package/lib/integrations/index.js +7 -0
  6. package/lib/integrations/jira/adf.d.ts +11 -0
  7. package/lib/integrations/jira/adf.js +17 -0
  8. package/lib/integrations/jira/client.d.ts +4 -0
  9. package/lib/integrations/jira/client.js +113 -0
  10. package/lib/integrations/jira/errors.d.ts +10 -0
  11. package/lib/integrations/jira/errors.js +13 -0
  12. package/lib/integrations/jira/index.d.ts +2 -0
  13. package/lib/integrations/jira/index.js +8 -0
  14. package/lib/integrations/types.d.ts +54 -0
  15. package/lib/integrations/types.js +2 -0
  16. package/lib/logger/networkLogger.js +41 -11
  17. package/lib/storage/localStorage.d.ts +30 -0
  18. package/lib/storage/localStorage.js +166 -0
  19. package/lib/ui/logList/createLogList.d.ts +2 -0
  20. package/lib/ui/logList/createLogList.js +67 -0
  21. package/lib/ui/logList/index.d.ts +2 -0
  22. package/lib/ui/logList/index.js +5 -0
  23. package/lib/ui/logList/networkDetails/copy.d.ts +2 -0
  24. package/lib/ui/logList/networkDetails/copy.js +101 -0
  25. package/lib/ui/logList/{networkDetails.d.ts → networkDetails/createNetworkDetails.d.ts} +1 -1
  26. package/lib/ui/logList/networkDetails/createNetworkDetails.js +61 -0
  27. package/lib/ui/logList/networkDetails/index.d.ts +1 -0
  28. package/lib/ui/logList/networkDetails/index.js +5 -0
  29. package/lib/ui/logList/networkDetails/renderValue.d.ts +2 -0
  30. package/lib/ui/logList/{networkDetails.js → networkDetails/renderValue.js} +32 -32
  31. package/lib/ui/logList/shared/consoleInspect.d.ts +1 -0
  32. package/lib/ui/logList/shared/consoleInspect.js +17 -0
  33. package/lib/ui/logList/shared/index.d.ts +3 -0
  34. package/lib/ui/logList/shared/index.js +11 -0
  35. package/lib/ui/logList/shared/time.d.ts +1 -0
  36. package/lib/ui/logList/shared/time.js +10 -0
  37. package/lib/ui/logList/shared/tone.d.ts +6 -0
  38. package/lib/ui/logList/shared/tone.js +36 -0
  39. package/lib/ui/logList/types.d.ts +6 -0
  40. package/lib/ui/logList/types.js +2 -0
  41. package/lib/ui/panel/behavior/setupPanelBehavior.d.ts +4 -1
  42. package/lib/ui/panel/behavior/setupPanelBehavior.js +48 -1
  43. package/lib/ui/panel/bindings/bindStorageToPanelView.d.ts +2 -0
  44. package/lib/ui/panel/bindings/bindStorageToPanelView.js +50 -6
  45. package/lib/ui/panel/bindings/matchesQuery.d.ts +2 -0
  46. package/lib/ui/panel/bindings/matchesQuery.js +54 -0
  47. package/lib/ui/panel/bindings/types.d.ts +2 -0
  48. package/lib/ui/panel/dom/buildPanelDOM.js +65 -6
  49. package/lib/ui/panel/dom/constants.d.ts +5 -1
  50. package/lib/ui/panel/dom/constants.js +35 -20
  51. package/lib/ui/panel/dom/types.d.ts +6 -0
  52. package/lib/ui/panel/index.d.ts +4 -0
  53. package/lib/ui/panel/index.js +8 -3
  54. package/lib/ui/panel/integrations/icons.d.ts +1 -0
  55. package/lib/ui/panel/integrations/icons.js +7 -0
  56. package/lib/ui/panel/integrations/index.d.ts +1 -0
  57. package/lib/ui/panel/integrations/index.js +5 -0
  58. package/lib/ui/panel/integrations/jiraDialog.d.ts +6 -0
  59. package/lib/ui/panel/integrations/jiraDialog.js +234 -0
  60. package/lib/ui/panel/integrations/screenshot.d.ts +4 -0
  61. package/lib/ui/panel/integrations/screenshot.js +51 -0
  62. package/lib/ui/panel/localStorage/createLocalStorageView.d.ts +4 -0
  63. package/lib/ui/panel/localStorage/createLocalStorageView.js +108 -0
  64. package/lib/ui/panel/localStorage/index.d.ts +3 -0
  65. package/lib/ui/panel/localStorage/index.js +7 -0
  66. package/lib/ui/panel/localStorage/setupLocalStorageSync.d.ts +9 -0
  67. package/lib/ui/panel/localStorage/setupLocalStorageSync.js +30 -0
  68. package/lib/ui/panel/localStorage/types.d.ts +6 -0
  69. package/lib/ui/panel/localStorage/types.js +2 -0
  70. package/lib/ui/panel/state/createPanelState.d.ts +2 -1
  71. package/lib/ui/panel/state/createPanelState.js +5 -1
  72. package/lib/ui/panel/state/types.d.ts +5 -0
  73. package/lib/ui/panel/theme/applyTheme.d.ts +2 -0
  74. package/lib/ui/panel/theme/applyTheme.js +6 -0
  75. package/lib/ui/panel/theme/index.d.ts +3 -0
  76. package/lib/ui/panel/theme/index.js +9 -0
  77. package/lib/ui/panel/theme/storage.d.ts +4 -0
  78. package/lib/ui/panel/theme/storage.js +45 -0
  79. package/lib/ui/panel/theme/types.d.ts +6 -0
  80. package/lib/ui/panel/theme/types.js +2 -0
  81. package/lib/ui/panelStyles.d.ts +1 -1
  82. package/lib/ui/panelStyles.js +557 -116
  83. package/lib/ui/shared/copy.d.ts +2 -0
  84. package/lib/ui/shared/copy.js +101 -0
  85. package/lib/utils/types.d.ts +3 -0
  86. package/package.json +1 -1
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLocalStorageAccess = getLocalStorageAccess;
4
+ exports.readLocalStorageSnapshot = readLocalStorageSnapshot;
5
+ exports.createLocalStorageWatcher = createLocalStorageWatcher;
6
+ function safeTruncate(value, maxLen) {
7
+ if (maxLen <= 0)
8
+ return "";
9
+ if (value.length <= maxLen)
10
+ return value;
11
+ return `${value.slice(0, maxLen)}…`;
12
+ }
13
+ function getLocalStorageAccess() {
14
+ try {
15
+ const w = globalThis;
16
+ const storage = w.localStorage;
17
+ if (!storage)
18
+ return { ok: false, message: "localStorage is not available in this environment." };
19
+ // Some environments expose the object but throw on access (privacy modes / blocked cookies).
20
+ void storage.length;
21
+ return { ok: true, storage };
22
+ }
23
+ catch (_a) {
24
+ return { ok: false, message: "localStorage access is blocked in this environment (privacy settings / permissions)." };
25
+ }
26
+ }
27
+ function readLocalStorageSnapshot(storage, opts) {
28
+ var _a;
29
+ const items = [];
30
+ let totalApproxBytes = 0;
31
+ const len = storage.length;
32
+ for (let i = 0; i < len; i += 1) {
33
+ const key = storage.key(i);
34
+ if (!key)
35
+ continue;
36
+ const value = (_a = storage.getItem(key)) !== null && _a !== void 0 ? _a : "";
37
+ const approxBytes = (key.length + value.length) * 2; // UTF-16-ish approximation
38
+ totalApproxBytes += approxBytes;
39
+ items.push({
40
+ key,
41
+ value,
42
+ preview: safeTruncate(value, opts.maxPreviewLength),
43
+ valueLength: value.length,
44
+ approxBytes,
45
+ });
46
+ }
47
+ items.sort((a, b) => a.key.localeCompare(b.key));
48
+ return { items, totalApproxBytes };
49
+ }
50
+ function buildSignature(storage) {
51
+ var _a;
52
+ try {
53
+ const parts = [String(storage.length)];
54
+ const len = storage.length;
55
+ for (let i = 0; i < len; i += 1) {
56
+ const k = storage.key(i);
57
+ if (!k)
58
+ continue;
59
+ const v = (_a = storage.getItem(k)) !== null && _a !== void 0 ? _a : "";
60
+ parts.push(`${k}:${v.length}`);
61
+ }
62
+ return parts.join("|");
63
+ }
64
+ catch (_b) {
65
+ return "err";
66
+ }
67
+ }
68
+ function createLocalStorageWatcher(args) {
69
+ var _a, _b, _c, _d;
70
+ const { storage, onChange } = args;
71
+ const pollIntervalMs = Math.max(250, args.pollIntervalMs);
72
+ let destroyed = false;
73
+ let lastSig = buildSignature(storage);
74
+ const trigger = () => {
75
+ if (destroyed)
76
+ return;
77
+ onChange();
78
+ };
79
+ const win = globalThis;
80
+ const onStorageEvent = () => {
81
+ const sig = buildSignature(storage);
82
+ if (sig !== lastSig) {
83
+ lastSig = sig;
84
+ trigger();
85
+ }
86
+ };
87
+ try {
88
+ (_a = win.addEventListener) === null || _a === void 0 ? void 0 : _a.call(win, "storage", onStorageEvent);
89
+ }
90
+ catch (_e) {
91
+ void 0;
92
+ }
93
+ // Same-tab changes don't fire "storage" events. We try to patch methods; if that fails, polling still keeps UI fresh.
94
+ const orig = {
95
+ setItem: (_b = storage.setItem) === null || _b === void 0 ? void 0 : _b.bind(storage),
96
+ removeItem: (_c = storage.removeItem) === null || _c === void 0 ? void 0 : _c.bind(storage),
97
+ clear: (_d = storage.clear) === null || _d === void 0 ? void 0 : _d.bind(storage),
98
+ };
99
+ const patch = () => {
100
+ try {
101
+ storage.setItem = ((key, value) => {
102
+ var _a;
103
+ (_a = orig.setItem) === null || _a === void 0 ? void 0 : _a.call(orig, key, value);
104
+ const sig = buildSignature(storage);
105
+ if (sig !== lastSig) {
106
+ lastSig = sig;
107
+ trigger();
108
+ }
109
+ });
110
+ storage.removeItem = ((key) => {
111
+ var _a;
112
+ (_a = orig.removeItem) === null || _a === void 0 ? void 0 : _a.call(orig, key);
113
+ const sig = buildSignature(storage);
114
+ if (sig !== lastSig) {
115
+ lastSig = sig;
116
+ trigger();
117
+ }
118
+ });
119
+ storage.clear = (() => {
120
+ var _a;
121
+ (_a = orig.clear) === null || _a === void 0 ? void 0 : _a.call(orig);
122
+ const sig = buildSignature(storage);
123
+ if (sig !== lastSig) {
124
+ lastSig = sig;
125
+ trigger();
126
+ }
127
+ });
128
+ return true;
129
+ }
130
+ catch (_a) {
131
+ return false;
132
+ }
133
+ };
134
+ const patched = patch();
135
+ const timer = globalThis.setInterval(() => {
136
+ const sig = buildSignature(storage);
137
+ if (sig !== lastSig) {
138
+ lastSig = sig;
139
+ trigger();
140
+ }
141
+ }, patched ? Math.max(800, pollIntervalMs) : pollIntervalMs);
142
+ const destroy = () => {
143
+ var _a;
144
+ destroyed = true;
145
+ globalThis.clearInterval(timer);
146
+ try {
147
+ (_a = win.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(win, "storage", onStorageEvent);
148
+ }
149
+ catch (_b) {
150
+ void 0;
151
+ }
152
+ // best-effort restore
153
+ try {
154
+ if (orig.setItem)
155
+ storage.setItem = orig.setItem;
156
+ if (orig.removeItem)
157
+ storage.removeItem = orig.removeItem;
158
+ if (orig.clear)
159
+ storage.clear = orig.clear;
160
+ }
161
+ catch (_c) {
162
+ void 0;
163
+ }
164
+ };
165
+ return { destroy, trigger };
166
+ }
@@ -0,0 +1,2 @@
1
+ import type { LogList } from "./types";
2
+ export declare function createLogList(doc: Document): LogList;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLogList = createLogList;
4
+ const jsonViewer_1 = require("../jsonViewer");
5
+ const networkDetails_1 = require("./networkDetails");
6
+ const shared_1 = require("./shared");
7
+ const shared_2 = require("./shared");
8
+ function createLogList(doc) {
9
+ const el = doc.createElement("ul");
10
+ el.className = "di-list";
11
+ const append = (entry) => {
12
+ const li = doc.createElement("li");
13
+ const tone = (0, shared_2.toneForEntry)(entry);
14
+ li.className = `di-item ${(0, shared_2.classForTone)(tone)}`;
15
+ const meta = doc.createElement("div");
16
+ meta.className = "di-meta";
17
+ const time = doc.createElement("span");
18
+ time.textContent = (0, shared_2.fmtTime)(entry.timestamp);
19
+ const source = doc.createElement("span");
20
+ source.textContent = entry.source;
21
+ const detail = doc.createElement("span");
22
+ if (entry.source === "console") {
23
+ detail.textContent = entry.level;
24
+ }
25
+ else {
26
+ detail.className = `di-statusChip ${(0, shared_2.isNetworkFailure)(entry) ? "di-statusChipError" : "di-statusChipSuccess"}`;
27
+ detail.textContent = typeof entry.status === "number" ? String(entry.status) : "ERR";
28
+ }
29
+ meta.append(time, source, detail);
30
+ li.append(meta);
31
+ if (entry.message && entry.message.trim().length > 0) {
32
+ const msg = doc.createElement("div");
33
+ msg.className = "di-msg";
34
+ msg.textContent = entry.message;
35
+ li.append(msg);
36
+ }
37
+ if (entry.source === "console") {
38
+ const inspectable = (0, shared_1.getInspectableArgs)(entry.args);
39
+ if (inspectable.length > 0) {
40
+ const details = doc.createElement("details");
41
+ details.className = "di-details";
42
+ const summary = doc.createElement("summary");
43
+ summary.className = "di-detailsSummary";
44
+ summary.textContent = "Inspect";
45
+ const viewerWrap = doc.createElement("div");
46
+ viewerWrap.className = "di-detailsBody";
47
+ viewerWrap.append((0, jsonViewer_1.createJsonViewer)(doc, inspectable.length === 1 ? inspectable[0] : inspectable, {
48
+ maxDepth: 6,
49
+ maxKeys: 200,
50
+ maxNodes: 2000,
51
+ }));
52
+ details.append(summary, viewerWrap);
53
+ li.append(details);
54
+ }
55
+ }
56
+ if (entry.source === "network") {
57
+ const details = (0, networkDetails_1.createNetworkDetails)(doc, entry);
58
+ if (details)
59
+ li.append(details);
60
+ }
61
+ el.append(li);
62
+ };
63
+ const clear = () => {
64
+ el.replaceChildren();
65
+ };
66
+ return { el, append, clear };
67
+ }
@@ -0,0 +1,2 @@
1
+ export { createLogList } from "./createLogList";
2
+ export type { LogList } from "./types";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLogList = void 0;
4
+ var createLogList_1 = require("./createLogList");
5
+ Object.defineProperty(exports, "createLogList", { enumerable: true, get: function () { return createLogList_1.createLogList; } });
@@ -0,0 +1,2 @@
1
+ export declare function launchMiniConfetti(anchor: HTMLElement): void;
2
+ export declare function copyText(text: string): Promise<boolean>;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.launchMiniConfetti = launchMiniConfetti;
4
+ exports.copyText = copyText;
5
+ function prefersReducedMotion() {
6
+ var _a, _b;
7
+ try {
8
+ const mm = globalThis;
9
+ 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;
10
+ }
11
+ catch (_c) {
12
+ return false;
13
+ }
14
+ }
15
+ function rand(min, max) {
16
+ return min + Math.random() * (max - min);
17
+ }
18
+ function launchMiniConfetti(anchor) {
19
+ if (prefersReducedMotion())
20
+ return;
21
+ if (typeof document === "undefined")
22
+ return;
23
+ const rect = anchor.getBoundingClientRect();
24
+ const cx = rect.left + rect.width / 2;
25
+ const cy = rect.top + rect.height / 2;
26
+ const root = document.createElement("div");
27
+ root.style.position = "fixed";
28
+ root.style.left = "0";
29
+ root.style.top = "0";
30
+ root.style.width = "0";
31
+ root.style.height = "0";
32
+ root.style.pointerEvents = "none";
33
+ root.style.zIndex = "2147483647";
34
+ document.body.append(root);
35
+ const colors = ["#a7ff00", "#7c5cff", "#00c4ff", "#ff9030", "#ef4444"];
36
+ const n = 14;
37
+ const duration = 520;
38
+ for (let i = 0; i < n; i += 1) {
39
+ const p = document.createElement("span");
40
+ const size = Math.round(rand(3, 6));
41
+ p.style.position = "fixed";
42
+ p.style.left = `${cx}px`;
43
+ p.style.top = `${cy}px`;
44
+ p.style.width = `${size}px`;
45
+ p.style.height = `${size}px`;
46
+ p.style.borderRadius = Math.random() < 0.35 ? "999px" : "2px";
47
+ p.style.background = colors[i % colors.length];
48
+ p.style.opacity = "1";
49
+ p.style.willChange = "transform, opacity";
50
+ root.append(p);
51
+ const angle = rand(0, Math.PI * 2);
52
+ const dist = rand(18, 46);
53
+ const dx = Math.cos(angle) * dist;
54
+ const dy = Math.sin(angle) * dist + rand(8, 16);
55
+ const rot = rand(-220, 220);
56
+ const delay = Math.round(rand(0, 60));
57
+ try {
58
+ const anim = p.animate([
59
+ { transform: `translate(-50%, -50%) translate(0px, 0px) rotate(0deg) scale(1)`, opacity: 1 },
60
+ { transform: `translate(-50%, -50%) translate(${dx}px, ${dy}px) rotate(${rot}deg) scale(0.9)`, opacity: 0 },
61
+ ], { duration, delay, easing: "cubic-bezier(0.2, 0.7, 0.2, 1)", fill: "forwards" });
62
+ anim.addEventListener("finish", () => p.remove());
63
+ }
64
+ catch (_a) {
65
+ globalThis.setTimeout(() => p.remove(), duration + delay + 50);
66
+ }
67
+ }
68
+ globalThis.setTimeout(() => root.remove(), duration + 120);
69
+ }
70
+ async function copyText(text) {
71
+ var _a, _b;
72
+ try {
73
+ const nav = globalThis;
74
+ const fn = (_b = (_a = nav.navigator) === null || _a === void 0 ? void 0 : _a.clipboard) === null || _b === void 0 ? void 0 : _b.writeText;
75
+ if (typeof fn === "function") {
76
+ await fn(text);
77
+ return true;
78
+ }
79
+ }
80
+ catch (_c) {
81
+ void 0;
82
+ }
83
+ try {
84
+ if (typeof document === "undefined")
85
+ return false;
86
+ const ta = document.createElement("textarea");
87
+ ta.value = text;
88
+ ta.setAttribute("readonly", "true");
89
+ ta.style.position = "fixed";
90
+ ta.style.left = "-9999px";
91
+ ta.style.top = "0";
92
+ document.body.append(ta);
93
+ ta.select();
94
+ const ok = document.execCommand("copy");
95
+ ta.remove();
96
+ return ok;
97
+ }
98
+ catch (_d) {
99
+ return false;
100
+ }
101
+ }
@@ -1,2 +1,2 @@
1
- import type { NetworkLogEntry } from "../../utils/types";
1
+ import type { NetworkLogEntry } from "../../../utils/types";
2
2
  export declare function createNetworkDetails(doc: Document, entry: NetworkLogEntry): HTMLElement | null;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNetworkDetails = createNetworkDetails;
4
+ const copy_1 = require("./copy");
5
+ const renderValue_1 = require("./renderValue");
6
+ function createBodyDetails(doc, title, value, truncated, maxLen) {
7
+ const details = doc.createElement("details");
8
+ details.className = "di-details di-netBodyDetails";
9
+ const summary = doc.createElement("summary");
10
+ summary.className = "di-detailsSummary di-netDetailsSummary";
11
+ const titleEl = doc.createElement("span");
12
+ titleEl.className = "di-netDetailsTitle";
13
+ titleEl.textContent = title;
14
+ const copyBtn = doc.createElement("button");
15
+ copyBtn.type = "button";
16
+ copyBtn.className = "di-copyBtn";
17
+ copyBtn.textContent = "Copy";
18
+ copyBtn.setAttribute("aria-label", `Copy ${title.toLowerCase()}`);
19
+ copyBtn.addEventListener("click", (ev) => {
20
+ ev.preventDefault();
21
+ ev.stopPropagation();
22
+ const txt = (0, renderValue_1.valueToCopyText)(value);
23
+ void (0, copy_1.copyText)(txt).then((ok) => {
24
+ if (!ok)
25
+ return;
26
+ (0, copy_1.launchMiniConfetti)(copyBtn);
27
+ const prev = copyBtn.textContent;
28
+ copyBtn.textContent = "Copied";
29
+ globalThis.setTimeout(() => {
30
+ copyBtn.textContent = prev !== null && prev !== void 0 ? prev : "Copy";
31
+ }, 900);
32
+ });
33
+ });
34
+ summary.append(titleEl, copyBtn);
35
+ const body = doc.createElement("div");
36
+ body.className = "di-detailsBody";
37
+ if (truncated) {
38
+ const warn = doc.createElement("div");
39
+ warn.className = "di-netTrunc";
40
+ warn.textContent = typeof maxLen === "number" ? `Truncated to first ${maxLen} characters.` : "Truncated.";
41
+ body.append(warn);
42
+ }
43
+ body.append((0, renderValue_1.valueToElement)(doc, value));
44
+ details.append(summary, body);
45
+ return details;
46
+ }
47
+ function createNetworkDetails(doc, entry) {
48
+ const hasReq = typeof entry.requestBody !== "undefined";
49
+ const hasRes = typeof entry.responseBody !== "undefined";
50
+ if (!hasReq && !hasRes)
51
+ return null;
52
+ const wrap = doc.createElement("div");
53
+ wrap.className = "di-netDetailsWrap";
54
+ if (hasReq) {
55
+ wrap.append(createBodyDetails(doc, "Request", entry.requestBody, entry.requestBodyTruncated === true, entry.bodyMaxLength));
56
+ }
57
+ if (hasRes) {
58
+ wrap.append(createBodyDetails(doc, "Response", entry.responseBody, entry.responseBodyTruncated === true, entry.bodyMaxLength));
59
+ }
60
+ return wrap;
61
+ }
@@ -0,0 +1 @@
1
+ export { createNetworkDetails } from "./createNetworkDetails";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNetworkDetails = void 0;
4
+ var createNetworkDetails_1 = require("./createNetworkDetails");
5
+ Object.defineProperty(exports, "createNetworkDetails", { enumerable: true, get: function () { return createNetworkDetails_1.createNetworkDetails; } });
@@ -0,0 +1,2 @@
1
+ export declare function valueToElement(doc: Document, value: unknown): HTMLElement;
2
+ export declare function valueToCopyText(value: unknown): string;
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createNetworkDetails = createNetworkDetails;
4
- const jsonViewer_1 = require("../jsonViewer");
3
+ exports.valueToElement = valueToElement;
4
+ exports.valueToCopyText = valueToCopyText;
5
+ const jsonViewer_1 = require("../../jsonViewer");
5
6
  function tryParseJson(text) {
6
7
  const t = text.trim();
7
8
  if (t.length < 2)
@@ -17,6 +18,29 @@ function tryParseJson(text) {
17
18
  return undefined;
18
19
  }
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
+ }
20
44
  function valueToElement(doc, value) {
21
45
  if (typeof value === "string") {
22
46
  const parsed = tryParseJson(value);
@@ -42,34 +66,10 @@ function valueToElement(doc, value) {
42
66
  }
43
67
  return (0, jsonViewer_1.createJsonViewer)(doc, value, { maxDepth: 6, maxKeys: 200, maxNodes: 2000 });
44
68
  }
45
- function appendSection(doc, wrap, label, value) {
46
- if (typeof value === "undefined")
47
- return;
48
- const section = doc.createElement("div");
49
- section.className = "di-netBodySection";
50
- const title = doc.createElement("div");
51
- title.className = "di-netBodyLabel";
52
- title.textContent = label;
53
- section.append(title, valueToElement(doc, value));
54
- wrap.append(section);
55
- }
56
- function createNetworkDetails(doc, entry) {
57
- const hasReq = typeof entry.requestBody !== "undefined";
58
- const hasRes = typeof entry.responseBody !== "undefined";
59
- if (!hasReq && !hasRes)
60
- return null;
61
- const details = doc.createElement("details");
62
- details.className = "di-details";
63
- const summary = doc.createElement("summary");
64
- summary.className = "di-detailsSummary";
65
- summary.textContent = "Body";
66
- const body = doc.createElement("div");
67
- body.className = "di-detailsBody";
68
- const grid = doc.createElement("div");
69
- grid.className = "di-netBodies";
70
- appendSection(doc, grid, "Request body", entry.requestBody);
71
- appendSection(doc, grid, "Response body", entry.responseBody);
72
- body.append(grid);
73
- details.append(summary, body);
74
- return details;
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
75
  }
@@ -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 });
@@ -2,4 +2,7 @@ import type { LogStorage } from "../../../storage/logStorage";
2
2
  import type { PanelHandle } from "..";
3
3
  import type { PanelDOM } from "../dom/types";
4
4
  import type { PanelState } from "../state/types";
5
- export declare function setupPanelBehavior(dom: PanelDOM, state: PanelState, storage: LogStorage): PanelHandle;
5
+ export declare function setupPanelBehavior(dom: PanelDOM, state: PanelState, storage: LogStorage, themeConfig: {
6
+ storageKey: string;
7
+ persist: boolean;
8
+ }): PanelHandle;