From dce4960ef6d52af128affe7755b2ca72de913b6c Mon Sep 17 00:00:00 2001 From: Gar Date: Wed, 24 Mar 2021 07:40:21 -0700 Subject: [PATCH] fix(config): flatten savePrefix properly It needs to take save-exact into consideration Closes: https://github.com/npm/cli/issues/2932 PR-URL: https://github.com/npm/cli/pull/2937 Credit: @wraithgar Close: #2937 Reviewed-by: @ruyadorno --- lib/utils/config/definitions.js | 4 +++- test/lib/utils/config/definitions.js | 15 +++++++++++++++ test/lib/utils/config/flatten.js | 6 ++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/utils/config/definitions.js b/lib/utils/config/definitions.js index a6ecbcd0c40a5..5001efb461b9c 100644 --- a/lib/utils/config/definitions.js +++ b/lib/utils/config/definitions.js @@ -1581,7 +1581,9 @@ define('save-prefix', { \`npm config set save-prefix='~'\` it would be set to \`~1.2.3\` which only allows patch upgrades. `, - flatten, + flatten (key, obj, flatOptions) { + flatOptions.savePrefix = obj['save-exact'] ? '' : obj['save-prefix'] + }, }) define('save-prod', { diff --git a/test/lib/utils/config/definitions.js b/test/lib/utils/config/definitions.js index 3169feefb8f91..830468c4391ac 100644 --- a/test/lib/utils/config/definitions.js +++ b/test/lib/utils/config/definitions.js @@ -695,3 +695,18 @@ t.test('user-agent', t => { t.equal(flat.userAgent, expectCI) t.end() }) + +t.test('save-prefix', t => { + const obj = { + 'save-exact': true, + 'save-prefix': '~1.2.3', + } + const flat = {} + definitions['save-prefix'] + .flatten('save-prefix', { ...obj, 'save-exact': true }, flat) + t.strictSame(flat, { savePrefix: '' }) + definitions['save-prefix'] + .flatten('save-prefix', { ...obj, 'save-exact': false }, flat) + t.strictSame(flat, { savePrefix: '~1.2.3' }) + t.end() +}) diff --git a/test/lib/utils/config/flatten.js b/test/lib/utils/config/flatten.js index 9fac0820cb0ea..6fc91b4847e38 100644 --- a/test/lib/utils/config/flatten.js +++ b/test/lib/utils/config/flatten.js @@ -6,6 +6,8 @@ delete process.env.NODE process.execPath = '/path/to/node' const obj = { + 'save-exact': true, + 'save-prefix': 'ignored', 'save-dev': true, '@foobar:registry': 'https://foo.bar.com/', '//foo.bar.com:_authToken': 'foobarbazquuxasdf', @@ -15,6 +17,8 @@ const obj = { const flat = flatten(obj) t.strictSame(flat, { saveType: 'dev', + saveExact: true, + savePrefix: '', '@foobar:registry': 'https://foo.bar.com/', '//foo.bar.com:_authToken': 'foobarbazquuxasdf', npmBin: '/path/to/npm', @@ -26,6 +30,8 @@ t.strictSame(flat, { process.env.NODE = '/usr/local/bin/node.exe' flatten({ 'save-dev': false }, flat) t.strictSame(flat, { + saveExact: true, + savePrefix: '', '@foobar:registry': 'https://foo.bar.com/', '//foo.bar.com:_authToken': 'foobarbazquuxasdf', npmBin: '/path/to/npm',