Files
linuxcncWebWASM/scripts/validate_glb_machines.mjs

19 lines
1.6 KiB
JavaScript

import assert from 'node:assert/strict';
import { readFile, writeFile } from 'node:fs/promises';
import { createHash } from 'node:crypto';
import { pathToFileURL } from 'node:url';
const validator = (await import(process.env.GLTF_VALIDATOR_MODULE ? pathToFileURL(process.env.GLTF_VALIDATOR_MODULE).href : 'gltf-validator')).default;
const root = new URL('../', import.meta.url), output = process.env.GLB_EVIDENCE_DIR ? pathToFileURL(`${process.env.GLB_EVIDENCE_DIR.replace(/\/$/, '')}/`) : new URL('coverage/glb-machine/', root);
const manifest = JSON.parse(await readFile(new URL('web/react/public/machines/manifest.json', root), 'utf8'));
const report = { report_id: 'glb-machine-khronos-validation-v1', validator: validator.version(), status: 'verified', reports: [] };
for (const machine of manifest.machines) {
const bytes = await readFile(new URL(`web/react/public/machines/${machine.filename}`, root));
const sha256 = createHash('sha256').update(bytes).digest('hex'); assert.equal(sha256, machine.sha256);
const result = await validator.validateBytes(new Uint8Array(bytes), { uri: machine.filename });
report.reports.push({ id: machine.id, sha256, ...result });
if (result.issues.numErrors || result.issues.numWarnings) report.status = 'failed';
}
await writeFile(new URL('gltf-validation.report.json', output), JSON.stringify(report, null, 2) + '\n');
assert.equal(report.status, 'verified');
console.log(JSON.stringify({ report_id: report.report_id, status: report.status, reports: report.reports.map(({ id, issues }) => ({ id, errors: issues.numErrors, warnings: issues.numWarnings })) }));