@rpcbase/test 0.334.0 → 0.335.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.
@@ -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
  }
@@ -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 { 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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"}
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":["TEXT_REPORT_FILENAME","CoverageThresholdError","Error","constructor","message","name","generateCoverageReport","config","coverageFiles","findCoverageFiles","length","console","warn","coverageLib","resolveCoverageLib","coverageMap","createCoverageMap","matchesCollectCoverageFrom","createCollectCoverageMatcher","collectCoverageFrom","rootDir","file","payload","readCoverageFile","script","scripts","mergeScriptCoverage","includeAllFiles","includeUntestedFiles","files","fs","rm","coverageReportDir","recursive","force","mkdir","createContext","reports","loadIstanbulModules","context","dir","defaultSummarizer","output","reportOutput","summarizer","generateConsoleTextCoverageReport","process","stdout","write","create","execute","log","path","join","summary","getCoverageSummary","enforceThresholds","thresholds","targets","Array","isArray","thresholdTargets","fileSummaries","buildFileSummaries","target","matcher","createGlobMatcher","pattern","matchResult","collectTargetSummary","matched","collectCoveredFiles","sort","maybeForceColor","libReportMod","reportsMod","Promise","all","default","isTTY","env","FORCE_COLOR","undefined","NO_COLOR","NODE_DISABLE_COLORS","CI","scriptPath","absolutePath","isNodeModulesPath","isViteVirtualModulePath","source","readFile","error","base","basename","code","includes","sourceMap","loadSourceMapForScript","converter","v8ToIstanbul","sourcemap","load","applyCoverage","functions","filtered","filterCoverageMap","toIstanbul","Object","keys","merge","raw","JSON","parse","label","failures","metric","minimum","actual","pct","push","details","map","toFixed","candidate","libCoverage","resolveInstrumentLib","libInstrument","createInstrumenter","existing","Set","filePath","resolve","String","candidates","findCollectCoverageFiles","instrumentLib","instrumenter","esModules","parserPlugins","normalized","has","catch","instrumentSync","fileCoverage","lastFileCoverage","addFileCoverage","add","relative","startsWith","DEFAULT_COLLECT_COVERAGE_IGNORES","patterns","rawFiles","fg","cwd","absolute","dot","onlyFiles","unique","followSymbolicLinks","ignore","collected","endsWith","from","normalizedRoot","normalizedAbsolute","fileCoverageFor","toSummary","relativePath","relativePosix","toPosix","createCoverageSummary","some","trim","isAbsoluteGlobPattern","picomatch","test","stripQuery","url","queryIndex","indexOf","hashIndex","endIndex","Math","min","Number","POSITIVE_INFINITY","isFinite","slice","extractSourceMappingUrl","regex","last","match","exec","resolveSourceMapPath","mappingUrl","cleaned","fileURLToPath","isAbsolute","dirname","entries","resolveCoveragePath","normalize","split","sep","baseName","parseSourceMapPayload","sources","normalizeSourceMap","root","sourceRoot","replace","fixedSources","withoutWebpack","normalizedCandidate","commaIndex","meta","Buffer","toString","decodeURIComponent","parsed","mapPath"],"mappings":"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"}
@@ -17,7 +17,10 @@ class CoverageReporter {
17
17
  return;
18
18
  }
19
19
  await removeCoverageFiles(this.config);
20
- await fs.rm(this.config.coverageReportDir, { recursive: true, force: true });
20
+ await fs.rm(this.config.coverageReportDir, {
21
+ recursive: true,
22
+ force: true
23
+ });
21
24
  }
22
25
  async onEnd(result) {
23
26
  if (process.env.RB_TEST_COMBINED_COVERAGE === "1") {
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.js","sources":["../../src/coverage/reporter.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\n\nimport type { FullResult } from \"@playwright/test/reporter\"\n\nimport { CoverageThresholdError, generateCoverageReport } from \"./report\"\nimport { removeCoverageFiles } from \"./files\"\nimport type { CoverageConfig } from \"./types\"\n\n\ntype FullResultWithExitCode = FullResult & { exitCode?: number }\n\nclass CoverageReporter {\n config: CoverageConfig\n\n constructor(options: { coverageConfig?: CoverageConfig } = {}) {\n this.config = options.coverageConfig as CoverageConfig\n if (!this.config) {\n throw new Error(\"CoverageReporter requires a coverageConfig option\")\n }\n }\n\n async onBegin() {\n if (process.env.RB_TEST_COMBINED_COVERAGE === \"1\") {\n return\n }\n\n if (!this.config.coverageEnabled) {\n return\n }\n\n await removeCoverageFiles(this.config)\n await fs.rm(this.config.coverageReportDir, { recursive: true, force: true })\n }\n\n async onEnd(result: FullResultWithExitCode) {\n if (process.env.RB_TEST_COMBINED_COVERAGE === \"1\") {\n return\n }\n\n if (!this.config.coverageEnabled) {\n return\n }\n\n if (result.status !== \"passed\") {\n console.warn(\"[coverage] skipping report generation because tests failed\")\n return\n }\n\n try {\n await generateCoverageReport(this.config)\n } catch (error) {\n if (error instanceof CoverageThresholdError) {\n console.error(error.message)\n setFailureExitCode(result)\n return\n }\n\n throw error\n }\n }\n}\n\nexport { CoverageReporter }\nexport default CoverageReporter\n\nfunction setFailureExitCode(result: FullResult): void {\n if (result && typeof result === \"object\") {\n const mutable = result as FullResultWithExitCode\n mutable.status = \"failed\"\n if (typeof mutable.exitCode !== \"number\" || mutable.exitCode === 0) {\n mutable.exitCode = 1\n }\n }\n\n if (!process.exitCode || process.exitCode === 0) {\n process.exitCode = 1\n }\n}\n"],"names":[],"mappings":";;;AAWA,MAAM,iBAAiB;AAAA,EACrB;AAAA,EAEA,YAAY,UAA+C,IAAI;AAC7D,SAAK,SAAS,QAAQ;AACtB,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAM,UAAU;AACd,QAAI,QAAQ,IAAI,8BAA8B,KAAK;AACjD;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,OAAO,iBAAiB;AAChC;AAAA,IACF;AAEA,UAAM,oBAAoB,KAAK,MAAM;AACrC,UAAM,GAAG,GAAG,KAAK,OAAO,mBAAmB,EAAE,WAAW,MAAM,OAAO,MAAM;AAAA,EAC7E;AAAA,EAEA,MAAM,MAAM,QAAgC;AAC1C,QAAI,QAAQ,IAAI,8BAA8B,KAAK;AACjD;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,OAAO,iBAAiB;AAChC;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,UAAU;AAC9B,cAAQ,KAAK,4DAA4D;AACzE;AAAA,IACF;AAEA,QAAI;AACF,YAAM,uBAAuB,KAAK,MAAM;AAAA,IAC1C,SAAS,OAAO;AACd,UAAI,iBAAiB,wBAAwB;AAC3C,gBAAQ,MAAM,MAAM,OAAO;AAC3B,2BAAmB,MAAM;AACzB;AAAA,MACF;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAKA,SAAS,mBAAmB,QAA0B;AACpD,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,UAAM,UAAU;AAChB,YAAQ,SAAS;AACjB,QAAI,OAAO,QAAQ,aAAa,YAAY,QAAQ,aAAa,GAAG;AAClE,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,YAAY,QAAQ,aAAa,GAAG;AAC/C,YAAQ,WAAW;AAAA,EACrB;AACF;"}
1
+ {"version":3,"file":"reporter.js","sources":["../../src/coverage/reporter.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\n\nimport type { FullResult } from \"@playwright/test/reporter\"\n\nimport { CoverageThresholdError, generateCoverageReport } from \"./report\"\nimport { removeCoverageFiles } from \"./files\"\nimport type { CoverageConfig } from \"./types\"\n\n\ntype FullResultWithExitCode = FullResult & { exitCode?: number }\n\nclass CoverageReporter {\n config: CoverageConfig\n\n constructor(options: { coverageConfig?: CoverageConfig } = {}) {\n this.config = options.coverageConfig as CoverageConfig\n if (!this.config) {\n throw new Error(\"CoverageReporter requires a coverageConfig option\")\n }\n }\n\n async onBegin() {\n if (process.env.RB_TEST_COMBINED_COVERAGE === \"1\") {\n return\n }\n\n if (!this.config.coverageEnabled) {\n return\n }\n\n await removeCoverageFiles(this.config)\n await fs.rm(this.config.coverageReportDir, { recursive: true, force: true })\n }\n\n async onEnd(result: FullResultWithExitCode) {\n if (process.env.RB_TEST_COMBINED_COVERAGE === \"1\") {\n return\n }\n\n if (!this.config.coverageEnabled) {\n return\n }\n\n if (result.status !== \"passed\") {\n console.warn(\"[coverage] skipping report generation because tests failed\")\n return\n }\n\n try {\n await generateCoverageReport(this.config)\n } catch (error) {\n if (error instanceof CoverageThresholdError) {\n console.error(error.message)\n setFailureExitCode(result)\n return\n }\n\n throw error\n }\n }\n}\n\nexport { CoverageReporter }\nexport default CoverageReporter\n\nfunction setFailureExitCode(result: FullResult): void {\n if (result && typeof result === \"object\") {\n const mutable = result as FullResultWithExitCode\n mutable.status = \"failed\"\n if (typeof mutable.exitCode !== \"number\" || mutable.exitCode === 0) {\n mutable.exitCode = 1\n }\n }\n\n if (!process.exitCode || process.exitCode === 0) {\n process.exitCode = 1\n }\n}\n"],"names":["CoverageReporter","config","constructor","options","coverageConfig","Error","onBegin","process","env","RB_TEST_COMBINED_COVERAGE","coverageEnabled","removeCoverageFiles","fs","rm","coverageReportDir","recursive","force","onEnd","result","status","console","warn","generateCoverageReport","error","CoverageThresholdError","message","setFailureExitCode","mutable","exitCode"],"mappings":";;;AAWA,MAAMA,iBAAiB;AAAA,EACrBC;AAAAA,EAEAC,YAAYC,UAA+C,IAAI;AAC7D,SAAKF,SAASE,QAAQC;AACtB,QAAI,CAAC,KAAKH,QAAQ;AAChB,YAAM,IAAII,MAAM,mDAAmD;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAMC,UAAU;AACd,QAAIC,QAAQC,IAAIC,8BAA8B,KAAK;AACjD;AAAA,IACF;AAEA,QAAI,CAAC,KAAKR,OAAOS,iBAAiB;AAChC;AAAA,IACF;AAEA,UAAMC,oBAAoB,KAAKV,MAAM;AACrC,UAAMW,GAAGC,GAAG,KAAKZ,OAAOa,mBAAmB;AAAA,MAAEC,WAAW;AAAA,MAAMC,OAAO;AAAA,IAAA,CAAM;AAAA,EAC7E;AAAA,EAEA,MAAMC,MAAMC,QAAgC;AAC1C,QAAIX,QAAQC,IAAIC,8BAA8B,KAAK;AACjD;AAAA,IACF;AAEA,QAAI,CAAC,KAAKR,OAAOS,iBAAiB;AAChC;AAAA,IACF;AAEA,QAAIQ,OAAOC,WAAW,UAAU;AAC9BC,cAAQC,KAAK,4DAA4D;AACzE;AAAA,IACF;AAEA,QAAI;AACF,YAAMC,uBAAuB,KAAKrB,MAAM;AAAA,IAC1C,SAASsB,OAAO;AACd,UAAIA,iBAAiBC,wBAAwB;AAC3CJ,gBAAQG,MAAMA,MAAME,OAAO;AAC3BC,2BAAmBR,MAAM;AACzB;AAAA,MACF;AAEA,YAAMK;AAAAA,IACR;AAAA,EACF;AACF;AAKA,SAASG,mBAAmBR,QAA0B;AACpD,MAAIA,UAAU,OAAOA,WAAW,UAAU;AACxC,UAAMS,UAAUT;AAChBS,YAAQR,SAAS;AACjB,QAAI,OAAOQ,QAAQC,aAAa,YAAYD,QAAQC,aAAa,GAAG;AAClED,cAAQC,WAAW;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,CAACrB,QAAQqB,YAAYrB,QAAQqB,aAAa,GAAG;AAC/CrB,YAAQqB,WAAW;AAAA,EACrB;AACF;"}
@@ -28,7 +28,10 @@ async function createCoverageTracker(page, config) {
28
28
  });
29
29
  });
30
30
  await session.send("Profiler.enable");
31
- await session.send("Profiler.startPreciseCoverage", { callCount: false, detailed: true });
31
+ await session.send("Profiler.startPreciseCoverage", {
32
+ callCount: false,
33
+ detailed: true
34
+ });
32
35
  return {
33
36
  async stop(testInfo) {
34
37
  try {
@@ -37,7 +40,9 @@ async function createCoverageTracker(page, config) {
37
40
  return;
38
41
  }
39
42
  const outputFile = resolveCoverageOutputFile(config, testInfo);
40
- await fs.mkdir(path.dirname(outputFile), { recursive: true });
43
+ await fs.mkdir(path.dirname(outputFile), {
44
+ recursive: true
45
+ });
41
46
  await fs.writeFile(outputFile, JSON.stringify(payload, null, 2), "utf8");
42
47
  } finally {
43
48
  await shutdownSession(session);
@@ -52,7 +57,9 @@ function resolveCoverageOutputFile(config, testInfo) {
52
57
  return path.join(outputDir, config.coverageFileName);
53
58
  }
54
59
  async function collectCoveragePayload(session, scriptMeta, sourceCache, testInfo, config) {
55
- const { result } = await session.send("Profiler.takePreciseCoverage");
60
+ const {
61
+ result
62
+ } = await session.send("Profiler.takePreciseCoverage");
56
63
  await session.send("Profiler.stopPreciseCoverage");
57
64
  const scripts = [];
58
65
  for (const script of result) {
@@ -85,14 +92,18 @@ async function resolveScriptSource(session, cache, scriptId) {
85
92
  }
86
93
  async function fetchScriptSource(session, scriptId) {
87
94
  try {
88
- const sourceResponse = await session.send("Debugger.getScriptSource", { scriptId });
95
+ const sourceResponse = await session.send("Debugger.getScriptSource", {
96
+ scriptId
97
+ });
89
98
  return sourceResponse?.scriptSource ?? "";
90
99
  } catch (error) {
91
100
  const message = String(error?.message ?? error);
92
101
  if (message.includes("Debugger agent is not enabled")) {
93
102
  try {
94
103
  await session.send("Debugger.enable");
95
- const sourceResponse = await session.send("Debugger.getScriptSource", { scriptId });
104
+ const sourceResponse = await session.send("Debugger.getScriptSource", {
105
+ scriptId
106
+ });
96
107
  return sourceResponse?.scriptSource ?? "";
97
108
  } catch {
98
109
  return "";
@@ -102,11 +113,7 @@ async function fetchScriptSource(session, scriptId) {
102
113
  }
103
114
  }
104
115
  async function shutdownSession(session) {
105
- await Promise.allSettled([
106
- session.send("Profiler.stopPreciseCoverage").catch(() => void 0),
107
- session.send("Profiler.disable").catch(() => void 0),
108
- session.send("Debugger.disable").catch(() => void 0)
109
- ]);
116
+ await Promise.allSettled([session.send("Profiler.stopPreciseCoverage").catch(() => void 0), session.send("Profiler.disable").catch(() => void 0), session.send("Debugger.disable").catch(() => void 0)]);
110
117
  await session.detach().catch(() => void 0);
111
118
  }
112
119
  function normalizeScriptUrl(rawUrl, config) {
@@ -150,10 +157,7 @@ function createNormalizedPath(absolutePath, rootDir) {
150
157
  function stripQuery(url) {
151
158
  const queryIndex = url.indexOf("?");
152
159
  const hashIndex = url.indexOf("#");
153
- const endIndex = Math.min(
154
- queryIndex === -1 ? Number.POSITIVE_INFINITY : queryIndex,
155
- hashIndex === -1 ? Number.POSITIVE_INFINITY : hashIndex
156
- );
160
+ const endIndex = Math.min(queryIndex === -1 ? Number.POSITIVE_INFINITY : queryIndex, hashIndex === -1 ? Number.POSITIVE_INFINITY : hashIndex);
157
161
  if (!Number.isFinite(endIndex)) {
158
162
  return url;
159
163
  }