beam-cli
Version:
A beautifully simple CLI for running Lighthouse audits on a statically generated (SSG) website
57 lines (56 loc) • 2.31 kB
JavaScript
import fs from 'node:fs/promises';
import process from 'node:process';
import ora from 'ora';
import { ensureDirectoryExistence } from '../fs/directory.js';
import { buildProgressBar } from '../ui/non-interactive/progress-bar.js';
export const saveReportsToDisk = async (runnerResults, options, outputs) => {
const generatedHtmlPaths = {};
const spinner = ora({
color: 'cyan',
});
const numberResults = Object.values(runnerResults).length;
const filesBar = buildProgressBar(numberResults * outputs.length);
spinner.start(`Saving Reports to Disk\n ${filesBar(0)}`);
try {
const directory = `./${options.output.folder}`;
if (!ensureDirectoryExistence(directory)) {
await fs.mkdir(directory);
}
const cwd = process.cwd();
let count = 0;
for (const name in runnerResults) {
if (!Object.prototype.hasOwnProperty.call(runnerResults, name))
continue;
const runResult = runnerResults[name];
if (!runResult)
continue;
const { result, type } = runResult;
let reports = result.report;
if (!reports)
continue;
if (typeof reports === 'string') {
reports = [reports];
}
for (const [index, extension] of outputs.entries()) {
spinner.text = `Saving Reports to Disk\n ${filesBar(count)}`;
const fileName = `${name.endsWith('-html') ? name.slice(0, -5) : name}-${type}-report`;
const filePath = `${directory}/${fileName}.${extension}`;
const content = reports[index] ?? '';
/* eslint-disable no-await-in-loop */
if (content)
await fs.writeFile(filePath, content);
/* eslint-enable no-await-in-loop */
if (extension === 'html') {
generatedHtmlPaths[name] = `${cwd}/${filePath.startsWith('./') ? filePath.slice(2) : filePath}`;
}
count += 1;
}
}
spinner.succeed('Saved Reports to Disk.');
}
catch (error) {
spinner.fail('Saving Reports to Disk Failed.');
throw error;
}
return generatedHtmlPaths;
};