diff --git a/packages/babel-traverse/src/path/evaluation.js b/packages/babel-traverse/src/path/evaluation.js index 8fd8497926..46945f0083 100644 --- a/packages/babel-traverse/src/path/evaluation.js +++ b/packages/babel-traverse/src/path/evaluation.js @@ -89,25 +89,20 @@ function _evaluate(path, state) { } if (path.isTemplateLiteral()) { - let str = ""; + return evaluateQuasis(path, node.quasis, state); + } - let i = 0; - const exprs = path.get("expressions"); + if (path.isTaggedTemplateExpression() && path.get("tag").isMemberExpression()) { + const object = path.get("tag.object"); + const { node: { name } } = object; + const property = path.get("tag.property"); - for (const elem of (node.quasis: Array)) { - // not confident, evaluated an expression we don't like - if (!state.confident) break; - - // add on cooked element - str += elem.value.cooked; - - // add on interpolated expression if it's present - const expr = exprs[i++]; - if (expr) str += String(evaluateCached(expr, state)); + if ( + object.isIdentifier() && name === "String" && !path.scope.getBinding(name, true) && + property.isIdentifier && property.node.name === "raw" + ) { + return evaluateQuasis(path, node.quasi.quasis, state, true); } - - if (!state.confident) return; - return str; } if (path.isConditionalExpression()) { @@ -349,6 +344,28 @@ function _evaluate(path, state) { deopt(path, state); } +function evaluateQuasis (path, quasis: Array, state, raw = false) { + let str = ""; + + let i = 0; + const exprs = path.get("expressions"); + + for (const elem of quasis) { + // not confident, evaluated an expression we don't like + if (!state.confident) break; + + // add on element + str += raw ? elem.value.raw : elem.value.cooked; + + // add on interpolated expression if it's present + const expr = exprs[i++]; + if (expr) str += String(evaluateCached(expr, state)); + } + + if (!state.confident) return; + return str; +} + /** * Walk the input `node` and statically evaluate it. * diff --git a/packages/babel-traverse/test/evaluation.js b/packages/babel-traverse/test/evaluation.js index bbeb4f7461..056003fa5b 100644 --- a/packages/babel-traverse/test/evaluation.js +++ b/packages/babel-traverse/test/evaluation.js @@ -119,4 +119,16 @@ describe("evaluation", function () { assert.strictEqual(eval_undef.deopt.type, "VariableDeclarator"); assert.strictEqual(eval_undef.deopt.parentPath.node.kind, "let"); }); + + it("should work with String.raw", function () { + assert.strictEqual( + getPath("String.raw`\\d`").get("body")[0].evaluate().value, + "\\d" + ); + + assert.strictEqual( + getPath("`${String.raw`\\d`}`").get("body")[0].evaluate().value, + "\\d" + ); + }); });