@kamod-ch/otok-devtools 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.
- package/LICENSE +21 -0
- package/README.md +50 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/mount.d.ts +5 -0
- package/dist/client/mount.d.ts.map +1 -0
- package/dist/client/mount.js +54 -0
- package/dist/client/mount.js.map +1 -0
- package/dist/client/panel.d.ts +9 -0
- package/dist/client/panel.d.ts.map +1 -0
- package/dist/client/panel.js +101 -0
- package/dist/client/panel.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/server/api.d.ts +3 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +29 -0
- package/dist/server/api.js.map +1 -0
- package/dist/vite/plugin.d.ts +7 -0
- package/dist/vite/plugin.d.ts.map +1 -0
- package/dist/vite/plugin.js +37 -0
- package/dist/vite/plugin.js.map +1 -0
- package/package.json +57 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kamod
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# @kamod-ch/otok-devtools
|
|
2
|
+
|
|
3
|
+
Development-only diagnostics for Otok apps.
|
|
4
|
+
|
|
5
|
+
The package exposes a stable JSON feed and a minimal floating Preact panel. It never ships in production bundles and never renders secrets, cookies, tokens, or full form payloads.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Development dependency only:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pnpm add -D @kamod-ch/otok-devtools
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Setup
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
// otok.config.ts
|
|
19
|
+
import { defineConfig } from "@kamod-ch/otok";
|
|
20
|
+
import devtools from "@kamod-ch/otok-devtools";
|
|
21
|
+
|
|
22
|
+
export default defineConfig({
|
|
23
|
+
plugins: [devtools()],
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Run the app with `pnpm dev`. Open the **Otok Devtools** button in the bottom-right corner.
|
|
28
|
+
|
|
29
|
+
## Data source
|
|
30
|
+
|
|
31
|
+
`GET /__otok_devtools` returns a sanitized snapshot:
|
|
32
|
+
|
|
33
|
+
- route tree (loaders, actions, middleware count, CSR flag)
|
|
34
|
+
- latest requests with SSR / CSR / island mode
|
|
35
|
+
- middleware, loader, and action timings
|
|
36
|
+
- redirects and validation markers
|
|
37
|
+
- active locale and non-sensitive auth status (`userId`, roles only)
|
|
38
|
+
- island ids rendered on the page
|
|
39
|
+
|
|
40
|
+
## Production exclusion
|
|
41
|
+
|
|
42
|
+
- Plugin hooks run only when `mode === "development"`.
|
|
43
|
+
- The Vite plugin uses `apply: "serve"`.
|
|
44
|
+
- The client panel mounts only when `import.meta.env.DEV` is true.
|
|
45
|
+
|
|
46
|
+
Do not import `@kamod-ch/otok-devtools/client` from application code that also ships to production. Keep the plugin in `otok.config.ts` and rely on development installs only.
|
|
47
|
+
|
|
48
|
+
## Example
|
|
49
|
+
|
|
50
|
+
See [`examples/devtools-demo`](../../examples/devtools-demo).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/client/mount.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,IAAI,CAUhF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { h, render } from "preact";
|
|
2
|
+
import { useEffect, useState } from "preact/hooks";
|
|
3
|
+
import { DevtoolsPanel } from "./panel.js";
|
|
4
|
+
export function mountDevtoolsPanel(options = {}) {
|
|
5
|
+
if (typeof document === "undefined")
|
|
6
|
+
return;
|
|
7
|
+
if (typeof import.meta !== "undefined" && !import.meta.env?.DEV) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const host = document.createElement("div");
|
|
11
|
+
host.id = "otok-devtools-root";
|
|
12
|
+
document.body.appendChild(host);
|
|
13
|
+
render(h(DevtoolsShell, { endpoint: options.endpoint ?? "/__otok_devtools" }), host);
|
|
14
|
+
}
|
|
15
|
+
function DevtoolsShell({ endpoint }) {
|
|
16
|
+
const [open, setOpen] = useState(false);
|
|
17
|
+
const [snapshot, setSnapshot] = useState(null);
|
|
18
|
+
const [error, setError] = useState(null);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (!open)
|
|
21
|
+
return;
|
|
22
|
+
let cancelled = false;
|
|
23
|
+
async function load() {
|
|
24
|
+
try {
|
|
25
|
+
const response = await fetch(endpoint, { credentials: "same-origin" });
|
|
26
|
+
if (!response.ok)
|
|
27
|
+
throw new Error(`HTTP ${response.status}`);
|
|
28
|
+
const payload = (await response.json());
|
|
29
|
+
if (!cancelled) {
|
|
30
|
+
setSnapshot(payload);
|
|
31
|
+
setError(null);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (loadError) {
|
|
35
|
+
if (!cancelled) {
|
|
36
|
+
setError(loadError instanceof Error ? loadError.message : String(loadError));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
void load();
|
|
41
|
+
const timer = window.setInterval(() => void load(), 2000);
|
|
42
|
+
return () => {
|
|
43
|
+
cancelled = true;
|
|
44
|
+
window.clearInterval(timer);
|
|
45
|
+
};
|
|
46
|
+
}, [endpoint, open]);
|
|
47
|
+
return h(DevtoolsPanel, {
|
|
48
|
+
open,
|
|
49
|
+
snapshot: snapshot?.snapshot ?? null,
|
|
50
|
+
error,
|
|
51
|
+
onToggle: () => setOpen((value) => !value),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=mount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/client/mount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAM3C,MAAM,UAAU,kBAAkB,CAAC,UAAqC,EAAE;IACxE,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,CAAE,MAAM,CAAC,IAAiD,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QAC9G,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,EAAE,GAAG,oBAAoB,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,QAAQ,EAAwB;IACvD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAkC,IAAI,CAAC,CAAC;IAChF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,KAAK,UAAU,IAAI;YACjB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;gBACvE,IAAI,CAAC,QAAQ,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA6B,CAAC;gBACpE,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,WAAW,CAAC,OAAO,CAAC,CAAC;oBACrB,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,QAAQ,CAAC,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1D,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAErB,OAAO,CAAC,CAAC,aAAa,EAAE;QACtB,IAAI;QACJ,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI;QACpC,KAAK;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC;KAC3C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OtokDevtoolsSnapshot } from "@kamod-ch/otok/devtools";
|
|
2
|
+
export interface DevtoolsPanelProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
snapshot: OtokDevtoolsSnapshot | null;
|
|
5
|
+
error: string | null;
|
|
6
|
+
onToggle: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function DevtoolsPanel({ open, snapshot, error, onToggle }: DevtoolsPanelProps): import("preact").VNode<import("preact").ClassAttributes<HTMLElement> & import("preact").HTMLAttributes<HTMLElement>>;
|
|
9
|
+
//# sourceMappingURL=panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/client/panel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAcD,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,wHAkBpF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { h } from "preact";
|
|
2
|
+
const styles = {
|
|
3
|
+
toggle: "position:fixed;bottom:16px;right:16px;z-index:99999;background:#111827;color:#f9fafb;border:1px solid #374151;border-radius:999px;padding:10px 14px;font:600 12px/1 system-ui,sans-serif;cursor:pointer;",
|
|
4
|
+
panel: "position:fixed;bottom:64px;right:16px;z-index:99999;width:min(420px,calc(100vw - 32px));max-height:min(70vh,640px);overflow:auto;background:#0b1220;color:#e5e7eb;border:1px solid #1f2937;border-radius:12px;box-shadow:0 20px 60px rgba(0,0,0,.35);font:12px/1.45 ui-monospace,SFMono-Regular,Menlo,monospace;",
|
|
5
|
+
header: "position:sticky;top:0;display:flex;justify-content:space-between;align-items:center;padding:12px 14px;background:#111827;border-bottom:1px solid #1f2937;",
|
|
6
|
+
section: "padding:12px 14px;border-bottom:1px solid #1f2937;",
|
|
7
|
+
badge: "display:inline-block;padding:2px 6px;border-radius:999px;background:#1d4ed8;color:#eff6ff;font-size:10px;",
|
|
8
|
+
muted: "color:#9ca3af",
|
|
9
|
+
};
|
|
10
|
+
export function DevtoolsPanel({ open, snapshot, error, onToggle }) {
|
|
11
|
+
return h("div", null, [
|
|
12
|
+
h("button", { type: "button", style: styles.toggle, onClick: onToggle }, open ? "Close Otok Devtools" : "Otok Devtools"),
|
|
13
|
+
open
|
|
14
|
+
? h("div", { style: styles.panel, role: "region", "aria-label": "Otok Devtools" }, [
|
|
15
|
+
h("div", { style: styles.header }, [
|
|
16
|
+
h("strong", null, "Otok Devtools"),
|
|
17
|
+
h("span", { style: styles.muted }, snapshot ? new Date(snapshot.updatedAt).toLocaleTimeString() : "—"),
|
|
18
|
+
]),
|
|
19
|
+
error ? h(Section, { title: "Error" }, h("p", null, error)) : null,
|
|
20
|
+
snapshot ? h(SnapshotView, { snapshot }) : h(Section, { title: "Loading" }, h("p", { style: styles.muted }, "Waiting for snapshot…")),
|
|
21
|
+
])
|
|
22
|
+
: null,
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
25
|
+
function SnapshotView({ snapshot }) {
|
|
26
|
+
const latest = snapshot.requests.at(-1);
|
|
27
|
+
return h("div", null, [
|
|
28
|
+
h(Section, { title: "Route tree" }, h(RouteTree, { routes: snapshot.routes })),
|
|
29
|
+
h(Section, { title: "Plugins" }, h(List, { items: snapshot.plugins.map((plugin) => `${plugin.name}${plugin.version ? `@${plugin.version}` : ""}`) })),
|
|
30
|
+
h(Section, { title: "Latest request" }, latest ? h(LatestRequest, { request: latest }) : h("p", { style: styles.muted }, "No requests yet.")),
|
|
31
|
+
h(Section, { title: "Middleware timing" }, h(TimingList, { items: snapshot.middleware.slice(-8) })),
|
|
32
|
+
h(Section, { title: "Loader / action timing" }, h(LoaderTimingList, { items: snapshot.loaders.slice(-8) })),
|
|
33
|
+
h(Section, { title: "Plugin hooks" }, h(TimingList, { items: snapshot.pluginHooks.slice(-8).map((item) => ({ ...item, route: `${item.plugin}:${item.hook}` })) })),
|
|
34
|
+
]);
|
|
35
|
+
}
|
|
36
|
+
function RouteTree({ routes }) {
|
|
37
|
+
if (routes.length === 0)
|
|
38
|
+
return h("p", { style: styles.muted }, "No routes registered.");
|
|
39
|
+
return h("ul", { style: "margin:0;padding-left:16px;" }, routes.map((route) => h("li", { key: route.id }, [
|
|
40
|
+
h("code", null, route.path),
|
|
41
|
+
" ",
|
|
42
|
+
h("span", { style: styles.muted }, [
|
|
43
|
+
route.hasLoader ? "loader " : "",
|
|
44
|
+
route.hasAction ? "action " : "",
|
|
45
|
+
route.middlewareCount ? `${route.middlewareCount} mw ` : "",
|
|
46
|
+
route.client ? "csr " : "",
|
|
47
|
+
route.layoutCount ? `${route.layoutCount} layout` : "",
|
|
48
|
+
]),
|
|
49
|
+
])));
|
|
50
|
+
}
|
|
51
|
+
function LatestRequest({ request }) {
|
|
52
|
+
return h("div", null, [
|
|
53
|
+
h("p", null, [h("span", { style: styles.badge }, request.method), " ", h("code", null, request.pathname)]),
|
|
54
|
+
h("p", { style: styles.muted }, [
|
|
55
|
+
`route: ${request.route ?? "—"} · status ${request.status} · mode ${request.renderMode}`,
|
|
56
|
+
]),
|
|
57
|
+
request.redirect ? h("p", null, ["redirect → ", h("code", null, request.redirect)]) : null,
|
|
58
|
+
request.locale ? h("p", null, ["locale ", h("code", null, request.locale)]) : null,
|
|
59
|
+
request.auth
|
|
60
|
+
? h("p", null, [
|
|
61
|
+
"auth ",
|
|
62
|
+
request.auth.authenticated ? h("span", { style: styles.badge }, request.auth.userId ?? "yes") : "guest",
|
|
63
|
+
])
|
|
64
|
+
: null,
|
|
65
|
+
request.islands.length > 0
|
|
66
|
+
? h("p", null, ["islands ", h("code", null, request.islands.join(", "))])
|
|
67
|
+
: null,
|
|
68
|
+
h("p", { style: styles.muted }, [
|
|
69
|
+
`timings mw ${request.timings.middlewareMs.toFixed(1)}ms · loader ${request.timings.loaderMs.toFixed(1)}ms · render ${request.timings.renderMs.toFixed(1)}ms · total ${request.timings.totalMs.toFixed(1)}ms`,
|
|
70
|
+
]),
|
|
71
|
+
]);
|
|
72
|
+
}
|
|
73
|
+
function TimingList({ items, }) {
|
|
74
|
+
if (items.length === 0)
|
|
75
|
+
return h("p", { style: styles.muted }, "No events.");
|
|
76
|
+
return h("ul", { style: "margin:0;padding-left:16px;" }, items.map((item, index) => h("li", { key: `${item.route}-${index}` }, [
|
|
77
|
+
h("code", null, item.route),
|
|
78
|
+
item.index !== undefined ? ` #${item.index}` : "",
|
|
79
|
+
": ",
|
|
80
|
+
`${item.durationMs.toFixed(1)}ms`,
|
|
81
|
+
])));
|
|
82
|
+
}
|
|
83
|
+
function LoaderTimingList({ items }) {
|
|
84
|
+
if (items.length === 0)
|
|
85
|
+
return h("p", { style: styles.muted }, "No loader events.");
|
|
86
|
+
return h("ul", { style: "margin:0;padding-left:16px;" }, items.map((item, index) => h("li", { key: `${item.route}-${index}` }, [
|
|
87
|
+
h("code", null, item.route),
|
|
88
|
+
` ${item.kind} ${item.durationMs.toFixed(1)}ms`,
|
|
89
|
+
item.validation ? " validation" : "",
|
|
90
|
+
item.redirect ? ` → ${item.redirect}` : "",
|
|
91
|
+
])));
|
|
92
|
+
}
|
|
93
|
+
function List({ items }) {
|
|
94
|
+
if (items.length === 0)
|
|
95
|
+
return h("p", { style: styles.muted }, "None.");
|
|
96
|
+
return h("ul", { style: "margin:0;padding-left:16px;" }, items.map((item) => h("li", { key: item }, item)));
|
|
97
|
+
}
|
|
98
|
+
function Section({ title, children }) {
|
|
99
|
+
return h("section", { style: styles.section }, [h("h3", { style: "margin:0 0 8px;font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:#93c5fd;" }, title), children]);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/client/panel.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getOtokDevtoolsBridge, setOtokDevtoolsBridge, type OtokDevtoolsSnapshot } from "@kamod-ch/otok/devtools";
|
|
2
|
+
export interface DevtoolsPluginOptions {
|
|
3
|
+
/** API path for the devtools JSON feed. */
|
|
4
|
+
endpoint?: string;
|
|
5
|
+
/** Inject the floating panel in development. Defaults to true. */
|
|
6
|
+
panel?: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: (options?: DevtoolsPluginOptions | undefined) => import("@kamod-ch/otok-config").OtokPlugin;
|
|
9
|
+
export default _default;
|
|
10
|
+
export { getOtokDevtoolsBridge, setOtokDevtoolsBridge, type OtokDevtoolsSnapshot };
|
|
11
|
+
export { createDevtoolsVitePlugin } from "./vite/plugin.js";
|
|
12
|
+
export { mountDevtoolsPanel } from "./client/mount.js";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,oBAAoB,EAC1B,MAAM,yBAAyB,CAAC;AAIjC,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;;AAED,wBAmDG;AAEH,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,CAAC;AAcnF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { definePlugin } from "@kamod-ch/otok";
|
|
2
|
+
import { createOtokDevtoolsBridge, getOtokDevtoolsBridge, setOtokDevtoolsBridge, } from "@kamod-ch/otok/devtools";
|
|
3
|
+
import { registerDevtoolsApiRoutes } from "./server/api.js";
|
|
4
|
+
import { createDevtoolsVitePlugin } from "./vite/plugin.js";
|
|
5
|
+
export default definePlugin({
|
|
6
|
+
name: "otok-devtools",
|
|
7
|
+
version: "0.1.0",
|
|
8
|
+
schema: {
|
|
9
|
+
parse(input) {
|
|
10
|
+
if (input !== undefined && typeof input !== "object") {
|
|
11
|
+
throw new Error("options must be an object");
|
|
12
|
+
}
|
|
13
|
+
return input ?? {};
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
config(options, ctx) {
|
|
17
|
+
if (ctx.mode !== "development")
|
|
18
|
+
return;
|
|
19
|
+
return {
|
|
20
|
+
devtools: {
|
|
21
|
+
otok: {
|
|
22
|
+
endpoint: options?.endpoint ?? "/__otok_devtools",
|
|
23
|
+
panel: options?.panel ?? true,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
configResolved(ctx) {
|
|
29
|
+
if (ctx.mode !== "development")
|
|
30
|
+
return;
|
|
31
|
+
if (!getOtokDevtoolsBridge()) {
|
|
32
|
+
setOtokDevtoolsBridge(createOtokDevtoolsBridge());
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
configureApp({ app, mode, config }) {
|
|
36
|
+
if (mode !== "development")
|
|
37
|
+
return;
|
|
38
|
+
const devtoolsConfig = config.devtools?.otok;
|
|
39
|
+
registerDevtoolsApiRoutes(app, devtoolsConfig?.endpoint ?? "/__otok_devtools");
|
|
40
|
+
},
|
|
41
|
+
configureVite(ctx) {
|
|
42
|
+
if (ctx.mode !== "development")
|
|
43
|
+
return;
|
|
44
|
+
return createDevtoolsVitePlugin({
|
|
45
|
+
endpoint: String(ctx.config.devtools?.otok && ctx.config.devtools.otok.endpoint) ||
|
|
46
|
+
"/__otok_devtools",
|
|
47
|
+
panel: ctx.config.devtools?.otok && ctx.config.devtools.otok.panel !== undefined
|
|
48
|
+
? Boolean(ctx.config.devtools.otok.panel)
|
|
49
|
+
: true,
|
|
50
|
+
});
|
|
51
|
+
},
|
|
52
|
+
virtualModules: {
|
|
53
|
+
snapshot: () => {
|
|
54
|
+
const bridge = getOtokDevtoolsBridge();
|
|
55
|
+
const snapshot = bridge?.getSnapshot() ?? emptySnapshot();
|
|
56
|
+
return `export const devtoolsSnapshot = ${JSON.stringify(snapshot)};`;
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
export { getOtokDevtoolsBridge, setOtokDevtoolsBridge };
|
|
61
|
+
function emptySnapshot() {
|
|
62
|
+
return {
|
|
63
|
+
routes: [],
|
|
64
|
+
plugins: [],
|
|
65
|
+
middleware: [],
|
|
66
|
+
loaders: [],
|
|
67
|
+
pluginHooks: [],
|
|
68
|
+
requests: [],
|
|
69
|
+
updatedAt: Date.now(),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export { createDevtoolsVitePlugin } from "./vite/plugin.js";
|
|
73
|
+
export { mountDevtoolsPanel } from "./client/mount.js";
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,SAAqB,GAAG,IAAI,CAWxF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { getOtokDevtoolsBridge } from "@kamod-ch/otok/devtools";
|
|
2
|
+
export function registerDevtoolsApiRoutes(app, endpoint = "/__otok_devtools") {
|
|
3
|
+
app.get(endpoint, (c) => {
|
|
4
|
+
const bridge = getOtokDevtoolsBridge();
|
|
5
|
+
if (!bridge) {
|
|
6
|
+
return c.json({ enabled: false, snapshot: null }, 404);
|
|
7
|
+
}
|
|
8
|
+
return c.json({
|
|
9
|
+
enabled: true,
|
|
10
|
+
snapshot: sanitizeSnapshot(bridge.getSnapshot()),
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function sanitizeSnapshot(snapshot) {
|
|
15
|
+
return {
|
|
16
|
+
...snapshot,
|
|
17
|
+
requests: snapshot.requests.map((request) => ({
|
|
18
|
+
...request,
|
|
19
|
+
auth: request.auth
|
|
20
|
+
? {
|
|
21
|
+
authenticated: request.auth.authenticated,
|
|
22
|
+
userId: request.auth.userId,
|
|
23
|
+
roles: request.auth.roles,
|
|
24
|
+
}
|
|
25
|
+
: undefined,
|
|
26
|
+
})),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,UAAU,yBAAyB,CAAC,GAAS,EAAE,QAAQ,GAAG,kBAAkB;IAChF,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;SACjD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA0F;IAClH,OAAO;QACL,GAAG,QAAQ;QACX,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC5C,GAAG,OAAO;YACV,IAAI,EAAE,OAAO,CAAC,IAAI;gBAChB,CAAC,CAAC;oBACE,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa;oBACzC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;oBAC3B,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;iBAC1B;gBACH,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/vite/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAID,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,MAAM,CA+BnF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const CLIENT_ENTRY = "\0otok-devtools/client";
|
|
2
|
+
export function createDevtoolsVitePlugin(options) {
|
|
3
|
+
return {
|
|
4
|
+
name: "otok-devtools:vite",
|
|
5
|
+
apply: "serve",
|
|
6
|
+
resolveId(id) {
|
|
7
|
+
if (id === "virtual:otok-devtools/client")
|
|
8
|
+
return CLIENT_ENTRY;
|
|
9
|
+
return undefined;
|
|
10
|
+
},
|
|
11
|
+
load(id) {
|
|
12
|
+
if (id !== CLIENT_ENTRY)
|
|
13
|
+
return undefined;
|
|
14
|
+
if (!options.panel) {
|
|
15
|
+
return "export function mountDevtoolsPanel() {}";
|
|
16
|
+
}
|
|
17
|
+
return `
|
|
18
|
+
import { mountDevtoolsPanel } from "@kamod-ch/otok-devtools/client";
|
|
19
|
+
if (import.meta.env.DEV) {
|
|
20
|
+
mountDevtoolsPanel(${JSON.stringify({ endpoint: options.endpoint })});
|
|
21
|
+
}
|
|
22
|
+
`;
|
|
23
|
+
},
|
|
24
|
+
transformIndexHtml() {
|
|
25
|
+
if (!options.panel)
|
|
26
|
+
return [];
|
|
27
|
+
return [
|
|
28
|
+
{
|
|
29
|
+
tag: "script",
|
|
30
|
+
attrs: { type: "module", src: "/@id/virtual:otok-devtools/client" },
|
|
31
|
+
injectTo: "body",
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/vite/plugin.ts"],"names":[],"mappings":"AAOA,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAE9C,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,OAAO;QACd,SAAS,CAAC,EAAE;YACV,IAAI,EAAE,KAAK,8BAA8B;gBAAE,OAAO,YAAY,CAAC;YAC/D,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,KAAK,YAAY;gBAAE,OAAO,SAAS,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,yCAAyC,CAAC;YACnD,CAAC;YACD,OAAO;;;+BAGkB,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;;OAEtE,CAAC;QACJ,CAAC;QACD,kBAAkB;YAChB,IAAI,CAAC,OAAO,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAC;YAC9B,OAAO;gBACL;oBACE,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,mCAAmC,EAAE;oBACnE,QAAQ,EAAE,MAAM;iBACjB;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kamod-ch/otok-devtools",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Development-only diagnostics and inspector UI for Otok apps.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/kamod-ch/otok/tree/main/packages/otok-devtools#readme",
|
|
7
|
+
"bugs": {
|
|
8
|
+
"url": "https://github.com/kamod-ch/otok/issues"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/kamod-ch/otok.git",
|
|
13
|
+
"directory": "packages/otok-devtools"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"default": "./dist/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./client": {
|
|
26
|
+
"types": "./dist/client/index.d.ts",
|
|
27
|
+
"default": "./dist/client/index.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"@kamod-ch/otok": ">=0.6.1",
|
|
32
|
+
"hono": ">=4",
|
|
33
|
+
"preact": ">=10.26.0",
|
|
34
|
+
"vite": ">=6"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^24.12.2",
|
|
38
|
+
"hono": "^4.12.25",
|
|
39
|
+
"preact": "^10.28.2",
|
|
40
|
+
"typescript": "~6.0.2",
|
|
41
|
+
"vite": "^8.0.16",
|
|
42
|
+
"vitest": "^4.1.2",
|
|
43
|
+
"@kamod-ch/otok": "0.6.1",
|
|
44
|
+
"@kamod-ch/otok-test": "0.5.1"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=20"
|
|
48
|
+
},
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
54
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
55
|
+
"test": "vitest run"
|
|
56
|
+
}
|
|
57
|
+
}
|