dev-inspector 1.0.2 → 1.0.4

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 (58) 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/ui/logList/networkDetails.d.ts +2 -0
  7. package/lib/ui/logList/networkDetails.js +75 -0
  8. package/lib/ui/logList.js +6 -0
  9. package/lib/ui/panel/behavior/index.d.ts +1 -0
  10. package/lib/ui/panel/behavior/index.js +5 -0
  11. package/lib/ui/panel/behavior/setupPanelBehavior.d.ts +5 -0
  12. package/lib/ui/panel/behavior/setupPanelBehavior.js +75 -0
  13. package/lib/ui/panel/bindings/bindStorageToPanelView.d.ts +16 -0
  14. package/lib/ui/panel/bindings/bindStorageToPanelView.js +76 -0
  15. package/lib/ui/panel/bindings/index.d.ts +2 -0
  16. package/lib/ui/panel/bindings/index.js +5 -0
  17. package/lib/ui/panel/bindings/types.d.ts +5 -0
  18. package/lib/ui/panel/bindings/types.js +2 -0
  19. package/lib/ui/panel/dom/buildPanelDOM.d.ts +3 -0
  20. package/lib/ui/panel/dom/buildPanelDOM.js +73 -0
  21. package/lib/ui/panel/dom/constants.d.ts +3 -0
  22. package/lib/ui/panel/dom/constants.js +28 -0
  23. package/lib/ui/panel/dom/index.d.ts +2 -0
  24. package/lib/ui/panel/dom/index.js +5 -0
  25. package/lib/ui/panel/dom/types.d.ts +25 -0
  26. package/lib/ui/panel/dom/types.js +2 -0
  27. package/lib/ui/panel/index.d.ts +15 -0
  28. package/lib/ui/panel/index.js +16 -0
  29. package/lib/ui/panel/resize/attachResizeHandling.d.ts +2 -0
  30. package/lib/ui/panel/resize/attachResizeHandling.js +94 -0
  31. package/lib/ui/panel/resize/index.d.ts +2 -0
  32. package/lib/ui/panel/resize/index.js +5 -0
  33. package/lib/ui/panel/resize/types.d.ts +3 -0
  34. package/lib/ui/panel/resize/types.js +2 -0
  35. package/lib/ui/panel/shared/dom.d.ts +1 -0
  36. package/lib/ui/panel/shared/dom.js +9 -0
  37. package/lib/ui/panel/shared/ensureDocument.d.ts +1 -0
  38. package/lib/ui/panel/shared/ensureDocument.js +9 -0
  39. package/lib/ui/panel/shared/ensureStyle.d.ts +1 -0
  40. package/lib/ui/panel/shared/ensureStyle.js +14 -0
  41. package/lib/ui/panel/shared/index.d.ts +6 -0
  42. package/lib/ui/panel/shared/index.js +13 -0
  43. package/lib/ui/panel/shared/math.d.ts +1 -0
  44. package/lib/ui/panel/shared/math.js +6 -0
  45. package/lib/ui/panel/shared/types.d.ts +11 -0
  46. package/lib/ui/panel/shared/types.js +2 -0
  47. package/lib/ui/panel/shared/window.d.ts +2 -0
  48. package/lib/ui/panel/shared/window.js +6 -0
  49. package/lib/ui/panel/state/createPanelState.d.ts +2 -0
  50. package/lib/ui/panel/state/createPanelState.js +11 -0
  51. package/lib/ui/panel/state/index.d.ts +2 -0
  52. package/lib/ui/panel/state/index.js +5 -0
  53. package/lib/ui/panel/state/types.d.ts +8 -0
  54. package/lib/ui/panel/state/types.js +2 -0
  55. package/lib/ui/panel.js +219 -186
  56. package/lib/ui/panelStyles.d.ts +1 -1
  57. package/lib/ui/panelStyles.js +22 -0
  58. package/package.json +16 -1
package/README.md CHANGED
@@ -1,7 +1,18 @@
1
1
  # Dev Inspector
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/dev-inspector.svg)](https://www.npmjs.com/package/dev-inspector)
4
+ [![downloads](https://img.shields.io/npm/dm/dev-inspector.svg)](https://www.npmjs.com/package/dev-inspector)
5
+ [![license](https://img.shields.io/npm/l/dev-inspector.svg)](./LICENSE)
6
+
3
7
  In-page devtools-style logger panel for web apps. Capture **console** and **network** activity, store it in memory, and render it inside a lightweight UI panel.
4
8
 
9
+ ![Dev Inspector preview](./assets/dev-inspector.png)
10
+
11
+ ## Links
12
+
13
+ - **Website / Live demo**: `https://dev-inspector.alibugatekin.com/`
14
+ - **npm**: `https://www.npmjs.com/package/dev-inspector`
15
+
5
16
  ## Features
6
17
 
7
18
  - Console interception: `log/info/warn/error/debug`
@@ -48,22 +59,7 @@ async function initInBrowser() {
48
59
  initInBrowser();
49
60
  ```
50
61
 
51
- If you want manual control, you can keep the returned handles:
52
-
53
- ```ts
54
- import { initDevInspector } from "dev-inspector";
55
-
56
- const { storage, destroy } = initDevInspector({
57
- maxSize: 500,
58
- networkOptions: { includeBodies: false },
59
- panelOptions: { initiallyOpen: true, title: "Dev Inspector" },
60
- });
61
-
62
- storage.clear();
63
- destroy();
64
- ```
65
-
66
- ## Demo (Development)
62
+ ## Demo (Local development)
67
63
 
68
64
  ```bash
69
65
  npm install
@@ -72,40 +68,11 @@ npm run demo
72
68
 
73
69
  The demo page includes interactive generators for console logs and network requests so you can verify the panel quickly.
74
70
 
75
- ## API (Summary)
76
-
77
- ### `initDevInspector(options)`
78
-
79
- One-call integration that wires storage + loggers + UI.
80
-
81
- - `initDevInspector({ maxSize?, console?, network?, panel?, consoleLevels?, networkOptions?, panelOptions?, storage? })`
82
- - returns `{ storage, panel?, consoleLogger?, networkLogger?, destroy }`
83
-
84
- ### `LogStorage`
85
-
86
- - `new LogStorage({ maxSize?: number })`
87
- - `add(entry: LogEntry): void`
88
- - `getAll(): LogEntry[]`
89
- - `clear(): void` (emits `cleared`)
90
- - `onNewLog((entry) => void): () => void` (subscribe/unsubscribe)
91
-
92
- ### `installConsoleLogger(options)`
93
-
94
- Installs console interception and emits `LogEntry` objects.
95
-
96
- - `installConsoleLogger({ emit, levels? }) -> { uninstall, installed }`
97
-
98
- ### `installNetworkLogger(options)`
99
-
100
- Installs network interception for `fetch` and `XMLHttpRequest` and emits `LogEntry` objects.
101
-
102
- - `installNetworkLogger({ emit, includeBodies?, maxBodyLength? }) -> { uninstall, installed }`
103
-
104
- ### `createPanel(options)`
71
+ ## API
105
72
 
106
- Renders the UI panel and connects it to a `LogStorage`.
73
+ ### `initDevInspector()`
107
74
 
108
- - `createPanel({ storage, title?, initiallyOpen?, mount? }) -> { open, close, toggle, destroy, isOpen }`
75
+ One-call integration that installs console + network interception and renders the UI panel.
109
76
 
110
77
  ## Environment Notes
111
78
 
package/lib/index.d.ts CHANGED
@@ -1,6 +1 @@
1
- export { installConsoleLogger, type ConsoleLoggerHandle, type ConsoleLoggerOptions, } from "./logger/consoleLogger";
2
- export { installNetworkLogger, type NetworkLoggerHandle, type NetworkLoggerOptions } from "./logger/networkLogger";
3
- export { LogStorage, type LogStorageOptions } from "./storage/logStorage";
4
- export { createPanel, type PanelHandle, type PanelOptions } from "./ui/panel";
5
- export { init, initDevInspector, type DevInspectorHandle, type DevInspectorInitOptions } from "./init";
6
- export type { ConsoleLogLevel, LogEntry, LogSource } from "./utils/types";
1
+ export { initDevInspector } from "./init";
package/lib/index.js CHANGED
@@ -1,14 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.initDevInspector = exports.init = exports.createPanel = exports.LogStorage = exports.installNetworkLogger = exports.installConsoleLogger = void 0;
4
- var consoleLogger_1 = require("./logger/consoleLogger");
5
- Object.defineProperty(exports, "installConsoleLogger", { enumerable: true, get: function () { return consoleLogger_1.installConsoleLogger; } });
6
- var networkLogger_1 = require("./logger/networkLogger");
7
- Object.defineProperty(exports, "installNetworkLogger", { enumerable: true, get: function () { return networkLogger_1.installNetworkLogger; } });
8
- var logStorage_1 = require("./storage/logStorage");
9
- Object.defineProperty(exports, "LogStorage", { enumerable: true, get: function () { return logStorage_1.LogStorage; } });
10
- var panel_1 = require("./ui/panel");
11
- Object.defineProperty(exports, "createPanel", { enumerable: true, get: function () { return panel_1.createPanel; } });
3
+ exports.initDevInspector = void 0;
12
4
  var init_1 = require("./init");
13
- Object.defineProperty(exports, "init", { enumerable: true, get: function () { return init_1.init; } });
14
5
  Object.defineProperty(exports, "initDevInspector", { enumerable: true, get: function () { return init_1.initDevInspector; } });
package/lib/init.d.ts CHANGED
@@ -1,24 +1,13 @@
1
- import { type ConsoleLoggerHandle } from "./logger/consoleLogger";
2
- import { type NetworkLoggerHandle, type NetworkLoggerOptions } from "./logger/networkLogger";
3
- import { LogStorage } from "./storage/logStorage";
4
- import { type PanelHandle, type PanelOptions } from "./ui/panel";
5
- import type { ConsoleLogLevel } from "./utils/types";
6
- export type DevInspectorInitOptions = {
1
+ type InitOptions = {
7
2
  maxSize?: number;
8
- storage?: LogStorage;
9
- panel?: boolean;
10
- panelOptions?: Omit<PanelOptions, "storage">;
11
- console?: boolean;
12
- consoleLevels?: ConsoleLogLevel[];
13
- network?: boolean;
14
- networkOptions?: Omit<NetworkLoggerOptions, "emit">;
3
+ panelOptions?: {
4
+ title?: string;
5
+ initiallyOpen?: boolean;
6
+ };
7
+ networkOptions?: {
8
+ includeBodies?: boolean;
9
+ maxBodyLength?: number;
10
+ };
15
11
  };
16
- export type DevInspectorHandle = {
17
- storage: LogStorage;
18
- panel?: PanelHandle;
19
- consoleLogger?: ConsoleLoggerHandle;
20
- networkLogger?: NetworkLoggerHandle;
21
- destroy: () => void;
22
- };
23
- export declare function initDevInspector(options?: DevInspectorInitOptions): DevInspectorHandle;
24
- export declare const init: typeof initDevInspector;
12
+ export declare function initDevInspector(options?: InitOptions): void;
13
+ export {};
package/lib/init.js CHANGED
@@ -1,51 +1,60 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.init = void 0;
4
3
  exports.initDevInspector = initDevInspector;
5
4
  const consoleLogger_1 = require("./logger/consoleLogger");
6
5
  const networkLogger_1 = require("./logger/networkLogger");
7
6
  const logStorage_1 = require("./storage/logStorage");
8
7
  const panel_1 = require("./ui/panel");
8
+ function getGlobalInstanceKey() {
9
+ return Symbol.for("dev-inspector.instance");
10
+ }
11
+ function getGlobalBag() {
12
+ return globalThis;
13
+ }
9
14
  function initDevInspector(options = {}) {
10
- var _a, _b, _c, _d, _e, _f;
11
- const storage = (_a = options.storage) !== null && _a !== void 0 ? _a : new logStorage_1.LogStorage({
12
- maxSize: options.maxSize,
15
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
16
+ const key = getGlobalInstanceKey();
17
+ const bag = getGlobalBag();
18
+ const prev = bag[key];
19
+ if (prev) {
20
+ try {
21
+ prev.destroy();
22
+ }
23
+ catch (_k) {
24
+ void 0;
25
+ }
26
+ }
27
+ const storage = new logStorage_1.LogStorage({ maxSize: (_a = options.maxSize) !== null && _a !== void 0 ? _a : 500 });
28
+ const consoleLogger = (0, consoleLogger_1.installConsoleLogger)({ emit: (e) => storage.add(e) });
29
+ const networkLogger = (0, networkLogger_1.installNetworkLogger)({
30
+ emit: (e) => storage.add(e),
31
+ includeBodies: (_c = (_b = options.networkOptions) === null || _b === void 0 ? void 0 : _b.includeBodies) !== null && _c !== void 0 ? _c : false,
32
+ maxBodyLength: (_e = (_d = options.networkOptions) === null || _d === void 0 ? void 0 : _d.maxBodyLength) !== null && _e !== void 0 ? _e : 20000,
33
+ });
34
+ const panel = (0, panel_1.createPanel)({
35
+ storage,
36
+ initiallyOpen: (_g = (_f = options.panelOptions) === null || _f === void 0 ? void 0 : _f.initiallyOpen) !== null && _g !== void 0 ? _g : true,
37
+ title: (_j = (_h = options.panelOptions) === null || _h === void 0 ? void 0 : _h.title) !== null && _j !== void 0 ? _j : "Dev Inspector",
13
38
  });
14
- const consoleEnabled = (_b = options.console) !== null && _b !== void 0 ? _b : true;
15
- const networkEnabled = (_c = options.network) !== null && _c !== void 0 ? _c : true;
16
- const panelEnabled = (_d = options.panel) !== null && _d !== void 0 ? _d : true;
17
- const consoleLogger = consoleEnabled
18
- ? (0, consoleLogger_1.installConsoleLogger)({
19
- emit: (e) => storage.add(e),
20
- levels: options.consoleLevels,
21
- })
22
- : undefined;
23
- const networkLogger = networkEnabled
24
- ? (0, networkLogger_1.installNetworkLogger)(Object.assign({ emit: (e) => storage.add(e) }, ((_e = options.networkOptions) !== null && _e !== void 0 ? _e : {})))
25
- : undefined;
26
- const panel = panelEnabled
27
- ? (0, panel_1.createPanel)(Object.assign({ storage }, ((_f = options.panelOptions) !== null && _f !== void 0 ? _f : {})))
28
- : undefined;
29
39
  const destroy = () => {
30
40
  try {
31
- panel === null || panel === void 0 ? void 0 : panel.destroy();
41
+ panel.destroy();
32
42
  }
33
43
  catch (_a) {
34
44
  void 0;
35
45
  }
36
46
  try {
37
- consoleLogger === null || consoleLogger === void 0 ? void 0 : consoleLogger.uninstall();
47
+ consoleLogger.uninstall();
38
48
  }
39
49
  catch (_b) {
40
50
  void 0;
41
51
  }
42
52
  try {
43
- networkLogger === null || networkLogger === void 0 ? void 0 : networkLogger.uninstall();
53
+ networkLogger.uninstall();
44
54
  }
45
55
  catch (_c) {
46
56
  void 0;
47
57
  }
48
58
  };
49
- return { storage, panel, consoleLogger, networkLogger, destroy };
59
+ bag[key] = { destroy };
50
60
  }
51
- exports.init = initDevInspector;
@@ -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,75 @@
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 valueToElement(doc, value) {
21
+ if (typeof value === "string") {
22
+ const parsed = tryParseJson(value);
23
+ if (parsed && typeof parsed === "object") {
24
+ return (0, jsonViewer_1.createJsonViewer)(doc, parsed, { maxDepth: 6, maxKeys: 200, maxNodes: 2000 });
25
+ }
26
+ const el = doc.createElement("div");
27
+ el.className = "di-netBodyText";
28
+ el.textContent = value;
29
+ return el;
30
+ }
31
+ if (value instanceof Error) {
32
+ const el = doc.createElement("div");
33
+ el.className = "di-netBodyText";
34
+ el.textContent = `${value.name}: ${value.message}`;
35
+ return el;
36
+ }
37
+ if (value === null || typeof value !== "object") {
38
+ const el = doc.createElement("div");
39
+ el.className = "di-netBodyText";
40
+ el.textContent = String(value);
41
+ return el;
42
+ }
43
+ return (0, jsonViewer_1.createJsonViewer)(doc, value, { maxDepth: 6, maxKeys: 200, maxNodes: 2000 });
44
+ }
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;
75
+ }
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;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildPanelDOM = buildPanelDOM;
4
+ const logList_1 = require("../../logList");
5
+ const shared_1 = require("../shared");
6
+ const constants_1 = require("./constants");
7
+ function buildPanelDOM(doc, options) {
8
+ var _a, _b;
9
+ const mount = (_a = options.mount) !== null && _a !== void 0 ? _a : doc.body;
10
+ const title = (_b = options.title) !== null && _b !== void 0 ? _b : "Dev Inspector";
11
+ const root = doc.createElement("div");
12
+ root.className = "di-root";
13
+ const toggleBtn = doc.createElement("button");
14
+ toggleBtn.type = "button";
15
+ toggleBtn.className = "di-toggle";
16
+ toggleBtn.setAttribute("aria-label", "Dev Inspector");
17
+ toggleBtn.innerHTML = constants_1.TOGGLE_BUTTON_HTML;
18
+ const panel = doc.createElement("div");
19
+ panel.className = "di-panel";
20
+ const resizeHandle = doc.createElement("div");
21
+ resizeHandle.className = "di-resizeHandle";
22
+ resizeHandle.setAttribute("role", "separator");
23
+ resizeHandle.setAttribute("aria-label", "Resize panel");
24
+ const header = doc.createElement("div");
25
+ header.className = "di-header";
26
+ const headerRow = doc.createElement("div");
27
+ headerRow.className = "di-headerRow";
28
+ const titleEl = doc.createElement("div");
29
+ titleEl.className = "di-title";
30
+ titleEl.textContent = title;
31
+ const actions = doc.createElement("div");
32
+ actions.className = "di-actions";
33
+ const clearBtn = doc.createElement("button");
34
+ clearBtn.type = "button";
35
+ clearBtn.className = "di-btn";
36
+ clearBtn.textContent = "Clear";
37
+ const closeBtn = doc.createElement("button");
38
+ closeBtn.type = "button";
39
+ closeBtn.className = "di-btn";
40
+ closeBtn.textContent = "Close";
41
+ actions.append(clearBtn, closeBtn);
42
+ headerRow.append(resizeHandle, titleEl, actions);
43
+ const tabs = doc.createElement("div");
44
+ tabs.className = "di-tabs";
45
+ const consoleTab = doc.createElement("button");
46
+ consoleTab.type = "button";
47
+ consoleTab.className = "di-tab";
48
+ consoleTab.innerHTML = constants_1.CONSOLE_TAB_HTML;
49
+ const networkTab = doc.createElement("button");
50
+ networkTab.type = "button";
51
+ networkTab.className = "di-tab";
52
+ networkTab.innerHTML = constants_1.NETWORK_TAB_HTML;
53
+ tabs.append(consoleTab, networkTab);
54
+ header.append(headerRow, tabs);
55
+ const body = doc.createElement("div");
56
+ body.className = "di-body";
57
+ const list = (0, logList_1.createLogList)(doc);
58
+ body.append(list.el);
59
+ panel.append(header, body);
60
+ root.append(toggleBtn, panel);
61
+ mount.append(root);
62
+ const counters = {
63
+ headerConsoleCount: (0, shared_1.queryOrThrow)(header, '[data-di-count="console"]'),
64
+ headerNetworkCount: (0, shared_1.queryOrThrow)(header, '[data-di-count="network"]'),
65
+ toggleConsoleCount: (0, shared_1.queryOrThrow)(toggleBtn, '[data-di-toggle-count-value="console"]'),
66
+ toggleNetworkCount: (0, shared_1.queryOrThrow)(toggleBtn, '[data-di-toggle-count-value="network"]'),
67
+ toggleConsoleErrorCount: (0, shared_1.queryOrThrow)(toggleBtn, '[data-di-toggle-error-value="console"]'),
68
+ toggleNetworkErrorCount: (0, shared_1.queryOrThrow)(toggleBtn, '[data-di-toggle-error-value="network"]'),
69
+ toggleConsoleErrorWrap: (0, shared_1.queryOrThrow)(toggleBtn, '[data-di-toggle-error="console"]'),
70
+ toggleNetworkErrorWrap: (0, shared_1.queryOrThrow)(toggleBtn, '[data-di-toggle-error="network"]'),
71
+ };
72
+ return { root, toggleBtn, panel, header, body, closeBtn, clearBtn, consoleTab, networkTab, resizeHandle, list, counters };
73
+ }
@@ -0,0 +1,3 @@
1
+ export declare const TOGGLE_BUTTON_HTML: string;
2
+ export declare const CONSOLE_TAB_HTML: string;
3
+ export declare const NETWORK_TAB_HTML: string;