diff --git a/lib/cache.js b/lib/cache.js index 00abd8c746ab7..6817ad525e00d 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -22,18 +22,21 @@ cache.usage = 'npm cache add ' + '\nnpm cache add ' + '\nnpm cache add @' + '\nnpm cache clean' + + '\nnpm cache list [--json]' + '\nnpm cache verify' cache.completion = function (opts, cb) { var argv = opts.conf.argv.remain if (argv.length === 2) { - return cb(null, ['add', 'clean']) + return cb(null, ['add', 'clean', 'list', 'verify']) } // TODO - eventually... switch (argv[2]) { case 'clean': case 'add': + case 'list': + case 'verify': return cb(null, []) } } @@ -52,6 +55,9 @@ function cache (args, cb) { case 'verify': case 'check': result = verify() break + case 'list': case 'ls': + result = list() + break default: return cb('Usage: ' + cache.usage) } if (!result || !result.then) { @@ -135,3 +141,49 @@ function unpack (pkg, ver, unpackTarget, dmode, fmode, uid, gid) { return pacote.extract(npa.resolve(pkg, ver), unpackTarget, opts) }) } + +cache.list = list +function list () { + const json = npm.config.get('json') + const cache = path.join(npm.config.get('cache'), '_cacache') + let writer + if (json) { + writer = { + item: undefined, + handleElement: function (item) { + if (this.item === undefined) { + output('[') + } else { + output(' ' + JSON.stringify(this.item) + ',') + } + this.item = item + }, + done: function () { + if (this.item === undefined) { + output(JSON.stringify([])) + } else { + output(' ' + JSON.stringify(this.item)) + output(']') + } + } + } + } else { + writer = { + handleElement: function (item) { + output(item.key) + output(' url = ' + (item.metadata === undefined ? 'undefined' : item.metadata.url)) + output(' path = ' + item.path) + output(' size = ' + item.size) + output(' time = ' + item.time) + }, + done: () => {} + } + } + + return new BB((resolve, reject) => { + const stream = cacache.ls.stream(cache) + stream.on('data', (item) => writer.handleElement(item)) + stream.on('error', error => { reject(error) }) + stream.on('end', () => { writer.done(); resolve('done') }) + }) +}