harmonyc
Version:
Harmony Code - model-driven BDD for Vitest
49 lines (48 loc) • 2.14 kB
JavaScript
import glob from 'fast-glob';
import { existsSync, readFileSync, writeFileSync } from 'fs';
import { resolve } from 'path';
import { compileFeature } from "./compile.js";
import { testFileName } from "../filenames/filenames.js";
import { VitestGenerator } from "../code_generator/VitestGenerator.js";
export async function compileFiles(pattern) {
var _a;
const fns = await glob(pattern);
if (!fns.length)
throw new Error(`No files found for pattern: ${String(pattern)}`);
const results = await Promise.allSettled(fns.map((fn) => compileFile(fn)));
const compiled = results.flatMap((r) => r.status === 'fulfilled' ? [r.value] : []);
const errored = results.flatMap((r) => r.status === 'rejected' && r.reason ? [r.reason] : []);
for (const error of errored) {
console.error((_a = error.message) !== null && _a !== void 0 ? _a : error);
}
console.log(`Compiled ${compiled.length} file${compiled.length === 1 ? '' : 's'}.`);
const features = compiled.filter((f) => f !== undefined);
const generated = features.filter((f) => f.phrasesFileAction === 'generated');
if (generated.length) {
console.log(`Generated ${generated.length} phrases file${generated.length === 1 ? '' : 's'}.`);
}
return { fns, outFns: features.map((f) => f.outFile.name) };
}
export async function compileFile(fn) {
var _a;
fn = resolve(fn);
const src = readFileSync(fn, 'utf8')
.toString()
.replace(/\r\n/g, '\n')
.replace(/\r/g, '\n');
try {
const { outFile, phrasesFile } = compileFeature(fn, src);
writeFileSync(outFile.name, outFile.value);
let phrasesFileAction = 'ignored';
if (!existsSync(phrasesFile.name)) {
phrasesFileAction = 'generated';
writeFileSync(phrasesFile.name, phrasesFile.value);
}
return { phrasesFileAction, outFile, phrasesFile };
}
catch (e) {
const outFileName = testFileName(fn);
writeFileSync(outFileName, VitestGenerator.error((_a = e.message) !== null && _a !== void 0 ? _a : `${e}`, e.stack));
return undefined;
}
}