Blame view

node_modules/bower/lib/commands/list.js 4.22 KB
2dda2e10   Administrator   generator ignore
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
156
157
158
159
160
161
162
163
164
165
166
  var path = require('path');
  var mout = require('mout');
  var Q = require('q');
  var Project = require('../core/Project');
  var semver = require('../util/semver');
  var defaultConfig = require('../config');
  
  function list(logger, options, config) {
      var project;
  
      options = options || {};
  
      // Make relative option true by default when used with paths
      if (options.paths && options.relative == null)  {
          options.relative = true;
      }
  
      config = defaultConfig(config);
      project = new Project(config, logger);
  
      return project.getTree(options)
      .spread(function (tree, flattened) {
          // Relativize paths
          // Also normalize paths on windows
          project.walkTree(tree, function (node) {
              if (node.missing) {
                  return;
              }
  
              if (options.relative) {
                  node.canonicalDir = path.relative(config.cwd, node.canonicalDir);
              }
              if (options.paths) {
                  node.canonicalDir = normalize(node.canonicalDir);
              }
          }, true);
  
          // Note that we need to to parse the flattened tree because it might
          // contain additional packages
          mout.object.forOwn(flattened, function (node) {
              if (node.missing) {
                  return;
              }
  
              if (options.relative) {
                  node.canonicalDir = path.relative(config.cwd, node.canonicalDir);
              }
              if (options.paths) {
                  node.canonicalDir = normalize(node.canonicalDir);
              }
          });
  
          // Render paths?
          if (options.paths) {
              return paths(flattened);
          }
  
          // Do not check for new versions?
          if (config.offline) {
              return tree;
          }
  
          // Check for new versions
          return checkVersions(project, tree, logger)
          .then(function () {
              return tree;
          });
      });
  }
  
  function checkVersions(project, tree, logger) {
      var promises;
      var nodes = [];
      var repository = project.getPackageRepository();
  
      // Gather all nodes, ignoring linked nodes
      project.walkTree(tree, function (node) {
          if (!node.linked) {
              nodes.push(node);
          }
      }, true);
  
      if (nodes.length) {
          logger.info('check-new', 'Checking for new versions of the project dependencies...');
      }
  
      // Check for new versions for each node
      promises = nodes.map(function (node) {
          var target = node.endpoint.target;
  
          return repository.versions(node.endpoint.source)
          .then(function (versions) {
              node.versions = versions;
  
              // Do not check if node's target is not a valid semver one
              if (versions.length && semver.validRange(target)) {
                  node.update = {
                      target: semver.maxSatisfying(versions, target),
                      latest: semver.maxSatisfying(versions, '*')
                  };
              }
          });
      });
  
      // Set the versions also for the root node
      tree.versions = [];
  
      return Q.all(promises);
  }
  
  function paths(flattened) {
      var ret = {};
  
      mout.object.forOwn(flattened, function (pkg, name) {
          var main;
  
          if (pkg.missing) {
              return;
          }
  
          main = pkg.pkgMeta.main;
  
          // If no main was specified, fallback to canonical dir
          if (!main) {
              ret[name] = pkg.canonicalDir;
              return;
          }
  
          // Normalize main
          if (typeof main === 'string') {
              main = [main];
          }
  
          // Concatenate each main entry with the canonical dir
          main = main.map(function (part) {
              return normalize(path.join(pkg.canonicalDir, part).trim());
          });
  
          // If only one main file, use a string
          // Otherwise use an array
          ret[name] = main.length === 1 ? main[0] : main;
      });
  
      return ret;
  }
  
  function normalize(src) {
      return src.replace(/\\/g, '/');
  }
  
  // -------------------
  
  list.readOptions = function (argv) {
      var cli = require('../util/cli');
  
      var options = cli.readOptions({
          'paths': { type: Boolean, shorthand: 'p' },
          'relative': { type: Boolean, shorthand: 'r' }
      }, argv);
  
      delete options.argv;
  
      return [options];
  };
  
  module.exports = list;