node/deps/npm/node_modules/readdir-scoped-modules/readdir.js
isaacs 1721034a40 deps: upgrade npm to 6.10.0
PR-URL: https://github.com/nodejs/node/pull/28525
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Roman Reiss <me@silverwind.io>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com>
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com>
2019-07-18 15:12:49 -07:00

122 lines
2.9 KiB
JavaScript

var fs = require ('graceful-fs')
var dz = require ('dezalgo')
var once = require ('once')
var path = require ('path')
var debug = require ('debuglog') ('rds')
module . exports = readdir
readdir.sync = readdirSync
function readdir (dir, cb) {
fs . readdir (dir, function (er, kids) {
if (er)
return cb (er)
debug ('dir=%j, kids=%j', dir, kids)
readScopes (dir, kids, function (er, data) {
if (er)
return cb (er)
// Sort for bonus consistency points
data = data . sort (function (a, b) {
return a > b ? 1 : -1
})
return cb (null, data)
})
})
}
function readdirSync (dir) {
var kids = fs . readdirSync (dir)
debug ('dir=%j, kids=%j', dir, kids)
var data = readScopesSync (dir, kids)
// Sort for bonus consistency points
data = data . sort (function (a, b) {
return a > b ? 1 : -1
})
return data
}
// Turn [ 'a', '@scope' ] into
// ['a', '@scope/foo', '@scope/bar']
function readScopes (root, kids, cb) {
var scopes = kids . filter (function (kid) {
return kid . charAt (0) === '@'
})
kids = kids . filter (function (kid) {
return kid . charAt (0) !== '@'
})
debug ('scopes=%j', scopes)
if (scopes . length === 0)
dz (cb) (null, kids) // prevent maybe-sync zalgo release
cb = once (cb)
var l = scopes . length
scopes . forEach (function (scope) {
var scopedir = path . resolve (root, scope)
debug ('root=%j scope=%j scopedir=%j', root, scope, scopedir)
fs . readdir (scopedir, then . bind (null, scope))
})
function then (scope, er, scopekids) {
if (er)
return cb (er)
// XXX: Not sure how old this node bug is. Maybe superstition?
scopekids = scopekids . filter (function (scopekid) {
return !(scopekid === '.' || scopekid === '..' || !scopekid)
})
kids . push . apply (kids, scopekids . map (function (scopekid) {
return scope + '/' + scopekid
}))
debug ('scope=%j scopekids=%j kids=%j', scope, scopekids, kids)
if (--l === 0)
cb (null, kids)
}
}
function readScopesSync (root, kids) {
var scopes = kids . filter (function (kid) {
return kid . charAt (0) === '@'
})
kids = kids . filter (function (kid) {
return kid . charAt (0) !== '@'
})
debug ('scopes=%j', scopes)
if (scopes . length === 0)
return kids
var l = scopes . length
scopes . forEach (function (scope) {
var scopedir = path . resolve (root, scope)
debug ('root=%j scope=%j scopedir=%j', root, scope, scopedir)
then (scope, fs . readdirSync (scopedir))
})
function then (scope, scopekids) {
// XXX: Not sure how old this node bug is. Maybe superstition?
scopekids = scopekids . filter (function (scopekid) {
return !(scopekid === '.' || scopekid === '..' || !scopekid)
})
kids . push . apply (kids, scopekids . map (function (scopekid) {
return scope + '/' + scopekid
}))
debug ('scope=%j scopekids=%j kids=%j', scope, scopekids, kids)
}
return kids
}