Files
Web_FreeCAD_Bitbybit/scripts/check-occt-history-browser-artifact.mjs

31 lines
2.3 KiB
JavaScript

import { createHash } from 'node:crypto'
import { access, readFile } from 'node:fs/promises'
import { resolve } from 'node:path'
const root = resolve(new URL('..', import.meta.url).pathname)
const artifactNames = ['bitbybit-occt-history.js', 'bitbybit-occt-history.wasm']
const distRoot = resolve(root, 'native/occt-history/dist')
const publicRoot = resolve(root, 'public/native/occt-history')
const exists = async (path) => access(path).then(() => true).catch(() => false)
const hash = (bytes) => createHash('sha256').update(bytes).digest('hex')
const distPresent = await Promise.all(artifactNames.map((name) => exists(resolve(distRoot, name))))
const publicPresent = await Promise.all(artifactNames.map((name) => exists(resolve(publicRoot, name))))
if (!distPresent.some(Boolean) && !publicPresent.some(Boolean)) {
console.log(JSON.stringify({ status: 'artifact-not-built', reason: 'Run ./npmw run build:occt-history when the pinned Emscripten/OCCT inputs are available.' }, null, 2))
process.exit(0)
}
if (distPresent.some((present) => !present) || publicPresent.some((present) => !present)) throw new Error('OCCT history browser artifact is incomplete; JS and WASM must be published together.')
for (const name of artifactNames) {
const distBytes = await readFile(resolve(distRoot, name))
const publicBytes = await readFile(resolve(publicRoot, name))
if (hash(distBytes) !== hash(publicBytes)) throw new Error(`OCCT history ${name} differs between dist and public deployment paths.`)
if (distBytes.length === 0) throw new Error(`OCCT history ${name} is empty.`)
}
const javascript = await readFile(resolve(publicRoot, 'bitbybit-occt-history.js'), 'utf8')
if (!javascript.includes('bitbybit-occt-history.wasm') || !javascript.includes('export default')) throw new Error('OCCT history JS artifact does not expose the expected ESM factory and WASM locator.')
const workerClient = await readFile(resolve(root, 'src/facade/nativeHistoryWorkerClient.ts'), 'utf8')
if (!workerClient.includes("'/native/occt-history/bitbybit-occt-history.js'")) throw new Error('Native history Worker client URL does not match the published artifact.')
const files = []
for (const name of artifactNames) files.push({ name, sha256: hash(await readFile(resolve(publicRoot, name))) })
console.log(JSON.stringify({ status: 'artifact-pass', files }, null, 2))