UNPKG

@allurereport/plugin-dashboard

Version:

Allure Dashboard Plugin – plugin for generating dashboard with a mix of charts

127 lines (126 loc) 4.84 kB
import { createBaseUrlScript, createFontLinkTag, createReportDataScript, createScriptTag, createStylesLinkTag, } from "@allurereport/core-api"; import { generateCharts } from "@allurereport/web-commons"; import Handlebars from "handlebars"; import { randomUUID } from "node:crypto"; import { readFile } from "node:fs/promises"; import { createRequire } from "node:module"; import { basename, join } from "node:path"; const require = createRequire(import.meta.url); const template = `<!DOCTYPE html> <html dir="ltr" lang="en"> <head> <meta charset="utf-8"> <title> {{ reportName }} </title> <link rel="icon" href="favicon.ico"> {{{ headTags }}} </head> <body> <div id="app"></div> ${createBaseUrlScript()} <script> window.allure = window.allure || {}; </script> {{{ bodyTags }}} {{#if analyticsEnable}} <script async src="https://www.googletagmanager.com/gtag/js?id=G-LNDJ3J7WT0"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-LNDJ3J7WT0', { "report": "dashboard", "allureVersion": "{{ allureVersion }}", "reportUuid": "{{ reportUuid }}", "single_file": "{{singleFile}}" }); </script> {{/if}} <script> window.allureReportOptions = {{{ reportOptions }}} </script> {{{ reportFilesScript }}} </body> </html> `; export const readTemplateManifest = async (singleFileMode) => { const templateManifestSource = require.resolve(`@allurereport/web-dashboard/dist/${singleFileMode ? "single" : "multi"}/manifest.json`); const templateManifest = await readFile(templateManifestSource, { encoding: "utf-8" }); return JSON.parse(templateManifest); }; export const generateAllCharts = async (writer, store, options, context) => { const { layout } = options; if (!layout) { return; } const generatedChartsData = await generateCharts(layout, store, context.reportName, randomUUID); if (Object.keys(generatedChartsData.general).length > 0) { await writer.writeWidget("charts.json", generatedChartsData); } }; export const generateEnvirontmentsList = async (writer, store) => { const environments = await store.allEnvironments(); await writer.writeWidget("environments.json", environments); }; export const generateStaticFiles = async (payload) => { const { reportName = "Allure Report", reportLanguage = "en", singleFile, logo = "", theme = "light", reportFiles, reportDataFiles, reportUuid, allureVersion, } = payload; const compile = Handlebars.compile(template); const manifest = await readTemplateManifest(payload.singleFile); const headTags = []; const bodyTags = []; if (!payload.singleFile) { for (const key in manifest) { const fileName = manifest[key]; const filePath = require.resolve(join("@allurereport/web-dashboard/dist", singleFile ? "single" : "multi", fileName)); if (key.includes(".woff")) { headTags.push(createFontLinkTag(fileName)); } if (key === "main.css") { headTags.push(createStylesLinkTag(fileName)); } if (key === "main.js") { bodyTags.push(createScriptTag(fileName)); } if (singleFile) { continue; } const fileContent = await readFile(filePath); await reportFiles.addFile(basename(filePath), fileContent); } } else { const mainJs = manifest["main.js"]; const mainJsSource = require.resolve(`@allurereport/web-dashboard/dist/single/${mainJs}`); const mainJsContentBuffer = await readFile(mainJsSource); bodyTags.push(createScriptTag(`data:text/javascript;base64,${mainJsContentBuffer.toString("base64")}`)); } const reportOptions = { reportName, logo, theme, reportLanguage, createdAt: Date.now(), reportUuid, allureVersion, }; try { const html = compile({ headTags: headTags.join("\n"), bodyTags: bodyTags.join("\n"), reportFilesScript: createReportDataScript(reportDataFiles), reportOptions: JSON.stringify(reportOptions), analyticsEnable: true, allureVersion, reportUuid, reportName, singleFile: payload.singleFile, }); await reportFiles.addFile("index.html", Buffer.from(html, "utf8")); } catch (err) { if (err instanceof RangeError) { console.error("The report is too large to be generated in the single file mode!"); process.exit(1); } throw err; } };