Releases: facebook/jscodeshift
v0.3.26
New
- Return value of
Runner.runincludes elapsed time and stats collected viastatsmethod ( #128, @iamdustan). jscodeshift --versionalso prints the used recast version ( #131, @keyanzhang)
Fixes
v0.3.25
v0.3.24
v0.3.23
v0.3.22
v0.3.21
New: Choose your parser
Problem: jscodeshift uses Babel v5 to parse source files. Since Babel v5 doesn't get updated anymore, jscodeshift is unable to parse files that contain more modern flow type annotation.
To solve this, jscodeshift now supports three parsers, babel v5, babylon and flow, and even allows you to pass your own. Babel v5 still stays the default parser, but we will likely use another parser (babylon or flow) as default in the future. Having the option to pass a custom parser allows us to experiment which works best with jscodeshift/recast.
How to choose a parser
CLI
--parser allows you specify one of the built-in parsers from the command line: --parser=babelv5, --parser=babylon, --parser=flow.
API
jscodeshift now accepts a second argument that is directly passed to recast's parse method. This allows you to load your own parser, as long as it is compatible with recast:
jscodeshift(source, {parser: require('myParser')})Transformer
The value of the parser export of the transformer is used as parser. The value can either be the name of one of the built-in parsers (babel, babylon, flow) or an object that can be directly passed to recast.parse.
Examples:
export const parser = 'flow';
// or
export {default as parser} from 'myParser';This allows transformers to specify their own parser (as long as it is compatible with ESTree / recast), making them a bit more independent from jscodeshift's internals.
jscodeshift --version now also lists the versions of the built-in parsers
$ jscodeshift --version
jscodeshift: 0.3.21
- babel: 5.8.38
- babylon: 6.8.1
- flow: 0.26.0
Reinstalling jscodeshift is probably the simplest way for now to update the built-in parsers.
v0.3.20
New
-
--ignore-patternand--ignore-filecommand line arguments, which allow you to specify paths to ignore when using jscodeshift to traverse over a dictionary ( #107 , @chrisdarroch ) -
jscodeshift.usewhich you can pass a plugin too. A plugin would a function that accepts a jscodeshift instance and callsregisterMethodson it. This allows plugins to be decoupled form jscodeshift. In addition, if.useis called with the same plugin multiple times, subsequent calls are ignored.Example:
function myPlugin(jscodeshift) { jscodeshift.registerMethods({ myExtension() { ... }, }, jscodeshift.Identifier); } jscodeshift.use(myPlugin);
( #108 , @jamestalmage )
-
Better
registerMethodsmethod! Until now, it was impossible to register two methods with the same name, even if it was attached to different types (and therefore, conceptually, different collections). @jamestalmage changed this in #110 and and now it's possible to register such methods if the types are not super- or sub-types.Example:
jscodeshift.registerMethods({ rename() { ... }, }, j.Identifier); jscodeshift.registerMethods({ rename() { ... }, }, j.VariableDeclarator);
-
Unit tests for transforms: @Daniel15 added helper methods to make writing unit tests easier ( #104 ) . See the readme and the example for more information.
This results in a directory structure like this:
/MyTransform.js /__tests__/MyTransform-test.js /__testfixtures__/MyTransform.input.js /__testfixtures__/MyTransform.output.jsTo define a test, use defineTest from the testUtils module:
jest.autoMockOff(); const defineTest = require('jscodeshift/dist/testUtils').defineTest; defineTest(__dirname, 'MyTransform');