"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _helperPluginUtils = require("@babel/helper-plugin-utils"); var _core = require("@babel/core"); var _default = (0, _helperPluginUtils.declare)(api => { api.assertVersion(7); return { name: "transform-new-target", visitor: { MetaProperty(path) { const meta = path.get("meta"); const property = path.get("property"); const { scope } = path; if (meta.isIdentifier({ name: "new" }) && property.isIdentifier({ name: "target" })) { const func = path.findParent(path => { if (path.isClass()) return true; if (path.isFunction() && !path.isArrowFunctionExpression()) { if (path.isClassMethod({ kind: "constructor" })) { return false; } return true; } return false; }); if (!func) { throw path.buildCodeFrameError("new.target must be under a (non-arrow) function or a class."); } const { node } = func; if (_core.types.isMethod(node)) { path.replaceWith(scope.buildUndefinedNode()); return; } const constructor = _core.types.memberExpression(_core.types.thisExpression(), _core.types.identifier("constructor")); if (func.isClass()) { path.replaceWith(constructor); return; } if (!node.id) { node.id = scope.generateUidIdentifier("target"); } else { let scope = path.scope; const name = node.id.name; while (scope !== func.parentPath.scope) { if (scope.hasOwnBinding(name) && !scope.bindingIdentifierEquals(name, node.id)) { scope.rename(name); } scope = scope.parent; } } path.replaceWith(_core.types.conditionalExpression(_core.types.binaryExpression("instanceof", _core.types.thisExpression(), _core.types.cloneNode(node.id)), constructor, scope.buildUndefinedNode())); } } } }; }); exports.default = _default; //# sourceMappingURL=index.js.map