Babel plugin that automatically adds displayName properties to React class components created with createClass
npx @tessl/cli install tessl/npm-babel-plugin-transform-react-display-name@6.25.0Babel plugin that automatically adds displayName properties to React class components created using React.createClass (React <= 15) or createReactClass (React 16+). This plugin intelligently infers display names from variable assignments, object properties, export default declarations, or file names, helping developers with React DevTools debugging by ensuring all class components have meaningful display names.
npm install --save-dev babel-plugin-transform-react-display-nameFor Babel configuration usage:
// .babelrc
{
"plugins": ["transform-react-display-name"]
}For programmatic usage:
const transformReactDisplayName = require("babel-plugin-transform-react-display-name");ES Modules:
import transformReactDisplayName from "babel-plugin-transform-react-display-name";.babelrc
{
"plugins": ["transform-react-display-name"]
}babel --plugins transform-react-display-name script.jsconst babel = require("babel-core");
babel.transform(code, {
plugins: ["transform-react-display-name"]
});Input:
var Foo = React.createClass({}); // React <= 15
var Bar = createReactClass({}); // React 16+
export default React.createClass({});
const components = {
Header: createReactClass({}),
Footer: React.createClass({})
};Output:
var Foo = React.createClass({
displayName: "Foo"
});
var Bar = createReactClass({
displayName: "Bar"
});
export default React.createClass({
displayName: "ComponentName" // inferred from filename
});
const components = {
Header: createReactClass({
displayName: "Header"
}),
Footer: React.createClass({
displayName: "Footer"
})
};The main export is a Babel plugin factory function that creates the transformation plugin.
/**
* Babel plugin factory function that creates a plugin to automatically add displayName to React class components
* @param {Object} babel - Babel API object containing types utilities
* @param {Object} babel.types - Babel types utility (aliased as 't')
* @returns {Object} Babel plugin object with visitor methods
*/
function transformReactDisplayName({ types: t }): BabelPlugin;
interface BabelPlugin {
visitor: {
ExportDefaultDeclaration: (path: NodePath, state: PluginState) => void;
CallExpression: (path: NodePath) => void;
};
}Usage Example:
const babel = require("babel-core");
const plugin = require("babel-plugin-transform-react-display-name");
const result = babel.transform(sourceCode, {
plugins: [plugin]
});The plugin automatically infers display names from various code patterns:
var ComponentName = createClass({}) → displayName: "ComponentName"{ ComponentName: createClass({}) } → displayName: "ComponentName"obj.ComponentName = createClass({}) → displayName: "ComponentName"export default createClass({}) → displayName: "[filename]"index.js files, uses parent directory name as display nameAdditional transformation examples:
// Assignment expressions
foo = createReactClass({});
// → foo = createReactClass({ displayName: "foo" });
// Object properties
({
Header: createReactClass({})
});
// → ({ Header: createReactClass({ displayName: "Header" }) });
// Nested member expressions
obj.ComponentName = React.createClass({});
// → obj.ComponentName = React.createClass({ displayName: "ComponentName" });displayName property already existsReact.createClass and createReactClass callsThe plugin recognizes these React class creation patterns:
React.createClass({}) - Legacy React <= 15 syntaxcreateReactClass({}) - React 16+ standalone package syntaxBoth patterns support the same display name inference logic and safety checks.
// Internal visitor context (provided by Babel)
interface NodePath {
node: Object; // Current AST node
find: (callback: (path: NodePath) => boolean) => NodePath;
isAssignmentExpression: () => boolean;
isObjectProperty: () => boolean;
isVariableDeclarator: () => boolean;
isStatement: () => boolean;
}
interface PluginState {
file: {
opts: {
filename: string; // Current file path
basename: string; // Current file basename
};
};
}
// AST Node types handled by the plugin
interface CallExpression {
type: "CallExpression";
callee: MemberExpression | Identifier;
arguments: ObjectExpression[];
}
interface ObjectExpression {
type: "ObjectExpression";
properties: ObjectProperty[];
}
interface ObjectProperty {
type: "ObjectProperty";
key: Identifier | Literal;
value: any;
}The plugin includes built-in safety mechanisms:
The plugin is designed to be safe and non-destructive, only adding displayName properties when it can safely infer appropriate names.