@prestyj/cli 4.3.58 → 4.3.83

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 (66) hide show
  1. package/dist/cli.js +153 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/core/auto-update.js +1 -1
  4. package/dist/core/auto-update.js.map +1 -1
  5. package/dist/core/pixel-fix-agent.d.ts +24 -0
  6. package/dist/core/pixel-fix-agent.d.ts.map +1 -0
  7. package/dist/core/pixel-fix-agent.js +49 -0
  8. package/dist/core/pixel-fix-agent.js.map +1 -0
  9. package/dist/core/pixel-fix.d.ts +70 -0
  10. package/dist/core/pixel-fix.d.ts.map +1 -0
  11. package/dist/core/pixel-fix.js +302 -0
  12. package/dist/core/pixel-fix.js.map +1 -0
  13. package/dist/core/pixel-fix.test.d.ts +2 -0
  14. package/dist/core/pixel-fix.test.d.ts.map +1 -0
  15. package/dist/core/pixel-fix.test.js +296 -0
  16. package/dist/core/pixel-fix.test.js.map +1 -0
  17. package/dist/core/pixel.d.ts +34 -0
  18. package/dist/core/pixel.d.ts.map +1 -0
  19. package/dist/core/pixel.js +308 -0
  20. package/dist/core/pixel.js.map +1 -0
  21. package/dist/core/pixel.test.d.ts +2 -0
  22. package/dist/core/pixel.test.d.ts.map +1 -0
  23. package/dist/core/pixel.test.js +214 -0
  24. package/dist/core/pixel.test.js.map +1 -0
  25. package/dist/core/source-maps.d.ts +47 -0
  26. package/dist/core/source-maps.d.ts.map +1 -0
  27. package/dist/core/source-maps.js +132 -0
  28. package/dist/core/source-maps.js.map +1 -0
  29. package/dist/core/source-maps.test.d.ts +2 -0
  30. package/dist/core/source-maps.test.d.ts.map +1 -0
  31. package/dist/core/source-maps.test.js +175 -0
  32. package/dist/core/source-maps.test.js.map +1 -0
  33. package/dist/modes/agent-home-mode.js +3 -3
  34. package/dist/modes/agent-home-mode.js.map +1 -1
  35. package/dist/ui/App.d.ts +2 -0
  36. package/dist/ui/App.d.ts.map +1 -1
  37. package/dist/ui/App.js +139 -7
  38. package/dist/ui/App.js.map +1 -1
  39. package/dist/ui/components/InputArea.d.ts +2 -1
  40. package/dist/ui/components/InputArea.d.ts.map +1 -1
  41. package/dist/ui/components/InputArea.js +6 -1
  42. package/dist/ui/components/InputArea.js.map +1 -1
  43. package/dist/ui/components/PixelOverlay.d.ts +11 -0
  44. package/dist/ui/components/PixelOverlay.d.ts.map +1 -0
  45. package/dist/ui/components/PixelOverlay.js +116 -0
  46. package/dist/ui/components/PixelOverlay.js.map +1 -0
  47. package/dist/ui/components/PlanOverlay.js +3 -3
  48. package/dist/ui/components/PlanOverlay.js.map +1 -1
  49. package/dist/ui/components/SkillsOverlay.js +3 -3
  50. package/dist/ui/components/SkillsOverlay.js.map +1 -1
  51. package/dist/ui/pixel.d.ts +22 -0
  52. package/dist/ui/pixel.d.ts.map +1 -0
  53. package/dist/ui/pixel.js +394 -0
  54. package/dist/ui/pixel.js.map +1 -0
  55. package/dist/ui/pixel.test.d.ts +2 -0
  56. package/dist/ui/pixel.test.d.ts.map +1 -0
  57. package/dist/ui/pixel.test.js +130 -0
  58. package/dist/ui/pixel.test.js.map +1 -0
  59. package/dist/ui/render.d.ts +2 -0
  60. package/dist/ui/render.d.ts.map +1 -1
  61. package/dist/ui/render.js +2 -0
  62. package/dist/ui/render.js.map +1 -1
  63. package/dist/utils/image.d.ts.map +1 -1
  64. package/dist/utils/image.js +15 -0
  65. package/dist/utils/image.js.map +1 -1
  66. package/package.json +37 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel.js","sourceRoot":"","sources":["../../src/core/pixel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pixel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel.test.d.ts","sourceRoot":"","sources":["../../src/core/pixel.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,214 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { listAllErrors, fetchPixelEntries } from "./pixel.js";
6
+ let home;
7
+ const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
8
+ const errorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
9
+ beforeEach(() => {
10
+ home = mkdtempSync(join(tmpdir(), "ezcoder-pixel-"));
11
+ logSpy.mockClear();
12
+ errorSpy.mockClear();
13
+ });
14
+ afterEach(() => rmSync(home, { recursive: true, force: true }));
15
+ function output() {
16
+ return logSpy.mock.calls.map((c) => c.join(" ")).join("\n");
17
+ }
18
+ function fakeFetch(perProject) {
19
+ return (async (input) => {
20
+ const url = String(input);
21
+ const match = /\/api\/projects\/([^/]+)\/errors/.exec(url);
22
+ const id = match?.[1] ?? "";
23
+ const errors = perProject[id] ?? [];
24
+ return new Response(JSON.stringify({ errors }), {
25
+ status: 200,
26
+ headers: { "content-type": "application/json" },
27
+ });
28
+ });
29
+ }
30
+ describe("listAllErrors", () => {
31
+ it("prints a friendly message when there are no projects", async () => {
32
+ await listAllErrors({ homeDir: home, fetchFn: fakeFetch({}) });
33
+ expect(output()).toContain("No projects registered");
34
+ });
35
+ it("prints a friendly message when projects.json is empty", async () => {
36
+ mkdirSync(join(home, ".ezcoder"), { recursive: true });
37
+ writeFileSync(join(home, ".ezcoder", "projects.json"), "{}");
38
+ await listAllErrors({ homeDir: home, fetchFn: fakeFetch({}) });
39
+ expect(output()).toContain("No projects registered");
40
+ });
41
+ it("renders a clean state when a project has zero errors", async () => {
42
+ mkdirSync(join(home, ".ezcoder"), { recursive: true });
43
+ writeFileSync(join(home, ".ezcoder", "projects.json"), JSON.stringify({ proj_a: { name: "alpha", path: "/p/alpha" } }));
44
+ await listAllErrors({ homeDir: home, fetchFn: fakeFetch({ proj_a: [] }) });
45
+ const out = output();
46
+ expect(out).toContain("alpha");
47
+ expect(out).toContain("no open errors");
48
+ expect(out).toContain("All clean");
49
+ });
50
+ it("groups errors per project and aggregates a summary", async () => {
51
+ mkdirSync(join(home, ".ezcoder"), { recursive: true });
52
+ writeFileSync(join(home, ".ezcoder", "projects.json"), JSON.stringify({
53
+ proj_a: { name: "alpha", path: "/p/alpha" },
54
+ proj_b: { name: "beta", path: "/p/beta" },
55
+ }));
56
+ const aErrors = [
57
+ {
58
+ id: "err_1",
59
+ fingerprint: "fp1",
60
+ status: "open",
61
+ type: "TypeError",
62
+ message: "Cannot read foo",
63
+ stack: JSON.stringify([{ file: "/p/alpha/src/x.ts", line: 12, in_app: true }]),
64
+ occurrences: 5,
65
+ recurrence_count: 0,
66
+ last_seen_at: Date.now(),
67
+ branch: null,
68
+ },
69
+ {
70
+ id: "err_2",
71
+ fingerprint: "fp2",
72
+ status: "awaiting_review",
73
+ type: "RangeError",
74
+ message: "Bad index",
75
+ stack: JSON.stringify([{ file: "/p/alpha/src/y.ts", line: 7, in_app: true }]),
76
+ occurrences: 1,
77
+ recurrence_count: 0,
78
+ last_seen_at: Date.now(),
79
+ branch: "fix/pixel-err_2",
80
+ },
81
+ ];
82
+ const bErrors = [
83
+ {
84
+ id: "err_3",
85
+ fingerprint: "fp3",
86
+ status: "merged",
87
+ type: "Error",
88
+ message: "old, should be hidden",
89
+ stack: null,
90
+ occurrences: 1,
91
+ recurrence_count: 0,
92
+ last_seen_at: Date.now(),
93
+ branch: null,
94
+ },
95
+ ];
96
+ await listAllErrors({
97
+ homeDir: home,
98
+ fetchFn: fakeFetch({ proj_a: aErrors, proj_b: bErrors }),
99
+ });
100
+ const out = output();
101
+ expect(out).toContain("alpha");
102
+ expect(out).toContain("TypeError");
103
+ expect(out).toContain("Cannot read foo");
104
+ expect(out).toContain("/p/alpha/src/x.ts:12");
105
+ expect(out).toContain("RangeError");
106
+ expect(out).toContain("fix/pixel-err_2");
107
+ expect(out).toContain("beta");
108
+ expect(out).toContain("no open errors");
109
+ expect(out).not.toContain("old, should be hidden");
110
+ expect(out).toContain("1 open");
111
+ expect(out).toContain("1 awaiting review");
112
+ });
113
+ it("prints a per-project error when fetch fails for that project", async () => {
114
+ mkdirSync(join(home, ".ezcoder"), { recursive: true });
115
+ writeFileSync(join(home, ".ezcoder", "projects.json"), JSON.stringify({ proj_a: { name: "alpha", path: "/p/alpha" } }));
116
+ const failingFetch = (async () => new Response("oops", { status: 500 }));
117
+ await listAllErrors({ homeDir: home, fetchFn: failingFetch });
118
+ expect(output()).toContain("alpha: failed to fetch (500)");
119
+ });
120
+ it("fetchPixelEntries returns structured data with hasProjects=false when no map exists", async () => {
121
+ const result = await fetchPixelEntries({ homeDir: home, fetchFn: fakeFetch({}) });
122
+ expect(result).toEqual({ entries: [], unreachable: [], hasProjects: false });
123
+ });
124
+ it("fetchPixelEntries flattens errors from all projects, grouped and sorted", async () => {
125
+ mkdirSync(join(home, ".ezcoder"), { recursive: true });
126
+ writeFileSync(join(home, ".ezcoder", "projects.json"), JSON.stringify({
127
+ proj_a: { name: "alpha", path: "/p/a" },
128
+ proj_b: { name: "beta", path: "/p/b" },
129
+ }));
130
+ const aErrors = [
131
+ {
132
+ id: "err_1",
133
+ fingerprint: "fp1",
134
+ status: "open",
135
+ type: "TypeError",
136
+ message: "x",
137
+ stack: JSON.stringify([{ file: "/p/a/x.ts", line: 1, in_app: true }]),
138
+ occurrences: 5,
139
+ recurrence_count: 0,
140
+ last_seen_at: 0,
141
+ branch: null,
142
+ },
143
+ {
144
+ id: "err_merged",
145
+ fingerprint: "fp_merged",
146
+ status: "merged",
147
+ type: "Error",
148
+ message: "old",
149
+ stack: null,
150
+ occurrences: 1,
151
+ recurrence_count: 0,
152
+ last_seen_at: 0,
153
+ branch: null,
154
+ },
155
+ ];
156
+ const bErrors = [
157
+ {
158
+ id: "err_2",
159
+ fingerprint: "fp2",
160
+ status: "failed",
161
+ type: "RangeError",
162
+ message: "y",
163
+ stack: JSON.stringify([{ file: "/p/b/y.ts", line: 2, in_app: true }]),
164
+ occurrences: 1,
165
+ recurrence_count: 0,
166
+ last_seen_at: 0,
167
+ branch: null,
168
+ },
169
+ ];
170
+ const result = await fetchPixelEntries({
171
+ homeDir: home,
172
+ fetchFn: fakeFetch({ proj_a: aErrors, proj_b: bErrors }),
173
+ });
174
+ expect(result.hasProjects).toBe(true);
175
+ expect(result.entries).toHaveLength(2); // merged is filtered out
176
+ expect(result.entries.map((e) => e.projectName)).toEqual(["alpha", "beta"]);
177
+ expect(result.entries[0]?.location).toBe("x.ts:1");
178
+ });
179
+ it("fetchPixelEntries records unreachable projects on fetch failure", async () => {
180
+ mkdirSync(join(home, ".ezcoder"), { recursive: true });
181
+ writeFileSync(join(home, ".ezcoder", "projects.json"), JSON.stringify({ proj_a: { name: "alpha", path: "/p/a" } }));
182
+ const failingFetch = (async () => new Response("oops", { status: 500 }));
183
+ const result = await fetchPixelEntries({ homeDir: home, fetchFn: failingFetch });
184
+ expect(result.entries).toHaveLength(0);
185
+ expect(result.unreachable).toEqual(["alpha"]);
186
+ expect(result.hasProjects).toBe(true);
187
+ });
188
+ it("prefers the topmost in_app frame for the location line", async () => {
189
+ mkdirSync(join(home, ".ezcoder"), { recursive: true });
190
+ writeFileSync(join(home, ".ezcoder", "projects.json"), JSON.stringify({ proj_a: { name: "alpha", path: "/p" } }));
191
+ const errors = [
192
+ {
193
+ id: "err_1",
194
+ fingerprint: "fp",
195
+ status: "open",
196
+ type: "Error",
197
+ message: "x",
198
+ stack: JSON.stringify([
199
+ { file: "/p/node_modules/lib/index.js", line: 999, in_app: false },
200
+ { file: "/p/src/me.ts", line: 11, in_app: true },
201
+ ]),
202
+ occurrences: 1,
203
+ recurrence_count: 0,
204
+ last_seen_at: Date.now(),
205
+ branch: null,
206
+ },
207
+ ];
208
+ await listAllErrors({ homeDir: home, fetchFn: fakeFetch({ proj_a: errors }) });
209
+ const out = output();
210
+ expect(out).toContain("/p/src/me.ts:11");
211
+ expect(out).not.toContain(":999");
212
+ });
213
+ });
214
+ //# sourceMappingURL=pixel.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel.test.js","sourceRoot":"","sources":["../../src/core/pixel.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Stack-frame source map resolution.
3
+ *
4
+ * Browser SDKs send minified frames like
5
+ * { file: "https://app.com/dist/main.abc123.js", line: 1, col: 48201, fn: "<anon>" }
6
+ *
7
+ * Source maps emitted by bundlers (Vite, Webpack, Rollup, esbuild) translate
8
+ * those `(line, col)` coordinates back to the original source `(file, line, col, name)`.
9
+ *
10
+ * We resolve **client-side** in the runner: we walk the user's project
11
+ * directory looking for `.map` files whose name matches the minified
12
+ * filename in the stack frame. If found, we use `@jridgewell/trace-mapping`
13
+ * to look up each frame's original position.
14
+ *
15
+ * Limitations (deliberately documented):
16
+ * - Requires the maps to exist locally (project's `dist/`, `build/`, etc.).
17
+ * For deployed apps where the dev's machine has no build, server-side
18
+ * symbolication via uploaded maps is needed — that's a separate slice.
19
+ * - Walks up to 4 levels deep into common build dirs to keep cost bounded.
20
+ */
21
+ export interface StackFrame {
22
+ file: string;
23
+ line: number;
24
+ col: number;
25
+ fn: string;
26
+ in_app: boolean;
27
+ }
28
+ export declare class SourceMapResolver {
29
+ private readonly projectDir;
30
+ private readonly cache;
31
+ constructor(projectDir: string);
32
+ /**
33
+ * Resolve a minified stack into the original source. Frames that can't
34
+ * be resolved are returned unchanged so the caller still sees something.
35
+ */
36
+ resolveStack(stack: StackFrame[]): StackFrame[];
37
+ resolveFrame(frame: StackFrame): StackFrame;
38
+ private findMap;
39
+ private searchForMap;
40
+ }
41
+ /**
42
+ * Best-effort wrapper that swallows all errors. The runner calls this on
43
+ * every error fetch — if anything goes wrong, we don't want to break the
44
+ * whole TUI.
45
+ */
46
+ export declare function tryResolveStack(stack: StackFrame[], projectDir: string): StackFrame[];
47
+ //# sourceMappingURL=source-maps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-maps.d.ts","sourceRoot":"","sources":["../../src/core/source-maps.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;CACjB;AAUD,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;gBAEpC,UAAU,EAAE,MAAM;IAE/C;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE;IAI/C,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;IAsB3C,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,YAAY;CAWrB;AAgDD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CAOrF"}
@@ -0,0 +1,132 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
2
+ import { dirname, join, posix } from "node:path";
3
+ import { TraceMap, originalPositionFor } from "@jridgewell/trace-mapping";
4
+ const COMMON_BUILD_DIRS = ["dist", "build", ".next", "out", "public", ".vite"];
5
+ const MAX_DEPTH = 4;
6
+ export class SourceMapResolver {
7
+ projectDir;
8
+ cache = new Map();
9
+ constructor(projectDir) {
10
+ this.projectDir = projectDir;
11
+ }
12
+ /**
13
+ * Resolve a minified stack into the original source. Frames that can't
14
+ * be resolved are returned unchanged so the caller still sees something.
15
+ */
16
+ resolveStack(stack) {
17
+ return stack.map((f) => this.resolveFrame(f));
18
+ }
19
+ resolveFrame(frame) {
20
+ const minifiedName = filenameFromUrl(frame.file);
21
+ if (!minifiedName)
22
+ return frame;
23
+ const entry = this.findMap(minifiedName);
24
+ if (!entry)
25
+ return frame;
26
+ let resolved;
27
+ try {
28
+ resolved = originalPositionFor(entry.trace, { line: frame.line, column: frame.col });
29
+ }
30
+ catch {
31
+ return frame;
32
+ }
33
+ if (!resolved.source)
34
+ return frame;
35
+ const sourceAbs = posix.normalize(posix.join(entry.mapDir, resolved.source));
36
+ return {
37
+ file: sourceAbs,
38
+ line: resolved.line ?? frame.line,
39
+ col: resolved.column ?? frame.col,
40
+ fn: resolved.name || frame.fn,
41
+ in_app: !sourceAbs.includes("/node_modules/") && !sourceAbs.startsWith("webpack:///"),
42
+ };
43
+ }
44
+ findMap(minifiedName) {
45
+ const cached = this.cache.get(minifiedName);
46
+ if (cached !== undefined)
47
+ return cached;
48
+ const result = this.searchForMap(minifiedName);
49
+ this.cache.set(minifiedName, result);
50
+ return result;
51
+ }
52
+ searchForMap(minifiedName) {
53
+ for (const dir of COMMON_BUILD_DIRS) {
54
+ const root = join(this.projectDir, dir);
55
+ if (!existsSync(root))
56
+ continue;
57
+ const found = walkForMap(root, minifiedName, MAX_DEPTH);
58
+ if (found)
59
+ return loadMap(found);
60
+ }
61
+ const rootCandidate = join(this.projectDir, minifiedName + ".map");
62
+ if (existsSync(rootCandidate))
63
+ return loadMap(rootCandidate);
64
+ return null;
65
+ }
66
+ }
67
+ function filenameFromUrl(file) {
68
+ if (!file)
69
+ return null;
70
+ const cleaned = file.split("?")[0].split("#")[0];
71
+ const last = cleaned.split("/").pop();
72
+ return last || null;
73
+ }
74
+ function walkForMap(root, minifiedName, depth) {
75
+ const target = minifiedName + ".map";
76
+ const direct = join(root, target);
77
+ if (existsSync(direct))
78
+ return direct;
79
+ if (depth <= 0)
80
+ return null;
81
+ let entries;
82
+ try {
83
+ entries = readdirSync(root);
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ for (const entry of entries) {
89
+ if (entry.startsWith("."))
90
+ continue;
91
+ const child = join(root, entry);
92
+ if (!isDirectorySafe(child))
93
+ continue;
94
+ const found = walkForMap(child, minifiedName, depth - 1);
95
+ if (found)
96
+ return found;
97
+ }
98
+ return null;
99
+ }
100
+ function isDirectorySafe(path) {
101
+ try {
102
+ return statSync(path).isDirectory();
103
+ }
104
+ catch {
105
+ return false;
106
+ }
107
+ }
108
+ function loadMap(mapPath) {
109
+ try {
110
+ const raw = readFileSync(mapPath, "utf8");
111
+ const parsed = JSON.parse(raw);
112
+ return { trace: new TraceMap(parsed), mapDir: dirname(mapPath) };
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ }
118
+ /**
119
+ * Best-effort wrapper that swallows all errors. The runner calls this on
120
+ * every error fetch — if anything goes wrong, we don't want to break the
121
+ * whole TUI.
122
+ */
123
+ export function tryResolveStack(stack, projectDir) {
124
+ try {
125
+ const resolver = new SourceMapResolver(projectDir);
126
+ return resolver.resolveStack(stack);
127
+ }
128
+ catch {
129
+ return stack;
130
+ }
131
+ }
132
+ //# sourceMappingURL=source-maps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-maps.js","sourceRoot":"","sources":["../../src/core/source-maps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=source-maps.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-maps.test.d.ts","sourceRoot":"","sources":["../../src/core/source-maps.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,175 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { SourceMapResolver, tryResolveStack } from "./source-maps.js";
6
+ let dir;
7
+ beforeEach(() => {
8
+ dir = mkdtempSync(join(tmpdir(), "ez-pixel-srcmap-"));
9
+ });
10
+ afterEach(() => rmSync(dir, { recursive: true, force: true }));
11
+ /**
12
+ * Build a synthetic source map for a tiny minified file. We don't go
13
+ * through a real bundler — we hand-craft the map so the test is fast
14
+ * and deterministic. The format follows the v3 source-map spec:
15
+ * https://sourcemaps.info/spec.html
16
+ *
17
+ * Source: src/foo.ts at line 5, col 10, function name "thrower"
18
+ * Maps to minified: line 1, col 100
19
+ *
20
+ * VLQ encoding: AAAA = 0,0,0,0 ; gGAGW = 0,4,0,5,11 (we don't need to
21
+ * decode by hand — we just emit a known-good mapping using a single
22
+ * segment that the trace-mapping lib understands).
23
+ *
24
+ * The `mappings` field below is hand-encoded for ONE segment:
25
+ * minified col 100 → source 0, line 5, col 10, name 0
26
+ * In VLQ this is "oGAKAA":
27
+ * o = 7 bits = relative col delta of 100 (encoded by us via the lib)
28
+ * Rather than encode by hand we use a real generator.
29
+ */
30
+ function makeFixture() {
31
+ // Use a real source-map generator approach: we ship a tiny generated map.
32
+ // For a synthetic test, we use a manually-written but spec-valid map by
33
+ // letting trace-mapping decode our segments. Easier: encode VLQ at runtime
34
+ // via a minimal helper.
35
+ // VLQ encode helpers (one segment of 5 ints):
36
+ const VLQ_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
37
+ const encode = (n) => {
38
+ let value = n < 0 ? (-n << 1) | 1 : n << 1;
39
+ let out = "";
40
+ do {
41
+ let digit = value & 31;
42
+ value >>>= 5;
43
+ if (value > 0)
44
+ digit |= 32;
45
+ out += VLQ_CHARS[digit];
46
+ } while (value > 0);
47
+ return out;
48
+ };
49
+ const seg = (genCol, srcIdx, line, col, nameIdx) => encode(genCol) + encode(srcIdx) + encode(line) + encode(col) + encode(nameIdx);
50
+ // Single segment: minified col 100 → src[0], line 4 (0-indexed), col 10, name[0]
51
+ // Source maps use 0-indexed lines internally; trace-mapping returns 1-indexed.
52
+ const mappings = seg(100, 0, 4, 10, 0);
53
+ return {
54
+ version: 3,
55
+ file: "main.min.js",
56
+ sources: ["src/foo.ts"],
57
+ names: ["thrower"],
58
+ mappings,
59
+ };
60
+ }
61
+ describe("SourceMapResolver", () => {
62
+ it("resolves a minified frame to its original source", () => {
63
+ mkdirSync(join(dir, "dist"));
64
+ writeFileSync(join(dir, "dist", "main.min.js.map"), JSON.stringify(makeFixture()));
65
+ const resolver = new SourceMapResolver(dir);
66
+ const resolved = resolver.resolveFrame({
67
+ file: "https://app.com/dist/main.min.js",
68
+ line: 1,
69
+ col: 100,
70
+ fn: "<anon>",
71
+ in_app: true,
72
+ });
73
+ // The fixture maps (line=1, col=100) → src/foo.ts line 5, col 10, name "thrower"
74
+ expect(resolved.fn).toBe("thrower");
75
+ expect(resolved.line).toBe(5);
76
+ expect(resolved.col).toBe(10);
77
+ expect(resolved.file.endsWith("src/foo.ts")).toBe(true);
78
+ });
79
+ it("returns the frame unchanged when no map is found", () => {
80
+ const resolver = new SourceMapResolver(dir);
81
+ const original = {
82
+ file: "https://app.com/main.min.js",
83
+ line: 1,
84
+ col: 100,
85
+ fn: "x",
86
+ in_app: true,
87
+ };
88
+ expect(resolver.resolveFrame(original)).toEqual(original);
89
+ });
90
+ it("walks nested build directories to find maps", () => {
91
+ mkdirSync(join(dir, "build", "static", "js"), { recursive: true });
92
+ writeFileSync(join(dir, "build", "static", "js", "main.min.js.map"), JSON.stringify(makeFixture()));
93
+ const resolver = new SourceMapResolver(dir);
94
+ const resolved = resolver.resolveFrame({
95
+ file: "https://app.com/static/js/main.min.js",
96
+ line: 1,
97
+ col: 100,
98
+ fn: "<anon>",
99
+ in_app: true,
100
+ });
101
+ expect(resolved.line).toBe(5);
102
+ });
103
+ it("strips query strings from the URL when matching .map filename", () => {
104
+ mkdirSync(join(dir, "dist"));
105
+ writeFileSync(join(dir, "dist", "main.min.js.map"), JSON.stringify(makeFixture()));
106
+ const resolver = new SourceMapResolver(dir);
107
+ const resolved = resolver.resolveFrame({
108
+ file: "https://app.com/dist/main.min.js?v=cachebuster",
109
+ line: 1,
110
+ col: 100,
111
+ fn: "<anon>",
112
+ in_app: true,
113
+ });
114
+ expect(resolved.line).toBe(5);
115
+ });
116
+ it("falls back gracefully if the map file is corrupt JSON", () => {
117
+ mkdirSync(join(dir, "dist"));
118
+ writeFileSync(join(dir, "dist", "main.min.js.map"), "{ not valid json");
119
+ const resolver = new SourceMapResolver(dir);
120
+ const original = {
121
+ file: "https://app.com/dist/main.min.js",
122
+ line: 1,
123
+ col: 100,
124
+ fn: "x",
125
+ in_app: true,
126
+ };
127
+ expect(resolver.resolveFrame(original)).toEqual(original);
128
+ });
129
+ it("caches map lookups so repeated frames are cheap", () => {
130
+ mkdirSync(join(dir, "dist"));
131
+ writeFileSync(join(dir, "dist", "main.min.js.map"), JSON.stringify(makeFixture()));
132
+ const resolver = new SourceMapResolver(dir);
133
+ const frame = {
134
+ file: "https://app.com/dist/main.min.js",
135
+ line: 1,
136
+ col: 100,
137
+ fn: "<anon>",
138
+ in_app: true,
139
+ };
140
+ const a = resolver.resolveFrame(frame);
141
+ const b = resolver.resolveFrame(frame);
142
+ expect(a).toEqual(b);
143
+ });
144
+ });
145
+ describe("tryResolveStack", () => {
146
+ it("resolves a multi-frame stack and preserves frame order", () => {
147
+ mkdirSync(join(dir, "dist"));
148
+ writeFileSync(join(dir, "dist", "main.min.js.map"), JSON.stringify(makeFixture()));
149
+ const stack = [
150
+ {
151
+ file: "https://app.com/dist/main.min.js",
152
+ line: 1,
153
+ col: 100,
154
+ fn: "<anon>",
155
+ in_app: true,
156
+ },
157
+ {
158
+ file: "https://app.com/dist/main.min.js",
159
+ line: 1,
160
+ col: 100,
161
+ fn: "<anon>",
162
+ in_app: true,
163
+ },
164
+ ];
165
+ const resolved = tryResolveStack(stack, dir);
166
+ expect(resolved).toHaveLength(2);
167
+ expect(resolved[0]?.line).toBe(5);
168
+ expect(resolved[1]?.line).toBe(5);
169
+ });
170
+ it("never throws — returns input unchanged on any failure", () => {
171
+ const result = tryResolveStack([{ file: "x", line: 1, col: 1, fn: "f", in_app: true }], "/nonexistent/path");
172
+ expect(result).toEqual([{ file: "x", line: 1, col: 1, fn: "f", in_app: true }]);
173
+ });
174
+ });
175
+ //# sourceMappingURL=source-maps.test.js.map