Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81159 views
1
var assert = require("assert");
2
var Q = require("q");
3
var path = require("path");
4
var util = require("./util");
5
var recast = require("recast");
6
var n = recast.types.namedTypes;
7
8
function Relativizer(reader) {
9
assert.ok(this instanceof Relativizer);
10
assert.ok(reader === null ||
11
reader instanceof require("./reader").ModuleReader);
12
13
Object.defineProperties(this, {
14
reader: { value: reader }
15
});
16
}
17
18
var Rp = Relativizer.prototype;
19
20
exports.getProcessor = function(reader) {
21
var relativizer = new Relativizer(reader);
22
return function(id, input) {
23
return relativizer.processSourceP(id, input);
24
};
25
};
26
27
Rp.processSourceP = function(id, input) {
28
var relativizer = this;
29
var output = typeof input === "string" ? {
30
".js": input
31
} : input;
32
33
return Q(output[".js"]).then(function(source) {
34
var promises = [];
35
var ast = recast.parse(source);
36
37
function fixRequireP(literal) {
38
promises.push(relativizer.relativizeP(
39
id, literal.value
40
).then(function(newValue) {
41
return literal.value = newValue;
42
}));
43
}
44
45
recast.visit(ast, {
46
visitCallExpression: function(path) {
47
var args = path.value.arguments;
48
var callee = path.value.callee;
49
50
if (n.Identifier.check(callee) &&
51
callee.name === "require" &&
52
args.length === 1) {
53
var arg = args[0];
54
if (n.Literal.check(arg) &&
55
typeof arg.value === "string") {
56
fixRequireP(arg);
57
}
58
}
59
60
this.traverse(path);
61
}
62
});
63
64
return Q.all(promises).then(function() {
65
output[".js"] = recast.print(ast).code;
66
return output;
67
});
68
});
69
};
70
71
Rp.absolutizeP = function(moduleId, requiredId) {
72
requiredId = util.absolutize(moduleId, requiredId);
73
74
if (this.reader)
75
return this.reader.getCanonicalIdP(requiredId);
76
77
return Q(requiredId);
78
};
79
80
Rp.relativizeP = function(moduleId, requiredId) {
81
return this.absolutizeP(
82
moduleId,
83
requiredId
84
).then(function(absoluteId) {
85
return util.relativize(moduleId, absoluteId);
86
});
87
};
88
89