in packages/babel-plugin-fbt/src/fbt-nodes/FbtElementNode.js [300:350]
static createChildNode({
moduleName,
node,
}: {|
moduleName: JSModuleNameType,
node: BabelNodeExpression,
|}): FbtChildNode {
// Some of these modules may cause dependency cycles with the current one.
// So we must import them only on-demand rather than on initialization.
// Don't worry, require() calls are cached.
const FbtEnumNode = require('./FbtEnumNode');
const FbtImplicitParamNode = require('./FbtImplicitParamNode');
const FbtNameNode = require('./FbtNameNode');
const FbtParamNode = require('./FbtParamNode');
const FbtPluralNode = require('./FbtPluralNode');
const FbtPronounNode = require('./FbtPronounNode');
const FbtSameParamNode = require('./FbtSameParamNode');
const FbtTextNode = require('./FbtTextNode');
let fbtChildNode;
const fbtChildNodeClasses = [
FbtEnumNode,
FbtNameNode,
FbtParamNode,
FbtPluralNode,
FbtPronounNode,
FbtSameParamNode,
FbtTextNode,
];
for (const Constructor of fbtChildNodeClasses) {
fbtChildNode = Constructor.fromBabelNode({moduleName, node});
if (fbtChildNode != null) {
break;
}
}
// Try to convert to FbtImplicitParamNode as a last resort
if (fbtChildNode == null && isJSXElement(node)) {
// Later on, we should only allow non-fbt JSX elements here for auto-wrapping.
// fbt:param, fbt:pronoun, etc... should appear as children of it.
fbtChildNode = FbtImplicitParamNode.fromBabelNode({moduleName, node});
}
if (fbtChildNode != null) {
return fbtChildNode;
}
// TODO: T93968371 Refine error messages in FbtElementNode#createChildNode
throw errorAt(node, `${moduleName}: unsupported babel node: ${node.type}`);
}