web-snaps
Version:
Browser automation with automatic snapshotting.
44 lines (43 loc) • 1.54 kB
JavaScript
import { assert } from '@augment-vir/assert';
import { log, stringify } from '@augment-vir/common';
import { mkdir, writeFile } from 'node:fs/promises';
import { dirname } from 'node:path';
/**
* Save a {@link WebSnap} to the file system.
*
* @category Internal
*/
export async function saveWebSnap(webFlow, webSnap, silent) {
assert.isDefined(webFlow.webSnapPaths, 'WebFlow has no snapshot paths.');
await mkdir(dirname(webFlow.webSnapPaths.js), {
recursive: true,
});
await writeFile(webFlow.webSnapPaths.ts, createWebSnapFileContents(webSnap));
log.if(!silent).faint(`${webSnap.webFlow.flowKey}: snapshot saved.`);
}
function createWebSnapFileContents(webSnap) {
const snapshotsContent = webSnap.phaseSnaps.map((phaseSnap) => {
const escapedPageHtml = phaseSnap.pageHtml.replaceAll('`', '\\`');
return [
' {',
` phaseName: '${phaseSnap.phaseName}',`,
` pageHtml: html\`\n${escapedPageHtml}\n\`,`,
' },',
].join('\n');
});
const lines = [
'// This file is generated via script. Do not manually edit!',
'',
"import {type WebSnap, html} from 'web-snaps';",
'',
'export default {',
` webFlow: ${stringify(webSnap.webFlow)},`,
` generatedAt: '${webSnap.generatedAt}',`,
` phaseSnaps: [`,
...snapshotsContent,
' ],',
'} satisfies WebSnap;',
'',
];
return lines.join('\n');
}