-
Notifications
You must be signed in to change notification settings - Fork 0
/
amd.js
44 lines (38 loc) · 1.42 KB
/
amd.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
"use strict";
var mine = require("mine");
var pathJoin = require("pathjoin");
var binary = require('bodec');
module.exports = amd;
function amd(servePath, req, callback) {
var prefix = req.args[0];
var base = pathJoin(req.path, "..");
if (prefix) {
prefix = pathJoin(base, prefix);
if (prefix === base) base = "";
else if (base.substring(0, prefix.length + 1) === prefix +"/") {
base = base.substring(prefix.length + 1);
}
}
var name = req.path.substring(req.path.lastIndexOf("/") + 1);
return callback(null, {etag: req.hash + "-" + req.target.etag, fetch: fetch});
function fetch(callback) {
req.target.fetch(function (err, js) {
if (err) return callback(err);
js = binary.toUnicode(js);
var deps = mine(js);
var length = deps.length;
var paths = new Array(length);
for (var i = length - 1; i >= 0; i--) {
var dep = deps[i];
var depPath = dep.name[0] === "." ? pathJoin(base, dep.name) : dep.name;
if (!(/\.[^\/]+$/.test(depPath))) depPath += ".js";
paths[i] = depPath;
js = js.substr(0, dep.offset) + depPath + js.substr(dep.offset + dep.name.length);
}
js = "define(" + JSON.stringify(pathJoin(base, name)) + ", " +
JSON.stringify(paths) + ", function (module, exports) { " +
js + "\n});\n";
callback(null, binary.fromUnicode(js));
});
}
}