1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
/*
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]);
// TODO: track template literals here before comments
while (match = commentRegEx.exec(source)) {
// only track comments not starting in strings
if (!inLocation(stringLocations, match))
commentLocations.push([match.index + match[1].length, match.index + match[0].length - 1]);
}
}
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);
};
// support module.paths ish
module.paths = [];
module.require = _require;
// 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);
};
});
})();
|