| "use strict" |
| var fs = require("fs") |
| var path = require("path") |
| var dz = require("dezalgo") |
| var npa = require("npm-package-arg") |
| |
| module.exports = function (spec, where, cb) { |
| if (where instanceof Function) { cb = where; where = null } |
| if (where == null) where = "." |
| cb = dz(cb) |
| try { |
| var dep = npa(spec) |
| } |
| catch (e) { |
| return cb(e) |
| } |
| if ((dep.type == "range" || dep.type == "version") && dep.name != dep.raw) return cb(null, dep) |
| var specpath = dep.type == "local" |
| ? path.resolve(where, dep.spec) |
| : path.resolve(dep.rawSpec? dep.rawSpec: dep.name) |
| fs.stat(specpath, function (er, s) { |
| if (er) return finalize() |
| if (!s.isDirectory()) return finalize("local") |
| fs.stat(path.join(specpath, "package.json"), function (er) { |
| finalize(er ? null : "directory") |
| }) |
| }) |
| function finalize(type) { |
| if (type != null && type != dep.type) { |
| dep.type = type |
| if (! dep.rawSpec) { |
| dep.rawSpec = dep.name |
| dep.name = null |
| } |
| } |
| if (dep.type == "local" || dep.type == "directory") dep.spec = specpath |
| cb(null, dep) |
| } |
| } |