Babel preset for React Native applications with comprehensive JavaScript and TypeScript transformation plugins
npx @tessl/cli install tessl/npm-react-native--babel-preset@0.81.0@react-native/babel-preset is a comprehensive Babel preset specifically designed for React Native applications. It provides all necessary plugins and configurations to transform JavaScript and TypeScript code for React Native development, including JSX transformation, Flow and TypeScript stripping, modern JavaScript syntax transformation, and platform-specific optimizations.
npm install @react-native/babel-preset --save-devconst preset = require("@react-native/babel-preset");For direct access to specific functions:
const { getPreset, passthroughSyntaxPlugins } = require("@react-native/babel-preset");// babel.config.js
module.exports = {
presets: ["@react-native/babel-preset"]
};// babel.config.js
module.exports = {
presets: [
[
"@react-native/babel-preset",
{
unstable_transformProfile: "hermes-stable",
enableBabelRuntime: false,
dev: true
}
]
]
};const preset = require("@react-native/babel-preset");
const { getPreset } = require("@react-native/babel-preset");
// Using the main preset function
const config = preset(null, { dev: true });
// Using getPreset directly
const directConfig = getPreset("const x = 1;", {
unstable_transformProfile: "hermes-canary"
});The primary export that returns Babel configuration based on environment and options.
/**
* Main preset function that returns Babel configuration
* @param babel - Babel instance (usually null when used as preset)
* @param options - Configuration options object
* @returns Babel configuration object
*/
function preset(babel, options): BabelConfig;Direct access to the preset generation logic with source code analysis.
/**
* Generates preset configuration with source code analysis
* @param src - Source code string to analyze (null for generic config)
* @param options - Configuration options object
* @returns Babel configuration object
*/
function getPreset(src, options): BabelConfig;Array of syntax plugins for enabling experimental features without transformation.
/**
* Array of syntax plugins for experimental features
* Enables parsing of nullish coalescing and optional chaining
*/
const passthroughSyntaxPlugins: BabelPlugin[];Hot Module Replacement configuration for development.
/**
* Returns Babel configuration for Hot Module Replacement
* @returns Babel config with react-refresh plugin
*/
function hmrConfig(): BabelConfig;Controls the target JavaScript engine and transformation level.
interface TransformProfileOptions {
/** Transform profile: 'default', 'hermes-stable', or 'hermes-canary' */
unstable_transformProfile?: "default" | "hermes-stable" | "hermes-canary";
}Controls which transformations and features are enabled.
interface FeatureOptions {
/** Enable experimental JSX transform */
useTransformReactJSXExperimental?: boolean;
/** Disable static view configs codegen plugin */
disableStaticViewConfigsCodegen?: boolean;
/** Disable import/export to CommonJS transformation */
disableImportExportTransform?: boolean;
/** Enable lazy import transformation (boolean or function) */
lazyImportExportTransform?: boolean | ((importSpecifier: string) => boolean);
/** Enable development mode features */
dev?: boolean;
/** Disable deep import warnings in development */
disableDeepImportWarnings?: boolean;
/** Enable Babel runtime transformation */
enableBabelRuntime?: boolean | string;
/** Enable development tools */
withDevTools?: boolean;
/** Enable compact output */
compact?: boolean;
}Configuration for the Hermes parser plugin.
interface HermesParserOptions {
/** Language types to parse */
parseLangTypes?: string;
/** React runtime target version */
reactRuntimeTarget?: string;
/** Additional Hermes parser options */
hermesParserOptions?: Record<string, any>;
}interface PresetOptions extends TransformProfileOptions, FeatureOptions, HermesParserOptions {
/** Enable experimental JSX transform */
useTransformReactJSXExperimental?: boolean;
/** Disable static view configs codegen plugin */
disableStaticViewConfigsCodegen?: boolean;
/** Disable import/export to CommonJS transformation */
disableImportExportTransform?: boolean;
/** Enable lazy import transformation */
lazyImportExportTransform?: boolean | ((importSpecifier: string) => boolean);
/** Enable development mode features */
dev?: boolean;
/** Disable deep import warnings in development */
disableDeepImportWarnings?: boolean;
/** Enable Babel runtime transformation */
enableBabelRuntime?: boolean | string;
/** Enable development tools */
withDevTools?: boolean;
/** Enable compact output */
compact?: boolean;
/** Transform profile for different JS engines */
unstable_transformProfile?: "default" | "hermes-stable" | "hermes-canary";
/** Hermes parser configuration */
hermesParserOptions?: Record<string, any>;
}/** Babel configuration object returned by the preset */
interface BabelConfig {
/** Preserve comments in output */
comments: boolean;
/** Enable compact output */
compact: boolean;
/** Configuration overrides for different file types and conditions */
overrides: BabelOverride[];
}
/** Babel configuration override for specific conditions */
interface BabelOverride {
/** Test function or pattern to match files */
test?: (filename: string) => boolean;
/** Babel plugins to apply */
plugins: BabelPlugin[];
}
/** Babel plugin configuration */
type BabelPlugin = string | [string, any] | Function | [Function, any];The preset includes numerous Babel plugins for comprehensive code transformation:
?.) support??) supportThe preset provides specialized configurations for React Native's Hermes JavaScript engine:
Automatically detects environment and applies appropriate transformations:
The preset handles various transformation edge cases:
.ts and .tsx files// babel.config.js
module.exports = {
presets: [
[
"@react-native/babel-preset",
{
unstable_transformProfile: "hermes-stable",
disableImportExportTransform: false,
lazyImportExportTransform: (importSpecifier) => {
// Custom lazy import logic
return importSpecifier.includes("react-native");
},
dev: process.env.NODE_ENV === "development"
}
]
],
plugins: [
// Additional plugins can be added here
]
};// metro.config.js
const { getDefaultConfig } = require("metro-config");
module.exports = (async () => {
const config = await getDefaultConfig(__dirname);
config.transformer.babelTransformerPath = require.resolve("metro-react-native-babel-transformer");
return config;
})();const { getPreset } = require("@react-native/babel-preset");
// Generate configuration for specific source code
const sourceCode = `
import React from 'react';
const Component = () => <div>Hello</div>;
`;
const config = getPreset(sourceCode, {
dev: true,
unstable_transformProfile: "hermes-canary"
});
console.log(config.plugins.length); // Number of plugins applied