Spaces:
Running
Running
| import { isMainModule, pickFailureOutput, printJson, runCommand } from './command-center-utils.mjs'; | |
| const FULL_VERIFY_PLAN = [ | |
| { name: 'version:check', command: 'npm', args: ['run', 'version:check'] }, | |
| { name: 'test', command: 'npm', args: ['test'] }, | |
| { name: 'lint', command: 'npm', args: ['run', 'lint'] }, | |
| { name: 'lint:scripts', command: 'npm', args: ['run', 'lint:scripts'] }, | |
| { name: 'build', command: 'npm', args: ['run', 'build'] }, | |
| { name: 'diff-check', command: 'git', args: ['diff', '--check'] }, | |
| { name: 'diff-cached-check', command: 'git', args: ['diff', '--cached', '--check'] } | |
| ]; | |
| const QUICK_VERIFY_PLAN = [ | |
| { name: 'version:check', command: 'npm', args: ['run', 'version:check'] }, | |
| { name: 'test:scripts', command: 'npm', args: ['run', 'test:scripts'] }, | |
| { name: 'lint:scripts', command: 'npm', args: ['run', 'lint:scripts'] }, | |
| { name: 'diff-check', command: 'git', args: ['diff', '--check'] }, | |
| { name: 'diff-cached-check', command: 'git', args: ['diff', '--cached', '--check'] } | |
| ]; | |
| const POSTGRES_VERIFY_STEP = { name: 'test:postgres', command: 'npm', args: ['run', 'test:postgres'] }; | |
| export function buildVerifyPlan(options = {}) { | |
| const source = options.quick ? QUICK_VERIFY_PLAN : FULL_VERIFY_PLAN; | |
| const plan = source.filter((step) => !(options.skipBuild && step.name === 'build')); | |
| if (!options.postgres) return plan; | |
| const firstDiffCheckIndex = plan.findIndex((step) => step.name.startsWith('diff-')); | |
| if (firstDiffCheckIndex === -1) return [...plan, POSTGRES_VERIFY_STEP]; | |
| return [...plan.slice(0, firstDiffCheckIndex), POSTGRES_VERIFY_STEP, ...plan.slice(firstDiffCheckIndex)]; | |
| } | |
| function parseArgs(argv) { | |
| const unknown = argv.find((arg) => !['--help', '-h', '--quick', '--skip-build', '--postgres'].includes(arg)); | |
| if (unknown) throw new Error(`Unknown option: ${unknown}`); | |
| return { | |
| help: argv.includes('--help') || argv.includes('-h'), | |
| postgres: argv.includes('--postgres'), | |
| quick: argv.includes('--quick'), | |
| skipBuild: argv.includes('--skip-build') | |
| }; | |
| } | |
| function printHelp() { | |
| console.log(`Usage: | |
| npm run verify | |
| npm run verify -- --quick | |
| Options: | |
| --quick Run script tests, script syntax checks, and git diff whitespace checks. | |
| --postgres Include the live PostgreSQL gate with npm run test:postgres. | |
| --skip-build Run the full plan without npm run build. | |
| --help Show this help.`); | |
| } | |
| function runVerify(options) { | |
| const checks = []; | |
| for (const step of buildVerifyPlan(options)) { | |
| const result = runCommand(step.command, step.args); | |
| checks.push({ | |
| name: step.name, | |
| command: [step.command, ...step.args].join(' '), | |
| status: result.ok ? 'pass' : 'fail', | |
| elapsed_ms: result.elapsed_ms, | |
| ...(result.ok ? {} : { output: pickFailureOutput(result) }) | |
| }); | |
| if (!result.ok) break; | |
| } | |
| const ok = checks.every((check) => check.status === 'pass'); | |
| printJson({ ok, profile: options.quick ? 'quick' : 'full', postgres: Boolean(options.postgres), checks }); | |
| if (!ok) process.exit(1); | |
| } | |
| try { | |
| if (isMainModule(import.meta.url, process.argv[1])) { | |
| const options = parseArgs(process.argv.slice(2)); | |
| if (options.help) { | |
| printHelp(); | |
| } else { | |
| runVerify(options); | |
| } | |
| } | |
| } catch (error) { | |
| printJson({ ok: false, error: error instanceof Error ? error.message : String(error) }); | |
| process.exit(1); | |
| } | |