@alwaysmeticulous/cli 2.314.0 → 2.316.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 (73) hide show
  1. package/dist/commands/agent/js-coverage.command.d.ts +29 -0
  2. package/dist/commands/agent/js-coverage.command.d.ts.map +1 -1
  3. package/dist/commands/agent/js-coverage.command.handler.spec.d.ts +2 -0
  4. package/dist/commands/agent/js-coverage.command.handler.spec.d.ts.map +1 -0
  5. package/dist/commands/agent/js-coverage.command.handler.spec.js +148 -0
  6. package/dist/commands/agent/js-coverage.command.handler.spec.js.map +1 -0
  7. package/dist/commands/agent/js-coverage.command.js +120 -22
  8. package/dist/commands/agent/js-coverage.command.js.map +1 -1
  9. package/dist/commands/agent/js-coverage.command.spec.js +83 -2
  10. package/dist/commands/agent/js-coverage.command.spec.js.map +1 -1
  11. package/dist/commands/agent/test-run-diffs.command.d.ts.map +1 -1
  12. package/dist/commands/agent/test-run-diffs.command.js +10 -5
  13. package/dist/commands/agent/test-run-diffs.command.js.map +1 -1
  14. package/dist/commands/agent/test-run-diffs.command.spec.js +17 -2
  15. package/dist/commands/agent/test-run-diffs.command.spec.js.map +1 -1
  16. package/dist/commands/all-commands.d.ts.map +1 -1
  17. package/dist/commands/all-commands.js +4 -2
  18. package/dist/commands/all-commands.js.map +1 -1
  19. package/dist/commands/auth/__tests__/get-project.command.spec.js +9 -3
  20. package/dist/commands/auth/__tests__/get-project.command.spec.js.map +1 -1
  21. package/dist/commands/auth/__tests__/set-project.command.spec.js +9 -4
  22. package/dist/commands/auth/__tests__/set-project.command.spec.js.map +1 -1
  23. package/dist/commands/auth/__tests__/whoami.command.spec.js +40 -2
  24. package/dist/commands/auth/__tests__/whoami.command.spec.js.map +1 -1
  25. package/dist/commands/ci/agent-test.command.d.ts +1 -0
  26. package/dist/commands/ci/agent-test.command.d.ts.map +1 -1
  27. package/dist/commands/ci/agent-test.command.js +19 -4
  28. package/dist/commands/ci/agent-test.command.js.map +1 -1
  29. package/dist/commands/crawl.command.d.ts +11 -0
  30. package/dist/commands/crawl.command.d.ts.map +1 -0
  31. package/dist/commands/crawl.command.js +118 -0
  32. package/dist/commands/crawl.command.js.map +1 -0
  33. package/dist/commands/record/__tests__/backend-dev-command.utils.spec.d.ts +2 -0
  34. package/dist/commands/record/__tests__/backend-dev-command.utils.spec.d.ts.map +1 -0
  35. package/dist/commands/record/__tests__/backend-dev-command.utils.spec.js +94 -0
  36. package/dist/commands/record/__tests__/backend-dev-command.utils.spec.js.map +1 -0
  37. package/dist/commands/record/__tests__/backend-sidecar.utils.spec.d.ts +2 -0
  38. package/dist/commands/record/__tests__/backend-sidecar.utils.spec.d.ts.map +1 -0
  39. package/dist/commands/record/__tests__/backend-sidecar.utils.spec.js +183 -0
  40. package/dist/commands/record/__tests__/backend-sidecar.utils.spec.js.map +1 -0
  41. package/dist/commands/record/__tests__/backend.command.spec.d.ts +2 -0
  42. package/dist/commands/record/__tests__/backend.command.spec.d.ts.map +1 -0
  43. package/dist/commands/record/__tests__/backend.command.spec.js +219 -0
  44. package/dist/commands/record/__tests__/backend.command.spec.js.map +1 -0
  45. package/dist/commands/record/backend-dev-command.utils.d.ts +29 -0
  46. package/dist/commands/record/backend-dev-command.utils.d.ts.map +1 -0
  47. package/dist/commands/record/backend-dev-command.utils.js +91 -0
  48. package/dist/commands/record/backend-dev-command.utils.js.map +1 -0
  49. package/dist/commands/record/backend-sidecar.utils.d.ts +39 -0
  50. package/dist/commands/record/backend-sidecar.utils.d.ts.map +1 -0
  51. package/dist/commands/record/backend-sidecar.utils.js +273 -0
  52. package/dist/commands/record/backend-sidecar.utils.js.map +1 -0
  53. package/dist/commands/record/backend.command.d.ts +14 -0
  54. package/dist/commands/record/backend.command.d.ts.map +1 -0
  55. package/dist/commands/record/backend.command.js +189 -0
  56. package/dist/commands/record/backend.command.js.map +1 -0
  57. package/dist/commands/record/index.d.ts.map +1 -1
  58. package/dist/commands/record/index.js +4 -2
  59. package/dist/commands/record/index.js.map +1 -1
  60. package/dist/main.d.ts.map +1 -1
  61. package/dist/main.js +6 -2
  62. package/dist/main.js.map +1 -1
  63. package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js +7 -4
  64. package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js.map +1 -1
  65. package/dist/utils/constants.d.ts +1 -0
  66. package/dist/utils/constants.d.ts.map +1 -1
  67. package/dist/utils/constants.js +4 -3
  68. package/dist/utils/constants.js.map +1 -1
  69. package/dist/utils/resolve-test-run-from-commit.d.ts +8 -4
  70. package/dist/utils/resolve-test-run-from-commit.d.ts.map +1 -1
  71. package/dist/utils/resolve-test-run-from-commit.js +10 -9
  72. package/dist/utils/resolve-test-run-from-commit.js.map +1 -1
  73. package/package.json +9 -9
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="03de1404-1280-5229-8aa8-98fba2b88cb6")}catch(e){}}();
3
+
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const events_1 = require("events");
6
+ const vitest_1 = require("vitest");
7
+ const backend_command_1 = require("../backend.command");
8
+ const loggerMock = {
9
+ info: vitest_1.vi.fn(),
10
+ warn: vitest_1.vi.fn(),
11
+ error: vitest_1.vi.fn(),
12
+ debug: vitest_1.vi.fn(),
13
+ };
14
+ class FakeChild extends events_1.EventEmitter {
15
+ exitCode = null;
16
+ signalCode = null;
17
+ kill = vitest_1.vi.fn();
18
+ }
19
+ const mocks = vitest_1.vi.hoisted(() => ({
20
+ resolveApiTokenWithOAuth: vitest_1.vi.fn(),
21
+ createClientWithOAuth: vitest_1.vi.fn(),
22
+ getProject: vitest_1.vi.fn(),
23
+ resolveProjectIdentifier: vitest_1.vi.fn(),
24
+ fetchAsset: vitest_1.vi.fn(),
25
+ resolveSidecarPort: vitest_1.vi.fn(),
26
+ startSidecar: vitest_1.vi.fn(),
27
+ spawn: vitest_1.vi.fn(),
28
+ }));
29
+ vitest_1.vi.mock("../../../command-utils/sentry.utils", () => ({
30
+ wrapHandler: (fn) => fn,
31
+ }));
32
+ vitest_1.vi.mock("@alwaysmeticulous/common", async (importOriginal) => {
33
+ const actual = await importOriginal();
34
+ return {
35
+ ...actual,
36
+ initLogger: () => loggerMock,
37
+ };
38
+ });
39
+ vitest_1.vi.mock("@alwaysmeticulous/client", () => ({
40
+ resolveApiTokenWithOAuth: mocks.resolveApiTokenWithOAuth,
41
+ createClientWithOAuth: mocks.createClientWithOAuth,
42
+ getProject: mocks.getProject,
43
+ }));
44
+ vitest_1.vi.mock("@alwaysmeticulous/downloading-helpers", () => ({
45
+ fetchAsset: mocks.fetchAsset,
46
+ }));
47
+ vitest_1.vi.mock("../../../utils/resolve-project-identifier", () => ({
48
+ resolveProjectIdentifier: mocks.resolveProjectIdentifier,
49
+ }));
50
+ vitest_1.vi.mock("../backend-sidecar.utils", async (importOriginal) => {
51
+ const actual = await importOriginal();
52
+ return {
53
+ ...actual,
54
+ resolveSidecarPort: mocks.resolveSidecarPort,
55
+ startSidecar: mocks.startSidecar,
56
+ };
57
+ });
58
+ vitest_1.vi.mock("child_process", () => ({
59
+ spawn: mocks.spawn,
60
+ }));
61
+ const runHandler = (args = {}) => backend_command_1.recordBackendCommand.handler({
62
+ apiToken: null,
63
+ recordingToken: null,
64
+ port: 9670,
65
+ exportMode: "s3",
66
+ localOutputDir: null,
67
+ injectSidecarVar: true,
68
+ ...args,
69
+ });
70
+ const SIDECAR_URL = "http://127.0.0.1:9670";
71
+ (0, vitest_1.describe)("record backend command", () => {
72
+ const originalArgv = process.argv;
73
+ let sidecarHandle;
74
+ let child;
75
+ let signalSnapshot;
76
+ (0, vitest_1.beforeEach)(() => {
77
+ vitest_1.vi.clearAllMocks();
78
+ process.argv = ["node", "main.js", "record", "backend"];
79
+ sidecarHandle = {
80
+ url: SIDECAR_URL,
81
+ port: 9670,
82
+ flush: vitest_1.vi.fn().mockResolvedValue(undefined),
83
+ stop: vitest_1.vi.fn().mockResolvedValue(undefined),
84
+ };
85
+ child = new FakeChild();
86
+ mocks.fetchAsset.mockResolvedValue("/tmp/sidecar.bundle.cjs");
87
+ mocks.resolveSidecarPort.mockResolvedValue(9670);
88
+ mocks.startSidecar.mockResolvedValue(sidecarHandle);
89
+ mocks.spawn.mockReturnValue(child);
90
+ signalSnapshot = {
91
+ INT: process.listeners("SIGINT"),
92
+ TERM: process.listeners("SIGTERM"),
93
+ };
94
+ });
95
+ (0, vitest_1.afterEach)(() => {
96
+ process.argv = originalArgv;
97
+ // The handler registers process signal listeners; drop the ones this test added.
98
+ for (const listener of process.listeners("SIGINT")) {
99
+ if (!signalSnapshot.INT.includes(listener)) {
100
+ process.removeListener("SIGINT", listener);
101
+ }
102
+ }
103
+ for (const listener of process.listeners("SIGTERM")) {
104
+ if (!signalSnapshot.TERM.includes(listener)) {
105
+ process.removeListener("SIGTERM", listener);
106
+ }
107
+ }
108
+ });
109
+ const runWrapped = async (args, passthrough) => {
110
+ process.argv = [
111
+ "node",
112
+ "main.js",
113
+ "record",
114
+ "backend",
115
+ "--",
116
+ ...passthrough,
117
+ ];
118
+ const handlerDone = runHandler(args);
119
+ // Let the handler reach the spawn before the child "exits".
120
+ await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(mocks.spawn).toHaveBeenCalled());
121
+ child.exitCode = 0;
122
+ child.emit("exit", 0, null);
123
+ await handlerDone;
124
+ };
125
+ (0, vitest_1.it)("uses --recordingToken without touching the API", async () => {
126
+ await runWrapped({ recordingToken: "direct-token" }, ["node", "dev.js"]);
127
+ (0, vitest_1.expect)(mocks.resolveApiTokenWithOAuth).not.toHaveBeenCalled();
128
+ (0, vitest_1.expect)(mocks.getProject).not.toHaveBeenCalled();
129
+ (0, vitest_1.expect)(mocks.startSidecar).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
130
+ env: vitest_1.expect.objectContaining({
131
+ METICULOUS_RECORDING_TOKEN: "direct-token",
132
+ METICULOUS_EXPORT_MODE: "s3",
133
+ }),
134
+ }));
135
+ (0, vitest_1.expect)(sidecarHandle.stop).toHaveBeenCalled();
136
+ });
137
+ (0, vitest_1.it)("resolves the recording token and project name via the API", async () => {
138
+ mocks.resolveApiTokenWithOAuth.mockResolvedValue("api-token");
139
+ mocks.resolveProjectIdentifier.mockResolvedValue({ projectId: "p-1" });
140
+ mocks.createClientWithOAuth.mockResolvedValue({});
141
+ mocks.getProject.mockResolvedValue({
142
+ recordingToken: "project-recording-token",
143
+ name: "my-project",
144
+ organization: { name: "my-org" },
145
+ });
146
+ await runWrapped({}, ["node", "dev.js"]);
147
+ (0, vitest_1.expect)(mocks.startSidecar).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
148
+ env: vitest_1.expect.objectContaining({
149
+ METICULOUS_RECORDING_TOKEN: "project-recording-token",
150
+ METICULOUS_PROJECT_NAME: "my-project",
151
+ }),
152
+ }));
153
+ });
154
+ (0, vitest_1.it)("fails cleanly when the project has no recording token", async () => {
155
+ mocks.resolveApiTokenWithOAuth.mockResolvedValue("api-token");
156
+ mocks.resolveProjectIdentifier.mockResolvedValue({ projectId: "p-1" });
157
+ mocks.createClientWithOAuth.mockResolvedValue({});
158
+ mocks.getProject.mockResolvedValue({
159
+ recordingToken: null,
160
+ name: "my-project",
161
+ organization: { name: "my-org" },
162
+ });
163
+ process.argv = ["node", "main.js", "record", "backend", "--", "node"];
164
+ await (0, vitest_1.expect)(runHandler({})).rejects.toThrow(/recording token/);
165
+ (0, vitest_1.expect)(mocks.startSidecar).not.toHaveBeenCalled();
166
+ });
167
+ (0, vitest_1.it)("injects --var into a recognized wrangler dev command", async () => {
168
+ await runWrapped({ recordingToken: "t" }, ["npx", "wrangler", "dev"]);
169
+ (0, vitest_1.expect)(mocks.spawn).toHaveBeenCalledWith("npx", ["wrangler", "dev", "--var", `METICULOUS_SIDECAR_URL:${SIDECAR_URL}`], vitest_1.expect.objectContaining({
170
+ stdio: "inherit",
171
+ env: vitest_1.expect.objectContaining({
172
+ METICULOUS_SIDECAR_URL: SIDECAR_URL,
173
+ }),
174
+ }));
175
+ });
176
+ (0, vitest_1.it)("does not inject with --no-injectSidecarVar and prints instructions", async () => {
177
+ await runWrapped({ recordingToken: "t", injectSidecarVar: false }, [
178
+ "npx",
179
+ "wrangler",
180
+ "dev",
181
+ ]);
182
+ (0, vitest_1.expect)(mocks.spawn).toHaveBeenCalledWith("npx", ["wrangler", "dev"], vitest_1.expect.anything());
183
+ (0, vitest_1.expect)(loggerMock.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining("wrangler dev --var METICULOUS_SIDECAR_URL:"));
184
+ });
185
+ (0, vitest_1.it)("prints instructions for unrecognized dev commands", async () => {
186
+ await runWrapped({ recordingToken: "t" }, ["npm", "run", "dev"]);
187
+ (0, vitest_1.expect)(mocks.spawn).toHaveBeenCalledWith("npm", ["run", "dev"], vitest_1.expect.anything());
188
+ (0, vitest_1.expect)(loggerMock.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining(".dev.vars"));
189
+ });
190
+ (0, vitest_1.it)("rejects a positional dev command passed without --", async () => {
191
+ process.argv = [
192
+ "node",
193
+ "main.js",
194
+ "record",
195
+ "backend",
196
+ "npx",
197
+ "wrangler",
198
+ "dev",
199
+ ];
200
+ await (0, vitest_1.expect)(runHandler({
201
+ recordingToken: "t",
202
+ devCommand: ["npx", "wrangler", "dev"],
203
+ })).rejects.toThrow(/-- separator/);
204
+ (0, vitest_1.expect)(mocks.startSidecar).not.toHaveBeenCalled();
205
+ (0, vitest_1.expect)(mocks.spawn).not.toHaveBeenCalled();
206
+ });
207
+ (0, vitest_1.it)("runs sidecar-only mode until a signal arrives", async () => {
208
+ process.argv = ["node", "main.js", "record", "backend"];
209
+ const handlerDone = runHandler({ recordingToken: "t" });
210
+ await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(mocks.startSidecar).toHaveBeenCalled());
211
+ await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(loggerMock.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining("Ctrl-C")));
212
+ process.emit("SIGINT");
213
+ await handlerDone;
214
+ (0, vitest_1.expect)(sidecarHandle.stop).toHaveBeenCalled();
215
+ (0, vitest_1.expect)(mocks.spawn).not.toHaveBeenCalled();
216
+ });
217
+ });
218
+ //# sourceMappingURL=backend.command.spec.js.map
219
+ //# debugId=03de1404-1280-5229-8aa8-98fba2b88cb6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.command.spec.js","sources":["../../../../src/commands/record/__tests__/backend.command.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"03de1404-1280-5229-8aa8-98fba2b88cb6"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Pure helpers for `meticulous record backend`: extracting the passthrough
3
+ * dev command from raw argv and injecting the sidecar URL into recognized
4
+ * wrangler invocations.
5
+ */
6
+ /**
7
+ * Returns the tokens after the first standalone `--` in the given argv, or
8
+ * null when there is no `--` (or nothing follows it). Reads raw argv rather
9
+ * than yargs' parsed positionals so passthrough flags (e.g. `--port` meant
10
+ * for wrangler) and numeric-looking tokens survive untouched.
11
+ */
12
+ export declare const extractPassthroughCommand: (argv: string[]) => string[] | null;
13
+ export type DevCommandKind = "wrangler-dev" | "wrangler-pages-dev" | "unknown";
14
+ /**
15
+ * Classifies a passthrough dev command so the sidecar URL can be injected
16
+ * with the right wrangler flag. Only positively-recognized invocations are
17
+ * classified — anything else (npm scripts, custom wrappers) is "unknown" and
18
+ * gets printed instructions instead of argv surgery.
19
+ */
20
+ export declare const classifyDevCommand: (tokens: string[]) => DevCommandKind;
21
+ export declare const SIDECAR_URL_VAR_NAME = "METICULOUS_SIDECAR_URL";
22
+ /**
23
+ * Appends the flag that exposes the sidecar URL to the worker as a var:
24
+ * `wrangler dev` takes `--var KEY:VALUE`, `wrangler pages dev` takes
25
+ * `--binding KEY=VALUE`. Unknown commands are returned unchanged — the
26
+ * caller prints manual instructions instead.
27
+ */
28
+ export declare const injectSidecarVar: (tokens: string[], kind: DevCommandKind, sidecarUrl: string) => string[];
29
+ //# sourceMappingURL=backend-dev-command.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-dev-command.utils.d.ts","sourceRoot":"","sources":["../../../src/commands/record/backend-dev-command.utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,SAAU,MAAM,EAAE,KAAG,MAAM,EAAE,GAAG,IAOrE,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,oBAAoB,GAAG,SAAS,CAAC;AAa/E;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,WAAY,MAAM,EAAE,KAAG,cA+BrD,CAAC;AAEF,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,WACnB,MAAM,EAAE,QACV,cAAc,cACR,MAAM,KACjB,MAAM,EASR,CAAC"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9f9f2445-b2f8-5f94-89e2-77d47ff1d9ab")}catch(e){}}();
3
+
4
+ /**
5
+ * Pure helpers for `meticulous record backend`: extracting the passthrough
6
+ * dev command from raw argv and injecting the sidecar URL into recognized
7
+ * wrangler invocations.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.injectSidecarVar = exports.SIDECAR_URL_VAR_NAME = exports.classifyDevCommand = exports.extractPassthroughCommand = void 0;
11
+ /**
12
+ * Returns the tokens after the first standalone `--` in the given argv, or
13
+ * null when there is no `--` (or nothing follows it). Reads raw argv rather
14
+ * than yargs' parsed positionals so passthrough flags (e.g. `--port` meant
15
+ * for wrangler) and numeric-looking tokens survive untouched.
16
+ */
17
+ const extractPassthroughCommand = (argv) => {
18
+ const separatorIndex = argv.indexOf("--");
19
+ if (separatorIndex === -1) {
20
+ return null;
21
+ }
22
+ const passthrough = argv.slice(separatorIndex + 1);
23
+ return passthrough.length > 0 ? passthrough : null;
24
+ };
25
+ exports.extractPassthroughCommand = extractPassthroughCommand;
26
+ /** Package-runner prefixes to skip when looking for the real binary. */
27
+ const RUNNERS = new Set(["npx", "bunx", "yarn"]);
28
+ const PNPM_SUBCOMMANDS = new Set(["exec", "dlx", "run"]);
29
+ const RUNNER_FLAGS = new Set(["-y", "--yes", "-q", "--quiet", "--silent"]);
30
+ const isWranglerToken = (token) => token === "wrangler" ||
31
+ token.endsWith("/wrangler") ||
32
+ token.endsWith("/wrangler.cmd") ||
33
+ token === "wrangler.cmd";
34
+ /**
35
+ * Classifies a passthrough dev command so the sidecar URL can be injected
36
+ * with the right wrangler flag. Only positively-recognized invocations are
37
+ * classified — anything else (npm scripts, custom wrappers) is "unknown" and
38
+ * gets printed instructions instead of argv surgery.
39
+ */
40
+ const classifyDevCommand = (tokens) => {
41
+ let index = 0;
42
+ // Skip package runners and their common flags: `npx [-y] wrangler ...`,
43
+ // `pnpm [exec|dlx] wrangler ...`, `yarn wrangler ...`, `bunx wrangler ...`.
44
+ if (index < tokens.length) {
45
+ const first = tokens[index];
46
+ if (RUNNERS.has(first)) {
47
+ index++;
48
+ }
49
+ else if (first === "pnpm") {
50
+ index++;
51
+ if (index < tokens.length && PNPM_SUBCOMMANDS.has(tokens[index])) {
52
+ index++;
53
+ }
54
+ }
55
+ while (index < tokens.length && RUNNER_FLAGS.has(tokens[index])) {
56
+ index++;
57
+ }
58
+ }
59
+ if (index >= tokens.length || !isWranglerToken(tokens[index])) {
60
+ return "unknown";
61
+ }
62
+ index++;
63
+ if (tokens[index] === "dev") {
64
+ return "wrangler-dev";
65
+ }
66
+ if (tokens[index] === "pages" && tokens[index + 1] === "dev") {
67
+ return "wrangler-pages-dev";
68
+ }
69
+ return "unknown";
70
+ };
71
+ exports.classifyDevCommand = classifyDevCommand;
72
+ exports.SIDECAR_URL_VAR_NAME = "METICULOUS_SIDECAR_URL";
73
+ /**
74
+ * Appends the flag that exposes the sidecar URL to the worker as a var:
75
+ * `wrangler dev` takes `--var KEY:VALUE`, `wrangler pages dev` takes
76
+ * `--binding KEY=VALUE`. Unknown commands are returned unchanged — the
77
+ * caller prints manual instructions instead.
78
+ */
79
+ const injectSidecarVar = (tokens, kind, sidecarUrl) => {
80
+ switch (kind) {
81
+ case "wrangler-dev":
82
+ return [...tokens, "--var", `${exports.SIDECAR_URL_VAR_NAME}:${sidecarUrl}`];
83
+ case "wrangler-pages-dev":
84
+ return [...tokens, "--binding", `${exports.SIDECAR_URL_VAR_NAME}=${sidecarUrl}`];
85
+ case "unknown":
86
+ return tokens;
87
+ }
88
+ };
89
+ exports.injectSidecarVar = injectSidecarVar;
90
+ //# sourceMappingURL=backend-dev-command.utils.js.map
91
+ //# debugId=9f9f2445-b2f8-5f94-89e2-77d47ff1d9ab
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-dev-command.utils.js","sources":["../../../src/commands/record/backend-dev-command.utils.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"9f9f2445-b2f8-5f94-89e2-77d47ff1d9ab"}
@@ -0,0 +1,39 @@
1
+ export declare const DEFAULT_SIDECAR_PORT = 9670;
2
+ export interface SidecarHandle {
3
+ url: string;
4
+ port: number;
5
+ /** Best-effort force-flush of buffered spans (never rejects). */
6
+ flush: () => Promise<void>;
7
+ /** Flushes then terminates the sidecar process. Idempotent. */
8
+ stop: () => Promise<void>;
9
+ }
10
+ export interface StartSidecarOptions {
11
+ /** Path to the fetched sidecar bundle (node-runnable .cjs). */
12
+ bundlePath: string;
13
+ /** Concrete port — resolve with resolveSidecarPort first. */
14
+ port: number;
15
+ /** Recorder env (METICULOUS_*) merged over the CLI's own process.env. */
16
+ env: Record<string, string>;
17
+ /**
18
+ * Called when the sidecar exits unexpectedly and the single automatic
19
+ * restart has already been used — recording has stopped for good.
20
+ */
21
+ onRecordingStopped?: () => void;
22
+ }
23
+ /**
24
+ * Resolves the port the sidecar will listen on. `requested === 0` always
25
+ * picks an ephemeral port. A busy requested port falls back to an ephemeral
26
+ * one in wrapped mode (the CLI controls the URL injected into the worker) but
27
+ * is a hard error in sidecar-only mode, where the user is about to configure
28
+ * the printed URL by hand and needs it predictable.
29
+ */
30
+ export declare const resolveSidecarPort: (requested: number, mode: "wrapped" | "sidecar-only") => Promise<number>;
31
+ /**
32
+ * Spawns the sidecar bundle as a detached child process, waits for it to
33
+ * become healthy, and supervises it: one automatic restart on the same port
34
+ * if it dies unexpectedly (the worker holds the old URL, so the port must be
35
+ * reused), after which recording is declared stopped without affecting the
36
+ * wrapped dev command.
37
+ */
38
+ export declare const startSidecar: (options: StartSidecarOptions) => Promise<SidecarHandle>;
39
+ //# sourceMappingURL=backend-sidecar.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-sidecar.utils.d.ts","sourceRoot":"","sources":["../../../src/commands/record/backend-sidecar.utils.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAQzC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AA6BD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,cAClB,MAAM,QACX,SAAS,GAAG,cAAc,KAC/B,OAAO,CAAC,MAAM,CAiBhB,CAAC;AA8HF;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,YACd,mBAAmB,KAC3B,OAAO,CAAC,aAAa,CAmGvB,CAAC"}