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 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((resolve10, reject) => {
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
- resolve10();
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((resolve10, reject) => {
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 ? resolve10(stdout) : reject(new Error(stderr || `exit ${code}`))
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((resolve10, reject) => {
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) => resolve10(Number(code)));
207
+ child.on("close", (code) => resolve11(Number(code)));
208
208
  });
209
- runWithCapture = async (cmd, args, opts) => new Promise((resolve10, reject) => {
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) => resolve10({ code: Number(code), output: buf }));
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 JSON53 = {
1983
+ var JSON54 = {
1984
1984
  parse,
1985
1985
  stringify
1986
1986
  };
1987
- module2.exports = JSON53;
1987
+ module2.exports = JSON54;
1988
1988
  }
1989
1989
  });
1990
1990
 
1991
1991
  // src/lib/program.ts
1992
- var path11 = __toESM(require("node:path"), 1);
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 (!candidate.trim()) {
4918
+ if (isStackLine(candidate)) {
4918
4919
  break;
4919
4920
  }
4920
- if (isStackLine(candidate)) {
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
- if (messages.length === 0 && stacks.length === 0) {
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((line) => !/^\s*(?:Error|AssertionError):?\s*$/.test(line));
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):?/.test(line)
5108
+ (line) => /(TypeError|ReferenceError|SyntaxError|RangeError|AssertionError|Error):?/i.test(line)
5101
5109
  );
5102
5110
  const collected = [];
5103
5111
  if (errorIdx >= 0) {
5104
- for (let i = errorIdx; i < normalized.length && collected.length < 8; i += 1) {
5105
- const ln = normalized[i];
5106
- if (!ln.trim()) {
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 (isStackLine(ln)) {
5118
+ if (!raw.trim()) {
5119
+ if (!started) {
5120
+ continue;
5121
+ }
5110
5122
  break;
5111
5123
  }
5112
- collected.push(ln);
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(/^["'`]|["'`]$/g, "");
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
- (e) => e.testPath === ctx.testPath && typeof assertion.timestampMs === "number" && typeof e.timestampMs === "number" && Math.abs(e.timestampMs - assertion.timestampMs) <= windowMs
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
- (e) => typeof assertion.timestampMs === "number" && typeof e.timestampMs === "number" && Math.abs(e.timestampMs - assertion.timestampMs) <= windowMs
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
- var isBridgeJSONLike = (candidateValue) => !!candidateValue && typeof candidateValue === "object" && "aggregated" in candidateValue;
5475
+
5476
+ // src/lib/formatter/bridge/utils.ts
5477
+ var import_json52 = __toESM(require_lib(), 1);
5522
5478
  var coerceJestJsonToBridge = (raw) => {
5523
- if (isBridgeJSONLike(raw)) {
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: j.numTotalTestSuites,
5551
- numPassedTestSuites: j.numPassedTestSuites,
5552
- numFailedTestSuites: j.numFailedTestSuites,
5553
- numTotalTests: j.numTotalTests,
5554
- numPassedTests: j.numPassedTests,
5555
- numFailedTests: j.numFailedTests,
5556
- numPendingTests: j.numPendingTests,
5557
- numTodoTests: j.numTodoTests,
5558
- startTime: j.startTime,
5559
- success: j.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
- const bridgeJsonPath = extractBridgePath2(raw, ctx.cwd);
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 = import_json52.default.parse(fs6.readFileSync(bridgeJsonPath, "utf8"));
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
- rendered: renderChunks(state.chunks, state.ctx, mkPrettyFns(), {
6093
+ native: renderChunks(state.chunks, state.ctx, mkPrettyFns(), {
6064
6094
  onlyFailures: Boolean(state.opts?.onlyFailures)
6065
- })
6095
+ }).text
6066
6096
  }),
6067
- (state) => {
6068
- if (state.rendered.hadParsed) {
6069
- return state.rendered.text;
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
- if (!fallback) {
6075
- return state.rendered.text;
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
- const prefix = state.rendered.text;
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 = path11.join(dir, entry.name);
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 = path11.join("coverage", "jest");
6139
- const candidates = [path11.join(jestRoot, "lcov.info"), ...collectLcovs(jestRoot)].map((candidatePath) => path11.resolve(candidatePath)).filter((absolutePath, index, arr) => arr.indexOf(absolutePath) === index);
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 = path11.join(dir, entry.name);
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 = path11.join("coverage", "jest");
6236
+ const coverageRoot = path12.join("coverage", "jest");
6191
6237
  const jsonCandidates = [
6192
- path11.join(coverageRoot, "coverage-final.json"),
6238
+ path12.join(coverageRoot, "coverage-final.json"),
6193
6239
  ...listJsons(coverageRoot)
6194
- ].map((candidatePath) => path11.resolve(candidatePath)).filter((absolutePath, index, arr) => {
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: path11.resolve("coverage", "merged"),
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 = path11.resolve("coverage", "merged", "coverage.txt");
6325
- const summaryPath = path11.resolve("coverage", "merged", "coverage-summary.txt");
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) => path11.resolve(cwd, rel).replace(/\\/g, "/")).filter((abs) => !abs.includes("/node_modules/") && !abs.includes("/coverage/"));
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) => path11.resolve(cwd, rel).replace(/\\/g, "/")).filter((abs) => !abs.includes("/node_modules/") && !abs.includes("/coverage/"));
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 = path11.isAbsolute(token);
6545
+ const isAbs = path12.isAbsolute(token);
6500
6546
  const looksLikeRelPath = /[\\/]/.test(token);
6501
6547
  let candidateFromRoot;
6502
6548
  if (token.startsWith("/")) {
6503
- candidateFromRoot = path11.join(repoRoot, token.slice(1));
6549
+ candidateFromRoot = path12.join(repoRoot, token.slice(1));
6504
6550
  } else if (looksLikeRelPath) {
6505
- candidateFromRoot = path11.join(repoRoot, token);
6551
+ candidateFromRoot = path12.join(repoRoot, token);
6506
6552
  } else {
6507
6553
  candidateFromRoot = void 0;
6508
6554
  }
6509
6555
  const tryPushIfProd = (absPath) => {
6510
- const norm = path11.resolve(absPath).replace(/\\/g, "/");
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) => path11.resolve(repoRoot, rel).replace(/\\/g, "/")).filter(
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 = path11.resolve("jest.config.js");
6554
- const tsCfg = path11.resolve("jest.ts.config.js");
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 = path11.dirname(cfg);
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 ${path11.basename(cfg)}: ${String(err)}`);
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 = path11.dirname(cfg);
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) => path11.isAbsolute(candidatePath) ? candidatePath : path11.join(repoRootForDiscovery, 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
- path11.dirname(cfg)
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) => path11.relative(repoRootForRefinement, absPath).replace(/\\/g, "/")).sort((firstPath, secondPath) => firstPath.localeCompare(secondPath)).join("|");
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
- path11.dirname(cfg)
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 = path11.relative(repoRootForScan, abs).replace(/\\/g, "/");
6720
+ const rel = path12.relative(repoRootForScan, abs).replace(/\\/g, "/");
6675
6721
  const withoutExt = rel.replace(/\.(m?[tj]sx?)$/i, "");
6676
- const base = path11.basename(withoutExt);
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 = path11.dirname(fromFile);
6692
- const cand = path11.resolve(baseDir, spec);
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 = path11.join(cand, `index${ext}`);
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
- path11.dirname(cfg)
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 = path11.dirname(cfg);
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) => path11.relative(repoRoot, abs).replace(/\\/g, "/").replace(/\.(m?[tj]sx?)$/i, "")
6845
+ (abs) => path12.relative(repoRoot, abs).replace(/\\/g, "/").replace(/\.(m?[tj]sx?)$/i, "")
6800
6846
  ).flatMap((rel) => {
6801
- const base = path11.basename(rel);
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 = path11.dirname(fromFile);
6815
- const candidate = path11.resolve(baseDir, spec);
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 = path11.join(candidate, `index${ext}`);
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) => path11.resolve(absPath).replace(/\\/g, "/")
7027
+ (absPath) => path12.resolve(absPath).replace(/\\/g, "/")
6982
7028
  );
6983
7029
  const selAbs = selectionPathsAugmented.map(
6984
- (pathToken) => path11.resolve(pathToken).replace(/\\/g, "/")
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 ${path11.basename(cfg)}: 0 matching tests after filter; skipping.`);
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(path11.resolve(absTestPath).replace(/\\/g, "/"))
7049
+ (absTestPath) => executedTestFilesSet.add(path12.resolve(absTestPath).replace(/\\/g, "/"))
7004
7050
  );
7005
- const outJson = path11.join(
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 = path11.resolve("scripts/jest-vitest-bridge.cjs");
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(path11.dirname(reporterPath), { recursive: true });
7066
+ fsSync3.mkdirSync(path12.dirname(reporterPath), { recursive: true });
7021
7067
  fsSync3.writeFileSync(reporterPath, JEST_BRIDGE_REPORTER_SOURCE, "utf8");
7022
7068
  }
7023
- const envPath = path11.resolve("scripts/jest-bridge-env.cjs");
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(path11.dirname(envPath), { recursive: true });
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) => path11.relative(repoRootForDiscovery, pathToken).replace(/\\\\/g, "/")).filter((rel) => rel && !/^\.+\//.test(rel)).map((rel) => rel.startsWith("./") ? rel : `./${rel}`);
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
- path11.resolve("scripts/jest-bridge-env.cjs"),
7103
+ path12.resolve("scripts/jest-bridge-env.cjs"),
7058
7104
  ...sanitizedJestRunArgs,
7059
7105
  ...collectCoverage ? [
7060
7106
  "--coverageDirectory",
7061
- path11.join("coverage", "jest", path11.basename(cfg).replace(/[^a-zA-Z0-9_.-]+/g, "_"))
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) => path11.resolve(absPath).replace(/\\/g, "/")
7233
+ (absPath) => path12.resolve(absPath).replace(/\\/g, "/")
7188
7234
  );
7189
7235
  const selAbs = selectionPathsAugmented.map(
7190
- (pathToken) => path11.resolve(pathToken).replace(/\\/g, "/")
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)