134 lines
4.7 KiB
JavaScript
134 lines
4.7 KiB
JavaScript
/*
|
|
SystemJS CommonJS Format
|
|
*/
|
|
(function() {
|
|
// CJS Module Format
|
|
// require('...') || exports[''] = ... || exports.asd = ... || module.exports = ...
|
|
var cjsExportsRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF.])(exports\s*(\[['"]|\.)|module(\.exports|\['exports'\]|\["exports"\])\s*(\[['"]|[=,\.]))/;
|
|
// RegEx adjusted from https://github.com/jbrantly/yabble/blob/master/lib/yabble.js#L339
|
|
var cjsRequireRegEx = /(?:^\uFEFF?|[^$_a-zA-Z\xA0-\uFFFF."'])require\s*\(\s*("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\s*\)/g;
|
|
var commentRegEx = /(^|[^\\])(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg;
|
|
|
|
var stringRegEx = /("[^"\\\n\r]*(\\.[^"\\\n\r]*)*"|'[^'\\\n\r]*(\\.[^'\\\n\r]*)*')/g;
|
|
|
|
// used to support leading #!/usr/bin/env in scripts as supported in Node
|
|
var hashBangRegEx = /^\#\!.*/;
|
|
|
|
function getCJSDeps(source) {
|
|
cjsRequireRegEx.lastIndex = commentRegEx.lastIndex = stringRegEx.lastIndex = 0;
|
|
|
|
var deps = [];
|
|
|
|
var match;
|
|
|
|
// track string and comment locations for unminified source
|
|
var stringLocations = [], commentLocations = [];
|
|
|
|
function inLocation(locations, match) {
|
|
for (var i = 0; i < locations.length; i++)
|
|
if (locations[i][0] < match.index && locations[i][1] > match.index)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
if (source.length / source.split('\n').length < 200) {
|
|
while (match = stringRegEx.exec(source))
|
|
stringLocations.push([match.index, match.index + match[0].length]);
|
|
|
|
while (match = commentRegEx.exec(source)) {
|
|
// only track comments not starting in strings
|
|
if (!inLocation(stringLocations, match))
|
|
commentLocations.push([match.index, match.index + match[0].length]);
|
|
}
|
|
}
|
|
|
|
while (match = cjsRequireRegEx.exec(source)) {
|
|
// ensure we're not within a string or comment location
|
|
if (!inLocation(stringLocations, match) && !inLocation(commentLocations, match)) {
|
|
var dep = match[1].substr(1, match[1].length - 2);
|
|
// skip cases like require('" + file + "')
|
|
if (dep.match(/"|'/))
|
|
continue;
|
|
// trailing slash requires are removed as they don't map mains in SystemJS
|
|
if (dep[dep.length - 1] == '/')
|
|
dep = dep.substr(0, dep.length - 1);
|
|
deps.push(dep);
|
|
}
|
|
}
|
|
|
|
return deps;
|
|
}
|
|
|
|
hook('instantiate', function(instantiate) {
|
|
return function(load) {
|
|
var loader = this;
|
|
if (!load.metadata.format) {
|
|
cjsExportsRegEx.lastIndex = 0;
|
|
cjsRequireRegEx.lastIndex = 0;
|
|
if (cjsRequireRegEx.exec(load.source) || cjsExportsRegEx.exec(load.source))
|
|
load.metadata.format = 'cjs';
|
|
}
|
|
|
|
if (load.metadata.format == 'cjs') {
|
|
var metaDeps = load.metadata.deps;
|
|
var deps = load.metadata.cjsRequireDetection === false ? [] : getCJSDeps(load.source);
|
|
|
|
for (var g in load.metadata.globals)
|
|
if (load.metadata.globals[g])
|
|
deps.push(load.metadata.globals[g]);
|
|
|
|
var entry = createEntry();
|
|
|
|
load.metadata.entry = entry;
|
|
|
|
entry.deps = deps;
|
|
entry.executingRequire = true;
|
|
entry.execute = function(_require, exports, module) {
|
|
function require(name) {
|
|
if (name[name.length - 1] == '/')
|
|
name = name.substr(0, name.length - 1);
|
|
return _require.apply(this, arguments);
|
|
}
|
|
require.resolve = function(name) {
|
|
return loader.get('@@cjs-helpers').requireResolve(name, module.id);
|
|
};
|
|
|
|
// ensure meta deps execute first
|
|
if (!load.metadata.cjsDeferDepsExecute)
|
|
for (var i = 0; i < metaDeps.length; i++)
|
|
require(metaDeps[i]);
|
|
|
|
var pathVars = loader.get('@@cjs-helpers').getPathVars(module.id);
|
|
var __cjsWrapper = {
|
|
exports: exports,
|
|
args: [require, exports, module, pathVars.filename, pathVars.dirname, __global, __global]
|
|
};
|
|
|
|
var cjsWrapper = "(function(require, exports, module, __filename, __dirname, global, GLOBAL";
|
|
|
|
// add metadata.globals to the wrapper arguments
|
|
if (load.metadata.globals)
|
|
for (var g in load.metadata.globals) {
|
|
__cjsWrapper.args.push(require(load.metadata.globals[g]));
|
|
cjsWrapper += ", " + g;
|
|
}
|
|
|
|
// disable AMD detection
|
|
var define = __global.define;
|
|
__global.define = undefined;
|
|
__global.__cjsWrapper = __cjsWrapper;
|
|
|
|
load.source = cjsWrapper + ") {" + load.source.replace(hashBangRegEx, '') + "\n}).apply(__cjsWrapper.exports, __cjsWrapper.args);";
|
|
|
|
__exec.call(loader, load);
|
|
|
|
__global.__cjsWrapper = undefined;
|
|
__global.define = define;
|
|
};
|
|
}
|
|
|
|
return instantiate.call(loader, load);
|
|
};
|
|
});
|
|
})();
|