Spaces:
Sleeping
Sleeping
; | |
exports.__esModule = true; | |
exports.default = void 0; | |
var _utils = require("../utils"); | |
function isRemoved(path) { | |
if (path.removed) return true; | |
if (!path.parentPath) return false; | |
if (path.listKey) { | |
var _path$parentPath$node; | |
if (!((_path$parentPath$node = path.parentPath.node) != null && (_path$parentPath$node = _path$parentPath$node[path.listKey]) != null && _path$parentPath$node.includes(path.node))) return true; | |
} else { | |
if (path.parentPath.node[path.key] !== path.node) return true; | |
} | |
return isRemoved(path.parentPath); | |
} | |
var _default = callProvider => { | |
function property(object, key, placement, path) { | |
return callProvider({ | |
kind: "property", | |
object, | |
key, | |
placement | |
}, path); | |
} | |
function handleReferencedIdentifier(path) { | |
const { | |
node: { | |
name | |
}, | |
scope | |
} = path; | |
if (scope.getBindingIdentifier(name)) return; | |
callProvider({ | |
kind: "global", | |
name | |
}, path); | |
} | |
function analyzeMemberExpression(path) { | |
const key = (0, _utils.resolveKey)(path.get("property"), path.node.computed); | |
return { | |
key, | |
handleAsMemberExpression: !!key && key !== "prototype" | |
}; | |
} | |
return { | |
// Symbol(), new Promise | |
ReferencedIdentifier(path) { | |
const { | |
parentPath | |
} = path; | |
if (parentPath.isMemberExpression({ | |
object: path.node | |
}) && analyzeMemberExpression(parentPath).handleAsMemberExpression) { | |
return; | |
} | |
handleReferencedIdentifier(path); | |
}, | |
"MemberExpression|OptionalMemberExpression"(path) { | |
const { | |
key, | |
handleAsMemberExpression | |
} = analyzeMemberExpression(path); | |
if (!handleAsMemberExpression) return; | |
const object = path.get("object"); | |
let objectIsGlobalIdentifier = object.isIdentifier(); | |
if (objectIsGlobalIdentifier) { | |
const binding = object.scope.getBinding(object.node.name); | |
if (binding) { | |
if (binding.path.isImportNamespaceSpecifier()) return; | |
objectIsGlobalIdentifier = false; | |
} | |
} | |
const source = (0, _utils.resolveSource)(object); | |
let skipObject = property(source.id, key, source.placement, path); | |
skipObject || (skipObject = !objectIsGlobalIdentifier || path.shouldSkip || object.shouldSkip || isRemoved(object)); | |
if (!skipObject) handleReferencedIdentifier(object); | |
}, | |
ObjectPattern(path) { | |
const { | |
parentPath, | |
parent | |
} = path; | |
let obj; | |
// const { keys, values } = Object | |
if (parentPath.isVariableDeclarator()) { | |
obj = parentPath.get("init"); | |
// ({ keys, values } = Object) | |
} else if (parentPath.isAssignmentExpression()) { | |
obj = parentPath.get("right"); | |
// !function ({ keys, values }) {...} (Object) | |
// resolution does not work after properties transform :-( | |
} else if (parentPath.isFunction()) { | |
const grand = parentPath.parentPath; | |
if (grand.isCallExpression() || grand.isNewExpression()) { | |
if (grand.node.callee === parent) { | |
obj = grand.get("arguments")[path.key]; | |
} | |
} | |
} | |
let id = null; | |
let placement = null; | |
if (obj) ({ | |
id, | |
placement | |
} = (0, _utils.resolveSource)(obj)); | |
for (const prop of path.get("properties")) { | |
if (prop.isObjectProperty()) { | |
const key = (0, _utils.resolveKey)(prop.get("key")); | |
if (key) property(id, key, placement, prop); | |
} | |
} | |
}, | |
BinaryExpression(path) { | |
if (path.node.operator !== "in") return; | |
const source = (0, _utils.resolveSource)(path.get("right")); | |
const key = (0, _utils.resolveKey)(path.get("left"), true); | |
if (!key) return; | |
callProvider({ | |
kind: "in", | |
object: source.id, | |
key, | |
placement: source.placement | |
}, path); | |
} | |
}; | |
}; | |
exports.default = _default; |