|
/* global require, process, module, __dirname */ |
|
'use strict'; |
|
|
|
const fs = require('fs'); |
|
const path = require('path'); |
|
const { resolve, isAbsolute, dirname } = require('path'); |
|
const mustache = require('mustache'); |
|
|
|
function writeReport(fileName, data) { |
|
try { |
|
const dirPath = dirname(fileName); |
|
if (!(fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory())) { |
|
fs.mkdirSync(dirPath, { recursive: true }); |
|
} |
|
fs.writeFileSync(fileName, data); |
|
} catch (error) { |
|
console.error(`Unable to write ${fileName}`); |
|
console.error(error); |
|
} |
|
} |
|
|
|
function resolveFile(fileName) { |
|
if (typeof fileName !== 'string') { |
|
return null; |
|
} |
|
return isAbsolute(fileName) ? fileName : resolve(process.cwd(), fileName); |
|
} |
|
|
|
function markdown(allResults) { |
|
const templateString = fs.readFileSync( |
|
path.resolve(`${__dirname}/report-template.md`), |
|
'utf-8', |
|
); |
|
const pages = allResults |
|
.filter((r) => r.issues.length > 0) |
|
.map((results) => { |
|
return { |
|
// Result information |
|
issues: results.issues.map((issue) => { |
|
return { |
|
type: issue.type, |
|
error: issue.type === 'error', |
|
warning: issue.type === 'warning', |
|
notice: issue.type === 'notice', |
|
code: issue.code, |
|
message: issue.message, |
|
selector: issue.selector, |
|
context: issue.context, |
|
}; |
|
}), |
|
pageUrl: formatPageUrl(results.pageUrl), |
|
|
|
errorCount: results.issues.filter((issue) => issue.type === 'error') |
|
.length, |
|
warningCount: results.issues.filter((issue) => issue.type === 'warning') |
|
.length, |
|
noticeCount: results.issues.filter((issue) => issue.type === 'notice') |
|
.length, |
|
}; |
|
}); |
|
return mustache.render(templateString, { |
|
// The current date |
|
date: new Date(), |
|
pages, |
|
errorCount: pages.reduce((acc, page) => acc + page.errorCount, 0), |
|
warningCount: pages.reduce((acc, page) => acc + page.warningCount, 0), |
|
noticeCount: pages.reduce((acc, page) => acc + page.noticeCount, 0), |
|
}); |
|
} |
|
|
|
function formatPageUrl(filePath) { |
|
const filename = path.basename(filePath); |
|
const [verb, subdomain, urlpath] = decodeURIComponent(filename).split('!!'); |
|
return `${verb} ${subdomain}.cobot.me${urlpath.replace(/--/g, '/')}`; |
|
} |
|
|
|
module.exports = function htmlReporter(options = {}) { |
|
const fileName = resolveFile(options.fileName); |
|
const allResults = []; |
|
return { |
|
results(results) { |
|
allResults.push(results); |
|
}, |
|
afterAll() { |
|
const html = markdown(allResults); |
|
// If reporter options specify an output file, write to file. |
|
// Otherwise, write to console. |
|
if (fileName) { |
|
writeReport(fileName, html); |
|
} else { |
|
console.log(html); |
|
} |
|
}, |
|
}; |
|
}; |