Skip to content
This repository was archived by the owner on Mar 13, 2024. It is now read-only.

Commit 28502b5

Browse files
committed
Replace asyncMap with Promises
1 parent 36b3d24 commit 28502b5

File tree

3 files changed

+122
-115
lines changed

3 files changed

+122
-115
lines changed

cli.js

+32-31
Original file line numberDiff line numberDiff line change
@@ -69,36 +69,37 @@ check({
6969
noDefaultEntries: !args['default-entries'],
7070
extensions: extensions(args.e),
7171
detective: args.detective
72-
}, function (err, data) {
73-
if (err) {
74-
console.error(err.message)
75-
return process.exit(1)
76-
}
77-
var pkg = data.package
78-
var deps = data.used
79-
var failed = 0
80-
var options = {
81-
excludeDev: args.dev === false,
82-
excludePeer: args.peer === false,
83-
ignore: [].concat(args.i || [])
84-
}
85-
if (args.extra) {
86-
var extras = check.extra(pkg, deps, options)
87-
failed += extras.length
88-
if (extras.length) {
89-
console.error('Fail! Modules in package.json not used in code: ' + extras.join(', '))
90-
} else {
91-
console.log('Success! All dependencies in package.json are used in the code')
72+
})
73+
.then(data => {
74+
var pkg = data.package
75+
var deps = data.used
76+
var failed = 0
77+
var options = {
78+
excludeDev: args.dev === false,
79+
excludePeer: args.peer === false,
80+
ignore: [].concat(args.i || [])
9281
}
93-
}
94-
if (args.missing || !args.extra) {
95-
var missing = check.missing(pkg, deps, options)
96-
failed += missing.length
97-
if (missing.length) {
98-
console.error('Fail! Dependencies not listed in package.json: ' + missing.join(', '))
99-
} else {
100-
console.log('Success! All dependencies used in the code are listed in package.json')
82+
if (args.extra) {
83+
var extras = check.extra(pkg, deps, options)
84+
failed += extras.length
85+
if (extras.length) {
86+
console.error('Fail! Modules in package.json not used in code: ' + extras.join(', '))
87+
} else {
88+
console.log('Success! All dependencies in package.json are used in the code')
89+
}
10190
}
102-
}
103-
process.exit(args.ignore || !failed ? 0 : 1)
104-
})
91+
if (args.missing || !args.extra) {
92+
var missing = check.missing(pkg, deps, options)
93+
failed += missing.length
94+
if (missing.length) {
95+
console.error('Fail! Dependencies not listed in package.json: ' + missing.join(', '))
96+
} else {
97+
console.log('Success! All dependencies used in the code are listed in package.json')
98+
}
99+
}
100+
process.exit(args.ignore || !failed ? 0 : 1)
101+
})
102+
.catch(err => {
103+
console.error(err.message)
104+
process.exit(1)
105+
})

index.js

+90-83
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,47 @@
11
var path = require('path')
22
var fs = require('fs')
33
var readPackage = require('read-package-json')
4-
var asyncMap = require('async/map')
54
var builtins = require('builtins')()
6-
var resolve = require('resolve')
5+
var resolveModule = require('resolve')
76
var debug = require('debug')('dependency-check')
87
var isRelative = require('is-relative')
98

9+
var promisedReadPackage = function (pkgPath) {
10+
return new Promise((resolve, reject) => {
11+
readPackage(pkgPath, (err, pkg) => {
12+
if (err) return reject(err)
13+
resolve(pkg)
14+
})
15+
})
16+
}
17+
1018
module.exports = function (opts, cb) {
1119
var pkgPath = opts.path
12-
readPackage(pkgPath, function (err, pkg) {
13-
if (err && err.code === 'EISDIR') {
14-
pkgPath = path.join(pkgPath, 'package.json')
15-
return readPackage(pkgPath, function (err, pkg) {
16-
if (err) return cb(err)
17-
parse({
18-
path: pkgPath,
19-
package: pkg,
20-
entries: opts.entries,
21-
noDefaultEntries: opts.noDefaultEntries,
22-
builtins: opts.builtins,
23-
extensions: getExtensions(opts.extensions, opts.detective)
24-
}, cb)
25-
})
26-
}
27-
parse({
20+
var result = promisedReadPackage(pkgPath)
21+
.catch(err => {
22+
if (err && err.code === 'EISDIR') {
23+
pkgPath = path.join(pkgPath, 'package.json')
24+
return promisedReadPackage(pkgPath)
25+
}
26+
return Promise.reject(err)
27+
})
28+
.then(pkg => parse({
2829
path: pkgPath,
2930
package: pkg,
3031
entries: opts.entries,
3132
noDefaultEntries: opts.noDefaultEntries,
3233
builtins: opts.builtins,
3334
extensions: getExtensions(opts.extensions, opts.detective)
34-
}, cb)
35-
})
35+
}))
36+
37+
if (cb) {
38+
result
39+
.then(value => { cb(null, value) })
40+
.catch(err => { cb(err) })
41+
return
42+
}
43+
44+
return result
3645
}
3746

3847
module.exports.missing = function (pkg, deps, options) {
@@ -127,7 +136,7 @@ function isNotRelative (file) {
127136
return isRelative(file) && file[0] !== '.'
128137
}
129138

130-
function parse (opts, cb) {
139+
function parse (opts) {
131140
var pkgPath = opts.path
132141
var pkg = opts.package
133142
var extensions = opts.extensions
@@ -163,86 +172,84 @@ function parse (opts, cb) {
163172

164173
debug('entry paths', paths)
165174

166-
if (paths.length === 0) return cb(new Error('No entry paths found'))
167-
168-
asyncMap(paths, function (file, cb) {
169-
resolveDep(file, cb)
170-
}, function (err, allDeps) {
171-
if (err) return cb(err)
172-
var used = {}
173-
// merge all deps into one unique list
174-
allDeps.forEach(function (deps) {
175-
Object.keys(deps).forEach(function (dep) {
176-
used[dep] = true
175+
if (paths.length === 0) return Promise.reject(new Error('No entry paths found'))
176+
177+
return Promise.all(paths.map(file => resolveDep(file)))
178+
.then(allDeps => {
179+
var used = {}
180+
// merge all deps into one unique list
181+
allDeps.forEach(function (deps) {
182+
Object.keys(deps).forEach(function (dep) {
183+
used[dep] = true
184+
})
177185
})
178-
})
179-
if (opts.builtins) return cb(null, {package: pkg, used: Object.keys(used), builtins: core})
180186

181-
cb(null, {package: pkg, used: Object.keys(used)})
182-
})
187+
if (opts.builtins) return {package: pkg, used: Object.keys(used), builtins: core}
188+
189+
return {package: pkg, used: Object.keys(used)}
190+
})
183191

184-
function resolveDep (file, callback) {
192+
function resolveDep (file) {
185193
if (isNotRelative(file)) {
186-
return callback(null)
194+
return Promise.resolve(null)
187195
}
188196

189-
return resolve(file, {
190-
basedir: path.dirname(file),
191-
extensions: Object.keys(extensions)
192-
}, function (err, path) {
193-
if (err) return callback(err)
194-
195-
return getDeps(path, callback)
197+
return new Promise((resolve, reject) => {
198+
resolveModule(file, {
199+
basedir: path.dirname(file),
200+
extensions: Object.keys(extensions)
201+
}, (err, path) => {
202+
if (err) return reject(err)
203+
resolve(path)
204+
})
196205
})
206+
.then(path => getDeps(path))
197207
}
198208

199-
function getDeps (file, callback) {
209+
function getDeps (file) {
200210
var ext = path.extname(file)
201211
var detective = extensions[ext] || extensions['.js']
202212

203213
if (typeof detective !== 'function') {
204-
return callback(new Error('Detective function missing for "' + file + '"'))
214+
return Promise.reject(new Error('Detective function missing for "' + file + '"'))
205215
}
206216

207-
fs.readFile(file, 'utf8', read)
208-
209-
function read (err, contents) {
210-
if (err) return callback(err)
211-
212-
var requires = detective(contents)
213-
var relatives = []
214-
requires.map(function (req) {
215-
var isCore = builtins.indexOf(req) > -1
216-
if (isNotRelative(req) && !isCore) {
217-
// require('foo/bar') -> require('foo')
218-
if (req[0] !== '@' && req.indexOf('/') > -1) req = req.split('/')[0]
219-
else if (req[0] === '@') req = req.split('/').slice(0, 2).join('/')
220-
debug('require("' + req + '")' + ' is a dependency')
221-
deps[req] = true
222-
} else {
223-
if (isCore) {
224-
debug('require("' + req + '")' + ' is core')
225-
if (core.indexOf(req) === -1) {
226-
core.push(req)
227-
}
217+
return new Promise((resolve, reject) => {
218+
fs.readFile(file, 'utf8', (err, contents) => {
219+
if (err) return reject(err)
220+
resolve(contents)
221+
})
222+
})
223+
.then(contents => {
224+
var requires = detective(contents)
225+
var relatives = []
226+
requires.map(function (req) {
227+
var isCore = builtins.indexOf(req) > -1
228+
if (isNotRelative(req) && !isCore) {
229+
// require('foo/bar') -> require('foo')
230+
if (req[0] !== '@' && req.indexOf('/') > -1) req = req.split('/')[0]
231+
else if (req[0] === '@') req = req.split('/').slice(0, 2).join('/')
232+
debug('require("' + req + '")' + ' is a dependency')
233+
deps[req] = true
228234
} else {
229-
debug('require("' + req + '")' + ' is relative')
230-
req = path.resolve(path.dirname(file), req)
231-
if (seen.indexOf(req) === -1) {
232-
seen.push(req)
233-
relatives.push(req)
235+
if (isCore) {
236+
debug('require("' + req + '")' + ' is core')
237+
if (core.indexOf(req) === -1) {
238+
core.push(req)
239+
}
240+
} else {
241+
debug('require("' + req + '")' + ' is relative')
242+
req = path.resolve(path.dirname(file), req)
243+
if (seen.indexOf(req) === -1) {
244+
seen.push(req)
245+
relatives.push(req)
246+
}
234247
}
235248
}
236-
}
237-
})
249+
})
238250

239-
asyncMap(relatives, function (name, cb) {
240-
resolveDep(name, cb)
241-
}, done)
242-
}
243-
244-
function done (err) {
245-
return callback(err, deps)
246-
}
251+
return Promise.all(relatives.map(name => resolveDep(name)))
252+
.then(() => deps)
253+
})
247254
}
248255
}

package.json

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
},
1515
"author": "max ogden",
1616
"dependencies": {
17-
"async": "^2.1.4",
1817
"builtins": "^2.0.0",
1918
"debug": "^2.2.0",
2019
"detective": "^4.0.0",

0 commit comments

Comments
 (0)