Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions packages/react-native-babel-preset/src/configs/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ const getPreset = (src, options, babel) => {
const transformProfile =
options?.unstable_transformProfile ?? babel?.caller(getTransformProfile);

const dev = options?.dev ?? babel.env('development');

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

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

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

if (options && options.dev && !options.useTransformReactJSXExperimental) {
if (options && dev && !options.useTransformReactJSXExperimental) {
extraPlugins.push([require('@babel/plugin-transform-react-jsx-source')]);
extraPlugins.push([require('@babel/plugin-transform-react-jsx-self')]);
}
Expand Down Expand Up @@ -262,12 +264,6 @@ const getPreset = (src, options, babel) => {
};

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);
};

Expand Down
105 changes: 45 additions & 60 deletions packages/react-native-babel-transformer/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,9 @@ function buildBabelConfig(
: true,
code: false,
cwd: options.projectRoot,
envName: options.dev
? 'development'
: process.env.BABEL_ENV || 'production',
filename,
highlightCode: true,
};
Expand Down Expand Up @@ -183,67 +186,49 @@ const transform /*: BabelTransformer['transform'] */ = ({
src,
plugins,
}) => {
const OLD_BABEL_ENV = process.env.BABEL_ENV;
process.env.BABEL_ENV = options.dev
? 'development'
: process.env.BABEL_ENV || 'production';

try {
const babelConfig /*: BabelCoreOptions */ = {
// ES modules require sourceType='module' but OSS may not always want that
sourceType: 'unambiguous',
...buildBabelConfig(filename, options, plugins),
caller: {
// Varies Babel's config cache - presets will be re-initialized
// if they use caller information.
name: 'metro',
bundler: 'metro',
platform: options.platform,
unstable_transformProfile: options.unstable_transformProfile,
},
ast: true,

// NOTE(EvanBacon): We split the parse/transform steps up to accommodate
// Hermes parsing, but this defaults to cloning the AST which increases
// the transformation time by a fair amount.
// You get this behavior by default when using Babel's `transform` method directly.
cloneInputAst: false,
};
const sourceAst /*: BabelNodeFile */ =
isTypeScriptSource(filename) ||
isTSXSource(filename) ||
!options.hermesParser
? parseSync(src, babelConfig)
: // $FlowFixMe[incompatible-exact]
require('hermes-parser').parse(src, {
babel: true,
reactRuntimeTarget: '19',
sourceType: babelConfig.sourceType,
});

const result /*: TransformResult<MetroBabelFileMetadata> */ =
transformFromAstSync(sourceAst, src, babelConfig);

// The result from `transformFromAstSync` can be null (if the file is ignored)
if (!result) {
/* $FlowFixMe[incompatible-type] BabelTransformer specifies that the `ast` can never be null but
* the function returns here. Discovered when typing `BabelNode`. */
return {ast: null};
}

return {ast: nullthrows(result.ast), metadata: result.metadata};
} finally {
// Restore the old process.env.BABEL_ENV
if (OLD_BABEL_ENV == null) {
// We have to treat this as a special case because writing undefined to
// an environment variable coerces it to the string 'undefined'. To
// unset it, we must delete it.
// See https://github.com/facebook/metro/pull/446
delete process.env.BABEL_ENV;
} else {
process.env.BABEL_ENV = OLD_BABEL_ENV;
}
const babelConfig /*: BabelCoreOptions */ = {
// ES modules require sourceType='module' but OSS may not always want that
sourceType: 'unambiguous',
...buildBabelConfig(filename, options, plugins),
caller: {
// Varies Babel's config cache - presets will be re-initialized
// if they use caller information.
name: 'metro',
bundler: 'metro',
platform: options.platform,
unstable_transformProfile: options.unstable_transformProfile,
},
ast: true,

// NOTE(EvanBacon): We split the parse/transform steps up to accommodate
// Hermes parsing, but this defaults to cloning the AST which increases
// the transformation time by a fair amount.
// You get this behavior by default when using Babel's `transform` method directly.
cloneInputAst: false,
};
const sourceAst /*: BabelNodeFile */ =
isTypeScriptSource(filename) ||
isTSXSource(filename) ||
!options.hermesParser
? parseSync(src, babelConfig)
: // $FlowFixMe[incompatible-exact]
require('hermes-parser').parse(src, {
babel: true,
reactRuntimeTarget: '19',
sourceType: babelConfig.sourceType,
});

const result /*: TransformResult<MetroBabelFileMetadata> */ =
transformFromAstSync(sourceAst, src, babelConfig);

// The result from `transformFromAstSync` can be null (if the file is ignored)
if (!result) {
/* $FlowFixMe[incompatible-type] BabelTransformer specifies that the `ast` can never be null but
* the function returns here. Discovered when typing `BabelNode`. */
return {ast: null};
}

return {ast: nullthrows(result.ast), metadata: result.metadata};
};

function getCacheKey() {
Expand Down
Loading