node-reporter-gha
Version:
Node reporter for GitHub Actions
66 lines • 2.4 kB
JavaScript
import { appendFile } from 'node:fs/promises';
import { issueCommand } from './command.mjs';
import { generateSummary, getLocationInfo, isSubtestsFailedError } from './utils.mjs';
/* c8 ignore start */
async function writeSummary(stats) {
if (process.env['GITHUB_STEP_SUMMARY']) {
const summary = generateSummary(stats);
try {
await appendFile(process.env['GITHUB_STEP_SUMMARY'], summary);
}
catch (error) {
console.warn(`Failed to write summary: ${error.message}`);
}
}
}
/* c8 ignore stop */
function* handleEvent(event, failedTests, stats) {
if (event.type === 'test:fail') {
const { name, details: { error, error: { message }, }, } = event.data;
if (!isSubtestsFailedError(error)) {
const [line, column, file] = getLocationInfo(event);
failedTests.push({ name, file, line, column, message });
}
}
else if (event.type === 'test:diagnostic') {
const [line, column, file] = getLocationInfo(event);
const { message } = event.data;
if (line === undefined && column === undefined && file === undefined) {
const statsRegex = /^(tests|suites|pass|fail|cancelled|skipped|todo|duration_ms) /u;
if (statsRegex.test(message)) {
const [key, value] = message.split(' ');
stats[key] = value;
}
}
else {
yield issueCommand('notice', { file, line, col: column }, message);
}
}
}
function* handleFailedTests(failedTests) {
if (failedTests.length > 0) {
yield issueCommand('group', {}, 'Test Failures');
for (const { name: title, file, line, column: col, message } of failedTests) {
yield issueCommand('error', { title, file, line, col }, message);
}
yield issueCommand('endgroup');
}
}
export default async function* ghaReporter(source) {
const failedTests = [];
const stats = {};
const isGHA = process.env['GITHUB_ACTIONS'] === 'true';
if (!isGHA) {
for await (const _ of source) {
// drain the source
}
}
else {
for await (const event of source) {
yield* handleEvent(event, failedTests, stats);
}
yield* handleFailedTests(failedTests);
await writeSummary(stats);
}
}
//# sourceMappingURL=index.mjs.map