Skip to content

Commit 622b5e9

Browse files
robhoganfacebook-github-bot
authored andcommitted
Babel preset: don't override dev based on omission of obsolete withDevTools, infer from env() instead. (#55805)
Summary: Currently the RN Babel preset has this surprising bit of behaviour: ```js module.exports = (options, babel) => { if (options.withDevTools == null) { const env = process.env.BABEL_ENV || process.env.NODE_ENV; if (!env || env === 'development') { return getPreset(null, {...options, dev: true}, babel); } } return getPreset(null, options, babel); }; ``` If the (undocumented, otherwise unused) `withDevTools` option is set (to anything), we will override any given value of `dev` to `true` if `BABEL_ENV` || `NODE_ENV || 'development' === 'development'`. To put that another way, with `NODE_ENV=development` and `BABEL_ENV` unset, we would always produce a dev bundle even if `{ dev: false }` Expo sets `withDevTools: false` to stop this happening, and always set `dev` (so this diff means **no observable change under Expo**): https://github.com/expo/expo/blob/4a46dbff7a5a77d9fe06d30a70d7fab38cfc7f9a/packages/babel-preset-expo/build/index.js#L235-L236 This odd-looking override was introduced in 2017 in bc22a4d / D5237158 as a way to gate `babel/plugin-transform-react-jsx-source`, *before the preset accepted any other options* - it was never intended to override `dev`. Now, we gate that same plugin under `options.dev`. ## Inferring `dev` when unspecified The one potentially load-bearing piece of this is that, when a consumer specifies neither `withDevTools` nor `dev` (or maybe no options at all), this code serves to infer it from `process.env.BABEL_ENV || process.env.NODE_ENV`, which is reasonable and actually closer to the way typical plugins/presets work, but a better mechanism compatible with Babel's cache is to use the `env()` API (which defaults to `process.env.BABEL_ENV || process.env.NODE_ENV`, so preserves behaviour). https://babeljs.io/docs/config-files#apienv ## This change - Removes the obsolete use of `withDevToolss`, and never overrides the explicitly-passed `dev` - Where `dev` is not specified, falls back to the Babel environment. Changelog: [General][Fixed] Babel-preset: Don't override explicitly-passed `dev` config if obsolete `withDevTools` is missing Reviewed By: huntie Differential Revision: D94660480
1 parent 34779df commit 622b5e9

File tree

1 file changed

+5
-9
lines changed
  • packages/react-native-babel-preset/src/configs

1 file changed

+5
-9
lines changed

packages/react-native-babel-preset/src/configs/main.js

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ const getPreset = (src, options, babel) => {
5151
const transformProfile =
5252
options?.unstable_transformProfile ?? babel?.caller(getTransformProfile);
5353

54+
const dev = options?.dev ?? babel.env('development');
55+
5456
// Hermes V1 (aka Static Hermes) uses more optimised profiles.
5557
// There is currently no difference between stable and canary, but canary
5658
// may in future be used to test features in pre-prod Hermes versions.
@@ -66,7 +68,7 @@ const getPreset = (src, options, babel) => {
6668
// Use native generators in release mode because it has already yielded perf
6769
// wins. The next release of Hermes will close this gap, so this won't
6870
// be permanent.
69-
const enableRegenerator = isHermesV1 && options.dev;
71+
const enableRegenerator = isHermesV1 && dev;
7072

7173
// Preserve class syntax and related if we're using Hermes V1.
7274
const preserveClasses = isHermesV1;
@@ -155,11 +157,11 @@ const getPreset = (src, options, babel) => {
155157
]);
156158
}
157159

158-
if (options && options.dev && !options.disableDeepImportWarnings) {
160+
if (options && dev && !options.disableDeepImportWarnings) {
159161
firstPartyPlugins.push([require('../plugin-warn-on-deep-imports.js')]);
160162
}
161163

162-
if (options && options.dev && !options.useTransformReactJSXExperimental) {
164+
if (options && dev && !options.useTransformReactJSXExperimental) {
163165
extraPlugins.push([require('@babel/plugin-transform-react-jsx-source')]);
164166
extraPlugins.push([require('@babel/plugin-transform-react-jsx-self')]);
165167
}
@@ -262,12 +264,6 @@ const getPreset = (src, options, babel) => {
262264
};
263265

264266
module.exports = (options, babel) => {
265-
if (options.withDevTools == null) {
266-
const env = process.env.BABEL_ENV || process.env.NODE_ENV;
267-
if (!env || env === 'development') {
268-
return getPreset(null, {...options, dev: true}, babel);
269-
}
270-
}
271267
return getPreset(null, options, babel);
272268
};
273269

0 commit comments

Comments
 (0)