@rpcbase/test 0.336.0 → 0.337.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { spawn, spawnSync } from "node:child_process";
2
+ import { spawnSync, spawn } from "node:child_process";
3
3
  import fs$1 from "node:fs";
4
4
  import fs from "node:fs/promises";
5
5
  import path from "node:path";
@@ -11,7 +11,6 @@ import { createCollectCoverageMatcher, resolveCollectCoverageRoots, isInsideAnyR
11
11
  import { loadCoverageOptions } from "./coverage/config-loader.js";
12
12
  import { removeCoverageFiles } from "./coverage/files.js";
13
13
  import { CoverageThresholdError, collectCoveredFiles, generateCoverageReport } from "./coverage/report.js";
14
- import { createSpecsByFileRecord, readSpecsMapIndex, warnSpecsMapOutdated } from "./specs-map.js";
15
14
  const require$1 = createRequire(import.meta.url);
16
15
  const moduleDir = path.dirname(fileURLToPath(import.meta.url));
17
16
  const shouldForceTty = !process.stdout.isTTY && process.env.FORCE_COLOR === "true";
@@ -24,12 +23,47 @@ const isAider = process.env.IS_AIDER === "yes";
24
23
  if (process.env.IS_AIDER !== void 0 && process.env.IS_AIDER !== "yes") {
25
24
  console.warn("Warning: IS_AIDER is set to a value other than 'yes'.");
26
25
  }
26
+ function parseCliArgs(rawArgs) {
27
+ const yargs = require$1("yargs/yargs");
28
+ const parsed = yargs(rawArgs).help(false).version(false).strict(false).exitProcess(false).parserConfiguration({
29
+ "unknown-options-as-args": true,
30
+ "populate--": true,
31
+ "strip-dashed": true,
32
+ "strip-aliased": true
33
+ }).option("build-specs-map", {
34
+ type: "boolean",
35
+ default: false
36
+ }).option("auto", {
37
+ type: "boolean",
38
+ default: false
39
+ }).option("full", {
40
+ type: "boolean",
41
+ default: false
42
+ }).option("show-mapping", {
43
+ type: "boolean",
44
+ default: false
45
+ }).option("list", {
46
+ type: "boolean",
47
+ default: false
48
+ }).parseSync();
49
+ const full = Boolean(parsed.full);
50
+ const auto = Boolean(parsed.auto) && !full;
51
+ const passthroughArgs = [...Array.isArray(parsed._) ? parsed._ : [], ...Array.isArray(parsed["--"]) ? parsed["--"] : []].map((entry) => String(entry));
52
+ return {
53
+ buildSpecsMap: Boolean(parsed.buildSpecsMap),
54
+ auto,
55
+ showMapping: Boolean(parsed.showMapping),
56
+ list: Boolean(parsed.list),
57
+ passthroughArgs
58
+ };
59
+ }
27
60
  async function runTests() {
28
- const userArgs = process.argv.slice(2);
29
- const buildSpecsMap = userArgs.includes("--build-specs-map");
30
- const auto = userArgs.includes("--auto");
31
- const showMapping = userArgs.includes("--show-mapping");
32
- const filteredArgs = userArgs.filter((arg) => arg !== "--build-specs-map" && arg !== "--auto" && arg !== "--show-mapping");
61
+ const args = parseCliArgs(process.argv.slice(2));
62
+ const buildSpecsMap = args.buildSpecsMap;
63
+ const auto = args.auto;
64
+ const showMapping = args.showMapping;
65
+ const list = args.list;
66
+ const filteredArgs = args.passthroughArgs;
33
67
  if (buildSpecsMap && auto) {
34
68
  throw new Error("[rb-test] --auto cannot be combined with --build-specs-map");
35
69
  }
@@ -46,6 +80,20 @@ async function runTests() {
46
80
  });
47
81
  return;
48
82
  }
83
+ if (list) {
84
+ if (auto) {
85
+ await resolveAutoPlaywrightArgs({
86
+ userArgs: filteredArgs,
87
+ playwrightCoverage,
88
+ vitestCoverage,
89
+ showMapping,
90
+ listOnly: true
91
+ });
92
+ } else {
93
+ await listPlaywrightSpecFiles(combinedCoverage?.config.rootDir ?? process.cwd());
94
+ }
95
+ return;
96
+ }
49
97
  const shouldGenerateCoverageReport = combinedCoverage?.enabled && !auto;
50
98
  if (shouldGenerateCoverageReport) {
51
99
  await cleanCoverageArtifacts(combinedCoverage.config);
@@ -138,7 +186,7 @@ async function buildSpecsMapFromCoverage({
138
186
  combinedCoverage
139
187
  }) {
140
188
  if (!combinedCoverage?.enabled) {
141
- throw new Error("[specs-map] Cannot build specs map when coverage is disabled.");
189
+ throw new Error("[specs-map] Coverage must be enabled to build the specs map.");
142
190
  }
143
191
  const config = combinedCoverage.config;
144
192
  const workspaceRoot = findWorkspaceRoot(process.cwd());
@@ -147,7 +195,6 @@ async function buildSpecsMapFromCoverage({
147
195
  throw new Error("[specs-map] No spec files found under spec/**/*.spec{,.desktop,.mobile}.ts");
148
196
  }
149
197
  const filesMapDir = path.join(config.testResultsRoot, "files-map");
150
- const specsMapIndexFile = path.join(filesMapDir, "index.json");
151
198
  await fs.rm(filesMapDir, {
152
199
  recursive: true,
153
200
  force: true
@@ -155,8 +202,6 @@ async function buildSpecsMapFromCoverage({
155
202
  await fs.mkdir(filesMapDir, {
156
203
  recursive: true
157
204
  });
158
- const specsMap = [];
159
- const specsByFile = /* @__PURE__ */ new Map();
160
205
  for (const specSourceFile of specSourceFiles) {
161
206
  const specProjectPath = path.relative(config.rootDir, specSourceFile);
162
207
  const specWorkspacePath = toPosixPath(path.relative(workspaceRoot, specSourceFile));
@@ -176,34 +221,26 @@ async function buildSpecsMapFromCoverage({
176
221
  }
177
222
  const coveredFiles = await collectCoveredFiles(config);
178
223
  const impactedFiles = coveredFiles.map((filePath) => toPosixPath(path.relative(workspaceRoot, filePath))).filter((relativePath) => relativePath && !relativePath.startsWith("../") && relativePath !== "..").sort();
179
- specsMap.push({
224
+ const outputFile = path.join(filesMapDir, `${specProjectPath}.json`);
225
+ await fs.mkdir(path.dirname(outputFile), {
226
+ recursive: true
227
+ });
228
+ await fs.writeFile(outputFile, JSON.stringify({
180
229
  spec: specWorkspacePath,
181
230
  files: impactedFiles,
182
231
  failed
183
- });
184
- for (const file of impactedFiles) {
185
- const list = specsByFile.get(file) ?? [];
186
- if (!list.includes(specWorkspacePath)) {
187
- list.push(specWorkspacePath);
188
- }
189
- specsByFile.set(file, list);
190
- }
232
+ }, null, 2), "utf8");
191
233
  if (failed) {
192
234
  throw error;
193
235
  }
194
236
  }
195
- await fs.writeFile(specsMapIndexFile, JSON.stringify({
196
- version: 1,
197
- generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
198
- specs: specsMap,
199
- byFile: createSpecsByFileRecord(specsByFile)
200
- }, null, 2), "utf8");
201
237
  }
202
238
  async function resolveAutoPlaywrightArgs({
203
239
  userArgs,
204
240
  playwrightCoverage,
205
241
  vitestCoverage,
206
- showMapping = false
242
+ showMapping = false,
243
+ listOnly = false
207
244
  }) {
208
245
  const config = playwrightCoverage?.config ?? vitestCoverage?.config ?? null;
209
246
  if (!config) {
@@ -211,10 +248,9 @@ async function resolveAutoPlaywrightArgs({
211
248
  return userArgs;
212
249
  }
213
250
  const filesMapDir = path.join(config.testResultsRoot, "files-map");
214
- const indexPath = path.join(filesMapDir, "index.json");
215
- const mapIndex = await readSpecsMapIndex(indexPath);
216
- if (!mapIndex) {
217
- warnSpecsMapOutdated(indexPath, "Specs map index not found or invalid.");
251
+ const mapFiles = await findFilesMapJson(filesMapDir);
252
+ if (mapFiles.length === 0) {
253
+ console.warn("[auto] Specs map not found; running full Playwright suite.");
218
254
  return userArgs;
219
255
  }
220
256
  const workspaceRoot = findWorkspaceRoot(process.cwd());
@@ -247,51 +283,44 @@ async function resolveAutoPlaywrightArgs({
247
283
  }
248
284
  }
249
285
  if (directSpecChanges.size === 0 && sourceChanges.length === 0) {
250
- console.log("[auto] No relevant git changes.");
251
- return null;
252
- }
253
- if (mapIndex.specs.length === 0) {
254
- warnSpecsMapOutdated(indexPath, "Specs map index is empty.");
286
+ if (listOnly) {
287
+ console.log("[auto] No relevant git changes.");
288
+ console.log("[list] No matched spec files.");
289
+ return null;
290
+ }
291
+ console.warn("[auto] No relevant git changes; running full Playwright suite.");
255
292
  return userArgs;
256
293
  }
257
294
  const parsedMaps = [];
258
- for (const entry of mapIndex.specs) {
259
- if (entry?.failed === true) {
260
- warnSpecsMapOutdated(indexPath, "Specs map was built from a failed spec run.");
295
+ for (const file of mapFiles) {
296
+ const json = await readJson(file);
297
+ if (!json) {
298
+ continue;
299
+ }
300
+ if (json.failed === true) {
301
+ console.warn("[auto] Specs map contains failed entries; running full Playwright suite.");
261
302
  return userArgs;
262
303
  }
263
- const spec = typeof entry?.spec === "string" ? entry.spec : null;
304
+ const spec = typeof json?.spec === "string" ? json.spec : null;
264
305
  if (!spec) {
265
306
  continue;
266
307
  }
267
- const files = Array.isArray(entry?.files) ? entry.files.filter((value) => typeof value === "string") : [];
308
+ const files = Array.isArray(json?.files) ? json.files.filter((entry) => typeof entry === "string") : [];
268
309
  parsedMaps.push({
269
310
  spec,
270
311
  files
271
312
  });
272
313
  }
273
314
  if (parsedMaps.length === 0) {
274
- warnSpecsMapOutdated(indexPath, "Specs map index payload is empty.");
315
+ console.warn("[auto] Specs map is empty; running full Playwright suite.");
275
316
  return userArgs;
276
317
  }
277
318
  const specsByImpactedFile = /* @__PURE__ */ new Map();
278
- for (const [file, specs] of Object.entries(mapIndex.byFile ?? {})) {
279
- const resolvedSpecs = specs.filter((spec) => typeof spec === "string").map((spec) => resolveRenamedPath(spec, renameMap));
280
- const list = specsByImpactedFile.get(file) ?? [];
281
- for (const spec of resolvedSpecs) {
282
- if (!list.includes(spec)) {
283
- list.push(spec);
284
- }
285
- }
286
- specsByImpactedFile.set(file, list);
287
- }
288
319
  for (const entry of parsedMaps) {
289
320
  const resolvedSpec = resolveRenamedPath(entry.spec, renameMap);
290
321
  for (const file of entry.files) {
291
322
  const list = specsByImpactedFile.get(file) ?? [];
292
- if (!list.includes(resolvedSpec)) {
293
- list.push(resolvedSpec);
294
- }
323
+ list.push(resolvedSpec);
295
324
  specsByImpactedFile.set(file, list);
296
325
  }
297
326
  }
@@ -361,6 +390,10 @@ async function resolveAutoPlaywrightArgs({
361
390
  }
362
391
  }
363
392
  if (specsToRun.length === 0) {
393
+ if (listOnly) {
394
+ console.log("[list] No matched spec files.");
395
+ return null;
396
+ }
364
397
  console.log("[auto] No impacted specs.");
365
398
  return null;
366
399
  }
@@ -381,10 +414,46 @@ async function resolveAutoPlaywrightArgs({
381
414
  const specProjectPath = path.relative(config.rootDir, specAbs);
382
415
  return resolvePlaywrightSpecFile(specProjectPath);
383
416
  });
417
+ if (playwrightFiles.length === 0) {
418
+ if (listOnly) {
419
+ console.log("[list] No matched spec files.");
420
+ return null;
421
+ }
422
+ console.log("[auto] No impacted specs.");
423
+ return null;
424
+ }
384
425
  const totalSpecFiles = (await findSpecSourceFiles(config.rootDir)).length;
426
+ if (listOnly) {
427
+ console.log(`[auto] Selected ${playwrightFiles.length}/${totalSpecFiles} spec file(s):`);
428
+ for (const playwrightFile of playwrightFiles) {
429
+ console.log(` - ${playwrightFile}`);
430
+ }
431
+ return null;
432
+ }
385
433
  console.log(`[auto] Running ${playwrightFiles.length}/${totalSpecFiles} spec file(s).`);
386
434
  return [...userArgs, ...playwrightFiles];
387
435
  }
436
+ async function findFilesMapJson(filesMapDir) {
437
+ const patterns = ["spec/**/*.spec{,.desktop,.mobile}.ts.json", "spec/**/*.spec{,.desktop,.mobile}.tsx.json"];
438
+ const matches = await fg(patterns, {
439
+ cwd: filesMapDir,
440
+ absolute: true,
441
+ onlyFiles: true
442
+ }).catch(() => []);
443
+ return matches.sort();
444
+ }
445
+ async function listPlaywrightSpecFiles(projectRoot) {
446
+ const specSourceFiles = await findSpecSourceFiles(projectRoot);
447
+ if (specSourceFiles.length === 0) {
448
+ console.log("[list] No spec files found.");
449
+ return;
450
+ }
451
+ const playwrightFiles = specSourceFiles.map((specSourceFile) => path.relative(projectRoot, specSourceFile)).map((specProjectPath) => resolvePlaywrightSpecFile(specProjectPath));
452
+ console.log(`[list] Selected ${playwrightFiles.length} spec file(s):`);
453
+ for (const playwrightFile of playwrightFiles) {
454
+ console.log(` - ${playwrightFile}`);
455
+ }
456
+ }
388
457
  function getGitChanges(workspaceRoot) {
389
458
  const result = spawnSync("git", ["status", "--porcelain=1", "-z"], {
390
459
  cwd: workspaceRoot,
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["import { spawn, spawnSync } from \"node:child_process\"\nimport fs from \"node:fs\"\nimport fsPromises from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\nimport { fileURLToPath } from \"node:url\"\n\nimport fg from \"fast-glob\"\n\nimport { createCoverageConfig } from \"./coverage/config\"\nimport { createCollectCoverageMatcher, isInsideAnyRoot, resolveCollectCoverageRoots } from \"./coverage/collect\"\nimport { loadCoverageOptions } from \"./coverage/config-loader\"\nimport { removeCoverageFiles } from \"./coverage/files\"\nimport { collectCoveredFiles, CoverageThresholdError, generateCoverageReport } from \"./coverage/report\"\nimport type { CoverageConfig } from \"./coverage/types\"\nimport {\n createSpecsByFileRecord,\n readSpecsMapIndex,\n type SpecsMapEntry,\n warnSpecsMapOutdated,\n} from \"./specs-map\"\n\n\nconst require = createRequire(import.meta.url)\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url))\n\nconst shouldForceTty =\n !process.stdout.isTTY\n && process.env.FORCE_COLOR === \"true\"\n\nif (shouldForceTty) {\n require(\"./register-tty.cjs\")\n}\n\n\nconst VITEST_COVERAGE_CANDIDATES = [\"src/coverage.json\"]\n\nconst COMBINED_COVERAGE_ENV_VAR = \"RB_TEST_COMBINED_COVERAGE\"\n\nconst isAider = process.env.IS_AIDER === \"yes\"\n\nif (process.env.IS_AIDER !== undefined && process.env.IS_AIDER !== \"yes\") {\n console.warn(\"Warning: IS_AIDER is set to a value other than 'yes'.\")\n}\n\ntype CoverageState = { config: CoverageConfig; enabled: boolean } | null\n\nasync function runTests(): Promise<void> {\n const userArgs = process.argv.slice(2)\n const buildSpecsMap = userArgs.includes(\"--build-specs-map\")\n const auto = userArgs.includes(\"--auto\")\n const showMapping = userArgs.includes(\"--show-mapping\")\n const filteredArgs = userArgs.filter((arg) => arg !== \"--build-specs-map\" && arg !== \"--auto\" && arg !== \"--show-mapping\")\n\n if (buildSpecsMap && auto) {\n throw new Error(\"[rb-test] --auto cannot be combined with --build-specs-map\")\n }\n\n if (showMapping && !auto) {\n throw new Error(\"[rb-test] --show-mapping requires --auto\")\n }\n\n const playwrightCoverage = await loadPlaywrightCoverageConfig()\n const vitestCoverage = await loadVitestCoverageConfig()\n const combinedCoverage = resolveCombinedCoverage(playwrightCoverage, vitestCoverage)\n\n if (buildSpecsMap) {\n await buildSpecsMapFromCoverage({\n userArgs: filteredArgs,\n playwrightCoverage,\n vitestCoverage,\n combinedCoverage,\n })\n return\n }\n\n const shouldGenerateCoverageReport = combinedCoverage?.enabled && !auto\n\n if (shouldGenerateCoverageReport) {\n await cleanCoverageArtifacts(combinedCoverage.config)\n }\n\n let testError = null\n\n try {\n await runVitest(vitestCoverage, combinedCoverage?.config ?? null, filteredArgs, { disableCoverage: auto })\n console.log(\"\\nRunning Playwright Tests...\")\n const playwrightArgs = auto\n ? await resolveAutoPlaywrightArgs({\n userArgs: filteredArgs,\n playwrightCoverage,\n vitestCoverage,\n showMapping,\n })\n : filteredArgs\n if (playwrightArgs) {\n await runPlaywright(playwrightArgs, { disableCoverage: auto })\n }\n } catch (error: any) {\n testError = error\n }\n\n if (shouldGenerateCoverageReport) {\n if (testError) {\n console.warn(\"[coverage] skipping report generation because tests failed\")\n } else {\n try {\n await finalizeCoverage(combinedCoverage.config)\n } catch (error) {\n testError = error\n }\n }\n }\n\n if (testError) {\n throw testError\n }\n}\n\nrunTests()\n .then(() => process.exit(0))\n .catch((error) => {\n if (!(error instanceof CoverageThresholdError)) {\n console.error(error?.stack ?? String(error))\n }\n process.exit(1)\n })\n\nasync function runVitest(\n coverage: CoverageState,\n combinedConfig: CoverageConfig | null,\n userArgs: string[],\n { disableCoverage = false }: { disableCoverage?: boolean } = {},\n): Promise<void> {\n const vitestArgs = [\"run\", \"--passWithNoTests\"]\n const vitestConfig = resolveVitestConfig()\n\n const hasCustomConfig = userArgs.some((arg) => {\n if (arg === \"--config\" || arg === \"-c\") {\n return true\n }\n return arg.startsWith(\"--config=\")\n })\n\n if (vitestConfig && !hasCustomConfig) {\n vitestArgs.push(\"--config\", vitestConfig)\n }\n vitestArgs.push(...userArgs)\n\n const launcher = resolveVitestLauncher()\n const env = withRegisterShim(process.env)\n\n if (disableCoverage) {\n env.RB_DISABLE_COVERAGE = \"1\"\n }\n\n if (coverage?.enabled && !disableCoverage) {\n // Vitest runs in a Node.js process, so we use Node's built-in V8 coverage output (NODE_V8_COVERAGE) here.\n // Playwright coverage is collected separately via CDP in Chromium; server coverage is handled via /api/dev/coverage start/stop.\n const nodeCoverageDir = resolveNodeCoverageDir(combinedConfig ?? coverage.config)\n await fsPromises.mkdir(nodeCoverageDir, { recursive: true })\n env.NODE_V8_COVERAGE = nodeCoverageDir\n }\n\n await spawnWithLogs({\n name: \"Vitest\",\n launcher,\n args: vitestArgs,\n env,\n successMessage: \"Vitest suite passed!\",\n failureMessage: \"Vitest failed\",\n })\n\n if (coverage?.enabled && !disableCoverage) {\n await convertNodeCoverage({\n config: combinedConfig ?? coverage.config,\n nodeCoverageDir: resolveNodeCoverageDir(combinedConfig ?? coverage.config),\n })\n }\n}\n\nasync function buildSpecsMapFromCoverage({\n userArgs,\n combinedCoverage,\n}: {\n userArgs: string[]\n combinedCoverage: CoverageState\n [key: string]: unknown\n}): Promise<void> {\n if (!combinedCoverage?.enabled) {\n throw new Error(\"[specs-map] Cannot build specs map when coverage is disabled.\")\n }\n\n const config = combinedCoverage.config\n const workspaceRoot = findWorkspaceRoot(process.cwd())\n\n const specSourceFiles = await findSpecSourceFiles(config.rootDir)\n if (specSourceFiles.length === 0) {\n throw new Error(\"[specs-map] No spec files found under spec/**/*.spec{,.desktop,.mobile}.ts\")\n }\n\n const filesMapDir = path.join(config.testResultsRoot, \"files-map\")\n const specsMapIndexFile = path.join(filesMapDir, \"index.json\")\n await fsPromises.rm(filesMapDir, { recursive: true, force: true })\n await fsPromises.mkdir(filesMapDir, { recursive: true })\n const specsMap: SpecsMapEntry[] = []\n const specsByFile = new Map<string, string[]>()\n\n for (const specSourceFile of specSourceFiles) {\n const specProjectPath = path.relative(config.rootDir, specSourceFile)\n const specWorkspacePath = toPosixPath(path.relative(workspaceRoot, specSourceFile))\n const testFile = resolvePlaywrightSpecFile(specProjectPath)\n\n console.log(`\\n[specs-map] Running ${specWorkspacePath}`)\n\n await removeCoverageFiles(config)\n\n let error = null\n let failed = false\n try {\n await runPlaywright([...userArgs, testFile])\n } catch (runError: any) {\n error = runError\n failed = true\n console.error(`[specs-map] Failed: ${specWorkspacePath}`)\n console.error(runError?.stack ?? String(runError))\n }\n\n const coveredFiles = await collectCoveredFiles(config)\n const impactedFiles = coveredFiles\n .map((filePath) => toPosixPath(path.relative(workspaceRoot, filePath)))\n .filter((relativePath) => relativePath && !relativePath.startsWith(\"../\") && relativePath !== \"..\")\n .sort()\n\n specsMap.push({\n spec: specWorkspacePath,\n files: impactedFiles,\n failed,\n })\n\n for (const file of impactedFiles) {\n const list = specsByFile.get(file) ?? []\n if (!list.includes(specWorkspacePath)) {\n list.push(specWorkspacePath)\n }\n specsByFile.set(file, list)\n }\n\n if (failed) {\n throw error\n }\n }\n\n await fsPromises.writeFile(\n specsMapIndexFile,\n JSON.stringify(\n {\n version: 1,\n generatedAt: new Date().toISOString(),\n specs: specsMap,\n byFile: createSpecsByFileRecord(specsByFile),\n },\n null,\n 2,\n ),\n \"utf8\",\n )\n}\n\ntype GitChange =\n | { kind: \"rename\"; oldPath: string; newPath: string }\n | { kind: \"path\"; path: string }\n\nasync function resolveAutoPlaywrightArgs({\n userArgs,\n playwrightCoverage,\n vitestCoverage,\n showMapping = false,\n}: {\n userArgs: string[]\n playwrightCoverage: CoverageState\n vitestCoverage: CoverageState\n showMapping?: boolean\n [key: string]: unknown\n}): Promise<string[] | null> {\n const config = playwrightCoverage?.config ?? vitestCoverage?.config ?? null\n if (!config) {\n console.warn(\"[auto] Coverage config not found; running full Playwright suite.\")\n return userArgs\n }\n\n const filesMapDir = path.join(config.testResultsRoot, \"files-map\")\n const indexPath = path.join(filesMapDir, \"index.json\")\n const mapIndex = await readSpecsMapIndex(indexPath)\n if (!mapIndex) {\n warnSpecsMapOutdated(indexPath, \"Specs map index not found or invalid.\")\n return userArgs\n }\n\n const workspaceRoot = findWorkspaceRoot(process.cwd())\n const gitChanges = getGitChanges(workspaceRoot)\n const renameMap = new Map<string, string>(\n gitChanges\n .filter((change): change is { kind: \"rename\"; oldPath: string; newPath: string } => change.kind === \"rename\")\n .map((change) => [change.oldPath, change.newPath]),\n )\n\n const specRootAbs = path.join(config.rootDir, \"spec\")\n const matchesCollectCoverageFrom = createCollectCoverageMatcher(config.collectCoverageFrom, config.rootDir)\n\n const directSpecChanges = new Set<string>()\n const sourceChanges: GitChange[] = []\n\n for (const change of gitChanges) {\n if (change.kind === \"rename\") {\n const oldAbs = path.join(workspaceRoot, change.oldPath)\n const newAbs = path.join(workspaceRoot, change.newPath)\n\n if (isSpecSourceFile(newAbs, specRootAbs) && fs.existsSync(newAbs)) {\n directSpecChanges.add(change.newPath)\n }\n\n const oldMatches = matchesCollectCoverageFrom(oldAbs)\n const newMatches = matchesCollectCoverageFrom(newAbs)\n if (oldMatches || newMatches) {\n sourceChanges.push(change)\n }\n continue\n }\n\n const abs = path.join(workspaceRoot, change.path)\n\n if (isSpecSourceFile(abs, specRootAbs) && fs.existsSync(abs)) {\n directSpecChanges.add(change.path)\n }\n\n if (matchesCollectCoverageFrom(abs)) {\n sourceChanges.push(change)\n }\n }\n\n if (directSpecChanges.size === 0 && sourceChanges.length === 0) {\n console.log(\"[auto] No relevant git changes.\")\n return null\n }\n\n if (mapIndex.specs.length === 0) {\n warnSpecsMapOutdated(indexPath, \"Specs map index is empty.\")\n return userArgs\n }\n\n const parsedMaps: Array<{ spec: string; files: string[] }> = []\n for (const entry of mapIndex.specs) {\n if (entry?.failed === true) {\n warnSpecsMapOutdated(indexPath, \"Specs map was built from a failed spec run.\")\n return userArgs\n }\n\n const spec = typeof entry?.spec === \"string\" ? entry.spec : null\n if (!spec) {\n continue\n }\n\n const files = Array.isArray(entry?.files)\n ? (entry.files as unknown[]).filter((value): value is string => typeof value === \"string\")\n : []\n parsedMaps.push({ spec, files })\n }\n\n if (parsedMaps.length === 0) {\n warnSpecsMapOutdated(indexPath, \"Specs map index payload is empty.\")\n return userArgs\n }\n\n const specsByImpactedFile = new Map<string, string[]>()\n\n for (const [file, specs] of Object.entries(mapIndex.byFile ?? {})) {\n const resolvedSpecs = specs\n .filter((spec): spec is string => typeof spec === \"string\")\n .map((spec) => resolveRenamedPath(spec, renameMap))\n const list = specsByImpactedFile.get(file) ?? []\n for (const spec of resolvedSpecs) {\n if (!list.includes(spec)) {\n list.push(spec)\n }\n }\n specsByImpactedFile.set(file, list)\n }\n\n for (const entry of parsedMaps) {\n const resolvedSpec = resolveRenamedPath(entry.spec, renameMap)\n for (const file of entry.files) {\n const list = specsByImpactedFile.get(file) ?? []\n if (!list.includes(resolvedSpec)) {\n list.push(resolvedSpec)\n }\n specsByImpactedFile.set(file, list)\n }\n }\n\n const unmappedSourceChanges = sourceChanges.filter((change) => {\n if (change.kind === \"path\") {\n return !specsByImpactedFile.has(change.path)\n }\n return !specsByImpactedFile.has(change.oldPath) && !specsByImpactedFile.has(change.newPath)\n })\n\n if (unmappedSourceChanges.length > 0) {\n console.warn(\"[auto] Unmapped source changes detected:\")\n for (const change of unmappedSourceChanges) {\n if (change.kind === \"path\") {\n console.warn(` - ${change.path}`)\n } else {\n console.warn(` - ${change.oldPath} -> ${change.newPath}`)\n }\n }\n }\n\n const selectedSpecs = new Set<string>(directSpecChanges)\n const triggersBySpec = new Map<string, Set<string>>()\n\n for (const spec of directSpecChanges) {\n if (showMapping) {\n triggersBySpec.set(spec, new Set([spec]))\n }\n }\n\n for (const change of sourceChanges) {\n if (change.kind === \"path\") {\n const specs = specsByImpactedFile.get(change.path) ?? []\n specs.forEach((spec) => selectedSpecs.add(spec))\n if (showMapping) {\n for (const spec of specs) {\n const current = triggersBySpec.get(spec) ?? new Set()\n current.add(change.path)\n triggersBySpec.set(spec, current)\n }\n }\n continue\n }\n\n const oldSpecs = specsByImpactedFile.get(change.oldPath) ?? []\n oldSpecs.forEach((spec) => selectedSpecs.add(spec))\n const newSpecs = specsByImpactedFile.get(change.newPath) ?? []\n newSpecs.forEach((spec) => selectedSpecs.add(spec))\n if (showMapping) {\n const key = `${change.oldPath} -> ${change.newPath}`\n const allSpecs = new Set([...oldSpecs, ...newSpecs])\n for (const spec of allSpecs) {\n const current = triggersBySpec.get(spec) ?? new Set()\n current.add(key)\n triggersBySpec.set(spec, current)\n }\n }\n }\n\n const missingSpecs: string[] = []\n const specsToRun = Array.from(selectedSpecs)\n .filter((spec) => {\n const abs = path.join(workspaceRoot, spec)\n if (fs.existsSync(abs)) {\n return true\n }\n missingSpecs.push(spec)\n return false\n })\n .sort()\n if (missingSpecs.length > 0) {\n console.warn(`[auto] Ignoring ${missingSpecs.length} missing spec file(s):`)\n for (const spec of missingSpecs.sort()) {\n console.warn(` - ${spec}`)\n }\n }\n\n if (specsToRun.length === 0) {\n console.log(\"[auto] No impacted specs.\")\n return null\n }\n\n if (showMapping) {\n console.log(\"[auto] Mapping:\")\n for (const spec of specsToRun) {\n const triggers = Array.from(triggersBySpec.get(spec) ?? []).sort()\n if (triggers.length === 0) {\n continue\n }\n console.log(` - ${spec}`)\n for (const trigger of triggers) {\n console.log(` <- ${trigger}`)\n }\n }\n }\n\n const playwrightFiles = specsToRun\n .map((specWorkspacePath) => path.join(workspaceRoot, specWorkspacePath))\n .filter((specAbs) => isSubpath(specAbs, config.rootDir))\n .map((specAbs) => {\n const specProjectPath = path.relative(config.rootDir, specAbs)\n return resolvePlaywrightSpecFile(specProjectPath)\n })\n\n const totalSpecFiles = (await findSpecSourceFiles(config.rootDir)).length\n console.log(`[auto] Running ${playwrightFiles.length}/${totalSpecFiles} spec file(s).`)\n return [...userArgs, ...playwrightFiles]\n}\n\nfunction getGitChanges(workspaceRoot: string): GitChange[] {\n const result = spawnSync(\"git\", [\"status\", \"--porcelain=1\", \"-z\"], {\n cwd: workspaceRoot,\n encoding: \"utf8\",\n })\n\n if (result.status !== 0) {\n throw new Error(`[auto] Failed to read git status: ${result.stderr || \"unknown error\"}`)\n }\n\n const tokens = String(result.stdout ?? \"\").split(\"\\0\").filter(Boolean)\n const changes: GitChange[] = []\n\n for (let i = 0; i < tokens.length; i += 1) {\n const record = tokens[i]\n if (record.length < 4) {\n continue\n }\n\n const status = record.slice(0, 2)\n const pathPart = toPosixPath(record.slice(3))\n\n if (isRenameOrCopyStatus(status)) {\n const next = tokens[i + 1]\n if (typeof next !== \"string\") {\n continue\n }\n changes.push({\n kind: \"rename\",\n oldPath: pathPart,\n newPath: toPosixPath(next),\n })\n i += 1\n continue\n }\n\n changes.push({\n kind: \"path\",\n path: pathPart,\n })\n }\n\n return changes\n}\n\nfunction isRenameOrCopyStatus(status: string): boolean {\n return status.includes(\"R\") || status.includes(\"C\")\n}\n\nfunction resolveRenamedPath(original: string, renameMap: Map<string, string>): string {\n let current = original\n const visited = new Set<string>()\n\n while (!visited.has(current)) {\n const next = renameMap.get(current)\n if (!next) {\n break\n }\n visited.add(current)\n current = next\n }\n\n return current\n}\n\nfunction isSubpath(candidate: string, root: string): boolean {\n const relative = path.relative(root, candidate)\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n}\n\nfunction isSpecSourceFile(absolutePath: string, specRootAbsolute: string): boolean {\n if (!isSubpath(absolutePath, specRootAbsolute)) {\n return false\n }\n\n return /\\.spec(?:\\.(?:desktop|mobile))?\\.tsx?$/.test(absolutePath)\n}\n\nasync function findSpecSourceFiles(projectRoot: string): Promise<string[]> {\n const patterns = [\"spec/**/*.spec{,.desktop,.mobile}.ts\", \"spec/**/*.spec{,.desktop,.mobile}.tsx\"]\n const matches = await fg(patterns, { cwd: projectRoot, absolute: true, onlyFiles: true })\n return matches.sort()\n}\n\nfunction resolvePlaywrightSpecFile(specProjectPath: string): string {\n const buildSpecRoot = path.join(process.cwd(), \"build\", \"spec\")\n const isBuildSpecProject = fs.existsSync(buildSpecRoot)\n\n if (!isBuildSpecProject) {\n return specProjectPath\n }\n\n const builtCandidate = normalizeBuiltSpecPath(path.join(\"build\", specProjectPath))\n const builtAbsolute = path.resolve(process.cwd(), builtCandidate)\n if (!fs.existsSync(builtAbsolute)) {\n throw new Error(`[specs-map] Missing built spec file: ${builtCandidate}`)\n }\n\n return builtCandidate\n}\n\nfunction normalizeBuiltSpecPath(filePath: string): string {\n if (filePath.endsWith(\".ts\") || filePath.endsWith(\".tsx\")) {\n return `${filePath.replace(/\\.tsx?$/, \"\")}.js`\n }\n return filePath\n}\n\nfunction toPosixPath(input: unknown): string {\n return String(input ?? \"\").split(path.sep).join(\"/\")\n}\n\nfunction findWorkspaceRoot(projectRoot: string): string {\n let dir = path.resolve(projectRoot)\n\n while (true) {\n const pkgPath = path.join(dir, \"package.json\")\n try {\n if (fs.existsSync(pkgPath)) {\n const parsed = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"))\n if (parsed && typeof parsed === \"object\" && parsed.workspaces) {\n return dir\n }\n }\n } catch {\n //\n }\n\n const parent = path.dirname(dir)\n if (parent === dir) {\n return path.resolve(projectRoot)\n }\n dir = parent\n }\n}\n\nfunction runPlaywright(\n userArgs: string[],\n { disableCoverage = false }: { disableCoverage?: boolean } = {},\n): Promise<void> {\n // Determine config file path\n const configPath = fs.existsSync(\n path.join(process.cwd(), \"playwright.config.ts\"),\n )\n ? path.join(process.cwd(), \"playwright.config.ts\")\n : path.join(moduleDir, \"playwright.config.ts\")\n\n const hasCustomConfig = userArgs.some((arg) => {\n if (arg === \"--config\" || arg === \"-c\") {\n return true\n }\n\n return arg.startsWith(\"--config=\")\n })\n\n const playwrightArgs = [\"test\"]\n\n if (!hasCustomConfig) {\n playwrightArgs.push(\"--config\", configPath)\n }\n\n playwrightArgs.push(...userArgs)\n\n ensureJsxRuntimeShim(process.cwd())\n const launcher = resolvePlaywrightLauncher()\n const env = withRegisterShim(process.env)\n env[COMBINED_COVERAGE_ENV_VAR] = \"1\"\n if (disableCoverage) {\n env.RB_DISABLE_COVERAGE = \"1\"\n }\n\n return spawnWithLogs({\n name: \"Playwright\",\n launcher,\n args: playwrightArgs,\n env,\n successMessage: \"Playwright suite passed!\",\n failureMessage: \"Playwright failed\",\n })\n}\n\ntype SpawnLauncher = {\n command: string\n args?: string[]\n}\n\nfunction resolvePlaywrightLauncher(): SpawnLauncher {\n const cliPath = resolveCliPath()\n if (cliPath) {\n return {\n command: process.execPath,\n args: [cliPath],\n }\n }\n\n const localBin = path.resolve(process.cwd(), \"node_modules/.bin/playwright\")\n if (fs.existsSync(localBin)) {\n return {\n command: localBin,\n args: [],\n }\n }\n\n return {\n command: \"playwright\",\n args: [],\n }\n}\n\nfunction resolveCliPath(): string | null {\n const searchRoots = [process.cwd(), moduleDir]\n\n for (const base of searchRoots) {\n try {\n const pkgPath = require.resolve(\"@playwright/test/package.json\", { paths: [base] })\n const cliPath = path.join(path.dirname(pkgPath), \"cli.js\")\n if (fs.existsSync(cliPath)) {\n return cliPath\n }\n } catch (_error) {\n // continue searching\n }\n }\n\n return null\n}\n\nfunction resolveVitestLauncher(): SpawnLauncher {\n const searchRoots = [process.cwd(), moduleDir]\n\n for (const base of searchRoots) {\n try {\n const pkgPath = require.resolve(\"vitest/package.json\", { paths: [base] })\n const pkgDir = path.dirname(pkgPath)\n const pkgJson = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"))\n const binPath = typeof pkgJson.bin === \"string\" ? pkgJson.bin : pkgJson.bin?.vitest\n if (binPath) {\n return {\n command: process.execPath,\n args: [path.join(pkgDir, binPath)],\n }\n }\n } catch (_error) {\n // continue searching\n }\n }\n\n const localBin = path.resolve(process.cwd(), \"node_modules/.bin/vitest\")\n if (fs.existsSync(localBin)) {\n return {\n command: localBin,\n args: [],\n }\n }\n\n return {\n command: \"vitest\",\n args: [],\n }\n}\n\nfunction resolveVitestConfig(): string | null {\n const userConfig = findVitestConfig(process.cwd())\n if (userConfig) {\n return userConfig\n }\n\n const bundledConfig = path.join(moduleDir, \"vitest.config.js\")\n return fs.existsSync(bundledConfig) ? bundledConfig : null\n}\n\nfunction findVitestConfig(baseDir: string): string | null {\n const candidates = [\n \"vitest.config.ts\",\n \"vitest.config.js\",\n \"vitest.config.mjs\",\n ]\n\n for (const file of candidates) {\n const fullPath = path.join(baseDir, file)\n if (fs.existsSync(fullPath)) {\n return fullPath\n }\n }\n\n return null\n}\n\nasync function loadVitestCoverageConfig(): Promise<CoverageState> {\n const options = await loadCoverageOptions({\n optional: true,\n candidates: VITEST_COVERAGE_CANDIDATES,\n })\n if (!options) {\n return null\n }\n\n const config = createCoverageConfig(options)\n\n return {\n config,\n enabled: config.coverageEnabled,\n }\n}\n\nasync function loadPlaywrightCoverageConfig(): Promise<CoverageState> {\n const options = await loadCoverageOptions({ optional: true })\n if (!options) {\n return null\n }\n\n const config = createCoverageConfig(options)\n\n return {\n config,\n enabled: config.coverageEnabled,\n }\n}\n\nfunction resolveCombinedCoverage(playwrightCoverage: CoverageState, vitestCoverage: CoverageState): CoverageState {\n if (playwrightCoverage?.enabled) {\n return playwrightCoverage\n }\n\n if (vitestCoverage?.enabled) {\n return vitestCoverage\n }\n\n return null\n}\n\nasync function cleanCoverageArtifacts(config: CoverageConfig): Promise<void> {\n await removeCoverageFiles(config)\n await fsPromises.rm(config.coverageReportDir, { recursive: true, force: true })\n await fsPromises.rm(resolveNodeCoverageDir(config), { recursive: true, force: true })\n}\n\nfunction resolveNodeCoverageDir(config: CoverageConfig): string {\n return path.join(config.rootDir, \"build\", \"vitest\", \"test-results\", \"node-coverage\")\n}\n\nasync function convertNodeCoverage(coverage: { config: CoverageConfig; nodeCoverageDir: string }): Promise<void> {\n const { config, nodeCoverageDir } = coverage\n\n const entries = await fsPromises.readdir(nodeCoverageDir).catch(() => [])\n const scripts = []\n const scriptRoots = resolveCollectCoverageRoots(config.collectCoverageFrom, config.rootDir)\n\n for (const entry of entries) {\n if (!entry.endsWith(\".json\")) {\n continue\n }\n\n const fullPath = path.join(nodeCoverageDir, entry)\n const payload = await readJson(fullPath)\n const results = Array.isArray(payload?.result) ? payload.result : []\n\n for (const script of results) {\n const normalized = normalizeNodeScriptUrl(script.url, config.rootDir)\n if (!normalized) {\n continue\n }\n\n if (isNodeModulesPath(normalized.absolutePath)) {\n continue\n }\n\n if (!isInsideAnyRoot(normalized.absolutePath, scriptRoots)) {\n continue\n }\n\n const source = await fsPromises.readFile(normalized.absolutePath, \"utf8\").catch(() => \"\")\n\n scripts.push({\n absolutePath: normalized.absolutePath,\n relativePath: normalized.relativePath,\n source,\n functions: script.functions ?? [],\n url: script.url,\n })\n }\n }\n\n if (scripts.length === 0) {\n return\n }\n\n const outDir = path.join(config.rootDir, \"build\", \"vitest\", \"coverage\")\n await fsPromises.mkdir(outDir, { recursive: true })\n const outputFile = path.join(outDir, config.coverageFileName)\n await fsPromises.writeFile(outputFile, JSON.stringify({ testId: \"vitest\", scripts }, null, 2), \"utf8\")\n}\n\nasync function finalizeCoverage(config: CoverageConfig): Promise<void> {\n try {\n await generateCoverageReport(config)\n } catch (error: any) {\n if (error instanceof CoverageThresholdError) {\n console.error(error.message)\n }\n throw error\n }\n}\n\nasync function readJson(filePath: string): Promise<any | null> {\n try {\n const raw = await fsPromises.readFile(filePath, \"utf8\")\n return JSON.parse(raw)\n } catch {\n return null\n }\n}\n\nfunction normalizeNodeScriptUrl(\n rawUrl: string,\n rootDir: string,\n): { absolutePath: string; relativePath: string } | null {\n if (!rawUrl || rawUrl.startsWith(\"node:\")) {\n return null\n }\n\n let absolutePath = null\n\n try {\n if (rawUrl.startsWith(\"file://\")) {\n absolutePath = fileURLToPath(rawUrl)\n }\n } catch (_err) {\n // ignore invalid URLs\n }\n\n if (!absolutePath && path.isAbsolute(rawUrl)) {\n absolutePath = rawUrl\n }\n\n if (!absolutePath) {\n return null\n }\n\n const normalized = path.normalize(absolutePath)\n\n return {\n absolutePath: normalized,\n relativePath: path.relative(rootDir, normalized),\n }\n}\n\nfunction isNodeModulesPath(filePath: unknown): boolean {\n return path\n .normalize(String(filePath ?? \"\"))\n .split(path.sep)\n .includes(\"node_modules\")\n}\n\nfunction spawnWithLogs({\n name,\n launcher,\n args,\n env,\n successMessage,\n failureMessage,\n}: {\n name: string\n launcher: SpawnLauncher\n args: string[]\n env: NodeJS.ProcessEnv\n successMessage?: string\n failureMessage?: string\n}): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const stdoutBuffer: string[] = []\n const stderrBuffer: string[] = []\n\n const child = spawn(\n launcher.command,\n [...(launcher.args || []), ...args],\n {\n shell: false,\n env,\n },\n )\n\n child.stdout?.on(\"data\", (data) => {\n if (!isAider) {\n process.stdout.write(data)\n }\n stdoutBuffer.push(data.toString())\n })\n\n child.stderr?.on(\"data\", (data) => {\n if (!isAider) {\n process.stderr.write(data)\n }\n stderrBuffer.push(data.toString())\n })\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n if (successMessage) {\n console.log(successMessage)\n }\n resolve()\n } else {\n console.error(failureMessage || `${name} failed:`)\n\n if (isAider) {\n if (stdoutBuffer.length > 0) {\n console.error(stdoutBuffer.join(\"\"))\n }\n\n if (stderrBuffer.length > 0) {\n console.error(stderrBuffer.join(\"\"))\n }\n }\n\n reject(new Error(`${name} failed with exit code: ${code}`))\n }\n })\n\n child.on(\"error\", (error) => {\n console.error(`Error spawning ${name}:`, error)\n reject(error)\n })\n })\n}\n\nfunction withRegisterShim(baseEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const nodeOptions = appendNodeRequire(baseEnv.NODE_OPTIONS, path.join(moduleDir, \"register-tty.cjs\"))\n return {\n ...baseEnv,\n NODE_OPTIONS: nodeOptions,\n }\n}\n\nfunction ensureJsxRuntimeShim(projectRoot: string): void {\n const shimDir = path.join(projectRoot, \"node_modules\", \"playwright\")\n fs.mkdirSync(shimDir, { recursive: true })\n const shims = [\n { file: \"jsx-runtime.js\", target: \"react/jsx-runtime\" },\n { file: \"jsx-dev-runtime.js\", target: \"react/jsx-dev-runtime\" },\n ]\n\n for (const { file, target } of shims) {\n const filePath = path.join(shimDir, file)\n if (!fs.existsSync(filePath)) {\n const content = `export * from \"${target}\";\\nexport { default } from \"${target}\";\\n`\n fs.writeFileSync(filePath, content, \"utf8\")\n }\n }\n}\n\nfunction appendNodeRequire(existing: string | undefined, modulePath: string): string {\n const flag = `--require=${modulePath}`\n if (!existing || existing.length === 0) {\n return flag\n }\n return `${existing} ${flag}`\n}\n"],"names":["require","createRequire","import","url","moduleDir","path","dirname","fileURLToPath","shouldForceTty","process","stdout","isTTY","env","FORCE_COLOR","VITEST_COVERAGE_CANDIDATES","COMBINED_COVERAGE_ENV_VAR","isAider","IS_AIDER","undefined","console","warn","runTests","userArgs","argv","slice","buildSpecsMap","includes","auto","showMapping","filteredArgs","filter","arg","Error","playwrightCoverage","loadPlaywrightCoverageConfig","vitestCoverage","loadVitestCoverageConfig","combinedCoverage","resolveCombinedCoverage","buildSpecsMapFromCoverage","shouldGenerateCoverageReport","enabled","cleanCoverageArtifacts","config","testError","runVitest","disableCoverage","log","playwrightArgs","resolveAutoPlaywrightArgs","runPlaywright","error","finalizeCoverage","then","exit","catch","CoverageThresholdError","stack","String","coverage","combinedConfig","vitestArgs","vitestConfig","resolveVitestConfig","hasCustomConfig","some","startsWith","push","launcher","resolveVitestLauncher","withRegisterShim","RB_DISABLE_COVERAGE","nodeCoverageDir","resolveNodeCoverageDir","fsPromises","mkdir","recursive","NODE_V8_COVERAGE","spawnWithLogs","name","args","successMessage","failureMessage","convertNodeCoverage","workspaceRoot","findWorkspaceRoot","cwd","specSourceFiles","findSpecSourceFiles","rootDir","length","filesMapDir","join","testResultsRoot","specsMapIndexFile","rm","force","specsMap","specsByFile","Map","specSourceFile","specProjectPath","relative","specWorkspacePath","toPosixPath","testFile","resolvePlaywrightSpecFile","removeCoverageFiles","failed","runError","coveredFiles","collectCoveredFiles","impactedFiles","map","filePath","relativePath","sort","spec","files","file","list","get","set","writeFile","JSON","stringify","version","generatedAt","Date","toISOString","specs","byFile","createSpecsByFileRecord","indexPath","mapIndex","readSpecsMapIndex","warnSpecsMapOutdated","gitChanges","getGitChanges","renameMap","change","kind","oldPath","newPath","specRootAbs","matchesCollectCoverageFrom","createCollectCoverageMatcher","collectCoverageFrom","directSpecChanges","Set","sourceChanges","oldAbs","newAbs","isSpecSourceFile","fs","existsSync","add","oldMatches","newMatches","abs","size","parsedMaps","entry","Array","isArray","value","specsByImpactedFile","Object","entries","resolvedSpecs","resolveRenamedPath","resolvedSpec","unmappedSourceChanges","has","selectedSpecs","triggersBySpec","forEach","current","oldSpecs","newSpecs","key","allSpecs","missingSpecs","specsToRun","from","triggers","trigger","playwrightFiles","specAbs","isSubpath","totalSpecFiles","result","spawnSync","encoding","status","stderr","tokens","split","Boolean","changes","i","record","pathPart","isRenameOrCopyStatus","next","original","visited","candidate","root","isAbsolute","absolutePath","specRootAbsolute","test","projectRoot","patterns","matches","fg","absolute","onlyFiles","buildSpecRoot","isBuildSpecProject","builtCandidate","normalizeBuiltSpecPath","builtAbsolute","resolve","endsWith","replace","input","sep","dir","pkgPath","parsed","parse","readFileSync","workspaces","parent","configPath","ensureJsxRuntimeShim","resolvePlaywrightLauncher","cliPath","resolveCliPath","command","execPath","localBin","searchRoots","base","paths","_error","pkgDir","pkgJson","binPath","bin","vitest","userConfig","findVitestConfig","bundledConfig","baseDir","candidates","fullPath","options","loadCoverageOptions","optional","createCoverageConfig","coverageEnabled","coverageReportDir","readdir","scripts","scriptRoots","resolveCollectCoverageRoots","payload","readJson","results","script","normalized","normalizeNodeScriptUrl","isNodeModulesPath","isInsideAnyRoot","source","readFile","functions","outDir","outputFile","coverageFileName","testId","generateCoverageReport","message","raw","rawUrl","_err","normalize","Promise","reject","stdoutBuffer","stderrBuffer","child","spawn","shell","on","data","write","toString","code","baseEnv","nodeOptions","appendNodeRequire","NODE_OPTIONS","shimDir","mkdirSync","shims","target","content","writeFileSync","existing","modulePath","flag"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["import { spawn, spawnSync } from \"node:child_process\"\nimport fs from \"node:fs\"\nimport fsPromises from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\nimport { fileURLToPath } from \"node:url\"\n\nimport fg from \"fast-glob\"\n\nimport { createCoverageConfig } from \"./coverage/config\"\nimport { createCollectCoverageMatcher, isInsideAnyRoot, resolveCollectCoverageRoots } from \"./coverage/collect\"\nimport { loadCoverageOptions } from \"./coverage/config-loader\"\nimport { removeCoverageFiles } from \"./coverage/files\"\nimport { collectCoveredFiles, CoverageThresholdError, generateCoverageReport } from \"./coverage/report\"\nimport type { CoverageConfig } from \"./coverage/types\"\n\n\nconst require = createRequire(import.meta.url)\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url))\n\nconst shouldForceTty =\n !process.stdout.isTTY\n && process.env.FORCE_COLOR === \"true\"\n\nif (shouldForceTty) {\n require(\"./register-tty.cjs\")\n}\n\n\nconst VITEST_COVERAGE_CANDIDATES = [\"src/coverage.json\"]\n\nconst COMBINED_COVERAGE_ENV_VAR = \"RB_TEST_COMBINED_COVERAGE\"\n\nconst isAider = process.env.IS_AIDER === \"yes\"\n\nif (process.env.IS_AIDER !== undefined && process.env.IS_AIDER !== \"yes\") {\n console.warn(\"Warning: IS_AIDER is set to a value other than 'yes'.\")\n}\n\ntype CoverageState = { config: CoverageConfig; enabled: boolean } | null\n\ntype CliArgs = {\n buildSpecsMap: boolean\n auto: boolean\n showMapping: boolean\n list: boolean\n passthroughArgs: string[]\n}\n\nfunction parseCliArgs(rawArgs: string[]): CliArgs {\n const yargs = require(\"yargs/yargs\") as (args: string[]) => {\n help: (enabled: boolean) => any\n version: (enabled: boolean) => any\n strict: (enabled: boolean) => any\n exitProcess: (enabled: boolean) => any\n parserConfiguration: (options: Record<string, unknown>) => any\n option: (name: string, options: Record<string, unknown>) => any\n parseSync: () => Record<string, unknown>\n }\n\n const parsed = yargs(rawArgs)\n .help(false)\n .version(false)\n .strict(false)\n .exitProcess(false)\n .parserConfiguration({\n \"unknown-options-as-args\": true,\n \"populate--\": true,\n \"strip-dashed\": true,\n \"strip-aliased\": true,\n })\n .option(\"build-specs-map\", { type: \"boolean\", default: false })\n .option(\"auto\", { type: \"boolean\", default: false })\n .option(\"full\", { type: \"boolean\", default: false })\n .option(\"show-mapping\", { type: \"boolean\", default: false })\n .option(\"list\", { type: \"boolean\", default: false })\n .parseSync()\n\n const full = Boolean(parsed.full)\n const auto = Boolean(parsed.auto) && !full\n\n const passthroughArgs = [\n ...(Array.isArray(parsed._) ? parsed._ : []),\n ...(Array.isArray(parsed[\"--\"]) ? parsed[\"--\"] : []),\n ].map((entry) => String(entry))\n\n return {\n buildSpecsMap: Boolean(parsed.buildSpecsMap),\n auto,\n showMapping: Boolean(parsed.showMapping),\n list: Boolean(parsed.list),\n passthroughArgs,\n }\n}\n\nasync function runTests(): Promise<void> {\n const args = parseCliArgs(process.argv.slice(2))\n const buildSpecsMap = args.buildSpecsMap\n const auto = args.auto\n const showMapping = args.showMapping\n const list = args.list\n const filteredArgs = args.passthroughArgs\n\n if (buildSpecsMap && auto) {\n throw new Error(\"[rb-test] --auto cannot be combined with --build-specs-map\")\n }\n\n if (showMapping && !auto) {\n throw new Error(\"[rb-test] --show-mapping requires --auto\")\n }\n\n const playwrightCoverage = await loadPlaywrightCoverageConfig()\n const vitestCoverage = await loadVitestCoverageConfig()\n const combinedCoverage = resolveCombinedCoverage(playwrightCoverage, vitestCoverage)\n\n if (buildSpecsMap) {\n await buildSpecsMapFromCoverage({\n userArgs: filteredArgs,\n playwrightCoverage,\n vitestCoverage,\n combinedCoverage,\n })\n return\n }\n\n if (list) {\n if (auto) {\n await resolveAutoPlaywrightArgs({\n userArgs: filteredArgs,\n playwrightCoverage,\n vitestCoverage,\n showMapping,\n listOnly: true,\n })\n } else {\n await listPlaywrightSpecFiles(combinedCoverage?.config.rootDir ?? process.cwd())\n }\n return\n }\n\n const shouldGenerateCoverageReport = combinedCoverage?.enabled && !auto\n\n if (shouldGenerateCoverageReport) {\n await cleanCoverageArtifacts(combinedCoverage.config)\n }\n\n let testError = null\n\n try {\n await runVitest(vitestCoverage, combinedCoverage?.config ?? null, filteredArgs, { disableCoverage: auto })\n console.log(\"\\nRunning Playwright Tests...\")\n const playwrightArgs = auto\n ? await resolveAutoPlaywrightArgs({\n userArgs: filteredArgs,\n playwrightCoverage,\n vitestCoverage,\n showMapping,\n })\n : filteredArgs\n if (playwrightArgs) {\n await runPlaywright(playwrightArgs, { disableCoverage: auto })\n }\n } catch (error: any) {\n testError = error\n }\n\n if (shouldGenerateCoverageReport) {\n if (testError) {\n console.warn(\"[coverage] skipping report generation because tests failed\")\n } else {\n try {\n await finalizeCoverage(combinedCoverage.config)\n } catch (error) {\n testError = error\n }\n }\n }\n\n if (testError) {\n throw testError\n }\n}\n\nrunTests()\n .then(() => process.exit(0))\n .catch((error) => {\n if (!(error instanceof CoverageThresholdError)) {\n console.error(error?.stack ?? String(error))\n }\n process.exit(1)\n })\n\nasync function runVitest(\n coverage: CoverageState,\n combinedConfig: CoverageConfig | null,\n userArgs: string[],\n { disableCoverage = false }: { disableCoverage?: boolean } = {},\n): Promise<void> {\n const vitestArgs = [\"run\", \"--passWithNoTests\"]\n const vitestConfig = resolveVitestConfig()\n\n const hasCustomConfig = userArgs.some((arg) => {\n if (arg === \"--config\" || arg === \"-c\") {\n return true\n }\n return arg.startsWith(\"--config=\")\n })\n\n if (vitestConfig && !hasCustomConfig) {\n vitestArgs.push(\"--config\", vitestConfig)\n }\n vitestArgs.push(...userArgs)\n\n const launcher = resolveVitestLauncher()\n const env = withRegisterShim(process.env)\n\n if (disableCoverage) {\n env.RB_DISABLE_COVERAGE = \"1\"\n }\n\n if (coverage?.enabled && !disableCoverage) {\n // Vitest runs in a Node.js process, so we use Node's built-in V8 coverage output (NODE_V8_COVERAGE) here.\n // Playwright coverage is collected separately via CDP in Chromium; server coverage is handled via /api/dev/coverage start/stop.\n const nodeCoverageDir = resolveNodeCoverageDir(combinedConfig ?? coverage.config)\n await fsPromises.mkdir(nodeCoverageDir, { recursive: true })\n env.NODE_V8_COVERAGE = nodeCoverageDir\n }\n\n await spawnWithLogs({\n name: \"Vitest\",\n launcher,\n args: vitestArgs,\n env,\n successMessage: \"Vitest suite passed!\",\n failureMessage: \"Vitest failed\",\n })\n\n if (coverage?.enabled && !disableCoverage) {\n await convertNodeCoverage({\n config: combinedConfig ?? coverage.config,\n nodeCoverageDir: resolveNodeCoverageDir(combinedConfig ?? coverage.config),\n })\n }\n}\n\nasync function buildSpecsMapFromCoverage({\n userArgs,\n combinedCoverage,\n}: {\n userArgs: string[]\n combinedCoverage: CoverageState\n [key: string]: unknown\n}): Promise<void> {\n if (!combinedCoverage?.enabled) {\n throw new Error(\"[specs-map] Coverage must be enabled to build the specs map.\")\n }\n\n const config = combinedCoverage.config\n const workspaceRoot = findWorkspaceRoot(process.cwd())\n\n const specSourceFiles = await findSpecSourceFiles(config.rootDir)\n if (specSourceFiles.length === 0) {\n throw new Error(\"[specs-map] No spec files found under spec/**/*.spec{,.desktop,.mobile}.ts\")\n }\n\n const filesMapDir = path.join(config.testResultsRoot, \"files-map\")\n await fsPromises.rm(filesMapDir, { recursive: true, force: true })\n await fsPromises.mkdir(filesMapDir, { recursive: true })\n\n for (const specSourceFile of specSourceFiles) {\n const specProjectPath = path.relative(config.rootDir, specSourceFile)\n const specWorkspacePath = toPosixPath(path.relative(workspaceRoot, specSourceFile))\n const testFile = resolvePlaywrightSpecFile(specProjectPath)\n\n console.log(`\\n[specs-map] Running ${specWorkspacePath}`)\n\n await removeCoverageFiles(config)\n\n let error = null\n let failed = false\n try {\n await runPlaywright([...userArgs, testFile])\n } catch (runError: any) {\n error = runError\n failed = true\n console.error(`[specs-map] Failed: ${specWorkspacePath}`)\n console.error(runError?.stack ?? String(runError))\n }\n\n const coveredFiles = await collectCoveredFiles(config)\n const impactedFiles = coveredFiles\n .map((filePath) => toPosixPath(path.relative(workspaceRoot, filePath)))\n .filter((relativePath) => relativePath && !relativePath.startsWith(\"../\") && relativePath !== \"..\")\n .sort()\n\n const outputFile = path.join(filesMapDir, `${specProjectPath}.json`)\n await fsPromises.mkdir(path.dirname(outputFile), { recursive: true })\n await fsPromises.writeFile(\n outputFile,\n JSON.stringify(\n {\n spec: specWorkspacePath,\n files: impactedFiles,\n failed,\n },\n null,\n 2,\n ),\n \"utf8\",\n )\n\n if (failed) {\n throw error\n }\n }\n}\n\ntype GitChange =\n | { kind: \"rename\"; oldPath: string; newPath: string }\n | { kind: \"path\"; path: string }\n\nasync function resolveAutoPlaywrightArgs({\n userArgs,\n playwrightCoverage,\n vitestCoverage,\n showMapping = false,\n listOnly = false,\n}: {\n userArgs: string[]\n playwrightCoverage: CoverageState\n vitestCoverage: CoverageState\n showMapping?: boolean\n listOnly?: boolean\n [key: string]: unknown\n}): Promise<string[] | null> {\n const config = playwrightCoverage?.config ?? vitestCoverage?.config ?? null\n if (!config) {\n console.warn(\"[auto] Coverage config not found; running full Playwright suite.\")\n return userArgs\n }\n\n const filesMapDir = path.join(config.testResultsRoot, \"files-map\")\n const mapFiles = await findFilesMapJson(filesMapDir)\n if (mapFiles.length === 0) {\n console.warn(\"[auto] Specs map not found; running full Playwright suite.\")\n return userArgs\n }\n\n const workspaceRoot = findWorkspaceRoot(process.cwd())\n const gitChanges = getGitChanges(workspaceRoot)\n const renameMap = new Map<string, string>(\n gitChanges\n .filter((change): change is { kind: \"rename\"; oldPath: string; newPath: string } => change.kind === \"rename\")\n .map((change) => [change.oldPath, change.newPath]),\n )\n\n const specRootAbs = path.join(config.rootDir, \"spec\")\n const matchesCollectCoverageFrom = createCollectCoverageMatcher(config.collectCoverageFrom, config.rootDir)\n\n const directSpecChanges = new Set<string>()\n const sourceChanges: GitChange[] = []\n\n for (const change of gitChanges) {\n if (change.kind === \"rename\") {\n const oldAbs = path.join(workspaceRoot, change.oldPath)\n const newAbs = path.join(workspaceRoot, change.newPath)\n\n if (isSpecSourceFile(newAbs, specRootAbs) && fs.existsSync(newAbs)) {\n directSpecChanges.add(change.newPath)\n }\n\n const oldMatches = matchesCollectCoverageFrom(oldAbs)\n const newMatches = matchesCollectCoverageFrom(newAbs)\n if (oldMatches || newMatches) {\n sourceChanges.push(change)\n }\n continue\n }\n\n const abs = path.join(workspaceRoot, change.path)\n\n if (isSpecSourceFile(abs, specRootAbs) && fs.existsSync(abs)) {\n directSpecChanges.add(change.path)\n }\n\n if (matchesCollectCoverageFrom(abs)) {\n sourceChanges.push(change)\n }\n }\n\n if (directSpecChanges.size === 0 && sourceChanges.length === 0) {\n if (listOnly) {\n console.log(\"[auto] No relevant git changes.\")\n console.log(\"[list] No matched spec files.\")\n return null\n }\n console.warn(\"[auto] No relevant git changes; running full Playwright suite.\")\n return userArgs\n }\n\n const parsedMaps: Array<{ spec: string; files: string[] }> = []\n for (const file of mapFiles) {\n const json = await readJson(file)\n if (!json) {\n continue\n }\n\n if (json.failed === true) {\n console.warn(\"[auto] Specs map contains failed entries; running full Playwright suite.\")\n return userArgs\n }\n\n const spec = typeof json?.spec === \"string\" ? json.spec : null\n if (!spec) {\n continue\n }\n\n const files = Array.isArray(json?.files)\n ? (json.files as unknown[]).filter((entry): entry is string => typeof entry === \"string\")\n : []\n parsedMaps.push({ spec, files })\n }\n\n if (parsedMaps.length === 0) {\n console.warn(\"[auto] Specs map is empty; running full Playwright suite.\")\n return userArgs\n }\n\n const specsByImpactedFile = new Map<string, string[]>()\n\n for (const entry of parsedMaps) {\n const resolvedSpec = resolveRenamedPath(entry.spec, renameMap)\n for (const file of entry.files) {\n const list = specsByImpactedFile.get(file) ?? []\n list.push(resolvedSpec)\n specsByImpactedFile.set(file, list)\n }\n }\n\n const unmappedSourceChanges = sourceChanges.filter((change) => {\n if (change.kind === \"path\") {\n return !specsByImpactedFile.has(change.path)\n }\n return !specsByImpactedFile.has(change.oldPath) && !specsByImpactedFile.has(change.newPath)\n })\n\n if (unmappedSourceChanges.length > 0) {\n console.warn(\"[auto] Unmapped source changes detected:\")\n for (const change of unmappedSourceChanges) {\n if (change.kind === \"path\") {\n console.warn(` - ${change.path}`)\n } else {\n console.warn(` - ${change.oldPath} -> ${change.newPath}`)\n }\n }\n }\n\n const selectedSpecs = new Set<string>(directSpecChanges)\n const triggersBySpec = new Map<string, Set<string>>()\n\n for (const spec of directSpecChanges) {\n if (showMapping) {\n triggersBySpec.set(spec, new Set([spec]))\n }\n }\n\n for (const change of sourceChanges) {\n if (change.kind === \"path\") {\n const specs = specsByImpactedFile.get(change.path) ?? []\n specs.forEach((spec) => selectedSpecs.add(spec))\n if (showMapping) {\n for (const spec of specs) {\n const current = triggersBySpec.get(spec) ?? new Set()\n current.add(change.path)\n triggersBySpec.set(spec, current)\n }\n }\n continue\n }\n\n const oldSpecs = specsByImpactedFile.get(change.oldPath) ?? []\n oldSpecs.forEach((spec) => selectedSpecs.add(spec))\n const newSpecs = specsByImpactedFile.get(change.newPath) ?? []\n newSpecs.forEach((spec) => selectedSpecs.add(spec))\n if (showMapping) {\n const key = `${change.oldPath} -> ${change.newPath}`\n const allSpecs = new Set([...oldSpecs, ...newSpecs])\n for (const spec of allSpecs) {\n const current = triggersBySpec.get(spec) ?? new Set()\n current.add(key)\n triggersBySpec.set(spec, current)\n }\n }\n }\n\n const missingSpecs: string[] = []\n const specsToRun = Array.from(selectedSpecs)\n .filter((spec) => {\n const abs = path.join(workspaceRoot, spec)\n if (fs.existsSync(abs)) {\n return true\n }\n missingSpecs.push(spec)\n return false\n })\n .sort()\n if (missingSpecs.length > 0) {\n console.warn(`[auto] Ignoring ${missingSpecs.length} missing spec file(s):`)\n for (const spec of missingSpecs.sort()) {\n console.warn(` - ${spec}`)\n }\n }\n\n if (specsToRun.length === 0) {\n if (listOnly) {\n console.log(\"[list] No matched spec files.\")\n return null\n }\n console.log(\"[auto] No impacted specs.\")\n return null\n }\n\n if (showMapping) {\n console.log(\"[auto] Mapping:\")\n for (const spec of specsToRun) {\n const triggers = Array.from(triggersBySpec.get(spec) ?? []).sort()\n if (triggers.length === 0) {\n continue\n }\n console.log(` - ${spec}`)\n for (const trigger of triggers) {\n console.log(` <- ${trigger}`)\n }\n }\n }\n\n const playwrightFiles = specsToRun\n .map((specWorkspacePath) => path.join(workspaceRoot, specWorkspacePath))\n .filter((specAbs) => isSubpath(specAbs, config.rootDir))\n .map((specAbs) => {\n const specProjectPath = path.relative(config.rootDir, specAbs)\n return resolvePlaywrightSpecFile(specProjectPath)\n })\n\n if (playwrightFiles.length === 0) {\n if (listOnly) {\n console.log(\"[list] No matched spec files.\")\n return null\n }\n console.log(\"[auto] No impacted specs.\")\n return null\n }\n\n const totalSpecFiles = (await findSpecSourceFiles(config.rootDir)).length\n\n if (listOnly) {\n console.log(`[auto] Selected ${playwrightFiles.length}/${totalSpecFiles} spec file(s):`)\n for (const playwrightFile of playwrightFiles) {\n console.log(` - ${playwrightFile}`)\n }\n return null\n }\n\n console.log(`[auto] Running ${playwrightFiles.length}/${totalSpecFiles} spec file(s).`)\n return [...userArgs, ...playwrightFiles]\n}\n\nasync function findFilesMapJson(filesMapDir: string): Promise<string[]> {\n const patterns = [\"spec/**/*.spec{,.desktop,.mobile}.ts.json\", \"spec/**/*.spec{,.desktop,.mobile}.tsx.json\"]\n const matches = await fg(patterns, { cwd: filesMapDir, absolute: true, onlyFiles: true }).catch(() => [])\n return matches.sort()\n}\n\nasync function listPlaywrightSpecFiles(projectRoot: string): Promise<void> {\n const specSourceFiles = await findSpecSourceFiles(projectRoot)\n if (specSourceFiles.length === 0) {\n console.log(\"[list] No spec files found.\")\n return\n }\n\n const playwrightFiles = specSourceFiles\n .map((specSourceFile) => path.relative(projectRoot, specSourceFile))\n .map((specProjectPath) => resolvePlaywrightSpecFile(specProjectPath))\n\n console.log(`[list] Selected ${playwrightFiles.length} spec file(s):`)\n for (const playwrightFile of playwrightFiles) {\n console.log(` - ${playwrightFile}`)\n }\n}\n\nfunction getGitChanges(workspaceRoot: string): GitChange[] {\n const result = spawnSync(\"git\", [\"status\", \"--porcelain=1\", \"-z\"], {\n cwd: workspaceRoot,\n encoding: \"utf8\",\n })\n\n if (result.status !== 0) {\n throw new Error(`[auto] Failed to read git status: ${result.stderr || \"unknown error\"}`)\n }\n\n const tokens = String(result.stdout ?? \"\").split(\"\\0\").filter(Boolean)\n const changes: GitChange[] = []\n\n for (let i = 0; i < tokens.length; i += 1) {\n const record = tokens[i]\n if (record.length < 4) {\n continue\n }\n\n const status = record.slice(0, 2)\n const pathPart = toPosixPath(record.slice(3))\n\n if (isRenameOrCopyStatus(status)) {\n const next = tokens[i + 1]\n if (typeof next !== \"string\") {\n continue\n }\n changes.push({\n kind: \"rename\",\n oldPath: pathPart,\n newPath: toPosixPath(next),\n })\n i += 1\n continue\n }\n\n changes.push({\n kind: \"path\",\n path: pathPart,\n })\n }\n\n return changes\n}\n\nfunction isRenameOrCopyStatus(status: string): boolean {\n return status.includes(\"R\") || status.includes(\"C\")\n}\n\nfunction resolveRenamedPath(original: string, renameMap: Map<string, string>): string {\n let current = original\n const visited = new Set<string>()\n\n while (!visited.has(current)) {\n const next = renameMap.get(current)\n if (!next) {\n break\n }\n visited.add(current)\n current = next\n }\n\n return current\n}\n\nfunction isSubpath(candidate: string, root: string): boolean {\n const relative = path.relative(root, candidate)\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n}\n\nfunction isSpecSourceFile(absolutePath: string, specRootAbsolute: string): boolean {\n if (!isSubpath(absolutePath, specRootAbsolute)) {\n return false\n }\n\n return /\\.spec(?:\\.(?:desktop|mobile))?\\.tsx?$/.test(absolutePath)\n}\n\nasync function findSpecSourceFiles(projectRoot: string): Promise<string[]> {\n const patterns = [\"spec/**/*.spec{,.desktop,.mobile}.ts\", \"spec/**/*.spec{,.desktop,.mobile}.tsx\"]\n const matches = await fg(patterns, { cwd: projectRoot, absolute: true, onlyFiles: true })\n return matches.sort()\n}\n\nfunction resolvePlaywrightSpecFile(specProjectPath: string): string {\n const buildSpecRoot = path.join(process.cwd(), \"build\", \"spec\")\n const isBuildSpecProject = fs.existsSync(buildSpecRoot)\n\n if (!isBuildSpecProject) {\n return specProjectPath\n }\n\n const builtCandidate = normalizeBuiltSpecPath(path.join(\"build\", specProjectPath))\n const builtAbsolute = path.resolve(process.cwd(), builtCandidate)\n if (!fs.existsSync(builtAbsolute)) {\n throw new Error(`[specs-map] Missing built spec file: ${builtCandidate}`)\n }\n\n return builtCandidate\n}\n\nfunction normalizeBuiltSpecPath(filePath: string): string {\n if (filePath.endsWith(\".ts\") || filePath.endsWith(\".tsx\")) {\n return `${filePath.replace(/\\.tsx?$/, \"\")}.js`\n }\n return filePath\n}\n\nfunction toPosixPath(input: unknown): string {\n return String(input ?? \"\").split(path.sep).join(\"/\")\n}\n\nfunction findWorkspaceRoot(projectRoot: string): string {\n let dir = path.resolve(projectRoot)\n\n while (true) {\n const pkgPath = path.join(dir, \"package.json\")\n try {\n if (fs.existsSync(pkgPath)) {\n const parsed = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"))\n if (parsed && typeof parsed === \"object\" && parsed.workspaces) {\n return dir\n }\n }\n } catch {\n //\n }\n\n const parent = path.dirname(dir)\n if (parent === dir) {\n return path.resolve(projectRoot)\n }\n dir = parent\n }\n}\n\nfunction runPlaywright(\n userArgs: string[],\n { disableCoverage = false }: { disableCoverage?: boolean } = {},\n): Promise<void> {\n // Determine config file path\n const configPath = fs.existsSync(\n path.join(process.cwd(), \"playwright.config.ts\"),\n )\n ? path.join(process.cwd(), \"playwright.config.ts\")\n : path.join(moduleDir, \"playwright.config.ts\")\n\n const hasCustomConfig = userArgs.some((arg) => {\n if (arg === \"--config\" || arg === \"-c\") {\n return true\n }\n\n return arg.startsWith(\"--config=\")\n })\n\n const playwrightArgs = [\"test\"]\n\n if (!hasCustomConfig) {\n playwrightArgs.push(\"--config\", configPath)\n }\n\n playwrightArgs.push(...userArgs)\n\n ensureJsxRuntimeShim(process.cwd())\n const launcher = resolvePlaywrightLauncher()\n const env = withRegisterShim(process.env)\n env[COMBINED_COVERAGE_ENV_VAR] = \"1\"\n if (disableCoverage) {\n env.RB_DISABLE_COVERAGE = \"1\"\n }\n\n return spawnWithLogs({\n name: \"Playwright\",\n launcher,\n args: playwrightArgs,\n env,\n successMessage: \"Playwright suite passed!\",\n failureMessage: \"Playwright failed\",\n })\n}\n\ntype SpawnLauncher = {\n command: string\n args?: string[]\n}\n\nfunction resolvePlaywrightLauncher(): SpawnLauncher {\n const cliPath = resolveCliPath()\n if (cliPath) {\n return {\n command: process.execPath,\n args: [cliPath],\n }\n }\n\n const localBin = path.resolve(process.cwd(), \"node_modules/.bin/playwright\")\n if (fs.existsSync(localBin)) {\n return {\n command: localBin,\n args: [],\n }\n }\n\n return {\n command: \"playwright\",\n args: [],\n }\n}\n\nfunction resolveCliPath(): string | null {\n const searchRoots = [process.cwd(), moduleDir]\n\n for (const base of searchRoots) {\n try {\n const pkgPath = require.resolve(\"@playwright/test/package.json\", { paths: [base] })\n const cliPath = path.join(path.dirname(pkgPath), \"cli.js\")\n if (fs.existsSync(cliPath)) {\n return cliPath\n }\n } catch (_error) {\n // continue searching\n }\n }\n\n return null\n}\n\nfunction resolveVitestLauncher(): SpawnLauncher {\n const searchRoots = [process.cwd(), moduleDir]\n\n for (const base of searchRoots) {\n try {\n const pkgPath = require.resolve(\"vitest/package.json\", { paths: [base] })\n const pkgDir = path.dirname(pkgPath)\n const pkgJson = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"))\n const binPath = typeof pkgJson.bin === \"string\" ? pkgJson.bin : pkgJson.bin?.vitest\n if (binPath) {\n return {\n command: process.execPath,\n args: [path.join(pkgDir, binPath)],\n }\n }\n } catch (_error) {\n // continue searching\n }\n }\n\n const localBin = path.resolve(process.cwd(), \"node_modules/.bin/vitest\")\n if (fs.existsSync(localBin)) {\n return {\n command: localBin,\n args: [],\n }\n }\n\n return {\n command: \"vitest\",\n args: [],\n }\n}\n\nfunction resolveVitestConfig(): string | null {\n const userConfig = findVitestConfig(process.cwd())\n if (userConfig) {\n return userConfig\n }\n\n const bundledConfig = path.join(moduleDir, \"vitest.config.js\")\n return fs.existsSync(bundledConfig) ? bundledConfig : null\n}\n\nfunction findVitestConfig(baseDir: string): string | null {\n const candidates = [\n \"vitest.config.ts\",\n \"vitest.config.js\",\n \"vitest.config.mjs\",\n ]\n\n for (const file of candidates) {\n const fullPath = path.join(baseDir, file)\n if (fs.existsSync(fullPath)) {\n return fullPath\n }\n }\n\n return null\n}\n\nasync function loadVitestCoverageConfig(): Promise<CoverageState> {\n const options = await loadCoverageOptions({\n optional: true,\n candidates: VITEST_COVERAGE_CANDIDATES,\n })\n if (!options) {\n return null\n }\n\n const config = createCoverageConfig(options)\n\n return {\n config,\n enabled: config.coverageEnabled,\n }\n}\n\nasync function loadPlaywrightCoverageConfig(): Promise<CoverageState> {\n const options = await loadCoverageOptions({ optional: true })\n if (!options) {\n return null\n }\n\n const config = createCoverageConfig(options)\n\n return {\n config,\n enabled: config.coverageEnabled,\n }\n}\n\nfunction resolveCombinedCoverage(playwrightCoverage: CoverageState, vitestCoverage: CoverageState): CoverageState {\n if (playwrightCoverage?.enabled) {\n return playwrightCoverage\n }\n\n if (vitestCoverage?.enabled) {\n return vitestCoverage\n }\n\n return null\n}\n\nasync function cleanCoverageArtifacts(config: CoverageConfig): Promise<void> {\n await removeCoverageFiles(config)\n await fsPromises.rm(config.coverageReportDir, { recursive: true, force: true })\n await fsPromises.rm(resolveNodeCoverageDir(config), { recursive: true, force: true })\n}\n\nfunction resolveNodeCoverageDir(config: CoverageConfig): string {\n return path.join(config.rootDir, \"build\", \"vitest\", \"test-results\", \"node-coverage\")\n}\n\nasync function convertNodeCoverage(coverage: { config: CoverageConfig; nodeCoverageDir: string }): Promise<void> {\n const { config, nodeCoverageDir } = coverage\n\n const entries = await fsPromises.readdir(nodeCoverageDir).catch(() => [])\n const scripts = []\n const scriptRoots = resolveCollectCoverageRoots(config.collectCoverageFrom, config.rootDir)\n\n for (const entry of entries) {\n if (!entry.endsWith(\".json\")) {\n continue\n }\n\n const fullPath = path.join(nodeCoverageDir, entry)\n const payload = await readJson(fullPath)\n const results = Array.isArray(payload?.result) ? payload.result : []\n\n for (const script of results) {\n const normalized = normalizeNodeScriptUrl(script.url, config.rootDir)\n if (!normalized) {\n continue\n }\n\n if (isNodeModulesPath(normalized.absolutePath)) {\n continue\n }\n\n if (!isInsideAnyRoot(normalized.absolutePath, scriptRoots)) {\n continue\n }\n\n const source = await fsPromises.readFile(normalized.absolutePath, \"utf8\").catch(() => \"\")\n\n scripts.push({\n absolutePath: normalized.absolutePath,\n relativePath: normalized.relativePath,\n source,\n functions: script.functions ?? [],\n url: script.url,\n })\n }\n }\n\n if (scripts.length === 0) {\n return\n }\n\n const outDir = path.join(config.rootDir, \"build\", \"vitest\", \"coverage\")\n await fsPromises.mkdir(outDir, { recursive: true })\n const outputFile = path.join(outDir, config.coverageFileName)\n await fsPromises.writeFile(outputFile, JSON.stringify({ testId: \"vitest\", scripts }, null, 2), \"utf8\")\n}\n\nasync function finalizeCoverage(config: CoverageConfig): Promise<void> {\n try {\n await generateCoverageReport(config)\n } catch (error: any) {\n if (error instanceof CoverageThresholdError) {\n console.error(error.message)\n }\n throw error\n }\n}\n\nasync function readJson(filePath: string): Promise<any | null> {\n try {\n const raw = await fsPromises.readFile(filePath, \"utf8\")\n return JSON.parse(raw)\n } catch {\n return null\n }\n}\n\nfunction normalizeNodeScriptUrl(\n rawUrl: string,\n rootDir: string,\n): { absolutePath: string; relativePath: string } | null {\n if (!rawUrl || rawUrl.startsWith(\"node:\")) {\n return null\n }\n\n let absolutePath = null\n\n try {\n if (rawUrl.startsWith(\"file://\")) {\n absolutePath = fileURLToPath(rawUrl)\n }\n } catch (_err) {\n // ignore invalid URLs\n }\n\n if (!absolutePath && path.isAbsolute(rawUrl)) {\n absolutePath = rawUrl\n }\n\n if (!absolutePath) {\n return null\n }\n\n const normalized = path.normalize(absolutePath)\n\n return {\n absolutePath: normalized,\n relativePath: path.relative(rootDir, normalized),\n }\n}\n\nfunction isNodeModulesPath(filePath: unknown): boolean {\n return path\n .normalize(String(filePath ?? \"\"))\n .split(path.sep)\n .includes(\"node_modules\")\n}\n\nfunction spawnWithLogs({\n name,\n launcher,\n args,\n env,\n successMessage,\n failureMessage,\n}: {\n name: string\n launcher: SpawnLauncher\n args: string[]\n env: NodeJS.ProcessEnv\n successMessage?: string\n failureMessage?: string\n}): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const stdoutBuffer: string[] = []\n const stderrBuffer: string[] = []\n\n const child = spawn(\n launcher.command,\n [...(launcher.args || []), ...args],\n {\n shell: false,\n env,\n },\n )\n\n child.stdout?.on(\"data\", (data) => {\n if (!isAider) {\n process.stdout.write(data)\n }\n stdoutBuffer.push(data.toString())\n })\n\n child.stderr?.on(\"data\", (data) => {\n if (!isAider) {\n process.stderr.write(data)\n }\n stderrBuffer.push(data.toString())\n })\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n if (successMessage) {\n console.log(successMessage)\n }\n resolve()\n } else {\n console.error(failureMessage || `${name} failed:`)\n\n if (isAider) {\n if (stdoutBuffer.length > 0) {\n console.error(stdoutBuffer.join(\"\"))\n }\n\n if (stderrBuffer.length > 0) {\n console.error(stderrBuffer.join(\"\"))\n }\n }\n\n reject(new Error(`${name} failed with exit code: ${code}`))\n }\n })\n\n child.on(\"error\", (error) => {\n console.error(`Error spawning ${name}:`, error)\n reject(error)\n })\n })\n}\n\nfunction withRegisterShim(baseEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const nodeOptions = appendNodeRequire(baseEnv.NODE_OPTIONS, path.join(moduleDir, \"register-tty.cjs\"))\n return {\n ...baseEnv,\n NODE_OPTIONS: nodeOptions,\n }\n}\n\nfunction ensureJsxRuntimeShim(projectRoot: string): void {\n const shimDir = path.join(projectRoot, \"node_modules\", \"playwright\")\n fs.mkdirSync(shimDir, { recursive: true })\n const shims = [\n { file: \"jsx-runtime.js\", target: \"react/jsx-runtime\" },\n { file: \"jsx-dev-runtime.js\", target: \"react/jsx-dev-runtime\" },\n ]\n\n for (const { file, target } of shims) {\n const filePath = path.join(shimDir, file)\n if (!fs.existsSync(filePath)) {\n const content = `export * from \"${target}\";\\nexport { default } from \"${target}\";\\n`\n fs.writeFileSync(filePath, content, \"utf8\")\n }\n }\n}\n\nfunction appendNodeRequire(existing: string | undefined, modulePath: string): string {\n const flag = `--require=${modulePath}`\n if (!existing || existing.length === 0) {\n return flag\n }\n return `${existing} ${flag}`\n}\n"],"names":["require","createRequire","import","url","moduleDir","path","dirname","fileURLToPath","shouldForceTty","process","stdout","isTTY","env","FORCE_COLOR","VITEST_COVERAGE_CANDIDATES","COMBINED_COVERAGE_ENV_VAR","isAider","IS_AIDER","undefined","console","warn","parseCliArgs","rawArgs","yargs","parsed","help","version","strict","exitProcess","parserConfiguration","option","type","default","parseSync","full","Boolean","auto","passthroughArgs","Array","isArray","_","map","entry","String","buildSpecsMap","showMapping","list","runTests","args","argv","slice","filteredArgs","Error","playwrightCoverage","loadPlaywrightCoverageConfig","vitestCoverage","loadVitestCoverageConfig","combinedCoverage","resolveCombinedCoverage","buildSpecsMapFromCoverage","userArgs","resolveAutoPlaywrightArgs","listOnly","listPlaywrightSpecFiles","config","rootDir","cwd","shouldGenerateCoverageReport","enabled","cleanCoverageArtifacts","testError","runVitest","disableCoverage","log","playwrightArgs","runPlaywright","error","finalizeCoverage","then","exit","catch","CoverageThresholdError","stack","coverage","combinedConfig","vitestArgs","vitestConfig","resolveVitestConfig","hasCustomConfig","some","arg","startsWith","push","launcher","resolveVitestLauncher","withRegisterShim","RB_DISABLE_COVERAGE","nodeCoverageDir","resolveNodeCoverageDir","fsPromises","mkdir","recursive","NODE_V8_COVERAGE","spawnWithLogs","name","successMessage","failureMessage","convertNodeCoverage","workspaceRoot","findWorkspaceRoot","specSourceFiles","findSpecSourceFiles","length","filesMapDir","join","testResultsRoot","rm","force","specSourceFile","specProjectPath","relative","specWorkspacePath","toPosixPath","testFile","resolvePlaywrightSpecFile","removeCoverageFiles","failed","runError","coveredFiles","collectCoveredFiles","impactedFiles","filePath","filter","relativePath","sort","outputFile","writeFile","JSON","stringify","spec","files","mapFiles","findFilesMapJson","gitChanges","getGitChanges","renameMap","Map","change","kind","oldPath","newPath","specRootAbs","matchesCollectCoverageFrom","createCollectCoverageMatcher","collectCoverageFrom","directSpecChanges","Set","sourceChanges","oldAbs","newAbs","isSpecSourceFile","fs","existsSync","add","oldMatches","newMatches","abs","size","parsedMaps","file","json","readJson","specsByImpactedFile","resolvedSpec","resolveRenamedPath","get","set","unmappedSourceChanges","has","selectedSpecs","triggersBySpec","specs","forEach","current","oldSpecs","newSpecs","key","allSpecs","missingSpecs","specsToRun","from","triggers","trigger","playwrightFiles","specAbs","isSubpath","totalSpecFiles","playwrightFile","patterns","matches","fg","absolute","onlyFiles","projectRoot","result","spawnSync","encoding","status","stderr","tokens","split","changes","i","record","pathPart","isRenameOrCopyStatus","next","includes","original","visited","candidate","root","isAbsolute","absolutePath","specRootAbsolute","test","buildSpecRoot","isBuildSpecProject","builtCandidate","normalizeBuiltSpecPath","builtAbsolute","resolve","endsWith","replace","input","sep","dir","pkgPath","parse","readFileSync","workspaces","parent","configPath","ensureJsxRuntimeShim","resolvePlaywrightLauncher","cliPath","resolveCliPath","command","execPath","localBin","searchRoots","base","paths","_error","pkgDir","pkgJson","binPath","bin","vitest","userConfig","findVitestConfig","bundledConfig","baseDir","candidates","fullPath","options","loadCoverageOptions","optional","createCoverageConfig","coverageEnabled","coverageReportDir","entries","readdir","scripts","scriptRoots","resolveCollectCoverageRoots","payload","results","script","normalized","normalizeNodeScriptUrl","isNodeModulesPath","isInsideAnyRoot","source","readFile","functions","outDir","coverageFileName","testId","generateCoverageReport","message","raw","rawUrl","_err","normalize","Promise","reject","stdoutBuffer","stderrBuffer","child","spawn","shell","on","data","write","toString","code","baseEnv","nodeOptions","appendNodeRequire","NODE_OPTIONS","shimDir","mkdirSync","shims","target","content","writeFileSync","existing","modulePath","flag"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/test",
3
- "version": "0.336.0",
3
+ "version": "0.337.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -62,20 +62,20 @@
62
62
  }
63
63
  },
64
64
  "peerDependencies": {
65
- "@rpcbase/env": "*",
66
65
  "mongoose": "^9"
67
66
  },
68
67
  "dependencies": {
69
- "@playwright/test": "1.58.2",
70
- "esbuild": "0.27.3",
68
+ "@playwright/test": "1.57.0",
69
+ "esbuild": "0.27.2",
71
70
  "fast-glob": "3.3.3",
72
71
  "istanbul-lib-coverage": "3.2.2",
73
72
  "istanbul-lib-instrument": "6.0.3",
74
73
  "istanbul-lib-report": "3.0.1",
75
74
  "istanbul-reports": "3.2.0",
76
- "lodash": "4.17.23",
75
+ "lodash": "4.17.21",
77
76
  "picomatch": "4.0.3",
78
77
  "v8-to-istanbul": "9.3.0",
79
- "vitest": "4.0.18"
78
+ "vitest": "4.0.16",
79
+ "yargs": "18.0.0"
80
80
  }
81
81
  }
@@ -1,15 +0,0 @@
1
- export type SpecsMapEntry = {
2
- spec: string;
3
- files: string[];
4
- failed: boolean;
5
- };
6
- export type SpecsMapIndex = {
7
- version: 1;
8
- generatedAt: string;
9
- specs: SpecsMapEntry[];
10
- byFile: Record<string, string[]>;
11
- };
12
- export declare function createSpecsByFileRecord(entries: Map<string, string[]>): Record<string, string[]>;
13
- export declare function readSpecsMapIndex(indexPath: string): Promise<SpecsMapIndex | null>;
14
- export declare function warnSpecsMapOutdated(indexPath: string, reason: string): void;
15
- //# sourceMappingURL=specs-map.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"specs-map.d.ts","sourceRoot":"","sources":["../src/specs-map.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,CAAC,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CACjC,CAAA;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAOhG;AAED,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAMxF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI5E"}
package/dist/specs-map.js DELETED
@@ -1,50 +0,0 @@
1
- import fs from "node:fs/promises";
2
- function createSpecsByFileRecord(entries) {
3
- const out = {};
4
- for (const file of Array.from(entries.keys()).sort()) {
5
- const specs = entries.get(file) ?? [];
6
- out[file] = specs.sort();
7
- }
8
- return out;
9
- }
10
- async function readSpecsMapIndex(indexPath) {
11
- const raw = await readJson(indexPath);
12
- if (!raw || !isValidSpecsMapIndex(raw)) {
13
- return null;
14
- }
15
- return raw;
16
- }
17
- function warnSpecsMapOutdated(indexPath, reason) {
18
- console.warn(`[auto] Specs map index is unavailable or outdated: ${reason}`);
19
- console.warn(`[auto] Expected index at ${indexPath}`);
20
- console.warn("[auto] Rebuild with: rb-test --build-specs-map");
21
- }
22
- function isValidSpecsMapIndex(raw) {
23
- if (!raw || typeof raw !== "object") {
24
- return false;
25
- }
26
- if (raw.version !== 1) {
27
- return false;
28
- }
29
- if (!Array.isArray(raw.specs)) {
30
- return false;
31
- }
32
- if (raw.byFile === void 0 || raw.byFile === null || typeof raw.byFile !== "object") {
33
- return false;
34
- }
35
- return true;
36
- }
37
- async function readJson(filePath) {
38
- try {
39
- const raw = await fs.readFile(filePath, "utf8");
40
- return JSON.parse(raw);
41
- } catch {
42
- return null;
43
- }
44
- }
45
- export {
46
- createSpecsByFileRecord,
47
- readSpecsMapIndex,
48
- warnSpecsMapOutdated
49
- };
50
- //# sourceMappingURL=specs-map.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"specs-map.js","sources":["../src/specs-map.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\n\n\nexport type SpecsMapEntry = {\n spec: string\n files: string[]\n failed: boolean\n}\n\nexport type SpecsMapIndex = {\n version: 1\n generatedAt: string\n specs: SpecsMapEntry[]\n byFile: Record<string, string[]>\n}\n\nexport function createSpecsByFileRecord(entries: Map<string, string[]>): Record<string, string[]> {\n const out: Record<string, string[]> = {}\n for (const file of Array.from(entries.keys()).sort()) {\n const specs = entries.get(file) ?? []\n out[file] = specs.sort()\n }\n return out\n}\n\nexport async function readSpecsMapIndex(indexPath: string): Promise<SpecsMapIndex | null> {\n const raw = await readJson(indexPath)\n if (!raw || !isValidSpecsMapIndex(raw)) {\n return null\n }\n return raw\n}\n\nexport function warnSpecsMapOutdated(indexPath: string, reason: string): void {\n console.warn(`[auto] Specs map index is unavailable or outdated: ${reason}`)\n console.warn(`[auto] Expected index at ${indexPath}`)\n console.warn(\"[auto] Rebuild with: rb-test --build-specs-map\")\n}\n\nfunction isValidSpecsMapIndex(raw: any): raw is SpecsMapIndex {\n if (!raw || typeof raw !== \"object\") {\n return false\n }\n if (raw.version !== 1) {\n return false\n }\n if (!Array.isArray(raw.specs)) {\n return false\n }\n if (raw.byFile === undefined || raw.byFile === null || typeof raw.byFile !== \"object\") {\n return false\n }\n return true\n}\n\nasync function readJson(filePath: string): Promise<unknown | null> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\")\n return JSON.parse(raw)\n } catch {\n return null\n }\n}\n"],"names":["createSpecsByFileRecord","entries","out","file","Array","from","keys","sort","specs","get","readSpecsMapIndex","indexPath","raw","readJson","isValidSpecsMapIndex","warnSpecsMapOutdated","reason","console","warn","version","isArray","byFile","undefined","filePath","fs","readFile","JSON","parse"],"mappings":";AAgBO,SAASA,wBAAwBC,SAA0D;AAChG,QAAMC,MAAgC,CAAA;AACtC,aAAWC,QAAQC,MAAMC,KAAKJ,QAAQK,MAAM,EAAEC,QAAQ;AACpD,UAAMC,QAAQP,QAAQQ,IAAIN,IAAI,KAAK,CAAA;AACnCD,QAAIC,IAAI,IAAIK,MAAMD,KAAAA;AAAAA,EACpB;AACA,SAAOL;AACT;AAEA,eAAsBQ,kBAAkBC,WAAkD;AACxF,QAAMC,MAAM,MAAMC,SAASF,SAAS;AACpC,MAAI,CAACC,OAAO,CAACE,qBAAqBF,GAAG,GAAG;AACtC,WAAO;AAAA,EACT;AACA,SAAOA;AACT;AAEO,SAASG,qBAAqBJ,WAAmBK,QAAsB;AAC5EC,UAAQC,KAAK,sDAAsDF,MAAM,EAAE;AAC3EC,UAAQC,KAAK,4BAA4BP,SAAS,EAAE;AACpDM,UAAQC,KAAK,gDAAgD;AAC/D;AAEA,SAASJ,qBAAqBF,KAAgC;AAC5D,MAAI,CAACA,OAAO,OAAOA,QAAQ,UAAU;AACnC,WAAO;AAAA,EACT;AACA,MAAIA,IAAIO,YAAY,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI,CAACf,MAAMgB,QAAQR,IAAIJ,KAAK,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAII,IAAIS,WAAWC,UAAaV,IAAIS,WAAW,QAAQ,OAAOT,IAAIS,WAAW,UAAU;AACrF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAeR,SAASU,UAA2C;AACjE,MAAI;AACF,UAAMX,MAAM,MAAMY,GAAGC,SAASF,UAAU,MAAM;AAC9C,WAAOG,KAAKC,MAAMf,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;"}