forked from ajaxorg/ace
-
Notifications
You must be signed in to change notification settings - Fork 0
/
requireJS-node.js
155 lines (137 loc) · 4.39 KB
/
requireJS-node.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
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
var path = require("path");
var fs = require("fs");
var currentModule
var defaultCompile = module.constructor.prototype._compile;
module.constructor.prototype._compile = function(content, filename){
currentModule = this;
try{
return defaultCompile.call(this, content, filename);
}
finally {
currentModule = null;
}
};
var requireModule = module;
global.define = function (id, injects, factory) {
// infere the module
var module = currentModule;
if (!module) {
module = requireModule;
while (module.parent)
module = module.parent;
}
// parse arguments
if (!factory) {
// two or less arguments
factory = injects;
if (factory) {
// two args
if (typeof id === "string") {
if (id !== module.id) {
throw new Error("Can not assign module to a different id than the current file");
}
// default injects
injects = [];
}
else{
// anonymous, deps included
injects = id;
}
}
else {
// only one arg, just the factory
factory = id;
injects = [];
}
}
var req = function(relativeId, callback) {
if (Array.isArray(relativeId)) {
// async require
return callback.apply(this, relativeId.map(req))
}
var chunks = relativeId.split("!");
if (chunks.length >= 2) {
var prefix = chunks[0];
relativeId = chunks.slice(1).join("!")
}
if (relativeId.charAt(0) === '.') {
var rootPath = path.dirname(path.dirname(requireModule.filename)) + "/",
absolutePath = path.dirname(module.filename) + "/" + relativeId;
relativeId = "../" + absolutePath.match(new RegExp(rootPath + "(.*)"))[1];
}
if (prefix == "ace/requirejs/text") {
return fs.readFileSync(findModulePath(relativeId))
} else
return require(relativeId);
};
injects.unshift("require", "exports", "module");
id = module.id;
if (typeof factory !== "function") {
// we can just provide a plain object
return module.exports = factory;
}
var returned = factory.apply(module.exports, injects.map(function (injection) {
switch (injection) {
// check for CommonJS injection variables
case "require": return req;
case "exports": return module.exports;
case "module": return module;
default:
// a module dependency
return req(injection);
}
}));
if(returned) {
// since AMD encapsulates a function/callback, it can allow the factory to return the exports.
module.exports = returned;
}
};
// slighly modified version of
// https://github.com/ry/node/blob/1dad95a3a960c645ffec28f9ec023dad6a17c0d4/src/node.js#L159
//
// given a module name, and a list of paths to test, returns the first
// matching file in the following precedence.
//
// require("a.<ext>")
// -> a.<ext>
//
// require("a")
// -> a
// -> a.<ext>
// -> a/index.<ext>
function findModulePath(request) {
var fs = require('fs'),
exts = ["js"],
paths = ['.'].concat(require.paths)
paths = request.charAt(0) === '/' ? [''] : paths;
// check if the file exists and is not a directory
var tryFile = function(requestPath) {
try {
var stats = fs.statSync(requestPath);
if (stats && !stats.isDirectory()) {
return requestPath;
}
} catch (e) {}
return false;
};
// given a path check a the file exists with any of the set extensions
var tryExtensions = function(p, extension) {
for (var i = 0, EL = exts.length; i < EL; i++) {
f = tryFile(p + exts[i]);
if (f) { return f; }
}
return false;
};
// For each path
for (var i = 0, PL = paths.length; i < PL; i++) {
var p = paths[i],
// try to join the request to the path
f = tryFile(path.join(p, request)) ||
// try it with each of the extensions
tryExtensions(path.join(p, request)) ||
// try it with each of the extensions at "index"
tryExtensions(path.join(p, request, 'index'));
if (f) { return f; }
}
return false;
}