server/laf-cloud/functions/cloudRise/tools/generate-cloud-rise-stats.mjs
2026-09-24 17:59:52 +08:00

20 lines
1.3 KiB
JavaScript

import { readFile, writeFile } from 'node:fs/promises';
const source = JSON.parse(await readFile(new URL('../data/cloudRiseLevelStats.json', import.meta.url), 'utf8'));
if (source.max_start_level !== 1960 || source.levels.length !== 2000) throw new Error('Unexpected source coverage');
for (const [index, row] of source.levels.entries()) {
if (row.level !== index + 1 || !Number.isSafeInteger(row.enter_total) || row.enter_total < 0
|| (row.pass_rate !== null && !(row.pass_rate >= 0 && row.pass_rate <= 1))) throw new Error('Invalid row ' + row.level);
}
const text = '// Generated by tools/generate-cloud-rise-stats.mjs; edit data/cloudRiseLevelStats.json instead.\n'
+ '// Source SHA256: ' + source.source_sha256 + '\n'
+ 'export const LEVEL_STATS = ' + JSON.stringify(source.levels) + ';\n';
const target = new URL('../stats.ts', import.meta.url);
if (process.argv.includes('--check')) {
// Formatting is editable; validate the data and the internal-only export contract.
const generated = await import(target.href);
if (Object.keys(generated).length !== 1 || !('LEVEL_STATS' in generated)
|| JSON.stringify(generated.LEVEL_STATS) !== JSON.stringify(source.levels)) {
throw new Error('Generated stats are stale or expose unexpected exports');
}
} else await writeFile(target, text);