--- /dev/null
+"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)
+ }
+}