Babel compiler core providing programmatic APIs for JavaScript code transformation, parsing, and configuration.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Babel configuration loading, validation, and management system supporting various config file formats, runtime options, and plugin/preset resolution. Provides both full and partial configuration loading for different use cases.
Load and resolve complete Babel configuration from various sources.
/**
* Load complete Babel options synchronously
* @param opts - Input options to merge with config file settings
* @returns Resolved configuration object or null if no config found
*/
function loadOptionsSync(opts?: InputOptions): ResolvedConfig | null;
/**
* Load complete Babel options asynchronously
* @param opts - Input options to merge with config file settings
* @returns Promise resolving to resolved configuration or null
*/
function loadOptionsAsync(opts?: InputOptions): Promise<ResolvedConfig | null>;
/**
* Load complete Babel options with callback (legacy API, deprecated in Babel 8)
* @param opts - Input options to merge with config file settings
* @param callback - Callback function receiving error and resolved config
*/
function loadOptions(
opts: InputOptions,
callback: (err: Error | null, config: ResolvedConfig | null) => void
): void;
function loadOptions(
callback: (err: Error | null, config: ResolvedConfig | null) => void
): void;
interface ResolvedConfig {
/** Resolved plugins with their options */
plugins: Array<ConfigItem>;
/** Resolved presets with their options */
presets: Array<ConfigItem>;
/** Parser options */
parserOpts: ParserOptions;
/** Generator options */
generatorOpts: GeneratorOptions;
/** All other resolved options */
[key: string]: any;
}Usage Examples:
import { loadOptionsSync, loadOptionsAsync } from "@babel/core";
// Load configuration from babel.config.js and .babelrc files
const config = loadOptionsSync({
cwd: "/path/to/project",
filename: "src/app.js",
envName: "production"
});
if (config) {
console.log("Plugins:", config.plugins.map(p => p.name));
console.log("Presets:", config.presets.map(p => p.name));
console.log("Parser options:", config.parserOpts);
}
// Override config file settings
const customConfig = loadOptionsSync({
presets: ["@babel/preset-env"],
plugins: ["@babel/plugin-transform-runtime"],
targets: "> 0.25%, not dead"
});
// Async loading
const asyncConfig = await loadOptionsAsync({
cwd: process.cwd(),
configFile: "./babel.config.json",
envName: process.env.NODE_ENV
});Load partial configuration for advanced use cases where full resolution isn't needed.
/**
* Load partial Babel configuration synchronously
* @param opts - Input options for partial resolution
* @returns Partial configuration object or null
*/
function loadPartialConfigSync(opts?: InputOptions): PartialConfig | null;
/**
* Load partial Babel configuration asynchronously
* @param opts - Input options for partial resolution
* @returns Promise resolving to partial configuration or null
*/
function loadPartialConfigAsync(opts?: InputOptions): Promise<PartialConfig | null>;
/**
* Load partial configuration with callback (legacy API, deprecated in Babel 8)
* @param opts - Input options for partial resolution
* @param callback - Callback function receiving error and partial config
*/
function loadPartialConfig(
opts: InputOptions,
callback: (err: Error | null, config: PartialConfig | null) => void
): void;
function loadPartialConfig(
callback: (err: Error | null, config: PartialConfig | null) => void
): void;
interface PartialConfig {
/** Resolved options (may be null if no valid config) */
options: ResolvedConfig | null;
/** Loaded config file information */
config?: {
filepath: string;
dirname: string;
options: any;
};
/** Loaded .babelrc file information */
babelrc?: {
filepath: string;
dirname: string;
options: any;
};
/** Whether this config ignores the file */
hasFilesystemConfig(): boolean;
}Usage Examples:
import { loadPartialConfigSync } from "@babel/core";
// Check if a file should be processed
const partialConfig = loadPartialConfigSync({
filename: "src/components/Button.tsx",
cwd: "/path/to/project"
});
if (partialConfig) {
if (partialConfig.hasFilesystemConfig()) {
console.log("File has Babel config");
if (partialConfig.config) {
console.log("Config file:", partialConfig.config.filepath);
}
if (partialConfig.babelrc) {
console.log("Babelrc file:", partialConfig.babelrc.filepath);
}
// Use resolved options
if (partialConfig.options) {
console.log("Resolved plugins:", partialConfig.options.plugins.length);
}
} else {
console.log("No Babel config found for this file");
}
}Create and manage individual plugin and preset configuration items.
/**
* Create configuration item synchronously
* @param target - Plugin/preset function, module name, or path
* @param options - Options to pass to the plugin/preset
* @returns Configuration item or null if invalid
*/
function createConfigItemSync(
target: PluginTarget,
options?: ConfigItemOptions
): ConfigItem<PluginAPI> | null;
/**
* Create configuration item asynchronously
* @param target - Plugin/preset function, module name, or path
* @param options - Options to pass to the plugin/preset
* @returns Promise resolving to configuration item or null
*/
function createConfigItemAsync(
target: PluginTarget,
options?: ConfigItemOptions
): Promise<ConfigItem<PluginAPI> | null>;
/**
* Create configuration item with callback (legacy API, deprecated in Babel 8)
* @param target - Plugin/preset function, module name, or path
* @param options - Options to pass to the plugin/preset
* @param callback - Callback function receiving error and config item
*/
function createConfigItem(
target: PluginTarget,
options: ConfigItemOptions,
callback: (err: Error | null, item: ConfigItem<PluginAPI> | null) => void
): void;
type PluginTarget =
| string
| PluginFunction
| PresetFunction
| [string, any]
| [PluginFunction, any]
| [PresetFunction, any];
interface ConfigItemOptions {
/** Directory context for resolution */
dirname?: string;
/** Item type: "plugin" or "preset" */
type?: "plugin" | "preset";
}
interface ConfigItem<T = PluginAPI> {
/** Resolved plugin/preset function */
value: T;
/** Configuration options passed to the plugin/preset */
options: any;
/** Directory where the plugin/preset was resolved */
dirname: string;
/** Name of the plugin/preset */
name?: string;
/** Full file path if resolved from file */
file?: {
request: string;
resolved: string;
};
}Usage Examples:
import { createConfigItemSync } from "@babel/core";
// Create plugin config item
const pluginItem = createConfigItemSync("@babel/plugin-transform-runtime", {
dirname: "/path/to/project",
type: "plugin"
});
if (pluginItem) {
console.log("Plugin name:", pluginItem.name);
console.log("Plugin options:", pluginItem.options);
console.log("Resolved from:", pluginItem.file?.resolved);
}
// Create preset config item with options
const presetItem = createConfigItemSync(
["@babel/preset-env", {
targets: "> 0.25%, not dead",
useBuiltIns: "usage",
corejs: 3
}],
{
dirname: process.cwd(),
type: "preset"
}
);
// Create from function
const customPlugin = function(babel) {
return {
visitor: {
Identifier(path) {
console.log("Found identifier:", path.node.name);
}
}
};
};
const customItem = createConfigItemSync(customPlugin, {
dirname: __dirname,
type: "plugin"
});Babel supports various configuration file formats:
interface ConfigFileOptions {
/** Path to specific config file, or false to disable */
configFile?: string | false;
/** Enable/disable .babelrc file loading */
babelrc?: boolean;
/** Root directory for config file search */
root?: string;
/** Current working directory */
cwd?: string;
/** Override root mode: "root", "upward", or "upward-optional" */
rootMode?: "root" | "upward" | "upward-optional";
}Supported Config Files:
babel.config.json - Project-wide configurationbabel.config.js - Project-wide with JavaScriptbabel.config.mjs - Project-wide with ES modulesbabel.config.cjs - Project-wide with CommonJS.babelrc - File-relative configuration.babelrc.json - File-relative JSON.babelrc.js - File-relative JavaScriptpackage.json - Babel field in package.jsonUsage Examples:
import { loadOptionsSync } from "@babel/core";
// Use specific config file
const config1 = loadOptionsSync({
configFile: "./babel.production.js",
cwd: "/path/to/project"
});
// Disable config file loading
const config2 = loadOptionsSync({
configFile: false,
plugins: ["@babel/plugin-transform-arrow-functions"]
});
// Disable .babelrc files
const config3 = loadOptionsSync({
babelrc: false,
presets: ["@babel/preset-env"]
});
// Search from different root
const config4 = loadOptionsSync({
root: "/different/root",
rootMode: "upward",
filename: "src/app.js"
});Configure Babel behavior based on environment:
interface EnvironmentOptions {
/** Environment name (defaults to BABEL_ENV || NODE_ENV || "development") */
envName?: string;
/** Caller metadata for conditional configuration */
caller?: CallerMetadata;
}
interface CallerMetadata {
/** Name of the calling tool */
name: string;
/** Version of the calling tool */
version?: string;
/** Whether the caller supports ES modules */
supportsStaticESM?: boolean;
/** Whether the caller supports dynamic imports */
supportsDynamicImport?: boolean;
/** Whether the caller supports top-level await */
supportsTopLevelAwait?: boolean;
/** Additional caller-specific properties */
[key: string]: any;
}Usage Examples:
import { loadOptionsSync } from "@babel/core";
// Load development configuration
const devConfig = loadOptionsSync({
envName: "development",
caller: {
name: "webpack",
version: "5.0.0",
supportsStaticESM: true
}
});
// Load production configuration
const prodConfig = loadOptionsSync({
envName: "production",
caller: {
name: "rollup",
version: "2.0.0",
supportsDynamicImport: true
}
});
// Override environment
process.env.NODE_ENV = "test";
const testConfig = loadOptionsSync({
envName: "testing", // Overrides NODE_ENV
filename: "test/example.spec.js"
});// babel.config.js
module.exports = function(api) {
// Cache configuration based on environment
api.cache.using(() => process.env.NODE_ENV);
const presets = ["@babel/preset-env"];
const plugins = [];
// Add plugins based on environment
if (api.env("development")) {
plugins.push("react-refresh/babel");
}
// Add plugins based on caller
if (api.caller(caller => caller?.name === "webpack")) {
plugins.push("@babel/plugin-syntax-dynamic-import");
}
return { presets, plugins };
};import { loadOptionsSync, transformSync } from "@babel/core";
// Build configuration programmatically
const baseConfig = loadOptionsSync({
presets: ["@babel/preset-env"],
configFile: false
});
// Extend with additional plugins
const extendedConfig = {
...baseConfig,
plugins: [
...baseConfig.plugins,
["@babel/plugin-transform-runtime", { corejs: 3 }]
]
};
// Use extended configuration
const result = transformSync(code, extendedConfig);Configuration functions may throw errors for invalid configurations:
import { loadOptionsSync, createConfigItemSync } from "@babel/core";
try {
const config = loadOptionsSync({
plugins: ["non-existent-plugin"]
});
} catch (error) {
if (error.code === "BABEL_UNKNOWN_PLUGIN") {
console.error("Unknown plugin:", error.message);
}
}
try {
const item = createConfigItemSync("invalid-plugin", {
dirname: "/nonexistent"
});
} catch (error) {
console.error("Failed to create config item:", error.message);
}