UNPKG

@pokujs/c8

Version:

☔️ A Poku plugin for V8 code coverage using c8.

121 lines (120 loc) 5.37 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.coverage = void 0; const node_fs_1 = require("node:fs"); const node_os_1 = require("node:os"); const node_path_1 = require("node:path"); const node_process_1 = __importDefault(require("node:process")); const config_js_1 = require("./config.js"); const coverage = (options = Object.create(null)) => { let enabled = false; let tempDir; let originalEnv; let userProvidedTempDir; return { name: '@pokujs/c8', setup(context) { if (options.requireFlag && !node_process_1.default.argv.includes('--coverage')) return; if (context.runtime !== 'node') console.warn(`[@pokujs/c8] V8 coverage is only supported on Node.js (current runtime: ${context.runtime}). Coverage data may not be collected.`); enabled = true; const cliConfig = node_process_1.default.argv .find((arg) => arg.startsWith('--coverageConfig')) ?.split('=')[1]; const fileConfig = (0, config_js_1.loadConfig)(context.cwd, cliConfig ?? options.config); options = { ...fileConfig, ...options }; originalEnv = node_process_1.default.env.NODE_V8_COVERAGE; userProvidedTempDir = typeof options.tempDirectory === 'string'; tempDir = userProvidedTempDir ? options.tempDirectory : (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'poku-c8-')); if (options.clean !== false) { try { (0, node_fs_1.rmSync)(tempDir, { recursive: true, force: true }); } catch { // Best-effort cleanup } (0, node_fs_1.mkdirSync)(tempDir, { recursive: true }); } node_process_1.default.env.NODE_V8_COVERAGE = tempDir; }, async teardown(context) { if (!enabled) return; if (originalEnv !== undefined) node_process_1.default.env.NODE_V8_COVERAGE = originalEnv; else delete node_process_1.default.env.NODE_V8_COVERAGE; const reporter = Array.isArray(options.reporter) ? options.reporter : [options.reporter ?? 'text']; const reportsDirectory = (0, node_path_1.resolve)(context.cwd, options.reportsDirectory ?? './coverage'); const { default: Report } = await import('c8/lib/report.js'); const useMonocart = options.experimental?.includes('monocart') ?? false; const monocartArgv = useMonocart ? { reporter, reportsDir: reportsDirectory, tempDirectory: tempDir, all: options.all ?? false, src: options.src, skipFull: options.skipFull ?? false, excludeAfterRemap: options.excludeAfterRemap ?? false, clean: options.clean !== false, } : undefined; const report = Report({ tempDirectory: tempDir, reportsDirectory, reporter, include: options.include ?? [], exclude: options.exclude, extension: options.extension, all: options.all ?? false, src: options.src, resolve: '', omitRelative: true, excludeNodeModules: true, skipFull: options.skipFull ?? false, excludeAfterRemap: options.excludeAfterRemap ?? false, watermarks: options.watermarks, mergeAsync: options.mergeAsync ?? false, monocartArgv, }); await report.run(); if (options.checkCoverage) { const { checkCoverages } = await import('c8/lib/commands/check-coverage.js'); const threshold = typeof options.checkCoverage === 'number' ? options.checkCoverage : undefined; await checkCoverages({ lines: threshold ?? options.lines ?? 0, branches: threshold ?? options.branches ?? 0, functions: threshold ?? options.functions ?? 0, statements: threshold ?? options.statements ?? 0, perFile: options.perFile ?? false, }, report); if (node_process_1.default.exitCode === 1) { const coverageFailure = () => { node_process_1.default.exitCode = 1; }; node_process_1.default.once('exit', coverageFailure); } } if (!userProvidedTempDir) { try { (0, node_fs_1.rmSync)(tempDir, { recursive: true, force: true }); } catch { // Best-effort cleanup } } }, }; }; exports.coverage = coverage;