raptor-dev
Version:
Developer tools for RaptorJS
84 lines (74 loc) • 2.95 kB
JavaScript
var esprima = require('esprima');
var estraverse = require('estraverse');
function isCommonJSModule(src, file) {
var ast;
try {
ast = esprima.parse(src, {});
} catch(e) {
console.log('WARNING: Unable to parse JavaScript file: ' + file, (e.stack || e));
return false;
}
var isCommonJSModuleFlag = false;
estraverse.traverse(ast, {
enter: function (node, parent) {
if (isCommonJSModuleFlag) {
this.break();
return;
}
if (node.type == 'CallExpression' &&
node.callee.type === 'Identifier' &&
(node.callee.name === 'define' || node.callee.name === 'require')) {
isCommonJSModuleFlag = true;
this.break();
return;
} else if (node.type == 'CallExpression' &&
node.callee.type === 'MemberExpression' &&
node.callee.object.type === 'Identifier' &&
node.callee.object.name === 'define') {
isCommonJSModuleFlag = true;
this.break();
return;
}
if (node.type == 'AssignmentExpression' &&
node.left.type === 'MemberExpression') {
// Look for any of the following:
// exports.test = ...
// module.exports = ...
// module.exports.test = ...
// exports.test = ...
if (node.left.object.type === 'Identifier' && node.left.object.name === 'exports') {
isCommonJSModuleFlag = true;
this.break();
return;
}
// module.exports = ...
if (node.left.object.type === 'Identifier' &&
node.left.object.name === 'module' &&
node.left.property.type === 'Identifier' &&
node.left.property.name === 'exports') {
isCommonJSModuleFlag = true;
this.break();
return;
}
// module.exports.test = ...
if (node.left.object.type === 'MemberExpression' &&
node.left.object.object.type === 'Identifier' &&
node.left.object.object.name === 'module' &&
node.left.object.property.type === 'Identifier' &&
node.left.object.property.name === 'exports') {
isCommonJSModuleFlag = true;
this.break();
return;
}
}
},
leave: function (node, parent) {
if (isCommonJSModuleFlag) {
this.break();
return;
}
}
});
return isCommonJSModuleFlag;
}
module.exports = isCommonJSModule;