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/index.js
CHANGED
|
@@ -593,7 +593,7 @@ var init_TimeoutError = __esm({
|
|
|
593
593
|
|
|
594
594
|
// node_modules/es-toolkit/dist/promise/delay.mjs
|
|
595
595
|
function delay(ms, { signal } = {}) {
|
|
596
|
-
return new Promise((
|
|
596
|
+
return new Promise((resolve11, reject) => {
|
|
597
597
|
const abortError = () => {
|
|
598
598
|
reject(new AbortError());
|
|
599
599
|
};
|
|
@@ -606,7 +606,7 @@ function delay(ms, { signal } = {}) {
|
|
|
606
606
|
}
|
|
607
607
|
const timeoutId = setTimeout(() => {
|
|
608
608
|
signal?.removeEventListener("abort", abortHandler);
|
|
609
|
-
|
|
609
|
+
resolve11();
|
|
610
610
|
}, ms);
|
|
611
611
|
signal?.addEventListener("abort", abortHandler, { once: true });
|
|
612
612
|
});
|
|
@@ -671,11 +671,11 @@ var init_exec = __esm({
|
|
|
671
671
|
child.stderr?.on("data", (chunk) => {
|
|
672
672
|
stderr += String(chunk);
|
|
673
673
|
});
|
|
674
|
-
const exec = new Promise((
|
|
674
|
+
const exec = new Promise((resolve11, reject) => {
|
|
675
675
|
child.on("error", reject);
|
|
676
676
|
child.on(
|
|
677
677
|
"close",
|
|
678
|
-
(code) => Number(code) === 0 ?
|
|
678
|
+
(code) => Number(code) === 0 ? resolve11(stdout) : reject(new Error(stderr || `exit ${code}`))
|
|
679
679
|
);
|
|
680
680
|
});
|
|
681
681
|
try {
|
|
@@ -695,7 +695,7 @@ var init_exec = __esm({
|
|
|
695
695
|
throw caughtError;
|
|
696
696
|
}
|
|
697
697
|
};
|
|
698
|
-
runExitCode = async (cmd, args, opts = {}) => new Promise((
|
|
698
|
+
runExitCode = async (cmd, args, opts = {}) => new Promise((resolve11, reject) => {
|
|
699
699
|
const child = spawn(cmd, [...args], {
|
|
700
700
|
cwd: opts.cwd,
|
|
701
701
|
env: opts.env,
|
|
@@ -704,9 +704,9 @@ var init_exec = __esm({
|
|
|
704
704
|
windowsHide: true
|
|
705
705
|
});
|
|
706
706
|
child.on("error", reject);
|
|
707
|
-
child.on("close", (code) =>
|
|
707
|
+
child.on("close", (code) => resolve11(Number(code)));
|
|
708
708
|
});
|
|
709
|
-
runWithCapture = async (cmd, args, opts) => new Promise((
|
|
709
|
+
runWithCapture = async (cmd, args, opts) => new Promise((resolve11, reject) => {
|
|
710
710
|
const child = spawn(cmd, [...args], {
|
|
711
711
|
cwd: opts.cwd,
|
|
712
712
|
env: opts.env,
|
|
@@ -722,7 +722,7 @@ var init_exec = __esm({
|
|
|
722
722
|
buf += String(chunk);
|
|
723
723
|
});
|
|
724
724
|
child.on("error", reject);
|
|
725
|
-
child.on("close", (code) =>
|
|
725
|
+
child.on("close", (code) => resolve11({ code: Number(code), output: buf }));
|
|
726
726
|
});
|
|
727
727
|
}
|
|
728
728
|
});
|
|
@@ -1126,8 +1126,8 @@ var require_utils = __commonJS({
|
|
|
1126
1126
|
}
|
|
1127
1127
|
return output;
|
|
1128
1128
|
};
|
|
1129
|
-
exports.basename = (
|
|
1130
|
-
const segs =
|
|
1129
|
+
exports.basename = (path13, { windows } = {}) => {
|
|
1130
|
+
const segs = path13.split(windows ? /[\\/]/ : "/");
|
|
1131
1131
|
const last = segs[segs.length - 1];
|
|
1132
1132
|
if (last === "") {
|
|
1133
1133
|
return segs[segs.length - 2];
|
|
@@ -3496,11 +3496,11 @@ var require_lib = __commonJS({
|
|
|
3496
3496
|
"node_modules/json5/lib/index.js"(exports, module) {
|
|
3497
3497
|
var parse = require_parse2();
|
|
3498
3498
|
var stringify = require_stringify();
|
|
3499
|
-
var
|
|
3499
|
+
var JSON54 = {
|
|
3500
3500
|
parse,
|
|
3501
3501
|
stringify
|
|
3502
3502
|
};
|
|
3503
|
-
module.exports =
|
|
3503
|
+
module.exports = JSON54;
|
|
3504
3504
|
}
|
|
3505
3505
|
});
|
|
3506
3506
|
|
|
@@ -6126,15 +6126,23 @@ var buildMessageSection = (messageLines, details, _ctx, opts) => {
|
|
|
6126
6126
|
const fallbackLines = [];
|
|
6127
6127
|
if (hasOnlyBareError) {
|
|
6128
6128
|
const startFrom = hintIdx >= 0 ? hintIdx + 1 : 0;
|
|
6129
|
+
let started = false;
|
|
6129
6130
|
for (let i = startFrom; i < lines.length; i += 1) {
|
|
6130
6131
|
const candidate = lines[i];
|
|
6131
|
-
if (
|
|
6132
|
+
if (isStackLine(candidate)) {
|
|
6132
6133
|
break;
|
|
6133
6134
|
}
|
|
6134
|
-
if (
|
|
6135
|
+
if (!candidate.trim()) {
|
|
6136
|
+
if (!started) {
|
|
6137
|
+
continue;
|
|
6138
|
+
}
|
|
6135
6139
|
break;
|
|
6136
6140
|
}
|
|
6141
|
+
started = true;
|
|
6137
6142
|
fallbackLines.push(candidate);
|
|
6143
|
+
if (fallbackLines.length >= 6) {
|
|
6144
|
+
break;
|
|
6145
|
+
}
|
|
6138
6146
|
}
|
|
6139
6147
|
if (fallbackLines.length === 0 && details && details.messages && details.messages.length) {
|
|
6140
6148
|
fallbackLines.push(
|
|
@@ -6202,7 +6210,7 @@ var linesFromDetails = (details) => {
|
|
|
6202
6210
|
if (typeof obj.received === "string") {
|
|
6203
6211
|
pushMaybe(obj.received, messages);
|
|
6204
6212
|
}
|
|
6205
|
-
const arrays = ["errors", "causes", "aggregatedErrors"];
|
|
6213
|
+
const arrays = ["errors", "details", "issues", "inner", "causes", "aggregatedErrors"];
|
|
6206
6214
|
for (const key of arrays) {
|
|
6207
6215
|
const arr = obj[key];
|
|
6208
6216
|
if (Array.isArray(arr)) {
|
|
@@ -6211,7 +6219,7 @@ var linesFromDetails = (details) => {
|
|
|
6211
6219
|
}
|
|
6212
6220
|
}
|
|
6213
6221
|
}
|
|
6214
|
-
const nestedCandidates = ["error", "cause", "matcherResult"];
|
|
6222
|
+
const nestedCandidates = ["error", "cause", "matcherResult", "context", "data"];
|
|
6215
6223
|
for (const key of nestedCandidates) {
|
|
6216
6224
|
if (obj[key] && typeof obj[key] === "object") {
|
|
6217
6225
|
visitDeep(obj[key], depth + 1);
|
|
@@ -6240,9 +6248,7 @@ var linesFromDetails = (details) => {
|
|
|
6240
6248
|
pushMaybe(matcher.expected, messages);
|
|
6241
6249
|
pushMaybe(matcher.received, messages);
|
|
6242
6250
|
}
|
|
6243
|
-
|
|
6244
|
-
visitDeep(detail, 0);
|
|
6245
|
-
}
|
|
6251
|
+
visitDeep(detail, 0);
|
|
6246
6252
|
}
|
|
6247
6253
|
}
|
|
6248
6254
|
return { stacks, messages };
|
|
@@ -6306,24 +6312,31 @@ var buildConsoleSection = (maybeConsole) => {
|
|
|
6306
6312
|
var buildFallbackMessageBlock = (messageLines, details) => {
|
|
6307
6313
|
const normalize2 = (arr) => arr.map((lineText) => stripAnsiSimple(lineText)).filter((line) => line.trim().length > 0);
|
|
6308
6314
|
const normalized = normalize2(messageLines);
|
|
6309
|
-
const informative = normalized.filter(
|
|
6315
|
+
const informative = normalized.filter(
|
|
6316
|
+
(line) => !/^\s*(?:Error|AssertionError):?\s*$/i.test(line)
|
|
6317
|
+
);
|
|
6310
6318
|
if (informative.length > 0) {
|
|
6311
6319
|
return [];
|
|
6312
6320
|
}
|
|
6313
6321
|
const errorIdx = normalized.findIndex(
|
|
6314
|
-
(line) => /(TypeError|ReferenceError|SyntaxError|RangeError|AssertionError|Error)
|
|
6322
|
+
(line) => /(TypeError|ReferenceError|SyntaxError|RangeError|AssertionError|Error):?/i.test(line)
|
|
6315
6323
|
);
|
|
6316
6324
|
const collected = [];
|
|
6317
6325
|
if (errorIdx >= 0) {
|
|
6318
|
-
|
|
6319
|
-
|
|
6320
|
-
|
|
6326
|
+
let started = false;
|
|
6327
|
+
for (let i = errorIdx + 1; i < messageLines.length && collected.length < 8; i += 1) {
|
|
6328
|
+
const raw = stripAnsiSimple(messageLines[i]);
|
|
6329
|
+
if (isStackLine(raw)) {
|
|
6321
6330
|
break;
|
|
6322
6331
|
}
|
|
6323
|
-
if (
|
|
6332
|
+
if (!raw.trim()) {
|
|
6333
|
+
if (!started) {
|
|
6334
|
+
continue;
|
|
6335
|
+
}
|
|
6324
6336
|
break;
|
|
6325
6337
|
}
|
|
6326
|
-
|
|
6338
|
+
started = true;
|
|
6339
|
+
collected.push(raw);
|
|
6327
6340
|
}
|
|
6328
6341
|
}
|
|
6329
6342
|
const fromDetails = collected.length > 0 ? [] : normalize2(details.messages).slice(0, 6);
|
|
@@ -6571,39 +6584,13 @@ var makeCtx = (opts, showStacks = false) => {
|
|
|
6571
6584
|
return { cwd, width, showStacks, projectHint, editorCmd: opts?.editorCmd, readSource: readSource2 };
|
|
6572
6585
|
};
|
|
6573
6586
|
|
|
6574
|
-
// src/lib/formatter/bridge.ts
|
|
6575
|
-
var
|
|
6587
|
+
// src/lib/formatter/bridge/tryBridgeFallback.ts
|
|
6588
|
+
var import_json53 = __toESM(require_lib(), 1);
|
|
6576
6589
|
import * as fs6 from "node:fs";
|
|
6590
|
+
import * as path11 from "node:path";
|
|
6591
|
+
|
|
6592
|
+
// src/lib/formatter/bridge/logic.ts
|
|
6577
6593
|
import * as path10 from "node:path";
|
|
6578
|
-
var colorTokens2 = {
|
|
6579
|
-
pass: Colors.Success,
|
|
6580
|
-
fail: Colors.Failure,
|
|
6581
|
-
skip: Colors.Skip,
|
|
6582
|
-
todo: Colors.Todo,
|
|
6583
|
-
passPill: (text) => BackgroundColors.Success(ansi.white(` ${text} `)),
|
|
6584
|
-
failPill: (text) => BackgroundColors.Failure(ansi.white(` ${text} `))
|
|
6585
|
-
};
|
|
6586
|
-
var by = (keySelector) => (left, right) => keySelector(left) - keySelector(right);
|
|
6587
|
-
var isObject = (candidateValue) => !!candidateValue && typeof candidateValue === "object";
|
|
6588
|
-
var asHttpList = (candidateValue) => Array.isArray(candidateValue) ? candidateValue : [];
|
|
6589
|
-
var summarizeUrl = (method, url, route) => {
|
|
6590
|
-
const base = route || url || "";
|
|
6591
|
-
const qs = url && url.includes("?") ? ` ? ${url.split("?")[1]}` : "";
|
|
6592
|
-
return [method || "", base, qs].filter(Boolean).join(" ").trim();
|
|
6593
|
-
};
|
|
6594
|
-
var stripBridgeEventsFromConsole = (maybeConsole) => {
|
|
6595
|
-
if (!Array.isArray(maybeConsole)) {
|
|
6596
|
-
return maybeConsole;
|
|
6597
|
-
}
|
|
6598
|
-
return maybeConsole.filter((entry) => {
|
|
6599
|
-
try {
|
|
6600
|
-
const raw = Array.isArray(entry.message) ? entry.message.map(String).join(" ") : String(entry.message ?? "");
|
|
6601
|
-
return !raw.includes("[JEST-BRIDGE-EVENT]");
|
|
6602
|
-
} catch {
|
|
6603
|
-
return true;
|
|
6604
|
-
}
|
|
6605
|
-
});
|
|
6606
|
-
};
|
|
6607
6594
|
var extractBridgePath2 = (raw, cwd) => {
|
|
6608
6595
|
const matches = Array.from(
|
|
6609
6596
|
raw.matchAll(/Test results written to:\s+([^\n\r]+jest-bridge-[^\s'"]+\.json)/g)
|
|
@@ -6611,7 +6598,7 @@ var extractBridgePath2 = (raw, cwd) => {
|
|
|
6611
6598
|
if (!matches.length) {
|
|
6612
6599
|
return null;
|
|
6613
6600
|
}
|
|
6614
|
-
const jsonPath = (matches[matches.length - 1][1] ?? "").trim().replace(/^["
|
|
6601
|
+
const jsonPath = (matches[matches.length - 1][1] ?? "").trim().replace(/^['"`]|['"`]$/g, "");
|
|
6615
6602
|
return path10.isAbsolute(jsonPath) ? jsonPath : path10.resolve(cwd, jsonPath).replace(/\\/g, "/");
|
|
6616
6603
|
};
|
|
6617
6604
|
var isTransportError = (msg) => {
|
|
@@ -6620,25 +6607,6 @@ var isTransportError = (msg) => {
|
|
|
6620
6607
|
lowercaseMessage
|
|
6621
6608
|
);
|
|
6622
6609
|
};
|
|
6623
|
-
var envNumber = (name, fallback) => {
|
|
6624
|
-
const parsed = Number(process.env[name]);
|
|
6625
|
-
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
6626
|
-
};
|
|
6627
|
-
var HEADLAMP_HTTP_WINDOW_MS = () => envNumber("HEADLAMP_HTTP_WINDOW_MS", 3e3);
|
|
6628
|
-
var HEADLAMP_HTTP_STRICT_WINDOW_MS = () => envNumber("HEADLAMP_HTTP_STRICT_WINDOW_MS", 600);
|
|
6629
|
-
var HEADLAMP_HTTP_MIN_SCORE = () => envNumber("HEADLAMP_HTTP_MIN_SCORE", 1200);
|
|
6630
|
-
var HEADLAMP_HTTP_DIFF_LIMIT = () => envNumber("HEADLAMP_HTTP_DIFF_LIMIT", 6);
|
|
6631
|
-
var HEADLAMP_HTTP_SHOW_MISS = () => process.env.HEADLAMP_HTTP_MISS === "1";
|
|
6632
|
-
var eventsNear = (http, ts, testPath, windowMs = HEADLAMP_HTTP_WINDOW_MS()) => {
|
|
6633
|
-
if (typeof ts !== "number" || !Number.isFinite(ts)) {
|
|
6634
|
-
return [];
|
|
6635
|
-
}
|
|
6636
|
-
return http.filter((e) => {
|
|
6637
|
-
const timeOk = typeof e.timestampMs === "number" && Math.abs(e.timestampMs - ts) <= windowMs;
|
|
6638
|
-
const pathOk = !testPath || e.testPath === testPath;
|
|
6639
|
-
return timeOk && pathOk;
|
|
6640
|
-
});
|
|
6641
|
-
};
|
|
6642
6610
|
var parseMethodPathFromTitle = (title) => {
|
|
6643
6611
|
if (!title) {
|
|
6644
6612
|
return {};
|
|
@@ -6646,35 +6614,6 @@ var parseMethodPathFromTitle = (title) => {
|
|
|
6646
6614
|
const matchResult = title.match(/\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+([^\s)]+)/i);
|
|
6647
6615
|
return matchResult ? { method: matchResult[1]?.toUpperCase(), path: matchResult[2] } : {};
|
|
6648
6616
|
};
|
|
6649
|
-
var isHttpStatusNumber = (statusNumber) => typeof statusNumber === "number" && statusNumber >= 100 && statusNumber <= 599;
|
|
6650
|
-
var hasStatusSemantics = (assertionLike) => {
|
|
6651
|
-
if (!assertionLike) {
|
|
6652
|
-
return false;
|
|
6653
|
-
}
|
|
6654
|
-
if (isHttpStatusNumber(assertionLike.expectedNumber) || isHttpStatusNumber(assertionLike.receivedNumber)) {
|
|
6655
|
-
return true;
|
|
6656
|
-
}
|
|
6657
|
-
const combinedRaw = `${assertionLike.matcher ?? ""} ${assertionLike.message ?? ""}`;
|
|
6658
|
-
const combinedMessage = combinedRaw.toLowerCase();
|
|
6659
|
-
return /\bstatus(code)?\b|\btohaves(tatus|tatuscode)\b/.test(combinedMessage);
|
|
6660
|
-
};
|
|
6661
|
-
var fileSuggestsHttp = (relPath2) => /(?:^|\/)(routes?|api|controllers?|e2e|integration)(?:\/|\.test\.)/i.test(relPath2);
|
|
6662
|
-
var inferHttpNumbersFromText = (lines) => {
|
|
6663
|
-
const text = lines.join("\n");
|
|
6664
|
-
const match = text.match(/Expected:\s*(\d{3})[\s\S]*?Received:\s*(\d{3})/i);
|
|
6665
|
-
if (match) {
|
|
6666
|
-
return { expectedNumber: Number(match[1]), receivedNumber: Number(match[2]) };
|
|
6667
|
-
}
|
|
6668
|
-
return {};
|
|
6669
|
-
};
|
|
6670
|
-
var titleSuggestsHttp = (title) => {
|
|
6671
|
-
const { method, path: parsedPath } = parseMethodPathFromTitle(title);
|
|
6672
|
-
return Boolean(method || parsedPath && parsedPath.startsWith("/"));
|
|
6673
|
-
};
|
|
6674
|
-
var isHttpRelevant = (ctx) => {
|
|
6675
|
-
const assertionCtx = ctx.assertion;
|
|
6676
|
-
return ctx.hasTransportSignal || ctx.httpCountInSameTest > 0 || titleSuggestsHttp(ctx.title) || hasStatusSemantics(assertionCtx) || fileSuggestsHttp(ctx.relPath);
|
|
6677
|
-
};
|
|
6678
6617
|
var routeSimilarityScore = (hint, evt) => {
|
|
6679
6618
|
if (!hint.path && !hint.method) {
|
|
6680
6619
|
return 0;
|
|
@@ -6695,6 +6634,15 @@ var routeSimilarityScore = (hint, evt) => {
|
|
|
6695
6634
|
}
|
|
6696
6635
|
return methodOk * 10;
|
|
6697
6636
|
};
|
|
6637
|
+
var envNumber = (name, fallback) => {
|
|
6638
|
+
const parsed = Number(process.env[name]);
|
|
6639
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
6640
|
+
};
|
|
6641
|
+
var HEADLAMP_HTTP_WINDOW_MS = () => envNumber("HEADLAMP_HTTP_WINDOW_MS", 3e3);
|
|
6642
|
+
var HEADLAMP_HTTP_STRICT_WINDOW_MS = () => envNumber("HEADLAMP_HTTP_STRICT_WINDOW_MS", 600);
|
|
6643
|
+
var HEADLAMP_HTTP_MIN_SCORE = () => envNumber("HEADLAMP_HTTP_MIN_SCORE", 1200);
|
|
6644
|
+
var HEADLAMP_HTTP_DIFF_LIMIT = () => envNumber("HEADLAMP_HTTP_DIFF_LIMIT", 6);
|
|
6645
|
+
var HEADLAMP_HTTP_SHOW_MISS = () => process.env.HEADLAMP_HTTP_MISS === "1";
|
|
6698
6646
|
var scoreHttpForAssertion = (assertion, titleHint) => (candidateEvent) => {
|
|
6699
6647
|
const tsA = assertion.timestampMs;
|
|
6700
6648
|
const tsH = candidateEvent.timestampMs;
|
|
@@ -6715,14 +6663,20 @@ var pickRelevantHttp = (assertion, http, ctx) => {
|
|
|
6715
6663
|
const windowMs = isTransportError(assertion.message) ? HEADLAMP_HTTP_STRICT_WINDOW_MS() : HEADLAMP_HTTP_WINDOW_MS();
|
|
6716
6664
|
let pool = strictPool;
|
|
6717
6665
|
if (!pool.length) {
|
|
6718
|
-
pool = http.filter(
|
|
6719
|
-
|
|
6720
|
-
|
|
6666
|
+
pool = http.filter((event) => {
|
|
6667
|
+
const samePath = event.testPath === ctx.testPath;
|
|
6668
|
+
const tsA = assertion.timestampMs;
|
|
6669
|
+
const tsH = event.timestampMs;
|
|
6670
|
+
const inWindow = typeof tsA === "number" && typeof tsH === "number" && Math.abs(tsH - tsA) <= windowMs;
|
|
6671
|
+
return samePath && inWindow;
|
|
6672
|
+
});
|
|
6721
6673
|
}
|
|
6722
6674
|
if (!pool.length) {
|
|
6723
|
-
pool = http.filter(
|
|
6724
|
-
|
|
6725
|
-
|
|
6675
|
+
pool = http.filter((event) => {
|
|
6676
|
+
const tsA = assertion.timestampMs;
|
|
6677
|
+
const tsH = event.timestampMs;
|
|
6678
|
+
return typeof tsA === "number" && typeof tsH === "number" && Math.abs(tsH - tsA) <= windowMs;
|
|
6679
|
+
});
|
|
6726
6680
|
}
|
|
6727
6681
|
if (!pool.length) {
|
|
6728
6682
|
return void 0;
|
|
@@ -6732,9 +6686,11 @@ var pickRelevantHttp = (assertion, http, ctx) => {
|
|
|
6732
6686
|
const threshold = isTransportError(assertion.message) ? Math.max(HEADLAMP_HTTP_MIN_SCORE(), 1400) : HEADLAMP_HTTP_MIN_SCORE();
|
|
6733
6687
|
return best && best.s >= threshold ? best.h : void 0;
|
|
6734
6688
|
};
|
|
6735
|
-
|
|
6689
|
+
|
|
6690
|
+
// src/lib/formatter/bridge/utils.ts
|
|
6691
|
+
var import_json52 = __toESM(require_lib(), 1);
|
|
6736
6692
|
var coerceJestJsonToBridge = (raw) => {
|
|
6737
|
-
if (
|
|
6693
|
+
if (raw && typeof raw === "object" && "aggregated" in raw) {
|
|
6738
6694
|
return raw;
|
|
6739
6695
|
}
|
|
6740
6696
|
const j = raw;
|
|
@@ -6761,19 +6717,85 @@ var coerceJestJsonToBridge = (raw) => {
|
|
|
6761
6717
|
}))
|
|
6762
6718
|
})),
|
|
6763
6719
|
aggregated: {
|
|
6764
|
-
numTotalTestSuites:
|
|
6765
|
-
numPassedTestSuites:
|
|
6766
|
-
numFailedTestSuites:
|
|
6767
|
-
numTotalTests:
|
|
6768
|
-
numPassedTests:
|
|
6769
|
-
numFailedTests:
|
|
6770
|
-
numPendingTests:
|
|
6771
|
-
numTodoTests:
|
|
6772
|
-
startTime:
|
|
6773
|
-
success:
|
|
6720
|
+
numTotalTestSuites: raw.numTotalTestSuites,
|
|
6721
|
+
numPassedTestSuites: raw.numPassedTestSuites,
|
|
6722
|
+
numFailedTestSuites: raw.numFailedTestSuites,
|
|
6723
|
+
numTotalTests: raw.numTotalTests,
|
|
6724
|
+
numPassedTests: raw.numPassedTests,
|
|
6725
|
+
numFailedTests: raw.numFailedTests,
|
|
6726
|
+
numPendingTests: raw.numPendingTests,
|
|
6727
|
+
numTodoTests: raw.numTodoTests,
|
|
6728
|
+
startTime: raw.startTime,
|
|
6729
|
+
success: raw.success,
|
|
6730
|
+
runTimeMs: raw.aggregated?.runTimeMs
|
|
6774
6731
|
}
|
|
6775
6732
|
};
|
|
6776
6733
|
};
|
|
6734
|
+
var colorTokens2 = {
|
|
6735
|
+
pass: Colors.Success,
|
|
6736
|
+
fail: Colors.Failure,
|
|
6737
|
+
skip: Colors.Skip,
|
|
6738
|
+
todo: Colors.Todo,
|
|
6739
|
+
passPill: (text) => BackgroundColors.Success(ansi.white(` ${text} `)),
|
|
6740
|
+
failPill: (text) => BackgroundColors.Failure(ansi.white(` ${text} `))
|
|
6741
|
+
};
|
|
6742
|
+
var by = (keySelector) => (left, right) => keySelector(left) - keySelector(right);
|
|
6743
|
+
var isObject = (candidateValue) => !!candidateValue && typeof candidateValue === "object";
|
|
6744
|
+
var asHttpList = (candidateValue) => Array.isArray(candidateValue) ? candidateValue : [];
|
|
6745
|
+
var summarizeUrl = (method, url, route) => {
|
|
6746
|
+
const base = route || url || "";
|
|
6747
|
+
const qs = url && url.includes("?") ? ` ? ${url.split("?")[1]}` : "";
|
|
6748
|
+
return [method || "", base, qs].filter(Boolean).join(" ").trim();
|
|
6749
|
+
};
|
|
6750
|
+
var stripBridgeEventsFromConsole = (maybeConsole) => {
|
|
6751
|
+
if (!Array.isArray(maybeConsole)) {
|
|
6752
|
+
return maybeConsole;
|
|
6753
|
+
}
|
|
6754
|
+
return maybeConsole.filter((entry) => {
|
|
6755
|
+
try {
|
|
6756
|
+
const raw = Array.isArray(entry.message) ? entry.message.map(String).join(" ") : String(entry.message ?? "");
|
|
6757
|
+
return !raw.includes("[JEST-BRIDGE-EVENT]");
|
|
6758
|
+
} catch {
|
|
6759
|
+
return true;
|
|
6760
|
+
}
|
|
6761
|
+
});
|
|
6762
|
+
};
|
|
6763
|
+
var eventsNear = (http, ts, testPath, windowMs = HEADLAMP_HTTP_WINDOW_MS()) => {
|
|
6764
|
+
if (typeof ts !== "number" || !Number.isFinite(ts)) {
|
|
6765
|
+
return [];
|
|
6766
|
+
}
|
|
6767
|
+
return http.filter((event) => {
|
|
6768
|
+
const timeOk = typeof event.timestampMs === "number" && Math.abs(event.timestampMs - ts) <= windowMs;
|
|
6769
|
+
const pathOk = !testPath || event.testPath === testPath;
|
|
6770
|
+
return timeOk && pathOk;
|
|
6771
|
+
});
|
|
6772
|
+
};
|
|
6773
|
+
var isHttpStatusNumber = (statusNumber) => typeof statusNumber === "number" && statusNumber >= 100 && statusNumber <= 599;
|
|
6774
|
+
var inferHttpNumbersFromText = (lines) => {
|
|
6775
|
+
const text = lines.join("\n");
|
|
6776
|
+
const match = text.match(/Expected:\s*(\d{3})[\s\S]*?Received:\s*(\d{3})/i);
|
|
6777
|
+
if (match) {
|
|
6778
|
+
return { expectedNumber: Number(match[1]), receivedNumber: Number(match[2]) };
|
|
6779
|
+
}
|
|
6780
|
+
return {};
|
|
6781
|
+
};
|
|
6782
|
+
var titleSuggestsHttp = (title) => {
|
|
6783
|
+
const { method, path: parsedPath } = parseMethodPathFromTitle(title);
|
|
6784
|
+
return Boolean(method || parsedPath && parsedPath.startsWith("/"));
|
|
6785
|
+
};
|
|
6786
|
+
var hasStatusSemantics = (assertionLike) => {
|
|
6787
|
+
if (!assertionLike) {
|
|
6788
|
+
return false;
|
|
6789
|
+
}
|
|
6790
|
+
if (isHttpStatusNumber(assertionLike.expectedNumber) || isHttpStatusNumber(assertionLike.receivedNumber)) {
|
|
6791
|
+
return true;
|
|
6792
|
+
}
|
|
6793
|
+
const combinedRaw = `${assertionLike.matcher ?? ""} ${assertionLike.message ?? ""}`;
|
|
6794
|
+
const combinedMessage = combinedRaw.toLowerCase();
|
|
6795
|
+
return /\bstatus(code)?\b|\btohaves(tatus|tatuscode)\b/.test(combinedMessage);
|
|
6796
|
+
};
|
|
6797
|
+
var fileSuggestsHttp = (relPath2) => /(?:^|\/)(routes?|api|controllers?|e2e|integration)(?:\/|\.test\.)/i.test(relPath2);
|
|
6798
|
+
var isHttpRelevant = (ctx) => ctx.hasTransportSignal || ctx.httpCountInSameTest > 0 || titleSuggestsHttp(ctx.title) || hasStatusSemantics(ctx.assertion) || fileSuggestsHttp(ctx.relPath);
|
|
6777
6799
|
var vitestFooter = (agg, durationMs) => {
|
|
6778
6800
|
const files = [
|
|
6779
6801
|
agg.numFailedTestSuites ? colorTokens2.fail(`${agg.numFailedTestSuites} failed`) : "",
|
|
@@ -7250,13 +7272,21 @@ var renderVitestFromJestJSON = (data, ctx, opts) => {
|
|
|
7250
7272
|
out.push(vitestFooter(data.aggregated));
|
|
7251
7273
|
return out.join("\n");
|
|
7252
7274
|
};
|
|
7275
|
+
|
|
7276
|
+
// src/lib/formatter/bridge/tryBridgeFallback.ts
|
|
7253
7277
|
var tryBridgeFallback = (raw, ctx, opts) => {
|
|
7254
|
-
|
|
7278
|
+
let bridgeJsonPath = extractBridgePath2(raw, ctx.cwd);
|
|
7279
|
+
if (!bridgeJsonPath) {
|
|
7280
|
+
const def = path11.resolve(ctx.cwd, "coverage/jest-run.json").replace(/\\/g, "/");
|
|
7281
|
+
if (fs6.existsSync(def)) {
|
|
7282
|
+
bridgeJsonPath = def;
|
|
7283
|
+
}
|
|
7284
|
+
}
|
|
7255
7285
|
if (!bridgeJsonPath || !fs6.existsSync(bridgeJsonPath)) {
|
|
7256
7286
|
return null;
|
|
7257
7287
|
}
|
|
7258
7288
|
try {
|
|
7259
|
-
const json =
|
|
7289
|
+
const json = import_json53.default.parse(fs6.readFileSync(bridgeJsonPath, "utf8"));
|
|
7260
7290
|
const bridge = coerceJestJsonToBridge(json);
|
|
7261
7291
|
return renderVitestFromJestJSON(bridge, ctx, opts);
|
|
7262
7292
|
} catch {
|
|
@@ -7274,23 +7304,39 @@ var formatJestOutputVitest = (raw, opts) => pipe(
|
|
|
7274
7304
|
(state) => ({ ...state, chunks: parseChunks(state.raw) }),
|
|
7275
7305
|
(state) => ({
|
|
7276
7306
|
...state,
|
|
7277
|
-
|
|
7307
|
+
native: renderChunks(state.chunks, state.ctx, mkPrettyFns(), {
|
|
7278
7308
|
onlyFailures: Boolean(state.opts?.onlyFailures)
|
|
7279
|
-
})
|
|
7309
|
+
}).text
|
|
7280
7310
|
}),
|
|
7281
|
-
(state) => {
|
|
7282
|
-
|
|
7283
|
-
|
|
7284
|
-
}
|
|
7285
|
-
const fallback = tryBridgeFallback(state.raw, state.ctx, {
|
|
7311
|
+
(state) => ({
|
|
7312
|
+
...state,
|
|
7313
|
+
bridge: tryBridgeFallback(state.raw, state.ctx, {
|
|
7286
7314
|
onlyFailures: Boolean(state.opts?.onlyFailures)
|
|
7287
|
-
})
|
|
7288
|
-
|
|
7289
|
-
|
|
7315
|
+
}) || null
|
|
7316
|
+
}),
|
|
7317
|
+
(state) => {
|
|
7318
|
+
const out = [];
|
|
7319
|
+
const seen = /* @__PURE__ */ new Set();
|
|
7320
|
+
const pushUnique = (text) => {
|
|
7321
|
+
if (!text) {
|
|
7322
|
+
return;
|
|
7323
|
+
}
|
|
7324
|
+
for (const line of text.split(/\r?\n/)) {
|
|
7325
|
+
const key = stripAnsiSimple(line);
|
|
7326
|
+
if (!seen.has(key)) {
|
|
7327
|
+
out.push(line);
|
|
7328
|
+
seen.add(key);
|
|
7329
|
+
}
|
|
7330
|
+
}
|
|
7331
|
+
};
|
|
7332
|
+
pushUnique(state.native);
|
|
7333
|
+
if (state.bridge) {
|
|
7334
|
+
if (out.length) {
|
|
7335
|
+
out.push("");
|
|
7336
|
+
}
|
|
7337
|
+
pushUnique(state.bridge);
|
|
7290
7338
|
}
|
|
7291
|
-
|
|
7292
|
-
return prefix ? `${prefix}
|
|
7293
|
-
${fallback}` : fallback;
|
|
7339
|
+
return out.join("\n");
|
|
7294
7340
|
}
|
|
7295
7341
|
);
|
|
7296
7342
|
|
|
@@ -7407,7 +7453,7 @@ module.exports = BridgeReporter;`;
|
|
|
7407
7453
|
init_env_utils();
|
|
7408
7454
|
init_exec();
|
|
7409
7455
|
init_args();
|
|
7410
|
-
import * as
|
|
7456
|
+
import * as path12 from "node:path";
|
|
7411
7457
|
import * as os3 from "node:os";
|
|
7412
7458
|
import * as fsSync3 from "node:fs";
|
|
7413
7459
|
import * as fs7 from "node:fs/promises";
|
|
@@ -7687,7 +7733,7 @@ var mergeLcov = async () => {
|
|
|
7687
7733
|
try {
|
|
7688
7734
|
const entries = fsSync3.readdirSync(dir, { withFileTypes: true });
|
|
7689
7735
|
for (const entry of entries) {
|
|
7690
|
-
const full =
|
|
7736
|
+
const full = path12.join(dir, entry.name);
|
|
7691
7737
|
if (entry.isDirectory()) {
|
|
7692
7738
|
out.push(...collectLcovs(full));
|
|
7693
7739
|
} else if (entry.isFile() && entry.name === "lcov.info") {
|
|
@@ -7699,8 +7745,8 @@ var mergeLcov = async () => {
|
|
|
7699
7745
|
return out;
|
|
7700
7746
|
};
|
|
7701
7747
|
try {
|
|
7702
|
-
const jestRoot =
|
|
7703
|
-
const candidates = [
|
|
7748
|
+
const jestRoot = path12.join("coverage", "jest");
|
|
7749
|
+
const candidates = [path12.join(jestRoot, "lcov.info"), ...collectLcovs(jestRoot)].map((candidatePath) => path12.resolve(candidatePath)).filter((absolutePath, index, arr) => arr.indexOf(absolutePath) === index);
|
|
7704
7750
|
for (const filePath of candidates) {
|
|
7705
7751
|
try {
|
|
7706
7752
|
const content = await readOrEmpty(filePath);
|
|
@@ -7740,7 +7786,7 @@ var emitMergedCoverage = async (ui, opts) => {
|
|
|
7740
7786
|
try {
|
|
7741
7787
|
const entries = fsSync3.readdirSync(dir, { withFileTypes: true });
|
|
7742
7788
|
for (const entry of entries) {
|
|
7743
|
-
const full =
|
|
7789
|
+
const full = path12.join(dir, entry.name);
|
|
7744
7790
|
if (entry.isDirectory()) {
|
|
7745
7791
|
out.push(...listJsons(full));
|
|
7746
7792
|
} else if (entry.isFile() && entry.name === "coverage-final.json") {
|
|
@@ -7751,11 +7797,11 @@ var emitMergedCoverage = async (ui, opts) => {
|
|
|
7751
7797
|
}
|
|
7752
7798
|
return out;
|
|
7753
7799
|
};
|
|
7754
|
-
const coverageRoot =
|
|
7800
|
+
const coverageRoot = path12.join("coverage", "jest");
|
|
7755
7801
|
const jsonCandidates = [
|
|
7756
|
-
|
|
7802
|
+
path12.join(coverageRoot, "coverage-final.json"),
|
|
7757
7803
|
...listJsons(coverageRoot)
|
|
7758
|
-
].map((candidatePath) =>
|
|
7804
|
+
].map((candidatePath) => path12.resolve(candidatePath)).filter((absolutePath, index, arr) => {
|
|
7759
7805
|
const isFirst = arr.indexOf(absolutePath) === index;
|
|
7760
7806
|
const exists = fsSync3.existsSync(absolutePath);
|
|
7761
7807
|
return isFirst && exists;
|
|
@@ -7817,7 +7863,7 @@ var emitMergedCoverage = async (ui, opts) => {
|
|
|
7817
7863
|
executedTests: opts.executedTests ?? []
|
|
7818
7864
|
});
|
|
7819
7865
|
const context = LibReport.createContext({
|
|
7820
|
-
dir:
|
|
7866
|
+
dir: path12.resolve("coverage", "merged"),
|
|
7821
7867
|
coverageMap: filteredMap,
|
|
7822
7868
|
defaultSummarizer: "nested"
|
|
7823
7869
|
});
|
|
@@ -7885,8 +7931,8 @@ var emitMergedCoverage = async (ui, opts) => {
|
|
|
7885
7931
|
for (const reporter of reporters) {
|
|
7886
7932
|
reporter.execute(context);
|
|
7887
7933
|
}
|
|
7888
|
-
const textPath =
|
|
7889
|
-
const summaryPath =
|
|
7934
|
+
const textPath = path12.resolve("coverage", "merged", "coverage.txt");
|
|
7935
|
+
const summaryPath = path12.resolve("coverage", "merged", "coverage-summary.txt");
|
|
7890
7936
|
const filesToPrint = [];
|
|
7891
7937
|
if (fsSync3.existsSync(textPath)) {
|
|
7892
7938
|
filesToPrint.push(textPath);
|
|
@@ -8029,13 +8075,13 @@ var program = async () => {
|
|
|
8029
8075
|
const rels2 = Array.from(
|
|
8030
8076
|
/* @__PURE__ */ new Set([...branchDiff, ...stagedNow, ...unstagedNow, ...untrackedNow])
|
|
8031
8077
|
);
|
|
8032
|
-
return rels2.map((rel) =>
|
|
8078
|
+
return rels2.map((rel) => path12.resolve(cwd, rel).replace(/\\/g, "/")).filter((abs) => !abs.includes("/node_modules/") && !abs.includes("/coverage/"));
|
|
8033
8079
|
}
|
|
8034
8080
|
const staged = mode === "staged" || mode === "all" ? await collect("git", ["diff", "--name-only", "--diff-filter=ACMRTUXB", "--cached"]) : [];
|
|
8035
8081
|
const unstagedTracked = mode === "unstaged" || mode === "all" ? await collect("git", ["diff", "--name-only", "--diff-filter=ACMRTUXB"]) : [];
|
|
8036
8082
|
const untracked = mode === "unstaged" || mode === "all" ? await collect("git", ["ls-files", "--others", "--exclude-standard"]) : [];
|
|
8037
8083
|
const rels = Array.from(/* @__PURE__ */ new Set([...staged, ...unstagedTracked, ...untracked]));
|
|
8038
|
-
return rels.map((rel) =>
|
|
8084
|
+
return rels.map((rel) => path12.resolve(cwd, rel).replace(/\\/g, "/")).filter((abs) => !abs.includes("/node_modules/") && !abs.includes("/coverage/"));
|
|
8039
8085
|
};
|
|
8040
8086
|
const repoRootForChanged = workspaceRoot ?? await findRepoRoot();
|
|
8041
8087
|
const changedSelectionAbs = changed ? await getChangedFiles(changed, repoRootForChanged) : [];
|
|
@@ -8060,18 +8106,18 @@ var program = async () => {
|
|
|
8060
8106
|
if (!token) {
|
|
8061
8107
|
continue;
|
|
8062
8108
|
}
|
|
8063
|
-
const isAbs =
|
|
8109
|
+
const isAbs = path12.isAbsolute(token);
|
|
8064
8110
|
const looksLikeRelPath = /[\\/]/.test(token);
|
|
8065
8111
|
let candidateFromRoot;
|
|
8066
8112
|
if (token.startsWith("/")) {
|
|
8067
|
-
candidateFromRoot =
|
|
8113
|
+
candidateFromRoot = path12.join(repoRoot, token.slice(1));
|
|
8068
8114
|
} else if (looksLikeRelPath) {
|
|
8069
|
-
candidateFromRoot =
|
|
8115
|
+
candidateFromRoot = path12.join(repoRoot, token);
|
|
8070
8116
|
} else {
|
|
8071
8117
|
candidateFromRoot = void 0;
|
|
8072
8118
|
}
|
|
8073
8119
|
const tryPushIfProd = (absPath) => {
|
|
8074
|
-
const norm =
|
|
8120
|
+
const norm = path12.resolve(absPath).replace(/\\/g, "/");
|
|
8075
8121
|
const isTest = /(^|\/)tests?\//i.test(norm) || /\.(test|spec)\.[tj]sx?$/i.test(norm);
|
|
8076
8122
|
if (!isTest && fsSync3.existsSync(norm)) {
|
|
8077
8123
|
results.add(norm);
|
|
@@ -8093,7 +8139,7 @@ var program = async () => {
|
|
|
8093
8139
|
}),
|
|
8094
8140
|
timeoutMs: 4e3
|
|
8095
8141
|
});
|
|
8096
|
-
const matches = out.split(/\r?\n/).map((line) => line.trim()).filter(Boolean).map((rel) =>
|
|
8142
|
+
const matches = out.split(/\r?\n/).map((line) => line.trim()).filter(Boolean).map((rel) => path12.resolve(repoRoot, rel).replace(/\\/g, "/")).filter(
|
|
8097
8143
|
(abs) => !abs.includes("/node_modules/") && !abs.includes("/coverage/") && !/(^|\/)tests?\//i.test(abs) && !/\.(test|spec)\.[tj]sx?$/i.test(abs)
|
|
8098
8144
|
);
|
|
8099
8145
|
matches.forEach((abs) => results.add(abs));
|
|
@@ -8114,8 +8160,8 @@ var program = async () => {
|
|
|
8114
8160
|
const jestDiscoveryArgs = selectionIncludesProdPaths ? stripPathTokens(jest) : jest;
|
|
8115
8161
|
const projectConfigs = [];
|
|
8116
8162
|
try {
|
|
8117
|
-
const baseCfg =
|
|
8118
|
-
const tsCfg =
|
|
8163
|
+
const baseCfg = path12.resolve("jest.config.js");
|
|
8164
|
+
const tsCfg = path12.resolve("jest.ts.config.js");
|
|
8119
8165
|
if (fsSync3.existsSync(baseCfg)) {
|
|
8120
8166
|
projectConfigs.push(baseCfg);
|
|
8121
8167
|
}
|
|
@@ -8132,7 +8178,7 @@ var program = async () => {
|
|
|
8132
8178
|
);
|
|
8133
8179
|
const prodSelections2 = expandedProdSelections;
|
|
8134
8180
|
for (const cfg of projectConfigs) {
|
|
8135
|
-
const cfgCwd =
|
|
8181
|
+
const cfgCwd = path12.dirname(cfg);
|
|
8136
8182
|
const allTests = await discoverJestResilient([...jestDiscoveryArgs, "--config", cfg], {
|
|
8137
8183
|
cwd: cfgCwd
|
|
8138
8184
|
});
|
|
@@ -8145,7 +8191,7 @@ var program = async () => {
|
|
|
8145
8191
|
});
|
|
8146
8192
|
} catch (err) {
|
|
8147
8193
|
if (isDebug()) {
|
|
8148
|
-
console.warn(`direct selection failed for project ${
|
|
8194
|
+
console.warn(`direct selection failed for project ${path12.basename(cfg)}: ${String(err)}`);
|
|
8149
8195
|
}
|
|
8150
8196
|
}
|
|
8151
8197
|
perProjectFiles.set(cfg, directPerProject);
|
|
@@ -8157,7 +8203,7 @@ var program = async () => {
|
|
|
8157
8203
|
)} | related=${selectionIncludesProdPaths} | cwd=${repoRootForDiscovery}`
|
|
8158
8204
|
);
|
|
8159
8205
|
for (const cfg of projectConfigs) {
|
|
8160
|
-
const cfgCwd =
|
|
8206
|
+
const cfgCwd = path12.dirname(cfg);
|
|
8161
8207
|
const files = await discoverJestResilient([...jestDiscoveryArgs, "--config", cfg], {
|
|
8162
8208
|
cwd: cfgCwd
|
|
8163
8209
|
});
|
|
@@ -8172,13 +8218,13 @@ var program = async () => {
|
|
|
8172
8218
|
);
|
|
8173
8219
|
const candidates = selectionHasPaths && selectionLooksLikeTest ? selectionTestPaths : files;
|
|
8174
8220
|
const absFiles = candidates.map(
|
|
8175
|
-
(candidatePath) =>
|
|
8221
|
+
(candidatePath) => path12.isAbsolute(candidatePath) ? candidatePath : path12.join(repoRootForDiscovery, candidatePath)
|
|
8176
8222
|
).map((absolutePath) => absolutePath.replace(/\\/g, "/"));
|
|
8177
8223
|
const onlyOwned = await filterCandidatesForProject(
|
|
8178
8224
|
cfg,
|
|
8179
8225
|
jestDiscoveryArgs,
|
|
8180
8226
|
absFiles,
|
|
8181
|
-
|
|
8227
|
+
path12.dirname(cfg)
|
|
8182
8228
|
);
|
|
8183
8229
|
perProjectFiltered.set(cfg, onlyOwned);
|
|
8184
8230
|
}
|
|
@@ -8190,7 +8236,7 @@ var program = async () => {
|
|
|
8190
8236
|
if (selectionHasPaths && prodSelections.length > 0) {
|
|
8191
8237
|
console.info(`rg related \u2192 prodSelections=${prodSelections.length} (starting)`);
|
|
8192
8238
|
const repoRootForRefinement = workspaceRoot ?? await findRepoRoot();
|
|
8193
|
-
const selectionKey = prodSelections.map((absPath) =>
|
|
8239
|
+
const selectionKey = prodSelections.map((absPath) => path12.relative(repoRootForRefinement, absPath).replace(/\\/g, "/")).sort((firstPath, secondPath) => firstPath.localeCompare(secondPath)).join("|");
|
|
8194
8240
|
const { cachedRelated: cachedRelated2, findRelatedTestsFast: findRelatedTestsFast2, DEFAULT_TEST_GLOBS: DEFAULT_TEST_GLOBS2 } = await Promise.resolve().then(() => (init_fast_related(), fast_related_exports));
|
|
8195
8241
|
const { DEFAULT_EXCLUDE: DEFAULT_EXCLUDE2 } = await Promise.resolve().then(() => (init_args(), args_exports));
|
|
8196
8242
|
const rgMatches = await cachedRelated2({
|
|
@@ -8220,7 +8266,7 @@ var program = async () => {
|
|
|
8220
8266
|
cfg,
|
|
8221
8267
|
jestDiscoveryArgs,
|
|
8222
8268
|
rgCandidates,
|
|
8223
|
-
|
|
8269
|
+
path12.dirname(cfg)
|
|
8224
8270
|
);
|
|
8225
8271
|
perProjectFromRg.set(cfg, owned);
|
|
8226
8272
|
}
|
|
@@ -8235,9 +8281,9 @@ var program = async () => {
|
|
|
8235
8281
|
} else {
|
|
8236
8282
|
const repoRootForScan = repoRootForDiscovery;
|
|
8237
8283
|
const toSeeds = (abs) => {
|
|
8238
|
-
const rel =
|
|
8284
|
+
const rel = path12.relative(repoRootForScan, abs).replace(/\\/g, "/");
|
|
8239
8285
|
const withoutExt = rel.replace(/\.(m?[tj]sx?)$/i, "");
|
|
8240
|
-
const base =
|
|
8286
|
+
const base = path12.basename(withoutExt);
|
|
8241
8287
|
const segs = withoutExt.split("/");
|
|
8242
8288
|
const tail2 = segs.slice(-2).join("/");
|
|
8243
8289
|
return Array.from(new Set([withoutExt, base, tail2].filter(Boolean)));
|
|
@@ -8252,8 +8298,8 @@ var program = async () => {
|
|
|
8252
8298
|
}
|
|
8253
8299
|
};
|
|
8254
8300
|
const resolveLocalImport = (fromFile, spec) => {
|
|
8255
|
-
const baseDir =
|
|
8256
|
-
const cand =
|
|
8301
|
+
const baseDir = path12.dirname(fromFile);
|
|
8302
|
+
const cand = path12.resolve(baseDir, spec);
|
|
8257
8303
|
const exts = ["", ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
|
|
8258
8304
|
for (const ext of exts) {
|
|
8259
8305
|
const full = ext ? `${cand}${ext}` : cand;
|
|
@@ -8262,7 +8308,7 @@ var program = async () => {
|
|
|
8262
8308
|
}
|
|
8263
8309
|
}
|
|
8264
8310
|
for (const ext of exts) {
|
|
8265
|
-
const full =
|
|
8311
|
+
const full = path12.join(cand, `index${ext}`);
|
|
8266
8312
|
if (fsSync3.existsSync(full)) {
|
|
8267
8313
|
return full;
|
|
8268
8314
|
}
|
|
@@ -8316,7 +8362,7 @@ var program = async () => {
|
|
|
8316
8362
|
cfg,
|
|
8317
8363
|
jestDiscoveryArgs,
|
|
8318
8364
|
keptCandidates,
|
|
8319
|
-
|
|
8365
|
+
path12.dirname(cfg)
|
|
8320
8366
|
);
|
|
8321
8367
|
perProjectFromScan.set(cfg, owned);
|
|
8322
8368
|
}
|
|
@@ -8346,7 +8392,7 @@ var program = async () => {
|
|
|
8346
8392
|
try {
|
|
8347
8393
|
const allAcross = [];
|
|
8348
8394
|
for (const cfg of projectConfigs) {
|
|
8349
|
-
const cfgCwd =
|
|
8395
|
+
const cfgCwd = path12.dirname(cfg);
|
|
8350
8396
|
const listed = await discoverJestResilient([...jestDiscoveryArgs, "--config", cfg], {
|
|
8351
8397
|
cwd: cfgCwd
|
|
8352
8398
|
});
|
|
@@ -8360,9 +8406,9 @@ var program = async () => {
|
|
|
8360
8406
|
}
|
|
8361
8407
|
}
|
|
8362
8408
|
const seeds = prodSelections.map(
|
|
8363
|
-
(abs) =>
|
|
8409
|
+
(abs) => path12.relative(repoRoot, abs).replace(/\\/g, "/").replace(/\.(m?[tj]sx?)$/i, "")
|
|
8364
8410
|
).flatMap((rel) => {
|
|
8365
|
-
const base =
|
|
8411
|
+
const base = path12.basename(rel);
|
|
8366
8412
|
const segments = rel.split("/");
|
|
8367
8413
|
return Array.from(new Set([rel, base, segments.slice(-2).join("/")].filter(Boolean)));
|
|
8368
8414
|
});
|
|
@@ -8375,8 +8421,8 @@ var program = async () => {
|
|
|
8375
8421
|
}
|
|
8376
8422
|
};
|
|
8377
8423
|
const resolveLocalImport = (fromFile, spec) => {
|
|
8378
|
-
const baseDir =
|
|
8379
|
-
const candidate =
|
|
8424
|
+
const baseDir = path12.dirname(fromFile);
|
|
8425
|
+
const candidate = path12.resolve(baseDir, spec);
|
|
8380
8426
|
const extensions = ["", ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts"];
|
|
8381
8427
|
for (const ext of extensions) {
|
|
8382
8428
|
const fullPath = ext ? `${candidate}${ext}` : candidate;
|
|
@@ -8385,7 +8431,7 @@ var program = async () => {
|
|
|
8385
8431
|
}
|
|
8386
8432
|
}
|
|
8387
8433
|
for (const ext of extensions) {
|
|
8388
|
-
const fullPath =
|
|
8434
|
+
const fullPath = path12.join(candidate, `index${ext}`);
|
|
8389
8435
|
if (fsSync3.existsSync(fullPath)) {
|
|
8390
8436
|
return fullPath;
|
|
8391
8437
|
}
|
|
@@ -8542,10 +8588,10 @@ var program = async () => {
|
|
|
8542
8588
|
};
|
|
8543
8589
|
const prodSeedsForRun = (() => {
|
|
8544
8590
|
const changedAbs = (changedSelectionAbs ?? []).map(
|
|
8545
|
-
(absPath) =>
|
|
8591
|
+
(absPath) => path12.resolve(absPath).replace(/\\/g, "/")
|
|
8546
8592
|
);
|
|
8547
8593
|
const selAbs = selectionPathsAugmented.map(
|
|
8548
|
-
(pathToken) =>
|
|
8594
|
+
(pathToken) => path12.resolve(pathToken).replace(/\\/g, "/")
|
|
8549
8595
|
);
|
|
8550
8596
|
return (changedAbs.length ? changedAbs : selAbs).filter(
|
|
8551
8597
|
(abs) => /[\\/]/.test(abs) && !/(^|\/)tests?\//i.test(abs) && !/\.(test|spec)\.[tj]sx?$/i.test(abs)
|
|
@@ -8560,17 +8606,17 @@ var program = async () => {
|
|
|
8560
8606
|
const cfg = projectsToRun[projIndex];
|
|
8561
8607
|
const files = perProjectFiltered.get(cfg) ?? [];
|
|
8562
8608
|
if (files.length === 0) {
|
|
8563
|
-
console.info(`Project ${
|
|
8609
|
+
console.info(`Project ${path12.basename(cfg)}: 0 matching tests after filter; skipping.`);
|
|
8564
8610
|
continue;
|
|
8565
8611
|
}
|
|
8566
8612
|
files.forEach(
|
|
8567
|
-
(absTestPath) => executedTestFilesSet.add(
|
|
8613
|
+
(absTestPath) => executedTestFilesSet.add(path12.resolve(absTestPath).replace(/\\/g, "/"))
|
|
8568
8614
|
);
|
|
8569
|
-
const outJson =
|
|
8615
|
+
const outJson = path12.join(
|
|
8570
8616
|
os3.tmpdir(),
|
|
8571
8617
|
`jest-bridge-${Date.now()}-${Math.random().toString(36).slice(2)}.json`
|
|
8572
8618
|
);
|
|
8573
|
-
const reporterPath =
|
|
8619
|
+
const reporterPath = path12.resolve("scripts/jest-vitest-bridge.cjs");
|
|
8574
8620
|
try {
|
|
8575
8621
|
const needsWrite = (() => {
|
|
8576
8622
|
try {
|
|
@@ -8581,10 +8627,10 @@ var program = async () => {
|
|
|
8581
8627
|
}
|
|
8582
8628
|
})();
|
|
8583
8629
|
if (needsWrite) {
|
|
8584
|
-
fsSync3.mkdirSync(
|
|
8630
|
+
fsSync3.mkdirSync(path12.dirname(reporterPath), { recursive: true });
|
|
8585
8631
|
fsSync3.writeFileSync(reporterPath, JEST_BRIDGE_REPORTER_SOURCE, "utf8");
|
|
8586
8632
|
}
|
|
8587
|
-
const envPath =
|
|
8633
|
+
const envPath = path12.resolve("scripts/jest-bridge-env.cjs");
|
|
8588
8634
|
try {
|
|
8589
8635
|
const existingEnv = fsSync3.readFileSync(envPath, "utf8");
|
|
8590
8636
|
if (existingEnv !== JEST_BRIDGE_ENV_SOURCE) {
|
|
@@ -8592,7 +8638,7 @@ var program = async () => {
|
|
|
8592
8638
|
}
|
|
8593
8639
|
} catch {
|
|
8594
8640
|
try {
|
|
8595
|
-
fsSync3.mkdirSync(
|
|
8641
|
+
fsSync3.mkdirSync(path12.dirname(envPath), { recursive: true });
|
|
8596
8642
|
} catch {
|
|
8597
8643
|
}
|
|
8598
8644
|
fsSync3.writeFileSync(envPath, JEST_BRIDGE_ENV_SOURCE, "utf8");
|
|
@@ -8600,7 +8646,7 @@ var program = async () => {
|
|
|
8600
8646
|
} catch (ensureReporterError) {
|
|
8601
8647
|
console.warn(`Unable to ensure jest bridge reporter: ${String(ensureReporterError)}`);
|
|
8602
8648
|
}
|
|
8603
|
-
const selectedFilesForCoverage = selectionPathsAugmented.filter((pathToken) => /[\\/]/.test(pathToken)).filter((pathToken) => !looksLikeTestPath(pathToken)).map((pathToken) =>
|
|
8649
|
+
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}`);
|
|
8604
8650
|
const coverageFromArgs = [];
|
|
8605
8651
|
for (const relPath2 of selectedFilesForCoverage) {
|
|
8606
8652
|
coverageFromArgs.push("--collectCoverageFrom", relPath2);
|
|
@@ -8618,11 +8664,11 @@ var program = async () => {
|
|
|
8618
8664
|
`--reporters=${reporterPath}`,
|
|
8619
8665
|
"--colors",
|
|
8620
8666
|
"--env",
|
|
8621
|
-
|
|
8667
|
+
path12.resolve("scripts/jest-bridge-env.cjs"),
|
|
8622
8668
|
...sanitizedJestRunArgs,
|
|
8623
8669
|
...collectCoverage ? [
|
|
8624
8670
|
"--coverageDirectory",
|
|
8625
|
-
|
|
8671
|
+
path12.join("coverage", "jest", path12.basename(cfg).replace(/[^a-zA-Z0-9_.-]+/g, "_"))
|
|
8626
8672
|
] : [],
|
|
8627
8673
|
...coverageFromArgs,
|
|
8628
8674
|
"--passWithNoTests",
|
|
@@ -8748,10 +8794,10 @@ ${stripFooter(rawAlso)}`.trimEnd();
|
|
|
8748
8794
|
try {
|
|
8749
8795
|
const prodSeeds = (() => {
|
|
8750
8796
|
const changedAbs = (changedSelectionAbs ?? []).map(
|
|
8751
|
-
(absPath) =>
|
|
8797
|
+
(absPath) => path12.resolve(absPath).replace(/\\/g, "/")
|
|
8752
8798
|
);
|
|
8753
8799
|
const selAbs = selectionPathsAugmented.map(
|
|
8754
|
-
(pathToken) =>
|
|
8800
|
+
(pathToken) => path12.resolve(pathToken).replace(/\\/g, "/")
|
|
8755
8801
|
);
|
|
8756
8802
|
return (changedAbs.length ? changedAbs : selAbs).filter(
|
|
8757
8803
|
(abs) => /[\\/]/.test(abs) && !/(^|\/)tests?\//i.test(abs) && !/\.(test|spec)\.[tj]sx?$/i.test(abs)
|
|
@@ -8844,6 +8890,7 @@ export {
|
|
|
8844
8890
|
drawFailLine,
|
|
8845
8891
|
drawRule,
|
|
8846
8892
|
emitMergedCoverage,
|
|
8893
|
+
extractBridgePath,
|
|
8847
8894
|
filterCandidatesForProject,
|
|
8848
8895
|
filterCoverageMap,
|
|
8849
8896
|
findCodeFrameStart,
|
|
@@ -8882,7 +8929,6 @@ export {
|
|
|
8882
8929
|
routeSimilarityScore,
|
|
8883
8930
|
rule,
|
|
8884
8931
|
runJestBootstrap,
|
|
8885
|
-
scoreHttpForAssertion,
|
|
8886
8932
|
stripAnsiSimple,
|
|
8887
8933
|
supportsUnicode,
|
|
8888
8934
|
tintPct,
|