/* this is a builder for HTML files Step: * Read the HTML tpl from './html/tpl.html' * Replace the placeholders with the actual values * {{css}} --> {{./dist/index.css}} * {{js}} --> {{./dist/index.js}} * Write the result to './dist/index.html' * */ import { strict as assert } from 'node:assert'; import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync, } from 'node:fs'; import { dirname, join } from 'node:path'; const htmlPath = join(__dirname, '../html/tpl.html'); const cssPath = join(__dirname, '../dist/report/index.css'); const jsPath = join(__dirname, '../dist/report/index.js'); const demoPath = join(__dirname, './fixture/demo-dump.json'); const demoMobilePath = join(__dirname, './fixture/demo-mobile-dump.json'); const multiEntrySegment = join(__dirname, './fixture/multi-entries.html'); const outputHTML = join(__dirname, '../dist/report/index.html'); const outputDemoHTML = join(__dirname, '../dist/report/demo.html'); const outputDemoMobileHTML = join(__dirname, '../dist/report/demo-mobile.html'); const outputMultiEntriesHTML = join(__dirname, '../dist/report/multi.html'); const outputEmptyDumpHTML = join(__dirname, '../dist/report/empty-error.html'); function ensureDirectoryExistence(filePath: string) { const directoryPath = dirname(filePath); if (existsSync(directoryPath)) { return true; } mkdirSync(directoryPath, { recursive: true }); return true; } function tplReplacer(tpl: string, obj: Record) { return tpl.replace(/{{\s*(\w+)\s*}}/g, (_, key) => { return obj[key] || `{{${key}}}`; // keep the placeholder if not found }); } function copyToCore() { const corePath = join(__dirname, '../../midscene/report/index.html'); ensureDirectoryExistence(corePath); copyFileSync(outputHTML, corePath); console.log(`HTML file copied to core successfully: ${corePath}`); } function build() { const html = readFileSync(htmlPath, 'utf-8'); const css = readFileSync(cssPath, 'utf-8'); const js = readFileSync(jsPath, 'utf-8'); const result = tplReplacer(html, { css: `\n`, js: ``, }); assert(result.length >= 1000); writeFileSync(outputHTML, result); console.log(`HTML file generated successfully: ${outputHTML}`); const demoData = readFileSync(demoPath, 'utf-8'); const resultWithDemo = tplReplacer(html, { css: `\n`, js: ``, dump: ``, }); writeFileSync(outputDemoHTML, resultWithDemo); console.log(`HTML file generated successfully: ${outputDemoHTML}`); const demoMobileData = readFileSync(demoMobilePath, 'utf-8'); const resultWithDemoMobile = tplReplacer(html, { css: `\n`, js: ``, dump: ``, }); writeFileSync(outputDemoMobileHTML, resultWithDemoMobile); console.log(`HTML file generated successfully: ${outputDemoMobileHTML}`); const multiEntriesData = readFileSync(multiEntrySegment, 'utf-8'); const resultWithMultiEntries = tplReplacer(html, { css: `\n`, js: ``, dump: multiEntriesData, }); writeFileSync(outputMultiEntriesHTML, resultWithMultiEntries); console.log(`HTML file generated successfully: ${outputMultiEntriesHTML}`); // dump data with empty array const resultWithEmptyDump = tplReplacer(html, { css: `\n`, js: ``, dump: '', }); writeFileSync(outputEmptyDumpHTML, resultWithEmptyDump); console.log(`HTML file generated successfully: ${outputEmptyDumpHTML}`); copyToCore(); } build();