import { readFile, writeFile } from 'node:fs/promises'; import { createHash } from 'node:crypto'; import { bsiIsoCrosswalk, bsiKernelCatalog } from '../../src/compliance/bsi-grundschutz.ts'; // Regenerates the pinned BSI snapshots from official files downloaded from these exact commit URLs. const commit = process.argv[4]; const [catalogPath, crosswalkPath] = process.argv.slice(2); if (!catalogPath || !crosswalkPath || !/^[0-9a-f]{40}$/.test(commit ?? '')) { throw new Error('Usage: node --experimental-strip-types server/compliance/update-bsi-assets.mjs '); } const base = `https://raw.githubusercontent.com/BSI-Bund/Stand-der-Technik-Bibliothek/${commit}/control_layer`; const sha256 = bytes => createHash('sha256').update(bytes).digest('hex'); const catalogBytes = await readFile(catalogPath); const catalog = bsiKernelCatalog(JSON.parse(catalogBytes.toString('utf8')), `${base}/Grundschutz++/Grundschutz++-resolved_catalog.json`, sha256(catalogBytes)); const catalogOutput = `server/compliance/data/bsi-grundschutz-kernel-${catalog.version.slice(0, 10)}.json`; await writeFile(catalogOutput, JSON.stringify(catalog) + '\n'); console.log(`${catalogOutput}: ${catalog.requirements.length} requirements`); const crosswalkBytes = await readFile(crosswalkPath); const crosswalk = bsiIsoCrosswalk(JSON.parse(crosswalkBytes.toString('utf8')), `${base}/Mappings/ISO-27001-zu-GSpp/ISO27001-AnnexA-to-GS++-mapping_collection.json`, sha256(crosswalkBytes)); const crosswalkOutput = `server/compliance/data/bsi-iso27001-crosswalk-${crosswalk.version}.json`; await writeFile(crosswalkOutput, JSON.stringify(crosswalk) + '\n'); console.log(`${crosswalkOutput}: ${crosswalk.entries.length} entries`);