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.
- package/README.md +15 -48
- package/lib/index.d.ts +1 -6
- package/lib/index.js +1 -10
- package/lib/init.d.ts +11 -22
- package/lib/init.js +33 -24
- package/lib/ui/logList/networkDetails.d.ts +2 -0
- package/lib/ui/logList/networkDetails.js +75 -0
- package/lib/ui/logList.js +6 -0
- package/lib/ui/panel/behavior/index.d.ts +1 -0
- package/lib/ui/panel/behavior/index.js +5 -0
- package/lib/ui/panel/behavior/setupPanelBehavior.d.ts +5 -0
- package/lib/ui/panel/behavior/setupPanelBehavior.js +75 -0
- package/lib/ui/panel/bindings/bindStorageToPanelView.d.ts +16 -0
- package/lib/ui/panel/bindings/bindStorageToPanelView.js +76 -0
- package/lib/ui/panel/bindings/index.d.ts +2 -0
- package/lib/ui/panel/bindings/index.js +5 -0
- package/lib/ui/panel/bindings/types.d.ts +5 -0
- package/lib/ui/panel/bindings/types.js +2 -0
- package/lib/ui/panel/dom/buildPanelDOM.d.ts +3 -0
- package/lib/ui/panel/dom/buildPanelDOM.js +73 -0
- package/lib/ui/panel/dom/constants.d.ts +3 -0
- package/lib/ui/panel/dom/constants.js +28 -0
- package/lib/ui/panel/dom/index.d.ts +2 -0
- package/lib/ui/panel/dom/index.js +5 -0
- package/lib/ui/panel/dom/types.d.ts +25 -0
- package/lib/ui/panel/dom/types.js +2 -0
- package/lib/ui/panel/index.d.ts +15 -0
- package/lib/ui/panel/index.js +16 -0
- package/lib/ui/panel/resize/attachResizeHandling.d.ts +2 -0
- package/lib/ui/panel/resize/attachResizeHandling.js +94 -0
- package/lib/ui/panel/resize/index.d.ts +2 -0
- package/lib/ui/panel/resize/index.js +5 -0
- package/lib/ui/panel/resize/types.d.ts +3 -0
- package/lib/ui/panel/resize/types.js +2 -0
- package/lib/ui/panel/shared/dom.d.ts +1 -0
- package/lib/ui/panel/shared/dom.js +9 -0
- package/lib/ui/panel/shared/ensureDocument.d.ts +1 -0
- package/lib/ui/panel/shared/ensureDocument.js +9 -0
- package/lib/ui/panel/shared/ensureStyle.d.ts +1 -0
- package/lib/ui/panel/shared/ensureStyle.js +14 -0
- package/lib/ui/panel/shared/index.d.ts +6 -0
- package/lib/ui/panel/shared/index.js +13 -0
- package/lib/ui/panel/shared/math.d.ts +1 -0
- package/lib/ui/panel/shared/math.js +6 -0
- package/lib/ui/panel/shared/types.d.ts +11 -0
- package/lib/ui/panel/shared/types.js +2 -0
- package/lib/ui/panel/shared/window.d.ts +2 -0
- package/lib/ui/panel/shared/window.js +6 -0
- package/lib/ui/panel/state/createPanelState.d.ts +2 -0
- package/lib/ui/panel/state/createPanelState.js +11 -0
- package/lib/ui/panel/state/index.d.ts +2 -0
- package/lib/ui/panel/state/index.js +5 -0
- package/lib/ui/panel/state/types.d.ts +8 -0
- package/lib/ui/panel/state/types.js +2 -0
- package/lib/ui/panel.js +219 -186
- package/lib/ui/panelStyles.d.ts +1 -1
- package/lib/ui/panelStyles.js +22 -0
- package/package.json +16 -1
package/README.md
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
# Dev Inspector
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/dev-inspector)
|
|
4
|
+
[](https://www.npmjs.com/package/dev-inspector)
|
|
5
|
+
[](./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
|
+

|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
73
|
+
### `initDevInspector()`
|
|
107
74
|
|
|
108
|
-
-
|
|
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 {
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
3
|
+
panelOptions?: {
|
|
4
|
+
title?: string;
|
|
5
|
+
initiallyOpen?: boolean;
|
|
6
|
+
};
|
|
7
|
+
networkOptions?: {
|
|
8
|
+
includeBodies?: boolean;
|
|
9
|
+
maxBodyLength?: number;
|
|
10
|
+
};
|
|
15
11
|
};
|
|
16
|
-
export
|
|
17
|
-
|
|
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
|
|
12
|
-
|
|
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
|
|
41
|
+
panel.destroy();
|
|
32
42
|
}
|
|
33
43
|
catch (_a) {
|
|
34
44
|
void 0;
|
|
35
45
|
}
|
|
36
46
|
try {
|
|
37
|
-
consoleLogger
|
|
47
|
+
consoleLogger.uninstall();
|
|
38
48
|
}
|
|
39
49
|
catch (_b) {
|
|
40
50
|
void 0;
|
|
41
51
|
}
|
|
42
52
|
try {
|
|
43
|
-
networkLogger
|
|
53
|
+
networkLogger.uninstall();
|
|
44
54
|
}
|
|
45
55
|
catch (_c) {
|
|
46
56
|
void 0;
|
|
47
57
|
}
|
|
48
58
|
};
|
|
49
|
-
|
|
59
|
+
bag[key] = { destroy };
|
|
50
60
|
}
|
|
51
|
-
exports.init = initDevInspector;
|
|
@@ -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,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,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
|
+
}
|