import path from 'path'; import fs from 'fs'; import { createRequire } from 'module'; import fileUrl from 'file-url'; import { schema, StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { Reporter } from '@stryker-mutator/api/report'; import { reporterUtil } from './reporter-util.js'; export class HtmlReporter implements Reporter { private mainPromise: Promise | undefined; constructor( private readonly options: StrykerOptions, private readonly log: Logger, ) {} public static readonly inject = tokens(commonTokens.options, commonTokens.logger); public onMutationTestReportReady(report: schema.MutationTestResult): void { this.mainPromise = this.generateReport(report); } public wrapUp(): Promise | undefined { return this.mainPromise; } private async generateReport(report: schema.MutationTestResult) { this.log.debug(`Using file "${this.options.htmlReporter.fileName}"`); const html = await createReportHtml(report); await reporterUtil.writeFile(this.options.htmlReporter.fileName, html); this.log.info(`Your report can be found at: ${fileUrl(path.resolve(this.options.htmlReporter.fileName))}`); } } async function createReportHtml(report: schema.MutationTestResult): Promise { const require = createRequire(import.meta.url); const scriptContent = await fs.promises.readFile(require.resolve('mutation-testing-elements/dist/mutation-test-elements.js'), 'utf-8'); return ` Your browser doesn't support custom elements. Please use a latest version of an evergreen browser (Firefox, Chrome, Safari, Opera, Edge, etc). `; } /** * Escapes the HTML tags inside strings in a JSON input by breaking them apart. */ function escapeHtmlTags(json: string) { const j = json.replace(/