UNPKG

cucumber-html-report-generator

Version:

Generate beautiful cucumberjs html reports for multiple instances (browsers / devices)

262 lines 14.2 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GenerateHtml = void 0; const CommonFunctions = __importStar(require("../../common-functions/common-functions")); const ConsoleMessages = __importStar(require("../../helpers/console-messages")); const fse = __importStar(require("fs-extra")); const lodash = __importStar(require("lodash")); const path = __importStar(require("path")); const scripts = __importStar(require("./html-charts-scripts-functions")); const fs_1 = __importStar(require("fs")); const charts_data_1 = require("./charts-data"); const chalk_1 = __importDefault(require("chalk")); const open_1 = __importDefault(require("open")); const featureOverviewScriptsTemplate = '/resources/templates/scripts/feature-overview-scripts.tmpl'; const featuresOverviewScriptsTemplate = '/resources/templates/scripts/features-overview-scripts.tmpl'; const reportStylesheetDarkThemeTemplate = '/resources/templates/css/style-dark-theme.css'; const reportStylesheetLightThemeTemplate = '/resources/templates/css/style-light-theme.css'; const featuresOverviewIndexTemplate = '/resources/templates/components/features-overview/features-overview-index.tmpl'; const featuresOverviewTableTemplate = '/resources/templates/components/features-overview/features-overview-table.tmpl'; const pieChartTemplate = '/resources/templates/components/charts/pie-chart.tmpl'; const metadataTemplate = '/resources/templates/components/charts/metadata.tmpl'; const featureOverviewIndexTemplate = '/resources/templates/components/feature-overview/feature-overview-index.tmpl'; const scenarioStepsTemplate = '/resources/templates/components/feature-overview/scenario-elements/steps.tmpl'; const scenarioBeforeTemplate = '/resources/templates/components/feature-overview/scenario-elements/before.tmpl'; const scenarioAfterTemplate = '/resources/templates/components/feature-overview/scenario-elements/after.tmpl'; const tagsTemplate = '/resources/templates/components/feature-overview/scenario-elements/tags.tmpl'; const scenarioNameAndResultsTemplate = '/resources/templates/components/feature-overview/scenario-elements/name-and-results.tmpl'; const scenarioResultsTemplate = '/resources/templates/components/feature-overview/scenario-elements/results.tmpl'; const simpleScenarioTemplate = '/resources/templates/components/feature-overview/scenarios/simple-scenario.tmpl'; const outlineScenarioTemplate = '/resources/templates/components/feature-overview/scenarios/outline-scenario.tmpl'; const outlineScenarioChildTemplate = '/resources/templates/components/feature-overview/scenarios/outline-scenario-child.tmpl'; const resourcesFolder = '/resources/dependencies/'; class GenerateHtml { constructor(suite, reportConfiguration) { this.suite = suite; this.chartsData = new charts_data_1.ChartsData(this.suite); this.reportConfiguration = reportConfiguration; this.scriptsFunctions = new scripts.HtmlScriptsFunctions(this.reportConfiguration.theme); this.featuresOverviewIndex = path.join(this.reportConfiguration.reportPath, 'index.html'); const scriptName = path.basename(__filename); this.rootFolder = path.join(path.dirname(require.resolve(`./${scriptName}`)), '../../..'); } async createHtmlPages() { this.createFeaturesOverviewIndexPage(); await this.createFeatureIndexPages(); if (!this.reportConfiguration.useCDN) { await this.copyResourcesToTargetFolder(); } await this.openReportInBrowser(); } async openReportInBrowser() { /* istanbul ignore else */ if (this.reportConfiguration.disableLog) { console.log(chalk_1.default.blue(ConsoleMessages.reportCreated(this.featuresOverviewIndex))); } /* istanbul ignore next */ if (this.reportConfiguration.openReportInBrowser) { const dir = path.join(this.reportConfiguration.reportPath, 'features'); const files = await fs_1.promises.readdir(dir); /* istanbul ignore next */ if (files.length === 1 && this.reportConfiguration.navigateToFeatureIfThereIsOnlyOne) { await (0, open_1.default)(path.join(dir, files[0])); } else { const result = await (0, open_1.default)(this.featuresOverviewIndex); console.log(result); } } } createFeaturesOverviewIndexPage() { fs_1.default.writeFileSync(this.featuresOverviewIndex, this.generateTemplate(featuresOverviewIndexTemplate, { featuresOverview: this.generateTemplate(featuresOverviewTableTemplate, { suite: this.suite }), featuresChart: this.generateTemplate(pieChartTemplate, { results: this.suite.results.features, dataBsTarget: '#Features-Charts, #Scenarios-Charts,#Metadata-Properties', chartData: 'Features' }), scenariosChart: this.generateTemplate(pieChartTemplate, { results: this.suite.results.features, dataBsTarget: '#Features-Charts, #Scenarios-Charts,#Metadata-Properties', chartData: 'Scenarios' }), metadata: this.generateTemplate(metadataTemplate, { dataBsTarget: '#Features-Charts, #Scenarios-Charts,#Metadata-Properties', metadata: this.suite.metadata, metadataTitle: this.suite.metadataTitle }), featuresOverviewScripts: this.generateTemplate(featuresOverviewScriptsTemplate, { config: this.reportConfiguration, chartsData: this.chartsData, scriptsFunctions: this.scriptsFunctions, suite: this.suite }), config: this.reportConfiguration, projectName: this.suite.reportTitle, styles: this.generateTemplate(this.reportConfiguration.overrideStyle ?? (this.reportConfiguration.theme === 'Dark' ? reportStylesheetDarkThemeTemplate : reportStylesheetLightThemeTemplate)), customStyle: this.reportConfiguration.customStyle ? this.generateTemplate(this.reportConfiguration.customStyle) : '', suite: this.suite })); } async createFeatureIndexPages() { const featuresPath = path.resolve(this.reportConfiguration.reportPath, 'features/'); if (!CommonFunctions.exists(featuresPath)) { fs_1.default.mkdirSync(featuresPath); } await Promise.all(this.suite.features.map(feature => { const featurePage = `${featuresPath}/${feature.id.toString().replace('/', '_')}.html`; fs_1.default.writeFileSync(featurePage, this.generateTemplate(featureOverviewIndexTemplate, { feature, featureOverviewScripts: this.generateTemplate(featureOverviewScriptsTemplate, { feature, chartsData: this.chartsData, scriptsFunctions: this.scriptsFunctions, suite: this.suite }), config: this.reportConfiguration, scenariosChart: this.generateTemplate(pieChartTemplate, { results: this.suite.results.features, dataBsTarget: '#scenarios-charts,#steps-charts,#metadata-properties', chartData: 'Scenarios' }), stepsChart: this.generateTemplate(pieChartTemplate, { results: this.suite.results.features, dataBsTarget: '#scenarios-charts,#steps-charts,#metadata-properties', chartData: 'Steps' }), metadata: this.generateTemplate(metadataTemplate, { dataBsTarget: '#scenarios-charts,#steps-charts,#metadata-properties', metadata: feature.metadata, metadataTitle: feature.metadataTitle }), scenariosTemplate: this.generateScenariosTemplate(feature), styles: this.generateTemplate(this.reportConfiguration.theme === 'Dark' || this.reportConfiguration.theme !== 'Light' ? reportStylesheetDarkThemeTemplate : reportStylesheetLightThemeTemplate), customStyle: this.reportConfiguration.customStyle ? this.generateTemplate(this.reportConfiguration.customStyle) : '', suite: this.suite, tags: this.generateTemplate(tagsTemplate, { index: feature.id, tags: feature.tags }), })); return feature; })); } generateScenariosTemplate(feature) { let scenariosTemplates = ''; for (let scenarioIndex = 0; scenarioIndex < feature.elements.length; scenarioIndex++) { const scenario = (feature.elements)[scenarioIndex]; const templates = this.getScenarioElementsTemplates(scenario, scenarioIndex); if (scenario.isFirstScenarioOutline && scenario.examples?.length) { let scenarioOutlineChildsTemplates = ''; for (let scenarioExamplesIndex = 1; scenarioExamplesIndex < scenario.examples.length; scenarioExamplesIndex++) { const scenarioTemplates = this.getScenarioElementsTemplates((feature.elements)[scenarioIndex + scenarioExamplesIndex], scenarioIndex + scenarioExamplesIndex); scenarioOutlineChildsTemplates += this.generateTemplate(outlineScenarioChildTemplate, { templates: scenarioTemplates, scenarioExamplesIndex, scenarioExamples: (feature.elements)[scenarioIndex].examples }); } const scenarioOutline = this.generateTemplate(outlineScenarioTemplate, { templates, scenarioOutlineChilds: scenarioOutlineChildsTemplates }); scenariosTemplates += scenarioOutline; scenarioIndex += scenario.examples.length - 1; } else { const simpleScenario = this.generateTemplate(simpleScenarioTemplate, { templates }); scenariosTemplates += simpleScenario; } } return scenariosTemplates; } getScenarioElementsTemplates(scenario, scenarioIndex) { return { config: this.reportConfiguration, scenarioIndex, scenario, scenarioId: scenario.id, tags: this.generateTemplate(tagsTemplate, { scenario }), nameAndResults: this.generateTemplate(scenarioNameAndResultsTemplate, { config: this.reportConfiguration, scenario, scenarioIndex }), results: this.generateTemplate(scenarioResultsTemplate, { scenario, scenarioIndex }), steps: this.generateTemplate(scenarioStepsTemplate, { config: this.reportConfiguration, isFirstScenarioOutline: scenario.isFirstScenarioOutline, scenarioIndex, steps: scenario.steps, }), before: this.generateTemplate(scenarioBeforeTemplate, { config: this.reportConfiguration, scenario, scenarioIndex, steps: this.generateTemplate(scenarioStepsTemplate, { config: this.reportConfiguration, isFirstScenarioOutline: scenario.isFirstScenarioOutline, scenarioIndex, steps: scenario.before?.steps }) }), after: this.generateTemplate(scenarioAfterTemplate, { config: this.reportConfiguration, scenario, scenarioIndex, steps: this.generateTemplate(scenarioStepsTemplate, { config: this.reportConfiguration, isFirstScenarioOutline: scenario.isFirstScenarioOutline, scenarioIndex, steps: scenario.after?.steps }) }) }; } readTemplateFile(fileName) { return fs_1.default.readFileSync(CommonFunctions.exists(fileName) ? fileName : path.join(this.rootFolder, fileName), 'utf-8'); } generateTemplate(templateName, parameters) { const compiledTemplate = lodash.template(this.readTemplateFile(templateName)); lodash.extend('scriptFunctions', this.scriptsFunctions); return compiledTemplate(parameters); } async copyResourcesToTargetFolder() { await fse.copy(path.join(this.rootFolder, resourcesFolder), path.resolve(this.reportConfiguration.reportPath, 'resources')); } } exports.GenerateHtml = GenerateHtml; //# sourceMappingURL=generate-html.js.map