From c8292f4b337827734a7301a272ff209f7506023d Mon Sep 17 00:00:00 2001 From: Marco Sirabella Date: Sun, 18 Apr 2021 14:20:07 -0700 Subject: [PATCH] Allow `cache add` to accept multiple specs This is a backwards incompatible change to the undocumented `cache add pkg version`, but Motivations for this can be found here: https://github.com/npm/cli/pull/2976#issuecomment-811511134 Signed-off-by: Marco Sirabella --- lib/cache.js | 40 +++++++++++++++++++--------------------- test/lib/cache.js | 11 ++++++----- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/lib/cache.js b/lib/cache.js index 43902f43bbee1..5d544b2dbd185 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -86,32 +86,30 @@ with --force.`) return rimraf(cachePath) } - // npm cache add - // npm cache add - // npm cache add - // npm cache add + // npm cache add ... + // npm cache add ... + // npm cache add ... + // npm cache add ... async add (args) { const usage = 'Usage:\n' + - ' npm cache add \n' + - ' npm cache add @\n' + - ' npm cache add \n' + - ' npm cache add \n' + ' npm cache add ...\n' + + ' npm cache add @...\n' + + ' npm cache add ...\n' + + ' npm cache add ...\n' log.silly('cache add', 'args', args) - const spec = args[0] && args[0] + - (args[1] === undefined || args[1] === null ? '' : `@${args[1]}`) - - if (!spec) + if (args.length === 0) throw Object.assign(new Error(usage), { code: 'EUSAGE' }) - log.silly('cache add', 'spec', spec) - - // we ask pacote for the thing, and then just throw the data - // away so that it tee-pipes it into the cache like it does - // for a normal request. - await pacote.tarball.stream(spec, stream => { - stream.resume() - return stream.promise() - }, this.npm.flatOptions) + return Promise.all(args.map(spec => { + log.silly('cache add', 'spec', spec) + // we ask pacote for the thing, and then just throw the data + // away so that it tee-pipes it into the cache like it does + // for a normal request. + return pacote.tarball.stream(spec, stream => { + stream.resume() + return stream.promise() + }, this.npm.flatOptions) + })) } async verify () { diff --git a/test/lib/cache.js b/test/lib/cache.js index bbebae8894bab..bad0ede89e101 100644 --- a/test/lib/cache.js +++ b/test/lib/cache.js @@ -134,20 +134,21 @@ t.test('cache add pkg only', t => { }) }) -t.test('cache add pkg w/ spec modifier', t => { +t.test('cache add multiple pkgs', t => { t.teardown(() => { logOutput = [] tarballStreamSpec = '' tarballStreamOpts = {} }) - cache.exec(['add', 'mypkg', 'latest'], err => { + cache.exec(['add', 'mypkg', 'anotherpkg'], err => { t.error(err) t.strictSame(logOutput, [ - ['silly', 'cache add', 'args', ['mypkg', 'latest']], - ['silly', 'cache add', 'spec', 'mypkg@latest'], + ['silly', 'cache add', 'args', ['mypkg', 'anotherpkg']], + ['silly', 'cache add', 'spec', 'mypkg'], + ['silly', 'cache add', 'spec', 'anotherpkg'], ], 'logs correctly') - t.equal(tarballStreamSpec, 'mypkg@latest', 'passes the correct spec to pacote') + t.equal(tarballStreamSpec, 'anotherpkg', 'passes the correct spec to pacote') t.same(tarballStreamOpts, npm.flatOptions, 'passes the correct options to pacote') t.end() })