An easy-to-use codemod toolkit for code migration - powered by Babel and Recast, with format-preserving output.
- Quick to write transformation logic
- Babel-powered AST API
- Format-preserving with Recast
- Composable transformers
- Built-in AST helpers
- TypeScript is supported by default
npm i fast-codemod -D
// transform.js
import { codemod } from 'fast-codemod'
/** @type {import('fast-codemod').Transformer} */
const renameFoo = () => {
return {
visitor: {
Identifier: (path) => {
if (path.node.name === 'foo') {
path.node.name = 'bar'
}
}
}
}
}
await codemod('src/**/*.ts', {
recastOptions: {
// Optional: recast options
parser: 'babel-ts' // babel-ts, babel, flow
},
globOptions: {
// Optional: glob options
},
transformers: [renameFoo],
dryRun: true,
printDiff: true,
onResult: (fileInfo, result) => {},
})
node ./transform.js
import {
codemod, // Main runner
transform, // Run a single transform manually
t, // Alias for @babel/types
types, // Also @babel/types
} from 'fast-codemod'
import {
// Traverse all references of a given variable — including chained member expressions.
traverseReferences,
traverseImportReferences,
// Make object expression restructuring easy
transformObject,
isStaticObject,
createAccessedKey,
resolvePropertyKey,
// Add import helpers
addImportSideEffect,
addImportDefault,
addImportNamed,
addImportNamespace,
// Create and insert a new variable
addVariable,
// generateUid (Use specified name whenever possible)
generateUid,
generateUidIdentifier,
// Validators
isAssignmentLeft,
isAssignmentRight,
isCallCallee,
isConditionalAlternate,
isConditionalConsequent,
isConditionalTest,
isLogicalLeft,
isLogicalRight,
isMemberObject,
isMemberProperty,
isNewCallee,
isOptionalMemberObject,
isOptionalMemberProperty,
isPropertyKey,
isPropertyValue,
} from 'fast-codemod/helpers'
From @babel/parser
import { parse } from 'fast-codemod/babel/parser'
From @babel/traverse
import traverse, { type NodePath } from 'fast-codemod/babel/traverse'
From @babel/types
import * as t from 'fast-codemod/babel/types'