@korajs/devtools 0.0.0-canary-20261008174129

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 (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/dist/chunk-LQFL4TWM.js +999 -0
  4. package/dist/chunk-LQFL4TWM.js.map +1 -0
  5. package/dist/embed-overlay-Dwys5PYM.d.cts +170 -0
  6. package/dist/embed-overlay-Dwys5PYM.d.ts +170 -0
  7. package/dist/extension/background.cjs +65 -0
  8. package/dist/extension/background.cjs.map +1 -0
  9. package/dist/extension/background.d.cts +2 -0
  10. package/dist/extension/background.d.ts +2 -0
  11. package/dist/extension/background.js +63 -0
  12. package/dist/extension/background.js.map +1 -0
  13. package/dist/extension/content-script.cjs +18 -0
  14. package/dist/extension/content-script.cjs.map +1 -0
  15. package/dist/extension/content-script.d.cts +2 -0
  16. package/dist/extension/content-script.d.ts +2 -0
  17. package/dist/extension/content-script.js +16 -0
  18. package/dist/extension/content-script.js.map +1 -0
  19. package/dist/extension/devtools-page.html +45 -0
  20. package/dist/extension/devtools.cjs +8 -0
  21. package/dist/extension/devtools.cjs.map +1 -0
  22. package/dist/extension/devtools.d.cts +2 -0
  23. package/dist/extension/devtools.d.ts +2 -0
  24. package/dist/extension/devtools.html +599 -0
  25. package/dist/extension/devtools.js +6 -0
  26. package/dist/extension/devtools.js.map +1 -0
  27. package/dist/extension/manifest.json +20 -0
  28. package/dist/extension/panel.cjs +1311 -0
  29. package/dist/extension/panel.cjs.map +1 -0
  30. package/dist/extension/panel.d.cts +2 -0
  31. package/dist/extension/panel.d.ts +2 -0
  32. package/dist/extension/panel.js +1309 -0
  33. package/dist/extension/panel.js.map +1 -0
  34. package/dist/index.cjs +1353 -0
  35. package/dist/index.cjs.map +1 -0
  36. package/dist/index.d.cts +107 -0
  37. package/dist/index.d.ts +107 -0
  38. package/dist/index.js +326 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/overlay.cjs +1027 -0
  41. package/dist/overlay.cjs.map +1 -0
  42. package/dist/overlay.d.cts +2 -0
  43. package/dist/overlay.d.ts +2 -0
  44. package/dist/overlay.js +7 -0
  45. package/dist/overlay.js.map +1 -0
  46. package/package.json +55 -0
@@ -0,0 +1,63 @@
1
+ // src/extension/port-router.ts
2
+ var PortRouter = class {
3
+ panelClients = /* @__PURE__ */ new Map();
4
+ contentClients = /* @__PURE__ */ new Map();
5
+ handleConnection(port) {
6
+ if (port.name === "kora-panel") {
7
+ this.attachPanel(port);
8
+ return;
9
+ }
10
+ if (port.name === "kora-content") {
11
+ this.attachContent(port);
12
+ }
13
+ }
14
+ attachPanel(port) {
15
+ port.onMessage.addListener((message) => {
16
+ if (!isPanelInitMessage(message)) return;
17
+ this.panelClients.set(message.tabId, { tabId: message.tabId, port });
18
+ });
19
+ port.onDisconnect.addListener(() => {
20
+ for (const [tabId, client] of this.panelClients) {
21
+ if (client.port === port) {
22
+ this.panelClients.delete(tabId);
23
+ }
24
+ }
25
+ });
26
+ }
27
+ attachContent(port) {
28
+ const tabId = port.sender?.tab?.id;
29
+ if (typeof tabId !== "number") {
30
+ return;
31
+ }
32
+ this.contentClients.set(tabId, port);
33
+ port.onMessage.addListener((message) => {
34
+ if (!isContentEventMessage(message)) return;
35
+ const panel = this.panelClients.get(tabId);
36
+ if (!panel) return;
37
+ panel.port.postMessage({ type: "kora-event", payload: message.payload });
38
+ });
39
+ port.onDisconnect.addListener(() => {
40
+ this.contentClients.delete(tabId);
41
+ });
42
+ }
43
+ };
44
+ function isPanelInitMessage(value) {
45
+ if (typeof value !== "object" || value === null) return false;
46
+ const record = value;
47
+ return record.type === "panel-init" && typeof record.tabId === "number";
48
+ }
49
+ function isContentEventMessage(value) {
50
+ if (typeof value !== "object" || value === null) return false;
51
+ const record = value;
52
+ return record.type === "kora-event" && "payload" in record;
53
+ }
54
+
55
+ // src/extension/background.ts
56
+ var runtime = chrome?.runtime;
57
+ if (runtime?.onConnect) {
58
+ const router = new PortRouter();
59
+ runtime.onConnect.addListener((port) => {
60
+ router.handleConnection(port);
61
+ });
62
+ }
63
+ //# sourceMappingURL=background.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/extension/port-router.ts","../../src/extension/background.ts"],"sourcesContent":["export interface ExtensionPort {\n\tname: string\n\tonMessage: {\n\t\taddListener(callback: (message: unknown) => void): void\n\t}\n\tonDisconnect: {\n\t\taddListener(callback: () => void): void\n\t}\n\tpostMessage(message: unknown): void\n\tsender?: { tab?: { id?: number } }\n}\n\ninterface PanelClient {\n\tport: ExtensionPort\n\ttabId: number\n}\n\n/**\n * Routes content-script events to the matching DevTools panel by tab.\n */\nexport class PortRouter {\n\tprivate readonly panelClients = new Map<number, PanelClient>()\n\tprivate readonly contentClients = new Map<number, ExtensionPort>()\n\n\thandleConnection(port: ExtensionPort): void {\n\t\tif (port.name === 'kora-panel') {\n\t\t\tthis.attachPanel(port)\n\t\t\treturn\n\t\t}\n\n\t\tif (port.name === 'kora-content') {\n\t\t\tthis.attachContent(port)\n\t\t}\n\t}\n\n\tprivate attachPanel(port: ExtensionPort): void {\n\t\tport.onMessage.addListener((message) => {\n\t\t\tif (!isPanelInitMessage(message)) return\n\n\t\t\tthis.panelClients.set(message.tabId, { tabId: message.tabId, port })\n\t\t})\n\n\t\tport.onDisconnect.addListener(() => {\n\t\t\tfor (const [tabId, client] of this.panelClients) {\n\t\t\t\tif (client.port === port) {\n\t\t\t\t\tthis.panelClients.delete(tabId)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate attachContent(port: ExtensionPort): void {\n\t\tconst tabId = port.sender?.tab?.id\n\t\tif (typeof tabId !== 'number') {\n\t\t\treturn\n\t\t}\n\n\t\tthis.contentClients.set(tabId, port)\n\n\t\tport.onMessage.addListener((message) => {\n\t\t\tif (!isContentEventMessage(message)) return\n\n\t\t\tconst panel = this.panelClients.get(tabId)\n\t\t\tif (!panel) return\n\n\t\t\tpanel.port.postMessage({ type: 'kora-event', payload: message.payload })\n\t\t})\n\n\t\tport.onDisconnect.addListener(() => {\n\t\t\tthis.contentClients.delete(tabId)\n\t\t})\n\t}\n}\n\nfunction isPanelInitMessage(value: unknown): value is { type: 'panel-init'; tabId: number } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn record.type === 'panel-init' && typeof record.tabId === 'number'\n}\n\nfunction isContentEventMessage(value: unknown): value is { type: 'kora-event'; payload: unknown } {\n\tif (typeof value !== 'object' || value === null) return false\n\tconst record = value as Record<string, unknown>\n\treturn record.type === 'kora-event' && 'payload' in record\n}\n","import { type ExtensionPort, PortRouter } from './port-router'\n\n// biome-ignore lint/suspicious/noExplicitAny: Chrome extension API global has no type definitions without @types/chrome\ndeclare const chrome: any\n\nconst runtime = chrome?.runtime\n\nif (runtime?.onConnect) {\n\tconst router = new PortRouter()\n\truntime.onConnect.addListener((port: ExtensionPort) => {\n\t\trouter.handleConnection(port)\n\t})\n}\n"],"mappings":";AAoBO,IAAM,aAAN,MAAiB;AAAA,EACN,eAAe,oBAAI,IAAyB;AAAA,EAC5C,iBAAiB,oBAAI,IAA2B;AAAA,EAEjE,iBAAiB,MAA2B;AAC3C,QAAI,KAAK,SAAS,cAAc;AAC/B,WAAK,YAAY,IAAI;AACrB;AAAA,IACD;AAEA,QAAI,KAAK,SAAS,gBAAgB;AACjC,WAAK,cAAc,IAAI;AAAA,IACxB;AAAA,EACD;AAAA,EAEQ,YAAY,MAA2B;AAC9C,SAAK,UAAU,YAAY,CAAC,YAAY;AACvC,UAAI,CAAC,mBAAmB,OAAO,EAAG;AAElC,WAAK,aAAa,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,OAAO,KAAK,CAAC;AAAA,IACpE,CAAC;AAED,SAAK,aAAa,YAAY,MAAM;AACnC,iBAAW,CAAC,OAAO,MAAM,KAAK,KAAK,cAAc;AAChD,YAAI,OAAO,SAAS,MAAM;AACzB,eAAK,aAAa,OAAO,KAAK;AAAA,QAC/B;AAAA,MACD;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEQ,cAAc,MAA2B;AAChD,UAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,QAAI,OAAO,UAAU,UAAU;AAC9B;AAAA,IACD;AAEA,SAAK,eAAe,IAAI,OAAO,IAAI;AAEnC,SAAK,UAAU,YAAY,CAAC,YAAY;AACvC,UAAI,CAAC,sBAAsB,OAAO,EAAG;AAErC,YAAM,QAAQ,KAAK,aAAa,IAAI,KAAK;AACzC,UAAI,CAAC,MAAO;AAEZ,YAAM,KAAK,YAAY,EAAE,MAAM,cAAc,SAAS,QAAQ,QAAQ,CAAC;AAAA,IACxE,CAAC;AAED,SAAK,aAAa,YAAY,MAAM;AACnC,WAAK,eAAe,OAAO,KAAK;AAAA,IACjC,CAAC;AAAA,EACF;AACD;AAEA,SAAS,mBAAmB,OAAgE;AAC3F,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,OAAO,SAAS,gBAAgB,OAAO,OAAO,UAAU;AAChE;AAEA,SAAS,sBAAsB,OAAmE;AACjG,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,SAAO,OAAO,SAAS,gBAAgB,aAAa;AACrD;;;AC/EA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS,WAAW;AACvB,QAAM,SAAS,IAAI,WAAW;AAC9B,UAAQ,UAAU,YAAY,CAAC,SAAwB;AACtD,WAAO,iBAAiB,IAAI;AAAA,EAC7B,CAAC;AACF;","names":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ // src/extension/content-script.ts
4
+ var runtime = chrome?.runtime;
5
+ if (runtime) {
6
+ const port = runtime.connect({ name: "kora-content" });
7
+ window.addEventListener("message", (event) => {
8
+ const data = event.data;
9
+ if (!data || data.source !== "kora-devtools" || !data.payload) {
10
+ return;
11
+ }
12
+ port.postMessage({
13
+ type: "kora-event",
14
+ payload: data.payload
15
+ });
16
+ });
17
+ }
18
+ //# sourceMappingURL=content-script.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/extension/content-script.ts"],"sourcesContent":["import type { TimestampedEvent } from '../types'\n\n// biome-ignore lint/suspicious/noExplicitAny: Chrome extension API global has no type definitions without @types/chrome\ndeclare const chrome: any\n\nconst runtime = chrome?.runtime\n\nif (runtime) {\n\tconst port = runtime.connect({ name: 'kora-content' })\n\n\twindow.addEventListener('message', (event: MessageEvent) => {\n\t\tconst data = event.data as { source?: string; payload?: TimestampedEvent } | undefined\n\t\tif (!data || data.source !== 'kora-devtools' || !data.payload) {\n\t\t\treturn\n\t\t}\n\n\t\tport.postMessage({\n\t\t\ttype: 'kora-event',\n\t\t\tpayload: data.payload,\n\t\t})\n\t})\n}\n"],"mappings":";;;AAKA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS;AACZ,QAAM,OAAO,QAAQ,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErD,SAAO,iBAAiB,WAAW,CAAC,UAAwB;AAC3D,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,QAAQ,KAAK,WAAW,mBAAmB,CAAC,KAAK,SAAS;AAC9D;AAAA,IACD;AAEA,SAAK,YAAY;AAAA,MAChB,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,IACf,CAAC;AAAA,EACF,CAAC;AACF;","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,16 @@
1
+ // src/extension/content-script.ts
2
+ var runtime = chrome?.runtime;
3
+ if (runtime) {
4
+ const port = runtime.connect({ name: "kora-content" });
5
+ window.addEventListener("message", (event) => {
6
+ const data = event.data;
7
+ if (!data || data.source !== "kora-devtools" || !data.payload) {
8
+ return;
9
+ }
10
+ port.postMessage({
11
+ type: "kora-event",
12
+ payload: data.payload
13
+ });
14
+ });
15
+ }
16
+ //# sourceMappingURL=content-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/extension/content-script.ts"],"sourcesContent":["import type { TimestampedEvent } from '../types'\n\n// biome-ignore lint/suspicious/noExplicitAny: Chrome extension API global has no type definitions without @types/chrome\ndeclare const chrome: any\n\nconst runtime = chrome?.runtime\n\nif (runtime) {\n\tconst port = runtime.connect({ name: 'kora-content' })\n\n\twindow.addEventListener('message', (event: MessageEvent) => {\n\t\tconst data = event.data as { source?: string; payload?: TimestampedEvent } | undefined\n\t\tif (!data || data.source !== 'kora-devtools' || !data.payload) {\n\t\t\treturn\n\t\t}\n\n\t\tport.postMessage({\n\t\t\ttype: 'kora-event',\n\t\t\tpayload: data.payload,\n\t\t})\n\t})\n}\n"],"mappings":";AAKA,IAAM,UAAU,QAAQ;AAExB,IAAI,SAAS;AACZ,QAAM,OAAO,QAAQ,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErD,SAAO,iBAAiB,WAAW,CAAC,UAAwB;AAC3D,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,QAAQ,KAAK,WAAW,mBAAmB,CAAC,KAAK,SAAS;AAC9D;AAAA,IACD;AAEA,SAAK,YAAY;AAAA,MAChB,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,IACf,CAAC;AAAA,EACF,CAAC;AACF;","names":[]}
@@ -0,0 +1,45 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Kora DevTools</title>
7
+ <style>
8
+ body {
9
+ margin: 0;
10
+ font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
11
+ background: #0f172a;
12
+ color: #e2e8f0;
13
+ }
14
+ main {
15
+ display: grid;
16
+ grid-template-columns: 1fr 1fr;
17
+ gap: 12px;
18
+ padding: 12px;
19
+ }
20
+ section {
21
+ border: 1px solid #1e293b;
22
+ background: #111827;
23
+ border-radius: 8px;
24
+ padding: 10px;
25
+ }
26
+ h2 {
27
+ margin: 0 0 8px;
28
+ font-size: 14px;
29
+ }
30
+ p, li {
31
+ font-size: 12px;
32
+ }
33
+ ul {
34
+ margin: 6px 0 0;
35
+ padding-left: 18px;
36
+ max-height: 200px;
37
+ overflow: auto;
38
+ }
39
+ </style>
40
+ </head>
41
+ <body>
42
+ <main id="kora-devtools-root"></main>
43
+ <script type="module" src="./panel.js"></script>
44
+ </body>
45
+ </html>
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ // src/extension/devtools.ts
4
+ if (chrome?.devtools?.panels) {
5
+ chrome.devtools.panels.create("Kora", "", "devtools-page.html", () => {
6
+ });
7
+ }
8
+ //# sourceMappingURL=devtools.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/extension/devtools.ts"],"sourcesContent":["// biome-ignore lint/suspicious/noExplicitAny: Chrome extension API global has no type definitions without @types/chrome\ndeclare const chrome: any\n\nif (chrome?.devtools?.panels) {\n\tchrome.devtools.panels.create('Kora', '', 'devtools-page.html', () => {})\n}\n"],"mappings":";;;AAGA,IAAI,QAAQ,UAAU,QAAQ;AAC7B,SAAO,SAAS,OAAO,OAAO,QAAQ,IAAI,sBAAsB,MAAM;AAAA,EAAC,CAAC;AACzE;","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,2 @@
1
+
2
+ export { }