From fac2e53c546950ddb3ecb9b0a25e66ef892c9a24 Mon Sep 17 00:00:00 2001 From: isaacs Date: Wed, 30 Sep 2020 11:27:08 -0700 Subject: [PATCH] Do not drop peer/dev dep while saving if both set Fix: https://github.com/npm/cli/issues/1849 --- lib/add-rm-pkg-deps.js | 19 ++++++++++++------- test/add-rm-pkg-deps.js | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/lib/add-rm-pkg-deps.js b/lib/add-rm-pkg-deps.js index 175ec55f0..e0dd9bf1a 100644 --- a/lib/add-rm-pkg-deps.js +++ b/lib/add-rm-pkg-deps.js @@ -21,6 +21,7 @@ const removeFromOthers = (name, type, pkg) => { break case 'peer': case 'peerOptional': + others.delete('devDependencies') others.delete('peerDependencies') others.delete('peerDependenciesMeta') break @@ -44,9 +45,9 @@ const addSingle = ({pkg, spec, saveBundle, saveType}) => { const { name, rawSpec } = spec removeFromOthers(name, saveType, pkg) const type = saveType === 'prod' ? 'dependencies' - : saveType === 'dev' ? 'devDependencies' : saveType === 'optional' ? 'optionalDependencies' : saveType === 'peer' || saveType === 'peerOptional' ? 'peerDependencies' + : saveType === 'dev' ? 'devDependencies' : /* istanbul ignore next */ null pkg[type] = pkg[type] || {} @@ -62,6 +63,10 @@ const addSingle = ({pkg, spec, saveBundle, saveType}) => { pdm[name].optional = true pkg.peerDependenciesMeta = pdm } + // peerDeps are often also a devDep, so that they can be tested when + // package managers that don't auto-install peer deps + if (pkg.devDependencies && pkg.devDependencies[name] !== undefined) + pkg.devDependencies[name] = pkg.peerDependencies[name] } if (saveBundle) { @@ -82,16 +87,16 @@ const getSaveType = (pkg, spec) => { peerDependenciesMeta: peerDepsMeta, } = pkg - if (devDeps && devDeps[name] !== undefined) - return 'dev' - else if (optDeps && optDeps[name] !== undefined) - return 'optional' - else if (peerDeps && peerDeps[name] !== undefined) { + if (peerDeps && peerDeps[name] !== undefined) { if (peerDepsMeta && peerDepsMeta[name] && peerDepsMeta[name].optional) return 'peerOptional' else return 'peer' - } else + } else if (devDeps && devDeps[name] !== undefined) + return 'dev' + else if (optDeps && optDeps[name] !== undefined) + return 'optional' + else return 'prod' } diff --git a/test/add-rm-pkg-deps.js b/test/add-rm-pkg-deps.js index e5e9c034f..c743ca319 100644 --- a/test/add-rm-pkg-deps.js +++ b/test/add-rm-pkg-deps.js @@ -122,6 +122,30 @@ t.test('add', t => { devDependencies: { foo: '2' }, }, 'update dev') + t.strictSame(add({ + pkg: { + devDependencies: { foo: '1' }, + peerDependencies: { foo: '1' }, + }, + add: [ foo2 ], + }), { + devDependencies: { foo: '2' }, + peerDependencies: { foo: '2' }, + }, 'update dev and peer together') + + t.strictSame(add({ + pkg: { + devDependencies: { foo: '1' }, + peerDependencies: { foo: '1' }, + peerDependenciesMeta: { foo: { optional: true }}, + }, + add: [ foo2 ], + }), { + devDependencies: { foo: '2' }, + peerDependencies: { foo: '2' }, + peerDependenciesMeta: { foo: { optional: true }}, + }, 'update dev and peerOptional together') + t.end() })