Files
2026-08-14 15:56:39 -04:00

48 lines
1.6 KiB
JavaScript

const fs = require("node:fs");
const path = require("node:path");
const validator = require("gltf-validator");
function findGlbs(directory, root = directory) {
return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
const entryPath = path.join(directory, entry.name);
if (entry.isDirectory()) return findGlbs(entryPath, root);
if (!entry.isFile() || path.extname(entry.name).toLowerCase() !== ".glb") return [];
return [{
file: path.relative(root, entryPath).replaceAll("\\", "/"),
path: entryPath,
}];
});
}
async function main() {
const directory = process.argv[2];
if (!directory) throw new Error("Usage: node validate-package-glbs.cjs <directory>");
const files = findGlbs(directory).sort((left, right) => left.file.localeCompare(right.file));
if (!files.length) throw new Error(`No GLB files found below ${path.resolve(directory)}.`);
const rows = [];
for (const file of files) {
const report = await validator.validateBytes(
new Uint8Array(fs.readFileSync(file.path)),
{ uri: file.file, maxIssues: 1_000 },
);
rows.push({
file: file.file,
errors: report.issues.numErrors,
warnings: report.issues.numWarnings,
});
}
const result = {
files: rows.length,
errors: rows.reduce((sum, row) => sum + row.errors, 0),
warnings: rows.reduce((sum, row) => sum + row.warnings, 0),
nonGreen: rows.filter((row) => row.errors || row.warnings),
};
console.log(JSON.stringify(result, null, 2));
if (result.errors || result.warnings) process.exitCode = 1;
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});