| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = wrapFunction; |
| |
| function _helperFunctionName() { |
| const data = _interopRequireDefault(require("@babel/helper-function-name")); |
| |
| _helperFunctionName = function () { |
| return data; |
| }; |
| |
| return data; |
| } |
| |
| function _template() { |
| const data = _interopRequireDefault(require("@babel/template")); |
| |
| _template = function () { |
| return data; |
| }; |
| |
| return data; |
| } |
| |
| function t() { |
| const data = _interopRequireWildcard(require("@babel/types")); |
| |
| t = function () { |
| return data; |
| }; |
| |
| return data; |
| } |
| |
| function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| const buildAnonymousExpressionWrapper = _template().default.expression(` |
| (function () { |
| var REF = FUNCTION; |
| return function NAME(PARAMS) { |
| return REF.apply(this, arguments); |
| }; |
| })() |
| `); |
| |
| const buildNamedExpressionWrapper = _template().default.expression(` |
| (function () { |
| var REF = FUNCTION; |
| function NAME(PARAMS) { |
| return REF.apply(this, arguments); |
| } |
| return NAME; |
| })() |
| `); |
| |
| const buildDeclarationWrapper = (0, _template().default)(` |
| function NAME(PARAMS) { return REF.apply(this, arguments); } |
| function REF() { |
| REF = FUNCTION; |
| return REF.apply(this, arguments); |
| } |
| `); |
| |
| function classOrObjectMethod(path, callId) { |
| const node = path.node; |
| const body = node.body; |
| const container = t().functionExpression(null, [], t().blockStatement(body.body), true); |
| body.body = [t().returnStatement(t().callExpression(t().callExpression(callId, [container]), []))]; |
| node.async = false; |
| node.generator = false; |
| path.get("body.body.0.argument.callee.arguments.0").unwrapFunctionEnvironment(); |
| } |
| |
| function plainFunction(path, callId) { |
| const node = path.node; |
| const isDeclaration = path.isFunctionDeclaration(); |
| const functionId = node.id; |
| const wrapper = isDeclaration ? buildDeclarationWrapper : functionId ? buildNamedExpressionWrapper : buildAnonymousExpressionWrapper; |
| |
| if (path.isArrowFunctionExpression()) { |
| path.arrowFunctionToExpression(); |
| } |
| |
| node.id = null; |
| |
| if (isDeclaration) { |
| node.type = "FunctionExpression"; |
| } |
| |
| const built = t().callExpression(callId, [node]); |
| const container = wrapper({ |
| NAME: functionId || null, |
| REF: path.scope.generateUidIdentifier(functionId ? functionId.name : "ref"), |
| FUNCTION: built, |
| PARAMS: node.params.reduce((acc, param) => { |
| acc.done = acc.done || t().isAssignmentPattern(param) || t().isRestElement(param); |
| |
| if (!acc.done) { |
| acc.params.push(path.scope.generateUidIdentifier("x")); |
| } |
| |
| return acc; |
| }, { |
| params: [], |
| done: false |
| }).params |
| }); |
| |
| if (isDeclaration) { |
| path.replaceWith(container[0]); |
| path.insertAfter(container[1]); |
| } else { |
| const retFunction = container.callee.body.body[1].argument; |
| |
| if (!functionId) { |
| (0, _helperFunctionName().default)({ |
| node: retFunction, |
| parent: path.parent, |
| scope: path.scope |
| }); |
| } |
| |
| if (!retFunction || retFunction.id || node.params.length) { |
| path.replaceWith(container); |
| } else { |
| path.replaceWith(built); |
| } |
| } |
| } |
| |
| function wrapFunction(path, callId) { |
| if (path.isClassMethod() || path.isObjectMethod()) { |
| classOrObjectMethod(path, callId); |
| } else { |
| plainFunction(path, callId); |
| } |
| } |