@wdio/json-reporter
Version:
A WebdriverIO plugin to report results in json format.
64 lines (63 loc) • 2.22 kB
JavaScript
// src/mergeResults.ts
import fs from "node:fs/promises";
import path from "node:path";
import safeRegexTest from "safe-regex2";
var DEFAULT_FILENAME = "wdio-merged.json";
async function mergeResults(dir = process.argv[2], filePattern = process.argv[3], customFileName = process.argv[4]) {
const doesDirExist = fs.access(dir).then(() => true, () => false);
if (!doesDirExist) {
throw new Error(`Directory "${dir}" does not exist.`);
}
const rawData = await getDataFromFiles(dir, filePattern);
const mergedResults = mergeData(rawData);
if (customFileName) {
const fileName = customFileName || DEFAULT_FILENAME;
const filePath = path.join(dir, fileName);
await fs.writeFile(filePath, JSON.stringify(mergedResults));
}
return mergedResults;
}
async function getDataFromFiles(dir, filePattern) {
let safePattern;
if (filePattern instanceof RegExp) {
safePattern = safeRegexTest(filePattern) ? filePattern : /\.json$/;
} else if (typeof filePattern === "string") {
try {
safePattern = safeRegexTest(filePattern) ? new RegExp(filePattern) : /\.json$/;
} catch {
safePattern = /\.json$/;
}
} else {
safePattern = /\.json$/;
}
const fileNames = (await fs.readdir(dir)).filter((file) => file.match(safePattern));
const data = [];
await Promise.all(fileNames.map(async (fileName) => {
data.push(JSON.parse((await fs.readFile(`${dir}/${fileName}`)).toString()));
}));
return data;
}
function mergeData(rawData) {
if (rawData.length === 0) {
return {};
}
const mergedResults = {
...rawData[0],
capabilities: [rawData[0].capabilities]
};
for (const data of rawData.slice(1)) {
mergedResults.suites.push(...data.suites);
mergedResults.specs.push(...data.specs);
mergedResults.state.passed += data.state.passed;
mergedResults.state.failed += data.state.failed;
mergedResults.state.skipped += data.state.skipped;
mergedResults.capabilities.push(data.capabilities);
}
mergedResults.suites.forEach((suite) => {
mergedResults.end = suite.end && mergedResults.end && suite.end > mergedResults.end ? suite.end : mergedResults.end;
});
return mergedResults;
}
export {
mergeResults as default
};