relative.js
2.3 KB
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
var assert = require("assert");
var Q = require("q");
var path = require("path");
var util = require("./util");
var recast = require("recast");
var n = recast.types.namedTypes;
function Relativizer(reader) {
assert.ok(this instanceof Relativizer);
assert.ok(reader === null ||
reader instanceof require("./reader").ModuleReader);
Object.defineProperties(this, {
reader: { value: reader }
});
}
var Rp = Relativizer.prototype;
exports.getProcessor = function(reader) {
var relativizer = new Relativizer(reader);
return function(id, input) {
return relativizer.processSourceP(id, input);
};
};
Rp.processSourceP = function(id, input) {
var relativizer = this;
var output = typeof input === "string" ? {
".js": input
} : input;
return Q(output[".js"]).then(function(source) {
var promises = [];
var ast = recast.parse(source);
function fixRequireP(literal) {
promises.push(relativizer.relativizeP(
id, literal.value
).then(function(newValue) {
return literal.value = newValue;
}));
}
recast.visit(ast, {
visitCallExpression: function(path) {
var args = path.value.arguments;
var callee = path.value.callee;
if (n.Identifier.check(callee) &&
callee.name === "require" &&
args.length === 1) {
var arg = args[0];
if (n.Literal.check(arg) &&
typeof arg.value === "string") {
fixRequireP(arg);
}
}
this.traverse(path);
}
});
return Q.all(promises).then(function() {
output[".js"] = recast.print(ast).code;
return output;
});
});
};
Rp.absolutizeP = function(moduleId, requiredId) {
requiredId = util.absolutize(moduleId, requiredId);
if (this.reader)
return this.reader.getCanonicalIdP(requiredId);
return Q(requiredId);
};
Rp.relativizeP = function(moduleId, requiredId) {
return this.absolutizeP(
moduleId,
requiredId
).then(function(absoluteId) {
return util.relativize(moduleId, absoluteId);
});
};