overleaf/services/web/transform/cjs-to-esm/cjs-to-esm.mjs

75 lines
2 KiB
JavaScript
Raw Normal View History

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'
const __dirname = fileURLToPath(new URL('.', import.meta.url))
// use minimist to get a list of files from the argv
const argv = minimist(process.argv.slice(2), {
boolean: ['usage'],
})
function printUsage() {
console.log(
'node scripts/esm-migration/cjs-to-esm.mjs [files] [--format] [--lint] [--usage]'
)
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('--format: run prettier to fix formatting')
console.log(' --lint: run eslint to fix linting')
console.log(' --usage: show this help message')
process.exit(0)
}
const files = argv._
if (argv.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 cjsTransform = fileURLToPath(
import.meta.resolve('5to6-codemod/transforms/cjs.js')
)
const exportsTransform = fileURLToPath(
import.meta.resolve('5to6-codemod/transforms/exports.js')
)
const overleafTransform = fileURLToPath(
import.meta.resolve('./overleaf-es-codemod.js')
)
const config = {
output: __dirname,
silent: true,
print: false,
verbose: 0,
hoist: true,
}
await Runner.run(cjsTransform, files, config)
await Runner.run(exportsTransform, files, config)
await Runner.run(overleafTransform, files, config)
const webRoot = fileURLToPath(new URL('../../', import.meta.url))
for (const file of files) {
// move files with git mv
await promisifiedExec(`git mv ${file} ${file.replace('.js', '.mjs')}`)
const relativePath = path.relative(webRoot, file)
console.log(
`transformed ${relativePath} and renamed it to have a .mjs extension`
)
}