Skip to content
master
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
api
 
 
cli
 
 
ui
 
 
 
 
 
 
 
 
 
 

README.md

gen-codemod

Generate codemod by comparing two JavaScript files.

Demo: Codemod Explorer

Usage

gen-codemod INITIAL.js DESIRED.js > my-transform.js

INITIAL.js is the initial, pre-codemod JavaScript you'd like to change.

DESIRED.js is the desired, post-codemod JavaScript you'd like to have.

gen-codemod compares these two files and creates a codemod to get from INITIAL.js to DESIRED.js.

Example

When upgrading from sinon.js v1 -> v2, every instance of sinon.stub(obj, method, fn) needs to be changed to sinon.stub(obj, method).andCallsFake(fn). We can generate this codemod as follows:

echo "sinon.stub(A, B, C)" > sinon-v1.js
echo "sinon.stub(A, B).andCallFake(C)" > sinon-v2.js
gen-codemod sinon-v1.js sinon-v2.js

Note: Single uppercase letters, such as A, B, C, etc, are used as variables and match any AST node.

This outputs:

module.exports = function(file, api) {
  const j = api.jscodeshift;

  const rootProperties = {
    type: 'CallExpression',
    callee: {
      type: 'MemberExpression',
      object: { type: 'Identifier', name: 'sinon' },
      property: { type: 'Identifier', name: 'stub' },
      computed: false
    },
    arguments: [{}, {}, {}]
  };

  function getTransform(path) {
    return j.callExpression(
      j.memberExpression(
        j.callExpression(
          j.memberExpression(
            j.identifier('sinon'),
            j.identifier('stub'),
            false
          ),
          [getANode(path), getBNode(path)]
        ),
        j.identifier('andCallsFake'),
        false
      ),
      [getCNode(path)]
    );
  }

  function getANode(path) {
    return path.node.arguments[0];
  }
  function getBNode(path) {
    return path.node.arguments[1];
  }
  function getCNode(path) {
    return path.node.arguments[2];
  }

  return j(file.source)
    .find(j.CallExpression, rootProperties)
    .replaceWith(getTransform)
    .toSource();
};

To run your codemod, use jscodeshift:

gen-codemod sinon-v1.js sinon-v2.js > my-transform.js
npx jscodeshift -t my-transform.js PROJECT_PATH

Install

npm i -g gen-codemod

Limitations

Can't change multiple AST expressions at once (only reads the first AST node from the initial / desired JavaScript files).

About

Generate codemods by specifying your starting -> desired JavaScript.

Resources

Releases

No releases published

Packages

No packages published