Skip to content

An easy-to-use codemod toolkit for code migration - powered by Babel and Recast, with format-preserving output.

License

Notifications You must be signed in to change notification settings

shixianqin/fast-codemod

Repository files navigation

fast-codemod

An easy-to-use codemod toolkit for code migration - powered by Babel and Recast, with format-preserving output.

Features

  • Quick to write transformation logic
  • Babel-powered AST API
  • Format-preserving with Recast
  • Composable transformers
  • Built-in AST helpers
  • TypeScript is supported by default

Installation

npm i fast-codemod -D

Usage

// 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

Main runner

import {
  codemod, // Main runner
  transform, // Run a single transform manually
  t, // Alias for @babel/types
  types, // Also @babel/types
} from 'fast-codemod'

Helpers

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'

Re-exports

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'

About

An easy-to-use codemod toolkit for code migration - powered by Babel and Recast, with format-preserving output.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published