@cucumber/cucumber
Version:
The official JavaScript implementation of Cucumber.
72 lines • 2.79 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_util_1 = require("node:util");
const node_stream_1 = require("node:stream");
const node_fs_1 = require("node:fs");
const node_path_1 = __importDefault(require("node:path"));
const html_formatter_1 = require("@cucumber/html-formatter");
const mime_1 = __importDefault(require("mime"));
const messages_1 = require("@cucumber/messages");
exports.default = {
type: 'formatter',
formatter({ on, options, write, directory }) {
if (!directory && options.externalAttachments) {
throw new Error('Unable to externalise attachments when formatter is not writing to a file');
}
const newId = messages_1.IdGenerator.uuid();
const htmlStream = new html_formatter_1.CucumberHtmlStream();
const writeOperations = [];
on('message', (message) => {
if (message.attachment && options.externalAttachments) {
const { attachment, writeOperation } = externaliseAttachment(newId, message.attachment, directory);
htmlStream.write({
...message,
attachment,
});
if (writeOperation) {
writeOperations.push(writeOperation);
}
}
else {
htmlStream.write(message);
}
});
htmlStream.on('data', (chunk) => write(chunk));
return async () => {
htmlStream.end();
await (0, node_util_1.promisify)(node_stream_1.finished)(htmlStream);
await Promise.all(writeOperations);
};
},
optionsKey: 'html',
};
const alwaysInlinedTypes = ['text/x.cucumber.log+plain', 'text/uri-list'];
const encodingsMap = {
IDENTITY: 'utf-8',
BASE64: 'base64',
};
function externaliseAttachment(newId, original, directory) {
if (alwaysInlinedTypes.includes(original.mediaType)) {
return { attachment: original };
}
let filename = `attachment-${newId()}`;
const extension = mime_1.default.getExtension(original.mediaType);
if (extension) {
filename += `.${extension}`;
}
const writeOperation = (0, node_util_1.promisify)(node_fs_1.writeFile)(node_path_1.default.join(directory, filename), Buffer.from(original.body, encodingsMap[original.contentEncoding]));
const updated = {
...original,
contentEncoding: messages_1.AttachmentContentEncoding.IDENTITY,
body: '',
url: `./${filename}`,
};
return {
attachment: updated,
writeOperation,
};
}
//# sourceMappingURL=html.js.map
;