babel-plugin-transform-react-stateless-component-name
Version:
A babel plugin to add name for default exported stateless components.
99 lines (75 loc) • 2.85 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _helper = require('./helper');
exports.default = function (_ref) {
var t = _ref.types;
return {
visitor: {
ExportDefaultDeclaration: function ExportDefaultDeclaration(path, _ref2) {
var opts = _ref2.file.opts;
var node = path.get('declaration');
var arrow = node.isArrowFunctionExpression();
if (!node.isArrowFunctionExpression() && !node.isFunctionDeclaration()) {
return;
}
if (!(0, _helper.doesReturnJSX)(node.get('body'))) {
return;
}
var _ref3 = node.node.id || {},
functionName = _ref3.name;
var _ref4 = arrow ? (0, _helper.getTypesFromFilename)(t, opts) : {
identifier: t.identifier(functionName),
name: functionName
},
identifier = _ref4.identifier,
name = _ref4.name;
// sets display name
node.node.id = identifier;
var _node$node = node.node,
body = _node$node.body,
id = _node$node.id,
params = _node$node.params;
// checks to see if we need to convert `export default function () {}`
var init = arrow ? node.node : t.functionExpression(id, params, body);
var variable = t.variableDeclaration('const', [t.variableDeclarator(identifier, init)]);
var assignment = (0, _helper.isDisplayNameSet)(path.getStatementParent(), name) ? undefined : (0, _helper.makeDisplayName)(t, name);
var exporter = t.exportDefaultDeclaration(identifier);
path.replaceWithMultiple([variable, assignment, exporter].filter(function (replacement) {
return !!replacement;
}));
},
JSXElement: function JSXElement(path) {
var parent = path.parentPath;
// avoids traversing assigning jsx to variable
if (!parent.isReturnStatement()) {
return;
}
var variable = path.find(function (node) {
return node.isVariableDeclarator() || node.isExportDefaultDeclaration() || node.isJSXExpressionContainer();
});
// Ignore JSX elements inside JSX expression blocks
if (t.isJSXExpressionContainer(variable)) {
return;
}
var name = function () {
try {
return variable.get('id.name').node;
} catch (errr) {
return undefined;
}
}();
if (name == null) {
return;
}
var statement = variable.getStatementParent();
// check to make sure we don't set displayName when already set
if ((0, _helper.isDisplayNameSet)(statement, name)) {
return;
}
statement.insertAfter((0, _helper.makeDisplayName)(t, name));
}
}
};
};