@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 @@
1
+ {"version":3,"file":"crawl.command.d.ts","sourceRoot":"","sources":["../../src/commands/crawl.command.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAS3C,UAAU,OAAO;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;CACtB;AAiHD,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CA+BxD,CAAC"}
@@ -0,0 +1,118 @@
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]="462f67fa-56e2-5011-be80-1531fc5726b5")}catch(e){}}();
3
+
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.crawlCommand = void 0;
6
+ const client_1 = require("@alwaysmeticulous/client");
7
+ const common_1 = require("@alwaysmeticulous/common");
8
+ const downloading_helpers_1 = require("@alwaysmeticulous/downloading-helpers");
9
+ const common_options_1 = require("../command-utils/common-options");
10
+ const sentry_utils_1 = require("../command-utils/sentry.utils");
11
+ const resolve_project_identifier_1 = require("../utils/resolve-project-identifier");
12
+ const RUN_CRAWL_BUNDLE_PATH = "crawler/v1/run-crawl.bundle.js";
13
+ const TIME_TO_WAIT_FOR_UPLOADS_MS = 20_000;
14
+ const handler = async ({ apiToken, startUrl, crawlingTimeoutSeconds, maxNumSessions, skipTestRun, }) => {
15
+ const logger = (0, common_1.initLogger)();
16
+ // Resolve the full auth chain (explicit token → OAuth → env var → legacy
17
+ // config file), triggering an interactive browser login when nothing is
18
+ // stored. OAuth tokens are user-scoped, so the project to record into is
19
+ // resolved from the user's default project (`meticulous auth set-project`).
20
+ const resolvedApiToken = await (0, client_1.resolveApiTokenWithOAuth)({
21
+ apiToken,
22
+ enableOAuthLogin: true,
23
+ });
24
+ const { projectId } = await (0, resolve_project_identifier_1.resolveProjectIdentifier)(resolvedApiToken);
25
+ // Use the OAuth-aware client so the short-lived access token is refreshed
26
+ // per request — the test-run creation happens after a potentially long
27
+ // crawl, well past the access token's lifetime.
28
+ const client = await (0, client_1.createClientWithOAuth)({
29
+ apiToken,
30
+ enableOAuthLogin: true,
31
+ });
32
+ const project = await (0, client_1.getProject)(client, projectId);
33
+ if (!project) {
34
+ logger.error("Could not retrieve project data. Is the API token correct?");
35
+ process.exit(1);
36
+ }
37
+ logger.info(`Crawling ${startUrl}, recording sessions into project ${project.organization.name}/${project.name}...`);
38
+ const onReadyForManualLogin = () => {
39
+ logger.info("");
40
+ logger.info("A browser window has opened at your start URL. If your app requires login, log in now.");
41
+ logger.info("(warning: recording has already started, so the login will be part of the recorded session and may store credentials)");
42
+ logger.info("Once you're ready, press Enter here to start crawling...");
43
+ return new Promise((resolve) => {
44
+ process.stdin.once("data", () => resolve());
45
+ });
46
+ };
47
+ const { sessionIds, uniqueUrlCount } = await runCrawl({
48
+ apiToken: resolvedApiToken,
49
+ projectId,
50
+ startUrl,
51
+ crawlingTimeoutSeconds,
52
+ maxNumSessions,
53
+ onReadyForManualLogin,
54
+ logLevel: logger.getLevel(),
55
+ });
56
+ logger.info(`Recorded ${sessionIds.length} sessions over ${uniqueUrlCount} unique URLs.`);
57
+ if (sessionIds.length === 0) {
58
+ logger.error("No sessions were recorded. Exiting.");
59
+ process.exit(1);
60
+ }
61
+ if (skipTestRun) {
62
+ logger.info("Skipping test run creation (--skipTestRun).");
63
+ process.exit(0);
64
+ }
65
+ logger.info("Waiting 20 seconds for any remaining uploads to complete...");
66
+ await new Promise((resolve) => setTimeout(resolve, TIME_TO_WAIT_FOR_UPLOADS_MS));
67
+ const testRun = await (0, client_1.createCrawlerTestRun)({
68
+ client,
69
+ sessionIds,
70
+ appUrl: startUrl,
71
+ projectId,
72
+ });
73
+ logger.info(`Created test run: ${testRun.url}`);
74
+ const includedSessionIds = new Set((testRun.configData.testCases ?? []).map(({ sessionId }) => sessionId));
75
+ const missingSessionIds = sessionIds.filter((sessionId) => !includedSessionIds.has(sessionId));
76
+ if (missingSessionIds.length > 0) {
77
+ logger.warn(`The test run includes ${includedSessionIds.size} of the ${sessionIds.length} recorded sessions. ` +
78
+ `The following sessions were not included, likely because they hadn't finished uploading yet: ` +
79
+ missingSessionIds.join(", "));
80
+ }
81
+ process.exit(0);
82
+ };
83
+ const runCrawl = async (options) => {
84
+ const bundleLocation = await (0, downloading_helpers_1.fetchAsset)(RUN_CRAWL_BUNDLE_PATH);
85
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
86
+ return (await require(bundleLocation)).runCrawl(options);
87
+ };
88
+ exports.crawlCommand = {
89
+ command: "crawl",
90
+ describe: "Crawl your app to record sessions and create a Meticulous test run. " +
91
+ "Opens a browser at the given start URL and lets you log in manually before crawling starts.",
92
+ builder: {
93
+ apiToken: common_options_1.OPTIONS.apiToken,
94
+ startUrl: {
95
+ string: true,
96
+ description: "The URL to start crawling from, e.g. https://app.example.com",
97
+ demandOption: true,
98
+ },
99
+ crawlingTimeoutSeconds: {
100
+ number: true,
101
+ description: "The maximum time in seconds to spend crawling (time spent logging in doesn't count)",
102
+ default: 120,
103
+ },
104
+ maxNumSessions: {
105
+ number: true,
106
+ description: "The maximum number of sessions to record",
107
+ default: 200,
108
+ },
109
+ skipTestRun: {
110
+ boolean: true,
111
+ description: "Don't create a test run from the recorded sessions",
112
+ default: false,
113
+ },
114
+ },
115
+ handler: (0, sentry_utils_1.wrapHandler)(handler),
116
+ };
117
+ //# sourceMappingURL=crawl.command.js.map
118
+ //# debugId=462f67fa-56e2-5011-be80-1531fc5726b5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crawl.command.js","sources":["../../src/commands/crawl.command.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"462f67fa-56e2-5011-be80-1531fc5726b5"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backend-dev-command.utils.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-dev-command.utils.spec.d.ts","sourceRoot":"","sources":["../../../../src/commands/record/__tests__/backend-dev-command.utils.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
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]="94ed5b2a-6fb4-5a21-8b2d-2de5c51f65dc")}catch(e){}}();
3
+
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const vitest_1 = require("vitest");
6
+ const backend_dev_command_utils_1 = require("../backend-dev-command.utils");
7
+ (0, vitest_1.describe)("extractPassthroughCommand", () => {
8
+ (0, vitest_1.it)("returns tokens after the first standalone --", () => {
9
+ (0, vitest_1.expect)((0, backend_dev_command_utils_1.extractPassthroughCommand)([
10
+ "/usr/bin/node",
11
+ "/cli/main.js",
12
+ "record",
13
+ "backend",
14
+ "--port",
15
+ "0",
16
+ "--",
17
+ "npx",
18
+ "wrangler",
19
+ "dev",
20
+ "--port",
21
+ "8787",
22
+ ])).toEqual(["npx", "wrangler", "dev", "--port", "8787"]);
23
+ });
24
+ (0, vitest_1.it)("returns null without a separator or with nothing after it", () => {
25
+ (0, vitest_1.expect)((0, backend_dev_command_utils_1.extractPassthroughCommand)(["node", "main.js", "record", "backend"])).toBeNull();
26
+ (0, vitest_1.expect)((0, backend_dev_command_utils_1.extractPassthroughCommand)(["node", "main.js", "record", "backend", "--"])).toBeNull();
27
+ });
28
+ (0, vitest_1.it)("only splits on the first separator", () => {
29
+ (0, vitest_1.expect)((0, backend_dev_command_utils_1.extractPassthroughCommand)(["node", "main.js", "--", "cmd", "--", "arg"])).toEqual(["cmd", "--", "arg"]);
30
+ });
31
+ });
32
+ (0, vitest_1.describe)("classifyDevCommand", () => {
33
+ vitest_1.it.each([
34
+ [["wrangler", "dev"]],
35
+ [["npx", "wrangler", "dev"]],
36
+ [["npx", "-y", "wrangler", "dev"]],
37
+ [["pnpm", "wrangler", "dev"]],
38
+ [["pnpm", "exec", "wrangler", "dev"]],
39
+ [["pnpm", "dlx", "wrangler", "dev"]],
40
+ [["yarn", "wrangler", "dev"]],
41
+ [["bunx", "wrangler", "dev"]],
42
+ [["./node_modules/.bin/wrangler", "dev"]],
43
+ [["wrangler", "dev", "--port", "8787"]],
44
+ ])("recognizes %j as wrangler dev", (tokens) => {
45
+ (0, vitest_1.expect)((0, backend_dev_command_utils_1.classifyDevCommand)(tokens)).toBe("wrangler-dev");
46
+ });
47
+ vitest_1.it.each([
48
+ [["wrangler", "pages", "dev"]],
49
+ [["npx", "wrangler", "pages", "dev", "./dist"]],
50
+ ])("recognizes %j as wrangler pages dev", (tokens) => {
51
+ (0, vitest_1.expect)((0, backend_dev_command_utils_1.classifyDevCommand)(tokens)).toBe("wrangler-pages-dev");
52
+ });
53
+ vitest_1.it.each([
54
+ [["npm", "run", "dev"]],
55
+ [["pnpm", "run", "dev"]],
56
+ [["node", "server.js"]],
57
+ [["wrangler", "deploy"]],
58
+ [["wrangler"]],
59
+ [[]],
60
+ [["yarn", "dev"]],
61
+ ])("classifies %j as unknown", (tokens) => {
62
+ (0, vitest_1.expect)((0, backend_dev_command_utils_1.classifyDevCommand)(tokens)).toBe("unknown");
63
+ });
64
+ });
65
+ (0, vitest_1.describe)("injectSidecarVar", () => {
66
+ const url = "http://127.0.0.1:9670";
67
+ (0, vitest_1.it)("appends --var for wrangler dev", () => {
68
+ (0, vitest_1.expect)((0, backend_dev_command_utils_1.injectSidecarVar)(["npx", "wrangler", "dev"], "wrangler-dev", url)).toEqual([
69
+ "npx",
70
+ "wrangler",
71
+ "dev",
72
+ "--var",
73
+ `METICULOUS_SIDECAR_URL:${url}`,
74
+ ]);
75
+ });
76
+ (0, vitest_1.it)("appends --binding for wrangler pages dev", () => {
77
+ (0, vitest_1.expect)((0, backend_dev_command_utils_1.injectSidecarVar)(["wrangler", "pages", "dev"], "wrangler-pages-dev", url)).toEqual([
78
+ "wrangler",
79
+ "pages",
80
+ "dev",
81
+ "--binding",
82
+ `METICULOUS_SIDECAR_URL=${url}`,
83
+ ]);
84
+ });
85
+ (0, vitest_1.it)("leaves unknown commands untouched", () => {
86
+ (0, vitest_1.expect)((0, backend_dev_command_utils_1.injectSidecarVar)(["npm", "run", "dev"], "unknown", url)).toEqual([
87
+ "npm",
88
+ "run",
89
+ "dev",
90
+ ]);
91
+ });
92
+ });
93
+ //# sourceMappingURL=backend-dev-command.utils.spec.js.map
94
+ //# debugId=94ed5b2a-6fb4-5a21-8b2d-2de5c51f65dc
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-dev-command.utils.spec.js","sources":["../../../../src/commands/record/__tests__/backend-dev-command.utils.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"94ed5b2a-6fb4-5a21-8b2d-2de5c51f65dc"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backend-sidecar.utils.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-sidecar.utils.spec.d.ts","sourceRoot":"","sources":["../../../../src/commands/record/__tests__/backend-sidecar.utils.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,183 @@
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]="2163fdde-fd16-5f61-bb3e-789f93662ccc")}catch(e){}}();
3
+
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
17
+ }) : function(o, v) {
18
+ o["default"] = v;
19
+ });
20
+ var __importStar = (this && this.__importStar) || (function () {
21
+ var ownKeys = function(o) {
22
+ ownKeys = Object.getOwnPropertyNames || function (o) {
23
+ var ar = [];
24
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
+ return ar;
26
+ };
27
+ return ownKeys(o);
28
+ };
29
+ return function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ })();
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const promises_1 = require("fs/promises");
39
+ const net = __importStar(require("net"));
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ const vitest_1 = require("vitest");
43
+ const cli_user_error_1 = require("../../../utils/cli-user-error");
44
+ const backend_sidecar_utils_1 = require("../backend-sidecar.utils");
45
+ const FAKE_SIDECAR = path.join(__dirname, "fixtures", "fake-sidecar.cjs");
46
+ const BROKEN_SIDECAR = path.join(__dirname, "fixtures", "broken-sidecar.cjs");
47
+ const FLAKY_SIDECAR = path.join(__dirname, "fixtures", "flaky-sidecar.cjs");
48
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
49
+ const findFreePort = () => new Promise((resolve, reject) => {
50
+ const probe = net.createServer();
51
+ probe.once("error", reject);
52
+ probe.listen(0, "127.0.0.1", () => {
53
+ const port = probe.address().port;
54
+ probe.close(() => resolve(port));
55
+ });
56
+ });
57
+ const occupyPort = () => new Promise((resolve, reject) => {
58
+ const server = net.createServer();
59
+ server.once("error", reject);
60
+ server.listen(0, "127.0.0.1", () => {
61
+ const port = server.address().port;
62
+ resolve({ port, release: () => server.close() });
63
+ });
64
+ });
65
+ const health = async (url) => {
66
+ const response = await fetch(`${url}/v1/health`);
67
+ return (await response.json());
68
+ };
69
+ const waitFor = async (probe, timeoutMs) => {
70
+ const deadline = Date.now() + timeoutMs;
71
+ while (Date.now() < deadline) {
72
+ const result = await probe().catch(() => undefined);
73
+ if (result !== undefined) {
74
+ return result;
75
+ }
76
+ await sleep(100);
77
+ }
78
+ throw new Error("Timed out waiting for condition");
79
+ };
80
+ (0, vitest_1.describe)("resolveSidecarPort", () => {
81
+ (0, vitest_1.it)("returns the requested port when free", async () => {
82
+ const port = await findFreePort();
83
+ await (0, vitest_1.expect)((0, backend_sidecar_utils_1.resolveSidecarPort)(port, "sidecar-only")).resolves.toBe(port);
84
+ });
85
+ (0, vitest_1.it)("picks an ephemeral port for 0", async () => {
86
+ const port = await (0, backend_sidecar_utils_1.resolveSidecarPort)(0, "wrapped");
87
+ (0, vitest_1.expect)(port).toBeGreaterThan(0);
88
+ });
89
+ (0, vitest_1.it)("falls back to an ephemeral port in wrapped mode when busy", async () => {
90
+ const { port, release } = await occupyPort();
91
+ try {
92
+ const resolved = await (0, backend_sidecar_utils_1.resolveSidecarPort)(port, "wrapped");
93
+ (0, vitest_1.expect)(resolved).not.toBe(port);
94
+ (0, vitest_1.expect)(resolved).toBeGreaterThan(0);
95
+ }
96
+ finally {
97
+ release();
98
+ }
99
+ });
100
+ (0, vitest_1.it)("errors in sidecar-only mode when busy", async () => {
101
+ const { port, release } = await occupyPort();
102
+ try {
103
+ await (0, vitest_1.expect)((0, backend_sidecar_utils_1.resolveSidecarPort)(port, "sidecar-only")).rejects.toThrow(cli_user_error_1.CliUserError);
104
+ }
105
+ finally {
106
+ release();
107
+ }
108
+ });
109
+ });
110
+ (0, vitest_1.describe)("startSidecar", () => {
111
+ const startFake = async (options = {}) => {
112
+ const port = await findFreePort();
113
+ return (0, backend_sidecar_utils_1.startSidecar)({
114
+ bundlePath: FAKE_SIDECAR,
115
+ port,
116
+ env: {},
117
+ ...options,
118
+ });
119
+ };
120
+ (0, vitest_1.it)("starts, reports healthy, flushes, and stops", async () => {
121
+ const sidecar = await startFake();
122
+ try {
123
+ (0, vitest_1.expect)((await health(sidecar.url)).ok).toBe(true);
124
+ await sidecar.flush();
125
+ (0, vitest_1.expect)((await health(sidecar.url)).flushCount).toBe(1);
126
+ }
127
+ finally {
128
+ await sidecar.stop();
129
+ }
130
+ await (0, vitest_1.expect)(health(sidecar.url)).rejects.toThrow();
131
+ });
132
+ (0, vitest_1.it)("restarts once on the same port after an unexpected exit", async () => {
133
+ const onRecordingStopped = vitest_1.vi.fn();
134
+ const sidecar = await startFake({ onRecordingStopped });
135
+ try {
136
+ const originalPid = (await health(sidecar.url)).pid;
137
+ await fetch(`${sidecar.url}/die`, { method: "POST" });
138
+ const restartedPid = await waitFor(async () => {
139
+ const current = await health(sidecar.url);
140
+ return current.pid !== originalPid ? current.pid : undefined;
141
+ }, 20_000);
142
+ (0, vitest_1.expect)(restartedPid).not.toBe(originalPid);
143
+ (0, vitest_1.expect)(onRecordingStopped).not.toHaveBeenCalled();
144
+ // A second death exhausts the single restart.
145
+ await fetch(`${sidecar.url}/die`, { method: "POST" });
146
+ await waitFor(() => Promise.resolve(onRecordingStopped.mock.calls.length > 0 ? true : undefined), 20_000);
147
+ }
148
+ finally {
149
+ await sidecar.stop();
150
+ }
151
+ }, 45_000);
152
+ (0, vitest_1.it)("fails with the sidecar's stderr when startup fails", async () => {
153
+ const port = await findFreePort();
154
+ await (0, vitest_1.expect)((0, backend_sidecar_utils_1.startSidecar)({ bundlePath: BROKEN_SIDECAR, port, env: {} })).rejects.toThrow(/refusing to start/);
155
+ });
156
+ (0, vitest_1.it)("does not restart a sidecar that dies during startup", async () => {
157
+ const port = await findFreePort();
158
+ const marker = path.join(os.tmpdir(), `flaky-sidecar-${port}.marker`);
159
+ await (0, promises_1.rm)(marker, { force: true });
160
+ try {
161
+ await (0, vitest_1.expect)((0, backend_sidecar_utils_1.startSidecar)({
162
+ bundlePath: FLAKY_SIDECAR,
163
+ port,
164
+ env: { METICULOUS_TEST_FLAKY_MARKER: marker },
165
+ })).rejects.toThrow(/exited during startup/);
166
+ // A startup failure must not trigger the crash-restart supervision: a
167
+ // successful background restart would outlive the failed CLI run with
168
+ // no handle to stop it, holding the port.
169
+ await sleep(1_500);
170
+ const orphanHealth = await fetch(`http://127.0.0.1:${port}/v1/health`).catch(() => undefined);
171
+ if (orphanHealth) {
172
+ // Kill the orphan so a regression doesn't leak a process, then fail.
173
+ await fetch(`http://127.0.0.1:${port}/die`, { method: "POST" }).catch(() => undefined);
174
+ }
175
+ (0, vitest_1.expect)(orphanHealth).toBeUndefined();
176
+ }
177
+ finally {
178
+ await (0, promises_1.rm)(marker, { force: true });
179
+ }
180
+ }, 20_000);
181
+ });
182
+ //# sourceMappingURL=backend-sidecar.utils.spec.js.map
183
+ //# debugId=2163fdde-fd16-5f61-bb3e-789f93662ccc
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-sidecar.utils.spec.js","sources":["../../../../src/commands/record/__tests__/backend-sidecar.utils.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"2163fdde-fd16-5f61-bb3e-789f93662ccc"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backend.command.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.command.spec.d.ts","sourceRoot":"","sources":["../../../../src/commands/record/__tests__/backend.command.spec.ts"],"names":[],"mappings":""}