Babel preset for React Native applications with comprehensive JavaScript/TypeScript transformations and React Native runtime optimizations
npx @tessl/cli install tessl/npm-babel-preset-react-native@4.0.0A Babel preset specifically designed for React Native applications that provides comprehensive JavaScript and TypeScript transformations optimized for React Native's runtime environment. This preset includes a carefully curated set of Babel plugins for modern JavaScript features, React transformations, and mobile platform optimizations.
npm install metro-react-native-babel-preset --save-dev// As a Babel preset in .babelrc or babel.config.js
{
"presets": ["module:metro-react-native-babel-preset"]
}For programmatic usage:
const preset = require("metro-react-native-babel-preset");
// Use as Babel preset function
const config = preset(babelInstance, options);
// Direct access to preset generator
const { getPreset } = require("metro-react-native-babel-preset");
const presetConfig = getPreset(sourceCode, options);Most commonly used as a Babel preset in React Native projects:
{
"presets": ["module:metro-react-native-babel-preset"]
}With options:
{
"presets": [
[
"module:metro-react-native-babel-preset",
{
"disableImportExportTransform": false,
"dev": true
}
]
]
}Programmatic usage:
const preset = require("metro-react-native-babel-preset");
const babel = require("@babel/core");
// Transform code with the preset
const result = babel.transform(code, {
presets: [[preset, { dev: true }]]
});Main Babel preset factory function that creates transformation configuration.
/**
* Creates a Babel preset configuration for React Native applications
* @param {object} babel - Babel instance (standard Babel preset parameter, provides access to Babel's API)
* @param {PresetOptions} options - Configuration options for the preset
* @returns {PresetOutput} Babel preset configuration object with plugins and settings
*/
function preset(babel, options);
interface PresetOptions {
/** Enable development-specific transformations (JSX source maps) */
dev?: boolean;
/** Override automatic environment detection for development tools
* - null (default): Auto-detect from BABEL_ENV/NODE_ENV
* - true: Force enable development features
* - false: Force disable development features */
withDevTools?: boolean | null;
/** Skip ES6 import/export transformation to CommonJS */
disableImportExportTransform?: boolean;
}
interface PresetOutput {
/** Comments are stripped from transformed code */
comments: false;
/** Code is compacted for production */
compact: true;
/** Array of Babel plugins to apply */
plugins: any[];
/** TypeScript-specific plugin overrides */
overrides: Array<{
test: (filename: string) => boolean;
plugins: any[];
}>;
}Advanced preset configuration generator that optimizes plugin selection based on source code analysis.
/**
* Generates preset configuration with conditional plugin loading based on source code analysis
* @param {string | null} src - Source code string for analysis (null for all plugins)
* @param {PresetOptions} options - Configuration options
* @returns {PresetOutput} Optimized Babel preset configuration
*/
function getPreset(src, options);Usage Example:
const { getPreset } = require("metro-react-native-babel-preset");
// Analyze source and get optimized config
const sourceCode = `
class MyComponent extends React.Component {
render() {
return <div>Hello</div>;
}
}
`;
const config = getPreset(sourceCode, { dev: true });
// Will include class transformation plugins since 'class' is detectedThe preset intelligently applies transformations based on source code analysis and environment settings:
@babel/plugin-proposal-class-properties (loose mode)@babel/plugin-proposal-object-rest-spread@babel/plugin-transform-arrow-functions@babel/plugin-transform-block-scoping@babel/plugin-transform-classes@babel/plugin-transform-computed-properties@babel/plugin-transform-destructuring@babel/plugin-transform-function-name@babel/plugin-transform-literals@babel/plugin-transform-parameters@babel/plugin-transform-shorthand-properties@babel/plugin-transform-spread@babel/plugin-transform-template-literals (loose mode - simple string concatenation instead of .concat())@babel/plugin-transform-for-of (loose mode for better performance)@babel/plugin-transform-exponentiation-operator@babel/plugin-proposal-optional-chaining (loose mode for better performance)@babel/plugin-proposal-nullish-coalescing-operator (loose mode for simpler output)@babel/plugin-proposal-optional-catch-binding@babel/plugin-transform-react-jsx@babel/plugin-transform-react-display-name@babel/plugin-transform-react-jsx-source (development only)@babel/plugin-transform-modules-commonjs with React Native optimizations:
strict: false - Prevents strict mode injectionstrictMode: false - No "use strict" additionsallowTopLevelThis: true - Preserves global this references@babel/plugin-transform-flow-strip-types@babel/plugin-transform-typescript (for .ts/.tsx files)@babel/plugin-transform-regenerator@babel/plugin-transform-sticky-regex, @babel/plugin-transform-unicode-regex@babel/plugin-transform-object-assign// Input:
Symbol.iterator;
// Transformed output:
typeof Symbol === 'function' ? Symbol.iterator : '@@iterator';The preset uses source code analysis to conditionally load plugins for optimal performance:
// Only loads class transformation if 'class' keyword detected
const hasClass = src.indexOf('class') !== -1;
// Only loads arrow function transform if '=>' detected
const hasArrowFunctions = src.indexOf('=>') !== -1;
// Only loads for-of transform if 'for' and 'of' detected together
const hasForOf = src.indexOf('for') !== -1 && src.indexOf('of') !== -1;Automatically detects development environment and enables appropriate features:
BABEL_ENV=development, NODE_ENV=development, or options.dev=truewithDevTools option to explicitly control development featuresAutomatically detects and transforms TypeScript files with JSX support:
.ts or .tsx (via isTypeScriptSource function)@babel/plugin-transform-typescript with isTSX: true to support JSX in TypeScriptisTSX: true) for React Native compatibilityImportant: Plugin order is critical for correct transformation. The preset enforces specific ordering:
.ts/.tsx files{
"presets": ["module:metro-react-native-babel-preset"]
}{
"presets": [
["module:metro-react-native-babel-preset", { "dev": true }]
]
}{
"presets": [
[
"module:metro-react-native-babel-preset",
{ "disableImportExportTransform": true }
]
]
}{
"presets": [
[
"module:metro-react-native-babel-preset",
{ "withDevTools": true }
]
]
}