48 lines
1.6 KiB
JavaScript
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;
|
|
});
|