[web] change esm codemod to use vitest and general refactor GitOrigin-RevId: 7f8c699b160ee0b7ff991d6284cb126165694c4f
90 lines
2.4 KiB
JavaScript
90 lines
2.4 KiB
JavaScript
import minimist from 'minimist'
|
|
import { exec } from 'node:child_process'
|
|
import { promisify } from 'node:util'
|
|
import Runner from 'jscodeshift/src/Runner.js'
|
|
import { fileURLToPath } from 'node:url'
|
|
import path from 'node:path'
|
|
|
|
// use minimist to get a list of files from the argv
|
|
const {
|
|
dryRun,
|
|
verbose,
|
|
usage,
|
|
_: files,
|
|
} = minimist(process.argv.slice(2), {
|
|
boolean: ['dryRun', 'usage', 'verbose'],
|
|
})
|
|
|
|
function printUsage() {
|
|
console.log(
|
|
'node scripts/esm-migration/cjs-to-esm.mjs [files] [--dryRun] [--format] [--lint] [--usage] [--verbose]'
|
|
)
|
|
console.log(
|
|
'WARNING: this will only work in local development as important dependencies will be missing in production'
|
|
)
|
|
console.log('Options:')
|
|
console.log(' files: a list of files to convert')
|
|
console.log('--dryRun: do not actually run the commands, just print them')
|
|
console.log('--format: run prettier to fix formatting')
|
|
console.log(' --lint: run eslint to fix linting')
|
|
console.log(' --usage: show this help message')
|
|
console.log('--verbose: enable verbose output')
|
|
process.exit(0)
|
|
}
|
|
|
|
if (usage) {
|
|
printUsage()
|
|
}
|
|
|
|
if (!Array.isArray(files) || files.length === 0) {
|
|
console.error('You must provide a list of files to convert')
|
|
printUsage()
|
|
process.exit(1)
|
|
}
|
|
|
|
const promisifiedExec = promisify(exec)
|
|
|
|
const transforms = [
|
|
'5to6-codemod/transforms/cjs.js',
|
|
'5to6-codemod/transforms/exports.js',
|
|
'./codemods/esmoduleDirname.js',
|
|
'./codemods/addExtensions.js',
|
|
'./codemods/fixMongodbImport.js',
|
|
]
|
|
|
|
const config = {
|
|
output: import.meta.dirname,
|
|
silent: verbose,
|
|
print: false,
|
|
verbose: verbose ? 1 : 0,
|
|
hoist: true,
|
|
dry: dryRun,
|
|
runInBand: true,
|
|
}
|
|
|
|
if (dryRun) {
|
|
console.log('Dry run mode enabled. No changes will be made.')
|
|
}
|
|
|
|
for (const transformPath of transforms) {
|
|
if (verbose) {
|
|
console.log(`Running transform: ${transformPath}`)
|
|
}
|
|
const transform = fileURLToPath(await import.meta.resolve(transformPath))
|
|
await Runner.run(transform, files, config)
|
|
}
|
|
|
|
const webRoot = fileURLToPath(new URL('../../', import.meta.url))
|
|
|
|
if (!dryRun) {
|
|
for (const file of files) {
|
|
// move files with git mv
|
|
const newFileName = file.replace('.js', '.mjs')
|
|
await promisifiedExec(`git mv ${file} ${newFileName}`)
|
|
const relativePath = path.relative(webRoot, file)
|
|
console.log(
|
|
`transformed ${relativePath} and renamed it to have a .mjs extension`
|
|
)
|
|
}
|
|
}
|