github-desktop/script/jest-actions-reporter.js
2020-07-09 22:43:11 +02:00

68 lines
1.6 KiB
JavaScript

const { resolve, relative } = require('path')
/* eslint-disable @typescript-eslint/explicit-member-accessibility */
class JestActionsReporter {
constructor(globalConfig, options) {
this._globalConfig = globalConfig
this._options = options
}
onRunComplete(contexts, results) {
if (process.env.GITHUB_ACTIONS !== 'true') {
return
}
const { rootDir } = this._globalConfig
const repoRoot = resolve(rootDir, '..')
for (const { testResults, testFilePath } of results.testResults) {
for (const { failureMessages, location } of testResults) {
if (location === null) {
continue
}
const path = relative(repoRoot, testFilePath)
for (const msg of failureMessages) {
const { line, column } =
tryGetFailureLocation(msg, testFilePath) || location
const escapedMessage = `${msg}`.replace(/\r?\n/g, '%0A')
process.stdout.write(
`::error file=${path},line=${line},col=${column}::${escapedMessage}\n`
)
}
}
}
}
}
function tryGetFailureLocation(message, testPath) {
for (const line of message.split(/\r?\n/g)) {
if (!/^\s+at\s/.test(line)) {
continue
}
const ix = line.indexOf(testPath)
if (ix < 0) {
continue
}
const locationRe = /:(\d+):(\d+)/
const remainder = line.substr(ix + testPath.length)
const match = locationRe.exec(remainder)
if (match) {
return {
line: parseInt(match[1], 10),
column: parseInt(match[2], 10),
}
}
}
return undefined
}
module.exports = JestActionsReporter