Blame view

node_modules/commoner/lib/relative.js 2.3 KB
ce4c83ff   wxy   初始提交
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);
      });
  };