commonjs-everywhere
Version:
CommonJS browser bundler with aliasing, extensibility, and source maps from the minified JS bundle
150 lines (149 loc) • 5.3 kB
JavaScript
// Generated by CoffeeScript 2.0.0-beta8
void function () {
var badRequireError, canonicalise, CoffeeScript, esprima, estraverse, fs, md5, path, relativeResolve;
fs = require('fs');
path = require('path');
CoffeeScript = require('coffee-script-redux');
esprima = require('esprima');
estraverse = require('estraverse');
md5 = require('MD5');
canonicalise = require('./canonicalise');
relativeResolve = require('./relative-resolve');
badRequireError = function (filename, node, msg) {
if (null != node.loc && null != (null != node.loc ? node.loc.start : void 0))
filename = '' + filename + ':' + node.loc.start.line + ':' + node.loc.start.column;
throw 'illegal require: ' + msg + '\n `' + require('escodegen').generate(node) + '`\n in ' + filename + '';
};
module.exports = function (entryPoint, root, options) {
var aliases, ast, astOrJs, cache$, cache$1, canonicalName, digest, e, ext, extensions, extname, fileContents, filename, handler, handlers, processed, worklist;
if (null == root)
root = process.cwd();
if (null == options)
options = {};
aliases = null != options.aliases ? options.aliases : {};
handlers = {
'.coffee': function (coffee, canonicalName) {
return CoffeeScript.compile(CoffeeScript.parse(coffee, { raw: true }), { bare: true });
},
'.json': function (json, canonicalName) {
return esprima.parse('module.exports = ' + json, {
loc: true,
source: canonicalName
});
}
};
for (ext in cache$ = null != options.handlers ? options.handlers : {}) {
if (!isOwn$(cache$, ext))
continue;
handler = cache$[ext];
handlers[ext] = handler;
}
extensions = ['.js'].concat([].slice.call(function (accum$) {
for (ext in handlers) {
if (!isOwn$(handlers, ext))
continue;
accum$.push(ext);
}
return accum$;
}.call(this, [])));
worklist = [relativeResolve({
extensions: extensions,
aliases: aliases,
root: root,
path: entryPoint
})];
processed = {};
while (worklist.length) {
cache$1 = worklist.pop();
filename = cache$1.filename;
canonicalName = cache$1.canonicalName;
if (!filename)
continue;
if ({}.hasOwnProperty.call(processed, filename))
continue;
extname = path.extname(filename);
fileContents = fs.readFileSync(filename).toString();
if (options.cache) {
digest = md5(fileContents.toString());
if (options.cache[filename] === digest)
continue;
options.cache[filename] = digest;
}
astOrJs = {}.hasOwnProperty.call(handlers, extname) ? handlers[extname](fileContents, canonicalName) : fileContents;
ast = typeof astOrJs === 'string' ? function () {
try {
return esprima.parse(astOrJs, {
loc: true,
source: canonicalName
});
} catch (e$) {
e = e$;
throw new Error('Syntax error in ' + filename + ' at line ' + e.lineNumber + ', column ' + e.column + e.message.slice(e.message.indexOf(':')));
}
}.call(this) : astOrJs;
processed[filename] = {
canonicalName: canonicalName,
ast: ast,
fileContents: fileContents
};
if (null != ast.loc)
ast.loc;
else
ast.loc = {};
estraverse.replace(ast, {
enter: function (node, parents) {
var cwd, resolved;
if (null != node.loc)
node.loc.source = canonicalName;
if (!(node.type === 'CallExpression' && node.callee.type === 'Identifier' && node.callee.name === 'require'))
return;
if (!(node['arguments'].length === 1))
badRequireError(filename, node, 'require must be given exactly one argument');
if (!(node['arguments'][0].type === 'Literal' && typeof node['arguments'][0].value === 'string'))
badRequireError(filename, node, 'argument of require must be a constant string');
cwd = path.dirname(fs.realpathSync(filename));
if (options.verbose)
console.error('required "' + node['arguments'][0].value + '" from "' + canonicalName + '"');
try {
resolved = relativeResolve({
extensions: extensions,
aliases: aliases,
root: root,
cwd: cwd,
path: node['arguments'][0].value
});
worklist.push(resolved);
} catch (e$1) {
e = e$1;
if (options.ignoreMissing) {
return {
type: 'Literal',
value: null
};
} else {
throw e;
}
}
return {
type: 'CallExpression',
callee: node.callee,
'arguments': [
{
type: 'Literal',
value: resolved.canonicalName
},
{
type: 'Identifier',
name: 'module'
}
]
};
}
});
}
return processed;
};
function isOwn$(o, p) {
return {}.hasOwnProperty.call(o, p);
}
}.call(this);