@pokujs/c8
Version:
121 lines (120 loc) • 5.37 kB
JavaScript
;
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;