@rpcbase/test 0.334.0 → 0.336.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.
Files changed (37) hide show
  1. package/dist/clearDatabase.js +4 -1
  2. package/dist/clearDatabase.js.map +1 -1
  3. package/dist/cli.js +130 -77
  4. package/dist/cli.js.map +1 -1
  5. package/dist/coverage/collect.js +3 -1
  6. package/dist/coverage/collect.js.map +1 -1
  7. package/dist/coverage/config-loader.js +20 -36
  8. package/dist/coverage/config-loader.js.map +1 -1
  9. package/dist/coverage/config.js +19 -8
  10. package/dist/coverage/config.js.map +1 -1
  11. package/dist/coverage/console-text-report.js +23 -13
  12. package/dist/coverage/console-text-report.js.map +1 -1
  13. package/dist/coverage/files.js +25 -28
  14. package/dist/coverage/files.js.map +1 -1
  15. package/dist/coverage/fixtures.js +3 -1
  16. package/dist/coverage/fixtures.js.map +1 -1
  17. package/dist/coverage/global-setup.js +4 -1
  18. package/dist/coverage/global-setup.js.map +1 -1
  19. package/dist/coverage/index.js +3 -1
  20. package/dist/coverage/index.js.map +1 -1
  21. package/dist/coverage/report.js +55 -62
  22. package/dist/coverage/report.js.map +1 -1
  23. package/dist/coverage/reporter.js +4 -1
  24. package/dist/coverage/reporter.js.map +1 -1
  25. package/dist/coverage/v8-tracker.js +18 -14
  26. package/dist/coverage/v8-tracker.js.map +1 -1
  27. package/dist/index.js +10 -3
  28. package/dist/index.js.map +1 -1
  29. package/dist/serverCoverage.js +6 -2
  30. package/dist/serverCoverage.js.map +1 -1
  31. package/dist/specs-map.d.ts +15 -0
  32. package/dist/specs-map.d.ts.map +1 -0
  33. package/dist/specs-map.js +50 -0
  34. package/dist/specs-map.js.map +1 -0
  35. package/dist/vitest.config.js +14 -14
  36. package/dist/vitest.config.js.map +1 -1
  37. package/package.json +6 -5
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../src/coverage/config.ts"],"sourcesContent":["import path from \"node:path\"\n\nimport type { CoverageConfig, CoverageHarnessOptions, CoverageThresholdMap, CoverageThresholdOption, CoverageThresholdTarget, CoverageThresholds } from \"./types\"\n\n\nconst DEFAULT_THRESHOLDS = {\n branches: 60,\n functions: 75,\n lines: 75,\n statements: 75,\n}\n\nconst THRESHOLD_KEYS = Object.keys(DEFAULT_THRESHOLDS) as Array<keyof CoverageThresholds>\nconst THRESHOLD_KEY_SET = new Set<string>(THRESHOLD_KEYS as string[])\n\nexport function createCoverageConfig(options: CoverageHarnessOptions): CoverageConfig {\n const { rootDir } = options as CoverageHarnessOptions\n if (!rootDir) {\n throw new Error(\"createCoverageConfig requires a rootDir\")\n }\n\n const resolvedRootDir = path.resolve(rootDir)\n const includeAllFiles = options.includeAllFiles !== false\n\n const collectCoverageFrom = Array.isArray(options.collectCoverageFrom)\n ? options.collectCoverageFrom\n .map((pattern) => String(pattern ?? \"\").trim())\n .filter((pattern) => pattern.length > 0)\n : []\n\n if (collectCoverageFrom.length === 0) {\n throw new Error(\"createCoverageConfig requires a collectCoverageFrom option\")\n }\n\n const testResultsRoot = path.join(resolvedRootDir, \"build\", \"coverage\")\n const coverageReportDir = path.join(testResultsRoot, \"report\")\n const coverageFileName = options.coverageFileName ?? \"v8-coverage.json\"\n const disabledEnvVar = options.disabledEnvVar ?? \"RB_DISABLE_COVERAGE\"\n const coverageEnabled = process.env[disabledEnvVar] !== \"1\"\n\n const { global: thresholds, targets: thresholdTargets } = normalizeThresholdOptions(options.thresholds)\n\n return {\n rootDir: resolvedRootDir,\n collectCoverageFrom,\n testResultsRoot,\n coverageReportDir,\n coverageFileName,\n thresholds,\n thresholdTargets,\n coverageEnabled,\n disabledEnvVar,\n includeAllFiles,\n }\n}\n\nfunction normalizeThresholdOptions(rawThresholds: CoverageThresholdOption | undefined): {\n global: CoverageThresholds\n targets: CoverageThresholdTarget[]\n} {\n const globalThresholds: CoverageThresholds = { ...DEFAULT_THRESHOLDS }\n const targets: CoverageThresholdTarget[] = []\n\n if (!isPlainObject(rawThresholds)) {\n return { global: globalThresholds, targets }\n }\n\n const thresholdMap = rawThresholds as CoverageThresholdMap\n\n for (const key of THRESHOLD_KEYS) {\n const value = thresholdMap[key]\n if (isThresholdValue(value)) {\n globalThresholds[key] = value\n }\n }\n\n if (Object.prototype.hasOwnProperty.call(thresholdMap, \"global\")) {\n if (!isPlainObject(thresholdMap.global)) {\n throw new Error(\"coverage thresholds: the `global` override must be an object of metric values\")\n }\n Object.assign(globalThresholds, pickThresholdOverrides(thresholdMap.global))\n }\n\n for (const [pattern, overrides] of Object.entries(thresholdMap)) {\n if (pattern === \"global\" || THRESHOLD_KEY_SET.has(pattern)) {\n continue\n }\n\n if (!isPlainObject(overrides)) {\n throw new Error(\n `coverage thresholds: override for \"${pattern}\" must be an object containing coverage metrics`,\n )\n }\n\n targets.push({\n id: pattern,\n pattern,\n thresholds: {\n ...globalThresholds,\n ...pickThresholdOverrides(overrides),\n },\n })\n }\n\n return { global: globalThresholds, targets }\n}\n\nfunction pickThresholdOverrides(source: unknown): Partial<CoverageThresholds> {\n const overrides: Partial<CoverageThresholds> = {}\n if (!isPlainObject(source)) {\n return overrides\n }\n\n for (const key of THRESHOLD_KEYS) {\n const value = (source as any)[key]\n if (isThresholdValue(value)) {\n overrides[key] = value\n }\n }\n\n return overrides\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction isThresholdValue(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value)\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sources":["../../src/coverage/config.ts"],"sourcesContent":["import path from \"node:path\"\n\nimport type { CoverageConfig, CoverageHarnessOptions, CoverageThresholdMap, CoverageThresholdOption, CoverageThresholdTarget, CoverageThresholds } from \"./types\"\n\n\nconst DEFAULT_THRESHOLDS = {\n branches: 60,\n functions: 75,\n lines: 75,\n statements: 75,\n}\n\nconst THRESHOLD_KEYS = Object.keys(DEFAULT_THRESHOLDS) as Array<keyof CoverageThresholds>\nconst THRESHOLD_KEY_SET = new Set<string>(THRESHOLD_KEYS as string[])\n\nexport function createCoverageConfig(options: CoverageHarnessOptions): CoverageConfig {\n const { rootDir } = options as CoverageHarnessOptions\n if (!rootDir) {\n throw new Error(\"createCoverageConfig requires a rootDir\")\n }\n\n const resolvedRootDir = path.resolve(rootDir)\n const includeAllFiles = options.includeAllFiles !== false\n\n const collectCoverageFrom = Array.isArray(options.collectCoverageFrom)\n ? options.collectCoverageFrom\n .map((pattern) => String(pattern ?? \"\").trim())\n .filter((pattern) => pattern.length > 0)\n : []\n\n if (collectCoverageFrom.length === 0) {\n throw new Error(\"createCoverageConfig requires a collectCoverageFrom option\")\n }\n\n const testResultsRoot = path.join(resolvedRootDir, \"build\", \"coverage\")\n const coverageReportDir = path.join(testResultsRoot, \"report\")\n const coverageFileName = options.coverageFileName ?? \"v8-coverage.json\"\n const disabledEnvVar = options.disabledEnvVar ?? \"RB_DISABLE_COVERAGE\"\n const coverageEnabled = process.env[disabledEnvVar] !== \"1\"\n\n const { global: thresholds, targets: thresholdTargets } = normalizeThresholdOptions(options.thresholds)\n\n return {\n rootDir: resolvedRootDir,\n collectCoverageFrom,\n testResultsRoot,\n coverageReportDir,\n coverageFileName,\n thresholds,\n thresholdTargets,\n coverageEnabled,\n disabledEnvVar,\n includeAllFiles,\n }\n}\n\nfunction normalizeThresholdOptions(rawThresholds: CoverageThresholdOption | undefined): {\n global: CoverageThresholds\n targets: CoverageThresholdTarget[]\n} {\n const globalThresholds: CoverageThresholds = { ...DEFAULT_THRESHOLDS }\n const targets: CoverageThresholdTarget[] = []\n\n if (!isPlainObject(rawThresholds)) {\n return { global: globalThresholds, targets }\n }\n\n const thresholdMap = rawThresholds as CoverageThresholdMap\n\n for (const key of THRESHOLD_KEYS) {\n const value = thresholdMap[key]\n if (isThresholdValue(value)) {\n globalThresholds[key] = value\n }\n }\n\n if (Object.prototype.hasOwnProperty.call(thresholdMap, \"global\")) {\n if (!isPlainObject(thresholdMap.global)) {\n throw new Error(\"coverage thresholds: the `global` override must be an object of metric values\")\n }\n Object.assign(globalThresholds, pickThresholdOverrides(thresholdMap.global))\n }\n\n for (const [pattern, overrides] of Object.entries(thresholdMap)) {\n if (pattern === \"global\" || THRESHOLD_KEY_SET.has(pattern)) {\n continue\n }\n\n if (!isPlainObject(overrides)) {\n throw new Error(\n `coverage thresholds: override for \"${pattern}\" must be an object containing coverage metrics`,\n )\n }\n\n targets.push({\n id: pattern,\n pattern,\n thresholds: {\n ...globalThresholds,\n ...pickThresholdOverrides(overrides),\n },\n })\n }\n\n return { global: globalThresholds, targets }\n}\n\nfunction pickThresholdOverrides(source: unknown): Partial<CoverageThresholds> {\n const overrides: Partial<CoverageThresholds> = {}\n if (!isPlainObject(source)) {\n return overrides\n }\n\n for (const key of THRESHOLD_KEYS) {\n const value = (source as any)[key]\n if (isThresholdValue(value)) {\n overrides[key] = value\n }\n }\n\n return overrides\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction isThresholdValue(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value)\n}\n"],"names":["DEFAULT_THRESHOLDS","branches","functions","lines","statements","THRESHOLD_KEYS","Object","keys","THRESHOLD_KEY_SET","Set","createCoverageConfig","options","rootDir","Error","resolvedRootDir","path","resolve","includeAllFiles","collectCoverageFrom","Array","isArray","map","pattern","String","trim","filter","length","testResultsRoot","join","coverageReportDir","coverageFileName","disabledEnvVar","coverageEnabled","process","env","global","thresholds","targets","thresholdTargets","normalizeThresholdOptions","rawThresholds","globalThresholds","isPlainObject","thresholdMap","key","value","isThresholdValue","prototype","hasOwnProperty","call","assign","pickThresholdOverrides","overrides","entries","has","push","id","source","Number","isFinite"],"mappings":"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"}
@@ -4,19 +4,30 @@ const CONSOLE_SUMMARIZER = "rbCwd";
4
4
  function generateConsoleTextCoverageReport(reports, context) {
5
5
  const debug = resolveConsoleReportDebugInfo();
6
6
  const summarizer = registerConsoleSummarizer(context);
7
- writeConsoleReportDebugLog({ ...debug, summarizer });
7
+ writeConsoleReportDebugLog({
8
+ ...debug,
9
+ summarizer
10
+ });
8
11
  const reportOutput = createConsoleTextReportOutput(reports, context, {
9
12
  maxCols: debug.maxCols + 20,
10
13
  summarizer
11
14
  });
12
- return { output: stripUncoveredLineNumbersColumn(reportOutput), summarizer };
15
+ return {
16
+ output: stripUncoveredLineNumbersColumn(reportOutput),
17
+ summarizer
18
+ };
13
19
  }
14
20
  function resolveConsoleReportDebugInfo() {
15
21
  const isTTY = Boolean(process.stdout.isTTY);
16
22
  const stdoutColumns = process.stdout.columns;
17
23
  const envColumns = process.env.COLUMNS;
18
24
  const maxCols = resolveConsoleMaxCols(stdoutColumns, envColumns);
19
- return { isTTY, stdoutColumns, envColumns, maxCols };
25
+ return {
26
+ isTTY,
27
+ stdoutColumns,
28
+ envColumns,
29
+ maxCols
30
+ };
20
31
  }
21
32
  function resolveConsoleMaxCols(stdoutColumns, envColumns) {
22
33
  if (typeof stdoutColumns === "number" && Number.isFinite(stdoutColumns) && stdoutColumns > 0) {
@@ -35,14 +46,7 @@ function writeConsoleReportDebugLog({
35
46
  maxCols,
36
47
  summarizer
37
48
  }) {
38
- const message = [
39
- "[coverage] debug",
40
- `stdout.isTTY=${isTTY ? "1" : "0"}`,
41
- `stdout.columns=${stdoutColumns ?? "undefined"}`,
42
- `env.COLUMNS=${envColumns ?? "undefined"}`,
43
- `resolvedMaxCols=${maxCols}`,
44
- `summarizer=${summarizer ?? "undefined"}`
45
- ].join(" ");
49
+ const message = ["[coverage] debug", `stdout.isTTY=${isTTY ? "1" : "0"}`, `stdout.columns=${stdoutColumns ?? "undefined"}`, `env.COLUMNS=${envColumns ?? "undefined"}`, `resolvedMaxCols=${maxCols}`, `summarizer=${summarizer ?? "undefined"}`].join(" ");
46
50
  process.stderr.write(`${message}
47
51
  `);
48
52
  }
@@ -50,13 +54,19 @@ function createConsoleTextReportOutput(reports, context, options) {
50
54
  const fileWriter = context?.writer;
51
55
  const fileWriterCtor = fileWriter?.constructor;
52
56
  if (!fileWriterCtor || typeof fileWriterCtor.startCapture !== "function" || typeof fileWriterCtor.stopCapture !== "function" || typeof fileWriterCtor.getOutput !== "function" || typeof fileWriterCtor.resetOutput !== "function") {
53
- reports.create("text", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context);
57
+ reports.create("text", {
58
+ maxCols: options.maxCols,
59
+ summarizer: options.summarizer
60
+ }).execute(context);
54
61
  return "";
55
62
  }
56
63
  fileWriterCtor.resetOutput();
57
64
  fileWriterCtor.startCapture();
58
65
  try {
59
- reports.create("text", { maxCols: options.maxCols, summarizer: options.summarizer }).execute(context);
66
+ reports.create("text", {
67
+ maxCols: options.maxCols,
68
+ summarizer: options.summarizer
69
+ }).execute(context);
60
70
  } finally {
61
71
  fileWriterCtor.stopCapture();
62
72
  }
@@ -1 +1 @@
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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"}
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":["DEFAULT_CONSOLE_MAX_COLS","CONSOLE_SUMMARIZER","generateConsoleTextCoverageReport","reports","context","debug","resolveConsoleReportDebugInfo","summarizer","registerConsoleSummarizer","writeConsoleReportDebugLog","reportOutput","createConsoleTextReportOutput","maxCols","output","stripUncoveredLineNumbersColumn","isTTY","Boolean","process","stdout","stdoutColumns","columns","envColumns","env","COLUMNS","resolveConsoleMaxCols","Number","isFinite","parsed","parseInt","NaN","message","join","stderr","write","options","fileWriter","writer","fileWriterCtor","constructor","startCapture","stopCapture","getOutput","resetOutput","create","execute","lines","split","filtered","map","line","parts","length","trimEnd","slice","summarizerFactory","_summarizerFactory","undefined","pkgTree","getTree","pkgRoot","getRoot","createCollapsedCwdTree","cwd","root","treeRoot","createCwdTreeFromCoverage","clonedRoot","cloneReportNode","visit","visitor","state","fullVisitor","toFullVisitor","onStart","onEnd","proto","Object","getPrototypeOf","pathCtor","path","fileCoverages","collectFileCoverages","fileCoverage","parent","children","dirNodes","Map","set","absolutePath","resolve","String","relativePath","toPosix","relative","isInsideCwd","startsWith","basename","segments","filter","prefix","i","existing","get","dirNode","push","fileNode","sortReportTree","node","out","isSummary","getFileCoverage","getChildren","child","Array","isArray","sort","a","b","aKey","toString","bKey","relativePosix","input","sep","call","method","onSummary","onSummaryEnd","onDetail","clone","flatMap","cloneOrCollapseNode","isRoot"],"mappings":"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"}
@@ -2,29 +2,24 @@ import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  function resolveCoverageRoots(config) {
4
4
  const buildDir = path.join(config.rootDir, "build");
5
- const roots = [
6
- path.join(buildDir, "playwright", "coverage"),
7
- path.join(buildDir, "vitest", "coverage"),
8
- path.join(config.testResultsRoot, "playwright"),
9
- path.join(config.testResultsRoot, "vitest")
10
- ];
5
+ const roots = [path.join(buildDir, "playwright", "coverage"), path.join(buildDir, "vitest", "coverage"), path.join(config.testResultsRoot, "playwright"), path.join(config.testResultsRoot, "vitest")];
11
6
  return Array.from(new Set(roots.map((root) => path.resolve(root))));
12
7
  }
13
8
  async function findCoverageFiles(config, root) {
14
9
  const roots = root === void 0 ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root];
15
10
  const files = [];
16
11
  async function walk(current) {
17
- const entries = await fs.readdir(current, { withFileTypes: true });
18
- await Promise.all(
19
- entries.map(async (entry) => {
20
- const entryPath = path.join(current, entry.name);
21
- if (entry.isDirectory()) {
22
- await walk(entryPath);
23
- } else if (entry.isFile() && entry.name === config.coverageFileName) {
24
- files.push(entryPath);
25
- }
26
- })
27
- );
12
+ const entries = await fs.readdir(current, {
13
+ withFileTypes: true
14
+ });
15
+ await Promise.all(entries.map(async (entry) => {
16
+ const entryPath = path.join(current, entry.name);
17
+ if (entry.isDirectory()) {
18
+ await walk(entryPath);
19
+ } else if (entry.isFile() && entry.name === config.coverageFileName) {
20
+ files.push(entryPath);
21
+ }
22
+ }));
28
23
  }
29
24
  for (const root2 of roots) {
30
25
  try {
@@ -42,17 +37,19 @@ async function findCoverageFiles(config, root) {
42
37
  async function removeCoverageFiles(config, root) {
43
38
  const roots = root === void 0 ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root];
44
39
  async function walk(current) {
45
- const entries = await fs.readdir(current, { withFileTypes: true });
46
- await Promise.all(
47
- entries.map(async (entry) => {
48
- const entryPath = path.join(current, entry.name);
49
- if (entry.isDirectory()) {
50
- await walk(entryPath);
51
- } else if (entry.isFile() && entry.name === config.coverageFileName) {
52
- await fs.rm(entryPath, { force: true });
53
- }
54
- })
55
- );
40
+ const entries = await fs.readdir(current, {
41
+ withFileTypes: true
42
+ });
43
+ await Promise.all(entries.map(async (entry) => {
44
+ const entryPath = path.join(current, entry.name);
45
+ if (entry.isDirectory()) {
46
+ await walk(entryPath);
47
+ } else if (entry.isFile() && entry.name === config.coverageFileName) {
48
+ await fs.rm(entryPath, {
49
+ force: true
50
+ });
51
+ }
52
+ }));
56
53
  }
57
54
  for (const root2 of roots) {
58
55
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sources":["../../src/coverage/files.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type { CoverageConfig } from \"./types\"\n\n\nfunction resolveCoverageRoots(config: CoverageConfig): string[] {\n const buildDir = path.join(config.rootDir, \"build\")\n const roots = [\n path.join(buildDir, \"playwright\", \"coverage\"),\n path.join(buildDir, \"vitest\", \"coverage\"),\n path.join(config.testResultsRoot, \"playwright\"),\n path.join(config.testResultsRoot, \"vitest\"),\n ]\n\n return Array.from(new Set(roots.map((root) => path.resolve(root))))\n}\n\nexport async function findCoverageFiles(\n config: CoverageConfig,\n root?: string | string[],\n): Promise<string[]> {\n const roots = root === undefined ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root]\n const files: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fs.readdir(current, { withFileTypes: true })\n await Promise.all(\n entries.map(async (entry) => {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(entryPath)\n } else if (entry.isFile() && entry.name === config.coverageFileName) {\n files.push(entryPath)\n }\n }),\n )\n }\n\n for (const root of roots) {\n try {\n const stats = await fs.stat(root)\n if (!stats.isDirectory()) {\n continue\n }\n } catch {\n continue\n }\n\n await walk(root)\n }\n\n return files.sort()\n}\n\nexport async function removeCoverageFiles(\n config: CoverageConfig,\n root?: string | string[],\n): Promise<void> {\n const roots = root === undefined ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root]\n\n async function walk(current: string): Promise<void> {\n const entries = await fs.readdir(current, { withFileTypes: true })\n await Promise.all(\n entries.map(async (entry) => {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(entryPath)\n } else if (entry.isFile() && entry.name === config.coverageFileName) {\n await fs.rm(entryPath, { force: true })\n }\n }),\n )\n }\n\n for (const root of roots) {\n try {\n await walk(root)\n } catch {\n // ignore cleanup errors\n }\n }\n}\n"],"names":["root"],"mappings":";;AAMA,SAAS,qBAAqB,QAAkC;AAC9D,QAAM,WAAW,KAAK,KAAK,OAAO,SAAS,OAAO;AAClD,QAAM,QAAQ;AAAA,IACZ,KAAK,KAAK,UAAU,cAAc,UAAU;AAAA,IAC5C,KAAK,KAAK,UAAU,UAAU,UAAU;AAAA,IACxC,KAAK,KAAK,OAAO,iBAAiB,YAAY;AAAA,IAC9C,KAAK,KAAK,OAAO,iBAAiB,QAAQ;AAAA,EAAA;AAG5C,SAAO,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC;AACpE;AAEA,eAAsB,kBACpB,QACA,MACmB;AACnB,QAAM,QAAQ,SAAS,SAAY,qBAAqB,MAAM,IAAI,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACpG,QAAM,QAAkB,CAAA;AAExB,iBAAe,KAAK,SAAgC;AAClD,UAAM,UAAU,MAAM,GAAG,QAAQ,SAAS,EAAE,eAAe,MAAM;AACjE,UAAM,QAAQ;AAAA,MACZ,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAM,YAAY,KAAK,KAAK,SAAS,MAAM,IAAI;AAC/C,YAAI,MAAM,eAAe;AACvB,gBAAM,KAAK,SAAS;AAAA,QACtB,WAAW,MAAM,OAAA,KAAY,MAAM,SAAS,OAAO,kBAAkB;AACnE,gBAAM,KAAK,SAAS;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IAAA;AAAA,EAEL;AAEA,aAAWA,SAAQ,OAAO;AACxB,QAAI;AACF,YAAM,QAAQ,MAAM,GAAG,KAAKA,KAAI;AAChC,UAAI,CAAC,MAAM,eAAe;AACxB;AAAA,MACF;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,KAAKA,KAAI;AAAA,EACjB;AAEA,SAAO,MAAM,KAAA;AACf;AAEA,eAAsB,oBACpB,QACA,MACe;AACf,QAAM,QAAQ,SAAS,SAAY,qBAAqB,MAAM,IAAI,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAEpG,iBAAe,KAAK,SAAgC;AAClD,UAAM,UAAU,MAAM,GAAG,QAAQ,SAAS,EAAE,eAAe,MAAM;AACjE,UAAM,QAAQ;AAAA,MACZ,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAM,YAAY,KAAK,KAAK,SAAS,MAAM,IAAI;AAC/C,YAAI,MAAM,eAAe;AACvB,gBAAM,KAAK,SAAS;AAAA,QACtB,WAAW,MAAM,OAAA,KAAY,MAAM,SAAS,OAAO,kBAAkB;AACnE,gBAAM,GAAG,GAAG,WAAW,EAAE,OAAO,MAAM;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,IAAA;AAAA,EAEL;AAEA,aAAWA,SAAQ,OAAO;AACxB,QAAI;AACF,YAAM,KAAKA,KAAI;AAAA,IACjB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;"}
1
+ {"version":3,"file":"files.js","sources":["../../src/coverage/files.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type { CoverageConfig } from \"./types\"\n\n\nfunction resolveCoverageRoots(config: CoverageConfig): string[] {\n const buildDir = path.join(config.rootDir, \"build\")\n const roots = [\n path.join(buildDir, \"playwright\", \"coverage\"),\n path.join(buildDir, \"vitest\", \"coverage\"),\n path.join(config.testResultsRoot, \"playwright\"),\n path.join(config.testResultsRoot, \"vitest\"),\n ]\n\n return Array.from(new Set(roots.map((root) => path.resolve(root))))\n}\n\nexport async function findCoverageFiles(\n config: CoverageConfig,\n root?: string | string[],\n): Promise<string[]> {\n const roots = root === undefined ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root]\n const files: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fs.readdir(current, { withFileTypes: true })\n await Promise.all(\n entries.map(async (entry) => {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(entryPath)\n } else if (entry.isFile() && entry.name === config.coverageFileName) {\n files.push(entryPath)\n }\n }),\n )\n }\n\n for (const root of roots) {\n try {\n const stats = await fs.stat(root)\n if (!stats.isDirectory()) {\n continue\n }\n } catch {\n continue\n }\n\n await walk(root)\n }\n\n return files.sort()\n}\n\nexport async function removeCoverageFiles(\n config: CoverageConfig,\n root?: string | string[],\n): Promise<void> {\n const roots = root === undefined ? resolveCoverageRoots(config) : Array.isArray(root) ? root : [root]\n\n async function walk(current: string): Promise<void> {\n const entries = await fs.readdir(current, { withFileTypes: true })\n await Promise.all(\n entries.map(async (entry) => {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(entryPath)\n } else if (entry.isFile() && entry.name === config.coverageFileName) {\n await fs.rm(entryPath, { force: true })\n }\n }),\n )\n }\n\n for (const root of roots) {\n try {\n await walk(root)\n } catch {\n // ignore cleanup errors\n }\n }\n}\n"],"names":["resolveCoverageRoots","config","buildDir","path","join","rootDir","roots","testResultsRoot","Array","from","Set","map","root","resolve","findCoverageFiles","undefined","isArray","files","walk","current","entries","fs","readdir","withFileTypes","Promise","all","entry","entryPath","name","isDirectory","isFile","coverageFileName","push","stats","stat","sort","removeCoverageFiles","rm","force"],"mappings":";;AAMA,SAASA,qBAAqBC,QAAkC;AAC9D,QAAMC,WAAWC,KAAKC,KAAKH,OAAOI,SAAS,OAAO;AAClD,QAAMC,QAAQ,CACZH,KAAKC,KAAKF,UAAU,cAAc,UAAU,GAC5CC,KAAKC,KAAKF,UAAU,UAAU,UAAU,GACxCC,KAAKC,KAAKH,OAAOM,iBAAiB,YAAY,GAC9CJ,KAAKC,KAAKH,OAAOM,iBAAiB,QAAQ,CAAC;AAG7C,SAAOC,MAAMC,KAAK,IAAIC,IAAIJ,MAAMK,IAAKC,CAAAA,SAAST,KAAKU,QAAQD,IAAI,CAAC,CAAC,CAAC;AACpE;AAEA,eAAsBE,kBACpBb,QACAW,MACmB;AACnB,QAAMN,QAAQM,SAASG,SAAYf,qBAAqBC,MAAM,IAAIO,MAAMQ,QAAQJ,IAAI,IAAIA,OAAO,CAACA,IAAI;AACpG,QAAMK,QAAkB,CAAA;AAExB,iBAAeC,KAAKC,SAAgC;AAClD,UAAMC,UAAU,MAAMC,GAAGC,QAAQH,SAAS;AAAA,MAAEI,eAAe;AAAA,IAAA,CAAM;AACjE,UAAMC,QAAQC,IACZL,QAAQT,IAAI,OAAOe,UAAU;AAC3B,YAAMC,YAAYxB,KAAKC,KAAKe,SAASO,MAAME,IAAI;AAC/C,UAAIF,MAAMG,eAAe;AACvB,cAAMX,KAAKS,SAAS;AAAA,MACtB,WAAWD,MAAMI,OAAAA,KAAYJ,MAAME,SAAS3B,OAAO8B,kBAAkB;AACnEd,cAAMe,KAAKL,SAAS;AAAA,MACtB;AAAA,IACF,CAAC,CACH;AAAA,EACF;AAEA,aAAWf,SAAQN,OAAO;AACxB,QAAI;AACF,YAAM2B,QAAQ,MAAMZ,GAAGa,KAAKtB,KAAI;AAChC,UAAI,CAACqB,MAAMJ,eAAe;AACxB;AAAA,MACF;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAEA,UAAMX,KAAKN,KAAI;AAAA,EACjB;AAEA,SAAOK,MAAMkB,KAAAA;AACf;AAEA,eAAsBC,oBACpBnC,QACAW,MACe;AACf,QAAMN,QAAQM,SAASG,SAAYf,qBAAqBC,MAAM,IAAIO,MAAMQ,QAAQJ,IAAI,IAAIA,OAAO,CAACA,IAAI;AAEpG,iBAAeM,KAAKC,SAAgC;AAClD,UAAMC,UAAU,MAAMC,GAAGC,QAAQH,SAAS;AAAA,MAAEI,eAAe;AAAA,IAAA,CAAM;AACjE,UAAMC,QAAQC,IACZL,QAAQT,IAAI,OAAOe,UAAU;AAC3B,YAAMC,YAAYxB,KAAKC,KAAKe,SAASO,MAAME,IAAI;AAC/C,UAAIF,MAAMG,eAAe;AACvB,cAAMX,KAAKS,SAAS;AAAA,MACtB,WAAWD,MAAMI,OAAAA,KAAYJ,MAAME,SAAS3B,OAAO8B,kBAAkB;AACnE,cAAMV,GAAGgB,GAAGV,WAAW;AAAA,UAAEW,OAAO;AAAA,QAAA,CAAM;AAAA,MACxC;AAAA,IACF,CAAC,CACH;AAAA,EACF;AAEA,aAAW1B,SAAQN,OAAO;AACxB,QAAI;AACF,YAAMY,KAAKN,KAAI;AAAA,IACjB,QAAQ;AAAA,IACN;AAAA,EAEJ;AACF;"}
@@ -14,7 +14,9 @@ function noopTracker() {
14
14
  }
15
15
  function createCoverageFixtures(baseTest, config) {
16
16
  return baseTest.extend({
17
- page: async ({ page }, use, testInfo) => {
17
+ page: async ({
18
+ page
19
+ }, use, testInfo) => {
18
20
  let tracker = noopTracker();
19
21
  if (config.coverageEnabled && isChromiumPage(page)) {
20
22
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"fixtures.js","sources":["../../src/coverage/fixtures.ts"],"sourcesContent":["import type { Page, TestInfo } from \"@playwright/test\"\n\nimport { createCoverageTracker } from \"./v8-tracker\"\nimport type { CoverageConfig } from \"./types\"\n\n\ntype CoverageTracker = {\n stop: (testInfo: TestInfo) => Promise<void>\n}\n\nfunction isChromiumPage(page: Page): boolean {\n return page.context().browser()?.browserType().name() === \"chromium\"\n}\n\nfunction shouldSilenceCoverageInitError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(\"Script execution is prohibited\")\n || message.includes(\"CDP session is only available in Chromium\")\n}\n\nfunction noopTracker(): CoverageTracker {\n return {\n async stop() {\n // no-op\n },\n }\n}\n\nexport function createCoverageFixtures<T extends { extend: (fixtures: any) => unknown }>(\n baseTest: T,\n config: CoverageConfig,\n): T {\n return baseTest.extend({\n page: async (\n { page }: { page: Page },\n use: (page: Page) => Promise<void>,\n testInfo: TestInfo,\n ) => {\n let tracker: CoverageTracker = noopTracker()\n\n if (config.coverageEnabled && isChromiumPage(page)) {\n try {\n tracker = await createCoverageTracker(page, config)\n } catch (error) {\n if (shouldSilenceCoverageInitError(error)) {\n tracker = noopTracker()\n } else {\n console.warn(\"[coverage] failed to initialize V8 coverage:\", error)\n }\n }\n }\n\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n await use(page)\n } finally {\n try {\n await tracker.stop(testInfo)\n } catch (error) {\n console.warn(\"[coverage] failed to record V8 coverage:\", error)\n }\n }\n },\n }) as T\n}\n"],"names":[],"mappings":";AAUA,SAAS,eAAe,MAAqB;AAC3C,SAAO,KAAK,UAAU,QAAA,GAAW,YAAA,EAAc,WAAW;AAC5D;AAEA,SAAS,+BAA+B,OAAyB;AAC/D,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,QAAQ,SAAS,gCAAgC,KACnD,QAAQ,SAAS,2CAA2C;AACnE;AAEA,SAAS,cAA+B;AACtC,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IAEb;AAAA,EAAA;AAEJ;AAEO,SAAS,uBACd,UACA,QACG;AACH,SAAO,SAAS,OAAO;AAAA,IACrB,MAAM,OACJ,EAAE,QACF,KACA,aACG;AACH,UAAI,UAA2B,YAAA;AAE/B,UAAI,OAAO,mBAAmB,eAAe,IAAI,GAAG;AAClD,YAAI;AACF,oBAAU,MAAM,sBAAsB,MAAM,MAAM;AAAA,QACpD,SAAS,OAAO;AACd,cAAI,+BAA+B,KAAK,GAAG;AACzC,sBAAU,YAAA;AAAA,UACZ,OAAO;AACL,oBAAQ,KAAK,gDAAgD,KAAK;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AAEF,cAAM,IAAI,IAAI;AAAA,MAChB,UAAA;AACE,YAAI;AACF,gBAAM,QAAQ,KAAK,QAAQ;AAAA,QAC7B,SAAS,OAAO;AACd,kBAAQ,KAAK,4CAA4C,KAAK;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EAAA,CACD;AACH;"}
1
+ {"version":3,"file":"fixtures.js","sources":["../../src/coverage/fixtures.ts"],"sourcesContent":["import type { Page, TestInfo } from \"@playwright/test\"\n\nimport { createCoverageTracker } from \"./v8-tracker\"\nimport type { CoverageConfig } from \"./types\"\n\n\ntype CoverageTracker = {\n stop: (testInfo: TestInfo) => Promise<void>\n}\n\nfunction isChromiumPage(page: Page): boolean {\n return page.context().browser()?.browserType().name() === \"chromium\"\n}\n\nfunction shouldSilenceCoverageInitError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(\"Script execution is prohibited\")\n || message.includes(\"CDP session is only available in Chromium\")\n}\n\nfunction noopTracker(): CoverageTracker {\n return {\n async stop() {\n // no-op\n },\n }\n}\n\nexport function createCoverageFixtures<T extends { extend: (fixtures: any) => unknown }>(\n baseTest: T,\n config: CoverageConfig,\n): T {\n return baseTest.extend({\n page: async (\n { page }: { page: Page },\n use: (page: Page) => Promise<void>,\n testInfo: TestInfo,\n ) => {\n let tracker: CoverageTracker = noopTracker()\n\n if (config.coverageEnabled && isChromiumPage(page)) {\n try {\n tracker = await createCoverageTracker(page, config)\n } catch (error) {\n if (shouldSilenceCoverageInitError(error)) {\n tracker = noopTracker()\n } else {\n console.warn(\"[coverage] failed to initialize V8 coverage:\", error)\n }\n }\n }\n\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n await use(page)\n } finally {\n try {\n await tracker.stop(testInfo)\n } catch (error) {\n console.warn(\"[coverage] failed to record V8 coverage:\", error)\n }\n }\n },\n }) as T\n}\n"],"names":["isChromiumPage","page","context","browser","browserType","name","shouldSilenceCoverageInitError","error","message","Error","String","includes","noopTracker","stop","createCoverageFixtures","baseTest","config","extend","use","testInfo","tracker","coverageEnabled","createCoverageTracker","console","warn"],"mappings":";AAUA,SAASA,eAAeC,MAAqB;AAC3C,SAAOA,KAAKC,UAAUC,QAAAA,GAAWC,YAAAA,EAAcC,WAAW;AAC5D;AAEA,SAASC,+BAA+BC,OAAyB;AAC/D,QAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,UAAUE,OAAOH,KAAK;AACrE,SAAOC,QAAQG,SAAS,gCAAgC,KACnDH,QAAQG,SAAS,2CAA2C;AACnE;AAEA,SAASC,cAA+B;AACtC,SAAO;AAAA,IACL,MAAMC,OAAO;AAAA,IACX;AAAA,EAAA;AAGN;AAEO,SAASC,uBACdC,UACAC,QACG;AACH,SAAOD,SAASE,OAAO;AAAA,IACrBhB,MAAM,OACJ;AAAA,MAAEA;AAAAA,IAAAA,GACFiB,KACAC,aACG;AACH,UAAIC,UAA2BR,YAAAA;AAE/B,UAAII,OAAOK,mBAAmBrB,eAAeC,IAAI,GAAG;AAClD,YAAI;AACFmB,oBAAU,MAAME,sBAAsBrB,MAAMe,MAAM;AAAA,QACpD,SAAST,OAAO;AACd,cAAID,+BAA+BC,KAAK,GAAG;AACzCa,sBAAUR,YAAAA;AAAAA,UACZ,OAAO;AACLW,oBAAQC,KAAK,gDAAgDjB,KAAK;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AAEF,cAAMW,IAAIjB,IAAI;AAAA,MAChB,UAAA;AACE,YAAI;AACF,gBAAMmB,QAAQP,KAAKM,QAAQ;AAAA,QAC7B,SAASZ,OAAO;AACdgB,kBAAQC,KAAK,4CAA4CjB,KAAK;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EAAA,CACD;AACH;"}
@@ -9,7 +9,10 @@ function createCoverageGlobalSetup(config) {
9
9
  return;
10
10
  }
11
11
  await removeCoverageFiles(config);
12
- await fs.rm(config.coverageReportDir, { recursive: true, force: true });
12
+ await fs.rm(config.coverageReportDir, {
13
+ recursive: true,
14
+ force: true
15
+ });
13
16
  };
14
17
  }
15
18
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"global-setup.js","sources":["../../src/coverage/global-setup.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\n\nimport { removeCoverageFiles } from \"./files\"\nimport type { CoverageConfig } from \"./types\"\n\n\nexport function createCoverageGlobalSetup(config: CoverageConfig): () => Promise<void> {\n return async function globalSetup() {\n if (process.env.RB_TEST_COMBINED_COVERAGE === \"1\") {\n return\n }\n\n if (!config.coverageEnabled) {\n return\n }\n\n await removeCoverageFiles(config)\n await fs.rm(config.coverageReportDir, { recursive: true, force: true })\n }\n}\n"],"names":[],"mappings":";;AAMO,SAAS,0BAA0B,QAA6C;AACrF,SAAO,eAAe,cAAc;AAClC,QAAI,QAAQ,IAAI,8BAA8B,KAAK;AACjD;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,iBAAiB;AAC3B;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM;AAChC,UAAM,GAAG,GAAG,OAAO,mBAAmB,EAAE,WAAW,MAAM,OAAO,MAAM;AAAA,EACxE;AACF;"}
1
+ {"version":3,"file":"global-setup.js","sources":["../../src/coverage/global-setup.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\n\nimport { removeCoverageFiles } from \"./files\"\nimport type { CoverageConfig } from \"./types\"\n\n\nexport function createCoverageGlobalSetup(config: CoverageConfig): () => Promise<void> {\n return async function globalSetup() {\n if (process.env.RB_TEST_COMBINED_COVERAGE === \"1\") {\n return\n }\n\n if (!config.coverageEnabled) {\n return\n }\n\n await removeCoverageFiles(config)\n await fs.rm(config.coverageReportDir, { recursive: true, force: true })\n }\n}\n"],"names":["createCoverageGlobalSetup","config","globalSetup","process","env","RB_TEST_COMBINED_COVERAGE","coverageEnabled","removeCoverageFiles","fs","rm","coverageReportDir","recursive","force"],"mappings":";;AAMO,SAASA,0BAA0BC,QAA6C;AACrF,SAAO,eAAeC,cAAc;AAClC,QAAIC,QAAQC,IAAIC,8BAA8B,KAAK;AACjD;AAAA,IACF;AAEA,QAAI,CAACJ,OAAOK,iBAAiB;AAC3B;AAAA,IACF;AAEA,UAAMC,oBAAoBN,MAAM;AAChC,UAAMO,GAAGC,GAAGR,OAAOS,mBAAmB;AAAA,MAAEC,WAAW;AAAA,MAAMC,OAAO;AAAA,IAAA,CAAM;AAAA,EACxE;AACF;"}
@@ -22,7 +22,9 @@ function createCoverageHarness(options) {
22
22
  return createCoverageFixtures(baseTest, config);
23
23
  },
24
24
  reporterEntry() {
25
- return [reporterPath, { coverageConfig: config }];
25
+ return [reporterPath, {
26
+ coverageConfig: config
27
+ }];
26
28
  }
27
29
  };
28
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/coverage/index.ts"],"sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\n\nimport { createCoverageConfig } from \"./config\"\nimport { createCoverageGlobalSetup } from \"./global-setup\"\nimport { createCoverageFixtures } from \"./fixtures\"\nimport type { CoverageHarness, CoverageHarnessOptions } from \"./types\"\n\n\nexport function createCoverageHarness(options: CoverageHarnessOptions): CoverageHarness {\n const config = createCoverageConfig(options)\n const globalSetup = createCoverageGlobalSetup(config)\n\n const reporterPath = resolveReporterPath()\n\n return {\n config,\n globalSetup,\n extendTest<T extends { extend: (fixtures: any) => unknown }>(baseTest: T): T {\n return createCoverageFixtures(baseTest, config)\n },\n reporterEntry() {\n return [reporterPath, { coverageConfig: config }]\n },\n }\n}\n\nfunction resolveReporterPath(): string {\n const require = createRequire(path.join(process.cwd(), \"package.json\"))\n const entryPath = require.resolve(\"@rpcbase/test\")\n const pkgDir = findPackageRoot(entryPath) ?? path.resolve(path.dirname(entryPath), \"..\", \"..\")\n\n const distReporter = path.join(pkgDir, \"dist\", \"coverage\", \"reporter.js\")\n if (fs.existsSync(distReporter)) {\n return distReporter\n }\n\n const srcReporter = path.join(pkgDir, \"src\", \"coverage\", \"reporter.ts\")\n if (fs.existsSync(srcReporter)) {\n return srcReporter\n }\n\n return distReporter\n}\n\nfunction findPackageRoot(entryPath: string): string | null {\n let dir = path.dirname(entryPath)\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) {\n return dir\n }\n const parent = path.dirname(dir)\n if (parent === dir) {\n return null\n }\n dir = parent\n }\n}\n\nexport { CoverageReporter } from \"./reporter\"\nexport { createCoverageConfig } from \"./config\"\nexport { generateCoverageReport } from \"./report\"\nexport { createCoverageFixtures } from \"./fixtures\"\nexport { createCoverageGlobalSetup } from \"./global-setup\"\nexport { findCoverageFiles, removeCoverageFiles } from \"./files\"\nexport type * from \"./types\"\n"],"names":["require"],"mappings":";;;;;;;;;;;;;AAUO,SAAS,sBAAsB,SAAkD;AACtF,QAAM,SAAS,qBAAqB,OAAO;AAC3C,QAAM,cAAc,0BAA0B,MAAM;AAEpD,QAAM,eAAe,oBAAA;AAErB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAA6D,UAAgB;AAC3E,aAAO,uBAAuB,UAAU,MAAM;AAAA,IAChD;AAAA,IACA,gBAAgB;AACd,aAAO,CAAC,cAAc,EAAE,gBAAgB,QAAQ;AAAA,IAClD;AAAA,EAAA;AAEJ;AAEA,SAAS,sBAA8B;AACrC,QAAMA,WAAU,cAAc,KAAK,KAAK,QAAQ,IAAA,GAAO,cAAc,CAAC;AACtE,QAAM,YAAYA,SAAQ,QAAQ,eAAe;AACjD,QAAM,SAAS,gBAAgB,SAAS,KAAK,KAAK,QAAQ,KAAK,QAAQ,SAAS,GAAG,MAAM,IAAI;AAE7F,QAAM,eAAe,KAAK,KAAK,QAAQ,QAAQ,YAAY,aAAa;AACxE,MAAI,GAAG,WAAW,YAAY,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,KAAK,QAAQ,OAAO,YAAY,aAAa;AACtE,MAAI,GAAG,WAAW,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,WAAkC;AACzD,MAAI,MAAM,KAAK,QAAQ,SAAS;AAChC,SAAO,MAAM;AACX,QAAI,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AACjD,aAAO;AAAA,IACT;AACA,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,KAAK;AAClB,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/coverage/index.ts"],"sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\n\nimport { createCoverageConfig } from \"./config\"\nimport { createCoverageGlobalSetup } from \"./global-setup\"\nimport { createCoverageFixtures } from \"./fixtures\"\nimport type { CoverageHarness, CoverageHarnessOptions } from \"./types\"\n\n\nexport function createCoverageHarness(options: CoverageHarnessOptions): CoverageHarness {\n const config = createCoverageConfig(options)\n const globalSetup = createCoverageGlobalSetup(config)\n\n const reporterPath = resolveReporterPath()\n\n return {\n config,\n globalSetup,\n extendTest<T extends { extend: (fixtures: any) => unknown }>(baseTest: T): T {\n return createCoverageFixtures(baseTest, config)\n },\n reporterEntry() {\n return [reporterPath, { coverageConfig: config }]\n },\n }\n}\n\nfunction resolveReporterPath(): string {\n const require = createRequire(path.join(process.cwd(), \"package.json\"))\n const entryPath = require.resolve(\"@rpcbase/test\")\n const pkgDir = findPackageRoot(entryPath) ?? path.resolve(path.dirname(entryPath), \"..\", \"..\")\n\n const distReporter = path.join(pkgDir, \"dist\", \"coverage\", \"reporter.js\")\n if (fs.existsSync(distReporter)) {\n return distReporter\n }\n\n const srcReporter = path.join(pkgDir, \"src\", \"coverage\", \"reporter.ts\")\n if (fs.existsSync(srcReporter)) {\n return srcReporter\n }\n\n return distReporter\n}\n\nfunction findPackageRoot(entryPath: string): string | null {\n let dir = path.dirname(entryPath)\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) {\n return dir\n }\n const parent = path.dirname(dir)\n if (parent === dir) {\n return null\n }\n dir = parent\n }\n}\n\nexport { CoverageReporter } from \"./reporter\"\nexport { createCoverageConfig } from \"./config\"\nexport { generateCoverageReport } from \"./report\"\nexport { createCoverageFixtures } from \"./fixtures\"\nexport { createCoverageGlobalSetup } from \"./global-setup\"\nexport { findCoverageFiles, removeCoverageFiles } from \"./files\"\nexport type * from \"./types\"\n"],"names":["createCoverageHarness","options","config","createCoverageConfig","globalSetup","createCoverageGlobalSetup","reporterPath","resolveReporterPath","extendTest","baseTest","createCoverageFixtures","reporterEntry","coverageConfig","require","createRequire","path","join","process","cwd","entryPath","resolve","pkgDir","findPackageRoot","dirname","distReporter","fs","existsSync","srcReporter","dir","parent"],"mappings":";;;;;;;;;;;;;AAUO,SAASA,sBAAsBC,SAAkD;AACtF,QAAMC,SAASC,qBAAqBF,OAAO;AAC3C,QAAMG,cAAcC,0BAA0BH,MAAM;AAEpD,QAAMI,eAAeC,oBAAAA;AAErB,SAAO;AAAA,IACLL;AAAAA,IACAE;AAAAA,IACAI,WAA6DC,UAAgB;AAC3E,aAAOC,uBAAuBD,UAAUP,MAAM;AAAA,IAChD;AAAA,IACAS,gBAAgB;AACd,aAAO,CAACL,cAAc;AAAA,QAAEM,gBAAgBV;AAAAA,MAAAA,CAAQ;AAAA,IAClD;AAAA,EAAA;AAEJ;AAEA,SAASK,sBAA8B;AACrC,QAAMM,WAAUC,cAAcC,KAAKC,KAAKC,QAAQC,IAAAA,GAAO,cAAc,CAAC;AACtE,QAAMC,YAAYN,SAAQO,QAAQ,eAAe;AACjD,QAAMC,SAASC,gBAAgBH,SAAS,KAAKJ,KAAKK,QAAQL,KAAKQ,QAAQJ,SAAS,GAAG,MAAM,IAAI;AAE7F,QAAMK,eAAeT,KAAKC,KAAKK,QAAQ,QAAQ,YAAY,aAAa;AACxE,MAAII,GAAGC,WAAWF,YAAY,GAAG;AAC/B,WAAOA;AAAAA,EACT;AAEA,QAAMG,cAAcZ,KAAKC,KAAKK,QAAQ,OAAO,YAAY,aAAa;AACtE,MAAII,GAAGC,WAAWC,WAAW,GAAG;AAC9B,WAAOA;AAAAA,EACT;AAEA,SAAOH;AACT;AAEA,SAASF,gBAAgBH,WAAkC;AACzD,MAAIS,MAAMb,KAAKQ,QAAQJ,SAAS;AAChC,SAAO,MAAM;AACX,QAAIM,GAAGC,WAAWX,KAAKC,KAAKY,KAAK,cAAc,CAAC,GAAG;AACjD,aAAOA;AAAAA,IACT;AACA,UAAMC,SAASd,KAAKQ,QAAQK,GAAG;AAC/B,QAAIC,WAAWD,KAAK;AAClB,aAAO;AAAA,IACT;AACAA,UAAMC;AAAAA,EACR;AACF;"}
@@ -41,17 +41,31 @@ async function generateCoverageReport(config) {
41
41
  console.warn("[coverage] no library files matched the coverage filters");
42
42
  return;
43
43
  }
44
- await fs.rm(config.coverageReportDir, { recursive: true, force: true });
45
- await fs.mkdir(config.coverageReportDir, { recursive: true });
46
- const { createContext, reports } = await loadIstanbulModules();
44
+ await fs.rm(config.coverageReportDir, {
45
+ recursive: true,
46
+ force: true
47
+ });
48
+ await fs.mkdir(config.coverageReportDir, {
49
+ recursive: true
50
+ });
51
+ const {
52
+ createContext,
53
+ reports
54
+ } = await loadIstanbulModules();
47
55
  const context = createContext({
48
56
  dir: config.coverageReportDir,
49
57
  coverageMap,
50
58
  defaultSummarizer: "pkg"
51
59
  });
52
- const { output: reportOutput, summarizer } = generateConsoleTextCoverageReport(reports, context);
60
+ const {
61
+ output: reportOutput,
62
+ summarizer
63
+ } = generateConsoleTextCoverageReport(reports, context);
53
64
  process.stdout.write(reportOutput);
54
- reports.create("text", { file: TEXT_REPORT_FILENAME, summarizer }).execute(context);
65
+ reports.create("text", {
66
+ file: TEXT_REPORT_FILENAME,
67
+ summarizer
68
+ }).execute(context);
55
69
  console.log(`[coverage] Full text report saved to ${path.join(config.coverageReportDir, TEXT_REPORT_FILENAME)}`);
56
70
  const summary = coverageMap.getCoverageSummary();
57
71
  enforceThresholds(summary, config.thresholds, "global");
@@ -62,9 +76,7 @@ async function generateCoverageReport(config) {
62
76
  const matcher = createGlobMatcher(target.pattern);
63
77
  const matchResult = collectTargetSummary(fileSummaries, matcher, coverageLib);
64
78
  if (matchResult.matched === 0) {
65
- console.warn(
66
- `[coverage] threshold pattern "${target.pattern}" did not match any files — skipping`
67
- );
79
+ console.warn(`[coverage] threshold pattern "${target.pattern}" did not match any files — skipping`);
68
80
  continue;
69
81
  }
70
82
  enforceThresholds(matchResult.summary, target.thresholds, target.pattern);
@@ -92,10 +104,7 @@ async function collectCoveredFiles(config) {
92
104
  }
93
105
  async function loadIstanbulModules() {
94
106
  maybeForceColor();
95
- const [libReportMod, reportsMod] = await Promise.all([
96
- import("istanbul-lib-report"),
97
- import("istanbul-reports")
98
- ]);
107
+ const [libReportMod, reportsMod] = await Promise.all([import("istanbul-lib-report"), import("istanbul-reports")]);
99
108
  const createContext = typeof libReportMod.createContext === "function" ? libReportMod.createContext : libReportMod.default?.createContext;
100
109
  if (typeof createContext !== "function") {
101
110
  throw new Error("istanbul-lib-report exports are unavailable");
@@ -147,11 +156,14 @@ async function mergeScriptCoverage(coverageMap, script, config, matchesCollectCo
147
156
  }
148
157
  }
149
158
  const sourceMap = await loadSourceMapForScript(scriptPath, source);
150
- const converter = v8ToIstanbul(
151
- scriptPath,
152
- 0,
153
- sourceMap ? { source, sourceMap: { sourcemap: sourceMap } } : { source }
154
- );
159
+ const converter = v8ToIstanbul(scriptPath, 0, sourceMap ? {
160
+ source,
161
+ sourceMap: {
162
+ sourcemap: sourceMap
163
+ }
164
+ } : {
165
+ source
166
+ });
155
167
  await converter.load();
156
168
  converter.applyCoverage(script.functions);
157
169
  const filtered = filterCoverageMap(converter.toIstanbul(), config, matchesCollectCoverageFrom);
@@ -174,13 +186,21 @@ function enforceThresholds(summary, thresholds, label = "global") {
174
186
  const minimum = thresholds[metric];
175
187
  const actual = summary[metric]?.pct ?? 0;
176
188
  if (actual < minimum) {
177
- failures.push({ metric, actual, minimum });
189
+ failures.push({
190
+ metric,
191
+ actual,
192
+ minimum
193
+ });
178
194
  }
179
195
  }
180
196
  if (failures.length === 0) {
181
197
  return;
182
198
  }
183
- const details = failures.map(({ metric, actual, minimum }) => `${metric}: ${actual.toFixed(2)}% < ${minimum}%`).join("; ");
199
+ const details = failures.map(({
200
+ metric,
201
+ actual,
202
+ minimum
203
+ }) => `${metric}: ${actual.toFixed(2)}% < ${minimum}%`).join("; ");
184
204
  throw new CoverageThresholdError(`[coverage] thresholds not met (target: ${label}) — ${details}`);
185
205
  }
186
206
  function resolveCoverageLib() {
@@ -204,9 +224,7 @@ function resolveInstrumentLib() {
204
224
  throw new Error("istanbul-lib-instrument exports are unavailable");
205
225
  }
206
226
  async function includeUntestedFiles(coverageMap, config, matchesCollectCoverageFrom) {
207
- const existing = new Set(
208
- coverageMap.files().map((filePath) => path.resolve(String(filePath ?? "")))
209
- );
227
+ const existing = new Set(coverageMap.files().map((filePath) => path.resolve(String(filePath ?? ""))));
210
228
  const candidates = await findCollectCoverageFiles(config, matchesCollectCoverageFrom);
211
229
  if (candidates.length === 0) {
212
230
  return;
@@ -214,16 +232,7 @@ async function includeUntestedFiles(coverageMap, config, matchesCollectCoverageF
214
232
  const instrumentLib = resolveInstrumentLib();
215
233
  const instrumenter = instrumentLib.createInstrumenter({
216
234
  esModules: true,
217
- parserPlugins: [
218
- "typescript",
219
- "jsx",
220
- "classProperties",
221
- "classPrivateProperties",
222
- "classPrivateMethods",
223
- "decorators-legacy",
224
- "importMeta",
225
- "topLevelAwait"
226
- ]
235
+ parserPlugins: ["typescript", "jsx", "classProperties", "classPrivateProperties", "classPrivateMethods", "decorators-legacy", "importMeta", "topLevelAwait"]
227
236
  });
228
237
  for (const filePath of candidates) {
229
238
  const normalized = path.resolve(filePath);
@@ -244,32 +253,11 @@ async function includeUntestedFiles(coverageMap, config, matchesCollectCoverageF
244
253
  existing.add(normalized);
245
254
  } catch (error) {
246
255
  const relative = path.relative(config.rootDir, normalized);
247
- console.warn(
248
- `[coverage] failed to instrument ${relative && !relative.startsWith("..") ? relative : normalized}:`,
249
- error
250
- );
256
+ console.warn(`[coverage] failed to instrument ${relative && !relative.startsWith("..") ? relative : normalized}:`, error);
251
257
  }
252
258
  }
253
259
  }
254
- const DEFAULT_COLLECT_COVERAGE_IGNORES = [
255
- "**/.git/**",
256
- "**/.next/**",
257
- "**/.turbo/**",
258
- "**/.vite/**",
259
- "**/.vitest/**",
260
- "**/build/**",
261
- "**/coverage/**",
262
- "**/dist/**",
263
- "**/node_modules/**",
264
- "**/playwright-report/**",
265
- "**/spec/**",
266
- "**/test/**",
267
- "**/test-results/**",
268
- "**/tests/**",
269
- "**/__tests__/**",
270
- "**/*.d.ts",
271
- "**/*.map"
272
- ];
260
+ const DEFAULT_COLLECT_COVERAGE_IGNORES = ["**/.git/**", "**/.next/**", "**/.turbo/**", "**/.vite/**", "**/.vitest/**", "**/build/**", "**/coverage/**", "**/dist/**", "**/node_modules/**", "**/playwright-report/**", "**/spec/**", "**/test/**", "**/test-results/**", "**/tests/**", "**/__tests__/**", "**/*.d.ts", "**/*.map"];
273
261
  async function findCollectCoverageFiles(config, matchesCollectCoverageFrom) {
274
262
  const patterns = Array.isArray(config.collectCoverageFrom) ? config.collectCoverageFrom : [];
275
263
  if (patterns.length === 0) {
@@ -335,7 +323,10 @@ function collectTargetSummary(fileSummaries, matcher, coverageLib) {
335
323
  matched += 1;
336
324
  }
337
325
  }
338
- return { summary, matched };
326
+ return {
327
+ summary,
328
+ matched
329
+ };
339
330
  }
340
331
  function createGlobMatcher(pattern) {
341
332
  const normalized = toPosix(String(pattern ?? "")).trim();
@@ -345,7 +336,9 @@ function createGlobMatcher(pattern) {
345
336
  if (isAbsoluteGlobPattern(normalized)) {
346
337
  throw new Error(`[coverage] threshold patterns must be relative (absolute paths are not supported): "${pattern}"`);
347
338
  }
348
- return picomatch(normalized, { dot: true });
339
+ return picomatch(normalized, {
340
+ dot: true
341
+ });
349
342
  }
350
343
  function isAbsoluteGlobPattern(pattern) {
351
344
  const normalized = String(pattern ?? "").trim();
@@ -363,10 +356,7 @@ function isAbsoluteGlobPattern(pattern) {
363
356
  function stripQuery(url) {
364
357
  const queryIndex = url.indexOf("?");
365
358
  const hashIndex = url.indexOf("#");
366
- const endIndex = Math.min(
367
- queryIndex === -1 ? Number.POSITIVE_INFINITY : queryIndex,
368
- hashIndex === -1 ? Number.POSITIVE_INFINITY : hashIndex
369
- );
359
+ const endIndex = Math.min(queryIndex === -1 ? Number.POSITIVE_INFINITY : queryIndex, hashIndex === -1 ? Number.POSITIVE_INFINITY : hashIndex);
370
360
  if (!Number.isFinite(endIndex)) {
371
361
  return url;
372
362
  }
@@ -414,7 +404,10 @@ function filterCoverageMap(map, config, matchesCollectCoverageFrom) {
414
404
  continue;
415
405
  }
416
406
  if (fileCoverage && typeof fileCoverage === "object") {
417
- filtered[absolutePath] = { ...fileCoverage, path: absolutePath };
407
+ filtered[absolutePath] = {
408
+ ...fileCoverage,
409
+ path: absolutePath
410
+ };
418
411
  } else {
419
412
  filtered[absolutePath] = fileCoverage;
420
413
  }