diff --git a/.eslintrc b/.eslintrc index 44a504e4080..b642bbc5c14 100644 --- a/.eslintrc +++ b/.eslintrc @@ -7,7 +7,7 @@ "es6": true }, "parserOptions": { - "ecmaVersion": 6 + "ecmaVersion": 2018 }, "rules": { "no-console": "off", diff --git a/packages/babel-preset-react-app/loader.js b/packages/babel-preset-react-app/loader.js new file mode 100644 index 00000000000..da11ea80cce --- /dev/null +++ b/packages/babel-preset-react-app/loader.js @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +'use strict'; + +const loader = require('babel-loader'); +const overrides = require('./overrides'); + +module.exports = loader.custom(() => overrides); diff --git a/packages/babel-preset-react-app/overrides.js b/packages/babel-preset-react-app/overrides.js new file mode 100644 index 00000000000..1613983b370 --- /dev/null +++ b/packages/babel-preset-react-app/overrides.js @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +'use strict'; + +const crypto = require('crypto'); + +module.exports = { + // This function transforms the Babel configuration on a per-file basis + config(config, { source }) { + // Babel Macros are notoriously hard to cache, so they shouldn't be + // https://github.com/babel/babel/issues/8497 + // We naively detect macros using their package suffix and insert a random + // caller name, a valid option accepted by Babel, to compose a one-time + // cacheIdentifier for the file. We cannot tune the loader options on a per + // file basis. + if (source.indexOf('.macro') !== -1 || source.indexOf('/macro') !== -1) { + return { + ...config.options, + caller: { + name: `babel-preset-react-app:${crypto + .randomBytes(32) + .toString('hex')}`, + }, + }; + } + return config.options; + }, +}; diff --git a/packages/babel-preset-react-app/package.json b/packages/babel-preset-react-app/package.json index d4b6e24027c..a985fd9ab58 100644 --- a/packages/babel-preset-react-app/package.json +++ b/packages/babel-preset-react-app/package.json @@ -8,10 +8,12 @@ "url": "https://github.com/facebook/create-react-app/issues" }, "files": [ - "index.js", "create.js", "dependencies.js", "dev.js", + "index.js", + "loader.js", + "overrides.js", "prod.js", "test.js" ], @@ -29,6 +31,7 @@ "@babel/preset-env": "7.1.0", "@babel/preset-flow": "7.0.0", "@babel/preset-react": "7.0.0", + "babel-loader": "8.0.2", "babel-plugin-macros": "2.4.2", "babel-plugin-transform-dynamic-import": "2.1.0", "babel-plugin-transform-react-remove-prop-types": "0.4.18" diff --git a/packages/react-scripts/config/webpack.config.dev.js b/packages/react-scripts/config/webpack.config.dev.js index d92cf597e7d..cb19f7f6b92 100644 --- a/packages/react-scripts/config/webpack.config.dev.js +++ b/packages/react-scripts/config/webpack.config.dev.js @@ -228,7 +228,10 @@ module.exports = { }, }, { - loader: require.resolve('babel-loader'), + // We need to use our own loader until `babel-loader` supports + // customization + // https://github.com/babel/babel-loader/pull/687 + loader: require.resolve('babel-preset-react-app/loader'), options: { // @remove-on-eject-begin babelrc: false, diff --git a/packages/react-scripts/config/webpack.config.prod.js b/packages/react-scripts/config/webpack.config.prod.js index 6bd24c06401..5ab033bad31 100644 --- a/packages/react-scripts/config/webpack.config.prod.js +++ b/packages/react-scripts/config/webpack.config.prod.js @@ -266,7 +266,10 @@ module.exports = { // improves compile time on larger projects require.resolve('thread-loader'), { - loader: require.resolve('babel-loader'), + // We need to use our own loader until `babel-loader` supports + // customization + // https://github.com/babel/babel-loader/pull/687 + loader: require.resolve('babel-preset-react-app/loader'), options: { // @remove-on-eject-begin babelrc: false,