@rpcbase/test 0.338.0 → 0.340.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,25 +1,23 @@
1
1
  #!/usr/bin/env node
2
- import { spawnSync, spawn } from "node:child_process";
2
+ import { spawnSync } 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";
6
6
  import { createRequire } from "node:module";
7
- import { fileURLToPath } from "node:url";
8
7
  import fg from "fast-glob";
9
8
  import { createCoverageConfig } from "./coverage/config.js";
10
- import { createCollectCoverageMatcher, resolveCollectCoverageRoots, isInsideAnyRoot } from "./coverage/collect.js";
9
+ import { createCollectCoverageMatcher } from "./coverage/collect.js";
11
10
  import { loadCoverageOptions } from "./coverage/config-loader.js";
12
11
  import { removeCoverageFiles } from "./coverage/files.js";
13
12
  import { CoverageThresholdError, collectCoveredFiles, generateCoverageReport } from "./coverage/report.js";
13
+ import { runPlaywright } from "./runners/playwright.js";
14
+ import { runVitest, resolveNodeCoverageDir } from "./runners/vitest.js";
14
15
  const require$1 = createRequire(import.meta.url);
15
- const moduleDir = path.dirname(fileURLToPath(import.meta.url));
16
16
  const shouldForceTty = !process.stdout.isTTY && process.env.FORCE_COLOR === "true";
17
17
  if (shouldForceTty) {
18
18
  require$1("./register-tty.cjs");
19
19
  }
20
20
  const VITEST_COVERAGE_CANDIDATES = ["src/coverage.json"];
21
- const COMBINED_COVERAGE_ENV_VAR = "RB_TEST_COMBINED_COVERAGE";
22
- const isAider = process.env.IS_AIDER === "yes";
23
21
  if (process.env.IS_AIDER !== void 0 && process.env.IS_AIDER !== "yes") {
24
22
  console.warn("Warning: IS_AIDER is set to a value other than 'yes'.");
25
23
  }
@@ -156,48 +154,6 @@ runTests().then(() => process.exit(0)).catch((error) => {
156
154
  }
157
155
  process.exit(1);
158
156
  });
159
- async function runVitest(coverage, combinedConfig, userArgs, {
160
- disableCoverage = false
161
- } = {}) {
162
- const vitestArgs = ["run", "--passWithNoTests"];
163
- const vitestConfig = resolveVitestConfig();
164
- const hasCustomConfig = userArgs.some((arg) => {
165
- if (arg === "--config" || arg === "-c") {
166
- return true;
167
- }
168
- return arg.startsWith("--config=");
169
- });
170
- if (vitestConfig && !hasCustomConfig) {
171
- vitestArgs.push("--config", vitestConfig);
172
- }
173
- vitestArgs.push(...userArgs);
174
- const launcher = resolveVitestLauncher();
175
- const env = withRegisterShim(process.env);
176
- if (disableCoverage) {
177
- env.RB_DISABLE_COVERAGE = "1";
178
- }
179
- if (coverage?.enabled && !disableCoverage) {
180
- const nodeCoverageDir = resolveNodeCoverageDir(combinedConfig ?? coverage.config);
181
- await fs.mkdir(nodeCoverageDir, {
182
- recursive: true
183
- });
184
- env.NODE_V8_COVERAGE = nodeCoverageDir;
185
- }
186
- await spawnWithLogs({
187
- name: "Vitest",
188
- launcher,
189
- args: vitestArgs,
190
- env,
191
- successMessage: "Vitest suite passed!",
192
- failureMessage: "Vitest failed"
193
- });
194
- if (coverage?.enabled && !disableCoverage) {
195
- await convertNodeCoverage({
196
- config: combinedConfig ?? coverage.config,
197
- nodeCoverageDir: resolveNodeCoverageDir(combinedConfig ?? coverage.config)
198
- });
199
- }
200
- }
201
157
  async function buildSpecsMapFromCoverage({
202
158
  userArgs,
203
159
  combinedCoverage
@@ -585,122 +541,6 @@ function findWorkspaceRoot(projectRoot) {
585
541
  dir = parent;
586
542
  }
587
543
  }
588
- function runPlaywright(userArgs, {
589
- disableCoverage = false
590
- } = {}) {
591
- const configPath = fs$1.existsSync(path.join(process.cwd(), "playwright.config.ts")) ? path.join(process.cwd(), "playwright.config.ts") : path.join(moduleDir, "playwright.config.ts");
592
- const hasCustomConfig = userArgs.some((arg) => {
593
- if (arg === "--config" || arg === "-c") {
594
- return true;
595
- }
596
- return arg.startsWith("--config=");
597
- });
598
- const playwrightArgs = ["test"];
599
- if (!hasCustomConfig) {
600
- playwrightArgs.push("--config", configPath);
601
- }
602
- playwrightArgs.push(...userArgs);
603
- ensureJsxRuntimeShim(process.cwd());
604
- const launcher = resolvePlaywrightLauncher();
605
- const env = withRegisterShim(process.env);
606
- env[COMBINED_COVERAGE_ENV_VAR] = "1";
607
- if (disableCoverage) {
608
- env.RB_DISABLE_COVERAGE = "1";
609
- }
610
- return spawnWithLogs({
611
- name: "Playwright",
612
- launcher,
613
- args: playwrightArgs,
614
- env,
615
- successMessage: "Playwright suite passed!",
616
- failureMessage: "Playwright failed"
617
- });
618
- }
619
- function resolvePlaywrightLauncher() {
620
- const cliPath = resolveCliPath();
621
- if (cliPath) {
622
- return {
623
- command: process.execPath,
624
- args: [cliPath]
625
- };
626
- }
627
- const localBin = path.resolve(process.cwd(), "node_modules/.bin/playwright");
628
- if (fs$1.existsSync(localBin)) {
629
- return {
630
- command: localBin,
631
- args: []
632
- };
633
- }
634
- return {
635
- command: "playwright",
636
- args: []
637
- };
638
- }
639
- function resolveCliPath() {
640
- const searchRoots = [process.cwd(), moduleDir];
641
- for (const base of searchRoots) {
642
- try {
643
- const pkgPath = require$1.resolve("@playwright/test/package.json", {
644
- paths: [base]
645
- });
646
- const cliPath = path.join(path.dirname(pkgPath), "cli.js");
647
- if (fs$1.existsSync(cliPath)) {
648
- return cliPath;
649
- }
650
- } catch (_error) {
651
- }
652
- }
653
- return null;
654
- }
655
- function resolveVitestLauncher() {
656
- const searchRoots = [process.cwd(), moduleDir];
657
- for (const base of searchRoots) {
658
- try {
659
- const pkgPath = require$1.resolve("vitest/package.json", {
660
- paths: [base]
661
- });
662
- const pkgDir = path.dirname(pkgPath);
663
- const pkgJson = JSON.parse(fs$1.readFileSync(pkgPath, "utf8"));
664
- const binPath = typeof pkgJson.bin === "string" ? pkgJson.bin : pkgJson.bin?.vitest;
665
- if (binPath) {
666
- return {
667
- command: process.execPath,
668
- args: [path.join(pkgDir, binPath)]
669
- };
670
- }
671
- } catch (_error) {
672
- }
673
- }
674
- const localBin = path.resolve(process.cwd(), "node_modules/.bin/vitest");
675
- if (fs$1.existsSync(localBin)) {
676
- return {
677
- command: localBin,
678
- args: []
679
- };
680
- }
681
- return {
682
- command: "vitest",
683
- args: []
684
- };
685
- }
686
- function resolveVitestConfig() {
687
- const userConfig = findVitestConfig(process.cwd());
688
- if (userConfig) {
689
- return userConfig;
690
- }
691
- const bundledConfig = path.join(moduleDir, "vitest.config.js");
692
- return fs$1.existsSync(bundledConfig) ? bundledConfig : null;
693
- }
694
- function findVitestConfig(baseDir) {
695
- const candidates = ["vitest.config.ts", "vitest.config.js", "vitest.config.mjs"];
696
- for (const file of candidates) {
697
- const fullPath = path.join(baseDir, file);
698
- if (fs$1.existsSync(fullPath)) {
699
- return fullPath;
700
- }
701
- }
702
- return null;
703
- }
704
544
  async function loadVitestCoverageConfig() {
705
545
  const options = await loadCoverageOptions({
706
546
  optional: true,
@@ -748,58 +588,6 @@ async function cleanCoverageArtifacts(config) {
748
588
  force: true
749
589
  });
750
590
  }
751
- function resolveNodeCoverageDir(config) {
752
- return path.join(config.rootDir, "build", "vitest", "test-results", "node-coverage");
753
- }
754
- async function convertNodeCoverage(coverage) {
755
- const {
756
- config,
757
- nodeCoverageDir
758
- } = coverage;
759
- const entries = await fs.readdir(nodeCoverageDir).catch(() => []);
760
- const scripts = [];
761
- const scriptRoots = resolveCollectCoverageRoots(config.collectCoverageFrom, config.rootDir);
762
- for (const entry of entries) {
763
- if (!entry.endsWith(".json")) {
764
- continue;
765
- }
766
- const fullPath = path.join(nodeCoverageDir, entry);
767
- const payload = await readJson(fullPath);
768
- const results = Array.isArray(payload?.result) ? payload.result : [];
769
- for (const script of results) {
770
- const normalized = normalizeNodeScriptUrl(script.url, config.rootDir);
771
- if (!normalized) {
772
- continue;
773
- }
774
- if (isNodeModulesPath(normalized.absolutePath)) {
775
- continue;
776
- }
777
- if (!isInsideAnyRoot(normalized.absolutePath, scriptRoots)) {
778
- continue;
779
- }
780
- const source = await fs.readFile(normalized.absolutePath, "utf8").catch(() => "");
781
- scripts.push({
782
- absolutePath: normalized.absolutePath,
783
- relativePath: normalized.relativePath,
784
- source,
785
- functions: script.functions ?? [],
786
- url: script.url
787
- });
788
- }
789
- }
790
- if (scripts.length === 0) {
791
- return;
792
- }
793
- const outDir = path.join(config.rootDir, "build", "vitest", "coverage");
794
- await fs.mkdir(outDir, {
795
- recursive: true
796
- });
797
- const outputFile = path.join(outDir, config.coverageFileName);
798
- await fs.writeFile(outputFile, JSON.stringify({
799
- testId: "vitest",
800
- scripts
801
- }, null, 2), "utf8");
802
- }
803
591
  async function finalizeCoverage(config) {
804
592
  try {
805
593
  await generateCoverageReport(config);
@@ -818,121 +606,4 @@ async function readJson(filePath) {
818
606
  return null;
819
607
  }
820
608
  }
821
- function normalizeNodeScriptUrl(rawUrl, rootDir) {
822
- if (!rawUrl || rawUrl.startsWith("node:")) {
823
- return null;
824
- }
825
- let absolutePath = null;
826
- try {
827
- if (rawUrl.startsWith("file://")) {
828
- absolutePath = fileURLToPath(rawUrl);
829
- }
830
- } catch (_err) {
831
- }
832
- if (!absolutePath && path.isAbsolute(rawUrl)) {
833
- absolutePath = rawUrl;
834
- }
835
- if (!absolutePath) {
836
- return null;
837
- }
838
- const normalized = path.normalize(absolutePath);
839
- return {
840
- absolutePath: normalized,
841
- relativePath: path.relative(rootDir, normalized)
842
- };
843
- }
844
- function isNodeModulesPath(filePath) {
845
- return path.normalize(String(filePath ?? "")).split(path.sep).includes("node_modules");
846
- }
847
- function spawnWithLogs({
848
- name,
849
- launcher,
850
- args,
851
- env,
852
- successMessage,
853
- failureMessage
854
- }) {
855
- return new Promise((resolve, reject) => {
856
- const stdoutBuffer = [];
857
- const stderrBuffer = [];
858
- const child = spawn(launcher.command, [...launcher.args || [], ...args], {
859
- shell: false,
860
- env
861
- });
862
- child.stdout?.on("data", (data) => {
863
- if (!isAider) {
864
- process.stdout.write(data);
865
- }
866
- stdoutBuffer.push(data.toString());
867
- });
868
- child.stderr?.on("data", (data) => {
869
- if (!isAider) {
870
- process.stderr.write(data);
871
- }
872
- stderrBuffer.push(data.toString());
873
- });
874
- child.on("close", (code) => {
875
- if (code === 0) {
876
- if (successMessage) {
877
- console.log(successMessage);
878
- }
879
- resolve();
880
- } else {
881
- console.error(failureMessage || `${name} failed:`);
882
- if (isAider) {
883
- if (stdoutBuffer.length > 0) {
884
- console.error(stdoutBuffer.join(""));
885
- }
886
- if (stderrBuffer.length > 0) {
887
- console.error(stderrBuffer.join(""));
888
- }
889
- }
890
- reject(new Error(`${name} failed with exit code: ${code}`));
891
- }
892
- });
893
- child.on("error", (error) => {
894
- console.error(`Error spawning ${name}:`, error);
895
- reject(error);
896
- });
897
- });
898
- }
899
- function withRegisterShim(baseEnv) {
900
- const nodeOptions = appendNodeRequire(baseEnv.NODE_OPTIONS, path.join(moduleDir, "register-tty.cjs"));
901
- return {
902
- ...baseEnv,
903
- NODE_OPTIONS: nodeOptions
904
- };
905
- }
906
- function ensureJsxRuntimeShim(projectRoot) {
907
- const shimDir = path.join(projectRoot, "node_modules", "playwright");
908
- fs$1.mkdirSync(shimDir, {
909
- recursive: true
910
- });
911
- const shims = [{
912
- file: "jsx-runtime.js",
913
- target: "react/jsx-runtime"
914
- }, {
915
- file: "jsx-dev-runtime.js",
916
- target: "react/jsx-dev-runtime"
917
- }];
918
- for (const {
919
- file,
920
- target
921
- } of shims) {
922
- const filePath = path.join(shimDir, file);
923
- if (!fs$1.existsSync(filePath)) {
924
- const content = `export * from "${target}";
925
- export { default } from "${target}";
926
- `;
927
- fs$1.writeFileSync(filePath, content, "utf8");
928
- }
929
- }
930
- }
931
- function appendNodeRequire(existing, modulePath) {
932
- const flag = `--require=${modulePath}`;
933
- if (!existing || existing.length === 0) {
934
- return flag;
935
- }
936
- return `${existing} ${flag}`;
937
- }
938
609
  //# sourceMappingURL=cli.js.map
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\"\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\nconst RB_CLI_OPTIONS = [\"build-specs-map\", \"auto\", \"full\", \"show-mapping\", \"list\"] as const\n\nfunction isRbCliOption(arg: string): boolean {\n const normalized = arg.toLowerCase()\n return RB_CLI_OPTIONS.some((option) => normalized === `--${option}` || normalized.startsWith(`--${option}=`))\n}\n\nfunction parseBooleanCliArg(rawArgs: string[], option: string): boolean {\n const optionPrefix = `--${option}`\n const optionWithValuePrefix = `${optionPrefix}=`\n return rawArgs.some((arg) => {\n if (arg === optionPrefix) {\n return true\n }\n if (!arg.startsWith(optionWithValuePrefix)) {\n return false\n }\n const value = arg.slice(optionWithValuePrefix.length).toLowerCase()\n if (value === \"false\" || value === \"0\") {\n return false\n }\n return value.length > 0\n })\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 passthroughArgs = [\n ...(Array.isArray(parsed._) ? parsed._ : []),\n ...(Array.isArray(parsed[\"--\"]) ? parsed[\"--\"] : []),\n ].map((entry) => String(entry)).filter((arg) => !isRbCliOption(arg))\n\n return {\n buildSpecsMap: parseBooleanCliArg(rawArgs, \"build-specs-map\"),\n auto: parseBooleanCliArg(rawArgs, \"auto\") && !parseBooleanCliArg(rawArgs, \"full\"),\n showMapping: parseBooleanCliArg(rawArgs, \"show-mapping\"),\n list: parseBooleanCliArg(rawArgs, \"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 && !buildSpecsMap\n const showMapping = args.showMapping\n const list = args.list\n const filteredArgs = args.passthroughArgs\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","RB_CLI_OPTIONS","isRbCliOption","arg","normalized","toLowerCase","some","option","startsWith","parseBooleanCliArg","rawArgs","optionPrefix","optionWithValuePrefix","value","slice","length","parseCliArgs","yargs","parsed","help","version","strict","exitProcess","parserConfiguration","type","default","parseSync","passthroughArgs","Array","isArray","_","map","entry","String","filter","buildSpecsMap","auto","showMapping","list","runTests","args","argv","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","push","launcher","resolveVitestLauncher","withRegisterShim","RB_DISABLE_COVERAGE","nodeCoverageDir","resolveNodeCoverageDir","fsPromises","mkdir","recursive","NODE_V8_COVERAGE","spawnWithLogs","name","successMessage","failureMessage","convertNodeCoverage","workspaceRoot","findWorkspaceRoot","specSourceFiles","findSpecSourceFiles","filesMapDir","join","testResultsRoot","rm","force","specSourceFile","specProjectPath","relative","specWorkspacePath","toPosixPath","testFile","resolvePlaywrightSpecFile","removeCoverageFiles","failed","runError","coveredFiles","collectCoveredFiles","impactedFiles","filePath","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","Boolean","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","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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"}
1
+ {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["import { 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\"\n\nimport fg from \"fast-glob\"\n\nimport { createCoverageConfig } from \"./coverage/config\"\nimport { createCollectCoverageMatcher } 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 { runPlaywright } from \"./runners/playwright\"\nimport { resolveNodeCoverageDir, runVitest } from \"./runners/vitest\"\n\n\nconst require = createRequire(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\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\nconst RB_CLI_OPTIONS = [\"build-specs-map\", \"auto\", \"full\", \"show-mapping\", \"list\"] as const\n\nfunction isRbCliOption(arg: string): boolean {\n const normalized = arg.toLowerCase()\n return RB_CLI_OPTIONS.some((option) => normalized === `--${option}` || normalized.startsWith(`--${option}=`))\n}\n\nfunction parseBooleanCliArg(rawArgs: string[], option: string): boolean {\n const optionPrefix = `--${option}`\n const optionWithValuePrefix = `${optionPrefix}=`\n return rawArgs.some((arg) => {\n if (arg === optionPrefix) {\n return true\n }\n if (!arg.startsWith(optionWithValuePrefix)) {\n return false\n }\n const value = arg.slice(optionWithValuePrefix.length).toLowerCase()\n if (value === \"false\" || value === \"0\") {\n return false\n }\n return value.length > 0\n })\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 passthroughArgs = [\n ...(Array.isArray(parsed._) ? parsed._ : []),\n ...(Array.isArray(parsed[\"--\"]) ? parsed[\"--\"] : []),\n ].map((entry) => String(entry)).filter((arg) => !isRbCliOption(arg))\n\n return {\n buildSpecsMap: parseBooleanCliArg(rawArgs, \"build-specs-map\"),\n auto: parseBooleanCliArg(rawArgs, \"auto\") && !parseBooleanCliArg(rawArgs, \"full\"),\n showMapping: parseBooleanCliArg(rawArgs, \"show-mapping\"),\n list: parseBooleanCliArg(rawArgs, \"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 && !buildSpecsMap\n const showMapping = args.showMapping\n const list = args.list\n const filteredArgs = args.passthroughArgs\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 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\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\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"],"names":["require","createRequire","import","url","shouldForceTty","process","stdout","isTTY","env","FORCE_COLOR","VITEST_COVERAGE_CANDIDATES","IS_AIDER","undefined","console","warn","RB_CLI_OPTIONS","isRbCliOption","arg","normalized","toLowerCase","some","option","startsWith","parseBooleanCliArg","rawArgs","optionPrefix","optionWithValuePrefix","value","slice","length","parseCliArgs","yargs","parsed","help","version","strict","exitProcess","parserConfiguration","type","default","parseSync","passthroughArgs","Array","isArray","_","map","entry","String","filter","buildSpecsMap","auto","showMapping","list","runTests","args","argv","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","workspaceRoot","findWorkspaceRoot","specSourceFiles","findSpecSourceFiles","filesMapDir","path","join","testResultsRoot","fsPromises","rm","recursive","force","mkdir","specSourceFile","specProjectPath","relative","specWorkspacePath","toPosixPath","testFile","resolvePlaywrightSpecFile","removeCoverageFiles","failed","runError","coveredFiles","collectCoveredFiles","impactedFiles","filePath","relativePath","sort","outputFile","dirname","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","push","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","Boolean","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","options","loadCoverageOptions","optional","candidates","createCoverageConfig","coverageEnabled","coverageReportDir","resolveNodeCoverageDir","generateCoverageReport","message","raw","readFile"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function runPlaywright(userArgs: string[], { disableCoverage }?: {
2
+ disableCoverage?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=playwright.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/runners/playwright.ts"],"names":[],"mappings":"AA0DA,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAAE,EAClB,EAAE,eAAuB,EAAE,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,OAAO,CAAC,IAAI,CAAC,CA2Ff"}