|
1 | 1 | var path = require('path')
|
2 | 2 | var fs = require('fs')
|
3 | 3 | var readPackage = require('read-package-json')
|
4 |
| -var asyncMap = require('async/map') |
5 | 4 | var builtins = require('builtins')()
|
6 |
| -var resolve = require('resolve') |
| 5 | +var resolveModule = require('resolve') |
7 | 6 | var debug = require('debug')('dependency-check')
|
8 | 7 | var isRelative = require('is-relative')
|
9 | 8 |
|
| 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 | + |
10 | 18 | module.exports = function (opts, cb) {
|
11 | 19 | 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({ |
28 | 29 | path: pkgPath,
|
29 | 30 | package: pkg,
|
30 | 31 | entries: opts.entries,
|
31 | 32 | noDefaultEntries: opts.noDefaultEntries,
|
32 | 33 | builtins: opts.builtins,
|
33 | 34 | 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 |
36 | 45 | }
|
37 | 46 |
|
38 | 47 | module.exports.missing = function (pkg, deps, options) {
|
@@ -127,7 +136,7 @@ function isNotRelative (file) {
|
127 | 136 | return isRelative(file) && file[0] !== '.'
|
128 | 137 | }
|
129 | 138 |
|
130 |
| -function parse (opts, cb) { |
| 139 | +function parse (opts) { |
131 | 140 | var pkgPath = opts.path
|
132 | 141 | var pkg = opts.package
|
133 | 142 | var extensions = opts.extensions
|
@@ -163,86 +172,84 @@ function parse (opts, cb) {
|
163 | 172 |
|
164 | 173 | debug('entry paths', paths)
|
165 | 174 |
|
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 | + }) |
177 | 185 | })
|
178 |
| - }) |
179 |
| - if (opts.builtins) return cb(null, {package: pkg, used: Object.keys(used), builtins: core}) |
180 | 186 |
|
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 | + }) |
183 | 191 |
|
184 |
| - function resolveDep (file, callback) { |
| 192 | + function resolveDep (file) { |
185 | 193 | if (isNotRelative(file)) {
|
186 |
| - return callback(null) |
| 194 | + return Promise.resolve(null) |
187 | 195 | }
|
188 | 196 |
|
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 | + }) |
196 | 205 | })
|
| 206 | + .then(path => getDeps(path)) |
197 | 207 | }
|
198 | 208 |
|
199 |
| - function getDeps (file, callback) { |
| 209 | + function getDeps (file) { |
200 | 210 | var ext = path.extname(file)
|
201 | 211 | var detective = extensions[ext] || extensions['.js']
|
202 | 212 |
|
203 | 213 | 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 + '"')) |
205 | 215 | }
|
206 | 216 |
|
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 |
228 | 234 | } 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 | + } |
234 | 247 | }
|
235 | 248 | }
|
236 |
| - } |
237 |
| - }) |
| 249 | + }) |
238 | 250 |
|
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 | + }) |
247 | 254 | }
|
248 | 255 | }
|
0 commit comments