@aylith/inspekt-core 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/actions/built-in.d.ts +17 -0
  2. package/dist/actions/built-in.d.ts.map +1 -0
  3. package/dist/adapters/generic.d.ts +3 -0
  4. package/dist/adapters/generic.d.ts.map +1 -0
  5. package/dist/adapters/index.d.ts +5 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/react.d.ts +3 -0
  8. package/dist/adapters/react.d.ts.map +1 -0
  9. package/dist/adapters/solid.d.ts +3 -0
  10. package/dist/adapters/solid.d.ts.map +1 -0
  11. package/dist/adapters/svelte.d.ts +3 -0
  12. package/dist/adapters/svelte.d.ts.map +1 -0
  13. package/dist/adapters/types.d.ts +19 -0
  14. package/dist/adapters/types.d.ts.map +1 -0
  15. package/dist/adapters/vue.d.ts +3 -0
  16. package/dist/adapters/vue.d.ts.map +1 -0
  17. package/dist/capability-probe-AKVKYSDE.js +107 -0
  18. package/dist/capability-probe-AKVKYSDE.js.map +1 -0
  19. package/dist/components/rich-select.d.ts +62 -0
  20. package/dist/components/rich-select.d.ts.map +1 -0
  21. package/dist/components/tooltip.d.ts +34 -0
  22. package/dist/components/tooltip.d.ts.map +1 -0
  23. package/dist/detection/capability-probe.d.ts +31 -0
  24. package/dist/detection/capability-probe.d.ts.map +1 -0
  25. package/dist/detection/fiber-detector.d.ts +12 -0
  26. package/dist/detection/fiber-detector.d.ts.map +1 -0
  27. package/dist/detection/source-detector.d.ts +30 -0
  28. package/dist/detection/source-detector.d.ts.map +1 -0
  29. package/dist/detection/vue-detector.d.ts +14 -0
  30. package/dist/detection/vue-detector.d.ts.map +1 -0
  31. package/dist/fiber-detector-CFB7M7OY.js +50 -0
  32. package/dist/fiber-detector-CFB7M7OY.js.map +1 -0
  33. package/dist/highlight/bounding-boxes.d.ts +20 -0
  34. package/dist/highlight/bounding-boxes.d.ts.map +1 -0
  35. package/dist/highlight/highlighter.d.ts +11 -0
  36. package/dist/highlight/highlighter.d.ts.map +1 -0
  37. package/dist/highlight/prism.d.ts +23 -0
  38. package/dist/highlight/prism.d.ts.map +1 -0
  39. package/dist/index.cjs +3560 -0
  40. package/dist/index.cjs.map +1 -0
  41. package/dist/index.d.ts +12 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +3222 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/overlay/overlay.d.ts +30 -0
  46. package/dist/overlay/overlay.d.ts.map +1 -0
  47. package/dist/popover/popover.d.ts +54 -0
  48. package/dist/popover/popover.d.ts.map +1 -0
  49. package/dist/runtime/context.d.ts +3 -0
  50. package/dist/runtime/context.d.ts.map +1 -0
  51. package/dist/runtime/freeze.d.ts +2 -0
  52. package/dist/runtime/freeze.d.ts.map +1 -0
  53. package/dist/runtime/index.d.ts +4 -0
  54. package/dist/runtime/index.d.ts.map +1 -0
  55. package/dist/runtime/open-file.d.ts +2 -0
  56. package/dist/runtime/open-file.d.ts.map +1 -0
  57. package/dist/snippet/cache.d.ts +13 -0
  58. package/dist/snippet/cache.d.ts.map +1 -0
  59. package/dist/snippet/snippet-resolver.d.ts +21 -0
  60. package/dist/snippet/snippet-resolver.d.ts.map +1 -0
  61. package/dist/snippet/sourcemap-resolver.d.ts +9 -0
  62. package/dist/snippet/sourcemap-resolver.d.ts.map +1 -0
  63. package/dist/sourcemap-resolver-3PQ6R6PU.js +182 -0
  64. package/dist/sourcemap-resolver-3PQ6R6PU.js.map +1 -0
  65. package/dist/styles.d.ts +2 -0
  66. package/dist/styles.d.ts.map +1 -0
  67. package/dist/tree-panel/tree-panel.d.ts +33 -0
  68. package/dist/tree-panel/tree-panel.d.ts.map +1 -0
  69. package/dist/types.d.ts +148 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/package.json +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freeze.d.ts","sourceRoot":"","sources":["../../src/runtime/freeze.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './freeze.js';
2
+ export * from './context.js';
3
+ export * from './open-file.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { openFile } from 'react-grab/primitives';
2
+ //# sourceMappingURL=open-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-file.d.ts","sourceRoot":"","sources":["../../src/runtime/open-file.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare function getParsedMap(key: string): unknown;
2
+ export declare function setParsedMap(key: string, value: unknown): void;
3
+ export declare function clearParsedCache(): void;
4
+ export interface RawMapBackend {
5
+ get(key: string): Promise<string | 'not-found' | undefined>;
6
+ set(key: string, value: string): Promise<void>;
7
+ setNotFound(key: string): Promise<void>;
8
+ clear(): Promise<void>;
9
+ }
10
+ export declare function getRawMapBackend(): RawMapBackend;
11
+ export declare function setRawMapBackendForTesting(b: RawMapBackend | null): void;
12
+ export declare function clearRawMapCache(): Promise<void>;
13
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/snippet/cache.ts"],"names":[],"mappings":"AAqBA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQjD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAO9D;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAKD,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC,CAAC;IAC5D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAuED,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD;AAGD,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAExE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtD"}
@@ -0,0 +1,21 @@
1
+ import type { SourceSnippet } from '../types.js';
2
+ export interface SnippetResolverOptions {
3
+ filePath: string;
4
+ line: number;
5
+ serverUrl?: string;
6
+ context?: number;
7
+ fetcher?: typeof fetch;
8
+ /** When true, attempts source-map fallback after the dev server fails. */
9
+ sourceMapEnabled?: boolean;
10
+ /**
11
+ * Pre-baked snippet content keyed by `filePath`. Checked first, before
12
+ * the dev server / source map. Lets demo / playground surfaces deliver
13
+ * working snippets without needing a backend.
14
+ */
15
+ staticSnippets?: Record<string, Pick<SourceSnippet, 'language' | 'lines'> & {
16
+ startLine?: number;
17
+ }>;
18
+ }
19
+ export declare function clearSnippetCache(): void;
20
+ export declare function resolveSnippet(opts: SnippetResolverOptions): Promise<SourceSnippet | null>;
21
+ //# sourceMappingURL=snippet-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippet-resolver.d.ts","sourceRoot":"","sources":["../../src/snippet/snippet-resolver.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrG;AAkBD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAmBD,wBAAsB,cAAc,CAClC,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAkD/B"}
@@ -0,0 +1,9 @@
1
+ import type { SourceSnippet } from '../types.js';
2
+ export interface SourceMapResolverOptions {
3
+ filePath: string;
4
+ line: number;
5
+ context?: number;
6
+ fetcher?: typeof fetch;
7
+ }
8
+ export declare function resolveFromSourceMap(opts: SourceMapResolverOptions): Promise<SourceSnippet | null>;
9
+ //# sourceMappingURL=sourcemap-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourcemap-resolver.d.ts","sourceRoot":"","sources":["../../src/snippet/sourcemap-resolver.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOjD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAiED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAuC/B"}
@@ -0,0 +1,182 @@
1
+ // src/snippet/sourcemap-resolver.ts
2
+ import { TraceMap } from "@jridgewell/trace-mapping";
3
+
4
+ // src/snippet/cache.ts
5
+ var PARSED_LIMIT = 5;
6
+ var RAW_QUOTA_BYTES = 9 * 1024 * 1024;
7
+ var parsed = /* @__PURE__ */ new Map();
8
+ function getParsedMap(key) {
9
+ const v = parsed.get(key);
10
+ if (v !== void 0) {
11
+ parsed.delete(key);
12
+ parsed.set(key, v);
13
+ }
14
+ return v;
15
+ }
16
+ function setParsedMap(key, value) {
17
+ if (parsed.has(key)) parsed.delete(key);
18
+ parsed.set(key, value);
19
+ if (parsed.size > PARSED_LIMIT) {
20
+ const oldest = parsed.keys().next().value;
21
+ if (oldest !== void 0) parsed.delete(oldest);
22
+ }
23
+ }
24
+ var MemoryBackend = class {
25
+ store = /* @__PURE__ */ new Map();
26
+ async get(key) {
27
+ return this.store.get(key);
28
+ }
29
+ async set(key, value) {
30
+ this.store.set(key, value);
31
+ }
32
+ async setNotFound(key) {
33
+ this.store.set(key, "not-found");
34
+ }
35
+ async clear() {
36
+ this.store.clear();
37
+ }
38
+ };
39
+ function hasChromeSession() {
40
+ try {
41
+ return typeof chrome !== "undefined" && typeof chrome.storage !== "undefined" && typeof chrome.storage.session !== "undefined";
42
+ } catch {
43
+ return false;
44
+ }
45
+ }
46
+ var PREFIX_HIT = "inspekt-mapcache:";
47
+ var PREFIX_MISS = "inspekt-notfound:";
48
+ var ChromeSessionBackend = class {
49
+ async get(key) {
50
+ const hitKey = PREFIX_HIT + key;
51
+ const missKey = PREFIX_MISS + key;
52
+ const res = await chrome.storage.session.get([hitKey, missKey]);
53
+ if (res[missKey]) return "not-found";
54
+ const entry = res[hitKey];
55
+ if (typeof entry === "string") return entry;
56
+ return void 0;
57
+ }
58
+ async set(key, value) {
59
+ await this.evictIfNeeded(value.length);
60
+ await chrome.storage.session.set({ [PREFIX_HIT + key]: value });
61
+ }
62
+ async setNotFound(key) {
63
+ await chrome.storage.session.set({ [PREFIX_MISS + key]: true });
64
+ }
65
+ async clear() {
66
+ const all = await chrome.storage.session.get(null);
67
+ const inspektKeys = Object.keys(all).filter(
68
+ (k) => k.startsWith(PREFIX_HIT) || k.startsWith(PREFIX_MISS)
69
+ );
70
+ if (inspektKeys.length > 0) await chrome.storage.session.remove(inspektKeys);
71
+ }
72
+ async evictIfNeeded(incomingBytes) {
73
+ const used = await chrome.storage.session.getBytesInUse(null);
74
+ if (used + incomingBytes < RAW_QUOTA_BYTES) return;
75
+ const all = await chrome.storage.session.get(null);
76
+ const hits = Object.keys(all).filter((k) => k.startsWith(PREFIX_HIT));
77
+ if (hits.length > 0) await chrome.storage.session.remove(hits);
78
+ }
79
+ };
80
+ var backend = null;
81
+ function getRawMapBackend() {
82
+ if (!backend) {
83
+ backend = hasChromeSession() ? new ChromeSessionBackend() : new MemoryBackend();
84
+ }
85
+ return backend;
86
+ }
87
+
88
+ // src/snippet/sourcemap-resolver.ts
89
+ function candidateMapUrls() {
90
+ if (typeof document === "undefined") return [];
91
+ const urls = [];
92
+ for (const script of Array.from(document.querySelectorAll("script[src]"))) {
93
+ const src = script.src;
94
+ if (!src) continue;
95
+ if (src.endsWith(".map")) {
96
+ urls.push(src);
97
+ continue;
98
+ }
99
+ if (src.includes(".js")) {
100
+ urls.push(`${src}.map`);
101
+ }
102
+ }
103
+ return urls;
104
+ }
105
+ async function fetchRawMap(mapUrl, fetcher) {
106
+ const cache = getRawMapBackend();
107
+ const cached = await cache.get(mapUrl);
108
+ if (cached === "not-found") return null;
109
+ if (typeof cached === "string") return cached;
110
+ try {
111
+ const res = await fetcher(mapUrl);
112
+ if (!res.ok) {
113
+ await cache.setNotFound(mapUrl);
114
+ return null;
115
+ }
116
+ const text = await res.text();
117
+ await cache.set(mapUrl, text);
118
+ return text;
119
+ } catch {
120
+ await cache.setNotFound(mapUrl);
121
+ return null;
122
+ }
123
+ }
124
+ function getOrParse(mapUrl, raw) {
125
+ const cached = getParsedMap(mapUrl);
126
+ if (cached) return cached;
127
+ const parsed2 = new TraceMap(raw);
128
+ setParsedMap(mapUrl, parsed2);
129
+ return parsed2;
130
+ }
131
+ function matchSourceIndex(sources, target) {
132
+ const normalize = (p) => p.replace(/\\/g, "/").replace(/^\.\//, "");
133
+ const normalizedTarget = normalize(target);
134
+ const tail = normalizedTarget.split("/").slice(-3).join("/");
135
+ for (let i = 0; i < sources.length; i++) {
136
+ const s = sources[i];
137
+ if (!s) continue;
138
+ const ns = normalize(s);
139
+ if (ns === normalizedTarget) return i;
140
+ if (ns.endsWith(tail)) return i;
141
+ }
142
+ return -1;
143
+ }
144
+ async function resolveFromSourceMap(opts) {
145
+ const fetcher = opts.fetcher ?? fetch;
146
+ const context = opts.context ?? 5;
147
+ for (const mapUrl of candidateMapUrls()) {
148
+ const raw = await fetchRawMap(mapUrl, fetcher);
149
+ if (!raw) continue;
150
+ let map;
151
+ try {
152
+ map = getOrParse(mapUrl, raw);
153
+ } catch {
154
+ continue;
155
+ }
156
+ const sources = map.sources ?? [];
157
+ const idx = matchSourceIndex(sources, opts.filePath);
158
+ if (idx === -1) continue;
159
+ const sourcesContent = map.sourcesContent ?? [];
160
+ const content = sourcesContent[idx];
161
+ if (!content) continue;
162
+ const allLines = content.split("\n");
163
+ if (opts.line < 1 || opts.line > allLines.length) continue;
164
+ const startLine = Math.max(1, opts.line - context);
165
+ const endLine = Math.min(allLines.length, opts.line + context);
166
+ const lines = allLines.slice(startLine - 1, endLine);
167
+ const ext = (opts.filePath.split(".").pop() ?? "").toLowerCase();
168
+ return {
169
+ startLine,
170
+ endLine,
171
+ targetLine: opts.line,
172
+ lines,
173
+ language: ext || "text",
174
+ source: "sourcemap"
175
+ };
176
+ }
177
+ return null;
178
+ }
179
+ export {
180
+ resolveFromSourceMap
181
+ };
182
+ //# sourceMappingURL=sourcemap-resolver-3PQ6R6PU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/snippet/sourcemap-resolver.ts","../src/snippet/cache.ts"],"sourcesContent":["// Source-map fallback for the snippet resolver.\n//\n// Activates only when sourceMapEnabled=true in the Chrome extension options\n// (default off — fetching .map files makes additional network requests\n// observable in DevTools/proxies and we don't want to do that without user\n// consent). When enabled, we:\n// 1. Walk the page's <script src> tags and try to find the source map\n// adjacent to each bundle.\n// 2. Fetch the .map file (with a per-session cache).\n// 3. Parse it with @jridgewell/trace-mapping.\n// 4. Find the original source by matching the desired filePath against the\n// map's `sources[]` array.\n// 5. Slice `sourcesContent[index]` around the target line.\n\nimport { TraceMap } from '@jridgewell/trace-mapping';\nimport type { SourceSnippet } from '../types.js';\nimport {\n getParsedMap,\n setParsedMap,\n getRawMapBackend,\n} from './cache.js';\n\nexport interface SourceMapResolverOptions {\n filePath: string;\n line: number;\n context?: number;\n fetcher?: typeof fetch;\n}\n\n/** Discovers candidate .map URLs from the document's loaded scripts. */\nfunction candidateMapUrls(): string[] {\n if (typeof document === 'undefined') return [];\n const urls: string[] = [];\n for (const script of Array.from(document.querySelectorAll<HTMLScriptElement>('script[src]'))) {\n const src = script.src;\n if (!src) continue;\n if (src.endsWith('.map')) {\n urls.push(src);\n continue;\n }\n if (src.includes('.js')) {\n urls.push(`${src}.map`);\n }\n }\n return urls;\n}\n\nasync function fetchRawMap(\n mapUrl: string,\n fetcher: typeof fetch,\n): Promise<string | null> {\n const cache = getRawMapBackend();\n const cached = await cache.get(mapUrl);\n if (cached === 'not-found') return null;\n if (typeof cached === 'string') return cached;\n try {\n const res = await fetcher(mapUrl);\n if (!res.ok) {\n await cache.setNotFound(mapUrl);\n return null;\n }\n const text = await res.text();\n await cache.set(mapUrl, text);\n return text;\n } catch {\n await cache.setNotFound(mapUrl);\n return null;\n }\n}\n\nfunction getOrParse(mapUrl: string, raw: string): TraceMap {\n const cached = getParsedMap(mapUrl);\n if (cached) return cached as TraceMap;\n const parsed = new TraceMap(raw);\n setParsedMap(mapUrl, parsed);\n return parsed;\n}\n\nfunction matchSourceIndex(sources: ReadonlyArray<string | null>, target: string): number {\n const normalize = (p: string): string => p.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n const normalizedTarget = normalize(target);\n const tail = normalizedTarget.split('/').slice(-3).join('/');\n for (let i = 0; i < sources.length; i++) {\n const s = sources[i];\n if (!s) continue;\n const ns = normalize(s);\n if (ns === normalizedTarget) return i;\n if (ns.endsWith(tail)) return i;\n }\n return -1;\n}\n\nexport async function resolveFromSourceMap(\n opts: SourceMapResolverOptions,\n): Promise<SourceSnippet | null> {\n const fetcher = opts.fetcher ?? fetch;\n const context = opts.context ?? 5;\n\n for (const mapUrl of candidateMapUrls()) {\n const raw = await fetchRawMap(mapUrl, fetcher);\n if (!raw) continue;\n let map: TraceMap;\n try {\n map = getOrParse(mapUrl, raw);\n } catch {\n continue;\n }\n const sources = map.sources ?? [];\n const idx = matchSourceIndex(sources, opts.filePath);\n if (idx === -1) continue;\n\n const sourcesContent = map.sourcesContent ?? [];\n const content = sourcesContent[idx];\n if (!content) continue;\n\n const allLines = content.split('\\n');\n if (opts.line < 1 || opts.line > allLines.length) continue;\n\n const startLine = Math.max(1, opts.line - context);\n const endLine = Math.min(allLines.length, opts.line + context);\n const lines = allLines.slice(startLine - 1, endLine);\n const ext = (opts.filePath.split('.').pop() ?? '').toLowerCase();\n return {\n startLine,\n endLine,\n targetLine: opts.line,\n lines,\n language: ext || 'text',\n source: 'sourcemap',\n };\n }\n\n return null;\n}\n","/// <reference types=\"chrome\" />\n// Caches for the source-map resolver.\n//\n// Two layers:\n// 1. In-memory parsed-map LRU (max 5). Holds parsed TraceMap instances —\n// these are heap-heavy (large pre-decoded mappings), so we keep the\n// bound small.\n// 2. Raw-map text cache. When running inside the Chrome extension we\n// delegate to chrome.storage.session (per-session, ~10MB quota,\n// shared across tabs in the extension context). When running outside\n// the extension (e.g. unit tests, server-side use), we fall back to\n// an in-memory Map.\n\nconst PARSED_LIMIT = 5;\nconst RAW_QUOTA_BYTES = 9 * 1024 * 1024;\n\n// Generic-typed parsed-map cache. We can't pin TraceMap here without forcing\n// @jridgewell/trace-mapping into the bundle even when unused, so the cache\n// stores `unknown` and callers type-assert.\nconst parsed = new Map<string, unknown>();\n\nexport function getParsedMap(key: string): unknown {\n const v = parsed.get(key);\n if (v !== undefined) {\n // LRU touch.\n parsed.delete(key);\n parsed.set(key, v);\n }\n return v;\n}\n\nexport function setParsedMap(key: string, value: unknown): void {\n if (parsed.has(key)) parsed.delete(key);\n parsed.set(key, value);\n if (parsed.size > PARSED_LIMIT) {\n const oldest = parsed.keys().next().value;\n if (oldest !== undefined) parsed.delete(oldest);\n }\n}\n\nexport function clearParsedCache(): void {\n parsed.clear();\n}\n\n// Raw-map cache. We expose a small async interface and pick the backend at\n// runtime based on what's available.\n\nexport interface RawMapBackend {\n get(key: string): Promise<string | 'not-found' | undefined>;\n set(key: string, value: string): Promise<void>;\n setNotFound(key: string): Promise<void>;\n clear(): Promise<void>;\n}\n\nclass MemoryBackend implements RawMapBackend {\n private store = new Map<string, string | 'not-found'>();\n async get(key: string): Promise<string | 'not-found' | undefined> {\n return this.store.get(key);\n }\n async set(key: string, value: string): Promise<void> {\n this.store.set(key, value);\n }\n async setNotFound(key: string): Promise<void> {\n this.store.set(key, 'not-found');\n }\n async clear(): Promise<void> {\n this.store.clear();\n }\n}\n\n// Detect chrome.storage.session at module init; fall back to memory otherwise.\nfunction hasChromeSession(): boolean {\n try {\n return (\n typeof chrome !== 'undefined' &&\n typeof chrome.storage !== 'undefined' &&\n typeof chrome.storage.session !== 'undefined'\n );\n } catch {\n return false;\n }\n}\n\nconst PREFIX_HIT = 'inspekt-mapcache:';\nconst PREFIX_MISS = 'inspekt-notfound:';\n\nclass ChromeSessionBackend implements RawMapBackend {\n async get(key: string): Promise<string | 'not-found' | undefined> {\n const hitKey = PREFIX_HIT + key;\n const missKey = PREFIX_MISS + key;\n const res = await chrome.storage.session.get([hitKey, missKey]);\n if (res[missKey]) return 'not-found';\n const entry = res[hitKey];\n if (typeof entry === 'string') return entry;\n return undefined;\n }\n async set(key: string, value: string): Promise<void> {\n await this.evictIfNeeded(value.length);\n await chrome.storage.session.set({ [PREFIX_HIT + key]: value });\n }\n async setNotFound(key: string): Promise<void> {\n await chrome.storage.session.set({ [PREFIX_MISS + key]: true });\n }\n async clear(): Promise<void> {\n const all = await chrome.storage.session.get(null);\n const inspektKeys = Object.keys(all).filter(\n (k) => k.startsWith(PREFIX_HIT) || k.startsWith(PREFIX_MISS),\n );\n if (inspektKeys.length > 0) await chrome.storage.session.remove(inspektKeys);\n }\n\n private async evictIfNeeded(incomingBytes: number): Promise<void> {\n const used = await chrome.storage.session.getBytesInUse(null);\n if (used + incomingBytes < RAW_QUOTA_BYTES) return;\n // Evict every hit entry (cheap heuristic — source maps are infrequent).\n const all = await chrome.storage.session.get(null);\n const hits = Object.keys(all).filter((k) => k.startsWith(PREFIX_HIT));\n if (hits.length > 0) await chrome.storage.session.remove(hits);\n }\n}\n\nlet backend: RawMapBackend | null = null;\n\nexport function getRawMapBackend(): RawMapBackend {\n if (!backend) {\n backend = hasChromeSession() ? new ChromeSessionBackend() : new MemoryBackend();\n }\n return backend;\n}\n\n// Test seam: lets unit tests swap the backend without monkey-patching globals.\nexport function setRawMapBackendForTesting(b: RawMapBackend | null): void {\n backend = b;\n}\n\nexport async function clearRawMapCache(): Promise<void> {\n await getRawMapBackend().clear();\n}\n"],"mappings":"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","names":["parsed"]}
@@ -0,0 +1,2 @@
1
+ export declare const STYLES = "\n :host {\n all: initial;\n position: fixed;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n z-index: 2147483647;\n pointer-events: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n line-height: 1.4;\n }\n\n *, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n\n /* Theme variables */\n :host {\n --dl-bg: #1e1e2e;\n --dl-bg-hover: #313244;\n --dl-text: #cdd6f4;\n --dl-text-dim: #a6adc8;\n --dl-border: #45475a;\n --dl-accent: #3b82f6;\n --dl-accent-dim: #3b82f640;\n --dl-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);\n --dl-radius: 8px;\n }\n\n :host(.inspekt-light) {\n --dl-bg: #ffffff;\n --dl-bg-hover: #f1f5f9;\n --dl-text: #1e293b;\n --dl-text-dim: #64748b;\n --dl-border: #e2e8f0;\n --dl-accent: #3b82f6;\n --dl-accent-dim: #3b82f620;\n --dl-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);\n }\n\n /* Popover */\n .inspekt-popover {\n position: fixed;\n background: var(--dl-bg);\n border: 1px solid var(--dl-border);\n border-radius: var(--dl-radius);\n box-shadow: var(--dl-shadow);\n color: var(--dl-text);\n min-width: 200px;\n max-width: 400px;\n overflow: hidden;\n pointer-events: auto;\n z-index: 2147483647;\n animation: inspekt-fade-in 0.15s ease;\n }\n\n @keyframes inspekt-fade-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .inspekt-popover-header {\n padding: 8px 12px;\n border-bottom: 1px solid var(--dl-border);\n }\n\n .inspekt-popover-path-dir {\n font-size: 11px;\n color: var(--dl-text-dim);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .inspekt-popover-path-file {\n font-size: 13px;\n font-weight: 600;\n color: var(--dl-text);\n }\n\n .inspekt-popover-actions {\n display: flex;\n gap: 2px;\n padding: 6px 8px;\n }\n\n /* Snippet section */\n .inspekt-snippet {\n border-bottom: 1px solid var(--dl-border);\n }\n\n .inspekt-snippet-toggle {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 6px 12px;\n background: transparent;\n border: none;\n color: var(--dl-text-dim);\n font-size: 11px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n text-align: left;\n pointer-events: auto;\n }\n\n .inspekt-snippet-toggle:hover {\n background: var(--dl-bg-hover);\n color: var(--dl-text);\n }\n\n .inspekt-snippet-body {\n padding: 0;\n max-width: 600px;\n max-height: 240px;\n overflow: auto;\n border-top: 1px solid var(--dl-border);\n }\n\n .inspekt-snippet-pre {\n margin: 0;\n padding: 8px 0;\n font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Consolas', monospace;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dl-text);\n background: transparent;\n white-space: pre;\n tab-size: 2;\n }\n\n .inspekt-line {\n display: inline-flex;\n align-items: baseline;\n padding: 0 12px 0 0;\n }\n\n .inspekt-line-target {\n background: var(--dl-accent-dim);\n border-left: 2px solid var(--dl-accent);\n padding-left: 10px;\n }\n\n .inspekt-line:not(.inspekt-line-target) {\n padding-left: 12px;\n }\n\n .inspekt-line-no {\n display: inline-block;\n min-width: 30px;\n text-align: right;\n color: var(--dl-text-dim);\n margin-right: 10px;\n user-select: none;\n flex-shrink: 0;\n }\n\n .inspekt-line-code {\n white-space: pre;\n }\n\n .inspekt-snippet-skeleton,\n .inspekt-snippet-empty {\n padding: 12px;\n font-size: 11px;\n color: var(--dl-text-dim);\n text-align: center;\n font-style: italic;\n }\n\n .inspekt-popover-action {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: 6px;\n background: transparent;\n color: var(--dl-text-dim);\n cursor: pointer;\n transition: all 0.15s ease;\n pointer-events: auto;\n }\n\n .inspekt-popover-action:hover {\n background: var(--dl-bg-hover);\n color: var(--dl-text);\n }\n\n .inspekt-popover-action:active {\n transform: scale(0.92);\n }\n\n .inspekt-popover-action svg {\n width: 16px;\n height: 16px;\n }\n\n /* Popover toast \u2014 brief feedback after Copy / console.log actions */\n .inspekt-popover-toast {\n position: fixed;\n bottom: 24px;\n left: 50%;\n transform: translateX(-50%);\n padding: 6px 14px;\n background: var(--dl-text);\n color: var(--dl-bg);\n font: 500 12px/1.4 inherit;\n border-radius: 999px;\n box-shadow: var(--dl-shadow);\n pointer-events: none;\n z-index: 2147483647;\n animation: inspekt-toast 1.2s ease;\n }\n @keyframes inspekt-toast {\n 0% { opacity: 0; transform: translate(-50%, 6px); }\n 15%, 80% { opacity: 1; transform: translate(-50%, 0); }\n 100% { opacity: 0; transform: translate(-50%, 0); }\n }\n\n /* Info badge \u2014 small pill rendered in the DOM-fallback popover header.\n Shows an info icon + \"No source\" label so users see it without hover. */\n .inspekt-info-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px 2px 6px;\n border-radius: 999px;\n background: var(--dl-bg-hover);\n color: var(--dl-text-dim);\n font-size: 10.5px;\n font-weight: 500;\n letter-spacing: 0.01em;\n line-height: 1.4;\n cursor: help;\n flex-shrink: 0;\n margin-left: 8px;\n border: 1px solid var(--dl-border);\n text-transform: none;\n }\n .inspekt-info-badge:hover,\n .inspekt-info-badge:focus-visible {\n color: var(--dl-text);\n border-color: var(--dl-accent);\n outline: none;\n }\n .inspekt-info-badge svg { display: block; }\n .inspekt-info-badge-label {\n white-space: nowrap;\n }\n .inspekt-popover-path-dir-row {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n /* Tooltip (replaces native title=\"\") */\n .inspekt-tooltip {\n position: fixed;\n max-width: 280px;\n padding: 6px 10px;\n background: var(--dl-bg);\n color: var(--dl-text);\n border: 1px solid var(--dl-border);\n border-radius: 6px;\n box-shadow: var(--dl-shadow);\n font-size: 12px;\n line-height: 1.4;\n pointer-events: none;\n z-index: 2147483647;\n opacity: 0;\n animation: inspekt-tt-in 120ms ease-out forwards;\n }\n .inspekt-tooltip--rich {\n pointer-events: auto;\n max-width: 320px;\n padding: 10px 12px;\n }\n @keyframes inspekt-tt-in {\n from { opacity: 0; transform: translateY(2px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n /* Wider source snippet body when accordion is expanded (1.5\u00D7 collapsed) */\n .inspekt-snippet-body[data-state='expanded'] {\n max-width: 900px;\n }\n\n /* Prism syntax tokens \u2014 neutral palette mapped to theme variables. */\n .inspekt-snippet-pre .token.comment,\n .inspekt-snippet-pre .token.prolog,\n .inspekt-snippet-pre .token.doctype,\n .inspekt-snippet-pre .token.cdata { color: var(--dl-text-dim); font-style: italic; }\n .inspekt-snippet-pre .token.punctuation { color: var(--dl-text-dim); }\n .inspekt-snippet-pre .token.namespace { opacity: 0.7; }\n .inspekt-snippet-pre .token.property,\n .inspekt-snippet-pre .token.tag,\n .inspekt-snippet-pre .token.constant,\n .inspekt-snippet-pre .token.symbol,\n .inspekt-snippet-pre .token.deleted { color: #e06c75; }\n .inspekt-snippet-pre .token.boolean,\n .inspekt-snippet-pre .token.number { color: #d19a66; }\n .inspekt-snippet-pre .token.selector,\n .inspekt-snippet-pre .token.attr-name,\n .inspekt-snippet-pre .token.string,\n .inspekt-snippet-pre .token.char,\n .inspekt-snippet-pre .token.builtin,\n .inspekt-snippet-pre .token.inserted { color: #98c379; }\n .inspekt-snippet-pre .token.operator,\n .inspekt-snippet-pre .token.entity,\n .inspekt-snippet-pre .token.url,\n .inspekt-snippet-pre .language-css .token.string,\n .inspekt-snippet-pre .style .token.string { color: #56b6c2; }\n .inspekt-snippet-pre .token.atrule,\n .inspekt-snippet-pre .token.attr-value,\n .inspekt-snippet-pre .token.keyword { color: #c678dd; }\n .inspekt-snippet-pre .token.function,\n .inspekt-snippet-pre .token.class-name { color: #61afef; }\n .inspekt-snippet-pre .token.regex,\n .inspekt-snippet-pre .token.important,\n .inspekt-snippet-pre .token.variable { color: #d19a66; }\n .inspekt-snippet-pre .token.important,\n .inspekt-snippet-pre .token.bold { font-weight: bold; }\n .inspekt-snippet-pre .token.italic { font-style: italic; }\n\n /* Overlay badges */\n .inspekt-overlay {\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n }\n\n .inspekt-badge {\n position: absolute;\n background: var(--dl-accent);\n color: #fff;\n font-size: 10px;\n font-weight: 600;\n padding: 1px 6px;\n border-radius: 4px;\n white-space: nowrap;\n pointer-events: auto;\n cursor: pointer;\n opacity: 0.9;\n transition: opacity 0.15s ease;\n z-index: 2147483646;\n }\n\n .inspekt-badge:hover {\n opacity: 1;\n }\n\n /* Pulse animation for selected highlight */\n @keyframes inspekt-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 var(--dl-accent-dim); }\n 50% { box-shadow: 0 0 8px 4px var(--dl-accent-dim); }\n }\n\n /* Tree Panel */\n .inspekt-tree-panel {\n position: fixed;\n top: 0;\n height: 100vh;\n width: 320px;\n background: var(--dl-bg);\n border-left: 1px solid var(--dl-border);\n color: var(--dl-text);\n display: flex;\n flex-direction: column;\n pointer-events: auto;\n z-index: 2147483647;\n box-shadow: var(--dl-shadow);\n animation: inspekt-slide-in 0.2s ease;\n }\n\n .inspekt-tree-right { right: 0; border-left: 1px solid var(--dl-border); border-right: none; }\n .inspekt-tree-left { left: 0; border-right: 1px solid var(--dl-border); border-left: none; }\n\n @keyframes inspekt-slide-in {\n from { opacity: 0; transform: translateX(20px); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n .inspekt-tree-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n border-bottom: 1px solid var(--dl-border);\n flex-shrink: 0;\n }\n\n .inspekt-tree-title {\n font-weight: 600;\n font-size: 13px;\n }\n\n .inspekt-tree-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--dl-text-dim);\n cursor: pointer;\n }\n\n .inspekt-tree-close:hover {\n background: var(--dl-bg-hover);\n color: var(--dl-text);\n }\n\n .inspekt-tree-search {\n padding: 6px 12px;\n border-bottom: 1px solid var(--dl-border);\n flex-shrink: 0;\n }\n\n .inspekt-tree-search-input {\n width: 100%;\n padding: 5px 8px;\n border: 1px solid var(--dl-border);\n border-radius: 6px;\n background: var(--dl-bg-hover);\n color: var(--dl-text);\n font-size: 12px;\n outline: none;\n font-family: inherit;\n }\n\n .inspekt-tree-search-input:focus {\n border-color: var(--dl-accent);\n }\n\n .inspekt-tree-search-input::placeholder {\n color: var(--dl-text-dim);\n }\n\n .inspekt-tree-content {\n flex: 1;\n overflow-y: auto;\n padding: 4px 0;\n scrollbar-width: thin;\n scrollbar-color: var(--dl-border) transparent;\n }\n\n .inspekt-tree-content::-webkit-scrollbar { width: 6px; }\n .inspekt-tree-content::-webkit-scrollbar-thumb { background: var(--dl-border); border-radius: 3px; }\n\n .inspekt-tree-node {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n cursor: pointer;\n min-height: 26px;\n transition: background 0.1s ease;\n }\n\n .inspekt-tree-node:hover {\n background: var(--dl-bg-hover);\n }\n\n .inspekt-tree-node-selected {\n background: var(--dl-accent-dim) !important;\n }\n\n .inspekt-tree-arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n flex-shrink: 0;\n transition: transform 0.15s ease;\n }\n\n .inspekt-tree-arrow svg { color: var(--dl-text-dim); }\n\n .inspekt-tree-arrow-expanded { transform: rotate(0deg); }\n .inspekt-tree-arrow-collapsed { transform: rotate(-90deg); }\n\n .inspekt-tree-name {\n font-size: 12px;\n font-weight: 500;\n color: #c792ea;\n }\n\n :host(.inspekt-light) .inspekt-tree-name {\n color: #7c3aed;\n }\n\n .inspekt-tree-line {\n font-size: 11px;\n color: var(--dl-text-dim);\n font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Consolas', monospace;\n }\n\n .inspekt-tree-props {\n font-size: 10px;\n color: var(--dl-text-dim);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 120px;\n font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Consolas', monospace;\n }\n\n .inspekt-tree-children.inspekt-tree-collapsed {\n display: none;\n }\n\n .inspekt-tree-empty {\n padding: 16px;\n text-align: center;\n color: var(--dl-text-dim);\n font-size: 12px;\n }\n\n /* Resize handle */\n .inspekt-tree-resize {\n position: absolute;\n top: 0;\n width: 4px;\n height: 100%;\n cursor: col-resize;\n }\n\n .inspekt-tree-resize-left { left: 0; }\n .inspekt-tree-resize-right { right: 0; }\n\n .inspekt-tree-resize:hover {\n background: var(--dl-accent);\n opacity: 0.5;\n }\n\n /* Bounding-box overlay \u2014 view mode & \"Show bounding boxes\" toggle */\n .inspekt-bbox-layer {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 2147483646;\n }\n .inspekt-bbox {\n position: fixed;\n top: 0;\n left: 0;\n box-sizing: border-box;\n border: 1.5px dashed var(--dl-accent, oklch(0.62 0.18 285));\n background: oklch(0.62 0.18 285 / 0.05);\n pointer-events: none;\n will-change: transform, width, height;\n border-radius: 2px;\n }\n .inspekt-bbox-label {\n position: absolute;\n top: -18px;\n left: 0;\n font: 500 10px/1 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n color: #fff;\n background: var(--dl-accent, oklch(0.55 0.18 285));\n padding: 2px 5px;\n border-radius: 3px 3px 3px 0;\n white-space: nowrap;\n pointer-events: none;\n max-width: 280px;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n";
2
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,mzcAokBlB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { ComponentNode } from '../adapters/types.js';
2
+ import type { InspectedElement } from '../types.js';
3
+ export interface TreePanelOptions {
4
+ position: 'left' | 'right';
5
+ showProps: boolean;
6
+ showLineNumbers: boolean;
7
+ onSelect: (node: ComponentNode) => void;
8
+ onHover: (node: ComponentNode | null) => void;
9
+ }
10
+ export declare class TreePanel {
11
+ private shadowRoot;
12
+ private options;
13
+ private container;
14
+ private visible;
15
+ private searchInput;
16
+ private treeContainer;
17
+ private filter;
18
+ constructor(shadowRoot: ShadowRoot, options: TreePanelOptions);
19
+ private buildUI;
20
+ private currentTree;
21
+ show(): void;
22
+ hide(): void;
23
+ toggle(): void;
24
+ isVisible(): boolean;
25
+ updateTree(tree: ComponentNode | null): void;
26
+ selectElement(element: InspectedElement): void;
27
+ private renderCurrentTree;
28
+ private renderNode;
29
+ private matchesFilter;
30
+ private setupResize;
31
+ destroy(): void;
32
+ }
33
+ //# sourceMappingURL=tree-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-panel.d.ts","sourceRoot":"","sources":["../../src/tree-panel/tree-panel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC;CAC/C;AAED,qBAAa,SAAS;IAQlB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IARjB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAM;IAEpB,YACU,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,gBAAgB,EAOlC;IAED,OAAO,CAAC,OAAO;IA4Cf,OAAO,CAAC,WAAW,CAA8B;IAEjD,IAAI,IAAI,IAAI,CAGX;IAED,IAAI,IAAI,IAAI,CAGX;IAED,MAAM,IAAI,IAAI,CAGb;IAED,SAAS,IAAI,OAAO,CAEnB;IAED,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAG3C;IAED,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAY7C;IAED,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,UAAU;IAgFlB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,WAAW;IA2BnB,OAAO,IAAI,IAAI,CAEd;CACF"}
@@ -0,0 +1,148 @@
1
+ export interface ShortcutConfig {
2
+ key: string;
3
+ modifiers: Array<'ctrl' | 'alt' | 'shift' | 'meta'>;
4
+ }
5
+ export interface HighlightConfig {
6
+ color: string;
7
+ style: 'solid' | 'dashed' | 'glow';
8
+ animation: 'pulse' | 'none';
9
+ }
10
+ export interface BadgeConfig {
11
+ show: boolean;
12
+ position: 'auto' | 'top-left' | 'top-right';
13
+ showPath: boolean;
14
+ }
15
+ export interface TreePanelConfig {
16
+ enabled: boolean;
17
+ position: 'right' | 'left';
18
+ showProps: boolean;
19
+ showLineNumbers: boolean;
20
+ }
21
+ export type ModifierKey = 'ctrl' | 'alt' | 'shift' | 'meta';
22
+ /**
23
+ * Runtime shape of a user-defined editor. The full UI shape (label, homepage)
24
+ * lives in the extension settings; the core runtime only needs the key to
25
+ * match against and the URL template to expand at "Open in editor" time.
26
+ */
27
+ export interface InspektCustomEditor {
28
+ value: string;
29
+ urlTemplate: string;
30
+ }
31
+ export interface InspektOptions {
32
+ /**
33
+ * Modifier keys that must be held for the inspector to engage (highlight on
34
+ * hover / pin on click). Empty array means always-on. The Cmd (meta) key
35
+ * counts as Ctrl for the purposes of this gate (macOS convention).
36
+ *
37
+ * The toggle shortcut (Ctrl+Alt+I) and the direct-to-editor bypass
38
+ * (Shift+Alt+Click) remain global and are not gated by this setting.
39
+ */
40
+ requireModifiers: ModifierKey[];
41
+ /** Persistent bounding-box overlay on all inspectable elements. Off by default. */
42
+ showBoundingBoxes: boolean;
43
+ shortcut: ShortcutConfig;
44
+ toggleShortcut: ShortcutConfig;
45
+ theme: 'light' | 'dark' | 'auto';
46
+ highlight: HighlightConfig;
47
+ badge: BadgeConfig;
48
+ borders: boolean;
49
+ actions: string[];
50
+ editor: string;
51
+ editorPathBase: string;
52
+ githubRepo: string;
53
+ githubBranch: string;
54
+ pathMapping: Record<string, string>;
55
+ treePanel: TreePanelConfig;
56
+ sourceAttribute: string;
57
+ serverUrl: string;
58
+ /** Default expansion state for the popover's snippet section. */
59
+ defaultSnippetExpanded: boolean;
60
+ /** Lines of context above/below the target line in the snippet. */
61
+ snippetContext: number;
62
+ /**
63
+ * When true, fetches .map files to resolve snippets when the dev server is
64
+ * unreachable. Default false because the .map fetches are observable in
65
+ * DevTools/proxies and shouldn't happen without user consent.
66
+ */
67
+ sourceMapEnabled: boolean;
68
+ /**
69
+ * Optional pre-baked snippets keyed by `filePath`. Checked first by the
70
+ * snippet resolver — useful for demos / playgrounds where no dev server
71
+ * exists. Each entry supplies `language` and `lines`; `startLine`
72
+ * defaults to 1.
73
+ */
74
+ staticSnippets?: Record<string, {
75
+ language: string;
76
+ lines: string[];
77
+ startLine?: number;
78
+ }>;
79
+ /**
80
+ * User-defined editor entries. Their `value` keys are checked before the
81
+ * built-in URL-scheme switch in `editorProtocol`, so a user can override
82
+ * a broken built-in without waiting for an Inspekt release.
83
+ */
84
+ customEditors: InspektCustomEditor[];
85
+ }
86
+ export interface SourceSnippet {
87
+ startLine: number;
88
+ endLine: number;
89
+ targetLine: number;
90
+ lines: string[];
91
+ language: string;
92
+ source: 'devserver' | 'sourcemap' | 'fiber';
93
+ }
94
+ export interface PageCapabilities {
95
+ instrumented: boolean;
96
+ snippetSource: 'devserver' | 'sourcemap' | null;
97
+ serverReachable: boolean;
98
+ sourceMapAvailable: boolean;
99
+ agentConnected: boolean;
100
+ }
101
+ export interface InspectedElement {
102
+ filePath: string;
103
+ line: number;
104
+ column: number;
105
+ componentName: string;
106
+ rawPath: string;
107
+ domElement: HTMLElement;
108
+ tagName: string;
109
+ classList: string[];
110
+ id: string | null;
111
+ boundingRect: DOMRect;
112
+ ancestors: InspectedElement[];
113
+ children: InspectedElement[];
114
+ props: Record<string, unknown> | null;
115
+ framework: 'react' | 'vue' | 'svelte' | 'solid' | 'unknown';
116
+ /** Populated by snippet-resolver when source is fetchable (Phase 1+). */
117
+ snippet?: SourceSnippet;
118
+ /** User-entered note (Phase 3+). */
119
+ comment?: string;
120
+ /** Detection origin — fiber means we read it via bippy, not a DOM attribute. */
121
+ detectionSource?: 'fiber' | 'attribute';
122
+ }
123
+ export interface InspektAction {
124
+ id: string;
125
+ label: string;
126
+ icon: string;
127
+ position?: string;
128
+ shortcut?: ShortcutConfig;
129
+ handler: (element: InspectedElement) => void;
130
+ }
131
+ export type InspektEventMap = {
132
+ inspect: (element: InspectedElement) => void;
133
+ action: (actionId: string, element: InspectedElement) => void;
134
+ enable: () => void;
135
+ disable: () => void;
136
+ 'tree-select': (element: InspectedElement) => void;
137
+ };
138
+ export interface InspektInstance {
139
+ enable(): void;
140
+ disable(): void;
141
+ toggle(): void;
142
+ destroy(): void;
143
+ registerAction(action: InspektAction): void;
144
+ unregisterAction(id: string): void;
145
+ on<K extends keyof InspektEventMap>(event: K, handler: InspektEventMap[K]): void;
146
+ off<K extends keyof InspektEventMap>(event: K, handler: InspektEventMap[K]): void;
147
+ }
148
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@aylith/inspekt-core",
3
+ "version": "0.4.0",
4
+ "description": "Inspekt runtime — overlay, popover, tree panel, highlighting",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./style.css": "./dist/style.css"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "!dist/**/__tests__/**",
20
+ "!dist/**/*.test.d.ts",
21
+ "!dist/**/*.test.d.ts.map"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsup && tsc -p tsconfig.json --noEmit false --declaration --emitDeclarationOnly --outDir dist --rootDir src",
25
+ "dev": "tsup --watch",
26
+ "test": "vitest run",
27
+ "typecheck": "tsc --noEmit",
28
+ "clean": "rm -rf dist"
29
+ },
30
+ "dependencies": {
31
+ "@floating-ui/dom": "^1.8.0",
32
+ "@jridgewell/trace-mapping": "^0.3.31",
33
+ "bippy": "^0.6.0",
34
+ "prismjs": "^1.30.0",
35
+ "react-grab": "^0.1.48"
36
+ },
37
+ "devDependencies": {
38
+ "@jridgewell/sourcemap-codec": "^1.5.5",
39
+ "@types/chrome": "^0.2.2",
40
+ "@types/prismjs": "^1.26.6",
41
+ "happy-dom": "^20.11.0",
42
+ "tsup": "^8.5.1",
43
+ "typescript": "^7.0.2",
44
+ "vitest": "^4.1.10"
45
+ },
46
+ "sideEffects": false,
47
+ "license": "MIT",
48
+ "publishConfig": {
49
+ "access": "public"
50
+ }
51
+ }