diff options
Diffstat (limited to 'deps/npm/lib/ls.js')
-rw-r--r-- | deps/npm/lib/ls.js | 194 |
1 files changed, 108 insertions, 86 deletions
diff --git a/deps/npm/lib/ls.js b/deps/npm/lib/ls.js index 274d0f22b..99376db11 100644 --- a/deps/npm/lib/ls.js +++ b/deps/npm/lib/ls.js @@ -13,6 +13,7 @@ var npm = require("./npm.js") , log = require("./utils/log.js") , relativize = require("./utils/relativize.js") , path = require("path") + , archy = require("archy") ls.usage = "npm ls" @@ -43,13 +44,22 @@ function ls (args, silent, cb) { } return o }, 2) - } else { - out = makePretty(bfsify(data), long, dir).join("\n") + } else if (npm.config.get("parseable")) { + out = makeParseable(bfsify(data), long, dir) + } else if (data) { + out = makeArchy(bfsify(data), long, dir) } output.write(out, function (er) { cb(er, data, lite) }) }) } +function alphasort (a, b) { + a = a.toLowerCase() + b = b.toLowerCase() + return a > b ? 1 + : a < b ? -1 : 0 +} + function getLite (data, noname) { var lite = {} , maxDepth = npm.config.get("depth") @@ -147,103 +157,115 @@ function bfsify (root, current, queue, seen) { } -function makePretty (data, long, dir, prefix, list) { - var top = !list - list = list || [] - prefix = prefix || "" - list.push(format(data, long, prefix, dir)) - var deps = data.dependencies || {} - , childPref = prefix.split("├─").join("│ ") - .split("└─").join(" ") - , depList = Object.keys(deps) - , depLast = depList.length - 1 - , maxDepth = npm.config.get("depth") - Object.keys(deps).sort(function (a, b) { - return a > b ? 1 : -1 - }).forEach(function (d, i) { - var depData = deps[d] - if (typeof depData === "string") { - if (data.depth < maxDepth) { - var p = data.link || data.path - log.warn("Unmet dependency in "+p, d+" "+deps[d]) - depData = npm.config.get("parseable") - ? ( npm.config.get("long") - ? path.resolve(data.path, "node_modules", d) - + ":"+d+"@"+JSON.stringify(depData)+":INVALID:MISSING" - : "" ) - : "─ \033[31;40mUNMET DEPENDENCY\033[0m "+d+" "+depData - } else { - if (npm.config.get("parseable")) { - depData = path.resolve(data.path, "node_modules", d) - + (npm.config.get("long") - ? ":" + d + "@" + JSON.stringify(depData) - + ":" // no realpath resolved - + ":MAXDEPTH" - : "") - } else { - depData = "─ "+d+"@'"+depData +"' (max depth reached)" - } - } - } - var c = i === depLast ? "└─" : "├─" - makePretty(depData, long, dir, childPref + c, list) - }) - if (top && list.length === 1 && !data._id) { - if (!npm.config.get("parseable")) { - list.push("(empty)") - } else if (npm.config.get("long")) list[0] += ":EMPTY" - } - return list.filter(function (l) { return l && l.trim() }) +function makeArchy (data, long, dir) { + var out = makeArchy_(data, long, dir, 0) + return archy(out, "", { unicode: npm.config.get("unicode") }) } -function ugly (data) { +function makeArchy_ (data, long, dir, depth, parent, d) { if (typeof data === "string") { + if (depth < npm.config.get("depth")) { + // just missing + var p = parent.link || parent.path + log.warn("Unmet dependency in "+p, d+" "+data) + data = "\033[31;40mUNMET DEPENDENCY\033[0m " + d + " " + data + } else { + data = d+"@'"+ data +"' (max depth reached)" + } return data } - if (!npm.config.get("long")) return data.path - return data.path - + ":" + (data._id || "") - + ":" + (data.realPath !== data.path ? data.realPath : "") - + (data.extraneous ? ":EXTRANEOUS" : "") - + (data.invalid ? ":INVALID" : "") -} + var out = {} + // the top level is a bit special. + out.label = data._id ? data._id + " " : "" + if (data.link) out.label += "-> " + data.link -function format (data, long, prefix, dir) { - if (npm.config.get("parseable")) return ugly(data) - if (typeof data === "string") { - return prefix + data - } -// console.log([data.path, dir], "relativize") - var depLen = Object.keys(data.dependencies).length - , space = prefix.split("├─").join("│ ") - .split("└─").join(" ") - + (depLen ? "" : " ") - , rel = relativize(data.path || "", dir) - , l = prefix - + (rel === "." ? "" : depLen ? "┬ " : "─ ") - + (data._id ? data._id + " " : "") - + (data.link ? "-> " + data.link : "") + "" - + (rel === "." && !(long && data._id) ? dir : "") if (data.invalid) { if (data.realName !== data.name) l += " ("+data.realName+")" - l += " \033[31;40minvalid\033[0m" + out.label += " \033[31;40minvalid\033[0m" } - if (data.extraneous && rel !== ".") { - l += " \033[32;40mextraneous\033[0m" + + if (data.extraneous && data.path !== dir) { + out.label += " \033[32;40mextraneous\033[0m" } - if (!long || !data._id) return l + + if (long) { + if (dir === data.path) out.label += "\n" + dir + out.label += "\n" + getExtras(data, dir) + } else if (dir === data.path) { + out.label += dir + } + + // now all the children. + out.nodes = Object.keys(data.dependencies || {}) + .sort(alphasort).map(function (d) { + return makeArchy_(data.dependencies[d], long, dir, depth + 1, data, d) + }) + + if (out.nodes.length === 0 && data.path === dir) { + out.nodes = ["(empty)"] + } + + return out +} + +function getExtras (data, dir) { var extras = [] - if (rel !== ".") extras.push(rel) - else extras.push(dir) + , rel = relativize(data.path || "", dir) + , url = require("url") + if (data.description) extras.push(data.description) if (data.repository) extras.push(data.repository.url) if (data.homepage) extras.push(data.homepage) - extras = extras.filter(function (e) { return e }) - var lastExtra = !depLen && extras.length - 1 - l += extras.map(function (e, i) { - var indent = !depLen ? " " : "│ " - return "\n" + space + indent + e - }).join("") - return l + if (data._from) { + var from = data._from + if (from.indexOf(data.name + "@") === 0) { + from = from.substr(data.name.length + 1) + } + var u = url.parse(from) + if (u.protocol) extras.push(from) + } + return extras.join("\n") +} + + +function makeParseable (data, long, dir, depth, parent, d) { + depth = depth || 0 + + return [ makeParseable_(data, long, dir, depth, parent, d) ] + .concat(Object.keys(data.dependencies || {}) + .sort(alphasort).map(function (d) { + return makeParseable(data.dependencies[d], long, dir, depth + 1, data, d) + })) + .join("\n") +} + +function makeParseable_ (data, long, dir, depth, parent, d) { + if (typeof data === "string") { + if (data.depth < npm.config.get("depth")) { + var p = parent.link || parent.path + log.warn("Unmet dependency in "+p, d+" "+data) + data = npm.config.get("long") + ? path.resolve(parent.path, "node_modules", d) + + ":"+d+"@"+JSON.stringify(data)+":INVALID:MISSING" + : "" + } else { + data = path.resolve(data.path, "node_modules", d) + + (npm.config.get("long") + ? ":" + d + "@" + JSON.stringify(data) + + ":" // no realpath resolved + + ":MAXDEPTH" + : "") + } + + return data + } + + if (!npm.config.get("long")) return data.path + + return data.path + + ":" + (data._id || "") + + ":" + (data.realPath !== data.path ? data.realPath : "") + + (data.extraneous ? ":EXTRANEOUS" : "") + + (data.invalid ? ":INVALID" : "") } |