'use strict'; var estraverse = require('estraverse'); var syntax = estraverse.Syntax; var caputuringTargetTypes = [ // syntax.Property, syntax.ObjectExpression, syntax.ArrayExpression, // syntax.ConditionalExpression, syntax.Identifier, syntax.MemberExpression, syntax.CallExpression, syntax.UnaryExpression, syntax.BinaryExpression, syntax.LogicalExpression, syntax.AssignmentExpression, syntax.NewExpression, syntax.UpdateExpression, syntax.YieldExpression, syntax.AwaitExpression, syntax.TemplateLiteral, syntax.TaggedTemplateExpression ]; function isCaputuringTargetType (currentNode) { return caputuringTargetTypes.indexOf(currentNode.type) !== -1; } function isCalleeOfParent(parentNode, currentKey) { return (parentNode.type === syntax.CallExpression || parentNode.type === syntax.NewExpression) && currentKey === 'callee'; } function isChildOfTaggedTemplateExpression(parentNode) { return parentNode.type === syntax.TaggedTemplateExpression; } function isYieldOrAwaitArgument(parentNode, currentKey) { // capture the yielded/await result, not the promise return (parentNode.type === syntax.YieldExpression || parentNode.type === syntax.AwaitExpression) && currentKey === 'argument'; } module.exports = function toBeCaptured (currentNode, parentNode, currentKey) { return isCaputuringTargetType(currentNode) && !isYieldOrAwaitArgument(parentNode, currentKey) && !isCalleeOfParent(parentNode, currentKey) && !isChildOfTaggedTemplateExpression(parentNode); };