@alwaysmeticulous/cli 2.313.1 → 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.
- package/dist/commands/agent/index.d.ts.map +1 -1
- package/dist/commands/agent/index.js +4 -2
- package/dist/commands/agent/index.js.map +1 -1
- package/dist/commands/agent/js-coverage.command.d.ts +29 -0
- package/dist/commands/agent/js-coverage.command.d.ts.map +1 -1
- package/dist/commands/agent/js-coverage.command.handler.spec.d.ts +2 -0
- package/dist/commands/agent/js-coverage.command.handler.spec.d.ts.map +1 -0
- package/dist/commands/agent/js-coverage.command.handler.spec.js +148 -0
- package/dist/commands/agent/js-coverage.command.handler.spec.js.map +1 -0
- package/dist/commands/agent/js-coverage.command.js +120 -22
- package/dist/commands/agent/js-coverage.command.js.map +1 -1
- package/dist/commands/agent/js-coverage.command.spec.js +83 -2
- package/dist/commands/agent/js-coverage.command.spec.js.map +1 -1
- package/dist/commands/agent/submit-feedback.command.d.ts +15 -0
- package/dist/commands/agent/submit-feedback.command.d.ts.map +1 -0
- package/dist/commands/agent/submit-feedback.command.js +74 -0
- package/dist/commands/agent/submit-feedback.command.js.map +1 -0
- package/dist/commands/agent/test-run-diffs.command.d.ts.map +1 -1
- package/dist/commands/agent/test-run-diffs.command.js +10 -5
- package/dist/commands/agent/test-run-diffs.command.js.map +1 -1
- package/dist/commands/agent/test-run-diffs.command.spec.js +17 -2
- package/dist/commands/agent/test-run-diffs.command.spec.js.map +1 -1
- package/dist/commands/all-commands.d.ts.map +1 -1
- package/dist/commands/all-commands.js +4 -2
- package/dist/commands/all-commands.js.map +1 -1
- package/dist/commands/auth/__tests__/get-project.command.spec.js +9 -3
- package/dist/commands/auth/__tests__/get-project.command.spec.js.map +1 -1
- package/dist/commands/auth/__tests__/set-project.command.spec.js +9 -4
- package/dist/commands/auth/__tests__/set-project.command.spec.js.map +1 -1
- package/dist/commands/auth/__tests__/whoami.command.spec.js +40 -2
- package/dist/commands/auth/__tests__/whoami.command.spec.js.map +1 -1
- package/dist/commands/ci/agent-test.command.d.ts +1 -0
- package/dist/commands/ci/agent-test.command.d.ts.map +1 -1
- package/dist/commands/ci/agent-test.command.js +19 -4
- package/dist/commands/ci/agent-test.command.js.map +1 -1
- package/dist/commands/crawl.command.d.ts +11 -0
- package/dist/commands/crawl.command.d.ts.map +1 -0
- package/dist/commands/crawl.command.js +118 -0
- package/dist/commands/crawl.command.js.map +1 -0
- package/dist/commands/record/__tests__/backend-dev-command.utils.spec.d.ts +2 -0
- package/dist/commands/record/__tests__/backend-dev-command.utils.spec.d.ts.map +1 -0
- package/dist/commands/record/__tests__/backend-dev-command.utils.spec.js +94 -0
- package/dist/commands/record/__tests__/backend-dev-command.utils.spec.js.map +1 -0
- package/dist/commands/record/__tests__/backend-sidecar.utils.spec.d.ts +2 -0
- package/dist/commands/record/__tests__/backend-sidecar.utils.spec.d.ts.map +1 -0
- package/dist/commands/record/__tests__/backend-sidecar.utils.spec.js +183 -0
- package/dist/commands/record/__tests__/backend-sidecar.utils.spec.js.map +1 -0
- package/dist/commands/record/__tests__/backend.command.spec.d.ts +2 -0
- package/dist/commands/record/__tests__/backend.command.spec.d.ts.map +1 -0
- package/dist/commands/record/__tests__/backend.command.spec.js +219 -0
- package/dist/commands/record/__tests__/backend.command.spec.js.map +1 -0
- package/dist/commands/record/backend-dev-command.utils.d.ts +29 -0
- package/dist/commands/record/backend-dev-command.utils.d.ts.map +1 -0
- package/dist/commands/record/backend-dev-command.utils.js +91 -0
- package/dist/commands/record/backend-dev-command.utils.js.map +1 -0
- package/dist/commands/record/backend-sidecar.utils.d.ts +39 -0
- package/dist/commands/record/backend-sidecar.utils.d.ts.map +1 -0
- package/dist/commands/record/backend-sidecar.utils.js +273 -0
- package/dist/commands/record/backend-sidecar.utils.js.map +1 -0
- package/dist/commands/record/backend.command.d.ts +14 -0
- package/dist/commands/record/backend.command.d.ts.map +1 -0
- package/dist/commands/record/backend.command.js +189 -0
- package/dist/commands/record/backend.command.js.map +1 -0
- package/dist/commands/record/index.d.ts.map +1 -1
- package/dist/commands/record/index.js +4 -2
- package/dist/commands/record/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +6 -2
- package/dist/main.js.map +1 -1
- package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js +7 -4
- package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +4 -3
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/resolve-test-run-from-commit.d.ts +8 -4
- package/dist/utils/resolve-test-run-from-commit.d.ts.map +1 -1
- package/dist/utils/resolve-test-run-from-commit.js +10 -9
- package/dist/utils/resolve-test-run-from-commit.js.map +1 -1
- package/package.json +10 -10
|
@@ -0,0 +1,273 @@
|
|
|
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]="d54ed918-653d-5c03-aa56-431d0e23e8f4")}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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
38
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
39
|
+
};
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.startSidecar = exports.resolveSidecarPort = exports.DEFAULT_SIDECAR_PORT = void 0;
|
|
42
|
+
const child_process_1 = require("child_process");
|
|
43
|
+
const net = __importStar(require("net"));
|
|
44
|
+
const readline = __importStar(require("readline"));
|
|
45
|
+
const common_1 = require("@alwaysmeticulous/common");
|
|
46
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
47
|
+
const cli_user_error_1 = require("../../utils/cli-user-error");
|
|
48
|
+
exports.DEFAULT_SIDECAR_PORT = 9670;
|
|
49
|
+
const HEALTH_POLL_INTERVAL_MS = 250;
|
|
50
|
+
const HEALTH_TIMEOUT_MS = 15_000;
|
|
51
|
+
const FLUSH_TIMEOUT_MS = 10_000;
|
|
52
|
+
const STOP_SIGTERM_TIMEOUT_MS = 5_000;
|
|
53
|
+
const STDERR_TAIL_LINES = 20;
|
|
54
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
55
|
+
const canBind = (port) => new Promise((resolve) => {
|
|
56
|
+
const probe = net.createServer();
|
|
57
|
+
probe.once("error", () => resolve(false));
|
|
58
|
+
probe.listen(port, "127.0.0.1", () => {
|
|
59
|
+
probe.close(() => resolve(true));
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
const findEphemeralPort = () => new Promise((resolve, reject) => {
|
|
63
|
+
const probe = net.createServer();
|
|
64
|
+
probe.once("error", reject);
|
|
65
|
+
probe.listen(0, "127.0.0.1", () => {
|
|
66
|
+
const address = probe.address();
|
|
67
|
+
if (address === null || typeof address !== "object") {
|
|
68
|
+
probe.close(() => reject(new Error("Could not resolve a free port")));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const port = address.port;
|
|
72
|
+
probe.close(() => resolve(port));
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* Resolves the port the sidecar will listen on. `requested === 0` always
|
|
77
|
+
* picks an ephemeral port. A busy requested port falls back to an ephemeral
|
|
78
|
+
* one in wrapped mode (the CLI controls the URL injected into the worker) but
|
|
79
|
+
* is a hard error in sidecar-only mode, where the user is about to configure
|
|
80
|
+
* the printed URL by hand and needs it predictable.
|
|
81
|
+
*/
|
|
82
|
+
const resolveSidecarPort = async (requested, mode) => {
|
|
83
|
+
if (requested === 0) {
|
|
84
|
+
return findEphemeralPort();
|
|
85
|
+
}
|
|
86
|
+
if (await canBind(requested)) {
|
|
87
|
+
return requested;
|
|
88
|
+
}
|
|
89
|
+
if (mode === "wrapped") {
|
|
90
|
+
const fallback = await findEphemeralPort();
|
|
91
|
+
(0, common_1.initLogger)().warn(`Port ${requested} is in use — using port ${fallback} for the Meticulous sidecar instead.`);
|
|
92
|
+
return fallback;
|
|
93
|
+
}
|
|
94
|
+
throw new cli_user_error_1.CliUserError(`Port ${requested} is already in use. Pass --port to choose a different sidecar port.`);
|
|
95
|
+
};
|
|
96
|
+
exports.resolveSidecarPort = resolveSidecarPort;
|
|
97
|
+
const prefixPipe = (stream, onLine) => {
|
|
98
|
+
readline.createInterface({ input: stream }).on("line", onLine);
|
|
99
|
+
};
|
|
100
|
+
const fetchWithTimeout = async (url, init, timeoutMs) => {
|
|
101
|
+
const controller = new AbortController();
|
|
102
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
103
|
+
try {
|
|
104
|
+
return await fetch(url, { ...init, signal: controller.signal });
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
clearTimeout(timer);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const spawnSidecarProcess = (options) => {
|
|
111
|
+
const logger = (0, common_1.initLogger)();
|
|
112
|
+
const child = (0, child_process_1.spawn)(process.execPath, [options.bundlePath], {
|
|
113
|
+
env: {
|
|
114
|
+
...process.env,
|
|
115
|
+
...options.env,
|
|
116
|
+
METICULOUS_SIDECAR_PORT: String(options.port),
|
|
117
|
+
},
|
|
118
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
119
|
+
// Own process group (POSIX) so terminal Ctrl-C reaches the CLI and the
|
|
120
|
+
// wrapped dev command but NOT the sidecar — the CLI drains the dev
|
|
121
|
+
// command first, flushes, and only then stops the sidecar, so capture
|
|
122
|
+
// events emitted during the dev server's teardown are not lost.
|
|
123
|
+
detached: process.platform !== "win32",
|
|
124
|
+
});
|
|
125
|
+
const stderrTail = [];
|
|
126
|
+
const prefix = chalk_1.default.dim("[meticulous sidecar]");
|
|
127
|
+
if (child.stdout) {
|
|
128
|
+
prefixPipe(child.stdout, (line) => logger.info(`${prefix} ${line}`));
|
|
129
|
+
}
|
|
130
|
+
if (child.stderr) {
|
|
131
|
+
prefixPipe(child.stderr, (line) => {
|
|
132
|
+
stderrTail.push(line);
|
|
133
|
+
if (stderrTail.length > STDERR_TAIL_LINES) {
|
|
134
|
+
stderrTail.shift();
|
|
135
|
+
}
|
|
136
|
+
logger.warn(`${prefix} ${line}`);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return { child, stderrTail };
|
|
140
|
+
};
|
|
141
|
+
const awaitHealthy = async (spawned, url) => {
|
|
142
|
+
const deadline = Date.now() + HEALTH_TIMEOUT_MS;
|
|
143
|
+
let exited = false;
|
|
144
|
+
let exitCode = null;
|
|
145
|
+
spawned.child.once("exit", (code) => {
|
|
146
|
+
exited = true;
|
|
147
|
+
exitCode = code;
|
|
148
|
+
});
|
|
149
|
+
while (Date.now() < deadline) {
|
|
150
|
+
if (exited) {
|
|
151
|
+
throw new cli_user_error_1.CliUserError(`The Meticulous sidecar exited during startup (exit code ${String(exitCode)}).${spawned.stderrTail.length > 0
|
|
152
|
+
? `\n${spawned.stderrTail.join("\n")}`
|
|
153
|
+
: ""}`);
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const response = await fetchWithTimeout(`${url}/v1/health`, { method: "GET" }, 1_000);
|
|
157
|
+
if (response.ok) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Not up yet — keep polling.
|
|
163
|
+
}
|
|
164
|
+
await sleep(HEALTH_POLL_INTERVAL_MS);
|
|
165
|
+
}
|
|
166
|
+
throw new cli_user_error_1.CliUserError(`The Meticulous sidecar did not become healthy within ${HEALTH_TIMEOUT_MS / 1000}s.${spawned.stderrTail.length > 0 ? `\n${spawned.stderrTail.join("\n")}` : ""}`);
|
|
167
|
+
};
|
|
168
|
+
const terminateChild = async (child) => {
|
|
169
|
+
if (child.exitCode !== null || child.signalCode !== null) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const exited = new Promise((resolve) => child.once("exit", () => resolve()));
|
|
173
|
+
child.kill("SIGTERM");
|
|
174
|
+
const timedOut = await Promise.race([
|
|
175
|
+
exited.then(() => false),
|
|
176
|
+
sleep(STOP_SIGTERM_TIMEOUT_MS).then(() => true),
|
|
177
|
+
]);
|
|
178
|
+
if (timedOut) {
|
|
179
|
+
child.kill("SIGKILL");
|
|
180
|
+
await Promise.race([exited, sleep(2_000)]);
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
/**
|
|
184
|
+
* Spawns the sidecar bundle as a detached child process, waits for it to
|
|
185
|
+
* become healthy, and supervises it: one automatic restart on the same port
|
|
186
|
+
* if it dies unexpectedly (the worker holds the old URL, so the port must be
|
|
187
|
+
* reused), after which recording is declared stopped without affecting the
|
|
188
|
+
* wrapped dev command.
|
|
189
|
+
*/
|
|
190
|
+
const startSidecar = async (options) => {
|
|
191
|
+
const logger = (0, common_1.initLogger)();
|
|
192
|
+
const url = `http://127.0.0.1:${options.port}`;
|
|
193
|
+
let current = spawnSidecarProcess(options);
|
|
194
|
+
let restarted = false;
|
|
195
|
+
let stopping = false;
|
|
196
|
+
const watchExit = (spawned) => {
|
|
197
|
+
spawned.child.once("exit", (code) => {
|
|
198
|
+
if (stopping) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (!restarted) {
|
|
202
|
+
restarted = true;
|
|
203
|
+
logger.warn(`The Meticulous sidecar exited unexpectedly (exit code ${String(code)}) — restarting it once...`);
|
|
204
|
+
void (async () => {
|
|
205
|
+
try {
|
|
206
|
+
current = spawnSidecarProcess(options);
|
|
207
|
+
await awaitHealthy(current, url);
|
|
208
|
+
// Only supervise the restarted process once it is healthy — an
|
|
209
|
+
// exit during its startup is handled by awaitHealthy rejecting.
|
|
210
|
+
watchExit(current);
|
|
211
|
+
logger.warn("Meticulous sidecar restarted.");
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
current.child.kill("SIGKILL");
|
|
215
|
+
logger.error(`Could not restart the Meticulous sidecar — backend recording has stopped. Your dev server is unaffected. ${String(error)}`);
|
|
216
|
+
options.onRecordingStopped?.();
|
|
217
|
+
}
|
|
218
|
+
})();
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
logger.error("The Meticulous sidecar exited again — backend recording has stopped. Your dev server is unaffected.");
|
|
222
|
+
options.onRecordingStopped?.();
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
};
|
|
226
|
+
try {
|
|
227
|
+
await awaitHealthy(current, url);
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
// Never leave a half-started detached sidecar behind — it would outlive
|
|
231
|
+
// the failed CLI run and hold the port. (No-op if it already exited.)
|
|
232
|
+
current.child.kill("SIGKILL");
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
// Supervision starts only once the sidecar is healthy: an exit during
|
|
236
|
+
// startup is a startup failure (reported above), not a crash to restart.
|
|
237
|
+
watchExit(current);
|
|
238
|
+
// Don't let a crashed CLI orphan the detached sidecar.
|
|
239
|
+
process.once("exit", () => {
|
|
240
|
+
try {
|
|
241
|
+
current.child.kill("SIGTERM");
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
// Already gone.
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
const flush = async () => {
|
|
248
|
+
try {
|
|
249
|
+
await fetchWithTimeout(`${url}/v1/flush`, { method: "POST" }, FLUSH_TIMEOUT_MS);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
logger.warn(`Could not flush the Meticulous sidecar — some captured requests may not have been uploaded. ${String(error)}`);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
return {
|
|
256
|
+
url,
|
|
257
|
+
port: options.port,
|
|
258
|
+
flush,
|
|
259
|
+
stop: async () => {
|
|
260
|
+
if (stopping) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
stopping = true;
|
|
264
|
+
await flush();
|
|
265
|
+
// The sidecar's own SIGTERM handler also flushes before exiting, so
|
|
266
|
+
// this is belt-and-braces.
|
|
267
|
+
await terminateChild(current.child);
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
};
|
|
271
|
+
exports.startSidecar = startSidecar;
|
|
272
|
+
//# sourceMappingURL=backend-sidecar.utils.js.map
|
|
273
|
+
//# debugId=d54ed918-653d-5c03-aa56-431d0e23e8f4
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-sidecar.utils.js","sources":["../../../src/commands/record/backend-sidecar.utils.ts"],"sourceRoot":"","names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAyD;AACzD,yCAA2B;AAC3B,mDAAqC;AACrC,qDAAsD;AACtD,kDAA0B;AAC1B,+DAA0D;AAE7C,QAAA,oBAAoB,GAAG,IAAI,CAAC;AAEzC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AACtC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAyB7B,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAC1C,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAoB,EAAE,CACjD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACtB,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;QACnC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,MAAM,iBAAiB,GAAG,GAAoB,EAAE,CAC9C,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpD,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL;;;;;;GAMG;AACI,MAAM,kBAAkB,GAAG,KAAK,EACrC,SAAiB,EACjB,IAAgC,EACf,EAAE;IACnB,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC3C,IAAA,mBAAU,GAAE,CAAC,IAAI,CACf,QAAQ,SAAS,2BAA2B,QAAQ,sCAAsC,CAC3F,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,6BAAY,CACpB,QAAQ,SAAS,qEAAqE,CACvF,CAAC;AACJ,CAAC,CAAC;AApBW,QAAA,kBAAkB,sBAoB7B;AAEF,MAAM,UAAU,GAAG,CACjB,MAA6B,EAC7B,MAA8B,EACxB,EAAE;IACR,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,EAC5B,GAAW,EACX,IAAiB,EACjB,SAAiB,EACE,EAAE;IACrB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC,CAAC;AAOF,MAAM,mBAAmB,GAAG,CAAC,OAA4B,EAAkB,EAAE;IAC3E,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;QAC1D,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,GAAG,OAAO,CAAC,GAAG;YACd,uBAAuB,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SAC9C;QACD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,uEAAuE;QACvE,mEAAmE;QACnE,sEAAsE;QACtE,gEAAgE;QAChE,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;KACvC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,eAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAChC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,UAAU,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;gBAC1C,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EACxB,OAAuB,EACvB,GAAW,EACI,EAAE;IACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,CAAC;IAChD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAClC,MAAM,GAAG,IAAI,CAAC;QACd,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,6BAAY,CACpB,2DAA2D,MAAM,CAC/D,QAAQ,CACT,KACC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;gBAC3B,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACtC,CAAC,CAAC,EACN,EAAE,CACH,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CACrC,GAAG,GAAG,YAAY,EAClB,EAAE,MAAM,EAAE,KAAK,EAAE,EACjB,KAAK,CACN,CAAC;YACF,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;QACD,MAAM,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,IAAI,6BAAY,CACpB,wDACE,iBAAiB,GAAG,IACtB,KACE,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EACzE,EAAE,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,EAAE,KAAmB,EAAiB,EAAE;IAClE,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACzD,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAC3C,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CACpC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;QACxB,KAAK,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;KAChD,CAAC,CAAC;IACH,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;GAMG;AACI,MAAM,YAAY,GAAG,KAAK,EAC/B,OAA4B,EACJ,EAAE;IAC1B,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,oBAAoB,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/C,IAAI,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,SAAS,GAAG,CAAC,OAAuB,EAAQ,EAAE;QAClD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAClC,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM,CAAC,IAAI,CACT,yDAAyD,MAAM,CAC7D,IAAI,CACL,2BAA2B,CAC7B,CAAC;gBACF,KAAK,CAAC,KAAK,IAAI,EAAE;oBACf,IAAI,CAAC;wBACH,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;wBACvC,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;wBACjC,+DAA+D;wBAC/D,gEAAgE;wBAChE,SAAS,CAAC,OAAO,CAAC,CAAC;wBACnB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;oBAC/C,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAC9B,MAAM,CAAC,KAAK,CACV,4GAA4G,MAAM,CAChH,KAAK,CACN,EAAE,CACJ,CAAC;wBACF,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;oBACjC,CAAC;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CACV,qGAAqG,CACtG,CAAC;gBACF,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACjC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,wEAAwE;QACxE,sEAAsE;QACtE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,KAAK,CAAC;IACd,CAAC;IACD,sEAAsE;IACtE,yEAAyE;IACzE,SAAS,CAAC,OAAO,CAAC,CAAC;IAEnB,uDAAuD;IACvD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACxB,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,gBAAgB,CACpB,GAAG,GAAG,WAAW,EACjB,EAAE,MAAM,EAAE,MAAM,EAAE,EAClB,gBAAgB,CACjB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CACT,+FAA+F,MAAM,CACnG,KAAK,CACN,EAAE,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,GAAG;QACH,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK;QACL,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,KAAK,EAAE,CAAC;YACd,oEAAoE;YACpE,2BAA2B;YAC3B,MAAM,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AArGW,QAAA,YAAY,gBAqGvB","debugId":"d54ed918-653d-5c03-aa56-431d0e23e8f4"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CommandModule } from "yargs";
|
|
2
|
+
interface Options {
|
|
3
|
+
apiToken: string | null | undefined;
|
|
4
|
+
recordingToken: string | null | undefined;
|
|
5
|
+
port: number;
|
|
6
|
+
exportMode: string;
|
|
7
|
+
localOutputDir: string | null | undefined;
|
|
8
|
+
injectSidecarVar: boolean;
|
|
9
|
+
/** Positional tokens yargs collected — only valid when passed after `--`. */
|
|
10
|
+
devCommand: (string | number)[] | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare const recordBackendCommand: CommandModule<unknown, Options>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=backend.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.command.d.ts","sourceRoot":"","sources":["../../../src/commands/record/backend.command.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAoB3C,UAAU,OAAO;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,6EAA6E;IAC7E,UAAU,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC;CAC7C;AAqLD,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAqChE,CAAC"}
|
|
@@ -0,0 +1,189 @@
|
|
|
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]="92c2f965-765b-58d4-bf09-9eeac162ecee")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.recordBackendCommand = void 0;
|
|
6
|
+
const child_process_1 = require("child_process");
|
|
7
|
+
const client_1 = require("@alwaysmeticulous/client");
|
|
8
|
+
const common_1 = require("@alwaysmeticulous/common");
|
|
9
|
+
const downloading_helpers_1 = require("@alwaysmeticulous/downloading-helpers");
|
|
10
|
+
const common_options_1 = require("../../command-utils/common-options");
|
|
11
|
+
const sentry_utils_1 = require("../../command-utils/sentry.utils");
|
|
12
|
+
const cli_user_error_1 = require("../../utils/cli-user-error");
|
|
13
|
+
const constants_1 = require("../../utils/constants");
|
|
14
|
+
const resolve_project_identifier_1 = require("../../utils/resolve-project-identifier");
|
|
15
|
+
const backend_dev_command_utils_1 = require("./backend-dev-command.utils");
|
|
16
|
+
const backend_sidecar_utils_1 = require("./backend-sidecar.utils");
|
|
17
|
+
const DEV_COMMAND_SIGTERM_TIMEOUT_MS = 10_000;
|
|
18
|
+
const resolveRecordingTarget = async (options) => {
|
|
19
|
+
const logger = (0, common_1.initLogger)();
|
|
20
|
+
if (options.recordingToken) {
|
|
21
|
+
return { recordingToken: options.recordingToken, projectName: undefined };
|
|
22
|
+
}
|
|
23
|
+
const apiToken = await (0, client_1.resolveApiTokenWithOAuth)({
|
|
24
|
+
apiToken: options.apiToken,
|
|
25
|
+
enableOAuthLogin: true,
|
|
26
|
+
});
|
|
27
|
+
const { projectId } = await (0, resolve_project_identifier_1.resolveProjectIdentifier)(apiToken);
|
|
28
|
+
const client = await (0, client_1.createClientWithOAuth)({
|
|
29
|
+
apiToken: options.apiToken,
|
|
30
|
+
enableOAuthLogin: true,
|
|
31
|
+
});
|
|
32
|
+
const project = await (0, client_1.getProject)(client, projectId);
|
|
33
|
+
if (!project) {
|
|
34
|
+
throw new cli_user_error_1.CliUserError("Could not retrieve project data. Is the API token correct?");
|
|
35
|
+
}
|
|
36
|
+
if (!project.recordingToken) {
|
|
37
|
+
throw new cli_user_error_1.CliUserError("Could not retrieve recording token.");
|
|
38
|
+
}
|
|
39
|
+
logger.info(`Recording backend sessions for ${project.organization.name}/${project.name}`);
|
|
40
|
+
return {
|
|
41
|
+
recordingToken: project.recordingToken,
|
|
42
|
+
projectName: project.name,
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
const printWorkerInstructions = (sidecarUrl) => {
|
|
46
|
+
const logger = (0, common_1.initLogger)();
|
|
47
|
+
logger.info("");
|
|
48
|
+
logger.info(`Meticulous sidecar running at ${sidecarUrl}. To record your worker:`);
|
|
49
|
+
logger.info(" 1. Wrap your handler with withMeticulous from @alwaysmeticulous/backend-recorder-workerd");
|
|
50
|
+
logger.info(' 2. Enable the "nodejs_als" (or "nodejs_compat") compatibility flag');
|
|
51
|
+
logger.info(" 3. Expose the sidecar URL to the worker (workerd cannot see host environment variables):");
|
|
52
|
+
logger.info(` npx wrangler dev --var ${backend_dev_command_utils_1.SIDECAR_URL_VAR_NAME}:${sidecarUrl}`);
|
|
53
|
+
logger.info(` or add to .dev.vars: ${backend_dev_command_utils_1.SIDECAR_URL_VAR_NAME}=${sidecarUrl}`);
|
|
54
|
+
logger.info("");
|
|
55
|
+
};
|
|
56
|
+
const handler = async (options) => {
|
|
57
|
+
const logger = (0, common_1.initLogger)();
|
|
58
|
+
const devCommand = (0, backend_dev_command_utils_1.extractPassthroughCommand)(process.argv);
|
|
59
|
+
if (!devCommand && (options.devCommand?.length ?? 0) > 0) {
|
|
60
|
+
// Without the separator, yargs would swallow the dev command's own flags
|
|
61
|
+
// (e.g. its --port) as our options — refuse rather than silently starting
|
|
62
|
+
// in sidecar-only mode.
|
|
63
|
+
throw new cli_user_error_1.CliUserError("Pass the dev command after a -- separator, e.g.: meticulous record backend -- npx wrangler dev");
|
|
64
|
+
}
|
|
65
|
+
const mode = devCommand ? "wrapped" : "sidecar-only";
|
|
66
|
+
// Fail fast on auth before spawning anything.
|
|
67
|
+
const { recordingToken, projectName } = await resolveRecordingTarget(options);
|
|
68
|
+
logger.info("Fetching the Meticulous backend recorder sidecar...");
|
|
69
|
+
const bundlePath = await (0, downloading_helpers_1.fetchAsset)(constants_1.BACKEND_SIDECAR_BUNDLE_PATH);
|
|
70
|
+
const port = await (0, backend_sidecar_utils_1.resolveSidecarPort)(options.port, mode);
|
|
71
|
+
const done = (0, common_1.defer)();
|
|
72
|
+
const sidecar = await (0, backend_sidecar_utils_1.startSidecar)({
|
|
73
|
+
bundlePath,
|
|
74
|
+
port,
|
|
75
|
+
env: {
|
|
76
|
+
METICULOUS_RECORDING_TOKEN: recordingToken,
|
|
77
|
+
METICULOUS_EXPORT_MODE: options.exportMode,
|
|
78
|
+
...(options.localOutputDir
|
|
79
|
+
? { METICULOUS_LOCAL_OUTPUT_DIR: options.localOutputDir }
|
|
80
|
+
: {}),
|
|
81
|
+
...(projectName ? { METICULOUS_PROJECT_NAME: projectName } : {}),
|
|
82
|
+
},
|
|
83
|
+
// Recording stopping is not fatal to the user's dev loop — keep the dev
|
|
84
|
+
// command (or the wait in sidecar-only mode) running.
|
|
85
|
+
onRecordingStopped: () => { },
|
|
86
|
+
});
|
|
87
|
+
let shuttingDown = false;
|
|
88
|
+
const shutdown = async (exitCode) => {
|
|
89
|
+
if (shuttingDown) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
shuttingDown = true;
|
|
93
|
+
await sidecar.stop();
|
|
94
|
+
done.resolve(exitCode);
|
|
95
|
+
};
|
|
96
|
+
if (devCommand) {
|
|
97
|
+
const kind = (0, backend_dev_command_utils_1.classifyDevCommand)(devCommand);
|
|
98
|
+
const argv = options.injectSidecarVar && kind !== "unknown"
|
|
99
|
+
? (0, backend_dev_command_utils_1.injectSidecarVar)(devCommand, kind, sidecar.url)
|
|
100
|
+
: devCommand;
|
|
101
|
+
if (options.injectSidecarVar && kind !== "unknown") {
|
|
102
|
+
logger.info(`Passing ${backend_dev_command_utils_1.SIDECAR_URL_VAR_NAME}=${sidecar.url} to ${kind === "wrangler-dev" ? "wrangler dev" : "wrangler pages dev"}`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
printWorkerInstructions(sidecar.url);
|
|
106
|
+
}
|
|
107
|
+
const child = (0, child_process_1.spawn)(argv[0], argv.slice(1), {
|
|
108
|
+
stdio: "inherit",
|
|
109
|
+
env: {
|
|
110
|
+
...process.env,
|
|
111
|
+
// Harmless for workerd (host env is invisible inside the isolate) but
|
|
112
|
+
// lets non-workerd tooling in the dev command see the URL.
|
|
113
|
+
[backend_dev_command_utils_1.SIDECAR_URL_VAR_NAME]: sidecar.url,
|
|
114
|
+
},
|
|
115
|
+
// npx/pnpm/yarn shims on Windows are .cmd files, which require a shell.
|
|
116
|
+
shell: process.platform === "win32",
|
|
117
|
+
});
|
|
118
|
+
child.on("error", (error) => {
|
|
119
|
+
logger.error(`Could not start dev command: ${String(error)}`);
|
|
120
|
+
void shutdown(1);
|
|
121
|
+
});
|
|
122
|
+
child.on("exit", (code, signal) => {
|
|
123
|
+
// Wrangler teardown may still emit late waitUntil capture events; the
|
|
124
|
+
// sidecar is flushed and stopped only now, after the dev command exited.
|
|
125
|
+
void shutdown(code ?? (signal ? 1 : 0));
|
|
126
|
+
});
|
|
127
|
+
const forwardSignal = (signal) => {
|
|
128
|
+
// On terminal Ctrl-C the child receives SIGINT alongside us (same
|
|
129
|
+
// process group); forwarding covers direct kills of the CLI process.
|
|
130
|
+
// The dev command's own exit then drives the shutdown path above.
|
|
131
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
132
|
+
child.kill(signal);
|
|
133
|
+
setTimeout(() => {
|
|
134
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
135
|
+
child.kill("SIGKILL");
|
|
136
|
+
}
|
|
137
|
+
}, DEV_COMMAND_SIGTERM_TIMEOUT_MS).unref();
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
process.on("SIGINT", () => forwardSignal("SIGINT"));
|
|
141
|
+
process.on("SIGTERM", () => forwardSignal("SIGTERM"));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
printWorkerInstructions(sidecar.url);
|
|
145
|
+
logger.info("Press Ctrl-C to stop recording.");
|
|
146
|
+
process.on("SIGINT", () => void shutdown(0));
|
|
147
|
+
process.on("SIGTERM", () => void shutdown(0));
|
|
148
|
+
}
|
|
149
|
+
const exitCode = await done.promise;
|
|
150
|
+
if (exitCode !== 0) {
|
|
151
|
+
process.exit(exitCode);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
exports.recordBackendCommand = {
|
|
155
|
+
command: "backend [devCommand...]",
|
|
156
|
+
describe: "Record backend sessions from a Cloudflare Workers (workerd) app during local development. " +
|
|
157
|
+
"Starts the Meticulous recorder sidecar and optionally wraps your dev command: " +
|
|
158
|
+
"meticulous record backend -- npx wrangler dev",
|
|
159
|
+
builder: {
|
|
160
|
+
apiToken: common_options_1.OPTIONS.apiToken,
|
|
161
|
+
recordingToken: {
|
|
162
|
+
string: true,
|
|
163
|
+
description: "Recording token to upload with (skips API authentication). Defaults to the project's recording token resolved via the API token.",
|
|
164
|
+
},
|
|
165
|
+
port: {
|
|
166
|
+
number: true,
|
|
167
|
+
default: backend_sidecar_utils_1.DEFAULT_SIDECAR_PORT,
|
|
168
|
+
description: `Port for the sidecar to listen on (0 picks a free port; default ${backend_sidecar_utils_1.DEFAULT_SIDECAR_PORT})`,
|
|
169
|
+
},
|
|
170
|
+
exportMode: {
|
|
171
|
+
string: true,
|
|
172
|
+
choices: ["s3", "local"],
|
|
173
|
+
default: "s3",
|
|
174
|
+
description: 'Where the sidecar exports recorded sessions: "s3" uploads to Meticulous, "local" writes to disk for debugging',
|
|
175
|
+
},
|
|
176
|
+
localOutputDir: {
|
|
177
|
+
string: true,
|
|
178
|
+
description: "Directory for exported sessions when --exportMode is local",
|
|
179
|
+
},
|
|
180
|
+
injectSidecarVar: {
|
|
181
|
+
boolean: true,
|
|
182
|
+
default: true,
|
|
183
|
+
description: "Automatically pass the sidecar URL to a recognized wrangler dev command via --var/--binding",
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
handler: (0, sentry_utils_1.wrapHandler)(handler),
|
|
187
|
+
};
|
|
188
|
+
//# sourceMappingURL=backend.command.js.map
|
|
189
|
+
//# debugId=92c2f965-765b-58d4-bf09-9eeac162ecee
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.command.js","sources":["../../../src/commands/record/backend.command.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"92c2f965-765b-58d4-bf09-9eeac162ecee"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/record/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/record/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,eAAO,MAAM,aAAa,EAAE,aAa3B,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
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]="
|
|
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]="2abf8c2d-a23f-51b5-8af9-09241c9b4b8d")}catch(e){}}();
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.recordCommand = void 0;
|
|
6
|
+
const backend_command_1 = require("./backend.command");
|
|
6
7
|
const login_command_1 = require("./login.command");
|
|
7
8
|
const session_command_1 = require("./session.command");
|
|
8
9
|
exports.recordCommand = {
|
|
@@ -11,6 +12,7 @@ exports.recordCommand = {
|
|
|
11
12
|
builder: (yargs) => yargs
|
|
12
13
|
.command(session_command_1.recordSessionCommand)
|
|
13
14
|
.command(login_command_1.recordLoginCommand)
|
|
15
|
+
.command(backend_command_1.recordBackendCommand)
|
|
14
16
|
.demandCommand()
|
|
15
17
|
.help(),
|
|
16
18
|
handler: () => {
|
|
@@ -18,4 +20,4 @@ exports.recordCommand = {
|
|
|
18
20
|
},
|
|
19
21
|
};
|
|
20
22
|
//# sourceMappingURL=index.js.map
|
|
21
|
-
//# debugId=
|
|
23
|
+
//# debugId=2abf8c2d-a23f-51b5-8af9-09241c9b4b8d
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/commands/record/index.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AACA,mDAAqD;AACrD,uDAAyD;AAE5C,QAAA,aAAa,GAAkB;IAC1C,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,iBAAiB;IAC3B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,sCAAoB,CAAC;SAC7B,OAAO,CAAC,kCAAkB,CAAC;SAC3B,aAAa,EAAE;SACf,IAAI,EAAE;IACX,OAAO,EAAE,GAAG,EAAE;QACZ,0BAA0B;IAC5B,CAAC;CACF,CAAC","debugId":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/commands/record/index.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AACA,uDAAyD;AACzD,mDAAqD;AACrD,uDAAyD;AAE5C,QAAA,aAAa,GAAkB;IAC1C,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,iBAAiB;IAC3B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,sCAAoB,CAAC;SAC7B,OAAO,CAAC,kCAAkB,CAAC;SAC3B,OAAO,CAAC,sCAAoB,CAAC;SAC7B,aAAa,EAAE;SACf,IAAI,EAAE;IACX,OAAO,EAAE,GAAG,EAAE;QACZ,0BAA0B;IAC5B,CAAC;CACF,CAAC","debugId":"2abf8c2d-a23f-51b5-8af9-09241c9b4b8d"}
|
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,IAAI,QAAa,OAAO,CAAC,IAAI,CAgGzC,CAAC"}
|
package/dist/main.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
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]="
|
|
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]="72c07600-77ed-5fec-b3e2-13959f392538")}catch(e){}}();
|
|
3
3
|
|
|
4
4
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
8
8
|
exports.main = void 0;
|
|
9
9
|
const path_1 = require("path");
|
|
10
10
|
const common_1 = require("@alwaysmeticulous/common");
|
|
11
|
+
const client_1 = require("@alwaysmeticulous/client");
|
|
11
12
|
const sentry_1 = require("@alwaysmeticulous/sentry");
|
|
12
13
|
const yargs_1 = __importDefault(require("yargs"));
|
|
13
14
|
const json_args_1 = require("./command-utils/json-args");
|
|
@@ -20,6 +21,9 @@ const handleDataDir = (dataDir) => {
|
|
|
20
21
|
(0, common_1.setMeticulousLocalDataDir)(dataDir);
|
|
21
22
|
};
|
|
22
23
|
const main = async () => {
|
|
24
|
+
// Before any client is created, so requests from a CLI command are
|
|
25
|
+
// distinguishable from direct use of @alwaysmeticulous/client as a library.
|
|
26
|
+
(0, client_1.declareClientAppInfo)("cli");
|
|
23
27
|
(0, common_1.initLogger)();
|
|
24
28
|
const packageJsonPath = (0, path_1.normalize)((0, path_1.join)(__dirname, "../package.json"));
|
|
25
29
|
const meticulousVersion = await (0, common_1.getMeticulousVersion)(packageJsonPath);
|
|
@@ -101,4 +105,4 @@ const main = async () => {
|
|
|
101
105
|
exports.main = main;
|
|
102
106
|
void (0, exports.main)();
|
|
103
107
|
//# sourceMappingURL=main.js.map
|
|
104
|
-
//# debugId=
|
|
108
|
+
//# debugId=72c07600-77ed-5fec-b3e2-13959f392538
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sources":["../src/main.ts"],"sourceRoot":"","names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"main.js","sources":["../src/main.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"72c07600-77ed-5fec-b3e2-13959f392538"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
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]="
|
|
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]="cafa0aa8-de2b-5cc7-8b74-36cc15ac2a08")}catch(e){}}();
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
const vitest_1 = require("vitest");
|
|
@@ -53,13 +53,16 @@ const resolve_test_run_from_commit_1 = require("../resolve-test-run-from-commit"
|
|
|
53
53
|
(0, vitest_1.expect)(() => (0, resolve_test_run_from_commit_1.assertTestRunComplete)("tr-1", "Running")).toThrow(cli_user_error_1.CliUserError);
|
|
54
54
|
(0, vitest_1.expect)(() => (0, resolve_test_run_from_commit_1.assertTestRunComplete)("tr-1", "Running")).toThrow(/is not complete/);
|
|
55
55
|
});
|
|
56
|
-
|
|
56
|
+
// Deliberately not special-cased here: whether a base run is usable depends
|
|
57
|
+
// on what's being fetched, so each command intercepts Partial with its own
|
|
58
|
+
// policy and wording first (test-run-diffs rejects, js-coverage accepts).
|
|
59
|
+
(0, vitest_1.test)("does not special-case Partial", () => {
|
|
57
60
|
(0, vitest_1.expect)(() => (0, resolve_test_run_from_commit_1.assertTestRunComplete)("tr-1", "Partial")).toThrow(cli_user_error_1.CliUserError);
|
|
58
|
-
(0, vitest_1.expect)(() => (0, resolve_test_run_from_commit_1.assertTestRunComplete)("tr-1", "Partial")).toThrow(/
|
|
61
|
+
(0, vitest_1.expect)(() => (0, resolve_test_run_from_commit_1.assertTestRunComplete)("tr-1", "Partial")).toThrow(/is not complete \(status: Partial\)/);
|
|
59
62
|
});
|
|
60
63
|
(0, vitest_1.test)("uses the resultName in the not-yet-available message", () => {
|
|
61
64
|
(0, vitest_1.expect)(() => (0, resolve_test_run_from_commit_1.assertTestRunComplete)("tr-1", "Running", { resultName: "coverage" })).toThrow(/coverage not yet available/);
|
|
62
65
|
});
|
|
63
66
|
});
|
|
64
67
|
//# sourceMappingURL=resolve-test-run-from-commit.spec.js.map
|
|
65
|
-
//# debugId=
|
|
68
|
+
//# debugId=cafa0aa8-de2b-5cc7-8b74-36cc15ac2a08
|