in packages/babel-plugin-fbt/src/FbtUtil.js [465:519]
function expandStringConcat(
moduleName: string,
node: BabelNode,
): BabelNodeStringLiteral | BabelNodeJSXText {
if (isBinaryExpression(node)) {
if (node.operator !== '+') {
throw errorAt(
node,
`Expected concatenation operator (+) but got ${node.operator}`,
);
}
return stringLiteral(
expandStringConcat(moduleName, node.left).value +
expandStringConcat(moduleName, node.right).value,
);
} else if (isStringLiteral(node)) {
return node;
} else if (isJSXText(node)) {
return node;
} else if (isTemplateLiteral(node)) {
let string = '';
const expressions = node.expressions;
let index = 0;
for (const elem of node.quasis) {
if (elem.value.cooked) {
string += elem.value.cooked;
}
if (index < expressions.length) {
const expr = expressions[index++];
// fbt.param expressions are already transformed to StringLiteral
if (!isStringLiteral(expr)) {
throw errorAt(
node,
`${moduleName} template placeholders only accept params wrapped in ` +
`${moduleName}.param. Expected StringLiteral got ${expr.type}`,
);
}
string += expr.value;
}
}
return stringLiteral(string);
}
throw errorAt(
node,
`${moduleName} only accepts plain strings with params wrapped in ${moduleName}.param(...). ` +
`See the docs at https://facebook.github.io/fbt/ for more info. ` +
`Expected StringLiteral, TemplateLiteral, or concatenation; ` +
// $FlowExpectedError This BabelNode is unsupported so it may not even have a type property
`got "${node.type}"`,
);
}