The primary factory function for creating Babel plugins that transform class features with configurable options and feature flags.
Creates a configured Babel plugin for transforming specific class features.
/**
* Creates a Babel plugin for transforming class features
* @param options - Configuration options for the plugin
* @returns Configured PluginObject ready for use in Babel
*/
function createClassFeaturePlugin(options: Options): PluginObject;
interface Options {
/** The name of the plugin */
name: string;
/** Feature flags indicating which class features to transform */
feature: number;
/** Whether to use loose mode transformations */
loose?: boolean;
/** Babel plugin inheritance configuration */
inherits?: PluginObject["inherits"];
/** Parser options manipulation function */
manipulateOptions?: PluginObject["manipulateOptions"];
/** Babel plugin API instance */
api?: PluginAPI;
/** Decorator specification version to use */
decoratorVersion?: DecoratorVersionKind | "2018-09";
}
type DecoratorVersionKind =
| "2023-11" | "2023-05" | "2023-01"
| "2022-03" | "2021-12";Usage Examples:
import { createClassFeaturePlugin, FEATURES } from "@babel/helper-create-class-features-plugin";
// Basic class properties plugin
export default createClassFeaturePlugin({
name: "transform-class-properties",
api,
feature: FEATURES.fields,
loose: options.loose,
});
// Private methods plugin with combined features
export default createClassFeaturePlugin({
name: "transform-private-methods",
api,
feature: FEATURES.privateMethods | FEATURES.fields,
loose: options.loose,
manipulateOptions(opts, parserOpts) {
parserOpts.plugins.push("classPrivateMethods");
},
});
// Decorators plugin with specific version
export default createClassFeaturePlugin({
name: "transform-decorators",
api,
feature: FEATURES.decorators,
decoratorVersion: "2023-11",
});
// Complex plugin with inheritance
export default createClassFeaturePlugin({
name: "transform-class-static-blocks",
api,
feature: FEATURES.staticBlocks,
inherits: require("@babel/plugin-syntax-class-static-block").default,
manipulateOptions(opts, parserOpts) {
parserOpts.plugins.push("classStaticBlock");
},
});The returned plugin object follows standard Babel plugin structure:
interface PluginObject {
name: string;
manipulateOptions?: (opts: any, parserOpts: any) => void;
inherits?: PluginObject;
pre?: (file: File) => void;
visitor: {
Class(path: NodePath<t.Class>, state: any): void;
ExportDefaultDeclaration?(path: NodePath<t.ExportDefaultDeclaration>, state: any): void;
};
}Features can be combined using bitwise OR operations:
// Multiple features
const combinedFeatures = FEATURES.fields | FEATURES.privateMethods | FEATURES.privateIn;
// Check if feature is enabled
const hasFields = feature & FEATURES.fields;
const hasPrivateMethods = feature & FEATURES.privateMethods;The plugin supports multiple decorator specification versions:
Loose mode provides faster, less spec-compliant transformations:
// Strict mode (default) - fully spec-compliant
createClassFeaturePlugin({
name: "my-plugin",
feature: FEATURES.fields,
loose: false
});
// Loose mode - faster but less compliant
createClassFeaturePlugin({
name: "my-plugin",
feature: FEATURES.fields,
loose: true
});Loose mode assumptions: