From 28eb51508dca2aa70f9a454d3247ee2e08fcf4ae Mon Sep 17 00:00:00 2001 From: Felix Kling Date: Mon, 18 Jul 2016 11:50:56 +0200 Subject: [PATCH] Support flow types and proposals in transformer (fixes #129) --- bin/__tests__/jscodeshift-test.js | 96 +++++++++++++++++++++---------- package.json | 2 + src/Worker.js | 8 ++- 3 files changed, 76 insertions(+), 30 deletions(-) diff --git a/bin/__tests__/jscodeshift-test.js b/bin/__tests__/jscodeshift-test.js index e3d10df0..156cb229 100644 --- a/bin/__tests__/jscodeshift-test.js +++ b/bin/__tests__/jscodeshift-test.js @@ -89,40 +89,78 @@ describe('jscodeshift CLI', () => { ); }); - it('loads transform files with Babel if not disabled', () => { - var source = createTempFileWith('a'); - var transform = createTransformWith( - 'return (function() { "use strict"; const a = 42; }).toString();' - ); - return Promise.all([ - run(['-t', transform, source]).then( + describe('Babel', () => { + + it('loads transform files with Babel if not disabled', () => { + var source = createTempFileWith('a'); + var transform = createTransformWith( + 'return (function() { "use strict"; const a = 42; }).toString();' + ); + return Promise.all([ + run(['-t', transform, source]).then( + () => { + expect(fs.readFileSync(source).toString()) + .toMatch(/var\s*a\s*=\s*42/); + } + ), + run(['-t', transform, '--no-babel', source]).then( + () => { + expect(fs.readFileSync(source).toString()) + .toMatch(/const\s*a\s*=\s*42/); + } + ), + ]); + }); + + it('supports proposals in transform files', () => { + var source = createTempFileWith('a'); + var transform = createTransformWith( + 'return (function() {' + + ' "use strict"; ' + + ' const spread = {}; ' + + ' ({...spread})' + + '}).toString();' + ); + return Promise.all([ + run(['-t', transform, source]).then( + () => { + expect(fs.readFileSync(source).toString()) + .toMatch(/\(\{\},\s*spread\)/); + } + ), + ]); + }); + + it('supports flow type annotations in transform files', () => { + var source = createTempFileWith('a'); + var transform = createTransformWith( + 'return (function() { "use strict"; const a: number = 42; }).toString();' + ); + return Promise.all([ + run(['-t', transform, source]).then( + () => { + expect(fs.readFileSync(source).toString()) + .toMatch(/var\s*a\s*=\s*42/); + } + ), + ]); + }); + + it('ignores .babelrc files in the directories of the source files', () => { + var transform = createTransformWith( + 'return (function() { "use strict"; const a = 42; }).toString();' + ); + var babelrc = createTempFileWith(`{"ignore": ["${transform}"]}`, '.babelrc'); + var source = createTempFileWith('a', 'source.js'); + + return run(['-t', transform, source]).then( () => { expect(fs.readFileSync(source).toString()) .toMatch(/var\s*a\s*=\s*42/); } - ), - run(['-t', transform, '--no-babel', source]).then( - () => { - expect(fs.readFileSync(source).toString()) - .toMatch(/const\s*a\s*=\s*42/); - } - ), - ]); - }); - - it('ignores .babelrc files in the directories of the source files', () => { - var transform = createTransformWith( - 'return (function() { "use strict"; const a = 42; }).toString();' - ); - var babelrc = createTempFileWith(`{"ignore": ["${transform}"]}`, '.babelrc'); - var source = createTempFileWith('a', 'source.js'); + ); + }); - return run(['-t', transform, source]).then( - () => { - expect(fs.readFileSync(source).toString()) - .toMatch(/var\s*a\s*=\s*42/); - } - ); }); it('passes jscodeshift and stats the transform function', () => { diff --git a/package.json b/package.json index edd3232f..90c8858c 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,9 @@ "dependencies": { "async": "^1.5.0", "babel-core": "^5", + "babel-plugin-transform-flow-strip-types": "^6.8.0", "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", "babel-register": "^6.9.0", "babylon": "^6.8.1", "colors": "^1.1.2", diff --git a/src/Worker.js b/src/Worker.js index 160d125b..b86d23b2 100644 --- a/src/Worker.js +++ b/src/Worker.js @@ -54,7 +54,13 @@ function setup(tr, babel) { if (babel === 'babel') { require('babel-register')({ babelrc: false, - presets: [require('babel-preset-es2015')], + presets: [ + require('babel-preset-es2015'), + require('babel-preset-stage-1'), + ], + plugins: [ + require('babel-plugin-transform-flow-strip-types'), + ] }); } const module = require(tr);