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
			| 
											3 years ago
										 | "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
 |