#!/usr/bin/env node import fs from 'fs/promises'; import path from 'path'; const ROOT = path.resolve(process.cwd()); const SEARCH_DIR = path.join(ROOT, 'backend', 'scripts'); const exts = new Set(['.js', '.mjs', '.cjs', '.json']); const APPLY = process.argv.includes('--apply'); async function* walk(dir) { const entries = await fs.readdir(dir, { withFileTypes: true }); for (const e of entries) { const full = path.join(dir, e.name); if (e.isDirectory()) { yield* walk(full); } else if (exts.has(path.extname(e.name))) { yield full; } } } const re = /\breview\s*:\s*true\b/g; const reCompact = /\breview\s*:\s*true\s*,?/g; let files = []; for await (const f of walk(SEARCH_DIR)) files.push(f); let found = 0; for (const file of files) { const txt = await fs.readFile(file, 'utf8'); if (!re.test(txt)) continue; found++; const newTxt = txt.replace(reCompact, "type: 'review',"); console.log('---', file); const oldMatches = txt.match(/.{0,80}review\s*:\s*true.{0,80}/g) || []; const newMatches = newTxt.match(/.{0,80}type:\s*'review'.{0,80}/g) || []; for (let i = 0; i < Math.max(oldMatches.length, newMatches.length); i++) { console.log(' -', (oldMatches[i] || '').trim()); console.log(' +', (newMatches[i] || '').trim()); } if (APPLY) { await fs.writeFile(file, newTxt, 'utf8'); console.log(' [wrote]'); } else { console.log(' [dry-run]'); } } console.log(`${found} file(s) with \`review: true\` ${APPLY ? 'updated' : 'would be changed (dry-run)'}.`);