UNPKG

allure-js-commons

Version:
277 lines (272 loc) 12.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.readImageAsBase64 = exports.randomUuid = exports.md5 = exports.getWorstTestStepResult = exports.getTestResultTestCaseId = exports.getTestResultHistoryId = exports.getSuiteLabels = exports.getRelativePath = exports.getProjectRoot = exports.getProjectName = exports.getPosixPath = exports.getFallbackTestCaseIdLabel = exports.formatLinks = exports.formatLink = exports.escapeRegExp = exports.ensureSuiteLabels = exports.deepClone = exports.createDefaultWriter = exports.applyLinkTemplate = exports.FALLBACK_TEST_CASE_ID_LABEL_NAME = void 0; var _nodeCrypto = require("node:crypto"); var _nodeFs = _interopRequireDefault(require("node:fs")); var _promises = require("node:fs/promises"); var _nodePath = _interopRequireDefault(require("node:path")); var _nodeProcess = _interopRequireDefault(require("node:process")); var _model = require("../../model.js"); var _FileSystemWriter = require("./writer/FileSystemWriter.js"); var _MessageWriter = require("./writer/MessageWriter.js"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } var randomUuid = () => { return (0, _nodeCrypto.randomUUID)(); }; exports.randomUuid = randomUuid; var md5 = str => { return (0, _nodeCrypto.createHash)("md5").update(str).digest("hex"); }; exports.md5 = md5; var FALLBACK_TEST_CASE_ID_LABEL_NAME = exports.FALLBACK_TEST_CASE_ID_LABEL_NAME = "_fallbackTestCaseId"; var getFallbackTestCaseIdLabel = value => ({ name: FALLBACK_TEST_CASE_ID_LABEL_NAME, value }); exports.getFallbackTestCaseIdLabel = getFallbackTestCaseIdLabel; var getTestResultHistoryId = result => { var _result$testCaseId; if (result.historyId) { return result.historyId; } var tcId = (_result$testCaseId = result.testCaseId) !== null && _result$testCaseId !== void 0 ? _result$testCaseId : result.fullName ? md5(result.fullName) : null; if (!tcId) { return ""; } var paramsString = result.parameters.filter(p => !(p !== null && p !== void 0 && p.excluded)).sort((a, b) => { var _a$name, _a$value; return ((_a$name = a.name) === null || _a$name === void 0 ? void 0 : _a$name.localeCompare(b === null || b === void 0 ? void 0 : b.name)) || ((_a$value = a.value) === null || _a$value === void 0 ? void 0 : _a$value.localeCompare(b === null || b === void 0 ? void 0 : b.value)); }).map(p => { var _p$name, _p$value; return "".concat((_p$name = p.name) !== null && _p$name !== void 0 ? _p$name : "null", ":").concat((_p$value = p.value) !== null && _p$value !== void 0 ? _p$value : "null"); }).join(","); var paramsHash = md5(paramsString); return "".concat(tcId, ":").concat(paramsHash); }; exports.getTestResultHistoryId = getTestResultHistoryId; var getTestResultTestCaseId = result => { return result.fullName ? md5(result.fullName) : undefined; }; exports.getTestResultTestCaseId = getTestResultTestCaseId; var statusToPriority = status => { if (!status) { return -1; } return _model.StatusByPriority.indexOf(status); }; var getWorstTestStepResult = steps => { if (steps.length === 0) { return; } return [...steps].sort((a, b) => statusToPriority(a.status) - statusToPriority(b.status))[0]; }; exports.getWorstTestStepResult = getWorstTestStepResult; var readImageAsBase64 = exports.readImageAsBase64 = /*#__PURE__*/function () { var _ref = _asyncToGenerator(function* (filePath) { try { var file = yield (0, _promises.readFile)(filePath, { encoding: "base64" }); return file ? "data:image/png;base64,".concat(file) : undefined; } catch (e) { // eslint-disable-next-line no-console console.error("could not read file ".concat(filePath), e); return undefined; } }); return function readImageAsBase64(_x) { return _ref.apply(this, arguments); }; }(); var getProjectRoot = exports.getProjectRoot = (() => { var cachedProjectRootBySearchFrom = new Map(); var resolveSearchDir = searchFrom => { var target = _nodePath.default.resolve(searchFrom !== null && searchFrom !== void 0 ? searchFrom : _nodeProcess.default.cwd()); try { return _nodeFs.default.statSync(target).isFile() ? _nodePath.default.dirname(target) : target; } catch (_unused) { return target; } }; var resolveProjectRootByPath = searchFrom => { var searchDir = resolveSearchDir(searchFrom); var dir = searchDir; while (true) { try { _nodeFs.default.accessSync(_nodePath.default.join(dir, "package.json"), _nodeFs.default.constants.F_OK); // package.json exists; use the directory as the project root return dir; } catch (_unused2) {} var parent = _nodePath.default.dirname(dir); if (parent === dir) { // package.json doesn't exist in any parent; fall back to the search directory return searchDir; } dir = parent; } }; return searchFrom => { var searchDir = resolveSearchDir(searchFrom); var cachedProjectRoot = cachedProjectRootBySearchFrom.get(searchDir); if (cachedProjectRoot) { return cachedProjectRoot; } var projectRoot = resolveProjectRootByPath(searchDir); cachedProjectRootBySearchFrom.set(searchDir, projectRoot); return projectRoot; }; })(); var getProjectName = exports.getProjectName = (() => { var cachedProjectNameByRoot = new Map(); return searchFrom => { var projectRoot = getProjectRoot(searchFrom); if (cachedProjectNameByRoot.has(projectRoot)) { return cachedProjectNameByRoot.get(projectRoot); } var packageJsonPath = _nodePath.default.join(projectRoot, "package.json"); var projectName; try { var packageJsonContent = _nodeFs.default.readFileSync(packageJsonPath, "utf-8"); var packageJson = JSON.parse(packageJsonContent); if (packageJson.name && typeof packageJson.name === "string") { projectName = packageJson.name; } } catch (_unused3) {} cachedProjectNameByRoot.set(projectRoot, projectName); return projectName; }; })(); var getRelativePath = (filepath, searchFrom) => { if (_nodePath.default.isAbsolute(filepath)) { var projectRoot = getProjectRoot(searchFrom); filepath = _nodePath.default.relative(projectRoot, filepath); } return filepath; }; exports.getRelativePath = getRelativePath; var getPosixPath = filepath => { if (_nodeProcess.default.platform === "win32") { return filepath.replaceAll("\\", "/"); } return filepath; }; exports.getPosixPath = getPosixPath; var deepClone = obj => JSON.parse(JSON.stringify(obj)); exports.deepClone = deepClone; var getSuiteLabels = suites => { if (suites.length === 0) { return []; } var [parentSuite, suite, ...subSuites] = suites; var labels = []; if (parentSuite) { labels.push({ name: _model.LabelName.PARENT_SUITE, value: parentSuite }); } if (suite) { labels.push({ name: _model.LabelName.SUITE, value: suite }); } if (subSuites.length > 0) { labels.push({ name: _model.LabelName.SUB_SUITE, value: subSuites.join(" > ") }); } return labels; }; exports.getSuiteLabels = getSuiteLabels; var suiteLabelNames = [_model.LabelName.PARENT_SUITE, _model.LabelName.SUITE, _model.LabelName.SUB_SUITE]; /** * Resolves suite labels for the given test results and add default lables if there is no any suite label. * @example * ```ts * ensureSuiteLabels({ labels: [{ name: "suite", value: "foo" }] }, ["bar"]) // => [{ name: "suite", value: "foo" }] * ensureSuiteLabels({ labels: [] }, ["bar"]) // => [{ name: "parentSuite", value: "bar" }] * ``` * @param test - Test result to resolve suite labels for * @param defaultSuites - Default suites to add if there is no any suite label * @returns Actual suite labels */ var ensureSuiteLabels = (test, defaultSuites) => { var _test$labels; if (!((_test$labels = test.labels) !== null && _test$labels !== void 0 && _test$labels.find(l => suiteLabelNames.includes(l.name)))) { var _test$labels2; test.labels = [...((_test$labels2 = test.labels) !== null && _test$labels2 !== void 0 ? _test$labels2 : []), ...getSuiteLabels(defaultSuites)]; } return suiteLabelNames.map(name => { var _test$labels3; return (_test$labels3 = test.labels) === null || _test$labels3 === void 0 ? void 0 : _test$labels3.find(l => l.name === name); }).filter(Boolean); }; exports.ensureSuiteLabels = ensureSuiteLabels; var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source); var escapeRegExp = value => { return reHasRegExpChar.test(value) ? value.replace(reRegExpChar, "\\$&") : value; }; // TODO: may also use URL.canParse instead (requires node.js v18.17, v19.9, or higher) exports.escapeRegExp = escapeRegExp; var isUrl = potentialUrl => { // Short-circuits the check for many short URL cases, bypassing the try-catch logic. if (potentialUrl.indexOf(":") === -1) { return false; } // There is ':' in the string: a potential scheme separator. // The string might be a proper URL already. try { new URL(potentialUrl); return true; } catch (_unused4) { return false; } }; var applyLinkTemplate = (template, value) => typeof template === "string" ? template.replace("%s", value) : template(value); exports.applyLinkTemplate = applyLinkTemplate; var formatLink = (templates, link) => { var { url: originalUrl, name, type } = link; if (isUrl(originalUrl)) { return link; } else { var _templates; var formattedLink = _objectSpread({}, link); var { urlTemplate, nameTemplate } = (_templates = templates[type !== null && type !== void 0 ? type : _model.LinkType.DEFAULT]) !== null && _templates !== void 0 ? _templates : {}; if (urlTemplate !== undefined) { formattedLink.url = applyLinkTemplate(urlTemplate, originalUrl); } if (name === undefined && nameTemplate !== undefined) { formattedLink.name = applyLinkTemplate(nameTemplate, originalUrl); } return formattedLink; } }; exports.formatLink = formatLink; var formatLinks = (templates, links) => links.map(link => formatLink(templates, link)); exports.formatLinks = formatLinks; var createDefaultWriter = config => { return _nodeProcess.default.env.ALLURE_TEST_MODE ? new _MessageWriter.MessageWriter(config.emitter) : new _FileSystemWriter.FileSystemWriter({ resultsDir: config.resultsDir || "./allure-results" }); }; exports.createDefaultWriter = createDefaultWriter; //# sourceMappingURL=utils.js.map