Blame view

node_modules/shelljs/src/find.js 1.52 KB
aaac7fed   liuqimichale   add
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
  var fs = require('fs');
  var path = require('path');
  var common = require('./common');
  var _ls = require('./ls');
  
  common.register('find', _find, {});
  
  //@
  //@ ### find(path [, path ...])
  //@ ### find(path_array)
  //@ Examples:
  //@
  //@ ```javascript
  //@ find('src', 'lib');
  //@ find(['src', 'lib']); // same as above
  //@ find('.').filter(function(file) { return file.match(/\.js$/); });
  //@ ```
  //@
  //@ Returns array of all files (however deep) in the given paths.
  //@
  //@ The main difference from `ls('-R', path)` is that the resulting file names
  //@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`.
  function _find(options, paths) {
    if (!paths) {
      common.error('no path specified');
    } else if (typeof paths === 'string') {
      paths = [].slice.call(arguments, 1);
    }
  
    var list = [];
  
    function pushFile(file) {
      if (process.platform === 'win32') {
        file = file.replace(/\\/g, '/');
      }
      list.push(file);
    }
  
    // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs
    // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory
  
    paths.forEach(function (file) {
      var stat;
      try {
        stat = fs.statSync(file);
      } catch (e) {
        common.error('no such file or directory: ' + file);
      }
  
      pushFile(file);
  
      if (stat.isDirectory()) {
        _ls({ recursive: true, all: true }, file).forEach(function (subfile) {
          pushFile(path.join(file, subfile));
        });
      }
    });
  
    return list;
  }
  module.exports = _find;