headlamp 0.1.12 → 0.1.13
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/cli.cjs +236 -190
- package/dist/cli.cjs.map +4 -4
- package/dist/index.js +239 -193
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -93,7 +93,7 @@ var init_TimeoutError = __esm({
|
|
|
93
93
|
|
|
94
94
|
// node_modules/es-toolkit/dist/promise/delay.mjs
|
|
95
95
|
function delay(ms, { signal } = {}) {
|
|
96
|
-
return new Promise((
|
|
96
|
+
return new Promise((resolve11, reject) => {
|
|
97
97
|
const abortError = () => {
|
|
98
98
|
reject(new AbortError());
|
|
99
99
|
};
|
|
@@ -106,7 +106,7 @@ function delay(ms, { signal } = {}) {
|
|
|
106
106
|
}
|
|
107
107
|
const timeoutId = setTimeout(() => {
|
|
108
108
|
signal?.removeEventListener("abort", abortHandler);
|
|
109
|
-
|
|
109
|
+
resolve11();
|
|
110
110
|
}, ms);
|
|
111
111
|
signal?.addEventListener("abort", abortHandler, { once: true });
|
|
112
112
|
});
|
|
@@ -171,11 +171,11 @@ var init_exec = __esm({
|
|
|
171
171
|
child.stderr?.on("data", (chunk) => {
|
|
172
172
|
stderr += String(chunk);
|
|
173
173
|
});
|
|
174
|
-
const exec = new Promise((
|
|
174
|
+
const exec = new Promise((resolve11, reject) => {
|
|
175
175
|
child.on("error", reject);
|
|
176
176
|
child.on(
|
|
177
177
|
"close",
|
|
178
|
-
(code) => Number(code) === 0 ?
|
|
178
|
+
(code) => Number(code) === 0 ? resolve11(stdout) : reject(new Error(stderr || `exit ${code}`))
|
|
179
179
|
);
|
|
180
180
|
});
|
|
181
181
|
try {
|
|
@@ -195,7 +195,7 @@ var init_exec = __esm({
|
|
|
195
195
|
throw caughtError;
|
|
196
196
|
}
|
|
197
197
|
};
|
|
198
|
-
runExitCode = async (cmd, args, opts = {}) => new Promise((
|
|
198
|
+
runExitCode = async (cmd, args, opts = {}) => new Promise((resolve11, reject) => {
|
|
199
199
|
const child = (0, import_node_child_process.spawn)(cmd, [...args], {
|
|
200
200
|
cwd: opts.cwd,
|
|
201
201
|
env: opts.env,
|
|
@@ -204,9 +204,9 @@ var init_exec = __esm({
|
|
|
204
204
|
windowsHide: true
|
|
205
205
|
});
|
|
206
206
|
child.on("error", reject);
|
|
207
|
-
child.on("close", (code) =>
|
|
207
|
+
child.on("close", (code) => resolve11(Number(code)));
|
|
208
208
|
});
|
|
209
|
-
runWithCapture = async (cmd, args, opts) => new Promise((
|
|
209
|
+
runWithCapture = async (cmd, args, opts) => new Promise((resolve11, reject) => {
|
|
210
210
|
const child = (0, import_node_child_process.spawn)(cmd, [...args], {
|
|
211
211
|
cwd: opts.cwd,
|
|
212
212
|
env: opts.env,
|
|
@@ -222,7 +222,7 @@ var init_exec = __esm({
|
|
|
222
222
|
buf += String(chunk);
|
|
223
223
|
});
|
|
224
224
|
child.on("error", reject);
|
|
225
|
-
child.on("close", (code) =>
|
|
225
|
+
child.on("close", (code) => resolve11({ code: Number(code), output: buf }));
|
|
226
226
|
});
|
|
227
227
|
}
|
|
228
228
|
});
|
|
@@ -1980,16 +1980,16 @@ var require_lib = __commonJS({
|
|
|
1980
1980
|
"node_modules/json5/lib/index.js"(exports2, module2) {
|
|
1981
1981
|
var parse = require_parse();
|
|
1982
1982
|
var stringify = require_stringify();
|
|
1983
|
-
var
|
|
1983
|
+
var JSON54 = {
|
|
1984
1984
|
parse,
|
|
1985
1985
|
stringify
|
|
1986
1986
|
};
|
|
1987
|
-
module2.exports =
|
|
1987
|
+
module2.exports = JSON54;
|
|
1988
1988
|
}
|
|
1989
1989
|
});
|
|
1990
1990
|
|
|
1991
1991
|
// src/lib/program.ts
|
|
1992
|
-
var
|
|
1992
|
+
var path12 = __toESM(require("node:path"), 1);
|
|
1993
1993
|
var os3 = __toESM(require("node:os"), 1);
|
|
1994
1994
|
var fsSync3 = __toESM(require("node:fs"), 1);
|
|
1995
1995
|
var fs7 = __toESM(require("node:fs/promises"), 1);
|
|
@@ -4912,15 +4912,23 @@ var buildMessageSection = (messageLines, details, _ctx, opts) => {
|
|
|
4912
4912
|
const fallbackLines = [];
|
|
4913
4913
|
if (hasOnlyBareError) {
|
|
4914
4914
|
const startFrom = hintIdx >= 0 ? hintIdx + 1 : 0;
|
|
4915
|
+
let started = false;
|
|
4915
4916
|
for (let i = startFrom; i < lines.length; i += 1) {
|
|
4916
4917
|
const candidate = lines[i];
|
|
4917
|
-
if (
|
|
4918
|
+
if (isStackLine(candidate)) {
|
|
4918
4919
|
break;
|
|
4919
4920
|
}
|
|
4920
|
-
if (
|
|
4921
|
+
if (!candidate.trim()) {
|
|
4922
|
+
if (!started) {
|
|
4923
|
+
continue;
|
|
4924
|
+
}
|
|
4921
4925
|
break;
|
|
4922
4926
|
}
|
|
4927
|
+
started = true;
|
|
4923
4928
|
fallbackLines.push(candidate);
|
|
4929
|
+
if (fallbackLines.length >= 6) {
|
|
4930
|
+
break;
|
|
4931
|
+
}
|
|
4924
4932
|
}
|
|
4925
4933
|
if (fallbackLines.length === 0 && details && details.messages && details.messages.length) {
|
|
4926
4934
|
fallbackLines.push(
|
|
@@ -4988,7 +4996,7 @@ var linesFromDetails = (details) => {
|
|
|
4988
4996
|
if (typeof obj.received === "string") {
|
|
4989
4997
|
pushMaybe(obj.received, messages);
|
|
4990
4998
|
}
|
|
4991
|
-
const arrays = ["errors", "causes", "aggregatedErrors"];
|
|
4999
|
+
const arrays = ["errors", "details", "issues", "inner", "causes", "aggregatedErrors"];
|
|
4992
5000
|
for (const key of arrays) {
|
|
4993
5001
|
const arr = obj[key];
|
|
4994
5002
|
if (Array.isArray(arr)) {
|
|
@@ -4997,7 +5005,7 @@ var linesFromDetails = (details) => {
|
|
|
4997
5005
|
}
|
|
4998
5006
|
}
|
|
4999
5007
|
}
|
|
5000
|
-
const nestedCandidates = ["error", "cause", "matcherResult"];
|
|
5008
|
+
const nestedCandidates = ["error", "cause", "matcherResult", "context", "data"];
|
|
5001
5009
|
for (const key of nestedCandidates) {
|
|
5002
5010
|
if (obj[key] && typeof obj[key] === "object") {
|
|
5003
5011
|
visitDeep(obj[key], depth + 1);
|
|
@@ -5026,9 +5034,7 @@ var linesFromDetails = (details) => {
|
|
|
5026
5034
|
pushMaybe(matcher.expected, messages);
|
|
5027
5035
|
pushMaybe(matcher.received, messages);
|
|
5028
5036
|
}
|
|
5029
|
-
|
|
5030
|
-
visitDeep(detail, 0);
|
|
5031
|
-
}
|
|
5037
|
+
visitDeep(detail, 0);
|
|
5032
5038
|
}
|
|
5033
5039
|
}
|
|
5034
5040
|
return { stacks, messages };
|
|
@@ -5092,24 +5098,31 @@ var buildConsoleSection = (maybeConsole) => {
|
|
|
5092
5098
|
var buildFallbackMessageBlock = (messageLines, details) => {
|
|
5093
5099
|
const normalize2 = (arr) => arr.map((lineText) => stripAnsiSimple(lineText)).filter((line) => line.trim().length > 0);
|
|
5094
5100
|
const normalized = normalize2(messageLines);
|
|
5095
|
-
const informative = normalized.filter(
|
|
5101
|
+
const informative = normalized.filter(
|
|
5102
|
+
(line) => !/^\s*(?:Error|AssertionError):?\s*$/i.test(line)
|
|
5103
|
+
);
|
|
5096
5104
|
if (informative.length > 0) {
|
|
5097
5105
|
return [];
|
|
5098
5106
|
}
|
|
5099
5107
|
const errorIdx = normalized.findIndex(
|
|
5100
|
-
(line) => /(TypeError|ReferenceError|SyntaxError|RangeError|AssertionError|Error)
|
|
5108
|
+
(line) => /(TypeError|ReferenceError|SyntaxError|RangeError|AssertionError|Error):?/i.test(line)
|
|
5101
5109
|
);
|
|
5102
5110
|
const collected = [];
|
|
5103
5111
|
if (errorIdx >= 0) {
|
|
5104
|
-
|
|
5105
|
-
|
|
5106
|
-
|
|
5112
|
+
let started = false;
|
|
5113
|
+
for (let i = errorIdx + 1; i < messageLines.length && collected.length < 8; i += 1) {
|
|
5114
|
+
const raw = stripAnsiSimple(messageLines[i]);
|
|
5115
|
+
if (isStackLine(raw)) {
|
|
5107
5116
|
break;
|
|
5108
5117
|
}
|
|
5109
|
-
if (
|
|
5118
|
+
if (!raw.trim()) {
|
|
5119
|
+
if (!started) {
|
|
5120
|
+
continue;
|
|
5121
|
+
}
|
|
5110
5122
|
break;
|
|
5111
5123
|
}
|
|
5112
|
-
|
|
5124
|
+
started = true;
|
|
5125
|
+
collected.push(raw);
|
|
5113
5126
|
}
|
|
5114
5127
|
}
|
|
5115
5128
|
const fromDetails = collected.length > 0 ? [] : normalize2(details.messages).slice(0, 6);
|
|
@@ -5357,39 +5370,13 @@ var makeCtx = (opts, showStacks = false) => {
|
|
|
5357
5370
|
return { cwd, width, showStacks, projectHint, editorCmd: opts?.editorCmd, readSource: readSource2 };
|
|
5358
5371
|
};
|
|
5359
5372
|
|
|
5360
|
-
// src/lib/formatter/bridge.ts
|
|
5373
|
+
// src/lib/formatter/bridge/tryBridgeFallback.ts
|
|
5361
5374
|
var fs6 = __toESM(require("node:fs"), 1);
|
|
5375
|
+
var path11 = __toESM(require("node:path"), 1);
|
|
5376
|
+
var import_json53 = __toESM(require_lib(), 1);
|
|
5377
|
+
|
|
5378
|
+
// src/lib/formatter/bridge/logic.ts
|
|
5362
5379
|
var path10 = __toESM(require("node:path"), 1);
|
|
5363
|
-
var import_json52 = __toESM(require_lib(), 1);
|
|
5364
|
-
var colorTokens2 = {
|
|
5365
|
-
pass: Colors.Success,
|
|
5366
|
-
fail: Colors.Failure,
|
|
5367
|
-
skip: Colors.Skip,
|
|
5368
|
-
todo: Colors.Todo,
|
|
5369
|
-
passPill: (text) => BackgroundColors.Success(ansi.white(` ${text} `)),
|
|
5370
|
-
failPill: (text) => BackgroundColors.Failure(ansi.white(` ${text} `))
|
|
5371
|
-
};
|
|
5372
|
-
var by = (keySelector) => (left, right) => keySelector(left) - keySelector(right);
|
|
5373
|
-
var isObject = (candidateValue) => !!candidateValue && typeof candidateValue === "object";
|
|
5374
|
-
var asHttpList = (candidateValue) => Array.isArray(candidateValue) ? candidateValue : [];
|
|
5375
|
-
var summarizeUrl = (method, url, route) => {
|
|
5376
|
-
const base = route || url || "";
|
|
5377
|
-
const qs = url && url.includes("?") ? ` ? ${url.split("?")[1]}` : "";
|
|
5378
|
-
return [method || "", base, qs].filter(Boolean).join(" ").trim();
|
|
5379
|
-
};
|
|
5380
|
-
var stripBridgeEventsFromConsole = (maybeConsole) => {
|
|
5381
|
-
if (!Array.isArray(maybeConsole)) {
|
|
5382
|
-
return maybeConsole;
|
|
5383
|
-
}
|
|
5384
|
-
return maybeConsole.filter((entry) => {
|
|
5385
|
-
try {
|
|
5386
|
-
const raw = Array.isArray(entry.message) ? entry.message.map(String).join(" ") : String(entry.message ?? "");
|
|
5387
|
-
return !raw.includes("[JEST-BRIDGE-EVENT]");
|
|
5388
|
-
} catch {
|
|
5389
|
-
return true;
|
|
5390
|
-
}
|
|
5391
|
-
});
|
|
5392
|
-
};
|
|
5393
5380
|
var extractBridgePath2 = (raw, cwd) => {
|
|
5394
5381
|
const matches = Array.from(
|
|
5395
5382
|
raw.matchAll(/Test results written to:\s+([^\n\r]+jest-bridge-[^\s'"]+\.json)/g)
|
|
@@ -5397,7 +5384,7 @@ var extractBridgePath2 = (raw, cwd) => {
|
|
|
5397
5384
|
if (!matches.length) {
|
|
5398
5385
|
return null;
|
|
5399
5386
|
}
|
|
5400
|
-
const jsonPath = (matches[matches.length - 1][1] ?? "").trim().replace(/^["
|
|
5387
|
+
const jsonPath = (matches[matches.length - 1][1] ?? "").trim().replace(/^['"`]|['"`]$/g, "");
|
|
5401
5388
|
return path10.isAbsolute(jsonPath) ? jsonPath : path10.resolve(cwd, jsonPath).replace(/\\/g, "/");
|
|
5402
5389
|
};
|
|
5403
5390
|
var isTransportError = (msg) => {
|
|
@@ -5406,25 +5393,6 @@ var isTransportError = (msg) => {
|
|
|
5406
5393
|
lowercaseMessage
|
|
5407
5394
|
);
|
|
5408
5395
|
};
|
|
5409
|
-
var envNumber = (name, fallback) => {
|
|
5410
|
-
const parsed = Number(process.env[name]);
|
|
5411
|
-
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
5412
|
-
};
|
|
5413
|
-
var HEADLAMP_HTTP_WINDOW_MS = () => envNumber("HEADLAMP_HTTP_WINDOW_MS", 3e3);
|
|
5414
|
-
var HEADLAMP_HTTP_STRICT_WINDOW_MS = () => envNumber("HEADLAMP_HTTP_STRICT_WINDOW_MS", 600);
|
|
5415
|
-
var HEADLAMP_HTTP_MIN_SCORE = () => envNumber("HEADLAMP_HTTP_MIN_SCORE", 1200);
|
|
5416
|
-
var HEADLAMP_HTTP_DIFF_LIMIT = () => envNumber("HEADLAMP_HTTP_DIFF_LIMIT", 6);
|
|
5417
|
-
var HEADLAMP_HTTP_SHOW_MISS = () => process.env.HEADLAMP_HTTP_MISS === "1";
|
|
5418
|
-
var eventsNear = (http, ts, testPath, windowMs = HEADLAMP_HTTP_WINDOW_MS()) => {
|
|
5419
|
-
if (typeof ts !== "number" || !Number.isFinite(ts)) {
|
|
5420
|
-
return [];
|
|
5421
|
-
}
|
|
5422
|
-
return http.filter((e) => {
|
|
5423
|
-
const timeOk = typeof e.timestampMs === "number" && Math.abs(e.timestampMs - ts) <= windowMs;
|
|
5424
|
-
const pathOk = !testPath || e.testPath === testPath;
|
|
5425
|
-
return timeOk && pathOk;
|
|
5426
|
-
});
|
|
5427
|
-
};
|
|
5428
5396
|
var parseMethodPathFromTitle = (title) => {
|
|
5429
5397
|
if (!title) {
|
|
5430
5398
|
return {};
|
|
@@ -5432,35 +5400,6 @@ var parseMethodPathFromTitle = (title) => {
|
|
|
5432
5400
|
const matchResult = title.match(/\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+([^\s)]+)/i);
|
|
5433
5401
|
return matchResult ? { method: matchResult[1]?.toUpperCase(), path: matchResult[2] } : {};
|
|
5434
5402
|
};
|
|
5435
|
-
var isHttpStatusNumber = (statusNumber) => typeof statusNumber === "number" && statusNumber >= 100 && statusNumber <= 599;
|
|
5436
|
-
var hasStatusSemantics = (assertionLike) => {
|
|
5437
|
-
if (!assertionLike) {
|
|
5438
|
-
return false;
|
|
5439
|
-
}
|
|
5440
|
-
if (isHttpStatusNumber(assertionLike.expectedNumber) || isHttpStatusNumber(assertionLike.receivedNumber)) {
|
|
5441
|
-
return true;
|
|
5442
|
-
}
|
|
5443
|
-
const combinedRaw = `${assertionLike.matcher ?? ""} ${assertionLike.message ?? ""}`;
|
|
5444
|
-
const combinedMessage = combinedRaw.toLowerCase();
|
|
5445
|
-
return /\bstatus(code)?\b|\btohaves(tatus|tatuscode)\b/.test(combinedMessage);
|
|
5446
|
-
};
|
|
5447
|
-
var fileSuggestsHttp = (relPath2) => /(?:^|\/)(routes?|api|controllers?|e2e|integration)(?:\/|\.test\.)/i.test(relPath2);
|
|
5448
|
-
var inferHttpNumbersFromText = (lines) => {
|
|
5449
|
-
const text = lines.join("\n");
|
|
5450
|
-
const match = text.match(/Expected:\s*(\d{3})[\s\S]*?Received:\s*(\d{3})/i);
|
|
5451
|
-
if (match) {
|
|
5452
|
-
return { expectedNumber: Number(match[1]), receivedNumber: Number(match[2]) };
|
|
5453
|
-
}
|
|
5454
|
-
return {};
|
|
5455
|
-
};
|
|
5456
|
-
var titleSuggestsHttp = (title) => {
|
|
5457
|
-
const { method, path: parsedPath } = parseMethodPathFromTitle(title);
|
|
5458
|
-
return Boolean(method || parsedPath && parsedPath.startsWith("/"));
|
|
5459
|
-
};
|
|
5460
|
-
var isHttpRelevant = (ctx) => {
|
|
5461
|
-
const assertionCtx = ctx.assertion;
|
|
5462
|
-
return ctx.hasTransportSignal || ctx.httpCountInSameTest > 0 || titleSuggestsHttp(ctx.title) || hasStatusSemantics(assertionCtx) || fileSuggestsHttp(ctx.relPath);
|
|
5463
|
-
};
|
|
5464
5403
|
var routeSimilarityScore = (hint, evt) => {
|
|
5465
5404
|
if (!hint.path && !hint.method) {
|
|
5466
5405
|
return 0;
|
|
@@ -5481,6 +5420,15 @@ var routeSimilarityScore = (hint, evt) => {
|
|
|
5481
5420
|
}
|
|
5482
5421
|
return methodOk * 10;
|
|
5483
5422
|
};
|
|
5423
|
+
var envNumber = (name, fallback) => {
|
|
5424
|
+
const parsed = Number(process.env[name]);
|
|
5425
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
5426
|
+
};
|
|
5427
|
+
var HEADLAMP_HTTP_WINDOW_MS = () => envNumber("HEADLAMP_HTTP_WINDOW_MS", 3e3);
|
|
5428
|
+
var HEADLAMP_HTTP_STRICT_WINDOW_MS = () => envNumber("HEADLAMP_HTTP_STRICT_WINDOW_MS", 600);
|
|
5429
|
+
var HEADLAMP_HTTP_MIN_SCORE = () => envNumber("HEADLAMP_HTTP_MIN_SCORE", 1200);
|
|
5430
|
+
var HEADLAMP_HTTP_DIFF_LIMIT = () => envNumber("HEADLAMP_HTTP_DIFF_LIMIT", 6);
|
|
5431
|
+
var HEADLAMP_HTTP_SHOW_MISS = () => process.env.HEADLAMP_HTTP_MISS === "1";
|
|
5484
5432
|
var scoreHttpForAssertion = (assertion, titleHint) => (candidateEvent) => {
|
|
5485
5433
|
const tsA = assertion.timestampMs;
|
|
5486
5434
|
const tsH = candidateEvent.timestampMs;
|
|
@@ -5501,14 +5449,20 @@ var pickRelevantHttp = (assertion, http, ctx) => {
|
|
|
5501
5449
|
const windowMs = isTransportError(assertion.message) ? HEADLAMP_HTTP_STRICT_WINDOW_MS() : HEADLAMP_HTTP_WINDOW_MS();
|
|
5502
5450
|
let pool = strictPool;
|
|
5503
5451
|
if (!pool.length) {
|
|
5504
|
-
pool = http.filter(
|
|
5505
|
-
|
|
5506
|
-
|
|
5452
|
+
pool = http.filter((event) => {
|
|
5453
|
+
const samePath = event.testPath === ctx.testPath;
|
|
5454
|
+
const tsA = assertion.timestampMs;
|
|
5455
|
+
const tsH = event.timestampMs;
|
|
5456
|
+
const inWindow = typeof tsA === "number" && typeof tsH === "number" && Math.abs(tsH - tsA) <= windowMs;
|
|
5457
|
+
return samePath && inWindow;
|
|
5458
|
+
});
|
|
5507
5459
|
}
|
|
5508
5460
|
if (!pool.length) {
|
|
5509
|
-
pool = http.filter(
|
|
5510
|
-
|
|
5511
|
-
|
|
5461
|
+
pool = http.filter((event) => {
|
|
5462
|
+
const tsA = assertion.timestampMs;
|
|
5463
|
+
const tsH = event.timestampMs;
|
|
5464
|
+
return typeof tsA === "number" && typeof tsH === "number" && Math.abs(tsH - tsA) <= windowMs;
|
|
5465
|
+
});
|
|
5512
5466
|
}
|
|
5513
5467
|
if (!pool.length) {
|
|
5514
5468
|
return void 0;
|
|
@@ -5518,9 +5472,11 @@ var pickRelevantHttp = (assertion, http, ctx) => {
|
|
|
5518
5472
|
const threshold = isTransportError(assertion.message) ? Math.max(HEADLAMP_HTTP_MIN_SCORE(), 1400) : HEADLAMP_HTTP_MIN_SCORE();
|
|
5519
5473
|
return best && best.s >= threshold ? best.h : void 0;
|
|
5520
5474
|
};
|
|
5521
|
-
|
|
5475
|
+
|
|
5476
|
+
// src/lib/formatter/bridge/utils.ts
|
|
5477
|
+
var import_json52 = __toESM(require_lib(), 1);
|
|
5522
5478
|
var coerceJestJsonToBridge = (raw) => {
|
|
5523
|
-
if (
|
|
5479
|
+
if (raw && typeof raw === "object" && "aggregated" in raw) {
|
|
5524
5480
|
return raw;
|
|
5525
5481
|
}
|
|
5526
5482
|
const j = raw;
|
|
@@ -5547,19 +5503,85 @@ var coerceJestJsonToBridge = (raw) => {
|
|
|
5547
5503
|
}))
|
|
5548
5504
|
})),
|
|
5549
5505
|
aggregated: {
|
|
5550
|
-
numTotalTestSuites:
|
|
5551
|
-
numPassedTestSuites:
|
|
5552
|
-
numFailedTestSuites:
|
|
5553
|
-
numTotalTests:
|
|
5554
|
-
numPassedTests:
|
|
5555
|
-
numFailedTests:
|
|
5556
|
-
numPendingTests:
|
|
5557
|
-
numTodoTests:
|
|
5558
|
-
startTime:
|
|
5559
|
-
success:
|
|
5506
|
+
numTotalTestSuites: raw.numTotalTestSuites,
|
|
5507
|
+
numPassedTestSuites: raw.numPassedTestSuites,
|
|
5508
|
+
numFailedTestSuites: raw.numFailedTestSuites,
|
|
5509
|
+
numTotalTests: raw.numTotalTests,
|
|
5510
|
+
numPassedTests: raw.numPassedTests,
|
|
5511
|
+
numFailedTests: raw.numFailedTests,
|
|
5512
|
+
numPendingTests: raw.numPendingTests,
|
|
5513
|
+
numTodoTests: raw.numTodoTests,
|
|
5514
|
+
startTime: raw.startTime,
|
|
5515
|
+
success: raw.success,
|
|
5516
|
+
runTimeMs: raw.aggregated?.runTimeMs
|
|
5560
5517
|
}
|
|
5561
5518
|
};
|
|
5562
5519
|
};
|
|
5520
|
+
var colorTokens2 = {
|
|
5521
|
+
pass: Colors.Success,
|
|
5522
|
+
fail: Colors.Failure,
|
|
5523
|
+
skip: Colors.Skip,
|
|
5524
|
+
todo: Colors.Todo,
|
|
5525
|
+
passPill: (text) => BackgroundColors.Success(ansi.white(` ${text} `)),
|
|
5526
|
+
failPill: (text) => BackgroundColors.Failure(ansi.white(` ${text} `))
|
|
5527
|
+
};
|
|
5528
|
+
var by = (keySelector) => (left, right) => keySelector(left) - keySelector(right);
|
|
5529
|
+
var isObject = (candidateValue) => !!candidateValue && typeof candidateValue === "object";
|
|
5530
|
+
var asHttpList = (candidateValue) => Array.isArray(candidateValue) ? candidateValue : [];
|
|
5531
|
+
var summarizeUrl = (method, url, route) => {
|
|
5532
|
+
const base = route || url || "";
|
|
5533
|
+
const qs = url && url.includes("?") ? ` ? ${url.split("?")[1]}` : "";
|
|
5534
|
+
return [method || "", base, qs].filter(Boolean).join(" ").trim();
|
|
5535
|
+
};
|
|
5536
|
+
var stripBridgeEventsFromConsole = (maybeConsole) => {
|
|
5537
|
+
if (!Array.isArray(maybeConsole)) {
|
|
5538
|
+
return maybeConsole;
|
|
5539
|
+
}
|
|
5540
|
+
return maybeConsole.filter((entry) => {
|
|
5541
|
+
try {
|
|
5542
|
+
const raw = Array.isArray(entry.message) ? entry.message.map(String).join(" ") : String(entry.message ?? "");
|
|
5543
|
+
return !raw.includes("[JEST-BRIDGE-EVENT]");
|
|
5544
|
+
} catch {
|
|
5545
|
+
return true;
|
|
5546
|
+
}
|
|
5547
|
+
});
|
|
5548
|
+
};
|
|
5549
|
+
var eventsNear = (http, ts, testPath, windowMs = HEADLAMP_HTTP_WINDOW_MS()) => {
|
|
5550
|
+
if (typeof ts !== "number" || !Number.isFinite(ts)) {
|
|
5551
|
+
return [];
|
|
5552
|
+
}
|
|
5553
|
+
return http.filter((event) => {
|
|
5554
|
+
const timeOk = typeof event.timestampMs === "number" && Math.abs(event.timestampMs - ts) <= windowMs;
|
|
5555
|
+
const pathOk = !testPath || event.testPath === testPath;
|
|
5556
|
+
return timeOk && pathOk;
|
|
5557
|
+
});
|
|
5558
|
+
};
|
|
5559
|
+
var isHttpStatusNumber = (statusNumber) => typeof statusNumber === "number" && statusNumber >= 100 && statusNumber <= 599;
|
|
5560
|
+
var inferHttpNumbersFromText = (lines) => {
|
|
5561
|
+
const text = lines.join("\n");
|
|
5562
|
+
const match = text.match(/Expected:\s*(\d{3})[\s\S]*?Received:\s*(\d{3})/i);
|
|
5563
|
+
if (match) {
|
|
5564
|
+
return { expectedNumber: Number(match[1]), receivedNumber: Number(match[2]) };
|
|
5565
|
+
}
|
|
5566
|
+
return {};
|
|
5567
|
+
};
|
|
5568
|
+
var titleSuggestsHttp = (title) => {
|
|
5569
|
+
const { method, path: parsedPath } = parseMethodPathFromTitle(title);
|
|
5570
|
+
return Boolean(method || parsedPath && parsedPath.startsWith("/"));
|
|
5571
|
+
};
|
|
5572
|
+
var hasStatusSemantics = (assertionLike) => {
|
|
5573
|
+
if (!assertionLike) {
|
|
5574
|
+
return false;
|
|
5575
|
+
}
|
|
5576
|
+
if (isHttpStatusNumber(assertionLike.expectedNumber) || isHttpStatusNumber(assertionLike.receivedNumber)) {
|
|
5577
|
+
return true;
|
|
5578
|
+
}
|
|
5579
|
+
const combinedRaw = `${assertionLike.matcher ?? ""} ${assertionLike.message ?? ""}`;
|
|
5580
|
+
const combinedMessage = combinedRaw.toLowerCase();
|
|
5581
|
+
return /\bstatus(code)?\b|\btohaves(tatus|tatuscode)\b/.test(combinedMessage);
|
|
5582
|
+
};
|
|
5583
|
+
var fileSuggestsHttp = (relPath2) => /(?:^|\/)(routes?|api|controllers?|e2e|integration)(?:\/|\.test\.)/i.test(relPath2);
|
|
5584
|
+
var isHttpRelevant = (ctx) => ctx.hasTransportSignal || ctx.httpCountInSameTest > 0 || titleSuggestsHttp(ctx.title) || hasStatusSemantics(ctx.assertion) || fileSuggestsHttp(ctx.relPath);
|
|
5563
5585
|
var vitestFooter = (agg, durationMs) => {
|
|
5564
5586
|
const files = [
|
|
5565
5587
|
agg.numFailedTestSuites ? colorTokens2.fail(`${agg.numFailedTestSuites} failed`) : "",
|
|
@@ -6036,13 +6058,21 @@ var renderVitestFromJestJSON = (data, ctx, opts) => {
|
|
|
6036
6058
|
out.push(vitestFooter(data.aggregated));
|
|
6037
6059
|
return out.join("\n");
|
|
6038
6060
|
};
|
|
6061
|
+
|
|
6062
|
+
// src/lib/formatter/bridge/tryBridgeFallback.ts
|
|
6039
6063
|
var tryBridgeFallback = (raw, ctx, opts) => {
|
|
6040
|
-
|
|
6064
|
+
let bridgeJsonPath = extractBridgePath2(raw, ctx.cwd);
|
|
6065
|
+
if (!bridgeJsonPath) {
|
|
6066
|
+
const def = path11.resolve(ctx.cwd, "coverage/jest-run.json").replace(/\\/g, "/");
|
|
6067
|
+
if (fs6.existsSync(def)) {
|
|
6068
|
+
bridgeJsonPath = def;
|
|
6069
|
+
}
|
|
6070
|
+
}
|
|
6041
6071
|
if (!bridgeJsonPath || !fs6.existsSync(bridgeJsonPath)) {
|
|
6042
6072
|
return null;
|
|
6043
6073
|
}
|
|
6044
6074
|
try {
|
|
6045
|
-
const json =
|
|
6075
|
+
const json = import_json53.default.parse(fs6.readFileSync(bridgeJsonPath, "utf8"));
|
|
6046
6076
|
const bridge = coerceJestJsonToBridge(json);
|
|
6047
6077
|
return renderVitestFromJestJSON(bridge, ctx, opts);
|
|
6048
6078
|
} catch {
|
|
@@ -6060,23 +6090,39 @@ var formatJestOutputVitest = (raw, opts) => pipe(
|
|
|
6060
6090
|
(state) => ({ ...state, chunks: parseChunks(state.raw) }),
|
|
6061
6091
|
(state) => ({
|
|
6062
6092
|
...state,
|
|
6063
|
-
|
|
6093
|
+
native: renderChunks(state.chunks, state.ctx, mkPrettyFns(), {
|
|
6064
6094
|
onlyFailures: Boolean(state.opts?.onlyFailures)
|
|
6065
|
-
})
|
|
6095
|
+
}).text
|
|
6066
6096
|
}),
|
|
6067
|
-
(state) => {
|
|
6068
|
-
|
|
6069
|
-
|
|
6070
|
-
}
|
|
6071
|
-
const fallback = tryBridgeFallback(state.raw, state.ctx, {
|
|
6097
|
+
(state) => ({
|
|
6098
|
+
...state,
|
|
6099
|
+
bridge: tryBridgeFallback(state.raw, state.ctx, {
|
|
6072
6100
|
onlyFailures: Boolean(state.opts?.onlyFailures)
|
|
6073
|
-
})
|
|
6074
|
-
|
|
6075
|
-
|
|
6101
|
+
}) || null
|
|
6102
|
+
}),
|
|
6103
|
+
(state) => {
|
|
6104
|
+
const out = [];
|
|
6105
|
+
const seen = /* @__PURE__ */ new Set();
|
|
6106
|
+
const pushUnique = (text) => {
|
|
6107
|
+
if (!text) {
|
|
6108
|
+
return;
|
|
6109
|
+
}
|
|
6110
|
+
for (const line of text.split(/\r?\n/)) {
|
|
6111
|
+
const key = stripAnsiSimple(line);
|
|
6112
|
+
if (!seen.has(key)) {
|
|
6113
|
+
out.push(line);
|
|
6114
|
+
seen.add(key);
|
|
6115
|
+
}
|
|
6116
|
+
}
|
|
6117
|
+
};
|
|
6118
|
+
pushUnique(state.native);
|
|
6119
|
+
if (state.bridge) {
|
|
6120
|
+
if (out.length) {
|
|
6121
|
+
out.push("");
|
|
6122
|
+
}
|
|
6123
|
+
pushUnique(state.bridge);
|
|
6076
6124
|
}
|
|
6077
|
-
|
|
6078
|
-
return prefix ? `${prefix}
|
|
6079
|
-
${fallback}` : fallback;
|
|
6125
|
+
return out.join("\n");
|
|
6080
6126
|
}
|
|
6081
6127
|
);
|
|
6082
6128
|
|
|
@@ -6123,7 +6169,7 @@ var mergeLcov = async () => {
|
|
|
6123
6169
|
try {
|
|
6124
6170
|
const entries = fsSync3.readdirSync(dir, { withFileTypes: true });
|
|
6125
6171
|
for (const entry of entries) {
|
|
6126
|
-
const full =
|
|
6172
|
+
const full = path12.join(dir, entry.name);
|
|
6127
6173
|
if (entry.isDirectory()) {
|
|
6128
6174
|
out.push(...collectLcovs(full));
|
|
6129
6175
|
} else if (entry.isFile() && entry.name === "lcov.info") {
|
|
@@ -6135,8 +6181,8 @@ var mergeLcov = async () => {
|
|
|
6135
6181
|
return out;
|
|
6136
6182
|
};
|
|
6137
6183
|
try {
|
|
6138
|
-
const jestRoot =
|
|
6139
|
-
const candidates = [
|
|
6184
|
+
const jestRoot = path12.join("coverage", "jest");
|
|
6185
|
+
const candidates = [path12.join(jestRoot, "lcov.info"), ...collectLcovs(jestRoot)].map((candidatePath) => path12.resolve(candidatePath)).filter((absolutePath, index, arr) => arr.indexOf(absolutePath) === index);
|
|
6140
6186
|
for (const filePath of candidates) {
|
|
6141
6187
|
try {
|
|
6142
6188
|
const content = await readOrEmpty(filePath);
|
|
@@ -6176,7 +6222,7 @@ var emitMergedCoverage = async (ui, opts) => {
|
|
|
6176
6222
|
try {
|
|
6177
6223
|
const entries = fsSync3.readdirSync(dir, { withFileTypes: true });
|
|
6178
6224
|
for (const entry of entries) {
|
|
6179
|
-
const full =
|
|
6225
|
+
const full = path12.join(dir, entry.name);
|
|
6180
6226
|
if (entry.isDirectory()) {
|
|
6181
6227
|
out.push(...listJsons(full));
|
|
6182
6228
|
} else if (entry.isFile() && entry.name === "coverage-final.json") {
|
|
@@ -6187,11 +6233,11 @@ var emitMergedCoverage = async (ui, opts) => {
|
|
|
6187
6233
|
}
|
|
6188
6234
|
return out;
|
|
6189
6235
|
};
|
|
6190
|
-
const coverageRoot =
|
|
6236
|
+
const coverageRoot = path12.join("coverage", "jest");
|
|
6191
6237
|
const jsonCandidates = [
|
|
6192
|
-
|
|
6238
|
+
path12.join(coverageRoot, "coverage-final.json"),
|
|
6193
6239
|
...listJsons(coverageRoot)
|
|
6194
|
-
].map((candidatePath) =>
|
|
6240
|
+
].map((candidatePath) => path12.resolve(candidatePath)).filter((absolutePath, index, arr) => {
|
|
6195
6241
|
const isFirst = arr.indexOf(absolutePath) === index;
|
|
6196
6242
|
const exists = fsSync3.existsSync(absolutePath);
|
|
6197
6243
|
return isFirst && exists;
|
|
@@ -6253,7 +6299,7 @@ var emitMergedCoverage = async (ui, opts) => {
|
|
|
6253
6299
|
executedTests: opts.executedTests ?? []
|
|
6254
6300
|
});
|
|
6255
6301
|
const context = LibReport.createContext({
|
|
6256
|
-
dir:
|
|
6302
|
+
dir: path12.resolve("coverage", "merged"),
|
|
6257
6303
|
coverageMap: filteredMap,
|
|
6258
6304
|
defaultSummarizer: "nested"
|
|
6259
6305
|
});
|
|
@@ -6321,8 +6367,8 @@ var emitMergedCoverage = async (ui, opts) => {
|
|
|
6321
6367
|
for (const reporter of reporters) {
|
|
6322
6368
|
reporter.execute(context);
|
|
6323
6369
|
}
|
|
6324
|
-
const textPath =
|
|
6325
|
-
const summaryPath =
|
|
6370
|
+
const textPath = path12.resolve("coverage", "merged", "coverage.txt");
|
|
6371
|
+
const summaryPath = path12.resolve("coverage", "merged", "coverage-summary.txt");
|
|
6326
6372
|
const filesToPrint = [];
|
|
6327
6373
|
if (fsSync3.existsSync(textPath)) {
|
|
6328
6374
|
filesToPrint.push(textPath);
|
|
@@ -6465,13 +6511,13 @@ var program = async () => {
|
|
|
6465
6511
|
const rels2 = Array.from(
|
|
6466
6512
|
/* @__PURE__ */ new Set([...branchDiff, ...stagedNow, ...unstagedNow, ...untrackedNow])
|
|
6467
6513
|
);
|
|
6468
|
-
return rels2.map((rel) =>
|
|
6514
|
+
return rels2.map((rel) => path12.resolve(cwd, rel).replace(/\\/g, "/")).filter((abs) => !abs.includes("/node_modules/") && !abs.includes("/coverage/"));
|
|
6469
6515
|
}
|
|
6470
6516
|
const staged = mode === "staged" || mode === "all" ? await collect("git", ["diff", "--name-only", "--diff-filter=ACMRTUXB", "--cached"]) : [];
|
|
6471
6517
|
const unstagedTracked = mode === "unstaged" || mode === "all" ? await collect("git", ["diff", "--name-only", "--diff-filter=ACMRTUXB"]) : [];
|
|
6472
6518
|
const untracked = mode === "unstaged" || mode === "all" ? await collect("git", ["ls-files", "--others", "--exclude-standard"]) : [];
|
|
6473
6519
|
const rels = Array.from(/* @__PURE__ */ new Set([...staged, ...unstagedTracked, ...untracked]));
|
|
6474
|
-
return rels.map((rel) =>
|
|
6520
|
+
return rels.map((rel) => path12.resolve(cwd, rel).replace(/\\/g, "/")).filter((abs) => !abs.includes("/node_modules/") && !abs.includes("/coverage/"));
|
|
6475
6521
|
};
|
|
6476
6522
|
const repoRootForChanged = workspaceRoot ?? await findRepoRoot();
|
|
6477
6523
|
const changedSelectionAbs = changed ? await getChangedFiles(changed, repoRootForChanged) : [];
|
|
@@ -6496,18 +6542,18 @@ var program = async () => {
|
|
|
6496
6542
|
if (!token) {
|
|
6497
6543
|
continue;
|
|
6498
6544
|
}
|
|
6499
|
-
const isAbs =
|
|
6545
|
+
const isAbs = path12.isAbsolute(token);
|
|
6500
6546
|
const looksLikeRelPath = /[\\/]/.test(token);
|
|
6501
6547
|
let candidateFromRoot;
|
|
6502
6548
|
if (token.startsWith("/")) {
|
|
6503
|
-
candidateFromRoot =
|
|
6549
|
+
candidateFromRoot = path12.join(repoRoot, token.slice(1));
|
|
6504
6550
|
} else if (looksLikeRelPath) {
|
|
6505
|
-
candidateFromRoot =
|
|
6551
|
+
candidateFromRoot = path12.join(repoRoot, token);
|
|
6506
6552
|
} else {
|
|
6507
6553
|
candidateFromRoot = void 0;
|
|
6508
6554
|
}
|
|
6509
6555
|
const tryPushIfProd = (absPath) => {
|
|
6510
|
-
const norm =
|
|
6556
|
+
const norm = path12.resolve(absPath).replace(/\\/g, "/");
|
|
6511
6557
|
const isTest = /(^|\/)tests?\//i.test(norm) || /\.(test|spec)\.[tj]sx?$/i.test(norm);
|
|
6512
6558
|
if (!isTest && fsSync3.existsSync(norm)) {
|
|
6513
6559
|
results.add(norm);
|
|
@@ -6529,7 +6575,7 @@ var program = async () => {
|
|
|
6529
6575
|
}),
|
|
6530
6576
|
timeoutMs: 4e3
|
|
6531
6577
|
});
|
|
6532
|
-
const matches = out.split(/\r?\n/).map((line) => line.trim()).filter(Boolean).map((rel) =>
|
|
6578
|
+
const matches = out.split(/\r?\n/).map((line) => line.trim()).filter(Boolean).map((rel) => path12.resolve(repoRoot, rel).replace(/\\/g, "/")).filter(
|
|
6533
6579
|
(abs) => !abs.includes("/node_modules/") && !abs.includes("/coverage/") && !/(^|\/)tests?\//i.test(abs) && !/\.(test|spec)\.[tj]sx?$/i.test(abs)
|
|
6534
6580
|
);
|
|
6535
6581
|
matches.forEach((abs) => results.add(abs));
|
|
@@ -6550,8 +6596,8 @@ var program = async () => {
|
|
|
6550
6596
|
const jestDiscoveryArgs = selectionIncludesProdPaths ? stripPathTokens(jest) : jest;
|
|
6551
6597
|
const projectConfigs = [];
|
|
6552
6598
|
try {
|
|
6553
|
-
const baseCfg =
|
|
6554
|
-
const tsCfg =
|
|
6599
|
+
const baseCfg = path12.resolve("jest.config.js");
|
|
6600
|
+
const tsCfg = path12.resolve("jest.ts.config.js");
|
|
6555
6601
|
if (fsSync3.existsSync(baseCfg)) {
|
|
6556
6602
|
projectConfigs.push(baseCfg);
|
|
6557
6603
|
}
|
|
@@ -6568,7 +6614,7 @@ var program = async () => {
|
|
|
6568
6614
|
);
|
|
6569
6615
|
const prodSelections2 = expandedProdSelections;
|
|
6570
6616
|
for (const cfg of projectConfigs) {
|
|
6571
|
-
const cfgCwd =
|
|
6617
|
+
const cfgCwd = path12.dirname(cfg);
|
|
6572
6618
|
const allTests = await discoverJestResilient([...jestDiscoveryArgs, "--config", cfg], {
|
|
6573
6619
|
cwd: cfgCwd
|
|
6574
6620
|
});
|
|
@@ -6581,7 +6627,7 @@ var program = async () => {
|
|
|
6581
6627
|
});
|
|
6582
6628
|
} catch (err) {
|
|
6583
6629
|
if (isDebug()) {
|
|
6584
|
-
console.warn(`direct selection failed for project ${
|
|
6630
|
+
console.warn(`direct selection failed for project ${path12.basename(cfg)}: ${String(err)}`);
|
|
6585
6631
|
}
|
|
6586
6632
|
}
|
|
6587
6633
|
perProjectFiles.set(cfg, directPerProject);
|
|
@@ -6593,7 +6639,7 @@ var program = async () => {
|
|
|
6593
6639
|
)} | related=${selectionIncludesProdPaths} | cwd=${repoRootForDiscovery}`
|
|
6594
6640
|
);
|
|
6595
6641
|
for (const cfg of projectConfigs) {
|
|
6596
|
-
const cfgCwd =
|
|
6642
|
+
const cfgCwd = path12.dirname(cfg);
|
|
6597
6643
|
const files = await discoverJestResilient([...jestDiscoveryArgs, "--config", cfg], {
|
|
6598
6644
|
cwd: cfgCwd
|
|
6599
6645
|
});
|
|
@@ -6608,13 +6654,13 @@ var program = async () => {
|
|
|
6608
6654
|
);
|
|
6609
6655
|
const candidates = selectionHasPaths && selectionLooksLikeTest ? selectionTestPaths : files;
|
|
6610
6656
|
const absFiles = candidates.map(
|
|
6611
|
-
(candidatePath) =>
|
|
6657
|
+
(candidatePath) => path12.isAbsolute(candidatePath) ? candidatePath : path12.join(repoRootForDiscovery, candidatePath)
|
|
6612
6658
|
).map((absolutePath) => absolutePath.replace(/\\/g, "/"));
|
|
6613
6659
|
const onlyOwned = await filterCandidatesForProject(
|
|
6614
6660
|
cfg,
|
|
6615
6661
|
jestDiscoveryArgs,
|
|
6616
6662
|
absFiles,
|
|
6617
|
-
|
|
6663
|
+
path12.dirname(cfg)
|
|
6618
6664
|
);
|
|
6619
6665
|
perProjectFiltered.set(cfg, onlyOwned);
|
|
6620
6666
|
}
|
|
@@ -6626,7 +6672,7 @@ var program = async () => {
|
|
|
6626
6672
|
if (selectionHasPaths && prodSelections.length > 0) {
|
|
6627
6673
|
console.info(`rg related \u2192 prodSelections=${prodSelections.length} (starting)`);
|
|
6628
6674
|
const repoRootForRefinement = workspaceRoot ?? await findRepoRoot();
|
|
6629
|
-
const selectionKey = prodSelections.map((absPath) =>
|
|
6675
|
+
const selectionKey = prodSelections.map((absPath) => path12.relative(repoRootForRefinement, absPath).replace(/\\/g, "/")).sort((firstPath, secondPath) => firstPath.localeCompare(secondPath)).join("|");
|
|
6630
6676
|
const { cachedRelated: cachedRelated2, findRelatedTestsFast: findRelatedTestsFast2, DEFAULT_TEST_GLOBS: DEFAULT_TEST_GLOBS2 } = await Promise.resolve().then(() => (init_fast_related(), fast_related_exports));
|
|
6631
6677
|
const { DEFAULT_EXCLUDE: DEFAULT_EXCLUDE2 } = await Promise.resolve().then(() => (init_args(), args_exports));
|
|
6632
6678
|
const rgMatches = await cachedRelated2({
|
|
@@ -6656,7 +6702,7 @@ var program = async () => {
|
|
|
6656
6702
|
cfg,
|
|
6657
6703
|
jestDiscoveryArgs,
|
|
6658
6704
|
rgCandidates,
|
|
6659
|
-
|
|
6705
|
+
path12.dirname(cfg)
|
|
6660
6706
|
);
|
|
6661
6707
|
perProjectFromRg.set(cfg, owned);
|
|
6662
6708
|
}
|
|
@@ -6671,9 +6717,9 @@ var program = async () => {
|
|
|
6671
6717
|
} else {
|
|
6672
6718
|
const repoRootForScan = repoRootForDiscovery;
|
|
6673
6719
|
const toSeeds = (abs) => {
|
|
6674
|
-
const rel =
|
|
6720
|
+
const rel = path12.relative(repoRootForScan, abs).replace(/\\/g, "/");
|
|
6675
6721
|
const withoutExt = rel.replace(/\.(m?[tj]sx?)$/i, "");
|
|
6676
|
-
const base =
|
|
6722
|
+
const base = path12.basename(withoutExt);
|
|
6677
6723
|
const segs = withoutExt.split("/");
|
|
6678
6724
|
const tail2 = segs.slice(-2).join("/");
|
|
6679
6725
|
return Array.from(new Set([withoutExt, base, tail2].filter(Boolean)));
|
|
@@ -6688,8 +6734,8 @@ var program = async () => {
|
|
|
6688
6734
|
}
|
|
6689
6735
|
};
|
|
6690
6736
|
const resolveLocalImport = (fromFile, spec) => {
|
|
6691
|
-
const baseDir =
|
|
6692
|
-
const cand =
|
|
6737
|
+
const baseDir = path12.dirname(fromFile);
|
|
6738
|
+
const cand = path12.resolve(baseDir, spec);
|
|
6693
6739
|
const exts = ["", ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
|
|
6694
6740
|
for (const ext of exts) {
|
|
6695
6741
|
const full = ext ? `${cand}${ext}` : cand;
|
|
@@ -6698,7 +6744,7 @@ var program = async () => {
|
|
|
6698
6744
|
}
|
|
6699
6745
|
}
|
|
6700
6746
|
for (const ext of exts) {
|
|
6701
|
-
const full =
|
|
6747
|
+
const full = path12.join(cand, `index${ext}`);
|
|
6702
6748
|
if (fsSync3.existsSync(full)) {
|
|
6703
6749
|
return full;
|
|
6704
6750
|
}
|
|
@@ -6752,7 +6798,7 @@ var program = async () => {
|
|
|
6752
6798
|
cfg,
|
|
6753
6799
|
jestDiscoveryArgs,
|
|
6754
6800
|
keptCandidates,
|
|
6755
|
-
|
|
6801
|
+
path12.dirname(cfg)
|
|
6756
6802
|
);
|
|
6757
6803
|
perProjectFromScan.set(cfg, owned);
|
|
6758
6804
|
}
|
|
@@ -6782,7 +6828,7 @@ var program = async () => {
|
|
|
6782
6828
|
try {
|
|
6783
6829
|
const allAcross = [];
|
|
6784
6830
|
for (const cfg of projectConfigs) {
|
|
6785
|
-
const cfgCwd =
|
|
6831
|
+
const cfgCwd = path12.dirname(cfg);
|
|
6786
6832
|
const listed = await discoverJestResilient([...jestDiscoveryArgs, "--config", cfg], {
|
|
6787
6833
|
cwd: cfgCwd
|
|
6788
6834
|
});
|
|
@@ -6796,9 +6842,9 @@ var program = async () => {
|
|
|
6796
6842
|
}
|
|
6797
6843
|
}
|
|
6798
6844
|
const seeds = prodSelections.map(
|
|
6799
|
-
(abs) =>
|
|
6845
|
+
(abs) => path12.relative(repoRoot, abs).replace(/\\/g, "/").replace(/\.(m?[tj]sx?)$/i, "")
|
|
6800
6846
|
).flatMap((rel) => {
|
|
6801
|
-
const base =
|
|
6847
|
+
const base = path12.basename(rel);
|
|
6802
6848
|
const segments = rel.split("/");
|
|
6803
6849
|
return Array.from(new Set([rel, base, segments.slice(-2).join("/")].filter(Boolean)));
|
|
6804
6850
|
});
|
|
@@ -6811,8 +6857,8 @@ var program = async () => {
|
|
|
6811
6857
|
}
|
|
6812
6858
|
};
|
|
6813
6859
|
const resolveLocalImport = (fromFile, spec) => {
|
|
6814
|
-
const baseDir =
|
|
6815
|
-
const candidate =
|
|
6860
|
+
const baseDir = path12.dirname(fromFile);
|
|
6861
|
+
const candidate = path12.resolve(baseDir, spec);
|
|
6816
6862
|
const extensions = ["", ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts"];
|
|
6817
6863
|
for (const ext of extensions) {
|
|
6818
6864
|
const fullPath = ext ? `${candidate}${ext}` : candidate;
|
|
@@ -6821,7 +6867,7 @@ var program = async () => {
|
|
|
6821
6867
|
}
|
|
6822
6868
|
}
|
|
6823
6869
|
for (const ext of extensions) {
|
|
6824
|
-
const fullPath =
|
|
6870
|
+
const fullPath = path12.join(candidate, `index${ext}`);
|
|
6825
6871
|
if (fsSync3.existsSync(fullPath)) {
|
|
6826
6872
|
return fullPath;
|
|
6827
6873
|
}
|
|
@@ -6978,10 +7024,10 @@ var program = async () => {
|
|
|
6978
7024
|
};
|
|
6979
7025
|
const prodSeedsForRun = (() => {
|
|
6980
7026
|
const changedAbs = (changedSelectionAbs ?? []).map(
|
|
6981
|
-
(absPath) =>
|
|
7027
|
+
(absPath) => path12.resolve(absPath).replace(/\\/g, "/")
|
|
6982
7028
|
);
|
|
6983
7029
|
const selAbs = selectionPathsAugmented.map(
|
|
6984
|
-
(pathToken) =>
|
|
7030
|
+
(pathToken) => path12.resolve(pathToken).replace(/\\/g, "/")
|
|
6985
7031
|
);
|
|
6986
7032
|
return (changedAbs.length ? changedAbs : selAbs).filter(
|
|
6987
7033
|
(abs) => /[\\/]/.test(abs) && !/(^|\/)tests?\//i.test(abs) && !/\.(test|spec)\.[tj]sx?$/i.test(abs)
|
|
@@ -6996,17 +7042,17 @@ var program = async () => {
|
|
|
6996
7042
|
const cfg = projectsToRun[projIndex];
|
|
6997
7043
|
const files = perProjectFiltered.get(cfg) ?? [];
|
|
6998
7044
|
if (files.length === 0) {
|
|
6999
|
-
console.info(`Project ${
|
|
7045
|
+
console.info(`Project ${path12.basename(cfg)}: 0 matching tests after filter; skipping.`);
|
|
7000
7046
|
continue;
|
|
7001
7047
|
}
|
|
7002
7048
|
files.forEach(
|
|
7003
|
-
(absTestPath) => executedTestFilesSet.add(
|
|
7049
|
+
(absTestPath) => executedTestFilesSet.add(path12.resolve(absTestPath).replace(/\\/g, "/"))
|
|
7004
7050
|
);
|
|
7005
|
-
const outJson =
|
|
7051
|
+
const outJson = path12.join(
|
|
7006
7052
|
os3.tmpdir(),
|
|
7007
7053
|
`jest-bridge-${Date.now()}-${Math.random().toString(36).slice(2)}.json`
|
|
7008
7054
|
);
|
|
7009
|
-
const reporterPath =
|
|
7055
|
+
const reporterPath = path12.resolve("scripts/jest-vitest-bridge.cjs");
|
|
7010
7056
|
try {
|
|
7011
7057
|
const needsWrite = (() => {
|
|
7012
7058
|
try {
|
|
@@ -7017,10 +7063,10 @@ var program = async () => {
|
|
|
7017
7063
|
}
|
|
7018
7064
|
})();
|
|
7019
7065
|
if (needsWrite) {
|
|
7020
|
-
fsSync3.mkdirSync(
|
|
7066
|
+
fsSync3.mkdirSync(path12.dirname(reporterPath), { recursive: true });
|
|
7021
7067
|
fsSync3.writeFileSync(reporterPath, JEST_BRIDGE_REPORTER_SOURCE, "utf8");
|
|
7022
7068
|
}
|
|
7023
|
-
const envPath =
|
|
7069
|
+
const envPath = path12.resolve("scripts/jest-bridge-env.cjs");
|
|
7024
7070
|
try {
|
|
7025
7071
|
const existingEnv = fsSync3.readFileSync(envPath, "utf8");
|
|
7026
7072
|
if (existingEnv !== JEST_BRIDGE_ENV_SOURCE) {
|
|
@@ -7028,7 +7074,7 @@ var program = async () => {
|
|
|
7028
7074
|
}
|
|
7029
7075
|
} catch {
|
|
7030
7076
|
try {
|
|
7031
|
-
fsSync3.mkdirSync(
|
|
7077
|
+
fsSync3.mkdirSync(path12.dirname(envPath), { recursive: true });
|
|
7032
7078
|
} catch {
|
|
7033
7079
|
}
|
|
7034
7080
|
fsSync3.writeFileSync(envPath, JEST_BRIDGE_ENV_SOURCE, "utf8");
|
|
@@ -7036,7 +7082,7 @@ var program = async () => {
|
|
|
7036
7082
|
} catch (ensureReporterError) {
|
|
7037
7083
|
console.warn(`Unable to ensure jest bridge reporter: ${String(ensureReporterError)}`);
|
|
7038
7084
|
}
|
|
7039
|
-
const selectedFilesForCoverage = selectionPathsAugmented.filter((pathToken) => /[\\/]/.test(pathToken)).filter((pathToken) => !looksLikeTestPath(pathToken)).map((pathToken) =>
|
|
7085
|
+
const selectedFilesForCoverage = selectionPathsAugmented.filter((pathToken) => /[\\/]/.test(pathToken)).filter((pathToken) => !looksLikeTestPath(pathToken)).map((pathToken) => path12.relative(repoRootForDiscovery, pathToken).replace(/\\\\/g, "/")).filter((rel) => rel && !/^\.+\//.test(rel)).map((rel) => rel.startsWith("./") ? rel : `./${rel}`);
|
|
7040
7086
|
const coverageFromArgs = [];
|
|
7041
7087
|
for (const relPath2 of selectedFilesForCoverage) {
|
|
7042
7088
|
coverageFromArgs.push("--collectCoverageFrom", relPath2);
|
|
@@ -7054,11 +7100,11 @@ var program = async () => {
|
|
|
7054
7100
|
`--reporters=${reporterPath}`,
|
|
7055
7101
|
"--colors",
|
|
7056
7102
|
"--env",
|
|
7057
|
-
|
|
7103
|
+
path12.resolve("scripts/jest-bridge-env.cjs"),
|
|
7058
7104
|
...sanitizedJestRunArgs,
|
|
7059
7105
|
...collectCoverage ? [
|
|
7060
7106
|
"--coverageDirectory",
|
|
7061
|
-
|
|
7107
|
+
path12.join("coverage", "jest", path12.basename(cfg).replace(/[^a-zA-Z0-9_.-]+/g, "_"))
|
|
7062
7108
|
] : [],
|
|
7063
7109
|
...coverageFromArgs,
|
|
7064
7110
|
"--passWithNoTests",
|
|
@@ -7184,10 +7230,10 @@ ${stripFooter(rawAlso)}`.trimEnd();
|
|
|
7184
7230
|
try {
|
|
7185
7231
|
const prodSeeds = (() => {
|
|
7186
7232
|
const changedAbs = (changedSelectionAbs ?? []).map(
|
|
7187
|
-
(absPath) =>
|
|
7233
|
+
(absPath) => path12.resolve(absPath).replace(/\\/g, "/")
|
|
7188
7234
|
);
|
|
7189
7235
|
const selAbs = selectionPathsAugmented.map(
|
|
7190
|
-
(pathToken) =>
|
|
7236
|
+
(pathToken) => path12.resolve(pathToken).replace(/\\/g, "/")
|
|
7191
7237
|
);
|
|
7192
7238
|
return (changedAbs.length ? changedAbs : selAbs).filter(
|
|
7193
7239
|
(abs) => /[\\/]/.test(abs) && !/(^|\/)tests?\//i.test(abs) && !/\.(test|spec)\.[tj]sx?$/i.test(abs)
|