UNPKG

approvals

Version:

Approval Tests Library - Capturing Human Intelligence

79 lines (78 loc) 3.82 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FileApprover = void 0; exports.verify = verify; const fs_1 = __importDefault(require("fs")); const ConsoleUtils_1 = require("./Utilities/ConsoleUtils"); const ApprovedFileLog_1 = require("./Logs/ApprovedFileLog"); const FailedFileLog_1 = require("./Logs/FailedFileLog"); function normalizeLineEndings(value) { return value.replace(/(?:\r\n|\r|\n)/g, "\n"); } class FileApprover { static verify(namer, writer, reporterFactory, options) { if (!namer || !writer || !reporterFactory) { throw new Error("Missing required arguments: 'namer', 'writer', or 'reporterFactory'."); } if (!options) { options = {}; } const approvedFileName = namer.getApprovedFile(writer.getFileExtension()); const receivedFileName = namer.getReceivedFile(writer.getFileExtension()); FailedFileLog_1.FailedFileLog.touch(); ApprovedFileLog_1.ApprovedFileLog.log(approvedFileName); writer.write(receivedFileName); if (options.forceApproveAll) { console.log((0, ConsoleUtils_1.yellowText)(`WARNING: Force approving: ${approvedFileName}`)); writer.write(approvedFileName); } const selectFirstCompatibleReporter = () => { const allReporters = reporterFactory(); const reporter = allReporters.find((reporter) => reporter.canReportOn(receivedFileName)); if (!reporter) { throw new Error(`No compatible reporter found in configured list [${allReporters.map((r) => r.name).join(", ")}] for: ${receivedFileName}`); } return reporter; }; const throwReporterError = (msg) => { FailedFileLog_1.FailedFileLog.log(approvedFileName, receivedFileName); const reporter = selectFirstCompatibleReporter(); try { reporter.report(approvedFileName, receivedFileName, options); } catch (ex) { const reporterError = `Error raised by reporter [${reporter.name}]: ${ex}`; throw new Error(`${reporterError}\n${msg}\nApproved: ${approvedFileName}\nReceived: ${receivedFileName}`); } throw new Error(msg); }; if (!fs_1.default.existsSync(approvedFileName)) { throwReporterError(`Approved file does not exist: ${approvedFileName}`); } let approvedFileContents = fs_1.default.readFileSync(approvedFileName, "utf8") || ""; let receivedFileContents = fs_1.default.readFileSync(receivedFileName, "utf8") || ""; if (options.stripBOM) { approvedFileContents = approvedFileContents.replace(/^\uFEFF/, ""); receivedFileContents = receivedFileContents.replace(/^\uFEFF/, ""); } if (options.failOnLineEndingDifferences && approvedFileContents !== receivedFileContents) { throwReporterError("Files do not match."); } const approvedFileBufferNormalized = normalizeLineEndings(approvedFileContents); const receivedFileBufferNormalized = normalizeLineEndings(receivedFileContents); if (approvedFileBufferNormalized !== receivedFileBufferNormalized) { throwReporterError("Files do not match."); } // Delete the received file fs_1.default.unlinkSync(receivedFileName); process.emit("approvalFileApproved", approvedFileName); } } exports.FileApprover = FileApprover; function verify(namer, writer, reporterFactory, options) { FileApprover.verify(namer, writer, reporterFactory, options); }