flow-coverage-report
Version:
Generate an HTML report of the flow coverage data
277 lines (232 loc) • 12.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _path = _interopRequireDefault(require("path"));
var _react = _interopRequireDefault(require("react"));
var _server = _interopRequireDefault(require("react-dom/server"));
var _mkdirp = _interopRequireDefault(require("mkdirp"));
var _promisified = require("./promisified");
var _htmlReportPage = require("./components/html-report-page");
var baseSemanticAssets = ['themes', 'default', 'assets'];
var assetsList = ['jquery-3.1.0.min.js', 'semantic.min.js', 'semantic.min.css', 'semantic-tablesort.js', 'index.js', 'codemirror.js', 'codemirror.css', 'codemirror-javascript-mode.js', 'codemirror-annotatescrollbar-addon.js', 'codemirror-simplescrollbars-addon.js', 'codemirror-simplescrollbars-addon.css', 'flow-highlight-source.js', 'flow-highlight-source.css', 'flow-coverage-report.css'].concat([['images', 'flags.png'], ['fonts', 'icons.eot'], ['fonts', 'icons.otf'], ['fonts', 'icons.svg'], ['fonts', 'icons.ttf'], ['fonts', 'icons.woff'], ['fonts', 'icons.woff2']].map(function (element) {
return _path["default"].join.apply(null, baseSemanticAssets.concat(element));
}));
function copyAsset(_x, _x2) {
return _copyAsset.apply(this, arguments);
}
function _copyAsset() {
_copyAsset = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(outputDir, assetName) {
var srcfileReady, createDestDir, destFileWritten, _yield$Promise$all, _yield$Promise$all2, srcFileData;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
destFileWritten = function _destFileWritten(data) {
return (0, _promisified.writeFile)(_path["default"].join(outputDir, 'assets', assetName), data);
};
srcfileReady = (0, _promisified.readFile)(_path["default"].join(__dirname, '..', '..', 'assets', assetName));
createDestDir = (0, _mkdirp["default"])(_path["default"].join(outputDir, 'assets', _path["default"].dirname(assetName)));
_context.next = 5;
return Promise.all([srcfileReady, createDestDir]);
case 5:
_yield$Promise$all = _context.sent;
_yield$Promise$all2 = (0, _slicedToArray2["default"])(_yield$Promise$all, 1);
srcFileData = _yield$Promise$all2[0];
return _context.abrupt("return", destFileWritten(srcFileData));
case 9:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return _copyAsset.apply(this, arguments);
}
function copyAssets(outputDir
/* : string */
) {
return Promise.all(assetsList.map(copyAsset.bind(null, outputDir)));
}
function renderHTMLReport(_x3) {
return _renderHTMLReport.apply(this, arguments);
}
function _renderHTMLReport() {
_renderHTMLReport = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(opt
/* : Object */
) {
var relativeToFilename, prefixAssets, summaryReportContent, _summaryReportContent, sourceReportContent, _sourceReportContent, waitForReportContent, result, reportFilePath, reportFileContent;
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_sourceReportContent = function _sourceReportContent3() {
_sourceReportContent = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
var srcPath, dirName, toRelative, buff, reportFileContent, reportFilePath;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
srcPath = _path["default"].join(opt.projectDir, opt.filename);
dirName = _path["default"].dirname(opt.filename);
toRelative = relativeToFilename.bind(null, 'sourcefiles');
_context3.next = 5;
return (0, _mkdirp["default"])(_path["default"].join(opt.outputDir, 'sourcefiles', dirName));
case 5:
_context3.next = 7;
return (0, _promisified.readFile)(srcPath);
case 7:
buff = _context3.sent;
reportFileContent = '<!DOCTYPE html>\n' + _server["default"].renderToStaticMarkup( /*#__PURE__*/_react["default"].createElement(_htmlReportPage.HTMLReportSourceFilePage, {
htmlTemplateOptions: opt.htmlTemplateOptions,
coverageGeneratedAt: opt.coverageGeneratedAt,
coverageSummaryData: opt.coverageSummaryData,
coverageData: opt.coverageData,
fileName: opt.filename,
fileContent: buff,
summaryRelLink: toRelative('index.html'),
threshold: opt.threshold,
assets: {
css: ['semantic.min.css', 'codemirror.css', 'flow-highlight-source.css', 'flow-coverage-report.css', 'codemirror-simplescrollbars-addon.css'].map(prefixAssets).map(toRelative),
js: ['jquery-3.1.0.min.js', 'semantic.min.js', 'semantic-tablesort.js', 'codemirror.js', 'codemirror-javascript-mode.js', 'codemirror-annotatescrollbar-addon.js', 'codemirror-simplescrollbars-addon.js', 'flow-highlight-source.js', 'index.js'].map(prefixAssets).map(toRelative)
}
}));
reportFilePath = _path["default"].join(opt.outputDir, 'sourcefiles', opt.filename) + '.html';
return _context3.abrupt("return", {
reportFilePath: reportFilePath,
reportFileContent: reportFileContent
});
case 11:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return _sourceReportContent.apply(this, arguments);
};
sourceReportContent = function _sourceReportContent2() {
return _sourceReportContent.apply(this, arguments);
};
_summaryReportContent = function _summaryReportContent3() {
_summaryReportContent = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
var toRelative, reportFilePath, reportFileContent;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
toRelative = relativeToFilename.bind(null, '');
reportFilePath = _path["default"].join(opt.outputDir, 'index.html');
reportFileContent = '<!DOCTYPE html>\n' + _server["default"].renderToStaticMarkup( /*#__PURE__*/_react["default"].createElement(_htmlReportPage.HTMLReportSummaryPage, {
htmlTemplateOptions: opt.htmlTemplateOptions,
coverageGeneratedAt: opt.coverageGeneratedAt,
coverageSummaryData: opt.coverageSummaryData,
assets: {
css: ['semantic.min.css', 'flow-coverage-report.css'].map(prefixAssets).map(toRelative),
js: ['jquery-3.1.0.min.js', 'semantic.min.js', 'semantic-tablesort.js', 'index.js'].map(prefixAssets).map(toRelative)
}
}));
return _context2.abrupt("return", {
reportFilePath: reportFilePath,
reportFileContent: reportFileContent
});
case 4:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
return _summaryReportContent.apply(this, arguments);
};
summaryReportContent = function _summaryReportContent2() {
return _summaryReportContent.apply(this, arguments);
};
prefixAssets = function _prefixAssets(filePath) {
return _path["default"].join('assets', filePath);
};
relativeToFilename = function _relativeToFilename(prefixDir, dest) {
return _path["default"].relative(_path["default"].join(prefixDir, _path["default"].dirname(opt.filename || '')), dest);
};
if (!(opt.filename && opt.filename.includes('..'))) {
_context4.next = 8;
break;
}
throw new Error('filename is not relative to the projectDir: ' + [opt.projectDir, opt.filename].join(' - '));
case 8:
_context4.t0 = opt.type;
_context4.next = _context4.t0 === 'summary' ? 11 : _context4.t0 === 'sourcefile' ? 13 : 15;
break;
case 11:
waitForReportContent = summaryReportContent();
return _context4.abrupt("break", 16);
case 13:
waitForReportContent = sourceReportContent();
return _context4.abrupt("break", 16);
case 15:
throw new Error('Unknown report type: ' + opt.type);
case 16:
_context4.next = 18;
return waitForReportContent;
case 18:
result = _context4.sent;
reportFilePath = result.reportFilePath, reportFileContent = result.reportFileContent;
_context4.next = 22;
return (0, _mkdirp["default"])(_path["default"].dirname(reportFilePath));
case 22:
_context4.next = 24;
return (0, _promisified.writeFile)(reportFilePath, Buffer.from(reportFileContent));
case 24:
case "end":
return _context4.stop();
}
}
}, _callee4);
}));
return _renderHTMLReport.apply(this, arguments);
}
function generateFlowCoverageReportHTML(coverageSummaryData, options) {
var projectDir = options.projectDir;
var outputDir = options.outputDir;
if (!outputDir) {
throw new Error('Unexpected empty outputDir option');
}
var coverageGeneratedAt = coverageSummaryData.generatedAt;
var generateSummary = renderHTMLReport({
type: 'summary',
filename: null,
htmlTemplateOptions: options.htmlTemplateOptions,
coverageSummaryData: coverageSummaryData,
coverageGeneratedAt: coverageGeneratedAt,
projectDir: projectDir,
outputDir: outputDir
});
var waitForCopyAssets = copyAssets(outputDir);
var generateSourceFiles = Object.keys(coverageSummaryData.files).map(function (filename) {
var coverageData = coverageSummaryData.files[filename];
return renderHTMLReport({
type: 'sourcefile',
coverageGeneratedAt: coverageGeneratedAt,
htmlTemplateOptions: options.htmlTemplateOptions,
coverageSummaryData: coverageSummaryData,
projectDir: projectDir,
filename: filename,
coverageData: coverageData,
outputDir: outputDir
});
});
return Promise.all([waitForCopyAssets, generateSummary].concat(generateSourceFiles));
}
var ReportHtml = {
assetsList: assetsList,
render: renderHTMLReport,
generate: generateFlowCoverageReportHTML
};
var _default = ReportHtml;
exports["default"] = _default;
//# sourceMappingURL=report-html.js.map