forked from Meiguro/simplyjs
-
Notifications
You must be signed in to change notification settings - Fork 228
/
loader.js
109 lines (85 loc) · 2.36 KB
/
loader.js
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
var __loader = (function() {
var loader = {};
loader.packages = {};
loader.packagesLinenoOrder = [{ filename: 'loader.js', lineno: 0 }];
loader.extpaths = ['?', '?.js', '?.json', '?/index.js'];
loader.paths = ['/', 'lib', 'vendor'];
loader.basepath = function(path) {
return path.replace(/[^\/]*$/, '');
};
var replace = function(a, regexp, b) {
var z;
do {
z = a;
} while (z !== (a = a.replace(regexp, b)));
return z;
};
loader.normalize = function(path) {
path = replace(path, /(?:(^|\/)\.?\/)+/g, '$1');
path = replace(path, /[^\/]*\/\.\.\//, '');
return path;
};
loader.require = function(path, requirer) {
var module = loader.getPackage(path, requirer);
if (!module) {
throw new Error("Cannot find module '" + path + "'");
}
if (module.exports) {
return module.exports;
}
var require = function(path) { return loader.require(path, module); };
module.exports = {};
module.loader(module.exports, module, require);
module.loaded = true;
return module.exports;
};
var compareLineno = function(a, b) { return a.lineno - b.lineno; };
loader.define = function(path, lineno, loadfun) {
var module = {
filename: path,
lineno: lineno,
loader: loadfun,
};
loader.packages[path] = module;
loader.packagesLinenoOrder.push(module);
loader.packagesLinenoOrder.sort(compareLineno);
};
loader.getPackage = function(path, requirer) {
var module;
if (requirer) {
module = loader.getPackageAtPath(loader.basepath(requirer.filename) + '/' + path);
}
if (!module) {
module = loader.getPackageAtPath(path);
}
var paths = loader.paths;
for (var i = 0, ii = paths.length; !module && i < ii; ++i) {
var dirpath = paths[i];
module = loader.getPackageAtPath(dirpath + '/' + path);
}
return module;
};
loader.getPackageAtPath = function(path) {
path = loader.normalize(path);
var module;
var extpaths = loader.extpaths;
for (var i = 0, ii = extpaths.length; !module && i < ii; ++i) {
var filepath = extpaths[i].replace('?', path);
module = loader.packages[filepath];
}
return module;
};
loader.getPackageByLineno = function(lineno) {
var packages = loader.packagesLinenoOrder;
var module;
for (var i = 0, ii = packages.length; i < ii; ++i) {
var next = packages[i];
if (next.lineno > lineno) {
break;
}
module = next;
}
return module;
};
return loader;
})();