@gerhobbelt/mathjax-third-party-extensions
Version:
A list of MathJax extensions provided by third-party contributors
209 lines (202 loc) • 6.33 kB
JavaScript
// convertToIIFEDeclaration.js
// ===========================
// Returns a function expression that is executed immediately
// e.g. var example = function(){}()
define([
'utils',
'defaultValues'
], function(
utils,
defaultValues
) {
return function convertToIIFEDeclaration(obj) {
var amdclean = this,
options = amdclean.options,
moduleId = obj.moduleId,
moduleName = obj.moduleName,
hasModuleParam = obj.hasModuleParam,
hasExportsParam = obj.hasExportsParam,
callbackFuncParams = obj.callbackFuncParams,
isOptimized = obj.isOptimized,
callback = obj.callbackFunc,
node = obj.node,
name = callback.name,
type = callback.type,
range = (node.range || defaultValues.defaultRange),
loc = (node.loc || defaultValues.defaultLOC),
callbackFunc = (function() {
var cbFunc = obj.callbackFunc;
if (type === 'Identifier' && name !== 'undefined') {
cbFunc = {
'type': 'FunctionExpression',
'id': null,
'params': [],
'defaults': [],
'body': {
'type': 'BlockStatement',
'body': [{
'type': 'ReturnStatement',
'argument': {
'type': 'ConditionalExpression',
'test': {
'type': 'BinaryExpression',
'operator': '===',
'left': {
'type': 'UnaryExpression',
'operator': 'typeof',
'argument': {
'type': 'Identifier',
'name': name,
'range': range,
'loc': loc
},
'prefix': true,
'range': range,
'loc': loc
},
'right': {
'type': 'Literal',
'value': 'function',
'raw': "'function'",
'range': range,
'loc': loc
},
'range': range,
'loc': loc
},
'consequent': {
'type': 'CallExpression',
'callee': {
'type': 'Identifier',
'name': name,
'range': range,
'loc': loc
},
'arguments': callbackFuncParams,
'range': range,
'loc': loc
},
'alternate': {
'type': 'Identifier',
'name': name,
'range': range,
'loc': loc
},
'range': range,
'loc': loc
},
'range': range,
'loc': loc
}],
'range': range,
'loc': loc
},
'rest': null,
'generator': false,
'expression': false,
'range': range,
'loc': loc
};
}
return cbFunc;
}()),
dependencyNames = (function() {
var depNames = obj.dependencyNames,
objExpression = {
'type': 'ObjectExpression',
'properties': [],
'range': range,
'loc': loc
},
configMemberExpression = {
'type': 'MemberExpression',
'computed': true,
'object': {
'type': 'Identifier',
'name': 'module'
},
'property': {
'type': 'Literal',
'value': moduleId
}
},
moduleDepIndex;
if (options.config && options.config[moduleId]) {
if (hasExportsParam && hasModuleParam) {
return [objExpression, objExpression, configMemberExpression];
} else if (hasModuleParam) {
moduleDepIndex = _.findIndex(depNames, function(currentDep) {
return currentDep.name === '{}';
});
depNames[moduleDepIndex] = configMemberExpression;
}
}
return depNames;
}()),
cb = (function() {
if (callbackFunc.type === 'Literal' || (callbackFunc.type === 'Identifier' && callbackFunc.name === 'undefined') || isOptimized === true) {
return callbackFunc;
} else {
return {
'type': 'CallExpression',
'callee': {
'type': 'FunctionExpression',
'id': {
'type': 'Identifier',
'name': '',
'range': range,
'loc': loc
},
'params': callbackFuncParams,
'defaults': [],
'body': callbackFunc.body,
'rest': callbackFunc.rest,
'generator': callbackFunc.generator,
'expression': callbackFunc.expression,
'range': range,
'loc': loc
},
'arguments': dependencyNames,
'range': range,
'loc': loc
};
}
}()),
updatedNode = {
'type': 'ExpressionStatement',
'expression': {
'type': 'AssignmentExpression',
'operator': '=',
'left': {
'type': 'Identifier',
'name': options.IIFEVariableNameTransform ? options.IIFEVariableNameTransform(moduleName, moduleId) : moduleName,
'range': range,
'loc': loc
},
'right': cb,
'range': range,
'loc': loc
},
'range': range,
'loc': loc
};
estraverse.replace(callbackFunc, {
'enter': function(node) {
if (utils.isModuleExports(node)) {
return {
'type': 'AssignmentExpression',
'operator': '=',
'left': {
'type': 'Identifier',
'name': 'exports'
},
'right': node.right
};
} else {
return node;
}
}
});
return updatedNode;
};
});