@rpcbase/test 0.316.0 → 0.318.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
@@ -13,6 +13,10 @@ import { removeCoverageFiles } from "./coverage/files.js";
13
13
  import { CoverageThresholdError, collectCoveredFiles, generateCoverageReport } from "./coverage/report.js";
14
14
  const require$1 = createRequire(import.meta.url);
15
15
  const moduleDir = path.dirname(fileURLToPath(import.meta.url));
16
+ const shouldForceTty = !process.stdout.isTTY && process.env.FORCE_COLOR === "true";
17
+ if (shouldForceTty) {
18
+ require$1("./register-tty.cjs");
19
+ }
16
20
  const VITEST_COVERAGE_CANDIDATES = ["src/coverage.json"];
17
21
  const COMBINED_COVERAGE_ENV_VAR = "RB_TEST_COMBINED_COVERAGE";
18
22
  const isAider = process.env.IS_AIDER === "yes";
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\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, { 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 : userArgs\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 { disableCoverage = false }: { disableCoverage?: boolean } = {},\n): Promise<void> {\n const vitestArgs = [\"run\", \"--passWithNoTests\"]\n const vitestConfig = resolveVitestConfig()\n\n if (vitestConfig) {\n vitestArgs.push(\"--config\", vitestConfig)\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 env.NODE_V8_COVERAGE = resolveNodeCoverageDir(combinedConfig ?? coverage.config)\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.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}: {\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 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 console.log(\"[auto] No relevant git changes.\")\n return null\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 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\nasync function findFilesMapJson(filesMapDir: string): Promise<string[]> {\n const patterns = [\"spec/**/*.spec.ts.json\", \"spec/**/*.spec.tsx.json\"]\n const matches = await fg(patterns, { cwd: filesMapDir, absolute: true, onlyFiles: true }).catch(() => [])\n return matches.sort()\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 absolutePath.endsWith(\".spec.ts\")\n || absolutePath.endsWith(\".spec.tsx\")\n}\n\nasync function findSpecSourceFiles(projectRoot: string): Promise<string[]> {\n const patterns = [\"spec/**/*.spec.ts\", \"spec/**/*.spec.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 defaultTestResultsDir: \"test-results-vitest\",\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(path.join(config.testResultsRoot, \"node-coverage\"), { recursive: true, force: true })\n}\n\nfunction resolveNodeCoverageDir(config: CoverageConfig): string {\n return path.join(config.testResultsRoot, \"node-coverage\", \"vitest\")\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.testResultsRoot, \"vitest\")\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","fsPromises","fs"],"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\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, { 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 : userArgs\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 { disableCoverage = false }: { disableCoverage?: boolean } = {},\n): Promise<void> {\n const vitestArgs = [\"run\", \"--passWithNoTests\"]\n const vitestConfig = resolveVitestConfig()\n\n if (vitestConfig) {\n vitestArgs.push(\"--config\", vitestConfig)\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 env.NODE_V8_COVERAGE = resolveNodeCoverageDir(combinedConfig ?? coverage.config)\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.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}: {\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 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 console.log(\"[auto] No relevant git changes.\")\n return null\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 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\nasync function findFilesMapJson(filesMapDir: string): Promise<string[]> {\n const patterns = [\"spec/**/*.spec.ts.json\", \"spec/**/*.spec.tsx.json\"]\n const matches = await fg(patterns, { cwd: filesMapDir, absolute: true, onlyFiles: true }).catch(() => [])\n return matches.sort()\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 absolutePath.endsWith(\".spec.ts\")\n || absolutePath.endsWith(\".spec.tsx\")\n}\n\nasync function findSpecSourceFiles(projectRoot: string): Promise<string[]> {\n const patterns = [\"spec/**/*.spec.ts\", \"spec/**/*.spec.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 defaultTestResultsDir: \"test-results-vitest\",\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(path.join(config.testResultsRoot, \"node-coverage\"), { recursive: true, force: true })\n}\n\nfunction resolveNodeCoverageDir(config: CoverageConfig): string {\n return path.join(config.testResultsRoot, \"node-coverage\", \"vitest\")\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.testResultsRoot, \"vitest\")\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","fsPromises","fs"],"mappings":";;;;;;;;;;;;AAiBA,MAAMA,YAAU,cAAc,YAAY,GAAG;AAC7C,MAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAE7D,MAAM,iBACJ,CAAC,QAAQ,OAAO,SACb,QAAQ,IAAI,gBAAgB;AAEjC,IAAI,gBAAgB;AAClBA,YAAQ,oBAAoB;AAC9B;AAGA,MAAM,6BAA6B,CAAC,mBAAmB;AAEvD,MAAM,4BAA4B;AAElC,MAAM,UAAU,QAAQ,IAAI,aAAa;AAEzC,IAAI,QAAQ,IAAI,aAAa,UAAa,QAAQ,IAAI,aAAa,OAAO;AACxE,UAAQ,KAAK,uDAAuD;AACtE;AAIA,eAAe,WAA0B;AACvC,QAAM,WAAW,QAAQ,KAAK,MAAM,CAAC;AACrC,QAAM,gBAAgB,SAAS,SAAS,mBAAmB;AAC3D,QAAM,OAAO,SAAS,SAAS,QAAQ;AACvC,QAAM,cAAc,SAAS,SAAS,gBAAgB;AACtD,QAAM,eAAe,SAAS,OAAO,CAAC,QAAQ,QAAQ,uBAAuB,QAAQ,YAAY,QAAQ,gBAAgB;AAEzH,MAAI,iBAAiB,MAAM;AACzB,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAEA,MAAI,eAAe,CAAC,MAAM;AACxB,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,QAAM,qBAAqB,MAAM,6BAAA;AACjC,QAAM,iBAAiB,MAAM,yBAAA;AAC7B,QAAM,mBAAmB,wBAAwB,oBAAoB,cAAc;AAEnF,MAAI,eAAe;AACjB,UAAM,0BAA0B;AAAA,MAC9B,UAAU;AAAA,MAGV;AAAA,IAAA,CACD;AACD;AAAA,EACF;AAEA,QAAM,+BAA+B,kBAAkB,WAAW,CAAC;AAEnE,MAAI,8BAA8B;AAChC,UAAM,uBAAuB,iBAAiB,MAAM;AAAA,EACtD;AAEA,MAAI,YAAY;AAEhB,MAAI;AACF,UAAM,UAAU,gBAAgB,kBAAkB,UAAU,MAAM,EAAE,iBAAiB,MAAM;AAC3F,YAAQ,IAAI,+BAA+B;AAC3C,UAAM,iBAAiB,OACnB,MAAM,0BAA0B;AAAA,MAChC,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD,IACC;AACJ,QAAI,gBAAgB;AAClB,YAAM,cAAc,gBAAgB,EAAE,iBAAiB,MAAM;AAAA,IAC/D;AAAA,EACF,SAAS,OAAY;AACnB,gBAAY;AAAA,EACd;AAEA,MAAI,8BAA8B;AAChC,QAAI,WAAW;AACb,cAAQ,KAAK,4DAA4D;AAAA,IAC3E,OAAO;AACL,UAAI;AACF,cAAM,iBAAiB,iBAAiB,MAAM;AAAA,MAChD,SAAS,OAAO;AACd,oBAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW;AACb,UAAM;AAAA,EACR;AACF;AAEA,WACG,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC,EAC1B,MAAM,CAAC,UAAU;AAChB,MAAI,EAAE,iBAAiB,yBAAyB;AAC9C,YAAQ,MAAM,OAAO,SAAS,OAAO,KAAK,CAAC;AAAA,EAC7C;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;AAEH,eAAe,UACb,UACA,gBACA,EAAE,kBAAkB,MAAA,IAAyC,IAC9C;AACf,QAAM,aAAa,CAAC,OAAO,mBAAmB;AAC9C,QAAM,eAAe,oBAAA;AAErB,MAAI,cAAc;AAChB,eAAW,KAAK,YAAY,YAAY;AAAA,EAC1C;AACA,QAAM,WAAW,sBAAA;AACjB,QAAM,MAAM,iBAAiB,QAAQ,GAAG;AAExC,MAAI,iBAAiB;AACnB,QAAI,sBAAsB;AAAA,EAC5B;AAEA,MAAI,UAAU,WAAW,CAAC,iBAAiB;AACzC,QAAI,mBAAmB,uBAAuB,kBAAkB,SAAS,MAAM;AAAA,EACjF;AAEA,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAAA,CACjB;AAED,MAAI,UAAU,WAAW,CAAC,iBAAiB;AACzC,UAAM,oBAAoB;AAAA,MACxB,QAAQ,kBAAkB,SAAS;AAAA,MACnC,iBAAiB,uBAAuB,kBAAkB,SAAS,MAAM;AAAA,IAAA,CAC1E;AAAA,EACH;AACF;AAEA,eAAe,0BAA0B;AAAA,EACvC;AAAA,EACA;AACF,GAIkB;AAChB,MAAI,CAAC,kBAAkB,SAAS;AAC9B,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AAEA,QAAM,SAAS,iBAAiB;AAChC,QAAM,gBAAgB,kBAAkB,QAAQ,IAAA,CAAK;AAErD,QAAM,kBAAkB,MAAM,oBAAoB,OAAO,OAAO;AAChE,MAAI,gBAAgB,WAAW,GAAG;AAChC,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,QAAM,cAAc,KAAK,KAAK,OAAO,iBAAiB,WAAW;AACjE,QAAMC,GAAW,GAAG,aAAa,EAAE,WAAW,MAAM,OAAO,MAAM;AACjE,QAAMA,GAAW,MAAM,aAAa,EAAE,WAAW,MAAM;AAEvD,aAAW,kBAAkB,iBAAiB;AAC5C,UAAM,kBAAkB,KAAK,SAAS,OAAO,SAAS,cAAc;AACpE,UAAM,oBAAoB,YAAY,KAAK,SAAS,eAAe,cAAc,CAAC;AAClF,UAAM,WAAW,0BAA0B,eAAe;AAE1D,YAAQ,IAAI;AAAA,sBAAyB,iBAAiB,EAAE;AAExD,UAAM,oBAAoB,MAAM;AAEhC,QAAI,QAAQ;AACZ,QAAI,SAAS;AACb,QAAI;AACF,YAAM,cAAc,CAAC,GAAG,UAAU,QAAQ,CAAC;AAAA,IAC7C,SAAS,UAAe;AACtB,cAAQ;AACR,eAAS;AACT,cAAQ,MAAM,uBAAuB,iBAAiB,EAAE;AACxD,cAAQ,MAAM,UAAU,SAAS,OAAO,QAAQ,CAAC;AAAA,IACnD;AAEA,UAAM,eAAe,MAAM,oBAAoB,MAAM;AACrD,UAAM,gBAAgB,aACnB,IAAI,CAAC,aAAa,YAAY,KAAK,SAAS,eAAe,QAAQ,CAAC,CAAC,EACrE,OAAO,CAAC,iBAAiB,gBAAgB,CAAC,aAAa,WAAW,KAAK,KAAK,iBAAiB,IAAI,EACjG,KAAA;AAEH,UAAM,aAAa,KAAK,KAAK,aAAa,GAAG,eAAe,OAAO;AACnE,UAAMA,GAAW,MAAM,KAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,MAAM;AACpE,UAAMA,GAAW;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,UACP;AAAA,QAAA;AAAA,QAEF;AAAA,QACA;AAAA,MAAA;AAAA,MAEF;AAAA,IAAA;AAGF,QAAI,QAAQ;AACV,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAMA,eAAe,0BAA0B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAM6B;AAC3B,QAAM,SAAS,oBAAoB,UAAU,gBAAgB,UAAU;AACvE,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,kEAAkE;AAC/E,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,KAAK,OAAO,iBAAiB,WAAW;AACjE,QAAM,WAAW,MAAM,iBAAiB,WAAW;AACnD,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,KAAK,4DAA4D;AACzE,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,kBAAkB,QAAQ,IAAA,CAAK;AACrD,QAAM,aAAa,cAAc,aAAa;AAC9C,QAAM,YAAY,IAAI;AAAA,IACpB,WACG,OAAO,CAAC,WAA2E,OAAO,SAAS,QAAQ,EAC3G,IAAI,CAAC,WAAW,CAAC,OAAO,SAAS,OAAO,OAAO,CAAC;AAAA,EAAA;AAGrD,QAAM,cAAc,KAAK,KAAK,OAAO,SAAS,MAAM;AACpD,QAAM,6BAA6B,6BAA6B,OAAO,qBAAqB,OAAO,OAAO;AAE1G,QAAM,wCAAwB,IAAA;AAC9B,QAAM,gBAA6B,CAAA;AAEnC,aAAW,UAAU,YAAY;AAC/B,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,SAAS,KAAK,KAAK,eAAe,OAAO,OAAO;AACtD,YAAM,SAAS,KAAK,KAAK,eAAe,OAAO,OAAO;AAEtD,UAAI,iBAAiB,QAAQ,WAAW,KAAKC,KAAG,WAAW,MAAM,GAAG;AAClE,0BAAkB,IAAI,OAAO,OAAO;AAAA,MACtC;AAEA,YAAM,aAAa,2BAA2B,MAAM;AACpD,YAAM,aAAa,2BAA2B,MAAM;AACpD,UAAI,cAAc,YAAY;AAC5B,sBAAc,KAAK,MAAM;AAAA,MAC3B;AACA;AAAA,IACF;AAEA,UAAM,MAAM,KAAK,KAAK,eAAe,OAAO,IAAI;AAEhD,QAAI,iBAAiB,KAAK,WAAW,KAAKA,KAAG,WAAW,GAAG,GAAG;AAC5D,wBAAkB,IAAI,OAAO,IAAI;AAAA,IACnC;AAEA,QAAI,2BAA2B,GAAG,GAAG;AACnC,oBAAc,KAAK,MAAM;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,kBAAkB,SAAS,KAAK,cAAc,WAAW,GAAG;AAC9D,YAAQ,IAAI,iCAAiC;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,aAAuD,CAAA;AAC7D,aAAW,QAAQ,UAAU;AAC3B,UAAM,OAAO,MAAM,SAAS,IAAI;AAChC,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,MAAM;AACxB,cAAQ,KAAK,0EAA0E;AACvF,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO;AAC1D,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAClC,KAAK,MAAoB,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IACtF,CAAA;AACJ,eAAW,KAAK,EAAE,MAAM,MAAA,CAAO;AAAA,EACjC;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,YAAQ,KAAK,2DAA2D;AACxE,WAAO;AAAA,EACT;AAEA,QAAM,0CAA0B,IAAA;AAEhC,aAAW,SAAS,YAAY;AAC9B,UAAM,eAAe,mBAAmB,MAAM,MAAM,SAAS;AAC7D,eAAW,QAAQ,MAAM,OAAO;AAC9B,YAAM,OAAO,oBAAoB,IAAI,IAAI,KAAK,CAAA;AAC9C,WAAK,KAAK,YAAY;AACtB,0BAAoB,IAAI,MAAM,IAAI;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,wBAAwB,cAAc,OAAO,CAAC,WAAW;AAC7D,QAAI,OAAO,SAAS,QAAQ;AAC1B,aAAO,CAAC,oBAAoB,IAAI,OAAO,IAAI;AAAA,IAC7C;AACA,WAAO,CAAC,oBAAoB,IAAI,OAAO,OAAO,KAAK,CAAC,oBAAoB,IAAI,OAAO,OAAO;AAAA,EAC5F,CAAC;AAED,MAAI,sBAAsB,SAAS,GAAG;AACpC,YAAQ,KAAK,0CAA0C;AACvD,eAAW,UAAU,uBAAuB;AAC1C,UAAI,OAAO,SAAS,QAAQ;AAC1B,gBAAQ,KAAK,OAAO,OAAO,IAAI,EAAE;AAAA,MACnC,OAAO;AACL,gBAAQ,KAAK,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,EAAE;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,IAAI,IAAY,iBAAiB;AACvD,QAAM,qCAAqB,IAAA;AAE3B,aAAW,QAAQ,mBAAmB;AACpC,QAAI,aAAa;AACf,qBAAe,IAAI,MAAM,oBAAI,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,IAC1C;AAAA,EACF;AAEA,aAAW,UAAU,eAAe;AAClC,QAAI,OAAO,SAAS,QAAQ;AAC1B,YAAM,QAAQ,oBAAoB,IAAI,OAAO,IAAI,KAAK,CAAA;AACtD,YAAM,QAAQ,CAAC,SAAS,cAAc,IAAI,IAAI,CAAC;AAC/C,UAAI,aAAa;AACf,mBAAW,QAAQ,OAAO;AACxB,gBAAM,UAAU,eAAe,IAAI,IAAI,yBAAS,IAAA;AAChD,kBAAQ,IAAI,OAAO,IAAI;AACvB,yBAAe,IAAI,MAAM,OAAO;AAAA,QAClC;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,WAAW,oBAAoB,IAAI,OAAO,OAAO,KAAK,CAAA;AAC5D,aAAS,QAAQ,CAAC,SAAS,cAAc,IAAI,IAAI,CAAC;AAClD,UAAM,WAAW,oBAAoB,IAAI,OAAO,OAAO,KAAK,CAAA;AAC5D,aAAS,QAAQ,CAAC,SAAS,cAAc,IAAI,IAAI,CAAC;AAClD,QAAI,aAAa;AACf,YAAM,MAAM,GAAG,OAAO,OAAO,OAAO,OAAO,OAAO;AAClD,YAAM,+BAAe,IAAI,CAAC,GAAG,UAAU,GAAG,QAAQ,CAAC;AACnD,iBAAW,QAAQ,UAAU;AAC3B,cAAM,UAAU,eAAe,IAAI,IAAI,yBAAS,IAAA;AAChD,gBAAQ,IAAI,GAAG;AACf,uBAAe,IAAI,MAAM,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAyB,CAAA;AAC/B,QAAM,aAAa,MAAM,KAAK,aAAa,EACxC,OAAO,CAAC,SAAS;AAChB,UAAM,MAAM,KAAK,KAAK,eAAe,IAAI;AACzC,QAAIA,KAAG,WAAW,GAAG,GAAG;AACtB,aAAO;AAAA,IACT;AACA,iBAAa,KAAK,IAAI;AACtB,WAAO;AAAA,EACT,CAAC,EACA,KAAA;AACH,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,KAAK,mBAAmB,aAAa,MAAM,wBAAwB;AAC3E,eAAW,QAAQ,aAAa,QAAQ;AACtC,cAAQ,KAAK,OAAO,IAAI,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,YAAQ,IAAI,2BAA2B;AACvC,WAAO;AAAA,EACT;AAEA,MAAI,aAAa;AACf,YAAQ,IAAI,iBAAiB;AAC7B,eAAW,QAAQ,YAAY;AAC7B,YAAM,WAAW,MAAM,KAAK,eAAe,IAAI,IAAI,KAAK,EAAE,EAAE,KAAA;AAC5D,UAAI,SAAS,WAAW,GAAG;AACzB;AAAA,MACF;AACA,cAAQ,IAAI,OAAO,IAAI,EAAE;AACzB,iBAAW,WAAW,UAAU;AAC9B,gBAAQ,IAAI,UAAU,OAAO,EAAE;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,WACrB,IAAI,CAAC,sBAAsB,KAAK,KAAK,eAAe,iBAAiB,CAAC,EACtE,OAAO,CAAC,YAAY,UAAU,SAAS,OAAO,OAAO,CAAC,EACtD,IAAI,CAAC,YAAY;AAChB,UAAM,kBAAkB,KAAK,SAAS,OAAO,SAAS,OAAO;AAC7D,WAAO,0BAA0B,eAAe;AAAA,EAClD,CAAC;AAEH,QAAM,kBAAkB,MAAM,oBAAoB,OAAO,OAAO,GAAG;AACnE,UAAQ,IAAI,kBAAkB,gBAAgB,MAAM,IAAI,cAAc,gBAAgB;AACtF,SAAO,CAAC,GAAG,UAAU,GAAG,eAAe;AACzC;AAEA,eAAe,iBAAiB,aAAwC;AACtE,QAAM,WAAW,CAAC,0BAA0B,yBAAyB;AACrE,QAAM,UAAU,MAAM,GAAG,UAAU,EAAE,KAAK,aAAa,UAAU,MAAM,WAAW,MAAM,EAAE,MAAM,MAAM,CAAA,CAAE;AACxG,SAAO,QAAQ,KAAA;AACjB;AAEA,SAAS,cAAc,eAAoC;AACzD,QAAM,SAAS,UAAU,OAAO,CAAC,UAAU,iBAAiB,IAAI,GAAG;AAAA,IACjE,KAAK;AAAA,IACL,UAAU;AAAA,EAAA,CACX;AAED,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,qCAAqC,OAAO,UAAU,eAAe,EAAE;AAAA,EACzF;AAEA,QAAM,SAAS,OAAO,OAAO,UAAU,EAAE,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACrE,QAAM,UAAuB,CAAA;AAE7B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,UAAM,SAAS,OAAO,CAAC;AACvB,QAAI,OAAO,SAAS,GAAG;AACrB;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,MAAM,GAAG,CAAC;AAChC,UAAM,WAAW,YAAY,OAAO,MAAM,CAAC,CAAC;AAE5C,QAAI,qBAAqB,MAAM,GAAG;AAChC,YAAM,OAAO,OAAO,IAAI,CAAC;AACzB,UAAI,OAAO,SAAS,UAAU;AAC5B;AAAA,MACF;AACA,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,YAAY,IAAI;AAAA,MAAA,CAC1B;AACD,WAAK;AACL;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,MAAM;AAAA,IAAA,CACP;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,QAAyB;AACrD,SAAO,OAAO,SAAS,GAAG,KAAK,OAAO,SAAS,GAAG;AACpD;AAEA,SAAS,mBAAmB,UAAkB,WAAwC;AACpF,MAAI,UAAU;AACd,QAAM,8BAAc,IAAA;AAEpB,SAAO,CAAC,QAAQ,IAAI,OAAO,GAAG;AAC5B,UAAM,OAAO,UAAU,IAAI,OAAO;AAClC,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,YAAQ,IAAI,OAAO;AACnB,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,WAAmB,MAAuB;AAC3D,QAAM,WAAW,KAAK,SAAS,MAAM,SAAS;AAC9C,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAAC,KAAK,WAAW,QAAQ;AACpF;AAEA,SAAS,iBAAiB,cAAsB,kBAAmC;AACjF,MAAI,CAAC,UAAU,cAAc,gBAAgB,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,SAAS,UAAU,KAClC,aAAa,SAAS,WAAW;AACxC;AAEA,eAAe,oBAAoB,aAAwC;AACzE,QAAM,WAAW,CAAC,qBAAqB,oBAAoB;AAC3D,QAAM,UAAU,MAAM,GAAG,UAAU,EAAE,KAAK,aAAa,UAAU,MAAM,WAAW,KAAA,CAAM;AACxF,SAAO,QAAQ,KAAA;AACjB;AAEA,SAAS,0BAA0B,iBAAiC;AAClE,QAAM,gBAAgB,KAAK,KAAK,QAAQ,IAAA,GAAO,SAAS,MAAM;AAC9D,QAAM,qBAAqBA,KAAG,WAAW,aAAa;AAEtD,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,uBAAuB,KAAK,KAAK,SAAS,eAAe,CAAC;AACjF,QAAM,gBAAgB,KAAK,QAAQ,QAAQ,IAAA,GAAO,cAAc;AAChE,MAAI,CAACA,KAAG,WAAW,aAAa,GAAG;AACjC,UAAM,IAAI,MAAM,wCAAwC,cAAc,EAAE;AAAA,EAC1E;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,UAA0B;AACxD,MAAI,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,MAAM,GAAG;AACzD,WAAO,GAAG,SAAS,QAAQ,WAAW,EAAE,CAAC;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,OAAO,SAAS,EAAE,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG;AACrD;AAEA,SAAS,kBAAkB,aAA6B;AACtD,MAAI,MAAM,KAAK,QAAQ,WAAW;AAElC,SAAO,MAAM;AACX,UAAM,UAAU,KAAK,KAAK,KAAK,cAAc;AAC7C,QAAI;AACF,UAAIA,KAAG,WAAW,OAAO,GAAG;AAC1B,cAAM,SAAS,KAAK,MAAMA,KAAG,aAAa,SAAS,MAAM,CAAC;AAC1D,YAAI,UAAU,OAAO,WAAW,YAAY,OAAO,YAAY;AAC7D,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,KAAK;AAClB,aAAO,KAAK,QAAQ,WAAW;AAAA,IACjC;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,cACP,UACA,EAAE,kBAAkB,MAAA,IAAyC,CAAA,GAC9C;AAEf,QAAM,aAAaA,KAAG;AAAA,IACpB,KAAK,KAAK,QAAQ,IAAA,GAAO,sBAAsB;AAAA,EAAA,IAE7C,KAAK,KAAK,QAAQ,IAAA,GAAO,sBAAsB,IAC/C,KAAK,KAAK,WAAW,sBAAsB;AAE/C,QAAM,kBAAkB,SAAS,KAAK,CAAC,QAAQ;AAC7C,QAAI,QAAQ,cAAc,QAAQ,MAAM;AACtC,aAAO;AAAA,IACT;AAEA,WAAO,IAAI,WAAW,WAAW;AAAA,EACnC,CAAC;AAED,QAAM,iBAAiB,CAAC,MAAM;AAE9B,MAAI,CAAC,iBAAiB;AACpB,mBAAe,KAAK,YAAY,UAAU;AAAA,EAC5C;AAEA,iBAAe,KAAK,GAAG,QAAQ;AAE/B,uBAAqB,QAAQ,KAAK;AAClC,QAAM,WAAW,0BAAA;AACjB,QAAM,MAAM,iBAAiB,QAAQ,GAAG;AACxC,MAAI,yBAAyB,IAAI;AACjC,MAAI,iBAAiB;AACnB,QAAI,sBAAsB;AAAA,EAC5B;AAEA,SAAO,cAAc;AAAA,IACnB,MAAM;AAAA,IACN;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAAA,CACjB;AACH;AAOA,SAAS,4BAA2C;AAClD,QAAM,UAAU,eAAA;AAChB,MAAI,SAAS;AACX,WAAO;AAAA,MACL,SAAS,QAAQ;AAAA,MACjB,MAAM,CAAC,OAAO;AAAA,IAAA;AAAA,EAElB;AAEA,QAAM,WAAW,KAAK,QAAQ,QAAQ,IAAA,GAAO,8BAA8B;AAC3E,MAAIA,KAAG,WAAW,QAAQ,GAAG;AAC3B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,CAAA;AAAA,IAAC;AAAA,EAEX;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,CAAA;AAAA,EAAC;AAEX;AAEA,SAAS,iBAAgC;AACvC,QAAM,cAAc,CAAC,QAAQ,IAAA,GAAO,SAAS;AAE7C,aAAW,QAAQ,aAAa;AAC9B,QAAI;AACF,YAAM,UAAUF,UAAQ,QAAQ,iCAAiC,EAAE,OAAO,CAAC,IAAI,GAAG;AAClF,YAAM,UAAU,KAAK,KAAK,KAAK,QAAQ,OAAO,GAAG,QAAQ;AACzD,UAAIE,KAAG,WAAW,OAAO,GAAG;AAC1B,eAAO;AAAA,MACT;AAAA,IACF,SAAS,QAAQ;AAAA,IAEjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBAAuC;AAC9C,QAAM,cAAc,CAAC,QAAQ,IAAA,GAAO,SAAS;AAE7C,aAAW,QAAQ,aAAa;AAC9B,QAAI;AACF,YAAM,UAAUF,UAAQ,QAAQ,uBAAuB,EAAE,OAAO,CAAC,IAAI,GAAG;AACxE,YAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,YAAM,UAAU,KAAK,MAAME,KAAG,aAAa,SAAS,MAAM,CAAC;AAC3D,YAAM,UAAU,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM,QAAQ,KAAK;AAC7E,UAAI,SAAS;AACX,eAAO;AAAA,UACL,SAAS,QAAQ;AAAA,UACjB,MAAM,CAAC,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,QAAA;AAAA,MAErC;AAAA,IACF,SAAS,QAAQ;AAAA,IAEjB;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,QAAQ,QAAQ,IAAA,GAAO,0BAA0B;AACvE,MAAIA,KAAG,WAAW,QAAQ,GAAG;AAC3B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,CAAA;AAAA,IAAC;AAAA,EAEX;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,CAAA;AAAA,EAAC;AAEX;AAEA,SAAS,sBAAqC;AAC5C,QAAM,aAAa,iBAAiB,QAAQ,IAAA,CAAK;AACjD,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,KAAK,KAAK,WAAW,kBAAkB;AAC7D,SAAOA,KAAG,WAAW,aAAa,IAAI,gBAAgB;AACxD;AAEA,SAAS,iBAAiB,SAAgC;AACxD,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,aAAW,QAAQ,YAAY;AAC7B,UAAM,WAAW,KAAK,KAAK,SAAS,IAAI;AACxC,QAAIA,KAAG,WAAW,QAAQ,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,2BAAmD;AAChE,QAAM,UAAU,MAAM,oBAAoB;AAAA,IACxC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,uBAAuB;AAAA,EAAA,CACxB;AACD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,qBAAqB,OAAO;AAE3C,SAAO;AAAA,IACL;AAAA,IACA,SAAS,OAAO;AAAA,EAAA;AAEpB;AAEA,eAAe,+BAAuD;AACpE,QAAM,UAAU,MAAM,oBAAoB,EAAE,UAAU,MAAM;AAC5D,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,qBAAqB,OAAO;AAE3C,SAAO;AAAA,IACL;AAAA,IACA,SAAS,OAAO;AAAA,EAAA;AAEpB;AAEA,SAAS,wBAAwB,oBAAmC,gBAA8C;AAChH,MAAI,oBAAoB,SAAS;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,SAAS;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,uBAAuB,QAAuC;AAC3E,QAAM,oBAAoB,MAAM;AAChC,QAAMD,GAAW,GAAG,OAAO,mBAAmB,EAAE,WAAW,MAAM,OAAO,MAAM;AAC9E,QAAMA,GAAW,GAAG,KAAK,KAAK,OAAO,iBAAiB,eAAe,GAAG,EAAE,WAAW,MAAM,OAAO,MAAM;AAC1G;AAEA,SAAS,uBAAuB,QAAgC;AAC9D,SAAO,KAAK,KAAK,OAAO,iBAAiB,iBAAiB,QAAQ;AACpE;AAEA,eAAe,oBAAoB,UAA8E;AAC/G,QAAM,EAAE,QAAQ,gBAAA,IAAoB;AAEpC,QAAM,UAAU,MAAMA,GAAW,QAAQ,eAAe,EAAE,MAAM,MAAM,EAAE;AACxE,QAAM,UAAU,CAAA;AAChB,QAAM,cAAc,4BAA4B,OAAO,qBAAqB,OAAO,OAAO;AAE1F,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,SAAS,OAAO,GAAG;AAC5B;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,KAAK,iBAAiB,KAAK;AACjD,UAAM,UAAU,MAAM,SAAS,QAAQ;AACvC,UAAM,UAAU,MAAM,QAAQ,SAAS,MAAM,IAAI,QAAQ,SAAS,CAAA;AAElE,eAAW,UAAU,SAAS;AAC5B,YAAM,aAAa,uBAAuB,OAAO,KAAK,OAAO,OAAO;AACpE,UAAI,CAAC,YAAY;AACf;AAAA,MACF;AAEA,UAAI,kBAAkB,WAAW,YAAY,GAAG;AAC9C;AAAA,MACF;AAEA,UAAI,CAAC,gBAAgB,WAAW,cAAc,WAAW,GAAG;AAC1D;AAAA,MACF;AAEA,YAAM,SAAS,MAAMA,GAAW,SAAS,WAAW,cAAc,MAAM,EAAE,MAAM,MAAM,EAAE;AAExF,cAAQ,KAAK;AAAA,QACX,cAAc,WAAW;AAAA,QACzB,cAAc,WAAW;AAAA,QACzB;AAAA,QACA,WAAW,OAAO,aAAa,CAAA;AAAA,QAC/B,KAAK,OAAO;AAAA,MAAA,CACb;AAAA,IACH;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,EACF;AAEA,QAAM,SAAS,KAAK,KAAK,OAAO,iBAAiB,QAAQ;AACzD,QAAMA,GAAW,MAAM,QAAQ,EAAE,WAAW,MAAM;AAClD,QAAM,aAAa,KAAK,KAAK,QAAQ,OAAO,gBAAgB;AAC5D,QAAMA,GAAW,UAAU,YAAY,KAAK,UAAU,EAAE,QAAQ,UAAU,QAAA,GAAW,MAAM,CAAC,GAAG,MAAM;AACvG;AAEA,eAAe,iBAAiB,QAAuC;AACrE,MAAI;AACF,UAAM,uBAAuB,MAAM;AAAA,EACrC,SAAS,OAAY;AACnB,QAAI,iBAAiB,wBAAwB;AAC3C,cAAQ,MAAM,MAAM,OAAO;AAAA,IAC7B;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,SAAS,UAAuC;AAC7D,MAAI;AACF,UAAM,MAAM,MAAMA,GAAW,SAAS,UAAU,MAAM;AACtD,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBACP,QACA,SACuD;AACvD,MAAI,CAAC,UAAU,OAAO,WAAW,OAAO,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,eAAe;AAEnB,MAAI;AACF,QAAI,OAAO,WAAW,SAAS,GAAG;AAChC,qBAAe,cAAc,MAAM;AAAA,IACrC;AAAA,EACF,SAAS,MAAM;AAAA,EAEf;AAEA,MAAI,CAAC,gBAAgB,KAAK,WAAW,MAAM,GAAG;AAC5C,mBAAe;AAAA,EACjB;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,UAAU,YAAY;AAE9C,SAAO;AAAA,IACL,cAAc;AAAA,IACd,cAAc,KAAK,SAAS,SAAS,UAAU;AAAA,EAAA;AAEnD;AAEA,SAAS,kBAAkB,UAA4B;AACrD,SAAO,KACJ,UAAU,OAAO,YAAY,EAAE,CAAC,EAChC,MAAM,KAAK,GAAG,EACd,SAAS,cAAc;AAC5B;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOkB;AAChB,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,UAAM,eAAyB,CAAA;AAC/B,UAAM,eAAyB,CAAA;AAE/B,UAAM,QAAQ;AAAA,MACZ,SAAS;AAAA,MACT,CAAC,GAAI,SAAS,QAAQ,CAAA,GAAK,GAAG,IAAI;AAAA,MAClC;AAAA,QACE,OAAO;AAAA,QACP;AAAA,MAAA;AAAA,IACF;AAGF,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACjC,UAAI,CAAC,SAAS;AACZ,gBAAQ,OAAO,MAAM,IAAI;AAAA,MAC3B;AACA,mBAAa,KAAK,KAAK,UAAU;AAAA,IACnC,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACjC,UAAI,CAAC,SAAS;AACZ,gBAAQ,OAAO,MAAM,IAAI;AAAA,MAC3B;AACA,mBAAa,KAAK,KAAK,UAAU;AAAA,IACnC,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,YAAI,gBAAgB;AAClB,kBAAQ,IAAI,cAAc;AAAA,QAC5B;AACA,gBAAA;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,kBAAkB,GAAG,IAAI,UAAU;AAEjD,YAAI,SAAS;AACX,cAAI,aAAa,SAAS,GAAG;AAC3B,oBAAQ,MAAM,aAAa,KAAK,EAAE,CAAC;AAAA,UACrC;AAEA,cAAI,aAAa,SAAS,GAAG;AAC3B,oBAAQ,MAAM,aAAa,KAAK,EAAE,CAAC;AAAA,UACrC;AAAA,QACF;AAEA,eAAO,IAAI,MAAM,GAAG,IAAI,2BAA2B,IAAI,EAAE,CAAC;AAAA,MAC5D;AAAA,IACF,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,cAAQ,MAAM,kBAAkB,IAAI,KAAK,KAAK;AAC9C,aAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,iBAAiB,SAA+C;AACvE,QAAM,cAAc,kBAAkB,QAAQ,cAAc,KAAK,KAAK,WAAW,kBAAkB,CAAC;AACpG,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,EAAA;AAElB;AAEA,SAAS,qBAAqB,aAA2B;AACvD,QAAM,UAAU,KAAK,KAAK,aAAa,gBAAgB,YAAY;AACnEC,OAAG,UAAU,SAAS,EAAE,WAAW,MAAM;AACzC,QAAM,QAAQ;AAAA,IACZ,EAAE,MAAM,kBAAkB,QAAQ,oBAAA;AAAA,IAClC,EAAE,MAAM,sBAAsB,QAAQ,wBAAA;AAAA,EAAwB;AAGhE,aAAW,EAAE,MAAM,OAAA,KAAY,OAAO;AACpC,UAAM,WAAW,KAAK,KAAK,SAAS,IAAI;AACxC,QAAI,CAACA,KAAG,WAAW,QAAQ,GAAG;AAC5B,YAAM,UAAU,kBAAkB,MAAM;AAAA,2BAAgC,MAAM;AAAA;AAC9EA,WAAG,cAAc,UAAU,SAAS,MAAM;AAAA,IAC5C;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,UAA8B,YAA4B;AACnF,QAAM,OAAO,aAAa,UAAU;AACpC,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AACA,SAAO,GAAG,QAAQ,IAAI,IAAI;AAC5B;"}
@@ -1,2 +1,5 @@
1
- export declare function generateConsoleTextCoverageReport(reports: any, context: any): string;
1
+ export declare function generateConsoleTextCoverageReport(reports: any, context: any): {
2
+ output: string;
3
+ summarizer: string | undefined;
4
+ };
2
5
  //# sourceMappingURL=console-text-report.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"console-text-report.d.ts","sourceRoot":"","sources":["../../src/coverage/console-text-report.ts"],"names":[],"mappings":"AAGA,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,MAAM,CAWpF"}
1
+ {"version":3,"file":"console-text-report.d.ts","sourceRoot":"","sources":["../../src/coverage/console-text-report.ts"],"names":[],"mappings":"AAMA,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,GAAG,GACX;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAWpD"}
@@ -1,14 +1,15 @@
1
- const DEFAULT_CONSOLE_MAX_COLS = 90;
2
- const CONSOLE_SUMMARIZER = "collapsedPkg";
1
+ import path from "node:path";
2
+ const DEFAULT_CONSOLE_MAX_COLS = 80;
3
+ const CONSOLE_SUMMARIZER = "rbCwd";
3
4
  function generateConsoleTextCoverageReport(reports, context) {
4
5
  const debug = resolveConsoleReportDebugInfo();
5
- const summarizer = registerCollapsedPkgSummarizer(context);
6
+ const summarizer = registerConsoleSummarizer(context);
6
7
  writeConsoleReportDebugLog({ ...debug, summarizer });
7
8
  const reportOutput = createConsoleTextReportOutput(reports, context, {
8
9
  maxCols: debug.maxCols + 20,
9
10
  summarizer
10
11
  });
11
- return stripUncoveredLineNumbersColumn(reportOutput);
12
+ return { output: stripUncoveredLineNumbersColumn(reportOutput), summarizer };
12
13
  }
13
14
  function resolveConsoleReportDebugInfo() {
14
15
  const isTTY = Boolean(process.stdout.isTTY);
@@ -74,7 +75,7 @@ function stripUncoveredLineNumbersColumn(output) {
74
75
  });
75
76
  return filtered.join("\n");
76
77
  }
77
- function registerCollapsedPkgSummarizer(context) {
78
+ function registerConsoleSummarizer(context) {
78
79
  const summarizerFactory = context?._summarizerFactory;
79
80
  if (!summarizerFactory || typeof summarizerFactory !== "object") {
80
81
  return void 0;
@@ -87,11 +88,12 @@ function registerCollapsedPkgSummarizer(context) {
87
88
  if (!pkgRoot) {
88
89
  return void 0;
89
90
  }
90
- summarizerFactory[CONSOLE_SUMMARIZER] = createCollapsedPkgTree(pkgRoot);
91
+ summarizerFactory[CONSOLE_SUMMARIZER] = createCollapsedCwdTree(pkgRoot, process.cwd());
91
92
  return CONSOLE_SUMMARIZER;
92
93
  }
93
- function createCollapsedPkgTree(root) {
94
- const clonedRoot = cloneReportNode(root, null);
94
+ function createCollapsedCwdTree(root, cwd) {
95
+ const treeRoot = createCwdTreeFromCoverage(root, cwd);
96
+ const clonedRoot = cloneReportNode(treeRoot, null);
95
97
  return {
96
98
  getRoot: () => clonedRoot,
97
99
  visit: (visitor, state) => {
@@ -102,6 +104,104 @@ function createCollapsedPkgTree(root) {
102
104
  }
103
105
  };
104
106
  }
107
+ function createCwdTreeFromCoverage(root, cwd) {
108
+ const proto = Object.getPrototypeOf(root);
109
+ const pathCtor = root?.path?.constructor;
110
+ const fileCoverages = [];
111
+ collectFileCoverages(root, fileCoverages);
112
+ const treeRoot = Object.create(proto);
113
+ treeRoot.path = pathCtor ? new pathCtor([]) : root.path;
114
+ treeRoot.fileCoverage = null;
115
+ treeRoot.parent = null;
116
+ treeRoot.children = [];
117
+ const dirNodes = /* @__PURE__ */ new Map();
118
+ dirNodes.set("", treeRoot);
119
+ for (const fileCoverage of fileCoverages) {
120
+ const absolutePath = path.resolve(String(fileCoverage?.path ?? ""));
121
+ if (!absolutePath) {
122
+ continue;
123
+ }
124
+ let relativePath = toPosix(path.relative(cwd, absolutePath));
125
+ if (!relativePath) {
126
+ relativePath = toPosix(absolutePath);
127
+ }
128
+ if (isInsideCwd(relativePath) && (relativePath === "src" || relativePath.startsWith("src/"))) {
129
+ relativePath = relativePath === "src" ? "" : relativePath.slice("src/".length);
130
+ }
131
+ if (!relativePath) {
132
+ relativePath = toPosix(path.basename(absolutePath));
133
+ }
134
+ const segments = relativePath.split("/").filter(Boolean);
135
+ if (segments.length === 0) {
136
+ continue;
137
+ }
138
+ let parent = treeRoot;
139
+ let prefix = "";
140
+ for (let i = 0; i < segments.length - 1; i += 1) {
141
+ prefix = prefix ? `${prefix}/${segments[i]}` : segments[i];
142
+ const existing = dirNodes.get(prefix);
143
+ if (existing) {
144
+ parent = existing;
145
+ continue;
146
+ }
147
+ const dirNode = Object.create(proto);
148
+ dirNode.path = pathCtor ? new pathCtor(prefix.split("/")) : root.path;
149
+ dirNode.fileCoverage = null;
150
+ dirNode.parent = parent;
151
+ dirNode.children = [];
152
+ parent.children.push(dirNode);
153
+ dirNodes.set(prefix, dirNode);
154
+ parent = dirNode;
155
+ }
156
+ const fileNode = Object.create(proto);
157
+ fileNode.path = pathCtor ? new pathCtor(segments) : root.path;
158
+ fileNode.fileCoverage = fileCoverage;
159
+ fileNode.parent = parent;
160
+ fileNode.children = [];
161
+ parent.children.push(fileNode);
162
+ }
163
+ sortReportTree(treeRoot);
164
+ return treeRoot;
165
+ }
166
+ function collectFileCoverages(node, out) {
167
+ if (!node || typeof node.isSummary !== "function") {
168
+ return;
169
+ }
170
+ if (!node.isSummary()) {
171
+ const fileCoverage = typeof node.getFileCoverage === "function" ? node.getFileCoverage() : node.fileCoverage;
172
+ if (fileCoverage) {
173
+ out.push(fileCoverage);
174
+ }
175
+ return;
176
+ }
177
+ const children = typeof node.getChildren === "function" ? node.getChildren() : [];
178
+ for (const child of children) {
179
+ collectFileCoverages(child, out);
180
+ }
181
+ }
182
+ function sortReportTree(node) {
183
+ const children = Array.isArray(node?.children) ? node.children : [];
184
+ if (children.length === 0) {
185
+ return;
186
+ }
187
+ children.sort((a, b) => {
188
+ const aKey = typeof a?.path?.toString === "function" ? a.path.toString() : "";
189
+ const bKey = typeof b?.path?.toString === "function" ? b.path.toString() : "";
190
+ return aKey < bKey ? -1 : aKey > bKey ? 1 : 0;
191
+ });
192
+ for (const child of children) {
193
+ sortReportTree(child);
194
+ }
195
+ }
196
+ function isInsideCwd(relativePosix) {
197
+ if (!relativePosix) {
198
+ return false;
199
+ }
200
+ return !(relativePosix === ".." || relativePosix.startsWith("../"));
201
+ }
202
+ function toPosix(input) {
203
+ return String(input ?? "").split(path.sep).join("/");
204
+ }
105
205
  function toFullVisitor(visitor) {
106
206
  const call = (method) => (node, state) => {
107
207
  if (typeof visitor?.[method] === "function") {
@@ -1 +1 @@
1
- {"version":3,"file":"console-text-report.js","sources":["../../src/coverage/console-text-report.ts"],"sourcesContent":["const DEFAULT_CONSOLE_MAX_COLS = 90\nconst CONSOLE_SUMMARIZER = \"collapsedPkg\"\n\nexport function generateConsoleTextCoverageReport(reports: any, context: any): string {\n const debug = resolveConsoleReportDebugInfo()\n const summarizer = registerCollapsedPkgSummarizer(context)\n writeConsoleReportDebugLog({ ...debug, summarizer })\n\n const reportOutput = createConsoleTextReportOutput(reports, context, {\n maxCols: debug.maxCols + 20,\n summarizer,\n })\n\n return stripUncoveredLineNumbersColumn(reportOutput)\n}\n\nfunction resolveConsoleReportDebugInfo(): {\n isTTY: boolean\n stdoutColumns: number | undefined\n envColumns: string | undefined\n maxCols: number\n} {\n const isTTY = Boolean(process.stdout.isTTY)\n const stdoutColumns = process.stdout.columns\n const envColumns = process.env.COLUMNS\n const maxCols = resolveConsoleMaxCols(stdoutColumns, envColumns)\n\n return { isTTY, stdoutColumns, envColumns, maxCols }\n}\n\nfunction resolveConsoleMaxCols(stdoutColumns: number | undefined, envColumns: string | undefined): number {\n if (typeof stdoutColumns === \"number\" && Number.isFinite(stdoutColumns) && stdoutColumns > 0) {\n return stdoutColumns\n }\n\n const parsed = typeof envColumns === \"string\" ? Number.parseInt(envColumns, 10) : Number.NaN\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n\n return DEFAULT_CONSOLE_MAX_COLS\n}\n\nfunction writeConsoleReportDebugLog({\n isTTY,\n stdoutColumns,\n envColumns,\n maxCols,\n summarizer,\n}: {\n isTTY: boolean\n stdoutColumns: number | undefined\n envColumns: string | undefined\n maxCols: number\n summarizer: string | undefined\n}): void {\n const message = [\n \"[coverage] debug\",\n `stdout.isTTY=${isTTY ? \"1\" : \"0\"}`,\n `stdout.columns=${stdoutColumns ?? \"undefined\"}`,\n `env.COLUMNS=${envColumns ?? \"undefined\"}`,\n `resolvedMaxCols=${maxCols}`,\n `summarizer=${summarizer ?? \"undefined\"}`,\n ].join(\" \")\n\n process.stderr.write(`${message}\\n`)\n}\n\nfunction createConsoleTextReportOutput(\n reports: any,\n context: any,\n options: { maxCols: number; summarizer?: string },\n): string {\n const fileWriter = context?.writer\n const fileWriterCtor = fileWriter?.constructor\n\n if (\n !fileWriterCtor\n || typeof fileWriterCtor.startCapture !== \"function\"\n || typeof fileWriterCtor.stopCapture !== \"function\"\n || typeof fileWriterCtor.getOutput !== \"function\"\n || typeof fileWriterCtor.resetOutput !== \"function\"\n ) {\n reports.create(\"text\", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context)\n return \"\"\n }\n\n fileWriterCtor.resetOutput()\n fileWriterCtor.startCapture()\n try {\n reports.create(\"text\", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context)\n } finally {\n fileWriterCtor.stopCapture()\n }\n const output = fileWriterCtor.getOutput()\n fileWriterCtor.resetOutput()\n return output\n}\n\nfunction stripUncoveredLineNumbersColumn(output: string): string {\n const lines = output.split(\"\\n\")\n const filtered = lines.map((line) => {\n const parts = line.split(\"|\")\n if (parts.length < 6) {\n return line.trimEnd()\n }\n return parts.slice(0, 5).join(\"|\").trimEnd()\n })\n return filtered.join(\"\\n\")\n}\n\nfunction registerCollapsedPkgSummarizer(context: any): string | undefined {\n const summarizerFactory = context?._summarizerFactory\n if (!summarizerFactory || typeof summarizerFactory !== \"object\") {\n return undefined\n }\n\n if (CONSOLE_SUMMARIZER in summarizerFactory) {\n return CONSOLE_SUMMARIZER\n }\n\n const pkgTree = context.getTree?.(\"pkg\")\n const pkgRoot = pkgTree?.getRoot?.()\n if (!pkgRoot) {\n return undefined\n }\n\n summarizerFactory[CONSOLE_SUMMARIZER] = createCollapsedPkgTree(pkgRoot)\n return CONSOLE_SUMMARIZER\n}\n\nfunction createCollapsedPkgTree(root: any): { getRoot: () => any; visit: (visitor: any, state: any) => void } {\n const clonedRoot = cloneReportNode(root, null)\n return {\n getRoot: () => clonedRoot,\n visit: (visitor: any, state: any) => {\n const fullVisitor = toFullVisitor(visitor)\n fullVisitor.onStart(clonedRoot, state)\n clonedRoot.visit(fullVisitor, state)\n fullVisitor.onEnd(clonedRoot, state)\n },\n }\n}\n\nfunction toFullVisitor(visitor: any): {\n onStart: (node: any, state: any) => void\n onEnd: (node: any, state: any) => void\n onSummary: (node: any, state: any) => void\n onSummaryEnd: (node: any, state: any) => void\n onDetail: (node: any, state: any) => void\n} {\n const call = (method: string) => (node: any, state: any) => {\n if (typeof visitor?.[method] === \"function\") {\n visitor[method](node, state)\n }\n }\n\n return {\n onStart: call(\"onStart\"),\n onEnd: call(\"onEnd\"),\n onSummary: call(\"onSummary\"),\n onSummaryEnd: call(\"onSummaryEnd\"),\n onDetail: call(\"onDetail\"),\n }\n}\n\nfunction cloneReportNode(node: any, parent: any): any {\n const clone = Object.create(Object.getPrototypeOf(node))\n clone.path = node.path\n clone.fileCoverage = node.fileCoverage\n clone.parent = parent\n\n const children: any[] = typeof node.getChildren === \"function\" ? node.getChildren() : []\n clone.children = children.flatMap((child) => cloneOrCollapseNode(child, clone))\n\n return clone\n}\n\nfunction cloneOrCollapseNode(node: any, parent: any): any[] {\n if (\n typeof node?.isSummary === \"function\"\n && node.isSummary()\n && typeof node.isRoot === \"function\"\n && !node.isRoot()\n && typeof node.getChildren === \"function\"\n ) {\n const children = node.getChildren()\n if (\n Array.isArray(children)\n && children.length === 1\n && typeof children[0]?.isSummary === \"function\"\n && !children[0].isSummary()\n ) {\n return [cloneReportNode(children[0], parent)]\n }\n }\n\n return [cloneReportNode(node, parent)]\n}\n\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"console-text-report.js","sources":["../../src/coverage/console-text-report.ts"],"sourcesContent":["import path from \"node:path\"\n\n\nconst DEFAULT_CONSOLE_MAX_COLS = 80\nconst CONSOLE_SUMMARIZER = \"rbCwd\"\n\nexport function generateConsoleTextCoverageReport(\n reports: any,\n context: any,\n): { output: string; summarizer: string | undefined } {\n const debug = resolveConsoleReportDebugInfo()\n const summarizer = registerConsoleSummarizer(context)\n writeConsoleReportDebugLog({ ...debug, summarizer })\n\n const reportOutput = createConsoleTextReportOutput(reports, context, {\n maxCols: debug.maxCols + 20,\n summarizer,\n })\n\n return { output: stripUncoveredLineNumbersColumn(reportOutput), summarizer }\n}\n\nfunction resolveConsoleReportDebugInfo(): {\n isTTY: boolean\n stdoutColumns: number | undefined\n envColumns: string | undefined\n maxCols: number\n} {\n const isTTY = Boolean(process.stdout.isTTY)\n const stdoutColumns = process.stdout.columns\n const envColumns = process.env.COLUMNS\n const maxCols = resolveConsoleMaxCols(stdoutColumns, envColumns)\n\n return { isTTY, stdoutColumns, envColumns, maxCols }\n}\n\nfunction resolveConsoleMaxCols(stdoutColumns: number | undefined, envColumns: string | undefined): number {\n if (typeof stdoutColumns === \"number\" && Number.isFinite(stdoutColumns) && stdoutColumns > 0) {\n return stdoutColumns\n }\n\n const parsed = typeof envColumns === \"string\" ? Number.parseInt(envColumns, 10) : Number.NaN\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n\n return DEFAULT_CONSOLE_MAX_COLS\n}\n\nfunction writeConsoleReportDebugLog({\n isTTY,\n stdoutColumns,\n envColumns,\n maxCols,\n summarizer,\n}: {\n isTTY: boolean\n stdoutColumns: number | undefined\n envColumns: string | undefined\n maxCols: number\n summarizer: string | undefined\n}): void {\n const message = [\n \"[coverage] debug\",\n `stdout.isTTY=${isTTY ? \"1\" : \"0\"}`,\n `stdout.columns=${stdoutColumns ?? \"undefined\"}`,\n `env.COLUMNS=${envColumns ?? \"undefined\"}`,\n `resolvedMaxCols=${maxCols}`,\n `summarizer=${summarizer ?? \"undefined\"}`,\n ].join(\" \")\n\n process.stderr.write(`${message}\\n`)\n}\n\nfunction createConsoleTextReportOutput(\n reports: any,\n context: any,\n options: { maxCols: number; summarizer?: string },\n): string {\n const fileWriter = context?.writer\n const fileWriterCtor = fileWriter?.constructor\n\n if (\n !fileWriterCtor\n || typeof fileWriterCtor.startCapture !== \"function\"\n || typeof fileWriterCtor.stopCapture !== \"function\"\n || typeof fileWriterCtor.getOutput !== \"function\"\n || typeof fileWriterCtor.resetOutput !== \"function\"\n ) {\n reports.create(\"text\", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context)\n return \"\"\n }\n\n fileWriterCtor.resetOutput()\n fileWriterCtor.startCapture()\n try {\n reports.create(\"text\", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context)\n } finally {\n fileWriterCtor.stopCapture()\n }\n const output = fileWriterCtor.getOutput()\n fileWriterCtor.resetOutput()\n return output\n}\n\nfunction stripUncoveredLineNumbersColumn(output: string): string {\n const lines = output.split(\"\\n\")\n const filtered = lines.map((line) => {\n const parts = line.split(\"|\")\n if (parts.length < 6) {\n return line.trimEnd()\n }\n return parts.slice(0, 5).join(\"|\").trimEnd()\n })\n return filtered.join(\"\\n\")\n}\n\nfunction registerConsoleSummarizer(context: any): string | undefined {\n const summarizerFactory = context?._summarizerFactory\n if (!summarizerFactory || typeof summarizerFactory !== \"object\") {\n return undefined\n }\n\n if (CONSOLE_SUMMARIZER in summarizerFactory) {\n return CONSOLE_SUMMARIZER\n }\n\n const pkgTree = context.getTree?.(\"pkg\")\n const pkgRoot = pkgTree?.getRoot?.()\n if (!pkgRoot) {\n return undefined\n }\n\n summarizerFactory[CONSOLE_SUMMARIZER] = createCollapsedCwdTree(pkgRoot, process.cwd())\n return CONSOLE_SUMMARIZER\n}\n\nfunction createCollapsedCwdTree(\n root: any,\n cwd: string,\n): { getRoot: () => any; visit: (visitor: any, state: any) => void } {\n const treeRoot = createCwdTreeFromCoverage(root, cwd)\n const clonedRoot = cloneReportNode(treeRoot, null)\n return {\n getRoot: () => clonedRoot,\n visit: (visitor: any, state: any) => {\n const fullVisitor = toFullVisitor(visitor)\n fullVisitor.onStart(clonedRoot, state)\n clonedRoot.visit(fullVisitor, state)\n fullVisitor.onEnd(clonedRoot, state)\n },\n }\n}\n\nfunction createCwdTreeFromCoverage(root: any, cwd: string): any {\n const proto = Object.getPrototypeOf(root)\n const pathCtor = root?.path?.constructor\n\n const fileCoverages: any[] = []\n collectFileCoverages(root, fileCoverages)\n\n const treeRoot = Object.create(proto)\n treeRoot.path = pathCtor ? new pathCtor([]) : root.path\n treeRoot.fileCoverage = null\n treeRoot.parent = null\n treeRoot.children = []\n\n const dirNodes = new Map<string, any>()\n dirNodes.set(\"\", treeRoot)\n\n for (const fileCoverage of fileCoverages) {\n const absolutePath = path.resolve(String(fileCoverage?.path ?? \"\"))\n if (!absolutePath) {\n continue\n }\n\n let relativePath = toPosix(path.relative(cwd, absolutePath))\n if (!relativePath) {\n relativePath = toPosix(absolutePath)\n }\n\n if (isInsideCwd(relativePath) && (relativePath === \"src\" || relativePath.startsWith(\"src/\"))) {\n relativePath = relativePath === \"src\" ? \"\" : relativePath.slice(\"src/\".length)\n }\n\n if (!relativePath) {\n relativePath = toPosix(path.basename(absolutePath))\n }\n\n const segments = relativePath.split(\"/\").filter(Boolean)\n if (segments.length === 0) {\n continue\n }\n\n let parent = treeRoot\n let prefix = \"\"\n\n for (let i = 0; i < segments.length - 1; i += 1) {\n prefix = prefix ? `${prefix}/${segments[i]}` : segments[i]\n const existing = dirNodes.get(prefix)\n if (existing) {\n parent = existing\n continue\n }\n\n const dirNode = Object.create(proto)\n dirNode.path = pathCtor ? new pathCtor(prefix.split(\"/\")) : root.path\n dirNode.fileCoverage = null\n dirNode.parent = parent\n dirNode.children = []\n parent.children.push(dirNode)\n dirNodes.set(prefix, dirNode)\n parent = dirNode\n }\n\n const fileNode = Object.create(proto)\n fileNode.path = pathCtor ? new pathCtor(segments) : root.path\n fileNode.fileCoverage = fileCoverage\n fileNode.parent = parent\n fileNode.children = []\n parent.children.push(fileNode)\n }\n\n sortReportTree(treeRoot)\n\n return treeRoot\n}\n\nfunction collectFileCoverages(node: any, out: any[]): void {\n if (!node || typeof node.isSummary !== \"function\") {\n return\n }\n\n if (!node.isSummary()) {\n const fileCoverage = typeof node.getFileCoverage === \"function\" ? node.getFileCoverage() : node.fileCoverage\n if (fileCoverage) {\n out.push(fileCoverage)\n }\n return\n }\n\n const children: any[] = typeof node.getChildren === \"function\" ? node.getChildren() : []\n for (const child of children) {\n collectFileCoverages(child, out)\n }\n}\n\nfunction sortReportTree(node: any): void {\n const children: any[] = Array.isArray(node?.children) ? node.children : []\n if (children.length === 0) {\n return\n }\n\n children.sort((a, b) => {\n const aKey = typeof a?.path?.toString === \"function\" ? a.path.toString() : \"\"\n const bKey = typeof b?.path?.toString === \"function\" ? b.path.toString() : \"\"\n return aKey < bKey ? -1 : aKey > bKey ? 1 : 0\n })\n\n for (const child of children) {\n sortReportTree(child)\n }\n}\n\nfunction isInsideCwd(relativePosix: string): boolean {\n if (!relativePosix) {\n return false\n }\n return !(relativePosix === \"..\" || relativePosix.startsWith(\"../\"))\n}\n\nfunction toPosix(input: string): string {\n return String(input ?? \"\").split(path.sep).join(\"/\")\n}\n\nfunction toFullVisitor(visitor: any): {\n onStart: (node: any, state: any) => void\n onEnd: (node: any, state: any) => void\n onSummary: (node: any, state: any) => void\n onSummaryEnd: (node: any, state: any) => void\n onDetail: (node: any, state: any) => void\n} {\n const call = (method: string) => (node: any, state: any) => {\n if (typeof visitor?.[method] === \"function\") {\n visitor[method](node, state)\n }\n }\n\n return {\n onStart: call(\"onStart\"),\n onEnd: call(\"onEnd\"),\n onSummary: call(\"onSummary\"),\n onSummaryEnd: call(\"onSummaryEnd\"),\n onDetail: call(\"onDetail\"),\n }\n}\n\nfunction cloneReportNode(node: any, parent: any): any {\n const clone = Object.create(Object.getPrototypeOf(node))\n clone.path = node.path\n clone.fileCoverage = node.fileCoverage\n clone.parent = parent\n\n const children: any[] = typeof node.getChildren === \"function\" ? node.getChildren() : []\n clone.children = children.flatMap((child) => cloneOrCollapseNode(child, clone))\n\n return clone\n}\n\nfunction cloneOrCollapseNode(node: any, parent: any): any[] {\n if (\n typeof node?.isSummary === \"function\"\n && node.isSummary()\n && typeof node.isRoot === \"function\"\n && !node.isRoot()\n && typeof node.getChildren === \"function\"\n ) {\n const children = node.getChildren()\n if (\n Array.isArray(children)\n && children.length === 1\n && typeof children[0]?.isSummary === \"function\"\n && !children[0].isSummary()\n ) {\n return [cloneReportNode(children[0], parent)]\n }\n }\n\n return [cloneReportNode(node, parent)]\n}\n"],"names":[],"mappings":"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"}
@@ -49,9 +49,9 @@ async function generateCoverageReport(config) {
49
49
  coverageMap,
50
50
  defaultSummarizer: "pkg"
51
51
  });
52
- const reportOutput = generateConsoleTextCoverageReport(reports, context);
52
+ const { output: reportOutput, summarizer } = generateConsoleTextCoverageReport(reports, context);
53
53
  process.stdout.write(reportOutput);
54
- reports.create("text", { file: TEXT_REPORT_FILENAME }).execute(context);
54
+ reports.create("text", { file: TEXT_REPORT_FILENAME, summarizer }).execute(context);
55
55
  console.log(`[coverage] Full text report saved to ${path.join(config.coverageReportDir, TEXT_REPORT_FILENAME)}`);
56
56
  const summary = coverageMap.getCoverageSummary();
57
57
  enforceThresholds(summary, config.thresholds, "global");
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sources":["../../src/coverage/report.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nimport * as libCoverage from \"istanbul-lib-coverage\"\nimport * as libInstrument from \"istanbul-lib-instrument\"\nimport fg from \"fast-glob\"\nimport picomatch from \"picomatch\"\nimport v8ToIstanbul from \"v8-to-istanbul\"\n\nimport { createCollectCoverageMatcher, toPosix } from \"./collect\"\nimport { generateConsoleTextCoverageReport } from \"./console-text-report\"\nimport { findCoverageFiles } from \"./files\"\nimport type { CoverageConfig, CoverageThresholdTarget, CoverageThresholds } from \"./types\"\n\n\nconst TEXT_REPORT_FILENAME = \"coverage.txt\"\n\nexport class CoverageThresholdError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"CoverageThresholdError\"\n }\n}\n\nexport async function generateCoverageReport(config: CoverageConfig): Promise<void> {\n const coverageFiles = await findCoverageFiles(config)\n\n if (coverageFiles.length === 0) {\n console.warn(\"[coverage] no V8 coverage artifacts were generated\")\n return\n }\n\n const coverageLib = resolveCoverageLib()\n const coverageMap = coverageLib.createCoverageMap({})\n const matchesCollectCoverageFrom = createCollectCoverageMatcher(config.collectCoverageFrom, config.rootDir)\n\n for (const file of coverageFiles) {\n const payload = await readCoverageFile(file)\n if (!payload) {\n continue\n }\n\n for (const script of payload.scripts as any[]) {\n await mergeScriptCoverage(coverageMap, script, config, matchesCollectCoverageFrom)\n }\n }\n\n if (config.includeAllFiles) {\n await includeUntestedFiles(coverageMap, config, matchesCollectCoverageFrom)\n }\n\n if (coverageMap.files().length === 0) {\n console.warn(\"[coverage] no library files matched the coverage filters\")\n return\n }\n\n await fs.rm(config.coverageReportDir, { recursive: true, force: true })\n await fs.mkdir(config.coverageReportDir, { recursive: true })\n\n const { createContext, reports } = await loadIstanbulModules()\n const context = createContext({\n dir: config.coverageReportDir,\n coverageMap,\n defaultSummarizer: \"pkg\",\n })\n\n const reportOutput = generateConsoleTextCoverageReport(reports, context)\n process.stdout.write(reportOutput)\n reports.create(\"text\", { file: TEXT_REPORT_FILENAME }).execute(context)\n\n console.log(`[coverage] Full text report saved to ${path.join(config.coverageReportDir, TEXT_REPORT_FILENAME)}`)\n\n const summary = coverageMap.getCoverageSummary()\n enforceThresholds(summary, config.thresholds, \"global\")\n\n const targets: CoverageThresholdTarget[] = Array.isArray(config.thresholdTargets) ? config.thresholdTargets : []\n if (targets.length > 0) {\n const fileSummaries = buildFileSummaries(coverageMap, config.rootDir)\n for (const target of targets) {\n const matcher = createGlobMatcher(target.pattern)\n const matchResult = collectTargetSummary(fileSummaries, matcher, coverageLib)\n\n if (matchResult.matched === 0) {\n console.warn(\n `[coverage] threshold pattern \"${target.pattern}\" did not match any files — skipping`,\n )\n continue\n }\n\n enforceThresholds(matchResult.summary, target.thresholds, target.pattern)\n }\n }\n}\n\nexport async function collectCoveredFiles(config: CoverageConfig): Promise<string[]> {\n const coverageFiles = await findCoverageFiles(config)\n if (coverageFiles.length === 0) {\n return []\n }\n\n const coverageLib = resolveCoverageLib()\n const coverageMap = coverageLib.createCoverageMap({})\n const matchesCollectCoverageFrom = createCollectCoverageMatcher(config.collectCoverageFrom, config.rootDir)\n\n for (const file of coverageFiles) {\n const payload = await readCoverageFile(file)\n if (!payload) {\n continue\n }\n\n for (const script of payload.scripts as any[]) {\n await mergeScriptCoverage(coverageMap, script, config, matchesCollectCoverageFrom)\n }\n }\n\n return coverageMap.files().sort()\n}\n\nasync function loadIstanbulModules(): Promise<{ createContext: (opts: any) => any; reports: any }> {\n maybeForceColor()\n const [libReportMod, reportsMod]: any[] = await Promise.all([\n import(\"istanbul-lib-report\"),\n import(\"istanbul-reports\"),\n ])\n\n const createContext = typeof libReportMod.createContext === \"function\"\n ? libReportMod.createContext\n : libReportMod.default?.createContext\n\n if (typeof createContext !== \"function\") {\n throw new Error(\"istanbul-lib-report exports are unavailable\")\n }\n\n return {\n createContext,\n reports: reportsMod.default ?? reportsMod,\n }\n}\n\nfunction maybeForceColor(): void {\n if (process.stdout.isTTY) {\n return\n }\n\n if (process.env.FORCE_COLOR !== undefined) {\n return\n }\n\n if (process.env.NO_COLOR !== undefined || process.env.NODE_DISABLE_COLORS !== undefined) {\n return\n }\n\n if (process.env.CI !== undefined) {\n return\n }\n\n process.env.FORCE_COLOR = \"1\"\n}\n\nasync function mergeScriptCoverage(\n coverageMap: any,\n script: any,\n config: CoverageConfig,\n matchesCollectCoverageFrom: (absolutePath: string) => boolean,\n): Promise<void> {\n const scriptPath = script.absolutePath\n if (!scriptPath) {\n return\n }\n\n if (isNodeModulesPath(scriptPath)) {\n return\n }\n\n if (isViteVirtualModulePath(scriptPath)) {\n return\n }\n\n let source = script.source && script.source.length > 0\n ? script.source\n : \"\"\n\n if (!source) {\n try {\n source = await fs.readFile(scriptPath, \"utf8\")\n } catch (error: any) {\n const base = path.basename(scriptPath)\n if (error?.code === \"ENOENT\" && base && !base.includes(\".\")) {\n return\n }\n if (error?.code === \"ENOENT\" && !matchesCollectCoverageFrom(scriptPath)) {\n return\n }\n throw error\n }\n }\n\n const sourceMap = await loadSourceMapForScript(scriptPath, source)\n const converter = v8ToIstanbul(\n scriptPath,\n 0,\n sourceMap ? { source, sourceMap: { sourcemap: sourceMap } } : { source },\n )\n await converter.load()\n converter.applyCoverage(script.functions)\n\n const filtered = filterCoverageMap(converter.toIstanbul(), config, matchesCollectCoverageFrom)\n if (Object.keys(filtered).length > 0) {\n coverageMap.merge(filtered)\n }\n}\n\nasync function readCoverageFile(file: string): Promise<any | null> {\n try {\n const raw = await fs.readFile(file, \"utf8\")\n return JSON.parse(raw)\n } catch (error) {\n console.warn(`[coverage] failed to parse ${file}:`, error)\n return null\n }\n}\n\nfunction enforceThresholds(summary: any, thresholds: CoverageThresholds, label = \"global\"): void {\n const failures = []\n\n for (const metric of Object.keys(thresholds) as Array<keyof CoverageThresholds>) {\n const minimum = thresholds[metric]\n const actual = summary[metric]?.pct ?? 0\n if (actual < minimum) {\n failures.push({ metric, actual, minimum })\n }\n }\n\n if (failures.length === 0) {\n return\n }\n\n const details = failures\n .map(({ metric, actual, minimum }) => `${metric}: ${actual.toFixed(2)}% < ${minimum}%`)\n .join(\"; \")\n\n throw new CoverageThresholdError(`[coverage] thresholds not met (target: ${label}) — ${details}`)\n}\n\nfunction resolveCoverageLib(): any {\n const candidate: any = libCoverage as any\n if (typeof candidate.createCoverageMap === \"function\") {\n return candidate\n }\n\n if (candidate.default && typeof candidate.default.createCoverageMap === \"function\") {\n return candidate.default\n }\n\n throw new Error(\"istanbul-lib-coverage exports are unavailable\")\n}\n\nfunction resolveInstrumentLib(): any {\n const candidate: any = libInstrument as any\n if (typeof candidate.createInstrumenter === \"function\") {\n return candidate\n }\n\n if (candidate.default && typeof candidate.default.createInstrumenter === \"function\") {\n return candidate.default\n }\n\n throw new Error(\"istanbul-lib-instrument exports are unavailable\")\n}\n\nasync function includeUntestedFiles(\n coverageMap: any,\n config: CoverageConfig,\n matchesCollectCoverageFrom: (absolutePath: string) => boolean,\n): Promise<void> {\n const existing = new Set(\n coverageMap.files().map((filePath: unknown) => path.resolve(String(filePath ?? \"\"))),\n )\n\n const candidates = await findCollectCoverageFiles(config, matchesCollectCoverageFrom)\n if (candidates.length === 0) {\n return\n }\n\n const instrumentLib = resolveInstrumentLib()\n const instrumenter = instrumentLib.createInstrumenter({\n esModules: true,\n parserPlugins: [\n \"typescript\",\n \"jsx\",\n \"classProperties\",\n \"classPrivateProperties\",\n \"classPrivateMethods\",\n \"decorators-legacy\",\n \"importMeta\",\n \"topLevelAwait\",\n ],\n })\n\n for (const filePath of candidates) {\n const normalized = path.resolve(filePath)\n if (existing.has(normalized)) {\n continue\n }\n\n const source = await fs.readFile(normalized, \"utf8\").catch(() => null)\n if (source === null) {\n continue\n }\n\n try {\n instrumenter.instrumentSync(source, normalized)\n const fileCoverage = instrumenter.lastFileCoverage()\n if (!fileCoverage) {\n continue\n }\n coverageMap.addFileCoverage(fileCoverage)\n existing.add(normalized)\n } catch (error) {\n const relative = path.relative(config.rootDir, normalized)\n console.warn(\n `[coverage] failed to instrument ${relative && !relative.startsWith(\"..\") ? relative : normalized}:`,\n error,\n )\n }\n }\n}\n\nconst DEFAULT_COLLECT_COVERAGE_IGNORES = [\n \"**/.git/**\",\n \"**/.next/**\",\n \"**/.turbo/**\",\n \"**/.vite/**\",\n \"**/.vitest/**\",\n \"**/build/**\",\n \"**/coverage/**\",\n \"**/dist/**\",\n \"**/node_modules/**\",\n \"**/playwright-report/**\",\n \"**/spec/**\",\n \"**/test/**\",\n \"**/test-results/**\",\n \"**/tests/**\",\n \"**/__tests__/**\",\n \"**/*.d.ts\",\n \"**/*.map\",\n]\n\nasync function findCollectCoverageFiles(\n config: CoverageConfig,\n matchesCollectCoverageFrom: (absolutePath: string) => boolean,\n): Promise<string[]> {\n const patterns = Array.isArray(config.collectCoverageFrom)\n ? config.collectCoverageFrom\n : []\n\n if (patterns.length === 0) {\n return []\n }\n\n const rawFiles = await fg(patterns, {\n cwd: config.rootDir,\n absolute: true,\n dot: true,\n onlyFiles: true,\n unique: true,\n followSymbolicLinks: false,\n ignore: DEFAULT_COLLECT_COVERAGE_IGNORES,\n }).catch(() => [])\n\n const collected = new Set<string>()\n\n for (const file of rawFiles) {\n const normalized = path.resolve(String(file ?? \"\"))\n if (!normalized) {\n continue\n }\n\n if (normalized.endsWith(\".d.ts\") || normalized.endsWith(\".map\")) {\n continue\n }\n\n if (isNodeModulesPath(normalized)) {\n continue\n }\n\n if (isViteVirtualModulePath(normalized)) {\n continue\n }\n\n if (!matchesCollectCoverageFrom(normalized)) {\n continue\n }\n\n collected.add(normalized)\n }\n\n return Array.from(collected).sort()\n}\n\nfunction buildFileSummaries(\n coverageMap: any,\n rootDir: string,\n): Array<{ summary: any; candidates: string[] }> {\n const normalizedRoot = path.resolve(rootDir)\n return coverageMap.files().map((filePath: string) => {\n const normalizedAbsolute = path.resolve(filePath)\n const summary = coverageMap.fileCoverageFor(filePath).toSummary()\n const relativePath = path.relative(normalizedRoot, normalizedAbsolute)\n const candidates = new Set<string>()\n\n if (relativePath) {\n const relativePosix = toPosix(relativePath)\n candidates.add(relativePosix)\n candidates.add(`./${relativePosix}`)\n } else {\n candidates.add(toPosix(path.basename(normalizedAbsolute)))\n }\n\n return {\n summary,\n candidates: Array.from(candidates),\n }\n })\n}\n\nfunction collectTargetSummary(\n fileSummaries: Array<{ summary: any; candidates: string[] }>,\n matcher: (candidate: string) => boolean,\n coverageLib: any,\n): { summary: any; matched: number } {\n const summary = coverageLib.createCoverageSummary()\n let matched = 0\n\n for (const file of fileSummaries) {\n if (file.candidates.some((candidate) => matcher(candidate))) {\n summary.merge(file.summary)\n matched += 1\n }\n }\n\n return { summary, matched }\n}\n\nfunction createGlobMatcher(pattern: string): (candidate: string) => boolean {\n const normalized = toPosix(String(pattern ?? \"\")).trim()\n if (!normalized) {\n return () => false\n }\n if (isAbsoluteGlobPattern(normalized)) {\n throw new Error(`[coverage] threshold patterns must be relative (absolute paths are not supported): \"${pattern}\"`)\n }\n return picomatch(normalized, { dot: true })\n}\n\nfunction isAbsoluteGlobPattern(pattern: string): boolean {\n const normalized = String(pattern ?? \"\").trim()\n if (!normalized) {\n return false\n }\n\n if (normalized.startsWith(\"/\")) {\n return true\n }\n\n if (normalized.startsWith(\"file://\")) {\n return true\n }\n\n return /^[A-Za-z]:\\//.test(normalized)\n}\n\nfunction stripQuery(url: string): string {\n const queryIndex = url.indexOf(\"?\")\n const hashIndex = url.indexOf(\"#\")\n\n const endIndex = Math.min(\n queryIndex === -1 ? Number.POSITIVE_INFINITY : queryIndex,\n hashIndex === -1 ? Number.POSITIVE_INFINITY : hashIndex,\n )\n\n if (!Number.isFinite(endIndex)) {\n return url\n }\n\n return url.slice(0, endIndex)\n}\n\nfunction extractSourceMappingUrl(source: string): string | null {\n const regex = /\\/\\/[#@]\\s*sourceMappingURL=([^\\s]+)/g\n\n let last = null\n let match = null\n\n while ((match = regex.exec(source)) !== null) {\n last = match[1]\n }\n\n return typeof last === \"string\" && last.length > 0 ? last : null\n}\n\nfunction resolveSourceMapPath(scriptPath: string, mappingUrl: string): string {\n const cleaned = stripQuery(mappingUrl)\n\n if (cleaned.startsWith(\"file://\")) {\n return fileURLToPath(cleaned)\n }\n\n if (path.isAbsolute(cleaned)) {\n return cleaned\n }\n\n return path.resolve(path.dirname(scriptPath), cleaned)\n}\n\nfunction filterCoverageMap(\n map: any,\n config: CoverageConfig,\n matchesCollectCoverageFrom: (absolutePath: string) => boolean,\n): Record<string, any> {\n if (!map || typeof map !== \"object\") {\n return {}\n }\n\n const filtered: Record<string, any> = {}\n\n for (const [filePath, fileCoverage] of Object.entries(map)) {\n const absolutePath = resolveCoveragePath(filePath, config.rootDir)\n if (!absolutePath) {\n continue\n }\n\n if (absolutePath.endsWith(\".d.ts\") || absolutePath.endsWith(\".map\")) {\n continue\n }\n\n if (isNodeModulesPath(absolutePath)) {\n continue\n }\n\n if (isViteVirtualModulePath(absolutePath)) {\n continue\n }\n\n if (!matchesCollectCoverageFrom(absolutePath)) {\n continue\n }\n\n if (fileCoverage && typeof fileCoverage === \"object\") {\n filtered[absolutePath] = { ...fileCoverage, path: absolutePath }\n } else {\n filtered[absolutePath] = fileCoverage\n }\n }\n\n return filtered\n}\n\nfunction resolveCoveragePath(filePath: string, rootDir: string): string | null {\n const raw = String(filePath ?? \"\").trim()\n if (!raw) {\n return null\n }\n\n const cleaned = stripQuery(raw)\n\n if (cleaned.startsWith(\"file://\")) {\n try {\n return path.normalize(fileURLToPath(cleaned))\n } catch {\n return null\n }\n }\n\n if (path.isAbsolute(cleaned)) {\n return path.normalize(cleaned)\n }\n\n if (cleaned.includes(\"://\")) {\n return null\n }\n\n return path.normalize(path.resolve(rootDir, cleaned))\n}\n\nfunction isNodeModulesPath(filePath: string): boolean {\n return path\n .normalize(String(filePath ?? \"\"))\n .split(path.sep)\n .includes(\"node_modules\")\n}\n\nfunction isViteVirtualModulePath(filePath: string): boolean {\n const normalized = path.normalize(String(filePath ?? \"\"))\n const baseName = path.basename(normalized)\n return baseName === \"__vite-browser-external\"\n || baseName.startsWith(\"__vite-browser-external:\")\n || baseName.startsWith(\"__vite-\")\n}\n\nfunction parseSourceMapPayload(raw: any): any | null {\n if (!raw || typeof raw !== \"object\") {\n return null\n }\n\n const sources = raw.sources\n if (!Array.isArray(sources) || sources.length === 0) {\n return null\n }\n\n return raw\n}\n\nfunction normalizeSourceMap(sourceMap: any, scriptPath: string): any {\n const root = typeof sourceMap.sourceRoot === \"string\"\n ? sourceMap.sourceRoot.replace(\"file://\", \"\")\n : \"\"\n\n const dir = path.dirname(scriptPath)\n const fixedSources = sourceMap.sources.map((source: unknown) => {\n const raw = String(source ?? \"\")\n const cleaned = stripQuery(raw)\n\n if (cleaned.startsWith(\"file://\")) {\n try {\n return path.normalize(fileURLToPath(cleaned))\n } catch {\n return cleaned\n }\n }\n\n const withoutWebpack = cleaned.replace(/^webpack:\\/\\//, \"\")\n const candidate = path.join(root, withoutWebpack)\n\n if (path.isAbsolute(candidate)) {\n return path.normalize(candidate)\n }\n\n const normalizedCandidate = candidate.split(\"/\").join(path.sep)\n\n if (dir.endsWith(`${path.sep}dist`) && !normalizedCandidate.startsWith(`..${path.sep}`)) {\n if (normalizedCandidate.startsWith(`src${path.sep}`) || normalizedCandidate.startsWith(`lib${path.sep}`)) {\n return path.normalize(path.resolve(dir, \"..\", normalizedCandidate))\n }\n }\n\n return path.normalize(path.resolve(dir, normalizedCandidate))\n })\n\n return {\n ...sourceMap,\n sources: fixedSources,\n }\n}\n\nasync function loadSourceMapForScript(scriptPath: string, source: string): Promise<any | null> {\n const mappingUrl = extractSourceMappingUrl(source)\n if (!mappingUrl) {\n return null\n }\n\n const cleaned = stripQuery(mappingUrl)\n\n if (cleaned.startsWith(\"data:\")) {\n const commaIndex = cleaned.indexOf(\",\")\n if (commaIndex === -1) {\n return null\n }\n\n const meta = cleaned.slice(0, commaIndex)\n const payload = cleaned.slice(commaIndex + 1)\n const raw = meta.includes(\";base64\")\n ? Buffer.from(payload, \"base64\").toString(\"utf8\")\n : decodeURIComponent(payload)\n\n try {\n const parsed = parseSourceMapPayload(JSON.parse(raw))\n return parsed ? normalizeSourceMap(parsed, scriptPath) : null\n } catch {\n return null\n }\n }\n\n try {\n const mapPath = resolveSourceMapPath(scriptPath, cleaned)\n const raw = await fs.readFile(mapPath, \"utf8\")\n const parsed = parseSourceMapPayload(JSON.parse(raw))\n return parsed ? normalizeSourceMap(parsed, scriptPath) : null\n } catch {\n return null\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sources":["../../src/coverage/report.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nimport * as libCoverage from \"istanbul-lib-coverage\"\nimport * as libInstrument from \"istanbul-lib-instrument\"\nimport fg from \"fast-glob\"\nimport picomatch from \"picomatch\"\nimport v8ToIstanbul from \"v8-to-istanbul\"\n\nimport { createCollectCoverageMatcher, toPosix } from \"./collect\"\nimport { generateConsoleTextCoverageReport } from \"./console-text-report\"\nimport { findCoverageFiles } from \"./files\"\nimport type { CoverageConfig, CoverageThresholdTarget, CoverageThresholds } from \"./types\"\n\n\nconst TEXT_REPORT_FILENAME = \"coverage.txt\"\n\nexport class CoverageThresholdError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"CoverageThresholdError\"\n }\n}\n\nexport async function generateCoverageReport(config: CoverageConfig): Promise<void> {\n const coverageFiles = await findCoverageFiles(config)\n\n if (coverageFiles.length === 0) {\n console.warn(\"[coverage] no V8 coverage artifacts were generated\")\n return\n }\n\n const coverageLib = resolveCoverageLib()\n const coverageMap = coverageLib.createCoverageMap({})\n const matchesCollectCoverageFrom = createCollectCoverageMatcher(config.collectCoverageFrom, config.rootDir)\n\n for (const file of coverageFiles) {\n const payload = await readCoverageFile(file)\n if (!payload) {\n continue\n }\n\n for (const script of payload.scripts as any[]) {\n await mergeScriptCoverage(coverageMap, script, config, matchesCollectCoverageFrom)\n }\n }\n\n if (config.includeAllFiles) {\n await includeUntestedFiles(coverageMap, config, matchesCollectCoverageFrom)\n }\n\n if (coverageMap.files().length === 0) {\n console.warn(\"[coverage] no library files matched the coverage filters\")\n return\n }\n\n await fs.rm(config.coverageReportDir, { recursive: true, force: true })\n await fs.mkdir(config.coverageReportDir, { recursive: true })\n\n const { createContext, reports } = await loadIstanbulModules()\n const context = createContext({\n dir: config.coverageReportDir,\n coverageMap,\n defaultSummarizer: \"pkg\",\n })\n\n const { output: reportOutput, summarizer } = generateConsoleTextCoverageReport(reports, context)\n process.stdout.write(reportOutput)\n reports.create(\"text\", { file: TEXT_REPORT_FILENAME, summarizer }).execute(context)\n\n console.log(`[coverage] Full text report saved to ${path.join(config.coverageReportDir, TEXT_REPORT_FILENAME)}`)\n\n const summary = coverageMap.getCoverageSummary()\n enforceThresholds(summary, config.thresholds, \"global\")\n\n const targets: CoverageThresholdTarget[] = Array.isArray(config.thresholdTargets) ? config.thresholdTargets : []\n if (targets.length > 0) {\n const fileSummaries = buildFileSummaries(coverageMap, config.rootDir)\n for (const target of targets) {\n const matcher = createGlobMatcher(target.pattern)\n const matchResult = collectTargetSummary(fileSummaries, matcher, coverageLib)\n\n if (matchResult.matched === 0) {\n console.warn(\n `[coverage] threshold pattern \"${target.pattern}\" did not match any files — skipping`,\n )\n continue\n }\n\n enforceThresholds(matchResult.summary, target.thresholds, target.pattern)\n }\n }\n}\n\nexport async function collectCoveredFiles(config: CoverageConfig): Promise<string[]> {\n const coverageFiles = await findCoverageFiles(config)\n if (coverageFiles.length === 0) {\n return []\n }\n\n const coverageLib = resolveCoverageLib()\n const coverageMap = coverageLib.createCoverageMap({})\n const matchesCollectCoverageFrom = createCollectCoverageMatcher(config.collectCoverageFrom, config.rootDir)\n\n for (const file of coverageFiles) {\n const payload = await readCoverageFile(file)\n if (!payload) {\n continue\n }\n\n for (const script of payload.scripts as any[]) {\n await mergeScriptCoverage(coverageMap, script, config, matchesCollectCoverageFrom)\n }\n }\n\n return coverageMap.files().sort()\n}\n\nasync function loadIstanbulModules(): Promise<{ createContext: (opts: any) => any; reports: any }> {\n maybeForceColor()\n const [libReportMod, reportsMod]: any[] = await Promise.all([\n import(\"istanbul-lib-report\"),\n import(\"istanbul-reports\"),\n ])\n\n const createContext = typeof libReportMod.createContext === \"function\"\n ? libReportMod.createContext\n : libReportMod.default?.createContext\n\n if (typeof createContext !== \"function\") {\n throw new Error(\"istanbul-lib-report exports are unavailable\")\n }\n\n return {\n createContext,\n reports: reportsMod.default ?? reportsMod,\n }\n}\n\nfunction maybeForceColor(): void {\n if (process.stdout.isTTY) {\n return\n }\n\n if (process.env.FORCE_COLOR !== undefined) {\n return\n }\n\n if (process.env.NO_COLOR !== undefined || process.env.NODE_DISABLE_COLORS !== undefined) {\n return\n }\n\n if (process.env.CI !== undefined) {\n return\n }\n\n process.env.FORCE_COLOR = \"1\"\n}\n\nasync function mergeScriptCoverage(\n coverageMap: any,\n script: any,\n config: CoverageConfig,\n matchesCollectCoverageFrom: (absolutePath: string) => boolean,\n): Promise<void> {\n const scriptPath = script.absolutePath\n if (!scriptPath) {\n return\n }\n\n if (isNodeModulesPath(scriptPath)) {\n return\n }\n\n if (isViteVirtualModulePath(scriptPath)) {\n return\n }\n\n let source = script.source && script.source.length > 0\n ? script.source\n : \"\"\n\n if (!source) {\n try {\n source = await fs.readFile(scriptPath, \"utf8\")\n } catch (error: any) {\n const base = path.basename(scriptPath)\n if (error?.code === \"ENOENT\" && base && !base.includes(\".\")) {\n return\n }\n if (error?.code === \"ENOENT\" && !matchesCollectCoverageFrom(scriptPath)) {\n return\n }\n throw error\n }\n }\n\n const sourceMap = await loadSourceMapForScript(scriptPath, source)\n const converter = v8ToIstanbul(\n scriptPath,\n 0,\n sourceMap ? { source, sourceMap: { sourcemap: sourceMap } } : { source },\n )\n await converter.load()\n converter.applyCoverage(script.functions)\n\n const filtered = filterCoverageMap(converter.toIstanbul(), config, matchesCollectCoverageFrom)\n if (Object.keys(filtered).length > 0) {\n coverageMap.merge(filtered)\n }\n}\n\nasync function readCoverageFile(file: string): Promise<any | null> {\n try {\n const raw = await fs.readFile(file, \"utf8\")\n return JSON.parse(raw)\n } catch (error) {\n console.warn(`[coverage] failed to parse ${file}:`, error)\n return null\n }\n}\n\nfunction enforceThresholds(summary: any, thresholds: CoverageThresholds, label = \"global\"): void {\n const failures = []\n\n for (const metric of Object.keys(thresholds) as Array<keyof CoverageThresholds>) {\n const minimum = thresholds[metric]\n const actual = summary[metric]?.pct ?? 0\n if (actual < minimum) {\n failures.push({ metric, actual, minimum })\n }\n }\n\n if (failures.length === 0) {\n return\n }\n\n const details = failures\n .map(({ metric, actual, minimum }) => `${metric}: ${actual.toFixed(2)}% < ${minimum}%`)\n .join(\"; \")\n\n throw new CoverageThresholdError(`[coverage] thresholds not met (target: ${label}) — ${details}`)\n}\n\nfunction resolveCoverageLib(): any {\n const candidate: any = libCoverage as any\n if (typeof candidate.createCoverageMap === \"function\") {\n return candidate\n }\n\n if (candidate.default && typeof candidate.default.createCoverageMap === \"function\") {\n return candidate.default\n }\n\n throw new Error(\"istanbul-lib-coverage exports are unavailable\")\n}\n\nfunction resolveInstrumentLib(): any {\n const candidate: any = libInstrument as any\n if (typeof candidate.createInstrumenter === \"function\") {\n return candidate\n }\n\n if (candidate.default && typeof candidate.default.createInstrumenter === \"function\") {\n return candidate.default\n }\n\n throw new Error(\"istanbul-lib-instrument exports are unavailable\")\n}\n\nasync function includeUntestedFiles(\n coverageMap: any,\n config: CoverageConfig,\n matchesCollectCoverageFrom: (absolutePath: string) => boolean,\n): Promise<void> {\n const existing = new Set(\n coverageMap.files().map((filePath: unknown) => path.resolve(String(filePath ?? \"\"))),\n )\n\n const candidates = await findCollectCoverageFiles(config, matchesCollectCoverageFrom)\n if (candidates.length === 0) {\n return\n }\n\n const instrumentLib = resolveInstrumentLib()\n const instrumenter = instrumentLib.createInstrumenter({\n esModules: true,\n parserPlugins: [\n \"typescript\",\n \"jsx\",\n \"classProperties\",\n \"classPrivateProperties\",\n \"classPrivateMethods\",\n \"decorators-legacy\",\n \"importMeta\",\n \"topLevelAwait\",\n ],\n })\n\n for (const filePath of candidates) {\n const normalized = path.resolve(filePath)\n if (existing.has(normalized)) {\n continue\n }\n\n const source = await fs.readFile(normalized, \"utf8\").catch(() => null)\n if (source === null) {\n continue\n }\n\n try {\n instrumenter.instrumentSync(source, normalized)\n const fileCoverage = instrumenter.lastFileCoverage()\n if (!fileCoverage) {\n continue\n }\n coverageMap.addFileCoverage(fileCoverage)\n existing.add(normalized)\n } catch (error) {\n const relative = path.relative(config.rootDir, normalized)\n console.warn(\n `[coverage] failed to instrument ${relative && !relative.startsWith(\"..\") ? relative : normalized}:`,\n error,\n )\n }\n }\n}\n\nconst DEFAULT_COLLECT_COVERAGE_IGNORES = [\n \"**/.git/**\",\n \"**/.next/**\",\n \"**/.turbo/**\",\n \"**/.vite/**\",\n \"**/.vitest/**\",\n \"**/build/**\",\n \"**/coverage/**\",\n \"**/dist/**\",\n \"**/node_modules/**\",\n \"**/playwright-report/**\",\n \"**/spec/**\",\n \"**/test/**\",\n \"**/test-results/**\",\n \"**/tests/**\",\n \"**/__tests__/**\",\n \"**/*.d.ts\",\n \"**/*.map\",\n]\n\nasync function findCollectCoverageFiles(\n config: CoverageConfig,\n matchesCollectCoverageFrom: (absolutePath: string) => boolean,\n): Promise<string[]> {\n const patterns = Array.isArray(config.collectCoverageFrom)\n ? config.collectCoverageFrom\n : []\n\n if (patterns.length === 0) {\n return []\n }\n\n const rawFiles = await fg(patterns, {\n cwd: config.rootDir,\n absolute: true,\n dot: true,\n onlyFiles: true,\n unique: true,\n followSymbolicLinks: false,\n ignore: DEFAULT_COLLECT_COVERAGE_IGNORES,\n }).catch(() => [])\n\n const collected = new Set<string>()\n\n for (const file of rawFiles) {\n const normalized = path.resolve(String(file ?? \"\"))\n if (!normalized) {\n continue\n }\n\n if (normalized.endsWith(\".d.ts\") || normalized.endsWith(\".map\")) {\n continue\n }\n\n if (isNodeModulesPath(normalized)) {\n continue\n }\n\n if (isViteVirtualModulePath(normalized)) {\n continue\n }\n\n if (!matchesCollectCoverageFrom(normalized)) {\n continue\n }\n\n collected.add(normalized)\n }\n\n return Array.from(collected).sort()\n}\n\nfunction buildFileSummaries(\n coverageMap: any,\n rootDir: string,\n): Array<{ summary: any; candidates: string[] }> {\n const normalizedRoot = path.resolve(rootDir)\n return coverageMap.files().map((filePath: string) => {\n const normalizedAbsolute = path.resolve(filePath)\n const summary = coverageMap.fileCoverageFor(filePath).toSummary()\n const relativePath = path.relative(normalizedRoot, normalizedAbsolute)\n const candidates = new Set<string>()\n\n if (relativePath) {\n const relativePosix = toPosix(relativePath)\n candidates.add(relativePosix)\n candidates.add(`./${relativePosix}`)\n } else {\n candidates.add(toPosix(path.basename(normalizedAbsolute)))\n }\n\n return {\n summary,\n candidates: Array.from(candidates),\n }\n })\n}\n\nfunction collectTargetSummary(\n fileSummaries: Array<{ summary: any; candidates: string[] }>,\n matcher: (candidate: string) => boolean,\n coverageLib: any,\n): { summary: any; matched: number } {\n const summary = coverageLib.createCoverageSummary()\n let matched = 0\n\n for (const file of fileSummaries) {\n if (file.candidates.some((candidate) => matcher(candidate))) {\n summary.merge(file.summary)\n matched += 1\n }\n }\n\n return { summary, matched }\n}\n\nfunction createGlobMatcher(pattern: string): (candidate: string) => boolean {\n const normalized = toPosix(String(pattern ?? \"\")).trim()\n if (!normalized) {\n return () => false\n }\n if (isAbsoluteGlobPattern(normalized)) {\n throw new Error(`[coverage] threshold patterns must be relative (absolute paths are not supported): \"${pattern}\"`)\n }\n return picomatch(normalized, { dot: true })\n}\n\nfunction isAbsoluteGlobPattern(pattern: string): boolean {\n const normalized = String(pattern ?? \"\").trim()\n if (!normalized) {\n return false\n }\n\n if (normalized.startsWith(\"/\")) {\n return true\n }\n\n if (normalized.startsWith(\"file://\")) {\n return true\n }\n\n return /^[A-Za-z]:\\//.test(normalized)\n}\n\nfunction stripQuery(url: string): string {\n const queryIndex = url.indexOf(\"?\")\n const hashIndex = url.indexOf(\"#\")\n\n const endIndex = Math.min(\n queryIndex === -1 ? Number.POSITIVE_INFINITY : queryIndex,\n hashIndex === -1 ? Number.POSITIVE_INFINITY : hashIndex,\n )\n\n if (!Number.isFinite(endIndex)) {\n return url\n }\n\n return url.slice(0, endIndex)\n}\n\nfunction extractSourceMappingUrl(source: string): string | null {\n const regex = /\\/\\/[#@]\\s*sourceMappingURL=([^\\s]+)/g\n\n let last = null\n let match = null\n\n while ((match = regex.exec(source)) !== null) {\n last = match[1]\n }\n\n return typeof last === \"string\" && last.length > 0 ? last : null\n}\n\nfunction resolveSourceMapPath(scriptPath: string, mappingUrl: string): string {\n const cleaned = stripQuery(mappingUrl)\n\n if (cleaned.startsWith(\"file://\")) {\n return fileURLToPath(cleaned)\n }\n\n if (path.isAbsolute(cleaned)) {\n return cleaned\n }\n\n return path.resolve(path.dirname(scriptPath), cleaned)\n}\n\nfunction filterCoverageMap(\n map: any,\n config: CoverageConfig,\n matchesCollectCoverageFrom: (absolutePath: string) => boolean,\n): Record<string, any> {\n if (!map || typeof map !== \"object\") {\n return {}\n }\n\n const filtered: Record<string, any> = {}\n\n for (const [filePath, fileCoverage] of Object.entries(map)) {\n const absolutePath = resolveCoveragePath(filePath, config.rootDir)\n if (!absolutePath) {\n continue\n }\n\n if (absolutePath.endsWith(\".d.ts\") || absolutePath.endsWith(\".map\")) {\n continue\n }\n\n if (isNodeModulesPath(absolutePath)) {\n continue\n }\n\n if (isViteVirtualModulePath(absolutePath)) {\n continue\n }\n\n if (!matchesCollectCoverageFrom(absolutePath)) {\n continue\n }\n\n if (fileCoverage && typeof fileCoverage === \"object\") {\n filtered[absolutePath] = { ...fileCoverage, path: absolutePath }\n } else {\n filtered[absolutePath] = fileCoverage\n }\n }\n\n return filtered\n}\n\nfunction resolveCoveragePath(filePath: string, rootDir: string): string | null {\n const raw = String(filePath ?? \"\").trim()\n if (!raw) {\n return null\n }\n\n const cleaned = stripQuery(raw)\n\n if (cleaned.startsWith(\"file://\")) {\n try {\n return path.normalize(fileURLToPath(cleaned))\n } catch {\n return null\n }\n }\n\n if (path.isAbsolute(cleaned)) {\n return path.normalize(cleaned)\n }\n\n if (cleaned.includes(\"://\")) {\n return null\n }\n\n return path.normalize(path.resolve(rootDir, cleaned))\n}\n\nfunction isNodeModulesPath(filePath: string): boolean {\n return path\n .normalize(String(filePath ?? \"\"))\n .split(path.sep)\n .includes(\"node_modules\")\n}\n\nfunction isViteVirtualModulePath(filePath: string): boolean {\n const normalized = path.normalize(String(filePath ?? \"\"))\n const baseName = path.basename(normalized)\n return baseName === \"__vite-browser-external\"\n || baseName.startsWith(\"__vite-browser-external:\")\n || baseName.startsWith(\"__vite-\")\n}\n\nfunction parseSourceMapPayload(raw: any): any | null {\n if (!raw || typeof raw !== \"object\") {\n return null\n }\n\n const sources = raw.sources\n if (!Array.isArray(sources) || sources.length === 0) {\n return null\n }\n\n return raw\n}\n\nfunction normalizeSourceMap(sourceMap: any, scriptPath: string): any {\n const root = typeof sourceMap.sourceRoot === \"string\"\n ? sourceMap.sourceRoot.replace(\"file://\", \"\")\n : \"\"\n\n const dir = path.dirname(scriptPath)\n const fixedSources = sourceMap.sources.map((source: unknown) => {\n const raw = String(source ?? \"\")\n const cleaned = stripQuery(raw)\n\n if (cleaned.startsWith(\"file://\")) {\n try {\n return path.normalize(fileURLToPath(cleaned))\n } catch {\n return cleaned\n }\n }\n\n const withoutWebpack = cleaned.replace(/^webpack:\\/\\//, \"\")\n const candidate = path.join(root, withoutWebpack)\n\n if (path.isAbsolute(candidate)) {\n return path.normalize(candidate)\n }\n\n const normalizedCandidate = candidate.split(\"/\").join(path.sep)\n\n if (dir.endsWith(`${path.sep}dist`) && !normalizedCandidate.startsWith(`..${path.sep}`)) {\n if (normalizedCandidate.startsWith(`src${path.sep}`) || normalizedCandidate.startsWith(`lib${path.sep}`)) {\n return path.normalize(path.resolve(dir, \"..\", normalizedCandidate))\n }\n }\n\n return path.normalize(path.resolve(dir, normalizedCandidate))\n })\n\n return {\n ...sourceMap,\n sources: fixedSources,\n }\n}\n\nasync function loadSourceMapForScript(scriptPath: string, source: string): Promise<any | null> {\n const mappingUrl = extractSourceMappingUrl(source)\n if (!mappingUrl) {\n return null\n }\n\n const cleaned = stripQuery(mappingUrl)\n\n if (cleaned.startsWith(\"data:\")) {\n const commaIndex = cleaned.indexOf(\",\")\n if (commaIndex === -1) {\n return null\n }\n\n const meta = cleaned.slice(0, commaIndex)\n const payload = cleaned.slice(commaIndex + 1)\n const raw = meta.includes(\";base64\")\n ? Buffer.from(payload, \"base64\").toString(\"utf8\")\n : decodeURIComponent(payload)\n\n try {\n const parsed = parseSourceMapPayload(JSON.parse(raw))\n return parsed ? normalizeSourceMap(parsed, scriptPath) : null\n } catch {\n return null\n }\n }\n\n try {\n const mapPath = resolveSourceMapPath(scriptPath, cleaned)\n const raw = await fs.readFile(mapPath, \"utf8\")\n const parsed = parseSourceMapPayload(JSON.parse(raw))\n return parsed ? normalizeSourceMap(parsed, scriptPath) : null\n } catch {\n return null\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/test",
3
- "version": "0.316.0",
3
+ "version": "0.318.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"