Files
2026-07-13 13:23:39 +08:00

59 lines
2.2 KiB
JavaScript

import { readFile, readdir, access } from 'node:fs/promises';
import { URL } from 'node:url';
const colors = {
red: (text) => `\x1B[31m${text}\x1B[39m`,
green: (text) => `\x1B[32m${text}\x1B[39m`,
grey: (text) => `\x1B[90m${text}\x1B[39m`,
yellow: (text) => `\x1B[33m${text}\x1B[39m`,
};
const templatesDirectory = new URL('../templates/', import.meta.url);
const templateNames = await readdir(templatesDirectory);
/** @type {{ templates: Array<{ name: string; description: string; files: string[] }>; }} */
const manifest = JSON.parse(await readFile(new URL('../manifest.json', import.meta.url), 'utf8'));
console.log(`Validating ${colors.green(manifest.templates.length)} templates`);
let hasError = false;
for (const manifestTemplate of manifest.templates) {
// Check if the folder it points to actually exists
if (!templateNames.includes(manifestTemplate.name)) {
console.error(colors.red(`Failed to find folder for template called ${colors.yellow(manifestTemplate.name)}`));
hasError = true;
// Skipping the rest of the validation as the template is missing
continue;
}
console.log(colors.grey(`Validating template ${colors.yellow(manifestTemplate.name)}`));
// Check that all files it requires exist
for (const requiredFile of manifestTemplate.files) {
try {
await access(new URL(`./${manifestTemplate.name}/${requiredFile}`, templatesDirectory));
} catch (err) {
if (err.code === 'ENOENT') {
hasError = true;
console.error(
`${colors.grey(`[${colors.yellow(manifestTemplate.name)}]:`)} Failed to find file ${colors.yellow(
requiredFile,
)}`,
);
console.error(err);
} else {
console.warn(
`${colors.grey(`[${colors.yellow(manifestTemplate.name)}]:`)} Failed to read file ${colors.yellow(
requiredFile,
)}`,
err,
);
}
}
}
console.log(colors.green(`Finished validating ${colors.yellow(manifestTemplate.name)}`));
}
process.exitCode = hasError ? 1 : 0;