You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							127 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
	
	
							127 lines
						
					
					
						
							3.5 KiB
						
					
					
				| "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,
 | |
|   isCallExpression
 | |
| } = _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(inPath, callId, noNewArrows, ignoreFunctionLength) {
 | |
|   let path = inPath;
 | |
|   let node;
 | |
|   let functionId = null;
 | |
|   const nodeParams = inPath.node.params;
 | |
|   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);
 | |
|   let built = node;
 | |
|   if (!isCallExpression(node)) {
 | |
|     functionId = node.id;
 | |
|     node.id = null;
 | |
|     node.type = "FunctionExpression";
 | |
|     built = callExpression(callId, [node]);
 | |
|   }
 | |
|   const params = [];
 | |
|   for (const param of nodeParams) {
 | |
|     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);
 | |
|   }
 | |
| }
 | |
| 
 | |
| //# sourceMappingURL=index.js.map
 |