Spaces:
Running
Running
; | |
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 | |