57 lines
1.6 KiB
JavaScript
57 lines
1.6 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var typesToBeCaptured = [
|
||
|
'Identifier',
|
||
|
'BinaryExpression',
|
||
|
'MemberExpression',
|
||
|
'CallExpression',
|
||
|
'UnaryExpression',
|
||
|
'LogicalExpression',
|
||
|
'ArrayExpression',
|
||
|
'ObjectExpression',
|
||
|
'TemplateLiteral',
|
||
|
'YieldExpression',
|
||
|
'AwaitExpression',
|
||
|
'NewExpression',
|
||
|
'AssignmentExpression',
|
||
|
'UpdateExpression',
|
||
|
'TaggedTemplateExpression'
|
||
|
];
|
||
|
|
||
|
function isCaputuringTargetType (types, nodePath) {
|
||
|
var currentNode = nodePath.node;
|
||
|
return typesToBeCaptured.some(function (nodeType) {
|
||
|
return types['is' + nodeType](currentNode);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function isCalleeOfParent(types, nodePath) {
|
||
|
var currentKey = nodePath.key;
|
||
|
var parentNode = nodePath.parent;
|
||
|
return (types.isCallExpression(parentNode) || types.isNewExpression(parentNode)) && currentKey === 'callee';
|
||
|
}
|
||
|
|
||
|
function isChildOfTaggedTemplateExpression(types, nodePath) {
|
||
|
var parentNode = nodePath.parent;
|
||
|
return types.isTaggedTemplateExpression(parentNode);
|
||
|
}
|
||
|
|
||
|
function isYieldOrAwaitArgument(types, nodePath) {
|
||
|
var currentKey = nodePath.key;
|
||
|
var parentNode = nodePath.parent;
|
||
|
// capture the yielded/await result, not the promise
|
||
|
return (types.isYieldExpression(parentNode) || types.isAwaitExpression(parentNode)) && currentKey === 'argument';
|
||
|
}
|
||
|
|
||
|
var blacklist = [
|
||
|
isYieldOrAwaitArgument,
|
||
|
isCalleeOfParent,
|
||
|
isChildOfTaggedTemplateExpression
|
||
|
];
|
||
|
|
||
|
module.exports = function toBeCaptured (types, nodePath) {
|
||
|
return isCaputuringTargetType(types, nodePath) && !blacklist.some(function (predicate) {
|
||
|
return predicate(types, nodePath);
|
||
|
});
|
||
|
};
|