// Does not load dotenv, database pools, application bootstrap or background jobs. import { readFile } from 'node:fs/promises'; import { resolve, relative, sep } from 'node:path'; import { publishReconstruction, validateReconstruction } from '../src/server/routes/asset-history/reconstruction.js'; const args = process.argv.slice(2); const inputIndex = args.indexOf('--input'), outputIndex = args.indexOf('--output'); if (inputIndex < 0 || !args[inputIndex + 1]) throw new Error('需要 --input 指定已确认的回溯文件'); const data = validateReconstruction(JSON.parse(await readFile(resolve(args[inputIndex + 1]), 'utf8'))); console.log(JSON.stringify({ action: args.includes('--apply') ? 'local-file-publication' : 'dry-run', months: data.periods.length, firstMonth: data.periods[0]?.month, lastMonth: data.periods.at(-1)?.month, sourceAsOf: data.sourceAsOf, workbookSha256: data.workbookSha256, historicalTotal: null, databaseWrites: 0 })); if (args.includes('--apply')) { if (outputIndex < 0 || !args[outputIndex + 1]) throw new Error('需要 --output 指定本地私有存储位置'); const output = resolve(args[outputIndex + 1]); for (const folder of ['public', 'dist', 'src']) { const within = relative(resolve(folder), output); if (!within || (!within.startsWith(`..${sep}`) && within !== '..' && !within.startsWith(sep))) throw new Error('回溯文件必须保存于源码及公开静态目录之外'); } console.log(await publishReconstruction(output, data)); }