Skip to content

Commit d8f522b

Browse files
dudeofawesometcort
authored andcommitted
✨ add junit exporter
1 parent 7f524dd commit d8f522b

File tree

5 files changed

+203
-14
lines changed

5 files changed

+203
-14
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
node_modules
22
.tern-port
3+
junit.xml

markdown-link-check

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
let chalk;
66
const fs = require('fs');
7-
const markdownLinkCheck = require('./');
7+
const { promisify } = require('util');
8+
const markdownLinkCheck = promisify(require('./'));
89
const needle = require('needle');
910
const path = require('path');
1011
const pkg = require('./package.json');
@@ -232,17 +233,16 @@ async function processInput(filenameForOutput, stream, opts) {
232233
}
233234

234235
async function runMarkdownLinkCheck(filenameForOutput, markdown, opts) {
235-
return new Promise((resolve, reject) => {
236-
markdownLinkCheck(markdown, opts, async function (err, results) {
237-
await Promise.all(
238-
opts.reporters.map(reporter => reporter(err, results, opts, filenameForOutput)
239-
));
240-
241-
if (err) reject();
242-
else if (results.some((result) => result.status === 'dead')) reject();
243-
else resolve();
244-
});
245-
});
236+
const [err, results] = await markdownLinkCheck(markdown, opts)
237+
.then(res => [null, res]).catch(err => [err]);
238+
239+
await Promise.allSettled(
240+
opts.reporters.map(reporter => reporter(err, results, opts, filenameForOutput)
241+
));
242+
243+
if (err) throw null;
244+
else if (results.some((result) => result.status === 'dead')) return;
245+
else return;
246246
}
247247

248248
async function main() {

package-lock.json

Lines changed: 152 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
"markdown-link-extractor": "^4.0.2",
4141
"needle": "^3.3.1",
4242
"progress": "^2.0.3",
43-
"proxy-agent": "^6.4.0"
43+
"proxy-agent": "^6.4.0",
44+
"xmlbuilder2": "^3.1.1"
4445
},
4546
"devDependencies": {
4647
"@eslint/js": "^9.3.0",

reporters/junit.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
const { writeFileSync } = require('node:fs');
2+
const { create } = require('xmlbuilder2');
3+
4+
const doc = create({ version: '1.0', encoding: 'UTF-8' })
5+
.ele('testsuites');
6+
7+
module.exports = async function junitReporter(err, results, opts, filenameForOutput) {
8+
const suite = doc.ele('testsuite', { name: filenameForOutput });
9+
10+
if (err) suite.ele('error', { message: err })
11+
else {
12+
for (const result of results) {
13+
const test = suite.ele('testcase', { classname: result.link });
14+
if (result.status !== 'dead') continue;
15+
else {
16+
if (result.err != null) {
17+
test.ele('error', {
18+
message: result.err,
19+
type: 'error'
20+
});
21+
} else {
22+
test.ele('failure', {
23+
message: result.err
24+
?? `${result.link} is ${result.status} (${result.statusCode})`,
25+
type: result.status
26+
});
27+
}
28+
}
29+
}
30+
}
31+
};
32+
33+
process.on('exit', () => {
34+
writeFileSync('junit.xml', doc.end({ prettyPrint: true }) + '\n');
35+
console.error('\nWrote junit.xml');
36+
})

0 commit comments

Comments
 (0)