@babel/traverse 7.1.0 → 7.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +1 -1
- package/lib/cache.js +27 -7
- package/lib/cache.js.map +1 -0
- package/lib/context.js +22 -59
- package/lib/context.js.map +1 -0
- package/lib/hub.js +2 -6
- package/lib/hub.js.map +1 -0
- package/lib/index.js +42 -77
- package/lib/index.js.map +1 -0
- package/lib/path/ancestry.js +15 -62
- package/lib/path/ancestry.js.map +1 -0
- package/lib/path/comments.js +31 -24
- package/lib/path/comments.js.map +1 -0
- package/lib/path/context.js +68 -91
- package/lib/path/context.js.map +1 -0
- package/lib/path/conversion.js +275 -273
- package/lib/path/conversion.js.map +1 -0
- package/lib/path/evaluation.js +84 -149
- package/lib/path/evaluation.js.map +1 -0
- package/lib/path/family.js +189 -94
- package/lib/path/family.js.map +1 -0
- package/lib/path/index.js +106 -132
- package/lib/path/index.js.map +1 -0
- package/lib/path/inference/index.js +81 -64
- package/lib/path/inference/index.js.map +1 -0
- package/lib/path/inference/inferer-reference.js +22 -52
- package/lib/path/inference/inferer-reference.js.map +1 -0
- package/lib/path/inference/inferers.js +110 -125
- package/lib/path/inference/inferers.js.map +1 -0
- package/lib/path/inference/util.js +30 -0
- package/lib/path/inference/util.js.map +1 -0
- package/lib/path/introspection.js +182 -168
- package/lib/path/introspection.js.map +1 -0
- package/lib/path/lib/hoister.js +37 -54
- package/lib/path/lib/hoister.js.map +1 -0
- package/lib/path/lib/removal-hooks.js +4 -4
- package/lib/path/lib/removal-hooks.js.map +1 -0
- package/lib/path/lib/virtual-types-validator.js +161 -0
- package/lib/path/lib/virtual-types-validator.js.map +1 -0
- package/lib/path/lib/virtual-types.js +21 -189
- package/lib/path/lib/virtual-types.js.map +1 -0
- package/lib/path/modification.js +103 -98
- package/lib/path/modification.js.map +1 -0
- package/lib/path/removal.js +18 -23
- package/lib/path/removal.js.map +1 -0
- package/lib/path/replacement.js +91 -144
- package/lib/path/replacement.js.map +1 -0
- package/lib/scope/binding.js +28 -16
- package/lib/scope/binding.js.map +1 -0
- package/lib/scope/index.js +407 -414
- package/lib/scope/index.js.map +1 -0
- package/lib/scope/lib/renamer.js +45 -70
- package/lib/scope/lib/renamer.js.map +1 -0
- package/lib/traverse-node.js +29 -0
- package/lib/traverse-node.js.map +1 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib/visitors.js +77 -113
- package/lib/visitors.js.map +1 -0
- package/package.json +28 -17
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_t","require","_helperEnvironmentVisitor","_helperFunctionName","_visitors","arrowFunctionExpression","assignmentExpression","binaryExpression","blockStatement","callExpression","conditionalExpression","expressionStatement","identifier","isIdentifier","jsxIdentifier","logicalExpression","LOGICAL_OPERATORS","memberExpression","metaProperty","numericLiteral","objectExpression","restElement","returnStatement","sequenceExpression","spreadElement","stringLiteral","super","_super","thisExpression","toExpression","unaryExpression","toComputedKey","key","isMemberExpression","node","property","isProperty","isMethod","ReferenceError","computed","name","ensureBlock","body","get","bodyNode","Array","isArray","Error","isBlockStatement","statements","stringPath","listKey","isStatement","push","isFunction","parentPath","setup","exports","arrowFunctionToShadowed","isArrowFunctionExpression","arrowFunctionToExpression","unwrapFunctionEnvironment","isFunctionExpression","isFunctionDeclaration","buildCodeFrameError","hoistFunctionEnvironment","setType","path","type","allowInsertArrow","allowInsertArrowWithRest","noNewArrows","_arguments$","arguments","specCompliant","thisBinding","fnPath","fn","checkBinding","scope","generateUidIdentifier","id","init","unshiftContainer","hub","addHelper","replaceWith","nameFunction","getSuperCallsVisitor","mergeVisitors","CallExpression","child","allSuperCalls","isSuper","environmentVisitor","arrowParent","thisEnvFn","findParent","p","_arrowParent","isProgram","isClassProperty","static","isClassPrivateProperty","inConstructor","isClassMethod","kind","thisPaths","argumentsPaths","newTargetPaths","superProps","superCalls","getScopeInformation","length","traverse","superBinding","getSuperBinding","forEach","superCall","callee","loc","argumentsBinding","getBinding","args","buildUndefinedNode","argumentsChild","argsRef","newTargetBinding","targetChild","targetRef","flatSuperProps","reduce","acc","superProp","concat","standardizeSuperProperty","superParentPath","isAssignment","isAssignmentExpression","left","isCall","isCallExpression","isTaggedTemplate","isTaggedTemplateExpression","tag","getSuperPropBinding","value","right","call","getThisBinding","hasSuperClass","thisChild","thisRef","isJSX","isLogicalOp","op","includes","operator","assignmentPath","slice","isLogicalAssignment","tmp","generateDeclaredUidIdentifier","object","rightExpression","isUpdateExpression","updateExpr","computedKey","parts","prefix","superClass","assignSuperThisVisitor","supers","has","add","replaceWithMultiple","WeakSet","argsBinding","propName","argsList","fnBody","method","unshift","valueIdent","cacheKey","data","getData","setData","getScopeInformationVisitor","ThisExpression","JSXIdentifier","isJSXMemberExpression","isJSXOpeningElement","MemberExpression","Identifier","isReferencedIdentifier","curr","hasOwnBinding","rename","parent","MetaProperty"],"sources":["../../src/path/conversion.ts"],"sourcesContent":["// This file contains methods that convert the path node into another node or some other type of data.\n\nimport {\n arrowFunctionExpression,\n assignmentExpression,\n binaryExpression,\n blockStatement,\n callExpression,\n conditionalExpression,\n expressionStatement,\n identifier,\n isIdentifier,\n jsxIdentifier,\n logicalExpression,\n LOGICAL_OPERATORS,\n memberExpression,\n metaProperty,\n numericLiteral,\n objectExpression,\n restElement,\n returnStatement,\n sequenceExpression,\n spreadElement,\n stringLiteral,\n super as _super,\n thisExpression,\n toExpression,\n unaryExpression,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport environmentVisitor from \"@babel/helper-environment-visitor\";\nimport nameFunction from \"@babel/helper-function-name\";\nimport { merge as mergeVisitors } from \"../visitors.ts\";\nimport type NodePath from \"./index.ts\";\n\nexport function toComputedKey(this: NodePath) {\n let key;\n if (this.isMemberExpression()) {\n key = this.node.property;\n } else if (this.isProperty() || this.isMethod()) {\n key = this.node.key;\n } else {\n throw new ReferenceError(\"todo\");\n }\n\n // @ts-expect-error todo(flow->ts) computed does not exist in ClassPrivateProperty\n if (!this.node.computed) {\n if (isIdentifier(key)) key = stringLiteral(key.name);\n }\n\n return key;\n}\n\nexport function ensureBlock(\n this: NodePath<\n t.Loop | t.WithStatement | t.Function | t.LabeledStatement | t.CatchClause\n >,\n) {\n const body = this.get(\"body\");\n const bodyNode = body.node;\n\n if (Array.isArray(body)) {\n throw new Error(\"Can't convert array path to a block statement\");\n }\n if (!bodyNode) {\n throw new Error(\"Can't convert node without a body\");\n }\n\n if (body.isBlockStatement()) {\n return bodyNode;\n }\n\n const statements: Array<t.Statement> = [];\n\n let stringPath = \"body\";\n let key;\n let listKey;\n if (body.isStatement()) {\n listKey = \"body\";\n key = 0;\n statements.push(body.node);\n } else {\n stringPath += \".body.0\";\n if (this.isFunction()) {\n key = \"argument\";\n statements.push(returnStatement(body.node as t.Expression));\n } else {\n key = \"expression\";\n statements.push(expressionStatement(body.node as t.Expression));\n }\n }\n\n this.node.body = blockStatement(statements);\n const parentPath = this.get(stringPath) as NodePath;\n body.setup(\n parentPath,\n listKey\n ? // @ts-expect-error listKey must present in parent path\n parentPath.node[listKey]\n : parentPath.node,\n listKey,\n key,\n );\n\n return this.node;\n}\n\nif (!process.env.BABEL_8_BREAKING && !USE_ESM) {\n /**\n * Keeping this for backward-compatibility. You should use arrowFunctionToExpression() for >=7.x.\n */\n // eslint-disable-next-line no-restricted-globals\n exports.arrowFunctionToShadowed = function (this: NodePath) {\n if (!this.isArrowFunctionExpression()) return;\n\n this.arrowFunctionToExpression();\n };\n}\n\n/**\n * Given an arbitrary function, process its content as if it were an arrow function, moving references\n * to \"this\", \"arguments\", \"super\", and such into the function's parent scope. This method is useful if\n * you have wrapped some set of items in an IIFE or other function, but want \"this\", \"arguments\", and super\"\n * to continue behaving as expected.\n */\nexport function unwrapFunctionEnvironment(this: NodePath) {\n if (\n !this.isArrowFunctionExpression() &&\n !this.isFunctionExpression() &&\n !this.isFunctionDeclaration()\n ) {\n throw this.buildCodeFrameError(\n \"Can only unwrap the environment of a function.\",\n );\n }\n\n hoistFunctionEnvironment(this);\n}\n\nfunction setType<N extends t.Node, T extends N[\"type\"]>(\n path: NodePath<N>,\n type: T,\n): asserts path is NodePath<Extract<N, { type: T }>> {\n path.node.type = type;\n}\n\n/**\n * Convert a given arrow function into a normal ES5 function expression.\n */\nexport function arrowFunctionToExpression(\n this: NodePath<t.ArrowFunctionExpression>,\n {\n allowInsertArrow = true,\n allowInsertArrowWithRest = allowInsertArrow,\n noNewArrows = process.env.BABEL_8_BREAKING\n ? // TODO(Babel 8): Consider defaulting to `false` for spec compliance\n true\n : !arguments[0]?.specCompliant,\n }: {\n allowInsertArrow?: boolean | void;\n allowInsertArrowWithRest?: boolean | void;\n noNewArrows?: boolean;\n } = {},\n): NodePath<\n Exclude<t.Function, t.Method | t.ArrowFunctionExpression> | t.CallExpression\n> {\n if (!this.isArrowFunctionExpression()) {\n throw (this as NodePath).buildCodeFrameError(\n \"Cannot convert non-arrow function to a function expression.\",\n );\n }\n\n const { thisBinding, fnPath: fn } = hoistFunctionEnvironment(\n this,\n noNewArrows,\n allowInsertArrow,\n allowInsertArrowWithRest,\n );\n\n // @ts-expect-error TS requires explicit fn type annotation\n fn.ensureBlock();\n setType(fn, \"FunctionExpression\");\n\n if (!noNewArrows) {\n const checkBinding = thisBinding\n ? null\n : fn.scope.generateUidIdentifier(\"arrowCheckId\");\n if (checkBinding) {\n fn.parentPath.scope.push({\n id: checkBinding,\n init: objectExpression([]),\n });\n }\n\n fn.get(\"body\").unshiftContainer(\n \"body\",\n expressionStatement(\n callExpression(this.hub.addHelper(\"newArrowCheck\"), [\n thisExpression(),\n checkBinding\n ? identifier(checkBinding.name)\n : identifier(thisBinding),\n ]),\n ),\n );\n\n fn.replaceWith(\n callExpression(\n memberExpression(\n // @ts-expect-error TS can't infer nameFunction returns CallExpression | ArrowFunctionExpression here\n nameFunction(this, true) || fn.node,\n identifier(\"bind\"),\n ),\n [checkBinding ? identifier(checkBinding.name) : thisExpression()],\n ),\n );\n\n return fn.get(\"callee.object\");\n }\n\n return fn;\n}\n\nconst getSuperCallsVisitor = mergeVisitors<{\n allSuperCalls: NodePath<t.CallExpression>[];\n}>([\n {\n CallExpression(child, { allSuperCalls }) {\n if (!child.get(\"callee\").isSuper()) return;\n allSuperCalls.push(child);\n },\n },\n environmentVisitor,\n]);\n\n/**\n * Given a function, traverse its contents, and if there are references to \"this\", \"arguments\", \"super\",\n * or \"new.target\", ensure that these references reference the parent environment around this function.\n *\n * @returns `thisBinding`: the name of the injected reference to `this`; for example \"_this\"\n * @returns `fnPath`: the new path to the function node. This is different from the fnPath\n * parameter when the function node is wrapped in another node.\n */\nfunction hoistFunctionEnvironment(\n fnPath: NodePath<t.Function>,\n // TODO(Babel 8): Consider defaulting to `false` for spec compliance\n noNewArrows: boolean | void = true,\n allowInsertArrow: boolean | void = true,\n allowInsertArrowWithRest: boolean | void = true,\n): { thisBinding: string; fnPath: NodePath<t.Function> } {\n let arrowParent;\n let thisEnvFn: NodePath<t.Function> = fnPath.findParent(p => {\n if (p.isArrowFunctionExpression()) {\n arrowParent ??= p;\n return false;\n }\n return (\n p.isFunction() ||\n p.isProgram() ||\n p.isClassProperty({ static: false }) ||\n p.isClassPrivateProperty({ static: false })\n );\n }) as NodePath<t.Function>;\n const inConstructor = thisEnvFn.isClassMethod({ kind: \"constructor\" });\n\n if (thisEnvFn.isClassProperty() || thisEnvFn.isClassPrivateProperty()) {\n if (arrowParent) {\n thisEnvFn = arrowParent;\n } else if (allowInsertArrow) {\n // It's safe to wrap this function in another and not hoist to the\n // top level because the 'this' binding is constant in class\n // properties (since 'super()' has already been called), so we don't\n // need to capture/reassign it at the top level.\n fnPath.replaceWith(\n callExpression(\n arrowFunctionExpression([], toExpression(fnPath.node)),\n [],\n ),\n );\n thisEnvFn = fnPath.get(\"callee\") as NodePath<t.ArrowFunctionExpression>;\n fnPath = thisEnvFn.get(\"body\") as NodePath<t.FunctionExpression>;\n } else {\n throw fnPath.buildCodeFrameError(\n \"Unable to transform arrow inside class property\",\n );\n }\n }\n\n const { thisPaths, argumentsPaths, newTargetPaths, superProps, superCalls } =\n getScopeInformation(fnPath);\n\n // Convert all super() calls in the constructor, if super is used in an arrow.\n if (inConstructor && superCalls.length > 0) {\n if (!allowInsertArrow) {\n throw superCalls[0].buildCodeFrameError(\n \"When using '@babel/plugin-transform-arrow-functions', \" +\n \"it's not possible to compile `super()` in an arrow function without compiling classes.\\n\" +\n \"Please add '@babel/plugin-transform-classes' to your Babel configuration.\",\n );\n }\n if (!allowInsertArrowWithRest) {\n // preset-env with target `since 2017` enables `transform-parameters` without `transform-classes`.\n throw superCalls[0].buildCodeFrameError(\n \"When using '@babel/plugin-transform-parameters', \" +\n \"it's not possible to compile `super()` in an arrow function with default or rest parameters without compiling classes.\\n\" +\n \"Please add '@babel/plugin-transform-classes' to your Babel configuration.\",\n );\n }\n const allSuperCalls: NodePath<t.CallExpression>[] = [];\n thisEnvFn.traverse(getSuperCallsVisitor, { allSuperCalls });\n const superBinding = getSuperBinding(thisEnvFn);\n allSuperCalls.forEach(superCall => {\n const callee = identifier(superBinding);\n callee.loc = superCall.node.callee.loc;\n\n superCall.get(\"callee\").replaceWith(callee);\n });\n }\n\n // Convert all \"arguments\" references in the arrow to point at the alias.\n if (argumentsPaths.length > 0) {\n const argumentsBinding = getBinding(thisEnvFn, \"arguments\", () => {\n const args = () => identifier(\"arguments\");\n if (thisEnvFn.scope.path.isProgram()) {\n return conditionalExpression(\n binaryExpression(\n \"===\",\n unaryExpression(\"typeof\", args()),\n stringLiteral(\"undefined\"),\n ),\n thisEnvFn.scope.buildUndefinedNode(),\n args(),\n );\n } else {\n return args();\n }\n });\n\n argumentsPaths.forEach(argumentsChild => {\n const argsRef = identifier(argumentsBinding);\n argsRef.loc = argumentsChild.node.loc;\n\n argumentsChild.replaceWith(argsRef);\n });\n }\n\n // Convert all \"new.target\" references in the arrow to point at the alias.\n if (newTargetPaths.length > 0) {\n const newTargetBinding = getBinding(thisEnvFn, \"newtarget\", () =>\n metaProperty(identifier(\"new\"), identifier(\"target\")),\n );\n\n newTargetPaths.forEach(targetChild => {\n const targetRef = identifier(newTargetBinding);\n targetRef.loc = targetChild.node.loc;\n\n targetChild.replaceWith(targetRef);\n });\n }\n\n // Convert all \"super.prop\" references to point at aliases.\n if (superProps.length > 0) {\n if (!allowInsertArrow) {\n throw superProps[0].buildCodeFrameError(\n \"When using '@babel/plugin-transform-arrow-functions', \" +\n \"it's not possible to compile `super.prop` in an arrow function without compiling classes.\\n\" +\n \"Please add '@babel/plugin-transform-classes' to your Babel configuration.\",\n );\n }\n\n const flatSuperProps: NodePath<t.MemberExpression>[] = superProps.reduce(\n (acc, superProp) => acc.concat(standardizeSuperProperty(superProp)),\n [],\n );\n\n flatSuperProps.forEach(superProp => {\n const key = superProp.node.computed\n ? \"\"\n : // @ts-expect-error super property must not contain private name\n superProp.get(\"property\").node.name;\n\n const superParentPath = superProp.parentPath;\n\n const isAssignment = superParentPath.isAssignmentExpression({\n left: superProp.node,\n });\n const isCall = superParentPath.isCallExpression({\n callee: superProp.node,\n });\n const isTaggedTemplate = superParentPath.isTaggedTemplateExpression({\n tag: superProp.node,\n });\n const superBinding = getSuperPropBinding(thisEnvFn, isAssignment, key);\n\n const args: t.Expression[] = [];\n if (superProp.node.computed) {\n // SuperProperty must not be a private name\n args.push(superProp.get(\"property\").node as t.Expression);\n }\n\n if (isAssignment) {\n const value = superParentPath.node.right;\n args.push(value);\n }\n\n const call = callExpression(identifier(superBinding), args);\n\n if (isCall) {\n superParentPath.unshiftContainer(\"arguments\", thisExpression());\n superProp.replaceWith(memberExpression(call, identifier(\"call\")));\n\n thisPaths.push(\n superParentPath.get(\"arguments.0\") as NodePath<t.ThisExpression>,\n );\n } else if (isAssignment) {\n // Replace not only the super.prop, but the whole assignment\n superParentPath.replaceWith(call);\n } else if (isTaggedTemplate) {\n superProp.replaceWith(\n callExpression(memberExpression(call, identifier(\"bind\"), false), [\n thisExpression(),\n ]),\n );\n\n thisPaths.push(\n superProp.get(\"arguments.0\") as NodePath<t.ThisExpression>,\n );\n } else {\n superProp.replaceWith(call);\n }\n });\n }\n\n // Convert all \"this\" references in the arrow to point at the alias.\n let thisBinding: string | null;\n if (thisPaths.length > 0 || !noNewArrows) {\n thisBinding = getThisBinding(thisEnvFn, inConstructor);\n\n if (\n noNewArrows ||\n // In subclass constructors, still need to rewrite because \"this\" can't be bound in spec mode\n // because it might not have been initialized yet.\n (inConstructor && hasSuperClass(thisEnvFn))\n ) {\n thisPaths.forEach(thisChild => {\n const thisRef = thisChild.isJSX()\n ? jsxIdentifier(thisBinding)\n : identifier(thisBinding);\n\n thisRef.loc = thisChild.node.loc;\n thisChild.replaceWith(thisRef);\n });\n\n if (!noNewArrows) thisBinding = null;\n }\n }\n\n return { thisBinding, fnPath };\n}\n\ntype LogicalOp = Parameters<typeof logicalExpression>[0];\ntype BinaryOp = Parameters<typeof binaryExpression>[0];\n\nfunction isLogicalOp(op: string): op is LogicalOp {\n return LOGICAL_OPERATORS.includes(op);\n}\n\nfunction standardizeSuperProperty(\n superProp: NodePath<t.MemberExpression>,\n):\n | [NodePath<t.MemberExpression>]\n | [NodePath<t.MemberExpression>, NodePath<t.MemberExpression>] {\n if (\n superProp.parentPath.isAssignmentExpression() &&\n superProp.parentPath.node.operator !== \"=\"\n ) {\n const assignmentPath = superProp.parentPath;\n\n const op = assignmentPath.node.operator.slice(0, -1) as\n | LogicalOp\n | BinaryOp;\n\n const value = assignmentPath.node.right;\n\n const isLogicalAssignment = isLogicalOp(op);\n\n if (superProp.node.computed) {\n // from: super[foo] **= 4;\n // to: super[tmp = foo] = super[tmp] ** 4;\n\n // from: super[foo] ??= 4;\n // to: super[tmp = foo] ?? super[tmp] = 4;\n\n const tmp = superProp.scope.generateDeclaredUidIdentifier(\"tmp\");\n\n const object = superProp.node.object;\n const property = superProp.node.property as t.Expression;\n\n assignmentPath\n .get(\"left\")\n .replaceWith(\n memberExpression(\n object,\n assignmentExpression(\"=\", tmp, property),\n true /* computed */,\n ),\n );\n\n assignmentPath\n .get(\"right\")\n .replaceWith(\n rightExpression(\n isLogicalAssignment ? \"=\" : op,\n memberExpression(object, identifier(tmp.name), true /* computed */),\n value,\n ),\n );\n } else {\n // from: super.foo **= 4;\n // to: super.foo = super.foo ** 4;\n\n // from: super.foo ??= 4;\n // to: super.foo ?? super.foo = 4;\n\n const object = superProp.node.object;\n const property = superProp.node.property as t.Identifier;\n\n assignmentPath\n .get(\"left\")\n .replaceWith(memberExpression(object, property));\n\n assignmentPath\n .get(\"right\")\n .replaceWith(\n rightExpression(\n isLogicalAssignment ? \"=\" : op,\n memberExpression(object, identifier(property.name)),\n value,\n ),\n );\n }\n\n if (isLogicalAssignment) {\n assignmentPath.replaceWith(\n logicalExpression(\n op,\n assignmentPath.node.left as t.MemberExpression,\n assignmentPath.node.right,\n ),\n );\n } else {\n assignmentPath.node.operator = \"=\";\n }\n\n return [\n assignmentPath.get(\"left\") as NodePath<t.MemberExpression>,\n assignmentPath.get(\"right\").get(\"left\"),\n ];\n } else if (superProp.parentPath.isUpdateExpression()) {\n const updateExpr = superProp.parentPath;\n\n const tmp = superProp.scope.generateDeclaredUidIdentifier(\"tmp\");\n const computedKey = superProp.node.computed\n ? superProp.scope.generateDeclaredUidIdentifier(\"prop\")\n : null;\n\n const parts: t.Expression[] = [\n assignmentExpression(\n \"=\",\n tmp,\n memberExpression(\n superProp.node.object,\n computedKey\n ? assignmentExpression(\n \"=\",\n computedKey,\n superProp.node.property as t.Expression,\n )\n : superProp.node.property,\n superProp.node.computed,\n ),\n ),\n assignmentExpression(\n \"=\",\n memberExpression(\n superProp.node.object,\n computedKey ? identifier(computedKey.name) : superProp.node.property,\n superProp.node.computed,\n ),\n binaryExpression(\n // map `++` to `+`, and `--` to `-`\n superProp.parentPath.node.operator[0] as \"+\" | \"-\",\n identifier(tmp.name),\n numericLiteral(1),\n ),\n ),\n ];\n\n if (!superProp.parentPath.node.prefix) {\n parts.push(identifier(tmp.name));\n }\n\n updateExpr.replaceWith(sequenceExpression(parts));\n\n const left = updateExpr.get(\n \"expressions.0.right\",\n ) as NodePath<t.MemberExpression>;\n const right = updateExpr.get(\n \"expressions.1.left\",\n ) as NodePath<t.MemberExpression>;\n return [left, right];\n }\n\n return [superProp];\n\n function rightExpression(\n op: BinaryOp | \"=\",\n left: t.MemberExpression,\n right: t.Expression,\n ) {\n if (op === \"=\") {\n return assignmentExpression(\"=\", left, right);\n } else {\n return binaryExpression(op, left, right);\n }\n }\n}\n\nfunction hasSuperClass(thisEnvFn: NodePath<t.Function>) {\n return (\n thisEnvFn.isClassMethod() &&\n !!(thisEnvFn.parentPath.parentPath.node as t.Class).superClass\n );\n}\n\nconst assignSuperThisVisitor = mergeVisitors<{\n supers: WeakSet<t.CallExpression>;\n thisBinding: string;\n}>([\n {\n CallExpression(child, { supers, thisBinding }) {\n if (!child.get(\"callee\").isSuper()) return;\n if (supers.has(child.node)) return;\n supers.add(child.node);\n\n child.replaceWithMultiple([\n child.node,\n assignmentExpression(\"=\", identifier(thisBinding), identifier(\"this\")),\n ]);\n },\n },\n environmentVisitor,\n]);\n\n// Create a binding that evaluates to the \"this\" of the given function.\nfunction getThisBinding(\n thisEnvFn: NodePath<t.Function>,\n inConstructor: boolean,\n) {\n return getBinding(thisEnvFn, \"this\", thisBinding => {\n if (!inConstructor || !hasSuperClass(thisEnvFn)) return thisExpression();\n\n thisEnvFn.traverse(assignSuperThisVisitor, {\n supers: new WeakSet(),\n thisBinding,\n });\n });\n}\n\n// Create a binding for a function that will call \"super()\" with arguments passed through.\nfunction getSuperBinding(thisEnvFn: NodePath<t.Function>) {\n return getBinding(thisEnvFn, \"supercall\", () => {\n const argsBinding = thisEnvFn.scope.generateUidIdentifier(\"args\");\n return arrowFunctionExpression(\n [restElement(argsBinding)],\n callExpression(_super(), [spreadElement(identifier(argsBinding.name))]),\n );\n });\n}\n\n// Create a binding for a function that will call \"super.foo\" or \"super[foo]\".\nfunction getSuperPropBinding(\n thisEnvFn: NodePath<t.Function>,\n isAssignment: boolean,\n propName: string,\n) {\n const op = isAssignment ? \"set\" : \"get\";\n\n return getBinding(thisEnvFn, `superprop_${op}:${propName || \"\"}`, () => {\n const argsList = [];\n\n let fnBody;\n if (propName) {\n // () => super.foo\n fnBody = memberExpression(_super(), identifier(propName));\n } else {\n const method = thisEnvFn.scope.generateUidIdentifier(\"prop\");\n // (method) => super[method]\n argsList.unshift(method);\n fnBody = memberExpression(\n _super(),\n identifier(method.name),\n true /* computed */,\n );\n }\n\n if (isAssignment) {\n const valueIdent = thisEnvFn.scope.generateUidIdentifier(\"value\");\n argsList.push(valueIdent);\n\n fnBody = assignmentExpression(\"=\", fnBody, identifier(valueIdent.name));\n }\n\n return arrowFunctionExpression(argsList, fnBody);\n });\n}\n\nfunction getBinding(\n thisEnvFn: NodePath,\n key: string,\n init: (name: string) => t.Expression,\n) {\n const cacheKey = \"binding:\" + key;\n let data: string | undefined = thisEnvFn.getData(cacheKey);\n if (!data) {\n const id = thisEnvFn.scope.generateUidIdentifier(key);\n data = id.name;\n thisEnvFn.setData(cacheKey, data);\n\n thisEnvFn.scope.push({\n id: id,\n init: init(data),\n });\n }\n\n return data;\n}\n\ntype ScopeInfo = {\n thisPaths: NodePath<t.ThisExpression | t.JSXIdentifier>[];\n superCalls: NodePath<t.CallExpression>[];\n superProps: NodePath<t.MemberExpression>[];\n argumentsPaths: NodePath<t.Identifier | t.JSXIdentifier>[];\n newTargetPaths: NodePath<t.MetaProperty>[];\n};\n\nconst getScopeInformationVisitor = mergeVisitors<ScopeInfo>([\n {\n ThisExpression(child, { thisPaths }) {\n thisPaths.push(child);\n },\n JSXIdentifier(child, { thisPaths }) {\n if (child.node.name !== \"this\") return;\n if (\n !child.parentPath.isJSXMemberExpression({ object: child.node }) &&\n !child.parentPath.isJSXOpeningElement({ name: child.node })\n ) {\n return;\n }\n\n thisPaths.push(child);\n },\n CallExpression(child, { superCalls }) {\n if (child.get(\"callee\").isSuper()) superCalls.push(child);\n },\n MemberExpression(child, { superProps }) {\n if (child.get(\"object\").isSuper()) superProps.push(child);\n },\n Identifier(child, { argumentsPaths }) {\n if (!child.isReferencedIdentifier({ name: \"arguments\" })) return;\n\n let curr = child.scope;\n do {\n if (curr.hasOwnBinding(\"arguments\")) {\n curr.rename(\"arguments\");\n return;\n }\n if (curr.path.isFunction() && !curr.path.isArrowFunctionExpression()) {\n break;\n }\n } while ((curr = curr.parent));\n\n argumentsPaths.push(child);\n },\n MetaProperty(child, { newTargetPaths }) {\n if (!child.get(\"meta\").isIdentifier({ name: \"new\" })) return;\n if (!child.get(\"property\").isIdentifier({ name: \"target\" })) return;\n\n newTargetPaths.push(child);\n },\n },\n environmentVisitor,\n]);\n\nfunction getScopeInformation(fnPath: NodePath) {\n const thisPaths: ScopeInfo[\"thisPaths\"] = [];\n const argumentsPaths: ScopeInfo[\"argumentsPaths\"] = [];\n const newTargetPaths: ScopeInfo[\"newTargetPaths\"] = [];\n const superProps: ScopeInfo[\"superProps\"] = [];\n const superCalls: ScopeInfo[\"superCalls\"] = [];\n\n fnPath.traverse(getScopeInformationVisitor, {\n thisPaths,\n argumentsPaths,\n newTargetPaths,\n superProps,\n superCalls,\n });\n\n return {\n thisPaths,\n argumentsPaths,\n newTargetPaths,\n superProps,\n superCalls,\n };\n}\n"],"mappings":"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"}
|
package/lib/path/evaluation.js
CHANGED
@@ -3,22 +3,30 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.evaluateTruthy = evaluateTruthy;
|
7
6
|
exports.evaluate = evaluate;
|
8
|
-
|
7
|
+
exports.evaluateTruthy = evaluateTruthy;
|
8
|
+
const VALID_OBJECT_CALLEES = ["Number", "String", "Math"];
|
9
|
+
const VALID_IDENTIFIER_CALLEES = ["isFinite", "isNaN", "parseFloat", "parseInt", "decodeURI", "decodeURIComponent", "encodeURI", "encodeURIComponent", null, null];
|
9
10
|
const INVALID_METHODS = ["random"];
|
10
|
-
|
11
|
+
function isValidObjectCallee(val) {
|
12
|
+
return VALID_OBJECT_CALLEES.includes(val);
|
13
|
+
}
|
14
|
+
function isValidIdentifierCallee(val) {
|
15
|
+
return VALID_IDENTIFIER_CALLEES.includes(val);
|
16
|
+
}
|
17
|
+
function isInvalidMethod(val) {
|
18
|
+
return INVALID_METHODS.includes(val);
|
19
|
+
}
|
11
20
|
function evaluateTruthy() {
|
12
21
|
const res = this.evaluate();
|
13
22
|
if (res.confident) return !!res.value;
|
14
23
|
}
|
15
|
-
|
16
24
|
function deopt(path, state) {
|
17
25
|
if (!state.confident) return;
|
18
26
|
state.deoptPath = path;
|
19
27
|
state.confident = false;
|
20
28
|
}
|
21
|
-
|
29
|
+
const Globals = new Map([["undefined", undefined], ["Infinity", Infinity], ["NaN", NaN]]);
|
22
30
|
function evaluateCached(path, state) {
|
23
31
|
const {
|
24
32
|
node
|
@@ -26,10 +34,8 @@ function evaluateCached(path, state) {
|
|
26
34
|
const {
|
27
35
|
seen
|
28
36
|
} = state;
|
29
|
-
|
30
37
|
if (seen.has(node)) {
|
31
38
|
const existing = seen.get(node);
|
32
|
-
|
33
39
|
if (existing.resolved) {
|
34
40
|
return existing.value;
|
35
41
|
} else {
|
@@ -41,41 +47,29 @@ function evaluateCached(path, state) {
|
|
41
47
|
resolved: false
|
42
48
|
};
|
43
49
|
seen.set(node, item);
|
44
|
-
|
45
50
|
const val = _evaluate(path, state);
|
46
|
-
|
47
51
|
if (state.confident) {
|
48
52
|
item.resolved = true;
|
49
53
|
item.value = val;
|
50
54
|
}
|
51
|
-
|
52
55
|
return val;
|
53
56
|
}
|
54
57
|
}
|
55
|
-
|
56
58
|
function _evaluate(path, state) {
|
57
59
|
if (!state.confident) return;
|
58
|
-
const {
|
59
|
-
node
|
60
|
-
} = path;
|
61
|
-
|
62
60
|
if (path.isSequenceExpression()) {
|
63
61
|
const exprs = path.get("expressions");
|
64
62
|
return evaluateCached(exprs[exprs.length - 1], state);
|
65
63
|
}
|
66
|
-
|
67
64
|
if (path.isStringLiteral() || path.isNumericLiteral() || path.isBooleanLiteral()) {
|
68
|
-
return node.value;
|
65
|
+
return path.node.value;
|
69
66
|
}
|
70
|
-
|
71
67
|
if (path.isNullLiteral()) {
|
72
68
|
return null;
|
73
69
|
}
|
74
|
-
|
75
70
|
if (path.isTemplateLiteral()) {
|
76
|
-
return evaluateQuasis(path, node.quasis, state);
|
71
|
+
return evaluateQuasis(path, path.node.quasis, state);
|
77
72
|
}
|
78
|
-
|
79
73
|
if (path.isTaggedTemplateExpression() && path.get("tag").isMemberExpression()) {
|
80
74
|
const object = path.get("tag.object");
|
81
75
|
const {
|
@@ -84,166 +78,141 @@ function _evaluate(path, state) {
|
|
84
78
|
}
|
85
79
|
} = object;
|
86
80
|
const property = path.get("tag.property");
|
87
|
-
|
88
|
-
|
89
|
-
return evaluateQuasis(path, node.quasi.quasis, state, true);
|
81
|
+
if (object.isIdentifier() && name === "String" && !path.scope.getBinding(name) && property.isIdentifier() && property.node.name === "raw") {
|
82
|
+
return evaluateQuasis(path, path.node.quasi.quasis, state, true);
|
90
83
|
}
|
91
84
|
}
|
92
|
-
|
93
85
|
if (path.isConditionalExpression()) {
|
94
86
|
const testResult = evaluateCached(path.get("test"), state);
|
95
87
|
if (!state.confident) return;
|
96
|
-
|
97
88
|
if (testResult) {
|
98
89
|
return evaluateCached(path.get("consequent"), state);
|
99
90
|
} else {
|
100
91
|
return evaluateCached(path.get("alternate"), state);
|
101
92
|
}
|
102
93
|
}
|
103
|
-
|
104
94
|
if (path.isExpressionWrapper()) {
|
105
95
|
return evaluateCached(path.get("expression"), state);
|
106
96
|
}
|
107
|
-
|
108
97
|
if (path.isMemberExpression() && !path.parentPath.isCallExpression({
|
109
|
-
callee: node
|
98
|
+
callee: path.node
|
110
99
|
})) {
|
111
100
|
const property = path.get("property");
|
112
101
|
const object = path.get("object");
|
113
|
-
|
114
|
-
if (object.isLiteral() && property.isIdentifier()) {
|
102
|
+
if (object.isLiteral()) {
|
115
103
|
const value = object.node.value;
|
116
104
|
const type = typeof value;
|
117
|
-
|
118
|
-
if (
|
119
|
-
|
105
|
+
let key = null;
|
106
|
+
if (path.node.computed) {
|
107
|
+
key = evaluateCached(property, state);
|
108
|
+
if (!state.confident) return;
|
109
|
+
} else if (property.isIdentifier()) {
|
110
|
+
key = property.node.name;
|
111
|
+
}
|
112
|
+
if ((type === "number" || type === "string") && key != null && (typeof key === "number" || typeof key === "string")) {
|
113
|
+
return value[key];
|
120
114
|
}
|
121
115
|
}
|
122
116
|
}
|
123
|
-
|
124
117
|
if (path.isReferencedIdentifier()) {
|
125
|
-
const binding = path.scope.getBinding(node.name);
|
126
|
-
|
127
|
-
|
128
|
-
|
118
|
+
const binding = path.scope.getBinding(path.node.name);
|
119
|
+
if (binding) {
|
120
|
+
if (binding.constantViolations.length > 0 || path.node.start < binding.path.node.end) {
|
121
|
+
deopt(binding.path, state);
|
122
|
+
return;
|
123
|
+
}
|
124
|
+
if (binding.hasValue) {
|
125
|
+
return binding.value;
|
126
|
+
}
|
129
127
|
}
|
130
|
-
|
131
|
-
if (
|
132
|
-
|
128
|
+
const name = path.node.name;
|
129
|
+
if (Globals.has(name)) {
|
130
|
+
if (!binding) {
|
131
|
+
return Globals.get(name);
|
132
|
+
}
|
133
|
+
deopt(binding.path, state);
|
134
|
+
return;
|
133
135
|
}
|
134
|
-
|
135
|
-
if (
|
136
|
-
|
136
|
+
const resolved = path.resolve();
|
137
|
+
if (resolved === path) {
|
138
|
+
deopt(path, state);
|
139
|
+
return;
|
137
140
|
} else {
|
138
|
-
|
139
|
-
return binding ? deopt(binding.path, state) : undefined;
|
140
|
-
} else if (node.name === "Infinity") {
|
141
|
-
return binding ? deopt(binding.path, state) : Infinity;
|
142
|
-
} else if (node.name === "NaN") {
|
143
|
-
return binding ? deopt(binding.path, state) : NaN;
|
144
|
-
}
|
145
|
-
|
146
|
-
const resolved = path.resolve();
|
147
|
-
|
148
|
-
if (resolved === path) {
|
149
|
-
return deopt(path, state);
|
150
|
-
} else {
|
151
|
-
return evaluateCached(resolved, state);
|
152
|
-
}
|
141
|
+
return evaluateCached(resolved, state);
|
153
142
|
}
|
154
143
|
}
|
155
|
-
|
156
144
|
if (path.isUnaryExpression({
|
157
145
|
prefix: true
|
158
146
|
})) {
|
159
|
-
if (node.operator === "void") {
|
147
|
+
if (path.node.operator === "void") {
|
160
148
|
return undefined;
|
161
149
|
}
|
162
|
-
|
163
150
|
const argument = path.get("argument");
|
164
|
-
|
165
|
-
if (node.operator === "typeof" && (argument.isFunction() || argument.isClass())) {
|
151
|
+
if (path.node.operator === "typeof" && (argument.isFunction() || argument.isClass())) {
|
166
152
|
return "function";
|
167
153
|
}
|
168
|
-
|
169
154
|
const arg = evaluateCached(argument, state);
|
170
155
|
if (!state.confident) return;
|
171
|
-
|
172
|
-
switch (node.operator) {
|
156
|
+
switch (path.node.operator) {
|
173
157
|
case "!":
|
174
158
|
return !arg;
|
175
|
-
|
176
159
|
case "+":
|
177
160
|
return +arg;
|
178
|
-
|
179
161
|
case "-":
|
180
162
|
return -arg;
|
181
|
-
|
182
163
|
case "~":
|
183
164
|
return ~arg;
|
184
|
-
|
185
165
|
case "typeof":
|
186
166
|
return typeof arg;
|
187
167
|
}
|
188
168
|
}
|
189
|
-
|
190
169
|
if (path.isArrayExpression()) {
|
191
170
|
const arr = [];
|
192
171
|
const elems = path.get("elements");
|
193
|
-
|
194
172
|
for (const elem of elems) {
|
195
173
|
const elemValue = elem.evaluate();
|
196
|
-
|
197
174
|
if (elemValue.confident) {
|
198
175
|
arr.push(elemValue.value);
|
199
176
|
} else {
|
200
|
-
|
177
|
+
deopt(elemValue.deopt, state);
|
178
|
+
return;
|
201
179
|
}
|
202
180
|
}
|
203
|
-
|
204
181
|
return arr;
|
205
182
|
}
|
206
|
-
|
207
183
|
if (path.isObjectExpression()) {
|
208
184
|
const obj = {};
|
209
185
|
const props = path.get("properties");
|
210
|
-
|
211
186
|
for (const prop of props) {
|
212
187
|
if (prop.isObjectMethod() || prop.isSpreadElement()) {
|
213
|
-
|
188
|
+
deopt(prop, state);
|
189
|
+
return;
|
214
190
|
}
|
215
|
-
|
216
191
|
const keyPath = prop.get("key");
|
217
|
-
let key
|
218
|
-
|
192
|
+
let key;
|
219
193
|
if (prop.node.computed) {
|
220
|
-
key =
|
221
|
-
|
194
|
+
key = keyPath.evaluate();
|
222
195
|
if (!key.confident) {
|
223
|
-
|
196
|
+
deopt(key.deopt, state);
|
197
|
+
return;
|
224
198
|
}
|
225
|
-
|
226
199
|
key = key.value;
|
227
|
-
} else if (
|
228
|
-
key =
|
200
|
+
} else if (keyPath.isIdentifier()) {
|
201
|
+
key = keyPath.node.name;
|
229
202
|
} else {
|
230
|
-
key =
|
203
|
+
key = keyPath.node.value;
|
231
204
|
}
|
232
|
-
|
233
205
|
const valuePath = prop.get("value");
|
234
206
|
let value = valuePath.evaluate();
|
235
|
-
|
236
207
|
if (!value.confident) {
|
237
|
-
|
208
|
+
deopt(value.deopt, state);
|
209
|
+
return;
|
238
210
|
}
|
239
|
-
|
240
211
|
value = value.value;
|
241
212
|
obj[key] = value;
|
242
213
|
}
|
243
|
-
|
244
214
|
return obj;
|
245
215
|
}
|
246
|
-
|
247
216
|
if (path.isLogicalExpression()) {
|
248
217
|
const wasConfident = state.confident;
|
249
218
|
const left = evaluateCached(path.get("left"), state);
|
@@ -251,151 +220,115 @@ function _evaluate(path, state) {
|
|
251
220
|
state.confident = wasConfident;
|
252
221
|
const right = evaluateCached(path.get("right"), state);
|
253
222
|
const rightConfident = state.confident;
|
254
|
-
|
255
|
-
|
256
|
-
switch (node.operator) {
|
223
|
+
switch (path.node.operator) {
|
257
224
|
case "||":
|
258
|
-
|
259
|
-
state.confident = true;
|
260
|
-
return left;
|
261
|
-
}
|
262
|
-
|
225
|
+
state.confident = leftConfident && (!!left || rightConfident);
|
263
226
|
if (!state.confident) return;
|
264
227
|
return left || right;
|
265
|
-
|
266
228
|
case "&&":
|
267
|
-
|
268
|
-
state.confident = true;
|
269
|
-
}
|
270
|
-
|
229
|
+
state.confident = leftConfident && (!left || rightConfident);
|
271
230
|
if (!state.confident) return;
|
272
231
|
return left && right;
|
232
|
+
case "??":
|
233
|
+
state.confident = leftConfident && (left != null || rightConfident);
|
234
|
+
if (!state.confident) return;
|
235
|
+
return left != null ? left : right;
|
273
236
|
}
|
274
237
|
}
|
275
|
-
|
276
238
|
if (path.isBinaryExpression()) {
|
277
239
|
const left = evaluateCached(path.get("left"), state);
|
278
240
|
if (!state.confident) return;
|
279
241
|
const right = evaluateCached(path.get("right"), state);
|
280
242
|
if (!state.confident) return;
|
281
|
-
|
282
|
-
switch (node.operator) {
|
243
|
+
switch (path.node.operator) {
|
283
244
|
case "-":
|
284
245
|
return left - right;
|
285
|
-
|
286
246
|
case "+":
|
287
247
|
return left + right;
|
288
|
-
|
289
248
|
case "/":
|
290
249
|
return left / right;
|
291
|
-
|
292
250
|
case "*":
|
293
251
|
return left * right;
|
294
|
-
|
295
252
|
case "%":
|
296
253
|
return left % right;
|
297
|
-
|
298
254
|
case "**":
|
299
255
|
return Math.pow(left, right);
|
300
|
-
|
301
256
|
case "<":
|
302
257
|
return left < right;
|
303
|
-
|
304
258
|
case ">":
|
305
259
|
return left > right;
|
306
|
-
|
307
260
|
case "<=":
|
308
261
|
return left <= right;
|
309
|
-
|
310
262
|
case ">=":
|
311
263
|
return left >= right;
|
312
|
-
|
313
264
|
case "==":
|
314
265
|
return left == right;
|
315
|
-
|
316
266
|
case "!=":
|
317
267
|
return left != right;
|
318
|
-
|
319
268
|
case "===":
|
320
269
|
return left === right;
|
321
|
-
|
322
270
|
case "!==":
|
323
271
|
return left !== right;
|
324
|
-
|
325
272
|
case "|":
|
326
273
|
return left | right;
|
327
|
-
|
328
274
|
case "&":
|
329
275
|
return left & right;
|
330
|
-
|
331
276
|
case "^":
|
332
277
|
return left ^ right;
|
333
|
-
|
334
278
|
case "<<":
|
335
279
|
return left << right;
|
336
|
-
|
337
280
|
case ">>":
|
338
281
|
return left >> right;
|
339
|
-
|
340
282
|
case ">>>":
|
341
283
|
return left >>> right;
|
342
284
|
}
|
343
285
|
}
|
344
|
-
|
345
286
|
if (path.isCallExpression()) {
|
346
287
|
const callee = path.get("callee");
|
347
288
|
let context;
|
348
289
|
let func;
|
349
|
-
|
350
|
-
|
351
|
-
func = global[node.callee.name];
|
290
|
+
if (callee.isIdentifier() && !path.scope.getBinding(callee.node.name) && (isValidObjectCallee(callee.node.name) || isValidIdentifierCallee(callee.node.name))) {
|
291
|
+
func = global[callee.node.name];
|
352
292
|
}
|
353
|
-
|
354
293
|
if (callee.isMemberExpression()) {
|
355
294
|
const object = callee.get("object");
|
356
295
|
const property = callee.get("property");
|
357
|
-
|
358
|
-
if (object.isIdentifier() && property.isIdentifier() && VALID_CALLEES.indexOf(object.node.name) >= 0 && INVALID_METHODS.indexOf(property.node.name) < 0) {
|
296
|
+
if (object.isIdentifier() && property.isIdentifier() && isValidObjectCallee(object.node.name) && !isInvalidMethod(property.node.name)) {
|
359
297
|
context = global[object.node.name];
|
360
|
-
|
298
|
+
const key = property.node.name;
|
299
|
+
if (Object.hasOwnProperty.call(context, key)) {
|
300
|
+
func = context[key];
|
301
|
+
}
|
361
302
|
}
|
362
|
-
|
363
303
|
if (object.isLiteral() && property.isIdentifier()) {
|
364
304
|
const type = typeof object.node.value;
|
365
|
-
|
366
305
|
if (type === "string" || type === "number") {
|
367
306
|
context = object.node.value;
|
368
307
|
func = context[property.node.name];
|
369
308
|
}
|
370
309
|
}
|
371
310
|
}
|
372
|
-
|
373
311
|
if (func) {
|
374
312
|
const args = path.get("arguments").map(arg => evaluateCached(arg, state));
|
375
313
|
if (!state.confident) return;
|
376
314
|
return func.apply(context, args);
|
377
315
|
}
|
378
316
|
}
|
379
|
-
|
380
317
|
deopt(path, state);
|
381
318
|
}
|
382
|
-
|
383
319
|
function evaluateQuasis(path, quasis, state, raw = false) {
|
384
320
|
let str = "";
|
385
321
|
let i = 0;
|
386
|
-
const exprs = path.get("expressions");
|
387
|
-
|
322
|
+
const exprs = path.isTemplateLiteral() ? path.get("expressions") : path.get("quasi.expressions");
|
388
323
|
for (const elem of quasis) {
|
389
324
|
if (!state.confident) break;
|
390
325
|
str += raw ? elem.value.raw : elem.value.cooked;
|
391
326
|
const expr = exprs[i++];
|
392
327
|
if (expr) str += String(evaluateCached(expr, state));
|
393
328
|
}
|
394
|
-
|
395
329
|
if (!state.confident) return;
|
396
330
|
return str;
|
397
331
|
}
|
398
|
-
|
399
332
|
function evaluate() {
|
400
333
|
const state = {
|
401
334
|
confident: true,
|
@@ -409,4 +342,6 @@ function evaluate() {
|
|
409
342
|
deopt: state.deoptPath,
|
410
343
|
value: value
|
411
344
|
};
|
412
|
-
}
|
345
|
+
}
|
346
|
+
|
347
|
+
//# sourceMappingURL=evaluation.js.map
|