Files
Verso/services/web/transform/vitest/mocha-to-vitest.mjs
T
Andrew RumbleandCopybot eda1bd697f Merge pull request #27958 from overleaf/ar-change-esm-codemod-to-use-vitest-and-general-refactor
[web] change esm codemod to use vitest and general refactor

GitOrigin-RevId: 7f8c699b160ee0b7ff991d6284cb126165694c4f
2025-09-17 08:04:57 +00:00

92 lines
2.5 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/vitest/mocha-to-vitest.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 = [
'./codemods/replaceDoneWithPromise.js',
'./codemods/convertThisToCtx.js',
'./codemods/replaceSandboxedModuleWithDoMock.js',
'./codemods/replaceDirectChaiUsage.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('Tests.mjs', '.test.mjs')
.replace('Tests.js', '.test.js')
.replace('Test.js', '.test.js')
.replace('Test.mjs', '.test.mjs')
await promisifiedExec(`git mv ${file} ${newFileName}`)
const relativePath = path.relative(webRoot, file)
console.log(`transformed ${relativePath} and renamed it for vitest`)
}
}