Skip to content

Commit 579309f

Browse files
committed
Add JSX source transform for better warnings
Fixes #700. Read about it here: https://twitter.com/dan_abramov/status/779308833399332864.
1 parent 92afcaf commit 579309f

File tree

5 files changed

+44
-14
lines changed

5 files changed

+44
-14
lines changed

packages/babel-preset-react-app/index.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,22 @@ module.exports = {
3737
}]
3838
],
3939
env: {
40+
development: {
41+
plugins: [
42+
// Adds component stack to warning messages
43+
require.resolve('babel-plugin-transform-react-jsx-source'),
44+
// Adds __self attribute to JSX which React will use for some warnings
45+
require.resolve('babel-plugin-transform-react-jsx-self')
46+
]
47+
},
48+
test: {
49+
plugins: [
50+
// Adds component stack to warning messages
51+
require.resolve('babel-plugin-transform-react-jsx-source'),
52+
// Adds __self attribute to JSX which React will use for some warnings
53+
require.resolve('babel-plugin-transform-react-jsx-self')
54+
]
55+
},
4056
production: {
4157
plugins: [
4258
// Optimization: hoist JSX that never changes out of render()

packages/babel-preset-react-app/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
"babel-plugin-transform-class-properties": "6.11.5",
1515
"babel-plugin-transform-object-rest-spread": "6.8.0",
1616
"babel-plugin-transform-react-constant-elements": "6.9.1",
17+
"babel-plugin-transform-react-jsx-self": "6.11.0",
18+
"babel-plugin-transform-react-jsx-source": "6.9.0",
1719
"babel-plugin-transform-regenerator": "6.14.0",
1820
"babel-plugin-transform-runtime": "6.15.0",
1921
"babel-preset-latest": "6.14.0",

packages/react-scripts/config/jest/transform.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
const babelJest = require('babel-jest');
1010

11-
module.exports = babelJest.createTransformer({
12-
presets: [require.resolve('babel-preset-react-app')]
13-
});
11+
module.exports = babelJest.createTransformer(
12+
// We embed the preset instead of referring to it because otherwise
13+
// `env` options in the preset do not get taken into account.
14+
require('babel-preset-react-app')
15+
);

packages/react-scripts/config/webpack.config.dev.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,6 @@ module.exports = {
121121
include: paths.appSrc,
122122
loader: 'babel',
123123
query: {
124-
// @remove-on-eject-begin
125-
babelrc: false,
126-
presets: [require.resolve('babel-preset-react-app')],
127-
// @remove-on-eject-end
128124
// This is a feature of `babel-loader` for webpack (not Babel itself).
129125
// It enables caching results in ./node_modules/.cache/react-scripts/
130126
// directory for faster rebuilds. We use findCacheDir() because of:
@@ -226,3 +222,13 @@ module.exports = {
226222
tls: 'empty'
227223
}
228224
};
225+
226+
// @remove-on-eject-begin
227+
// Override babel-loader options to not read .babelrc.
228+
var babelLoader = module.exports.module.loaders.find(l => l.loader === 'babel');
229+
babelLoader.query = babelLoader.query || {};
230+
babelLoader.query.babelrc = false;
231+
// We embed the preset instead of referring to it because otherwise
232+
// `env` options in the preset do not get taken into account.
233+
Object.assign(babelLoader.query, require('babel-preset-react-app'));
234+
// @remove-on-eject-end

packages/react-scripts/config/webpack.config.prod.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,7 @@ module.exports = {
119119
{
120120
test: /\.(js|jsx)$/,
121121
include: paths.appSrc,
122-
loader: 'babel',
123-
// @remove-on-eject-begin
124-
query: {
125-
babelrc: false,
126-
presets: [require.resolve('babel-preset-react-app')],
127-
},
128-
// @remove-on-eject-end
122+
loader: 'babel'
129123
},
130124
// The notation here is somewhat confusing.
131125
// "postcss" loader applies autoprefixer to our CSS.
@@ -260,3 +254,13 @@ module.exports = {
260254
tls: 'empty'
261255
}
262256
};
257+
258+
// @remove-on-eject-begin
259+
// Override babel-loader options to not read .babelrc.
260+
var babelLoader = module.exports.module.loaders.find(l => l.loader === 'babel');
261+
babelLoader.query = babelLoader.query || {};
262+
babelLoader.query.babelrc = false;
263+
// We embed the preset instead of referring to it because otherwise
264+
// `env` options in the preset do not get taken into account.
265+
Object.assign(babelLoader.query, require('babel-preset-react-app'));
266+
// @remove-on-eject-end

0 commit comments

Comments
 (0)