A Parcel transformer plugin that transforms JavaScript code using Babel with automatic configuration discovery and intelligent defaults for modern JavaScript, TypeScript, JSX, and Flow.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Babel configuration loading, validation, and default configuration generation with automatic dependency detection and performance optimization warnings.
Main function for loading and processing Babel configuration from the filesystem or building intelligent defaults.
/**
* Loads Babel configuration for the current asset
* Discovers filesystem configs or builds default configuration
* @param config - Parcel configuration object
* @param options - Plugin options
* @param logger - Plugin logger for warnings and errors
* @returns Promise resolving to BabelConfigResult or null if no transformation needed
*/
export async function load(
config: Config,
options: PluginOptions,
logger: PluginLogger
): Promise<BabelConfigResult | null>;
interface BabelConfigResult {
internal: boolean; // True if using default config, false for filesystem config
config: BabelConfig; // The actual Babel configuration
targets?: mixed; // Babel targets for preset-env
syntaxPlugins?: mixed; // Additional syntax plugins to enable
}
interface BabelConfig {
plugins?: Array<any>; // Babel plugins array
presets?: Array<any>; // Babel presets array
}Configuration Discovery Process:
buildDefaultBabelConfig if no config foundBuilds intelligent default Babel configuration when no filesystem config is found.
/**
* Builds default Babel configuration for files without explicit config
* Primarily handles Flow type stripping with JSX support
* @param options - Plugin options
* @param config - Parcel configuration object
* @returns Promise resolving to BabelConfigResult or null if no config needed
*/
async function buildDefaultBabelConfig(
options: PluginOptions,
config: Config
): Promise<BabelConfigResult | null>;Default Configuration Logic:
flow-bin dependency foundUsage Example:
// Internal usage - called when no filesystem config found
const defaultConfig = await buildDefaultBabelConfig(pluginOptions, parcelConfig);
// Typical default config for Flow + JSX file:
// {
// internal: true,
// config: {
// plugins: [
// ['@babel/plugin-transform-flow-strip-types', { requireDirective: true }]
// ]
// },
// syntaxPlugins: ['jsx']
// }The configuration system recognizes all standard Babel configuration file formats:
const BABEL_CONFIG_FILENAMES = [
'.babelrc',
'.babelrc.js',
'.babelrc.json',
'.babelrc.cjs',
'.babelrc.mjs',
'.babelignore',
'babel.config.js',
'babel.config.json',
'babel.config.mjs',
'babel.config.cjs'
];Tracks and manages Babel plugin and preset dependencies for proper invalidation.
/**
* Defines plugin dependencies for cache invalidation
* @param config - Parcel configuration object
* @param babelConfig - Babel configuration with plugins/presets
* @param options - Plugin options
*/
function definePluginDependencies(
config: Config,
babelConfig: BabelConfig | null,
options: PluginOptions
): void;Dependency Tracking Features:
Detects problematic configurations and provides performance warnings.
/**
* Warns about redundant presets that may impact performance
* @param fs - File system interface
* @param babelConfig - Loaded Babel configuration
* @param logger - Plugin logger for warnings
*/
async function warnOnRedundantPlugins(
fs: FileSystem,
babelConfig: PartialConfig,
logger: PluginLogger
): Promise<void>;Redundant Presets Detection:
@babel/preset-env (conflicts with Parcel's builtin transpilation)@babel/preset-react (handled automatically)@babel/preset-typescript (conflicts with TypeScript transformer)@parcel/babel-preset-env (Parcel-specific alternative)Performance Warnings:
require() calls in configurationHandles Babel environment variables and mode configuration.
// Environment variables monitored for invalidation
config.invalidateOnEnvChange('BABEL_ENV');
config.invalidateOnEnvChange('NODE_ENV');
// Environment name resolution priority:
// 1. BABEL_ENV environment variable
// 2. NODE_ENV environment variable
// 3. Parcel mode (if 'production' or 'development')
// 4. Default to 'development'Usage Examples:
// Typical configuration loading flow
const configResult = await load(parcelConfig, pluginOptions, logger);
if (configResult) {
console.log('Config type:', configResult.internal ? 'default' : 'filesystem');
console.log('Babel config:', configResult.config);
console.log('Targets:', configResult.targets);
console.log('Syntax plugins:', configResult.syntaxPlugins);
}
// Example filesystem config result:
// {
// internal: false,
// config: {
// presets: [['@babel/preset-env', { targets: { node: '16' } }]],
// plugins: ['@babel/plugin-proposal-class-properties']
// },
// targets: { node: '16.0.0' },
// syntaxPlugins: ['jsx']
// }Install with Tessl CLI
npx tessl i tessl/npm-parcel--transformer-babel