From b8341814c1ede51bf5affde997f0c87bf842fee3 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Thu, 23 Aug 2018 14:28:00 -0700 Subject: [PATCH] Detect and apply stripping flow types (#1864) --- packages/core/parcel/package.json | 1 + packages/core/parcel/src/Bundler.js | 4 +-- packages/core/parcel/src/transforms/babel.js | 31 ++++++++++++++++++- .../babel-strip-flow-types/index.js | 5 +++ .../node_modules/flow-typed/index.js | 4 +++ packages/core/parcel/test/javascript.js | 13 ++++++++ yarn.lock | 11 +++++++ 7 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 packages/core/parcel/test/integration/babel-strip-flow-types/index.js create mode 100644 packages/core/parcel/test/integration/babel-strip-flow-types/node_modules/flow-typed/index.js diff --git a/packages/core/parcel/package.json b/packages/core/parcel/package.json index df360a1a96e..bcb0a9a0f33 100644 --- a/packages/core/parcel/package.json +++ b/packages/core/parcel/package.json @@ -20,6 +20,7 @@ "babel-core": "^6.25.0", "babel-generator": "^6.25.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "babel-plugin-transform-flow-strip-types": "^6.22.0", "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-plugin-transform-react-jsx": "^6.24.1", "babel-preset-env": "^1.7.0", diff --git a/packages/core/parcel/src/Bundler.js b/packages/core/parcel/src/Bundler.js index 0fd1609c0cb..0b89bc1d459 100644 --- a/packages/core/parcel/src/Bundler.js +++ b/packages/core/parcel/src/Bundler.js @@ -251,9 +251,7 @@ class Bundler extends EventEmitter { this.entryAssets.add(asset); } catch (err) { throw new Error( - `Cannot resolve entry "${entry}" from "${ - this.options.rootDir - }"` + `Cannot resolve entry "${entry}" from "${this.options.rootDir}"` ); } } diff --git a/packages/core/parcel/src/transforms/babel.js b/packages/core/parcel/src/transforms/babel.js index 4b14dfe6f27..42d8ac6880c 100644 --- a/packages/core/parcel/src/transforms/babel.js +++ b/packages/core/parcel/src/transforms/babel.js @@ -103,6 +103,7 @@ async function getBabelConfig(asset) { let envConfig = await getEnvConfig(asset, isSource); let jsxConfig = await getJSXConfig(asset, isSource); + let flowConfig = getFlowConfig(asset, isSource); // Merge the babel-preset-env config and the babelrc if needed if (babelrc && !shouldIgnoreBabelrc(asset.name, babelrc)) { @@ -134,12 +135,21 @@ async function getBabelConfig(asset) { mergeConfigs(babelrc, jsxConfig); } + // Add Flow stripping config if it isn't already specified in the babelrc + let hasFlow = hasPlugin(babelrc.plugins, 'transform-flow-strip-types'); + + if (!hasFlow && flowConfig) { + mergeConfigs(babelrc, flowConfig); + } + return babelrc; } // If there is a babel-preset-env config, and it isn't empty use that - if (envConfig && (envConfig.plugins.length > 0 || jsxConfig)) { + if (envConfig && (envConfig.plugins.length > 0 || jsxConfig || flowConfig)) { mergeConfigs(envConfig, jsxConfig); + mergeConfigs(envConfig, flowConfig); + return envConfig; } @@ -148,6 +158,11 @@ async function getBabelConfig(asset) { return jsxConfig; } + // If there is a Flow config, return that + if (flowConfig) { + return flowConfig; + } + // Otherwise, don't run babel at all return null; } @@ -309,3 +324,17 @@ async function getJSXConfig(asset, isSourceModule) { }; } } + +/** + * Generates a babel config for stripping away Flow types. + */ +function getFlowConfig(asset) { + if (/^(\/{2}|\/\*+) *@flow/.test(asset.contents.substring(0, 20))) { + return { + plugins: [[require('babel-plugin-transform-flow-strip-types')]], + internal: true + }; + } + + return null; +} diff --git a/packages/core/parcel/test/integration/babel-strip-flow-types/index.js b/packages/core/parcel/test/integration/babel-strip-flow-types/index.js new file mode 100644 index 00000000000..ca01de4a7ed --- /dev/null +++ b/packages/core/parcel/test/integration/babel-strip-flow-types/index.js @@ -0,0 +1,5 @@ +const flowModule = require('flow-typed'); + +module.exports = function() { + return flowModule(); +} \ No newline at end of file diff --git a/packages/core/parcel/test/integration/babel-strip-flow-types/node_modules/flow-typed/index.js b/packages/core/parcel/test/integration/babel-strip-flow-types/node_modules/flow-typed/index.js new file mode 100644 index 00000000000..f689a67b3bb --- /dev/null +++ b/packages/core/parcel/test/integration/babel-strip-flow-types/node_modules/flow-typed/index.js @@ -0,0 +1,4 @@ +// @flow +import type { OptionsType } from 'Types'; + +module.exports = () => 'hello world'; \ No newline at end of file diff --git a/packages/core/parcel/test/javascript.js b/packages/core/parcel/test/javascript.js index b5c6e611928..cc60c14010d 100644 --- a/packages/core/parcel/test/javascript.js +++ b/packages/core/parcel/test/javascript.js @@ -1379,4 +1379,17 @@ describe('javascript', function() { assert(output.includes('')); assert(output.includes('Other page')); }); + + it('should strip away flow types of node modules', async function() { + let b = await bundle( + __dirname + '/integration/babel-strip-flow-types/index.js' + ); + + let output = await run(b); + assert.equal(typeof output, 'function'); + assert.equal(output(), 'hello world'); + + let file = await fs.readFile(__dirname + '/dist/index.js', 'utf8'); + assert(!file.includes('OptionsType')); + }); }); diff --git a/yarn.lock b/yarn.lock index a08b1dc287d..14e83f0fa63 100644 --- a/yarn.lock +++ b/yarn.lock @@ -523,6 +523,10 @@ babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-livefyre-release/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + babel-plugin-syntax-jsx@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" @@ -725,6 +729,13 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" +babel-plugin-transform-flow-strip-types@^6.22.0: + version "6.22.0" + resolved "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-livefyre-release/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + babel-plugin-transform-object-rest-spread@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"