Use helper-builder-react-jsx inside plugin-transform-react-inline-elements (#6294)
* Use helper-builder-react-jsx inside plugin-transform-react-inline-elements. This avoids duplicating the logic for converting jsx elements to plain JavaScript. * Add a comment which explains the _jsx signature, [skip ci] so it is a little bit easier to understand what all those .splice() calls do
This commit is contained in:
committed by
Henry Zhu
parent
314bd31b85
commit
8aabbbc822
@@ -13,6 +13,10 @@ type ElementState = {
|
||||
};
|
||||
|
||||
require("babel-helper-builder-react-jsx")({
|
||||
filter: function (element: JSXElement) {
|
||||
// if returns false, the element isn't transformed
|
||||
},
|
||||
|
||||
pre: function (state: ElementState) {
|
||||
// called before building the element
|
||||
},
|
||||
|
||||
@@ -21,10 +21,10 @@ export default function(opts) {
|
||||
|
||||
visitor.JSXElement = {
|
||||
exit(path, file) {
|
||||
const callExpr = buildElementCall(path.get("openingElement"), file);
|
||||
|
||||
callExpr.arguments = callExpr.arguments.concat(path.node.children);
|
||||
path.replaceWith(t.inherits(callExpr, path.node));
|
||||
const callExpr = buildElementCall(path, file);
|
||||
if (callExpr) {
|
||||
path.replaceWith(t.inherits(callExpr, path.node));
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@@ -79,9 +79,15 @@ export default function(opts) {
|
||||
}
|
||||
|
||||
function buildElementCall(path, file) {
|
||||
path.parent.children = t.react.buildChildren(path.parent);
|
||||
if (opts.filter && !opts.filter(path.node, file)) return;
|
||||
|
||||
const tagExpr = convertJSXIdentifier(path.node.name, path.node);
|
||||
const openingPath = path.get("openingElement");
|
||||
openingPath.parent.children = t.react.buildChildren(openingPath.parent);
|
||||
|
||||
const tagExpr = convertJSXIdentifier(
|
||||
openingPath.node.name,
|
||||
openingPath.node,
|
||||
);
|
||||
const args = [];
|
||||
|
||||
let tagName;
|
||||
@@ -101,14 +107,14 @@ export default function(opts) {
|
||||
opts.pre(state, file);
|
||||
}
|
||||
|
||||
let attribs = path.node.attributes;
|
||||
let attribs = openingPath.node.attributes;
|
||||
if (attribs.length) {
|
||||
attribs = buildOpeningElementAttributes(attribs, file);
|
||||
} else {
|
||||
attribs = t.nullLiteral();
|
||||
}
|
||||
|
||||
args.push(attribs);
|
||||
args.push(attribs, ...path.node.children);
|
||||
|
||||
if (opts.post) {
|
||||
opts.post(state, file);
|
||||
|
||||
Reference in New Issue
Block a user