import { mkdir, readFile, writeFile } from 'node:fs/promises'; import { createHash } from 'node:crypto'; import { pathToFileURL } from 'node:url'; import path from 'node:path'; import { root, run, suite, output, troveBin } from './suite.mjs'; run(process.execPath, ['tools/build.mjs']); await mkdir(path.join(output, 'packages'), { recursive: true }); const entries = []; for (const item of suite) { const directory = path.join(root, 'curios', item.directory); const manifest = JSON.parse(await readFile(path.join(directory, 'curio.json'), 'utf8')); run(troveBin, ['curio', 'check', directory, '--json']); const file = path.join(output, 'packages', `${manifest.id}-${manifest.version}.curio`); run(troveBin, ['curio', 'pack', directory, '--out', file, '--overwrite', '--no-input', '--json']); const bytes = await readFile(file); entries.push({ ...item, manifest, file, artifact: { target: manifest.backend ? `${process.arch === 'arm64' ? 'aarch64' : 'x86_64'}-apple-darwin` : 'any', url: pathToFileURL(file).href, sha256: createHash('sha256').update(bytes).digest('hex'), size: bytes.length, } }); } const date = new Date().toISOString(); function index(id, name, selected) { const curios = []; for (const { manifest: m, artifact } of selected) { let curio = curios.find(curio => curio.id === m.id); if (!curio) { curio = { id: m.id, name: m.name, description: m.description, versions: [] }; curios.push(curio); } curio.versions.unshift({ version: m.version, engine: m.engine, releasedAt: date, artifacts: [artifact] }); } return { schemaVersion: 1, id, name, generatedAt: date, curios }; } await writeFile(path.join(output, 'index.json'), JSON.stringify(index('trove-qa', 'Trove 常规测试插件', entries.filter(item => !item.fault)), null, 2) + '\n'); await writeFile(path.join(output, 'faults-index.json'), JSON.stringify(index('trove-qa-faults', 'Trove 故障注入插件(手动安装)', entries.filter(item => item.fault)), null, 2) + '\n'); await writeFile(path.join(output, 'suite.json'), JSON.stringify(entries, null, 2) + '\n'); run('python3', ['tools/invalid-fixtures.py']); console.log(`\n常规软件源:${path.join(output, 'index.json')}\n故障软件源:${path.join(output, 'faults-index.json')}`);