2026-09-08 18:57:51 +02:00
#!/usr/bin/env node
// choo-migrate [--dry] <files or directories…>
// Rewrites choo v7 sources toward v8: CJS → ESM for simple top-level
// patterns, package specifiers remapped, and a per-file report of what
// needs human hands. --dry prints the report without writing.
import { readFile , writeFile , readdir , stat } from 'node:fs/promises'
import { join , extname } from 'node:path'
import transform from './lib/transform.js'
const args = process . argv . slice ( 2 )
const dry = args . includes ( '--dry' )
const targets = args . filter (( a ) => a !== '--dry' )
if ( targets . length === 0 ) {
console . log ( 'usage: choo-migrate [--dry] <files or directories…>' )
process . exit ( 1 )
}
const SKIP = new Set ([ 'node_modules' , '.git' , 'dist' , 'coverage' ])
async function * walk ( path ) {
const info = await stat ( path )
if ( info . isFile ()) {
if ( extname ( path ) === '.js' || extname ( path ) === '.mjs' ) yield path
return
}
for ( const entry of await readdir ( path )) {
if ( SKIP . has ( entry )) continue
yield * walk ( join ( path , entry ))
}
}
let changedCount = 0
for ( const target of targets ) {
for await ( const file of walk ( target )) {
const source = await readFile ( file , 'utf8' )
const { code , changed , notes } = transform ( source )
if ( ! changed && notes . length === 0 ) continue
console . log ( `\n ${ file }${ changed ? ( dry ? ' (would change)' : ' (rewritten)' ) : '' } ` )
for ( const note of notes ) console . log ( ` ⚠ ${ note } ` )
if ( changed && ! dry ) {
await writeFile ( file , code )
changedCount ++
}
}
}
2026-09-08 19:55:20 +02:00
console . log ( `\n ${ dry ? 'dry run — no files written' : changedCount + ' file(s) rewritten' } . Remember: package.json needs "type": "module" and deps on @uhhm/*.` )