Skip to content

Instantly share code, notes, and snippets.

@kastermester
Last active September 15, 2015 05:32
Show Gist options
  • Save kastermester/600a0e5f70c01ec95d46 to your computer and use it in GitHub Desktop.
Save kastermester/600a0e5f70c01ec95d46 to your computer and use it in GitHub Desktop.
Map module calls in JS code
var estreeWalker = require('estree-walker');
module.exports = function(ast, mapper){
estreeWalker.walk(ast, {
enter: function(node, parent){
if(node.type !== 'CallExpression'){
return;
}
if(node.callee.type == 'Identifier'){
if(node.callee.name == 'require' || node.callee.name == 'define'){
// AMD style require/defines
if(node.arguments.length == 2 && node.arguments[0].type == 'ArrayExpression'){
for(var i in node.arguments[0].elements){
var arg = node.arguments[0].elements[i];
if(arg.type == 'Literal' && typeof(arg.value) == 'string'){
arg.value = mapper(arg.value);
}
}
} else if(node.callee.name == 'define'){
// define(name, deps, fn) style call
if(node.arguments.length == 3 && node.arguments[1].type == 'ArrayExpression'){
for(var i in node.arguments[1].elements){
var arg = node.arguments[1].elements[i];
if(arg.type == 'Literal' && typeof(arg.value) == 'string'){
arg.value = mapper(arg.value);
}
}
}
} else {
// Must be require(...) call here
if (node.arguments.length == 1 && node.arguments[0].type == 'Literal' && typeof(node.arguments[0].value) == 'string'){
// CommonJS style requires
node.arguments[0].value = mapper(node.arguments[0].value);
}
}
}
// Next branch here is to deal with require.ensure [], function(){} ... style calls
} else if(node.callee.type == 'MemberExpression' && node.callee.computed == false){
var memberExpr = node.callee;
if(memberExpr.object.type == 'Identifier' && memberExpr.object.name == 'require' && memberExpr.property.name == 'ensure'){
if(node.arguments.length == 2 && node.arguments[0].type == 'ArrayExpression'){
for(var i in node.arguments[0].elements){
var arg = node.arguments[0].elements[i];
if(arg.type == 'Literal' && typeof(arg.value) == 'string'){
arg.value = mapper(arg.value);
}
}
}
}
}
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment