Bump @actions/artifact to version 0.5.1 (#189)
* Bump @actions/artifact to version 0.5.1 * Update license versions
This commit is contained in:
parent
bcd44ad93d
commit
ee69f02b3d
BIN
.licenses/npm/@actions/artifact.dep.yml
generated
BIN
.licenses/npm/@actions/artifact.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/http-client.dep.yml
generated
BIN
.licenses/npm/@actions/http-client.dep.yml
generated
Binary file not shown.
3046
dist/index.js
vendored
3046
dist/index.js
vendored
@ -1446,803 +1446,6 @@ exports.realpath = function realpath(p, cache, cb) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 120:
|
|
||||||
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|
||||||
|
|
||||||
// Approach:
|
|
||||||
//
|
|
||||||
// 1. Get the minimatch set
|
|
||||||
// 2. For each pattern in the set, PROCESS(pattern, false)
|
|
||||||
// 3. Store matches per-set, then uniq them
|
|
||||||
//
|
|
||||||
// PROCESS(pattern, inGlobStar)
|
|
||||||
// Get the first [n] items from pattern that are all strings
|
|
||||||
// Join these together. This is PREFIX.
|
|
||||||
// If there is no more remaining, then stat(PREFIX) and
|
|
||||||
// add to matches if it succeeds. END.
|
|
||||||
//
|
|
||||||
// If inGlobStar and PREFIX is symlink and points to dir
|
|
||||||
// set ENTRIES = []
|
|
||||||
// else readdir(PREFIX) as ENTRIES
|
|
||||||
// If fail, END
|
|
||||||
//
|
|
||||||
// with ENTRIES
|
|
||||||
// If pattern[n] is GLOBSTAR
|
|
||||||
// // handle the case where the globstar match is empty
|
|
||||||
// // by pruning it out, and testing the resulting pattern
|
|
||||||
// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
|
|
||||||
// // handle other cases.
|
|
||||||
// for ENTRY in ENTRIES (not dotfiles)
|
|
||||||
// // attach globstar + tail onto the entry
|
|
||||||
// // Mark that this entry is a globstar match
|
|
||||||
// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
|
|
||||||
//
|
|
||||||
// else // not globstar
|
|
||||||
// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
|
|
||||||
// Test ENTRY against pattern[n]
|
|
||||||
// If fails, continue
|
|
||||||
// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
|
|
||||||
//
|
|
||||||
// Caveat:
|
|
||||||
// Cache all stats and readdirs results to minimize syscall. Since all
|
|
||||||
// we ever care about is existence and directory-ness, we can just keep
|
|
||||||
// `true` for files, and [children,...] for directories, or `false` for
|
|
||||||
// things that don't exist.
|
|
||||||
|
|
||||||
module.exports = glob
|
|
||||||
|
|
||||||
var fs = __webpack_require__(747)
|
|
||||||
var rp = __webpack_require__(302)
|
|
||||||
var minimatch = __webpack_require__(93)
|
|
||||||
var Minimatch = minimatch.Minimatch
|
|
||||||
var inherits = __webpack_require__(689)
|
|
||||||
var EE = __webpack_require__(614).EventEmitter
|
|
||||||
var path = __webpack_require__(622)
|
|
||||||
var assert = __webpack_require__(357)
|
|
||||||
var isAbsolute = __webpack_require__(681)
|
|
||||||
var globSync = __webpack_require__(245)
|
|
||||||
var common = __webpack_require__(856)
|
|
||||||
var alphasort = common.alphasort
|
|
||||||
var alphasorti = common.alphasorti
|
|
||||||
var setopts = common.setopts
|
|
||||||
var ownProp = common.ownProp
|
|
||||||
var inflight = __webpack_require__(674)
|
|
||||||
var util = __webpack_require__(669)
|
|
||||||
var childrenIgnored = common.childrenIgnored
|
|
||||||
var isIgnored = common.isIgnored
|
|
||||||
|
|
||||||
var once = __webpack_require__(49)
|
|
||||||
|
|
||||||
function glob (pattern, options, cb) {
|
|
||||||
if (typeof options === 'function') cb = options, options = {}
|
|
||||||
if (!options) options = {}
|
|
||||||
|
|
||||||
if (options.sync) {
|
|
||||||
if (cb)
|
|
||||||
throw new TypeError('callback provided to sync glob')
|
|
||||||
return globSync(pattern, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Glob(pattern, options, cb)
|
|
||||||
}
|
|
||||||
|
|
||||||
glob.sync = globSync
|
|
||||||
var GlobSync = glob.GlobSync = globSync.GlobSync
|
|
||||||
|
|
||||||
// old api surface
|
|
||||||
glob.glob = glob
|
|
||||||
|
|
||||||
function extend (origin, add) {
|
|
||||||
if (add === null || typeof add !== 'object') {
|
|
||||||
return origin
|
|
||||||
}
|
|
||||||
|
|
||||||
var keys = Object.keys(add)
|
|
||||||
var i = keys.length
|
|
||||||
while (i--) {
|
|
||||||
origin[keys[i]] = add[keys[i]]
|
|
||||||
}
|
|
||||||
return origin
|
|
||||||
}
|
|
||||||
|
|
||||||
glob.hasMagic = function (pattern, options_) {
|
|
||||||
var options = extend({}, options_)
|
|
||||||
options.noprocess = true
|
|
||||||
|
|
||||||
var g = new Glob(pattern, options)
|
|
||||||
var set = g.minimatch.set
|
|
||||||
|
|
||||||
if (!pattern)
|
|
||||||
return false
|
|
||||||
|
|
||||||
if (set.length > 1)
|
|
||||||
return true
|
|
||||||
|
|
||||||
for (var j = 0; j < set[0].length; j++) {
|
|
||||||
if (typeof set[0][j] !== 'string')
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
glob.Glob = Glob
|
|
||||||
inherits(Glob, EE)
|
|
||||||
function Glob (pattern, options, cb) {
|
|
||||||
if (typeof options === 'function') {
|
|
||||||
cb = options
|
|
||||||
options = null
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options && options.sync) {
|
|
||||||
if (cb)
|
|
||||||
throw new TypeError('callback provided to sync glob')
|
|
||||||
return new GlobSync(pattern, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(this instanceof Glob))
|
|
||||||
return new Glob(pattern, options, cb)
|
|
||||||
|
|
||||||
setopts(this, pattern, options)
|
|
||||||
this._didRealPath = false
|
|
||||||
|
|
||||||
// process each pattern in the minimatch set
|
|
||||||
var n = this.minimatch.set.length
|
|
||||||
|
|
||||||
// The matches are stored as {<filename>: true,...} so that
|
|
||||||
// duplicates are automagically pruned.
|
|
||||||
// Later, we do an Object.keys() on these.
|
|
||||||
// Keep them as a list so we can fill in when nonull is set.
|
|
||||||
this.matches = new Array(n)
|
|
||||||
|
|
||||||
if (typeof cb === 'function') {
|
|
||||||
cb = once(cb)
|
|
||||||
this.on('error', cb)
|
|
||||||
this.on('end', function (matches) {
|
|
||||||
cb(null, matches)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var self = this
|
|
||||||
this._processing = 0
|
|
||||||
|
|
||||||
this._emitQueue = []
|
|
||||||
this._processQueue = []
|
|
||||||
this.paused = false
|
|
||||||
|
|
||||||
if (this.noprocess)
|
|
||||||
return this
|
|
||||||
|
|
||||||
if (n === 0)
|
|
||||||
return done()
|
|
||||||
|
|
||||||
var sync = true
|
|
||||||
for (var i = 0; i < n; i ++) {
|
|
||||||
this._process(this.minimatch.set[i], i, false, done)
|
|
||||||
}
|
|
||||||
sync = false
|
|
||||||
|
|
||||||
function done () {
|
|
||||||
--self._processing
|
|
||||||
if (self._processing <= 0) {
|
|
||||||
if (sync) {
|
|
||||||
process.nextTick(function () {
|
|
||||||
self._finish()
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
self._finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._finish = function () {
|
|
||||||
assert(this instanceof Glob)
|
|
||||||
if (this.aborted)
|
|
||||||
return
|
|
||||||
|
|
||||||
if (this.realpath && !this._didRealpath)
|
|
||||||
return this._realpath()
|
|
||||||
|
|
||||||
common.finish(this)
|
|
||||||
this.emit('end', this.found)
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._realpath = function () {
|
|
||||||
if (this._didRealpath)
|
|
||||||
return
|
|
||||||
|
|
||||||
this._didRealpath = true
|
|
||||||
|
|
||||||
var n = this.matches.length
|
|
||||||
if (n === 0)
|
|
||||||
return this._finish()
|
|
||||||
|
|
||||||
var self = this
|
|
||||||
for (var i = 0; i < this.matches.length; i++)
|
|
||||||
this._realpathSet(i, next)
|
|
||||||
|
|
||||||
function next () {
|
|
||||||
if (--n === 0)
|
|
||||||
self._finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._realpathSet = function (index, cb) {
|
|
||||||
var matchset = this.matches[index]
|
|
||||||
if (!matchset)
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
var found = Object.keys(matchset)
|
|
||||||
var self = this
|
|
||||||
var n = found.length
|
|
||||||
|
|
||||||
if (n === 0)
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
var set = this.matches[index] = Object.create(null)
|
|
||||||
found.forEach(function (p, i) {
|
|
||||||
// If there's a problem with the stat, then it means that
|
|
||||||
// one or more of the links in the realpath couldn't be
|
|
||||||
// resolved. just return the abs value in that case.
|
|
||||||
p = self._makeAbs(p)
|
|
||||||
rp.realpath(p, self.realpathCache, function (er, real) {
|
|
||||||
if (!er)
|
|
||||||
set[real] = true
|
|
||||||
else if (er.syscall === 'stat')
|
|
||||||
set[p] = true
|
|
||||||
else
|
|
||||||
self.emit('error', er) // srsly wtf right here
|
|
||||||
|
|
||||||
if (--n === 0) {
|
|
||||||
self.matches[index] = set
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._mark = function (p) {
|
|
||||||
return common.mark(this, p)
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._makeAbs = function (f) {
|
|
||||||
return common.makeAbs(this, f)
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype.abort = function () {
|
|
||||||
this.aborted = true
|
|
||||||
this.emit('abort')
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype.pause = function () {
|
|
||||||
if (!this.paused) {
|
|
||||||
this.paused = true
|
|
||||||
this.emit('pause')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype.resume = function () {
|
|
||||||
if (this.paused) {
|
|
||||||
this.emit('resume')
|
|
||||||
this.paused = false
|
|
||||||
if (this._emitQueue.length) {
|
|
||||||
var eq = this._emitQueue.slice(0)
|
|
||||||
this._emitQueue.length = 0
|
|
||||||
for (var i = 0; i < eq.length; i ++) {
|
|
||||||
var e = eq[i]
|
|
||||||
this._emitMatch(e[0], e[1])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this._processQueue.length) {
|
|
||||||
var pq = this._processQueue.slice(0)
|
|
||||||
this._processQueue.length = 0
|
|
||||||
for (var i = 0; i < pq.length; i ++) {
|
|
||||||
var p = pq[i]
|
|
||||||
this._processing--
|
|
||||||
this._process(p[0], p[1], p[2], p[3])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
|
|
||||||
assert(this instanceof Glob)
|
|
||||||
assert(typeof cb === 'function')
|
|
||||||
|
|
||||||
if (this.aborted)
|
|
||||||
return
|
|
||||||
|
|
||||||
this._processing++
|
|
||||||
if (this.paused) {
|
|
||||||
this._processQueue.push([pattern, index, inGlobStar, cb])
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//console.error('PROCESS %d', this._processing, pattern)
|
|
||||||
|
|
||||||
// Get the first [n] parts of pattern that are all strings.
|
|
||||||
var n = 0
|
|
||||||
while (typeof pattern[n] === 'string') {
|
|
||||||
n ++
|
|
||||||
}
|
|
||||||
// now n is the index of the first one that is *not* a string.
|
|
||||||
|
|
||||||
// see if there's anything else
|
|
||||||
var prefix
|
|
||||||
switch (n) {
|
|
||||||
// if not, then this is rather simple
|
|
||||||
case pattern.length:
|
|
||||||
this._processSimple(pattern.join('/'), index, cb)
|
|
||||||
return
|
|
||||||
|
|
||||||
case 0:
|
|
||||||
// pattern *starts* with some non-trivial item.
|
|
||||||
// going to readdir(cwd), but not include the prefix in matches.
|
|
||||||
prefix = null
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
// pattern has some string bits in the front.
|
|
||||||
// whatever it starts with, whether that's 'absolute' like /foo/bar,
|
|
||||||
// or 'relative' like '../baz'
|
|
||||||
prefix = pattern.slice(0, n).join('/')
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
var remain = pattern.slice(n)
|
|
||||||
|
|
||||||
// get the list of entries.
|
|
||||||
var read
|
|
||||||
if (prefix === null)
|
|
||||||
read = '.'
|
|
||||||
else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
|
|
||||||
if (!prefix || !isAbsolute(prefix))
|
|
||||||
prefix = '/' + prefix
|
|
||||||
read = prefix
|
|
||||||
} else
|
|
||||||
read = prefix
|
|
||||||
|
|
||||||
var abs = this._makeAbs(read)
|
|
||||||
|
|
||||||
//if ignored, skip _processing
|
|
||||||
if (childrenIgnored(this, read))
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
var isGlobStar = remain[0] === minimatch.GLOBSTAR
|
|
||||||
if (isGlobStar)
|
|
||||||
this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
|
|
||||||
else
|
|
||||||
this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
|
|
||||||
var self = this
|
|
||||||
this._readdir(abs, inGlobStar, function (er, entries) {
|
|
||||||
return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
|
|
||||||
|
|
||||||
// if the abs isn't a dir, then nothing can match!
|
|
||||||
if (!entries)
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
// It will only match dot entries if it starts with a dot, or if
|
|
||||||
// dot is set. Stuff like @(.foo|.bar) isn't allowed.
|
|
||||||
var pn = remain[0]
|
|
||||||
var negate = !!this.minimatch.negate
|
|
||||||
var rawGlob = pn._glob
|
|
||||||
var dotOk = this.dot || rawGlob.charAt(0) === '.'
|
|
||||||
|
|
||||||
var matchedEntries = []
|
|
||||||
for (var i = 0; i < entries.length; i++) {
|
|
||||||
var e = entries[i]
|
|
||||||
if (e.charAt(0) !== '.' || dotOk) {
|
|
||||||
var m
|
|
||||||
if (negate && !prefix) {
|
|
||||||
m = !e.match(pn)
|
|
||||||
} else {
|
|
||||||
m = e.match(pn)
|
|
||||||
}
|
|
||||||
if (m)
|
|
||||||
matchedEntries.push(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
|
|
||||||
|
|
||||||
var len = matchedEntries.length
|
|
||||||
// If there are no matched entries, then nothing matches.
|
|
||||||
if (len === 0)
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
// if this is the last remaining pattern bit, then no need for
|
|
||||||
// an additional stat *unless* the user has specified mark or
|
|
||||||
// stat explicitly. We know they exist, since readdir returned
|
|
||||||
// them.
|
|
||||||
|
|
||||||
if (remain.length === 1 && !this.mark && !this.stat) {
|
|
||||||
if (!this.matches[index])
|
|
||||||
this.matches[index] = Object.create(null)
|
|
||||||
|
|
||||||
for (var i = 0; i < len; i ++) {
|
|
||||||
var e = matchedEntries[i]
|
|
||||||
if (prefix) {
|
|
||||||
if (prefix !== '/')
|
|
||||||
e = prefix + '/' + e
|
|
||||||
else
|
|
||||||
e = prefix + e
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.charAt(0) === '/' && !this.nomount) {
|
|
||||||
e = path.join(this.root, e)
|
|
||||||
}
|
|
||||||
this._emitMatch(index, e)
|
|
||||||
}
|
|
||||||
// This was the last one, and no stats were needed
|
|
||||||
return cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
// now test all matched entries as stand-ins for that part
|
|
||||||
// of the pattern.
|
|
||||||
remain.shift()
|
|
||||||
for (var i = 0; i < len; i ++) {
|
|
||||||
var e = matchedEntries[i]
|
|
||||||
var newPattern
|
|
||||||
if (prefix) {
|
|
||||||
if (prefix !== '/')
|
|
||||||
e = prefix + '/' + e
|
|
||||||
else
|
|
||||||
e = prefix + e
|
|
||||||
}
|
|
||||||
this._process([e].concat(remain), index, inGlobStar, cb)
|
|
||||||
}
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._emitMatch = function (index, e) {
|
|
||||||
if (this.aborted)
|
|
||||||
return
|
|
||||||
|
|
||||||
if (isIgnored(this, e))
|
|
||||||
return
|
|
||||||
|
|
||||||
if (this.paused) {
|
|
||||||
this._emitQueue.push([index, e])
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var abs = isAbsolute(e) ? e : this._makeAbs(e)
|
|
||||||
|
|
||||||
if (this.mark)
|
|
||||||
e = this._mark(e)
|
|
||||||
|
|
||||||
if (this.absolute)
|
|
||||||
e = abs
|
|
||||||
|
|
||||||
if (this.matches[index][e])
|
|
||||||
return
|
|
||||||
|
|
||||||
if (this.nodir) {
|
|
||||||
var c = this.cache[abs]
|
|
||||||
if (c === 'DIR' || Array.isArray(c))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.matches[index][e] = true
|
|
||||||
|
|
||||||
var st = this.statCache[abs]
|
|
||||||
if (st)
|
|
||||||
this.emit('stat', e, st)
|
|
||||||
|
|
||||||
this.emit('match', e)
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._readdirInGlobStar = function (abs, cb) {
|
|
||||||
if (this.aborted)
|
|
||||||
return
|
|
||||||
|
|
||||||
// follow all symlinked directories forever
|
|
||||||
// just proceed as if this is a non-globstar situation
|
|
||||||
if (this.follow)
|
|
||||||
return this._readdir(abs, false, cb)
|
|
||||||
|
|
||||||
var lstatkey = 'lstat\0' + abs
|
|
||||||
var self = this
|
|
||||||
var lstatcb = inflight(lstatkey, lstatcb_)
|
|
||||||
|
|
||||||
if (lstatcb)
|
|
||||||
fs.lstat(abs, lstatcb)
|
|
||||||
|
|
||||||
function lstatcb_ (er, lstat) {
|
|
||||||
if (er && er.code === 'ENOENT')
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
var isSym = lstat && lstat.isSymbolicLink()
|
|
||||||
self.symlinks[abs] = isSym
|
|
||||||
|
|
||||||
// If it's not a symlink or a dir, then it's definitely a regular file.
|
|
||||||
// don't bother doing a readdir in that case.
|
|
||||||
if (!isSym && lstat && !lstat.isDirectory()) {
|
|
||||||
self.cache[abs] = 'FILE'
|
|
||||||
cb()
|
|
||||||
} else
|
|
||||||
self._readdir(abs, false, cb)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._readdir = function (abs, inGlobStar, cb) {
|
|
||||||
if (this.aborted)
|
|
||||||
return
|
|
||||||
|
|
||||||
cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
|
|
||||||
if (!cb)
|
|
||||||
return
|
|
||||||
|
|
||||||
//console.error('RD %j %j', +inGlobStar, abs)
|
|
||||||
if (inGlobStar && !ownProp(this.symlinks, abs))
|
|
||||||
return this._readdirInGlobStar(abs, cb)
|
|
||||||
|
|
||||||
if (ownProp(this.cache, abs)) {
|
|
||||||
var c = this.cache[abs]
|
|
||||||
if (!c || c === 'FILE')
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
if (Array.isArray(c))
|
|
||||||
return cb(null, c)
|
|
||||||
}
|
|
||||||
|
|
||||||
var self = this
|
|
||||||
fs.readdir(abs, readdirCb(this, abs, cb))
|
|
||||||
}
|
|
||||||
|
|
||||||
function readdirCb (self, abs, cb) {
|
|
||||||
return function (er, entries) {
|
|
||||||
if (er)
|
|
||||||
self._readdirError(abs, er, cb)
|
|
||||||
else
|
|
||||||
self._readdirEntries(abs, entries, cb)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._readdirEntries = function (abs, entries, cb) {
|
|
||||||
if (this.aborted)
|
|
||||||
return
|
|
||||||
|
|
||||||
// if we haven't asked to stat everything, then just
|
|
||||||
// assume that everything in there exists, so we can avoid
|
|
||||||
// having to stat it a second time.
|
|
||||||
if (!this.mark && !this.stat) {
|
|
||||||
for (var i = 0; i < entries.length; i ++) {
|
|
||||||
var e = entries[i]
|
|
||||||
if (abs === '/')
|
|
||||||
e = abs + e
|
|
||||||
else
|
|
||||||
e = abs + '/' + e
|
|
||||||
this.cache[e] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.cache[abs] = entries
|
|
||||||
return cb(null, entries)
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._readdirError = function (f, er, cb) {
|
|
||||||
if (this.aborted)
|
|
||||||
return
|
|
||||||
|
|
||||||
// handle errors, and cache the information
|
|
||||||
switch (er.code) {
|
|
||||||
case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
|
|
||||||
case 'ENOTDIR': // totally normal. means it *does* exist.
|
|
||||||
var abs = this._makeAbs(f)
|
|
||||||
this.cache[abs] = 'FILE'
|
|
||||||
if (abs === this.cwdAbs) {
|
|
||||||
var error = new Error(er.code + ' invalid cwd ' + this.cwd)
|
|
||||||
error.path = this.cwd
|
|
||||||
error.code = er.code
|
|
||||||
this.emit('error', error)
|
|
||||||
this.abort()
|
|
||||||
}
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'ENOENT': // not terribly unusual
|
|
||||||
case 'ELOOP':
|
|
||||||
case 'ENAMETOOLONG':
|
|
||||||
case 'UNKNOWN':
|
|
||||||
this.cache[this._makeAbs(f)] = false
|
|
||||||
break
|
|
||||||
|
|
||||||
default: // some unusual error. Treat as failure.
|
|
||||||
this.cache[this._makeAbs(f)] = false
|
|
||||||
if (this.strict) {
|
|
||||||
this.emit('error', er)
|
|
||||||
// If the error is handled, then we abort
|
|
||||||
// if not, we threw out of here
|
|
||||||
this.abort()
|
|
||||||
}
|
|
||||||
if (!this.silent)
|
|
||||||
console.error('glob error', er)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
return cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
|
|
||||||
var self = this
|
|
||||||
this._readdir(abs, inGlobStar, function (er, entries) {
|
|
||||||
self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
|
|
||||||
//console.error('pgs2', prefix, remain[0], entries)
|
|
||||||
|
|
||||||
// no entries means not a dir, so it can never have matches
|
|
||||||
// foo.txt/** doesn't match foo.txt
|
|
||||||
if (!entries)
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
// test without the globstar, and with every child both below
|
|
||||||
// and replacing the globstar.
|
|
||||||
var remainWithoutGlobStar = remain.slice(1)
|
|
||||||
var gspref = prefix ? [ prefix ] : []
|
|
||||||
var noGlobStar = gspref.concat(remainWithoutGlobStar)
|
|
||||||
|
|
||||||
// the noGlobStar pattern exits the inGlobStar state
|
|
||||||
this._process(noGlobStar, index, false, cb)
|
|
||||||
|
|
||||||
var isSym = this.symlinks[abs]
|
|
||||||
var len = entries.length
|
|
||||||
|
|
||||||
// If it's a symlink, and we're in a globstar, then stop
|
|
||||||
if (isSym && inGlobStar)
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
for (var i = 0; i < len; i++) {
|
|
||||||
var e = entries[i]
|
|
||||||
if (e.charAt(0) === '.' && !this.dot)
|
|
||||||
continue
|
|
||||||
|
|
||||||
// these two cases enter the inGlobStar state
|
|
||||||
var instead = gspref.concat(entries[i], remainWithoutGlobStar)
|
|
||||||
this._process(instead, index, true, cb)
|
|
||||||
|
|
||||||
var below = gspref.concat(entries[i], remain)
|
|
||||||
this._process(below, index, true, cb)
|
|
||||||
}
|
|
||||||
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._processSimple = function (prefix, index, cb) {
|
|
||||||
// XXX review this. Shouldn't it be doing the mounting etc
|
|
||||||
// before doing stat? kinda weird?
|
|
||||||
var self = this
|
|
||||||
this._stat(prefix, function (er, exists) {
|
|
||||||
self._processSimple2(prefix, index, er, exists, cb)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
|
|
||||||
|
|
||||||
//console.error('ps2', prefix, exists)
|
|
||||||
|
|
||||||
if (!this.matches[index])
|
|
||||||
this.matches[index] = Object.create(null)
|
|
||||||
|
|
||||||
// If it doesn't exist, then just mark the lack of results
|
|
||||||
if (!exists)
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
if (prefix && isAbsolute(prefix) && !this.nomount) {
|
|
||||||
var trail = /[\/\\]$/.test(prefix)
|
|
||||||
if (prefix.charAt(0) === '/') {
|
|
||||||
prefix = path.join(this.root, prefix)
|
|
||||||
} else {
|
|
||||||
prefix = path.resolve(this.root, prefix)
|
|
||||||
if (trail)
|
|
||||||
prefix += '/'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.platform === 'win32')
|
|
||||||
prefix = prefix.replace(/\\/g, '/')
|
|
||||||
|
|
||||||
// Mark this as a match
|
|
||||||
this._emitMatch(index, prefix)
|
|
||||||
cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns either 'DIR', 'FILE', or false
|
|
||||||
Glob.prototype._stat = function (f, cb) {
|
|
||||||
var abs = this._makeAbs(f)
|
|
||||||
var needDir = f.slice(-1) === '/'
|
|
||||||
|
|
||||||
if (f.length > this.maxLength)
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
if (!this.stat && ownProp(this.cache, abs)) {
|
|
||||||
var c = this.cache[abs]
|
|
||||||
|
|
||||||
if (Array.isArray(c))
|
|
||||||
c = 'DIR'
|
|
||||||
|
|
||||||
// It exists, but maybe not how we need it
|
|
||||||
if (!needDir || c === 'DIR')
|
|
||||||
return cb(null, c)
|
|
||||||
|
|
||||||
if (needDir && c === 'FILE')
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
// otherwise we have to stat, because maybe c=true
|
|
||||||
// if we know it exists, but not what it is.
|
|
||||||
}
|
|
||||||
|
|
||||||
var exists
|
|
||||||
var stat = this.statCache[abs]
|
|
||||||
if (stat !== undefined) {
|
|
||||||
if (stat === false)
|
|
||||||
return cb(null, stat)
|
|
||||||
else {
|
|
||||||
var type = stat.isDirectory() ? 'DIR' : 'FILE'
|
|
||||||
if (needDir && type === 'FILE')
|
|
||||||
return cb()
|
|
||||||
else
|
|
||||||
return cb(null, type, stat)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var self = this
|
|
||||||
var statcb = inflight('stat\0' + abs, lstatcb_)
|
|
||||||
if (statcb)
|
|
||||||
fs.lstat(abs, statcb)
|
|
||||||
|
|
||||||
function lstatcb_ (er, lstat) {
|
|
||||||
if (lstat && lstat.isSymbolicLink()) {
|
|
||||||
// If it's a symlink, then treat it as the target, unless
|
|
||||||
// the target does not exist, then treat it as a file.
|
|
||||||
return fs.stat(abs, function (er, stat) {
|
|
||||||
if (er)
|
|
||||||
self._stat2(f, abs, null, lstat, cb)
|
|
||||||
else
|
|
||||||
self._stat2(f, abs, er, stat, cb)
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
self._stat2(f, abs, er, lstat, cb)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
|
|
||||||
if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
|
|
||||||
this.statCache[abs] = false
|
|
||||||
return cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
var needDir = f.slice(-1) === '/'
|
|
||||||
this.statCache[abs] = stat
|
|
||||||
|
|
||||||
if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
|
|
||||||
return cb(null, false, stat)
|
|
||||||
|
|
||||||
var c = true
|
|
||||||
if (stat)
|
|
||||||
c = stat.isDirectory() ? 'DIR' : 'FILE'
|
|
||||||
this.cache[abs] = this.cache[abs] || c
|
|
||||||
|
|
||||||
if (needDir && c === 'FILE')
|
|
||||||
return cb()
|
|
||||||
|
|
||||||
return cb(null, c, stat)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 141:
|
/***/ 141:
|
||||||
@ -2515,6 +1718,775 @@ if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
|
|||||||
exports.debug = debug; // for test
|
exports.debug = debug; // for test
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 150:
|
||||||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Tmp
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011-2017 KARASZI Istvan <github@spam.raszi.hu>
|
||||||
|
*
|
||||||
|
* MIT Licensed
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
const fs = __webpack_require__(747);
|
||||||
|
const os = __webpack_require__(87);
|
||||||
|
const path = __webpack_require__(622);
|
||||||
|
const crypto = __webpack_require__(417);
|
||||||
|
const _c = fs.constants && os.constants ?
|
||||||
|
{ fs: fs.constants, os: os.constants } :
|
||||||
|
process.binding('constants');
|
||||||
|
const rimraf = __webpack_require__(569);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The working inner variables.
|
||||||
|
*/
|
||||||
|
const
|
||||||
|
// the random characters to choose from
|
||||||
|
RANDOM_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
|
||||||
|
|
||||||
|
TEMPLATE_PATTERN = /XXXXXX/,
|
||||||
|
|
||||||
|
DEFAULT_TRIES = 3,
|
||||||
|
|
||||||
|
CREATE_FLAGS = (_c.O_CREAT || _c.fs.O_CREAT) | (_c.O_EXCL || _c.fs.O_EXCL) | (_c.O_RDWR || _c.fs.O_RDWR),
|
||||||
|
|
||||||
|
EBADF = _c.EBADF || _c.os.errno.EBADF,
|
||||||
|
ENOENT = _c.ENOENT || _c.os.errno.ENOENT,
|
||||||
|
|
||||||
|
DIR_MODE = 448 /* 0o700 */,
|
||||||
|
FILE_MODE = 384 /* 0o600 */,
|
||||||
|
|
||||||
|
EXIT = 'exit',
|
||||||
|
|
||||||
|
SIGINT = 'SIGINT',
|
||||||
|
|
||||||
|
// this will hold the objects need to be removed on exit
|
||||||
|
_removeObjects = [];
|
||||||
|
|
||||||
|
var
|
||||||
|
_gracefulCleanup = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Random name generator based on crypto.
|
||||||
|
* Adapted from http://blog.tompawlak.org/how-to-generate-random-values-nodejs-javascript
|
||||||
|
*
|
||||||
|
* @param {number} howMany
|
||||||
|
* @returns {string} the generated random name
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _randomChars(howMany) {
|
||||||
|
var
|
||||||
|
value = [],
|
||||||
|
rnd = null;
|
||||||
|
|
||||||
|
// make sure that we do not fail because we ran out of entropy
|
||||||
|
try {
|
||||||
|
rnd = crypto.randomBytes(howMany);
|
||||||
|
} catch (e) {
|
||||||
|
rnd = crypto.pseudoRandomBytes(howMany);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < howMany; i++) {
|
||||||
|
value.push(RANDOM_CHARS[rnd[i] % RANDOM_CHARS.length]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return value.join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the `obj` parameter is defined or not.
|
||||||
|
*
|
||||||
|
* @param {Object} obj
|
||||||
|
* @returns {boolean} true if the object is undefined
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _isUndefined(obj) {
|
||||||
|
return typeof obj === 'undefined';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the function arguments.
|
||||||
|
*
|
||||||
|
* This function helps to have optional arguments.
|
||||||
|
*
|
||||||
|
* @param {(Options|Function)} options
|
||||||
|
* @param {Function} callback
|
||||||
|
* @returns {Array} parsed arguments
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _parseArguments(options, callback) {
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (typeof options === 'function') {
|
||||||
|
return [{}, options];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (_isUndefined(options)) {
|
||||||
|
return [{}, callback];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [options, callback];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a new temporary name.
|
||||||
|
*
|
||||||
|
* @param {Object} opts
|
||||||
|
* @returns {string} the new random name according to opts
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _generateTmpName(opts) {
|
||||||
|
|
||||||
|
const tmpDir = _getTmpDir();
|
||||||
|
|
||||||
|
// fail early on missing tmp dir
|
||||||
|
if (isBlank(opts.dir) && isBlank(tmpDir)) {
|
||||||
|
throw new Error('No tmp dir specified');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (!isBlank(opts.name)) {
|
||||||
|
return path.join(opts.dir || tmpDir, opts.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// mkstemps like template
|
||||||
|
// opts.template has already been guarded in tmpName() below
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (opts.template) {
|
||||||
|
var template = opts.template;
|
||||||
|
// make sure that we prepend the tmp path if none was given
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (path.basename(template) === template)
|
||||||
|
template = path.join(opts.dir || tmpDir, template);
|
||||||
|
return template.replace(TEMPLATE_PATTERN, _randomChars(6));
|
||||||
|
}
|
||||||
|
|
||||||
|
// prefix and postfix
|
||||||
|
const name = [
|
||||||
|
(isBlank(opts.prefix) ? 'tmp-' : opts.prefix),
|
||||||
|
process.pid,
|
||||||
|
_randomChars(12),
|
||||||
|
(opts.postfix ? opts.postfix : '')
|
||||||
|
].join('');
|
||||||
|
|
||||||
|
return path.join(opts.dir || tmpDir, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a temporary file name.
|
||||||
|
*
|
||||||
|
* @param {(Options|tmpNameCallback)} options options or callback
|
||||||
|
* @param {?tmpNameCallback} callback the callback function
|
||||||
|
*/
|
||||||
|
function tmpName(options, callback) {
|
||||||
|
var
|
||||||
|
args = _parseArguments(options, callback),
|
||||||
|
opts = args[0],
|
||||||
|
cb = args[1],
|
||||||
|
tries = !isBlank(opts.name) ? 1 : opts.tries || DEFAULT_TRIES;
|
||||||
|
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (isNaN(tries) || tries < 0)
|
||||||
|
return cb(new Error('Invalid tries'));
|
||||||
|
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (opts.template && !opts.template.match(TEMPLATE_PATTERN))
|
||||||
|
return cb(new Error('Invalid template provided'));
|
||||||
|
|
||||||
|
(function _getUniqueName() {
|
||||||
|
try {
|
||||||
|
const name = _generateTmpName(opts);
|
||||||
|
|
||||||
|
// check whether the path exists then retry if needed
|
||||||
|
fs.stat(name, function (err) {
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (!err) {
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (tries-- > 0) return _getUniqueName();
|
||||||
|
|
||||||
|
return cb(new Error('Could not get a unique tmp filename, max tries reached ' + name));
|
||||||
|
}
|
||||||
|
|
||||||
|
cb(null, name);
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
cb(err);
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Synchronous version of tmpName.
|
||||||
|
*
|
||||||
|
* @param {Object} options
|
||||||
|
* @returns {string} the generated random name
|
||||||
|
* @throws {Error} if the options are invalid or could not generate a filename
|
||||||
|
*/
|
||||||
|
function tmpNameSync(options) {
|
||||||
|
var
|
||||||
|
args = _parseArguments(options),
|
||||||
|
opts = args[0],
|
||||||
|
tries = !isBlank(opts.name) ? 1 : opts.tries || DEFAULT_TRIES;
|
||||||
|
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (isNaN(tries) || tries < 0)
|
||||||
|
throw new Error('Invalid tries');
|
||||||
|
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (opts.template && !opts.template.match(TEMPLATE_PATTERN))
|
||||||
|
throw new Error('Invalid template provided');
|
||||||
|
|
||||||
|
do {
|
||||||
|
const name = _generateTmpName(opts);
|
||||||
|
try {
|
||||||
|
fs.statSync(name);
|
||||||
|
} catch (e) {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
} while (tries-- > 0);
|
||||||
|
|
||||||
|
throw new Error('Could not get a unique tmp filename, max tries reached');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and opens a temporary file.
|
||||||
|
*
|
||||||
|
* @param {(Options|fileCallback)} options the config options or the callback function
|
||||||
|
* @param {?fileCallback} callback
|
||||||
|
*/
|
||||||
|
function file(options, callback) {
|
||||||
|
var
|
||||||
|
args = _parseArguments(options, callback),
|
||||||
|
opts = args[0],
|
||||||
|
cb = args[1];
|
||||||
|
|
||||||
|
// gets a temporary filename
|
||||||
|
tmpName(opts, function _tmpNameCreated(err, name) {
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (err) return cb(err);
|
||||||
|
|
||||||
|
// create and open the file
|
||||||
|
fs.open(name, CREATE_FLAGS, opts.mode || FILE_MODE, function _fileCreated(err, fd) {
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (err) return cb(err);
|
||||||
|
|
||||||
|
if (opts.discardDescriptor) {
|
||||||
|
return fs.close(fd, function _discardCallback(err) {
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (err) {
|
||||||
|
// Low probability, and the file exists, so this could be
|
||||||
|
// ignored. If it isn't we certainly need to unlink the
|
||||||
|
// file, and if that fails too its error is more
|
||||||
|
// important.
|
||||||
|
try {
|
||||||
|
fs.unlinkSync(name);
|
||||||
|
} catch (e) {
|
||||||
|
if (!isENOENT(e)) {
|
||||||
|
err = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cb(err);
|
||||||
|
}
|
||||||
|
cb(null, name, undefined, _prepareTmpFileRemoveCallback(name, -1, opts));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (opts.detachDescriptor) {
|
||||||
|
return cb(null, name, fd, _prepareTmpFileRemoveCallback(name, -1, opts));
|
||||||
|
}
|
||||||
|
cb(null, name, fd, _prepareTmpFileRemoveCallback(name, fd, opts));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Synchronous version of file.
|
||||||
|
*
|
||||||
|
* @param {Options} options
|
||||||
|
* @returns {FileSyncObject} object consists of name, fd and removeCallback
|
||||||
|
* @throws {Error} if cannot create a file
|
||||||
|
*/
|
||||||
|
function fileSync(options) {
|
||||||
|
var
|
||||||
|
args = _parseArguments(options),
|
||||||
|
opts = args[0];
|
||||||
|
|
||||||
|
const discardOrDetachDescriptor = opts.discardDescriptor || opts.detachDescriptor;
|
||||||
|
const name = tmpNameSync(opts);
|
||||||
|
var fd = fs.openSync(name, CREATE_FLAGS, opts.mode || FILE_MODE);
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (opts.discardDescriptor) {
|
||||||
|
fs.closeSync(fd);
|
||||||
|
fd = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: name,
|
||||||
|
fd: fd,
|
||||||
|
removeCallback: _prepareTmpFileRemoveCallback(name, discardOrDetachDescriptor ? -1 : fd, opts)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a temporary directory.
|
||||||
|
*
|
||||||
|
* @param {(Options|dirCallback)} options the options or the callback function
|
||||||
|
* @param {?dirCallback} callback
|
||||||
|
*/
|
||||||
|
function dir(options, callback) {
|
||||||
|
var
|
||||||
|
args = _parseArguments(options, callback),
|
||||||
|
opts = args[0],
|
||||||
|
cb = args[1];
|
||||||
|
|
||||||
|
// gets a temporary filename
|
||||||
|
tmpName(opts, function _tmpNameCreated(err, name) {
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (err) return cb(err);
|
||||||
|
|
||||||
|
// create the directory
|
||||||
|
fs.mkdir(name, opts.mode || DIR_MODE, function _dirCreated(err) {
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (err) return cb(err);
|
||||||
|
|
||||||
|
cb(null, name, _prepareTmpDirRemoveCallback(name, opts));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Synchronous version of dir.
|
||||||
|
*
|
||||||
|
* @param {Options} options
|
||||||
|
* @returns {DirSyncObject} object consists of name and removeCallback
|
||||||
|
* @throws {Error} if it cannot create a directory
|
||||||
|
*/
|
||||||
|
function dirSync(options) {
|
||||||
|
var
|
||||||
|
args = _parseArguments(options),
|
||||||
|
opts = args[0];
|
||||||
|
|
||||||
|
const name = tmpNameSync(opts);
|
||||||
|
fs.mkdirSync(name, opts.mode || DIR_MODE);
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: name,
|
||||||
|
removeCallback: _prepareTmpDirRemoveCallback(name, opts)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes files asynchronously.
|
||||||
|
*
|
||||||
|
* @param {Object} fdPath
|
||||||
|
* @param {Function} next
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _removeFileAsync(fdPath, next) {
|
||||||
|
const _handler = function (err) {
|
||||||
|
if (err && !isENOENT(err)) {
|
||||||
|
// reraise any unanticipated error
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 <= fdPath[0])
|
||||||
|
fs.close(fdPath[0], function (err) {
|
||||||
|
fs.unlink(fdPath[1], _handler);
|
||||||
|
});
|
||||||
|
else fs.unlink(fdPath[1], _handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes files synchronously.
|
||||||
|
*
|
||||||
|
* @param {Object} fdPath
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _removeFileSync(fdPath) {
|
||||||
|
try {
|
||||||
|
if (0 <= fdPath[0]) fs.closeSync(fdPath[0]);
|
||||||
|
} catch (e) {
|
||||||
|
// reraise any unanticipated error
|
||||||
|
if (!isEBADF(e) && !isENOENT(e)) throw e;
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
fs.unlinkSync(fdPath[1]);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
// reraise any unanticipated error
|
||||||
|
if (!isENOENT(e)) throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepares the callback for removal of the temporary file.
|
||||||
|
*
|
||||||
|
* @param {string} name the path of the file
|
||||||
|
* @param {number} fd file descriptor
|
||||||
|
* @param {Object} opts
|
||||||
|
* @returns {fileCallback}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _prepareTmpFileRemoveCallback(name, fd, opts) {
|
||||||
|
const removeCallbackSync = _prepareRemoveCallback(_removeFileSync, [fd, name]);
|
||||||
|
const removeCallback = _prepareRemoveCallback(_removeFileAsync, [fd, name], removeCallbackSync);
|
||||||
|
|
||||||
|
if (!opts.keep) _removeObjects.unshift(removeCallbackSync);
|
||||||
|
|
||||||
|
return removeCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple wrapper for rimraf.
|
||||||
|
*
|
||||||
|
* @param {string} dirPath
|
||||||
|
* @param {Function} next
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _rimrafRemoveDirWrapper(dirPath, next) {
|
||||||
|
rimraf(dirPath, next);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple wrapper for rimraf.sync.
|
||||||
|
*
|
||||||
|
* @param {string} dirPath
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _rimrafRemoveDirSyncWrapper(dirPath, next) {
|
||||||
|
try {
|
||||||
|
return next(null, rimraf.sync(dirPath));
|
||||||
|
} catch (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepares the callback for removal of the temporary directory.
|
||||||
|
*
|
||||||
|
* @param {string} name
|
||||||
|
* @param {Object} opts
|
||||||
|
* @returns {Function} the callback
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _prepareTmpDirRemoveCallback(name, opts) {
|
||||||
|
const removeFunction = opts.unsafeCleanup ? _rimrafRemoveDirWrapper : fs.rmdir.bind(fs);
|
||||||
|
const removeFunctionSync = opts.unsafeCleanup ? _rimrafRemoveDirSyncWrapper : fs.rmdirSync.bind(fs);
|
||||||
|
const removeCallbackSync = _prepareRemoveCallback(removeFunctionSync, name);
|
||||||
|
const removeCallback = _prepareRemoveCallback(removeFunction, name, removeCallbackSync);
|
||||||
|
if (!opts.keep) _removeObjects.unshift(removeCallbackSync);
|
||||||
|
|
||||||
|
return removeCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a guarded function wrapping the removeFunction call.
|
||||||
|
*
|
||||||
|
* @param {Function} removeFunction
|
||||||
|
* @param {Object} arg
|
||||||
|
* @returns {Function}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _prepareRemoveCallback(removeFunction, arg, cleanupCallbackSync) {
|
||||||
|
var called = false;
|
||||||
|
|
||||||
|
return function _cleanupCallback(next) {
|
||||||
|
next = next || function () {};
|
||||||
|
if (!called) {
|
||||||
|
const toRemove = cleanupCallbackSync || _cleanupCallback;
|
||||||
|
const index = _removeObjects.indexOf(toRemove);
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (index >= 0) _removeObjects.splice(index, 1);
|
||||||
|
|
||||||
|
called = true;
|
||||||
|
// sync?
|
||||||
|
if (removeFunction.length === 1) {
|
||||||
|
try {
|
||||||
|
removeFunction(arg);
|
||||||
|
return next(null);
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
// if no next is provided and since we are
|
||||||
|
// in silent cleanup mode on process exit,
|
||||||
|
// we will ignore the error
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
} else return removeFunction(arg, next);
|
||||||
|
} else return next(new Error('cleanup callback has already been called'));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The garbage collector.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _garbageCollector() {
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (!_gracefulCleanup) return;
|
||||||
|
|
||||||
|
// the function being called removes itself from _removeObjects,
|
||||||
|
// loop until _removeObjects is empty
|
||||||
|
while (_removeObjects.length) {
|
||||||
|
try {
|
||||||
|
_removeObjects[0]();
|
||||||
|
} catch (e) {
|
||||||
|
// already removed?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper for testing against EBADF to compensate changes made to Node 7.x under Windows.
|
||||||
|
*/
|
||||||
|
function isEBADF(error) {
|
||||||
|
return isExpectedError(error, -EBADF, 'EBADF');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper for testing against ENOENT to compensate changes made to Node 7.x under Windows.
|
||||||
|
*/
|
||||||
|
function isENOENT(error) {
|
||||||
|
return isExpectedError(error, -ENOENT, 'ENOENT');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper to determine whether the expected error code matches the actual code and errno,
|
||||||
|
* which will differ between the supported node versions.
|
||||||
|
*
|
||||||
|
* - Node >= 7.0:
|
||||||
|
* error.code {string}
|
||||||
|
* error.errno {string|number} any numerical value will be negated
|
||||||
|
*
|
||||||
|
* - Node >= 6.0 < 7.0:
|
||||||
|
* error.code {string}
|
||||||
|
* error.errno {number} negated
|
||||||
|
*
|
||||||
|
* - Node >= 4.0 < 6.0: introduces SystemError
|
||||||
|
* error.code {string}
|
||||||
|
* error.errno {number} negated
|
||||||
|
*
|
||||||
|
* - Node >= 0.10 < 4.0:
|
||||||
|
* error.code {number} negated
|
||||||
|
* error.errno n/a
|
||||||
|
*/
|
||||||
|
function isExpectedError(error, code, errno) {
|
||||||
|
return error.code === code || error.code === errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper which determines whether a string s is blank, that is undefined, or empty or null.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {string} s
|
||||||
|
* @returns {Boolean} true whether the string s is blank, false otherwise
|
||||||
|
*/
|
||||||
|
function isBlank(s) {
|
||||||
|
return s === null || s === undefined || !s.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the graceful cleanup.
|
||||||
|
*/
|
||||||
|
function setGracefulCleanup() {
|
||||||
|
_gracefulCleanup = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the currently configured tmp dir from os.tmpdir().
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @returns {string} the currently configured tmp dir
|
||||||
|
*/
|
||||||
|
function _getTmpDir() {
|
||||||
|
return os.tmpdir();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If there are multiple different versions of tmp in place, make sure that
|
||||||
|
* we recognize the old listeners.
|
||||||
|
*
|
||||||
|
* @param {Function} listener
|
||||||
|
* @private
|
||||||
|
* @returns {Boolean} true whether listener is a legacy listener
|
||||||
|
*/
|
||||||
|
function _is_legacy_listener(listener) {
|
||||||
|
return (listener.name === '_exit' || listener.name === '_uncaughtExceptionThrown')
|
||||||
|
&& listener.toString().indexOf('_garbageCollector();') > -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Safely install SIGINT listener.
|
||||||
|
*
|
||||||
|
* NOTE: this will only work on OSX and Linux.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _safely_install_sigint_listener() {
|
||||||
|
|
||||||
|
const listeners = process.listeners(SIGINT);
|
||||||
|
const existingListeners = [];
|
||||||
|
for (let i = 0, length = listeners.length; i < length; i++) {
|
||||||
|
const lstnr = listeners[i];
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (lstnr.name === '_tmp$sigint_listener') {
|
||||||
|
existingListeners.push(lstnr);
|
||||||
|
process.removeListener(SIGINT, lstnr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
process.on(SIGINT, function _tmp$sigint_listener(doExit) {
|
||||||
|
for (let i = 0, length = existingListeners.length; i < length; i++) {
|
||||||
|
// let the existing listener do the garbage collection (e.g. jest sandbox)
|
||||||
|
try {
|
||||||
|
existingListeners[i](false);
|
||||||
|
} catch (err) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// force the garbage collector even it is called again in the exit listener
|
||||||
|
_garbageCollector();
|
||||||
|
} finally {
|
||||||
|
if (!!doExit) {
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Safely install process exit listener.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
function _safely_install_exit_listener() {
|
||||||
|
const listeners = process.listeners(EXIT);
|
||||||
|
|
||||||
|
// collect any existing listeners
|
||||||
|
const existingListeners = [];
|
||||||
|
for (let i = 0, length = listeners.length; i < length; i++) {
|
||||||
|
const lstnr = listeners[i];
|
||||||
|
/* istanbul ignore else */
|
||||||
|
// TODO: remove support for legacy listeners once release 1.0.0 is out
|
||||||
|
if (lstnr.name === '_tmp$safe_listener' || _is_legacy_listener(lstnr)) {
|
||||||
|
// we must forget about the uncaughtException listener, hopefully it is ours
|
||||||
|
if (lstnr.name !== '_uncaughtExceptionThrown') {
|
||||||
|
existingListeners.push(lstnr);
|
||||||
|
}
|
||||||
|
process.removeListener(EXIT, lstnr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: what was the data parameter good for?
|
||||||
|
process.addListener(EXIT, function _tmp$safe_listener(data) {
|
||||||
|
for (let i = 0, length = existingListeners.length; i < length; i++) {
|
||||||
|
// let the existing listener do the garbage collection (e.g. jest sandbox)
|
||||||
|
try {
|
||||||
|
existingListeners[i](data);
|
||||||
|
} catch (err) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_garbageCollector();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_safely_install_exit_listener();
|
||||||
|
_safely_install_sigint_listener();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration options.
|
||||||
|
*
|
||||||
|
* @typedef {Object} Options
|
||||||
|
* @property {?number} tries the number of tries before give up the name generation
|
||||||
|
* @property {?string} template the "mkstemp" like filename template
|
||||||
|
* @property {?string} name fix name
|
||||||
|
* @property {?string} dir the tmp directory to use
|
||||||
|
* @property {?string} prefix prefix for the generated name
|
||||||
|
* @property {?string} postfix postfix for the generated name
|
||||||
|
* @property {?boolean} unsafeCleanup recursively removes the created temporary directory, even when it's not empty
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} FileSyncObject
|
||||||
|
* @property {string} name the name of the file
|
||||||
|
* @property {string} fd the file descriptor
|
||||||
|
* @property {fileCallback} removeCallback the callback function to remove the file
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} DirSyncObject
|
||||||
|
* @property {string} name the name of the directory
|
||||||
|
* @property {fileCallback} removeCallback the callback function to remove the directory
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback tmpNameCallback
|
||||||
|
* @param {?Error} err the error object if anything goes wrong
|
||||||
|
* @param {string} name the temporary file name
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback fileCallback
|
||||||
|
* @param {?Error} err the error object if anything goes wrong
|
||||||
|
* @param {string} name the temporary file name
|
||||||
|
* @param {number} fd the file descriptor
|
||||||
|
* @param {cleanupCallback} fn the cleanup callback function
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback dirCallback
|
||||||
|
* @param {?Error} err the error object if anything goes wrong
|
||||||
|
* @param {string} name the temporary file name
|
||||||
|
* @param {cleanupCallback} fn the cleanup callback function
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the temporary created file or directory.
|
||||||
|
*
|
||||||
|
* @callback cleanupCallback
|
||||||
|
* @param {simpleCallback} [next] function to call after entry was removed
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback function for function composition.
|
||||||
|
* @see {@link https://github.com/raszi/node-tmp/issues/57|raszi/node-tmp#57}
|
||||||
|
*
|
||||||
|
* @callback simpleCallback
|
||||||
|
*/
|
||||||
|
|
||||||
|
// exporting all the needed methods
|
||||||
|
|
||||||
|
// evaluate os.tmpdir() lazily, mainly for simplifying testing but it also will
|
||||||
|
// allow users to reconfigure the temporary directory
|
||||||
|
Object.defineProperty(module.exports, 'tmpdir', {
|
||||||
|
enumerable: true,
|
||||||
|
configurable: false,
|
||||||
|
get: function () {
|
||||||
|
return _getTmpDir();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports.dir = dir;
|
||||||
|
module.exports.dirSync = dirSync;
|
||||||
|
|
||||||
|
module.exports.file = file;
|
||||||
|
module.exports.fileSync = fileSync;
|
||||||
|
|
||||||
|
module.exports.tmpName = tmpName;
|
||||||
|
module.exports.tmpNameSync = tmpNameSync;
|
||||||
|
|
||||||
|
module.exports.setGracefulCleanup = setGracefulCleanup;
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 176:
|
/***/ 176:
|
||||||
@ -2689,7 +2661,7 @@ var fs = __webpack_require__(747)
|
|||||||
var rp = __webpack_require__(302)
|
var rp = __webpack_require__(302)
|
||||||
var minimatch = __webpack_require__(93)
|
var minimatch = __webpack_require__(93)
|
||||||
var Minimatch = minimatch.Minimatch
|
var Minimatch = minimatch.Minimatch
|
||||||
var Glob = __webpack_require__(120).Glob
|
var Glob = __webpack_require__(402).Glob
|
||||||
var util = __webpack_require__(669)
|
var util = __webpack_require__(669)
|
||||||
var path = __webpack_require__(622)
|
var path = __webpack_require__(622)
|
||||||
var assert = __webpack_require__(357)
|
var assert = __webpack_require__(357)
|
||||||
@ -4188,768 +4160,796 @@ exports.getRetentionDays = getRetentionDays;
|
|||||||
/***/ 402:
|
/***/ 402:
|
||||||
/***/ (function(module, __unusedexports, __webpack_require__) {
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
||||||
|
|
||||||
/*!
|
// Approach:
|
||||||
* Tmp
|
//
|
||||||
*
|
// 1. Get the minimatch set
|
||||||
* Copyright (c) 2011-2017 KARASZI Istvan <github@spam.raszi.hu>
|
// 2. For each pattern in the set, PROCESS(pattern, false)
|
||||||
*
|
// 3. Store matches per-set, then uniq them
|
||||||
* MIT Licensed
|
//
|
||||||
*/
|
// PROCESS(pattern, inGlobStar)
|
||||||
|
// Get the first [n] items from pattern that are all strings
|
||||||
|
// Join these together. This is PREFIX.
|
||||||
|
// If there is no more remaining, then stat(PREFIX) and
|
||||||
|
// add to matches if it succeeds. END.
|
||||||
|
//
|
||||||
|
// If inGlobStar and PREFIX is symlink and points to dir
|
||||||
|
// set ENTRIES = []
|
||||||
|
// else readdir(PREFIX) as ENTRIES
|
||||||
|
// If fail, END
|
||||||
|
//
|
||||||
|
// with ENTRIES
|
||||||
|
// If pattern[n] is GLOBSTAR
|
||||||
|
// // handle the case where the globstar match is empty
|
||||||
|
// // by pruning it out, and testing the resulting pattern
|
||||||
|
// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
|
||||||
|
// // handle other cases.
|
||||||
|
// for ENTRY in ENTRIES (not dotfiles)
|
||||||
|
// // attach globstar + tail onto the entry
|
||||||
|
// // Mark that this entry is a globstar match
|
||||||
|
// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
|
||||||
|
//
|
||||||
|
// else // not globstar
|
||||||
|
// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
|
||||||
|
// Test ENTRY against pattern[n]
|
||||||
|
// If fails, continue
|
||||||
|
// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
|
||||||
|
//
|
||||||
|
// Caveat:
|
||||||
|
// Cache all stats and readdirs results to minimize syscall. Since all
|
||||||
|
// we ever care about is existence and directory-ness, we can just keep
|
||||||
|
// `true` for files, and [children,...] for directories, or `false` for
|
||||||
|
// things that don't exist.
|
||||||
|
|
||||||
/*
|
module.exports = glob
|
||||||
* Module dependencies.
|
|
||||||
*/
|
|
||||||
const fs = __webpack_require__(747);
|
|
||||||
const os = __webpack_require__(87);
|
|
||||||
const path = __webpack_require__(622);
|
|
||||||
const crypto = __webpack_require__(417);
|
|
||||||
const _c = fs.constants && os.constants ?
|
|
||||||
{ fs: fs.constants, os: os.constants } :
|
|
||||||
process.binding('constants');
|
|
||||||
const rimraf = __webpack_require__(569);
|
|
||||||
|
|
||||||
/*
|
var fs = __webpack_require__(747)
|
||||||
* The working inner variables.
|
var rp = __webpack_require__(302)
|
||||||
*/
|
var minimatch = __webpack_require__(93)
|
||||||
const
|
var Minimatch = minimatch.Minimatch
|
||||||
// the random characters to choose from
|
var inherits = __webpack_require__(689)
|
||||||
RANDOM_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
|
var EE = __webpack_require__(614).EventEmitter
|
||||||
|
var path = __webpack_require__(622)
|
||||||
|
var assert = __webpack_require__(357)
|
||||||
|
var isAbsolute = __webpack_require__(681)
|
||||||
|
var globSync = __webpack_require__(245)
|
||||||
|
var common = __webpack_require__(856)
|
||||||
|
var alphasort = common.alphasort
|
||||||
|
var alphasorti = common.alphasorti
|
||||||
|
var setopts = common.setopts
|
||||||
|
var ownProp = common.ownProp
|
||||||
|
var inflight = __webpack_require__(674)
|
||||||
|
var util = __webpack_require__(669)
|
||||||
|
var childrenIgnored = common.childrenIgnored
|
||||||
|
var isIgnored = common.isIgnored
|
||||||
|
|
||||||
TEMPLATE_PATTERN = /XXXXXX/,
|
var once = __webpack_require__(49)
|
||||||
|
|
||||||
DEFAULT_TRIES = 3,
|
function glob (pattern, options, cb) {
|
||||||
|
if (typeof options === 'function') cb = options, options = {}
|
||||||
|
if (!options) options = {}
|
||||||
|
|
||||||
CREATE_FLAGS = (_c.O_CREAT || _c.fs.O_CREAT) | (_c.O_EXCL || _c.fs.O_EXCL) | (_c.O_RDWR || _c.fs.O_RDWR),
|
if (options.sync) {
|
||||||
|
if (cb)
|
||||||
EBADF = _c.EBADF || _c.os.errno.EBADF,
|
throw new TypeError('callback provided to sync glob')
|
||||||
ENOENT = _c.ENOENT || _c.os.errno.ENOENT,
|
return globSync(pattern, options)
|
||||||
|
|
||||||
DIR_MODE = 448 /* 0o700 */,
|
|
||||||
FILE_MODE = 384 /* 0o600 */,
|
|
||||||
|
|
||||||
EXIT = 'exit',
|
|
||||||
|
|
||||||
SIGINT = 'SIGINT',
|
|
||||||
|
|
||||||
// this will hold the objects need to be removed on exit
|
|
||||||
_removeObjects = [];
|
|
||||||
|
|
||||||
var
|
|
||||||
_gracefulCleanup = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Random name generator based on crypto.
|
|
||||||
* Adapted from http://blog.tompawlak.org/how-to-generate-random-values-nodejs-javascript
|
|
||||||
*
|
|
||||||
* @param {number} howMany
|
|
||||||
* @returns {string} the generated random name
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _randomChars(howMany) {
|
|
||||||
var
|
|
||||||
value = [],
|
|
||||||
rnd = null;
|
|
||||||
|
|
||||||
// make sure that we do not fail because we ran out of entropy
|
|
||||||
try {
|
|
||||||
rnd = crypto.randomBytes(howMany);
|
|
||||||
} catch (e) {
|
|
||||||
rnd = crypto.pseudoRandomBytes(howMany);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var i = 0; i < howMany; i++) {
|
return new Glob(pattern, options, cb)
|
||||||
value.push(RANDOM_CHARS[rnd[i] % RANDOM_CHARS.length]);
|
}
|
||||||
|
|
||||||
|
glob.sync = globSync
|
||||||
|
var GlobSync = glob.GlobSync = globSync.GlobSync
|
||||||
|
|
||||||
|
// old api surface
|
||||||
|
glob.glob = glob
|
||||||
|
|
||||||
|
function extend (origin, add) {
|
||||||
|
if (add === null || typeof add !== 'object') {
|
||||||
|
return origin
|
||||||
}
|
}
|
||||||
|
|
||||||
return value.join('');
|
var keys = Object.keys(add)
|
||||||
|
var i = keys.length
|
||||||
|
while (i--) {
|
||||||
|
origin[keys[i]] = add[keys[i]]
|
||||||
|
}
|
||||||
|
return origin
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
glob.hasMagic = function (pattern, options_) {
|
||||||
* Checks whether the `obj` parameter is defined or not.
|
var options = extend({}, options_)
|
||||||
*
|
options.noprocess = true
|
||||||
* @param {Object} obj
|
|
||||||
* @returns {boolean} true if the object is undefined
|
var g = new Glob(pattern, options)
|
||||||
* @private
|
var set = g.minimatch.set
|
||||||
*/
|
|
||||||
function _isUndefined(obj) {
|
if (!pattern)
|
||||||
return typeof obj === 'undefined';
|
return false
|
||||||
|
|
||||||
|
if (set.length > 1)
|
||||||
|
return true
|
||||||
|
|
||||||
|
for (var j = 0; j < set[0].length; j++) {
|
||||||
|
if (typeof set[0][j] !== 'string')
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
glob.Glob = Glob
|
||||||
* Parses the function arguments.
|
inherits(Glob, EE)
|
||||||
*
|
function Glob (pattern, options, cb) {
|
||||||
* This function helps to have optional arguments.
|
|
||||||
*
|
|
||||||
* @param {(Options|Function)} options
|
|
||||||
* @param {Function} callback
|
|
||||||
* @returns {Array} parsed arguments
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _parseArguments(options, callback) {
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (typeof options === 'function') {
|
if (typeof options === 'function') {
|
||||||
return [{}, options];
|
cb = options
|
||||||
|
options = null
|
||||||
}
|
}
|
||||||
|
|
||||||
/* istanbul ignore else */
|
if (options && options.sync) {
|
||||||
if (_isUndefined(options)) {
|
if (cb)
|
||||||
return [{}, callback];
|
throw new TypeError('callback provided to sync glob')
|
||||||
|
return new GlobSync(pattern, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
return [options, callback];
|
if (!(this instanceof Glob))
|
||||||
}
|
return new Glob(pattern, options, cb)
|
||||||
|
|
||||||
/**
|
setopts(this, pattern, options)
|
||||||
* Generates a new temporary name.
|
this._didRealPath = false
|
||||||
*
|
|
||||||
* @param {Object} opts
|
|
||||||
* @returns {string} the new random name according to opts
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _generateTmpName(opts) {
|
|
||||||
|
|
||||||
const tmpDir = _getTmpDir();
|
// process each pattern in the minimatch set
|
||||||
|
var n = this.minimatch.set.length
|
||||||
|
|
||||||
// fail early on missing tmp dir
|
// The matches are stored as {<filename>: true,...} so that
|
||||||
if (isBlank(opts.dir) && isBlank(tmpDir)) {
|
// duplicates are automagically pruned.
|
||||||
throw new Error('No tmp dir specified');
|
// Later, we do an Object.keys() on these.
|
||||||
|
// Keep them as a list so we can fill in when nonull is set.
|
||||||
|
this.matches = new Array(n)
|
||||||
|
|
||||||
|
if (typeof cb === 'function') {
|
||||||
|
cb = once(cb)
|
||||||
|
this.on('error', cb)
|
||||||
|
this.on('end', function (matches) {
|
||||||
|
cb(null, matches)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* istanbul ignore else */
|
var self = this
|
||||||
if (!isBlank(opts.name)) {
|
this._processing = 0
|
||||||
return path.join(opts.dir || tmpDir, opts.name);
|
|
||||||
|
this._emitQueue = []
|
||||||
|
this._processQueue = []
|
||||||
|
this.paused = false
|
||||||
|
|
||||||
|
if (this.noprocess)
|
||||||
|
return this
|
||||||
|
|
||||||
|
if (n === 0)
|
||||||
|
return done()
|
||||||
|
|
||||||
|
var sync = true
|
||||||
|
for (var i = 0; i < n; i ++) {
|
||||||
|
this._process(this.minimatch.set[i], i, false, done)
|
||||||
}
|
}
|
||||||
|
sync = false
|
||||||
|
|
||||||
// mkstemps like template
|
function done () {
|
||||||
// opts.template has already been guarded in tmpName() below
|
--self._processing
|
||||||
/* istanbul ignore else */
|
if (self._processing <= 0) {
|
||||||
if (opts.template) {
|
if (sync) {
|
||||||
var template = opts.template;
|
process.nextTick(function () {
|
||||||
// make sure that we prepend the tmp path if none was given
|
self._finish()
|
||||||
/* istanbul ignore else */
|
})
|
||||||
if (path.basename(template) === template)
|
} else {
|
||||||
template = path.join(opts.dir || tmpDir, template);
|
self._finish()
|
||||||
return template.replace(TEMPLATE_PATTERN, _randomChars(6));
|
|
||||||
}
|
|
||||||
|
|
||||||
// prefix and postfix
|
|
||||||
const name = [
|
|
||||||
(isBlank(opts.prefix) ? 'tmp-' : opts.prefix),
|
|
||||||
process.pid,
|
|
||||||
_randomChars(12),
|
|
||||||
(opts.postfix ? opts.postfix : '')
|
|
||||||
].join('');
|
|
||||||
|
|
||||||
return path.join(opts.dir || tmpDir, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a temporary file name.
|
|
||||||
*
|
|
||||||
* @param {(Options|tmpNameCallback)} options options or callback
|
|
||||||
* @param {?tmpNameCallback} callback the callback function
|
|
||||||
*/
|
|
||||||
function tmpName(options, callback) {
|
|
||||||
var
|
|
||||||
args = _parseArguments(options, callback),
|
|
||||||
opts = args[0],
|
|
||||||
cb = args[1],
|
|
||||||
tries = !isBlank(opts.name) ? 1 : opts.tries || DEFAULT_TRIES;
|
|
||||||
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (isNaN(tries) || tries < 0)
|
|
||||||
return cb(new Error('Invalid tries'));
|
|
||||||
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (opts.template && !opts.template.match(TEMPLATE_PATTERN))
|
|
||||||
return cb(new Error('Invalid template provided'));
|
|
||||||
|
|
||||||
(function _getUniqueName() {
|
|
||||||
try {
|
|
||||||
const name = _generateTmpName(opts);
|
|
||||||
|
|
||||||
// check whether the path exists then retry if needed
|
|
||||||
fs.stat(name, function (err) {
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (!err) {
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (tries-- > 0) return _getUniqueName();
|
|
||||||
|
|
||||||
return cb(new Error('Could not get a unique tmp filename, max tries reached ' + name));
|
|
||||||
}
|
|
||||||
|
|
||||||
cb(null, name);
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
cb(err);
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Synchronous version of tmpName.
|
|
||||||
*
|
|
||||||
* @param {Object} options
|
|
||||||
* @returns {string} the generated random name
|
|
||||||
* @throws {Error} if the options are invalid or could not generate a filename
|
|
||||||
*/
|
|
||||||
function tmpNameSync(options) {
|
|
||||||
var
|
|
||||||
args = _parseArguments(options),
|
|
||||||
opts = args[0],
|
|
||||||
tries = !isBlank(opts.name) ? 1 : opts.tries || DEFAULT_TRIES;
|
|
||||||
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (isNaN(tries) || tries < 0)
|
|
||||||
throw new Error('Invalid tries');
|
|
||||||
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (opts.template && !opts.template.match(TEMPLATE_PATTERN))
|
|
||||||
throw new Error('Invalid template provided');
|
|
||||||
|
|
||||||
do {
|
|
||||||
const name = _generateTmpName(opts);
|
|
||||||
try {
|
|
||||||
fs.statSync(name);
|
|
||||||
} catch (e) {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
} while (tries-- > 0);
|
|
||||||
|
|
||||||
throw new Error('Could not get a unique tmp filename, max tries reached');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates and opens a temporary file.
|
|
||||||
*
|
|
||||||
* @param {(Options|fileCallback)} options the config options or the callback function
|
|
||||||
* @param {?fileCallback} callback
|
|
||||||
*/
|
|
||||||
function file(options, callback) {
|
|
||||||
var
|
|
||||||
args = _parseArguments(options, callback),
|
|
||||||
opts = args[0],
|
|
||||||
cb = args[1];
|
|
||||||
|
|
||||||
// gets a temporary filename
|
|
||||||
tmpName(opts, function _tmpNameCreated(err, name) {
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (err) return cb(err);
|
|
||||||
|
|
||||||
// create and open the file
|
|
||||||
fs.open(name, CREATE_FLAGS, opts.mode || FILE_MODE, function _fileCreated(err, fd) {
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (err) return cb(err);
|
|
||||||
|
|
||||||
if (opts.discardDescriptor) {
|
|
||||||
return fs.close(fd, function _discardCallback(err) {
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (err) {
|
|
||||||
// Low probability, and the file exists, so this could be
|
|
||||||
// ignored. If it isn't we certainly need to unlink the
|
|
||||||
// file, and if that fails too its error is more
|
|
||||||
// important.
|
|
||||||
try {
|
|
||||||
fs.unlinkSync(name);
|
|
||||||
} catch (e) {
|
|
||||||
if (!isENOENT(e)) {
|
|
||||||
err = e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cb(err);
|
|
||||||
}
|
|
||||||
cb(null, name, undefined, _prepareTmpFileRemoveCallback(name, -1, opts));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (opts.detachDescriptor) {
|
|
||||||
return cb(null, name, fd, _prepareTmpFileRemoveCallback(name, -1, opts));
|
|
||||||
}
|
|
||||||
cb(null, name, fd, _prepareTmpFileRemoveCallback(name, fd, opts));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Synchronous version of file.
|
|
||||||
*
|
|
||||||
* @param {Options} options
|
|
||||||
* @returns {FileSyncObject} object consists of name, fd and removeCallback
|
|
||||||
* @throws {Error} if cannot create a file
|
|
||||||
*/
|
|
||||||
function fileSync(options) {
|
|
||||||
var
|
|
||||||
args = _parseArguments(options),
|
|
||||||
opts = args[0];
|
|
||||||
|
|
||||||
const discardOrDetachDescriptor = opts.discardDescriptor || opts.detachDescriptor;
|
|
||||||
const name = tmpNameSync(opts);
|
|
||||||
var fd = fs.openSync(name, CREATE_FLAGS, opts.mode || FILE_MODE);
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (opts.discardDescriptor) {
|
|
||||||
fs.closeSync(fd);
|
|
||||||
fd = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: name,
|
|
||||||
fd: fd,
|
|
||||||
removeCallback: _prepareTmpFileRemoveCallback(name, discardOrDetachDescriptor ? -1 : fd, opts)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a temporary directory.
|
|
||||||
*
|
|
||||||
* @param {(Options|dirCallback)} options the options or the callback function
|
|
||||||
* @param {?dirCallback} callback
|
|
||||||
*/
|
|
||||||
function dir(options, callback) {
|
|
||||||
var
|
|
||||||
args = _parseArguments(options, callback),
|
|
||||||
opts = args[0],
|
|
||||||
cb = args[1];
|
|
||||||
|
|
||||||
// gets a temporary filename
|
|
||||||
tmpName(opts, function _tmpNameCreated(err, name) {
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (err) return cb(err);
|
|
||||||
|
|
||||||
// create the directory
|
|
||||||
fs.mkdir(name, opts.mode || DIR_MODE, function _dirCreated(err) {
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (err) return cb(err);
|
|
||||||
|
|
||||||
cb(null, name, _prepareTmpDirRemoveCallback(name, opts));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Synchronous version of dir.
|
|
||||||
*
|
|
||||||
* @param {Options} options
|
|
||||||
* @returns {DirSyncObject} object consists of name and removeCallback
|
|
||||||
* @throws {Error} if it cannot create a directory
|
|
||||||
*/
|
|
||||||
function dirSync(options) {
|
|
||||||
var
|
|
||||||
args = _parseArguments(options),
|
|
||||||
opts = args[0];
|
|
||||||
|
|
||||||
const name = tmpNameSync(opts);
|
|
||||||
fs.mkdirSync(name, opts.mode || DIR_MODE);
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: name,
|
|
||||||
removeCallback: _prepareTmpDirRemoveCallback(name, opts)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes files asynchronously.
|
|
||||||
*
|
|
||||||
* @param {Object} fdPath
|
|
||||||
* @param {Function} next
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _removeFileAsync(fdPath, next) {
|
|
||||||
const _handler = function (err) {
|
|
||||||
if (err && !isENOENT(err)) {
|
|
||||||
// reraise any unanticipated error
|
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
next();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 <= fdPath[0])
|
|
||||||
fs.close(fdPath[0], function (err) {
|
|
||||||
fs.unlink(fdPath[1], _handler);
|
|
||||||
});
|
|
||||||
else fs.unlink(fdPath[1], _handler);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes files synchronously.
|
|
||||||
*
|
|
||||||
* @param {Object} fdPath
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _removeFileSync(fdPath) {
|
|
||||||
try {
|
|
||||||
if (0 <= fdPath[0]) fs.closeSync(fdPath[0]);
|
|
||||||
} catch (e) {
|
|
||||||
// reraise any unanticipated error
|
|
||||||
if (!isEBADF(e) && !isENOENT(e)) throw e;
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
fs.unlinkSync(fdPath[1]);
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
// reraise any unanticipated error
|
|
||||||
if (!isENOENT(e)) throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepares the callback for removal of the temporary file.
|
|
||||||
*
|
|
||||||
* @param {string} name the path of the file
|
|
||||||
* @param {number} fd file descriptor
|
|
||||||
* @param {Object} opts
|
|
||||||
* @returns {fileCallback}
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _prepareTmpFileRemoveCallback(name, fd, opts) {
|
|
||||||
const removeCallbackSync = _prepareRemoveCallback(_removeFileSync, [fd, name]);
|
|
||||||
const removeCallback = _prepareRemoveCallback(_removeFileAsync, [fd, name], removeCallbackSync);
|
|
||||||
|
|
||||||
if (!opts.keep) _removeObjects.unshift(removeCallbackSync);
|
|
||||||
|
|
||||||
return removeCallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simple wrapper for rimraf.
|
|
||||||
*
|
|
||||||
* @param {string} dirPath
|
|
||||||
* @param {Function} next
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _rimrafRemoveDirWrapper(dirPath, next) {
|
|
||||||
rimraf(dirPath, next);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simple wrapper for rimraf.sync.
|
|
||||||
*
|
|
||||||
* @param {string} dirPath
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _rimrafRemoveDirSyncWrapper(dirPath, next) {
|
|
||||||
try {
|
|
||||||
return next(null, rimraf.sync(dirPath));
|
|
||||||
} catch (err) {
|
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepares the callback for removal of the temporary directory.
|
|
||||||
*
|
|
||||||
* @param {string} name
|
|
||||||
* @param {Object} opts
|
|
||||||
* @returns {Function} the callback
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _prepareTmpDirRemoveCallback(name, opts) {
|
|
||||||
const removeFunction = opts.unsafeCleanup ? _rimrafRemoveDirWrapper : fs.rmdir.bind(fs);
|
|
||||||
const removeFunctionSync = opts.unsafeCleanup ? _rimrafRemoveDirSyncWrapper : fs.rmdirSync.bind(fs);
|
|
||||||
const removeCallbackSync = _prepareRemoveCallback(removeFunctionSync, name);
|
|
||||||
const removeCallback = _prepareRemoveCallback(removeFunction, name, removeCallbackSync);
|
|
||||||
if (!opts.keep) _removeObjects.unshift(removeCallbackSync);
|
|
||||||
|
|
||||||
return removeCallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a guarded function wrapping the removeFunction call.
|
|
||||||
*
|
|
||||||
* @param {Function} removeFunction
|
|
||||||
* @param {Object} arg
|
|
||||||
* @returns {Function}
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _prepareRemoveCallback(removeFunction, arg, cleanupCallbackSync) {
|
|
||||||
var called = false;
|
|
||||||
|
|
||||||
return function _cleanupCallback(next) {
|
|
||||||
next = next || function () {};
|
|
||||||
if (!called) {
|
|
||||||
const toRemove = cleanupCallbackSync || _cleanupCallback;
|
|
||||||
const index = _removeObjects.indexOf(toRemove);
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (index >= 0) _removeObjects.splice(index, 1);
|
|
||||||
|
|
||||||
called = true;
|
|
||||||
// sync?
|
|
||||||
if (removeFunction.length === 1) {
|
|
||||||
try {
|
|
||||||
removeFunction(arg);
|
|
||||||
return next(null);
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
// if no next is provided and since we are
|
|
||||||
// in silent cleanup mode on process exit,
|
|
||||||
// we will ignore the error
|
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
} else return removeFunction(arg, next);
|
|
||||||
} else return next(new Error('cleanup callback has already been called'));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The garbage collector.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _garbageCollector() {
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (!_gracefulCleanup) return;
|
|
||||||
|
|
||||||
// the function being called removes itself from _removeObjects,
|
|
||||||
// loop until _removeObjects is empty
|
|
||||||
while (_removeObjects.length) {
|
|
||||||
try {
|
|
||||||
_removeObjects[0]();
|
|
||||||
} catch (e) {
|
|
||||||
// already removed?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper for testing against EBADF to compensate changes made to Node 7.x under Windows.
|
|
||||||
*/
|
|
||||||
function isEBADF(error) {
|
|
||||||
return isExpectedError(error, -EBADF, 'EBADF');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper for testing against ENOENT to compensate changes made to Node 7.x under Windows.
|
|
||||||
*/
|
|
||||||
function isENOENT(error) {
|
|
||||||
return isExpectedError(error, -ENOENT, 'ENOENT');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper to determine whether the expected error code matches the actual code and errno,
|
|
||||||
* which will differ between the supported node versions.
|
|
||||||
*
|
|
||||||
* - Node >= 7.0:
|
|
||||||
* error.code {string}
|
|
||||||
* error.errno {string|number} any numerical value will be negated
|
|
||||||
*
|
|
||||||
* - Node >= 6.0 < 7.0:
|
|
||||||
* error.code {string}
|
|
||||||
* error.errno {number} negated
|
|
||||||
*
|
|
||||||
* - Node >= 4.0 < 6.0: introduces SystemError
|
|
||||||
* error.code {string}
|
|
||||||
* error.errno {number} negated
|
|
||||||
*
|
|
||||||
* - Node >= 0.10 < 4.0:
|
|
||||||
* error.code {number} negated
|
|
||||||
* error.errno n/a
|
|
||||||
*/
|
|
||||||
function isExpectedError(error, code, errno) {
|
|
||||||
return error.code === code || error.code === errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper which determines whether a string s is blank, that is undefined, or empty or null.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @param {string} s
|
|
||||||
* @returns {Boolean} true whether the string s is blank, false otherwise
|
|
||||||
*/
|
|
||||||
function isBlank(s) {
|
|
||||||
return s === null || s === undefined || !s.trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the graceful cleanup.
|
|
||||||
*/
|
|
||||||
function setGracefulCleanup() {
|
|
||||||
_gracefulCleanup = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the currently configured tmp dir from os.tmpdir().
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
* @returns {string} the currently configured tmp dir
|
|
||||||
*/
|
|
||||||
function _getTmpDir() {
|
|
||||||
return os.tmpdir();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If there are multiple different versions of tmp in place, make sure that
|
|
||||||
* we recognize the old listeners.
|
|
||||||
*
|
|
||||||
* @param {Function} listener
|
|
||||||
* @private
|
|
||||||
* @returns {Boolean} true whether listener is a legacy listener
|
|
||||||
*/
|
|
||||||
function _is_legacy_listener(listener) {
|
|
||||||
return (listener.name === '_exit' || listener.name === '_uncaughtExceptionThrown')
|
|
||||||
&& listener.toString().indexOf('_garbageCollector();') > -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Safely install SIGINT listener.
|
|
||||||
*
|
|
||||||
* NOTE: this will only work on OSX and Linux.
|
|
||||||
*
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function _safely_install_sigint_listener() {
|
|
||||||
|
|
||||||
const listeners = process.listeners(SIGINT);
|
|
||||||
const existingListeners = [];
|
|
||||||
for (let i = 0, length = listeners.length; i < length; i++) {
|
|
||||||
const lstnr = listeners[i];
|
|
||||||
/* istanbul ignore else */
|
|
||||||
if (lstnr.name === '_tmp$sigint_listener') {
|
|
||||||
existingListeners.push(lstnr);
|
|
||||||
process.removeListener(SIGINT, lstnr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
process.on(SIGINT, function _tmp$sigint_listener(doExit) {
|
|
||||||
for (let i = 0, length = existingListeners.length; i < length; i++) {
|
|
||||||
// let the existing listener do the garbage collection (e.g. jest sandbox)
|
|
||||||
try {
|
|
||||||
existingListeners[i](false);
|
|
||||||
} catch (err) {
|
|
||||||
// ignore
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
}
|
||||||
// force the garbage collector even it is called again in the exit listener
|
|
||||||
_garbageCollector();
|
|
||||||
} finally {
|
|
||||||
if (!!doExit) {
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
Glob.prototype._finish = function () {
|
||||||
* Safely install process exit listener.
|
assert(this instanceof Glob)
|
||||||
*
|
if (this.aborted)
|
||||||
* @private
|
return
|
||||||
*/
|
|
||||||
function _safely_install_exit_listener() {
|
|
||||||
const listeners = process.listeners(EXIT);
|
|
||||||
|
|
||||||
// collect any existing listeners
|
if (this.realpath && !this._didRealpath)
|
||||||
const existingListeners = [];
|
return this._realpath()
|
||||||
for (let i = 0, length = listeners.length; i < length; i++) {
|
|
||||||
const lstnr = listeners[i];
|
common.finish(this)
|
||||||
/* istanbul ignore else */
|
this.emit('end', this.found)
|
||||||
// TODO: remove support for legacy listeners once release 1.0.0 is out
|
|
||||||
if (lstnr.name === '_tmp$safe_listener' || _is_legacy_listener(lstnr)) {
|
|
||||||
// we must forget about the uncaughtException listener, hopefully it is ours
|
|
||||||
if (lstnr.name !== '_uncaughtExceptionThrown') {
|
|
||||||
existingListeners.push(lstnr);
|
|
||||||
}
|
|
||||||
process.removeListener(EXIT, lstnr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// TODO: what was the data parameter good for?
|
|
||||||
process.addListener(EXIT, function _tmp$safe_listener(data) {
|
|
||||||
for (let i = 0, length = existingListeners.length; i < length; i++) {
|
|
||||||
// let the existing listener do the garbage collection (e.g. jest sandbox)
|
|
||||||
try {
|
|
||||||
existingListeners[i](data);
|
|
||||||
} catch (err) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_garbageCollector();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_safely_install_exit_listener();
|
Glob.prototype._realpath = function () {
|
||||||
_safely_install_sigint_listener();
|
if (this._didRealpath)
|
||||||
|
return
|
||||||
|
|
||||||
/**
|
this._didRealpath = true
|
||||||
* Configuration options.
|
|
||||||
*
|
|
||||||
* @typedef {Object} Options
|
|
||||||
* @property {?number} tries the number of tries before give up the name generation
|
|
||||||
* @property {?string} template the "mkstemp" like filename template
|
|
||||||
* @property {?string} name fix name
|
|
||||||
* @property {?string} dir the tmp directory to use
|
|
||||||
* @property {?string} prefix prefix for the generated name
|
|
||||||
* @property {?string} postfix postfix for the generated name
|
|
||||||
* @property {?boolean} unsafeCleanup recursively removes the created temporary directory, even when it's not empty
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
var n = this.matches.length
|
||||||
* @typedef {Object} FileSyncObject
|
if (n === 0)
|
||||||
* @property {string} name the name of the file
|
return this._finish()
|
||||||
* @property {string} fd the file descriptor
|
|
||||||
* @property {fileCallback} removeCallback the callback function to remove the file
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
var self = this
|
||||||
* @typedef {Object} DirSyncObject
|
for (var i = 0; i < this.matches.length; i++)
|
||||||
* @property {string} name the name of the directory
|
this._realpathSet(i, next)
|
||||||
* @property {fileCallback} removeCallback the callback function to remove the directory
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
function next () {
|
||||||
* @callback tmpNameCallback
|
if (--n === 0)
|
||||||
* @param {?Error} err the error object if anything goes wrong
|
self._finish()
|
||||||
* @param {string} name the temporary file name
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @callback fileCallback
|
|
||||||
* @param {?Error} err the error object if anything goes wrong
|
|
||||||
* @param {string} name the temporary file name
|
|
||||||
* @param {number} fd the file descriptor
|
|
||||||
* @param {cleanupCallback} fn the cleanup callback function
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @callback dirCallback
|
|
||||||
* @param {?Error} err the error object if anything goes wrong
|
|
||||||
* @param {string} name the temporary file name
|
|
||||||
* @param {cleanupCallback} fn the cleanup callback function
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the temporary created file or directory.
|
|
||||||
*
|
|
||||||
* @callback cleanupCallback
|
|
||||||
* @param {simpleCallback} [next] function to call after entry was removed
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Callback function for function composition.
|
|
||||||
* @see {@link https://github.com/raszi/node-tmp/issues/57|raszi/node-tmp#57}
|
|
||||||
*
|
|
||||||
* @callback simpleCallback
|
|
||||||
*/
|
|
||||||
|
|
||||||
// exporting all the needed methods
|
|
||||||
|
|
||||||
// evaluate os.tmpdir() lazily, mainly for simplifying testing but it also will
|
|
||||||
// allow users to reconfigure the temporary directory
|
|
||||||
Object.defineProperty(module.exports, 'tmpdir', {
|
|
||||||
enumerable: true,
|
|
||||||
configurable: false,
|
|
||||||
get: function () {
|
|
||||||
return _getTmpDir();
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
module.exports.dir = dir;
|
Glob.prototype._realpathSet = function (index, cb) {
|
||||||
module.exports.dirSync = dirSync;
|
var matchset = this.matches[index]
|
||||||
|
if (!matchset)
|
||||||
|
return cb()
|
||||||
|
|
||||||
module.exports.file = file;
|
var found = Object.keys(matchset)
|
||||||
module.exports.fileSync = fileSync;
|
var self = this
|
||||||
|
var n = found.length
|
||||||
|
|
||||||
module.exports.tmpName = tmpName;
|
if (n === 0)
|
||||||
module.exports.tmpNameSync = tmpNameSync;
|
return cb()
|
||||||
|
|
||||||
module.exports.setGracefulCleanup = setGracefulCleanup;
|
var set = this.matches[index] = Object.create(null)
|
||||||
|
found.forEach(function (p, i) {
|
||||||
|
// If there's a problem with the stat, then it means that
|
||||||
|
// one or more of the links in the realpath couldn't be
|
||||||
|
// resolved. just return the abs value in that case.
|
||||||
|
p = self._makeAbs(p)
|
||||||
|
rp.realpath(p, self.realpathCache, function (er, real) {
|
||||||
|
if (!er)
|
||||||
|
set[real] = true
|
||||||
|
else if (er.syscall === 'stat')
|
||||||
|
set[p] = true
|
||||||
|
else
|
||||||
|
self.emit('error', er) // srsly wtf right here
|
||||||
|
|
||||||
|
if (--n === 0) {
|
||||||
|
self.matches[index] = set
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._mark = function (p) {
|
||||||
|
return common.mark(this, p)
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._makeAbs = function (f) {
|
||||||
|
return common.makeAbs(this, f)
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype.abort = function () {
|
||||||
|
this.aborted = true
|
||||||
|
this.emit('abort')
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype.pause = function () {
|
||||||
|
if (!this.paused) {
|
||||||
|
this.paused = true
|
||||||
|
this.emit('pause')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype.resume = function () {
|
||||||
|
if (this.paused) {
|
||||||
|
this.emit('resume')
|
||||||
|
this.paused = false
|
||||||
|
if (this._emitQueue.length) {
|
||||||
|
var eq = this._emitQueue.slice(0)
|
||||||
|
this._emitQueue.length = 0
|
||||||
|
for (var i = 0; i < eq.length; i ++) {
|
||||||
|
var e = eq[i]
|
||||||
|
this._emitMatch(e[0], e[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this._processQueue.length) {
|
||||||
|
var pq = this._processQueue.slice(0)
|
||||||
|
this._processQueue.length = 0
|
||||||
|
for (var i = 0; i < pq.length; i ++) {
|
||||||
|
var p = pq[i]
|
||||||
|
this._processing--
|
||||||
|
this._process(p[0], p[1], p[2], p[3])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
|
||||||
|
assert(this instanceof Glob)
|
||||||
|
assert(typeof cb === 'function')
|
||||||
|
|
||||||
|
if (this.aborted)
|
||||||
|
return
|
||||||
|
|
||||||
|
this._processing++
|
||||||
|
if (this.paused) {
|
||||||
|
this._processQueue.push([pattern, index, inGlobStar, cb])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//console.error('PROCESS %d', this._processing, pattern)
|
||||||
|
|
||||||
|
// Get the first [n] parts of pattern that are all strings.
|
||||||
|
var n = 0
|
||||||
|
while (typeof pattern[n] === 'string') {
|
||||||
|
n ++
|
||||||
|
}
|
||||||
|
// now n is the index of the first one that is *not* a string.
|
||||||
|
|
||||||
|
// see if there's anything else
|
||||||
|
var prefix
|
||||||
|
switch (n) {
|
||||||
|
// if not, then this is rather simple
|
||||||
|
case pattern.length:
|
||||||
|
this._processSimple(pattern.join('/'), index, cb)
|
||||||
|
return
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
// pattern *starts* with some non-trivial item.
|
||||||
|
// going to readdir(cwd), but not include the prefix in matches.
|
||||||
|
prefix = null
|
||||||
|
break
|
||||||
|
|
||||||
|
default:
|
||||||
|
// pattern has some string bits in the front.
|
||||||
|
// whatever it starts with, whether that's 'absolute' like /foo/bar,
|
||||||
|
// or 'relative' like '../baz'
|
||||||
|
prefix = pattern.slice(0, n).join('/')
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
var remain = pattern.slice(n)
|
||||||
|
|
||||||
|
// get the list of entries.
|
||||||
|
var read
|
||||||
|
if (prefix === null)
|
||||||
|
read = '.'
|
||||||
|
else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
|
||||||
|
if (!prefix || !isAbsolute(prefix))
|
||||||
|
prefix = '/' + prefix
|
||||||
|
read = prefix
|
||||||
|
} else
|
||||||
|
read = prefix
|
||||||
|
|
||||||
|
var abs = this._makeAbs(read)
|
||||||
|
|
||||||
|
//if ignored, skip _processing
|
||||||
|
if (childrenIgnored(this, read))
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
var isGlobStar = remain[0] === minimatch.GLOBSTAR
|
||||||
|
if (isGlobStar)
|
||||||
|
this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
|
||||||
|
else
|
||||||
|
this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
|
||||||
|
var self = this
|
||||||
|
this._readdir(abs, inGlobStar, function (er, entries) {
|
||||||
|
return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
|
||||||
|
|
||||||
|
// if the abs isn't a dir, then nothing can match!
|
||||||
|
if (!entries)
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
// It will only match dot entries if it starts with a dot, or if
|
||||||
|
// dot is set. Stuff like @(.foo|.bar) isn't allowed.
|
||||||
|
var pn = remain[0]
|
||||||
|
var negate = !!this.minimatch.negate
|
||||||
|
var rawGlob = pn._glob
|
||||||
|
var dotOk = this.dot || rawGlob.charAt(0) === '.'
|
||||||
|
|
||||||
|
var matchedEntries = []
|
||||||
|
for (var i = 0; i < entries.length; i++) {
|
||||||
|
var e = entries[i]
|
||||||
|
if (e.charAt(0) !== '.' || dotOk) {
|
||||||
|
var m
|
||||||
|
if (negate && !prefix) {
|
||||||
|
m = !e.match(pn)
|
||||||
|
} else {
|
||||||
|
m = e.match(pn)
|
||||||
|
}
|
||||||
|
if (m)
|
||||||
|
matchedEntries.push(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
|
||||||
|
|
||||||
|
var len = matchedEntries.length
|
||||||
|
// If there are no matched entries, then nothing matches.
|
||||||
|
if (len === 0)
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
// if this is the last remaining pattern bit, then no need for
|
||||||
|
// an additional stat *unless* the user has specified mark or
|
||||||
|
// stat explicitly. We know they exist, since readdir returned
|
||||||
|
// them.
|
||||||
|
|
||||||
|
if (remain.length === 1 && !this.mark && !this.stat) {
|
||||||
|
if (!this.matches[index])
|
||||||
|
this.matches[index] = Object.create(null)
|
||||||
|
|
||||||
|
for (var i = 0; i < len; i ++) {
|
||||||
|
var e = matchedEntries[i]
|
||||||
|
if (prefix) {
|
||||||
|
if (prefix !== '/')
|
||||||
|
e = prefix + '/' + e
|
||||||
|
else
|
||||||
|
e = prefix + e
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.charAt(0) === '/' && !this.nomount) {
|
||||||
|
e = path.join(this.root, e)
|
||||||
|
}
|
||||||
|
this._emitMatch(index, e)
|
||||||
|
}
|
||||||
|
// This was the last one, and no stats were needed
|
||||||
|
return cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
// now test all matched entries as stand-ins for that part
|
||||||
|
// of the pattern.
|
||||||
|
remain.shift()
|
||||||
|
for (var i = 0; i < len; i ++) {
|
||||||
|
var e = matchedEntries[i]
|
||||||
|
var newPattern
|
||||||
|
if (prefix) {
|
||||||
|
if (prefix !== '/')
|
||||||
|
e = prefix + '/' + e
|
||||||
|
else
|
||||||
|
e = prefix + e
|
||||||
|
}
|
||||||
|
this._process([e].concat(remain), index, inGlobStar, cb)
|
||||||
|
}
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._emitMatch = function (index, e) {
|
||||||
|
if (this.aborted)
|
||||||
|
return
|
||||||
|
|
||||||
|
if (isIgnored(this, e))
|
||||||
|
return
|
||||||
|
|
||||||
|
if (this.paused) {
|
||||||
|
this._emitQueue.push([index, e])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var abs = isAbsolute(e) ? e : this._makeAbs(e)
|
||||||
|
|
||||||
|
if (this.mark)
|
||||||
|
e = this._mark(e)
|
||||||
|
|
||||||
|
if (this.absolute)
|
||||||
|
e = abs
|
||||||
|
|
||||||
|
if (this.matches[index][e])
|
||||||
|
return
|
||||||
|
|
||||||
|
if (this.nodir) {
|
||||||
|
var c = this.cache[abs]
|
||||||
|
if (c === 'DIR' || Array.isArray(c))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.matches[index][e] = true
|
||||||
|
|
||||||
|
var st = this.statCache[abs]
|
||||||
|
if (st)
|
||||||
|
this.emit('stat', e, st)
|
||||||
|
|
||||||
|
this.emit('match', e)
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._readdirInGlobStar = function (abs, cb) {
|
||||||
|
if (this.aborted)
|
||||||
|
return
|
||||||
|
|
||||||
|
// follow all symlinked directories forever
|
||||||
|
// just proceed as if this is a non-globstar situation
|
||||||
|
if (this.follow)
|
||||||
|
return this._readdir(abs, false, cb)
|
||||||
|
|
||||||
|
var lstatkey = 'lstat\0' + abs
|
||||||
|
var self = this
|
||||||
|
var lstatcb = inflight(lstatkey, lstatcb_)
|
||||||
|
|
||||||
|
if (lstatcb)
|
||||||
|
fs.lstat(abs, lstatcb)
|
||||||
|
|
||||||
|
function lstatcb_ (er, lstat) {
|
||||||
|
if (er && er.code === 'ENOENT')
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
var isSym = lstat && lstat.isSymbolicLink()
|
||||||
|
self.symlinks[abs] = isSym
|
||||||
|
|
||||||
|
// If it's not a symlink or a dir, then it's definitely a regular file.
|
||||||
|
// don't bother doing a readdir in that case.
|
||||||
|
if (!isSym && lstat && !lstat.isDirectory()) {
|
||||||
|
self.cache[abs] = 'FILE'
|
||||||
|
cb()
|
||||||
|
} else
|
||||||
|
self._readdir(abs, false, cb)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._readdir = function (abs, inGlobStar, cb) {
|
||||||
|
if (this.aborted)
|
||||||
|
return
|
||||||
|
|
||||||
|
cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
|
||||||
|
if (!cb)
|
||||||
|
return
|
||||||
|
|
||||||
|
//console.error('RD %j %j', +inGlobStar, abs)
|
||||||
|
if (inGlobStar && !ownProp(this.symlinks, abs))
|
||||||
|
return this._readdirInGlobStar(abs, cb)
|
||||||
|
|
||||||
|
if (ownProp(this.cache, abs)) {
|
||||||
|
var c = this.cache[abs]
|
||||||
|
if (!c || c === 'FILE')
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
if (Array.isArray(c))
|
||||||
|
return cb(null, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
var self = this
|
||||||
|
fs.readdir(abs, readdirCb(this, abs, cb))
|
||||||
|
}
|
||||||
|
|
||||||
|
function readdirCb (self, abs, cb) {
|
||||||
|
return function (er, entries) {
|
||||||
|
if (er)
|
||||||
|
self._readdirError(abs, er, cb)
|
||||||
|
else
|
||||||
|
self._readdirEntries(abs, entries, cb)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._readdirEntries = function (abs, entries, cb) {
|
||||||
|
if (this.aborted)
|
||||||
|
return
|
||||||
|
|
||||||
|
// if we haven't asked to stat everything, then just
|
||||||
|
// assume that everything in there exists, so we can avoid
|
||||||
|
// having to stat it a second time.
|
||||||
|
if (!this.mark && !this.stat) {
|
||||||
|
for (var i = 0; i < entries.length; i ++) {
|
||||||
|
var e = entries[i]
|
||||||
|
if (abs === '/')
|
||||||
|
e = abs + e
|
||||||
|
else
|
||||||
|
e = abs + '/' + e
|
||||||
|
this.cache[e] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.cache[abs] = entries
|
||||||
|
return cb(null, entries)
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._readdirError = function (f, er, cb) {
|
||||||
|
if (this.aborted)
|
||||||
|
return
|
||||||
|
|
||||||
|
// handle errors, and cache the information
|
||||||
|
switch (er.code) {
|
||||||
|
case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
|
||||||
|
case 'ENOTDIR': // totally normal. means it *does* exist.
|
||||||
|
var abs = this._makeAbs(f)
|
||||||
|
this.cache[abs] = 'FILE'
|
||||||
|
if (abs === this.cwdAbs) {
|
||||||
|
var error = new Error(er.code + ' invalid cwd ' + this.cwd)
|
||||||
|
error.path = this.cwd
|
||||||
|
error.code = er.code
|
||||||
|
this.emit('error', error)
|
||||||
|
this.abort()
|
||||||
|
}
|
||||||
|
break
|
||||||
|
|
||||||
|
case 'ENOENT': // not terribly unusual
|
||||||
|
case 'ELOOP':
|
||||||
|
case 'ENAMETOOLONG':
|
||||||
|
case 'UNKNOWN':
|
||||||
|
this.cache[this._makeAbs(f)] = false
|
||||||
|
break
|
||||||
|
|
||||||
|
default: // some unusual error. Treat as failure.
|
||||||
|
this.cache[this._makeAbs(f)] = false
|
||||||
|
if (this.strict) {
|
||||||
|
this.emit('error', er)
|
||||||
|
// If the error is handled, then we abort
|
||||||
|
// if not, we threw out of here
|
||||||
|
this.abort()
|
||||||
|
}
|
||||||
|
if (!this.silent)
|
||||||
|
console.error('glob error', er)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
return cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
|
||||||
|
var self = this
|
||||||
|
this._readdir(abs, inGlobStar, function (er, entries) {
|
||||||
|
self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
|
||||||
|
//console.error('pgs2', prefix, remain[0], entries)
|
||||||
|
|
||||||
|
// no entries means not a dir, so it can never have matches
|
||||||
|
// foo.txt/** doesn't match foo.txt
|
||||||
|
if (!entries)
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
// test without the globstar, and with every child both below
|
||||||
|
// and replacing the globstar.
|
||||||
|
var remainWithoutGlobStar = remain.slice(1)
|
||||||
|
var gspref = prefix ? [ prefix ] : []
|
||||||
|
var noGlobStar = gspref.concat(remainWithoutGlobStar)
|
||||||
|
|
||||||
|
// the noGlobStar pattern exits the inGlobStar state
|
||||||
|
this._process(noGlobStar, index, false, cb)
|
||||||
|
|
||||||
|
var isSym = this.symlinks[abs]
|
||||||
|
var len = entries.length
|
||||||
|
|
||||||
|
// If it's a symlink, and we're in a globstar, then stop
|
||||||
|
if (isSym && inGlobStar)
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
for (var i = 0; i < len; i++) {
|
||||||
|
var e = entries[i]
|
||||||
|
if (e.charAt(0) === '.' && !this.dot)
|
||||||
|
continue
|
||||||
|
|
||||||
|
// these two cases enter the inGlobStar state
|
||||||
|
var instead = gspref.concat(entries[i], remainWithoutGlobStar)
|
||||||
|
this._process(instead, index, true, cb)
|
||||||
|
|
||||||
|
var below = gspref.concat(entries[i], remain)
|
||||||
|
this._process(below, index, true, cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._processSimple = function (prefix, index, cb) {
|
||||||
|
// XXX review this. Shouldn't it be doing the mounting etc
|
||||||
|
// before doing stat? kinda weird?
|
||||||
|
var self = this
|
||||||
|
this._stat(prefix, function (er, exists) {
|
||||||
|
self._processSimple2(prefix, index, er, exists, cb)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
|
||||||
|
|
||||||
|
//console.error('ps2', prefix, exists)
|
||||||
|
|
||||||
|
if (!this.matches[index])
|
||||||
|
this.matches[index] = Object.create(null)
|
||||||
|
|
||||||
|
// If it doesn't exist, then just mark the lack of results
|
||||||
|
if (!exists)
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
if (prefix && isAbsolute(prefix) && !this.nomount) {
|
||||||
|
var trail = /[\/\\]$/.test(prefix)
|
||||||
|
if (prefix.charAt(0) === '/') {
|
||||||
|
prefix = path.join(this.root, prefix)
|
||||||
|
} else {
|
||||||
|
prefix = path.resolve(this.root, prefix)
|
||||||
|
if (trail)
|
||||||
|
prefix += '/'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.platform === 'win32')
|
||||||
|
prefix = prefix.replace(/\\/g, '/')
|
||||||
|
|
||||||
|
// Mark this as a match
|
||||||
|
this._emitMatch(index, prefix)
|
||||||
|
cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns either 'DIR', 'FILE', or false
|
||||||
|
Glob.prototype._stat = function (f, cb) {
|
||||||
|
var abs = this._makeAbs(f)
|
||||||
|
var needDir = f.slice(-1) === '/'
|
||||||
|
|
||||||
|
if (f.length > this.maxLength)
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
if (!this.stat && ownProp(this.cache, abs)) {
|
||||||
|
var c = this.cache[abs]
|
||||||
|
|
||||||
|
if (Array.isArray(c))
|
||||||
|
c = 'DIR'
|
||||||
|
|
||||||
|
// It exists, but maybe not how we need it
|
||||||
|
if (!needDir || c === 'DIR')
|
||||||
|
return cb(null, c)
|
||||||
|
|
||||||
|
if (needDir && c === 'FILE')
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
// otherwise we have to stat, because maybe c=true
|
||||||
|
// if we know it exists, but not what it is.
|
||||||
|
}
|
||||||
|
|
||||||
|
var exists
|
||||||
|
var stat = this.statCache[abs]
|
||||||
|
if (stat !== undefined) {
|
||||||
|
if (stat === false)
|
||||||
|
return cb(null, stat)
|
||||||
|
else {
|
||||||
|
var type = stat.isDirectory() ? 'DIR' : 'FILE'
|
||||||
|
if (needDir && type === 'FILE')
|
||||||
|
return cb()
|
||||||
|
else
|
||||||
|
return cb(null, type, stat)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var self = this
|
||||||
|
var statcb = inflight('stat\0' + abs, lstatcb_)
|
||||||
|
if (statcb)
|
||||||
|
fs.lstat(abs, statcb)
|
||||||
|
|
||||||
|
function lstatcb_ (er, lstat) {
|
||||||
|
if (lstat && lstat.isSymbolicLink()) {
|
||||||
|
// If it's a symlink, then treat it as the target, unless
|
||||||
|
// the target does not exist, then treat it as a file.
|
||||||
|
return fs.stat(abs, function (er, stat) {
|
||||||
|
if (er)
|
||||||
|
self._stat2(f, abs, null, lstat, cb)
|
||||||
|
else
|
||||||
|
self._stat2(f, abs, er, stat, cb)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
self._stat2(f, abs, er, lstat, cb)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
|
||||||
|
if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
|
||||||
|
this.statCache[abs] = false
|
||||||
|
return cb()
|
||||||
|
}
|
||||||
|
|
||||||
|
var needDir = f.slice(-1) === '/'
|
||||||
|
this.statCache[abs] = stat
|
||||||
|
|
||||||
|
if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
|
||||||
|
return cb(null, false, stat)
|
||||||
|
|
||||||
|
var c = true
|
||||||
|
if (stat)
|
||||||
|
c = stat.isDirectory() ? 'DIR' : 'FILE'
|
||||||
|
this.cache[abs] = this.cache[abs] || c
|
||||||
|
|
||||||
|
if (needDir && c === 'FILE')
|
||||||
|
return cb()
|
||||||
|
|
||||||
|
return cb(null, c, stat)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
@ -5921,7 +5921,9 @@ class HttpClient {
|
|||||||
maxSockets: maxSockets,
|
maxSockets: maxSockets,
|
||||||
keepAlive: this._keepAlive,
|
keepAlive: this._keepAlive,
|
||||||
proxy: {
|
proxy: {
|
||||||
proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`,
|
...((proxyUrl.username || proxyUrl.password) && {
|
||||||
|
proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`
|
||||||
|
}),
|
||||||
host: proxyUrl.hostname,
|
host: proxyUrl.hostname,
|
||||||
port: proxyUrl.port
|
port: proxyUrl.port
|
||||||
}
|
}
|
||||||
@ -6040,7 +6042,7 @@ rimraf.sync = rimrafSync
|
|||||||
var assert = __webpack_require__(357)
|
var assert = __webpack_require__(357)
|
||||||
var path = __webpack_require__(622)
|
var path = __webpack_require__(622)
|
||||||
var fs = __webpack_require__(747)
|
var fs = __webpack_require__(747)
|
||||||
var glob = __webpack_require__(120)
|
var glob = __webpack_require__(402)
|
||||||
var _0666 = parseInt('666', 8)
|
var _0666 = parseInt('666', 8)
|
||||||
|
|
||||||
var defaultGlobOpts = {
|
var defaultGlobOpts = {
|
||||||
@ -8428,7 +8430,7 @@ exports.sleep = sleep;
|
|||||||
/***/ (function(module, __unusedexports, __webpack_require__) {
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
||||||
|
|
||||||
const {promisify} = __webpack_require__(669);
|
const {promisify} = __webpack_require__(669);
|
||||||
const tmp = __webpack_require__(402);
|
const tmp = __webpack_require__(150);
|
||||||
|
|
||||||
// file
|
// file
|
||||||
module.exports.fileSync = tmp.fileSync;
|
module.exports.fileSync = tmp.fileSync;
|
||||||
|
|||||||
42
package-lock.json
generated
42
package-lock.json
generated
@ -5,25 +5,15 @@
|
|||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/artifact": {
|
"@actions/artifact": {
|
||||||
"version": "0.5.0",
|
"version": "0.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/@actions/artifact/-/artifact-0.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/artifact/-/artifact-0.5.1.tgz",
|
||||||
"integrity": "sha512-uo9zlqm8sZBysFVaBZh8iAe2xNf9x2fDQZZMHiKyBEShvCB2S2nA4+Kt3Xsi9eG5O1E8fVMwEVuwLR3/Zy3mrA==",
|
"integrity": "sha512-wKXEa4fhvgsw3kPu74F3J6eAi92rqv7BvpjEAmiqmDFeuDj6cyqWDWXx6axWfiBmmln1/LVf1DLWikbciKkoVQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@actions/core": "^1.2.6",
|
"@actions/core": "^1.2.6",
|
||||||
"@actions/http-client": "^1.0.7",
|
"@actions/http-client": "^1.0.11",
|
||||||
"@types/tmp": "^0.1.0",
|
"@types/tmp": "^0.1.0",
|
||||||
"tmp": "^0.1.0",
|
"tmp": "^0.1.0",
|
||||||
"tmp-promise": "^2.0.2"
|
"tmp-promise": "^2.0.2"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"tmp": {
|
|
||||||
"version": "0.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
|
|
||||||
"integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==",
|
|
||||||
"requires": {
|
|
||||||
"rimraf": "^2.6.3"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@actions/core": {
|
"@actions/core": {
|
||||||
@ -41,9 +31,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@actions/http-client": {
|
"@actions/http-client": {
|
||||||
"version": "1.0.9",
|
"version": "1.0.11",
|
||||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.9.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz",
|
||||||
"integrity": "sha512-0O4SsJ7q+MK0ycvXPl2e6bMXV7dxAXOGjrXS1eTF9s2S401Tp6c/P3c3Joz04QefC1J6Gt942Wl2jbm3f4mLcg==",
|
"integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"tunnel": "0.0.6"
|
"tunnel": "0.0.6"
|
||||||
}
|
}
|
||||||
@ -9576,22 +9566,20 @@
|
|||||||
"integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
|
"integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"tmp": {
|
||||||
|
"version": "0.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
|
||||||
|
"integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==",
|
||||||
|
"requires": {
|
||||||
|
"rimraf": "^2.6.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"tmp-promise": {
|
"tmp-promise": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-2.1.1.tgz",
|
||||||
"integrity": "sha512-Z048AOz/w9b6lCbJUpevIJpRpUztENl8zdv1bmAKVHimfqRFl92ROkmT9rp7TVBnrEw2gtMTol/2Cp2S2kJa4Q==",
|
"integrity": "sha512-Z048AOz/w9b6lCbJUpevIJpRpUztENl8zdv1bmAKVHimfqRFl92ROkmT9rp7TVBnrEw2gtMTol/2Cp2S2kJa4Q==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"tmp": "0.1.0"
|
"tmp": "0.1.0"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"tmp": {
|
|
||||||
"version": "0.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
|
|
||||||
"integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==",
|
|
||||||
"requires": {
|
|
||||||
"rimraf": "^2.6.3"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tmpl": {
|
"tmpl": {
|
||||||
|
|||||||
@ -29,7 +29,7 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/actions/upload-artifact#readme",
|
"homepage": "https://github.com/actions/upload-artifact#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/artifact": "^0.5.0",
|
"@actions/artifact": "^0.5.1",
|
||||||
"@actions/core": "^1.2.6",
|
"@actions/core": "^1.2.6",
|
||||||
"@actions/glob": "^0.1.0",
|
"@actions/glob": "^0.1.0",
|
||||||
"@actions/io": "^1.0.2"
|
"@actions/io": "^1.0.2"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user