liudong
2023-05-29 340f156319b863525e50e900c58e59b86ecb3d5e
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
var path = require('path')
var fs = require('fs')
var _0777 = parseInt('0777', 8)
 
module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP
 
function mkdirP (p, opts, f, made) {
  if (typeof opts === 'function') {
    f = opts
    opts = {}
  } else if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }
 
  var mode = opts.mode
  var xfs = opts.fs || fs
 
  if (mode === undefined) {
    mode = _0777 & (~process.umask())
  }
  if (!made) made = null
 
  var cb = f || function () {}
  p = path.resolve(p)
 
  xfs.mkdir(p, mode, function (er) {
    if (!er) {
      made = made || p
      return cb(null, made)
    }
    switch (er.code) {
      case 'ENOENT':
        mkdirP(path.dirname(p), opts, function (er, made) {
          if (er) cb(er, made)
          else mkdirP(p, opts, cb, made)
        })
        break
 
      // In the case of any other error, just see if there's a dir
      // there already.  If so, then hooray!  If not, then something
      // is borked.
      default:
        xfs.stat(p, function (er2, stat) {
          // if the stat fails, then that's super weird.
          // let the original error be the failure reason.
          if (er2 || !stat.isDirectory()) cb(er, made)
          else cb(null, made)
        })
        break
    }
  })
}
 
mkdirP.sync = function sync (p, opts, made) {
  if (!opts || typeof opts !== 'object') {
    opts = { mode: opts }
  }
 
  var mode = opts.mode
  var xfs = opts.fs || fs
 
  if (mode === undefined) {
    mode = _0777 & (~process.umask())
  }
  if (!made) made = null
 
  p = path.resolve(p)
 
  try {
    xfs.mkdirSync(p, mode)
    made = made || p
  } catch (err0) {
    switch (err0.code) {
      case 'ENOENT' :
        made = sync(path.dirname(p), opts, made)
        sync(p, opts, made)
        break
 
      // In the case of any other error, just see if there's a dir
      // there already.  If so, then hooray!  If not, then something
      // is borked.
      default:
        var stat
        try {
          stat = xfs.statSync(p)
        } catch (err1) {
          throw err0
        }
        if (!stat.isDirectory()) throw err0
        break
    }
  }
 
  return made
}
 
mkdirP.promise = function (p, opts) {
  return new Promise(function (resolve, reject) {
    mkdirP(p, opts, function (err) {
      if (err) {
        reject(err)
      } else {
        resolve()
      }
    })
  })
}