67 lines
1.8 KiB
JavaScript
67 lines
1.8 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Fail if bare-module-manifest.json and bare-module-manifest.data.mjs disagree.
|
|
* Run from repo root: node scripts/verify-bare-module-manifest-data.mjs
|
|
*/
|
|
import { readFile } from 'node:fs/promises'
|
|
import { dirname, join } from 'node:path'
|
|
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
const root = join(__dirname, '..')
|
|
const jsonPath = join(
|
|
root,
|
|
'packages/bare-os-booter/lib/ctx/bare-module-manifest.json'
|
|
)
|
|
const dataPath = join(
|
|
root,
|
|
'packages/bare-os-booter/lib/ctx/bare-module-manifest.data.mjs'
|
|
)
|
|
|
|
function stableStringify(obj) {
|
|
if (obj === null || typeof obj !== 'object') {
|
|
return JSON.stringify(obj)
|
|
}
|
|
if (Array.isArray(obj)) {
|
|
return '[' + obj.map((x) => stableStringify(x)).join(',') + ']'
|
|
}
|
|
const keys = Object.keys(obj).sort()
|
|
return (
|
|
'{' +
|
|
keys
|
|
.map((k) => JSON.stringify(k) + ':' + stableStringify(obj[k]))
|
|
.join(',') +
|
|
'}'
|
|
)
|
|
}
|
|
|
|
async function main() {
|
|
const jsonRaw = await readFile(jsonPath, 'utf8')
|
|
const fromJson = JSON.parse(jsonRaw)
|
|
const mod = await import(pathToFileURL(dataPath).href)
|
|
const fromData = mod.default
|
|
if (!fromData || typeof fromData !== 'object') {
|
|
console.error(
|
|
'[verify-bare-module-manifest-data] missing default export in',
|
|
dataPath
|
|
)
|
|
process.exit(1)
|
|
}
|
|
const a = stableStringify(fromJson)
|
|
const b = stableStringify(fromData)
|
|
if (a !== b) {
|
|
console.error(
|
|
'[verify-bare-module-manifest-data] JSON and .data.mjs differ.\n' +
|
|
'Run: node scripts/generate-bare-module-manifest-data.mjs\n' +
|
|
'or: npm run sync:bare-manifest'
|
|
)
|
|
process.exit(1)
|
|
}
|
|
console.log('[verify-bare-module-manifest-data] ok')
|
|
}
|
|
|
|
main().catch((e) => {
|
|
console.error(e)
|
|
process.exit(1)
|
|
})
|