| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | "use strict";Object.defineProperty(exports, "__esModule", {  value: true});exports.default = wrapFunction;var _helperFunctionName = require("@babel/helper-function-name");var _template = require("@babel/template");var _t = require("@babel/types");const {  blockStatement,  callExpression,  functionExpression,  isAssignmentPattern,  isFunctionDeclaration,  isRestElement,  returnStatement} = _t;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 = _template.default.statements(`  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 = functionExpression(null, [], blockStatement(body.body), true);  body.body = [returnStatement(callExpression(callExpression(callId, [container]), []))];  node.async = false;  node.generator = false;  path.get("body.body.0.argument.callee.arguments.0").unwrapFunctionEnvironment();}function plainFunction(path, callId, noNewArrows, ignoreFunctionLength) {  let functionId = null;  let node;  if (path.isArrowFunctionExpression()) {    {      var _path$arrowFunctionTo;      path = (_path$arrowFunctionTo = path.arrowFunctionToExpression({        noNewArrows      })) != null ? _path$arrowFunctionTo : path;    }    node = path.node;  } else {    node = path.node;  }  const isDeclaration = isFunctionDeclaration(node);  functionId = node.id;  node.id = null;  node.type = "FunctionExpression";  const built = callExpression(callId, [node]);  const params = [];  for (const param of node.params) {    if (isAssignmentPattern(param) || isRestElement(param)) {      break;    }    params.push(path.scope.generateUidIdentifier("x"));  }  const wrapperArgs = {    NAME: functionId || null,    REF: path.scope.generateUidIdentifier(functionId ? functionId.name : "ref"),    FUNCTION: built,    PARAMS: params  };  if (isDeclaration) {    const container = buildDeclarationWrapper(wrapperArgs);    path.replaceWith(container[0]);    path.insertAfter(container[1]);  } else {    let container;    if (functionId) {      container = buildNamedExpressionWrapper(wrapperArgs);    } else {      container = buildAnonymousExpressionWrapper(wrapperArgs);      const returnFn = container.callee.body.body[1].argument;      (0, _helperFunctionName.default)({        node: returnFn,        parent: path.parent,        scope: path.scope      });      functionId = returnFn.id;    }    if (functionId || !ignoreFunctionLength && params.length) {      path.replaceWith(container);    } else {      path.replaceWith(built);    }  }}function wrapFunction(path, callId, noNewArrows = true, ignoreFunctionLength = false) {  if (path.isMethod()) {    classOrObjectMethod(path, callId);  } else {    plainFunction(path, callId, noNewArrows, ignoreFunctionLength);  }}
 |