fix: specs in lockfile when same dep is duplicated

close #2807
PR #2809
This commit is contained in:
Zoltan Kochan
2020-08-29 23:06:54 +03:00
committed by GitHub
parent e65e9bb3d8
commit 83e2e6879e
5 changed files with 61 additions and 4 deletions

View File

@@ -0,0 +1,5 @@
---
"supi": patch
---
When updating specs in the lockfile, read the specs from the manifest in the right order: optionalDependencies > dependencies > devDependencies.

View File

@@ -4,8 +4,8 @@ export default (
manifest: Pick<ProjectManifest, 'devDependencies' | 'dependencies' | 'optionalDependencies'>,
depName: string
) => {
return manifest.dependencies?.[depName] ??
return manifest.optionalDependencies?.[depName] ??
manifest.dependencies?.[depName] ??
manifest.devDependencies?.[depName] ??
manifest.optionalDependencies?.[depName] ??
''
}

View File

@@ -31,6 +31,7 @@ export default function getWantedDependencies (
optionalDependencies: true,
})
return getWantedDependenciesFromGivenSet(depsToInstall, {
dependencies: pkg.dependencies ?? {},
devDependencies: pkg.devDependencies ?? {},
optionalDependencies: pkg.optionalDependencies ?? {},
updatePref: opts?.updateWorkspaceDependencies === true
@@ -46,6 +47,7 @@ function updateWorkspacePref (pref: string) {
function getWantedDependenciesFromGivenSet (
deps: Dependencies,
opts: {
dependencies: Dependencies
devDependencies: Dependencies
optionalDependencies: Dependencies
updatePref: (pref: string) => string
@@ -54,10 +56,14 @@ function getWantedDependenciesFromGivenSet (
if (!deps) return []
return Object.keys(deps).map((alias) => {
const pref = opts.updatePref(deps[alias])
let depType
if (opts.optionalDependencies[alias] != null) depType = 'optional'
else if (opts.dependencies[alias] != null) depType = 'prod'
else if (opts.devDependencies[alias] != null) depType = 'dev'
return {
alias,
dev: !!opts.devDependencies[alias],
optional: !!opts.optionalDependencies[alias],
dev: depType === 'dev',
optional: depType === 'optional',
pinnedVersion: guessPinnedVersionFromExistingSpec(deps[alias]),
pref,
raw: `${alias}@${pref}`,

View File

@@ -8,6 +8,7 @@ import './link'
import './lockfile'
import './offline'
import './packageImportMethods'
import './parseWantedDependencies.test'
import './prune'
import './uninstall'
import './unlink'

View File

@@ -0,0 +1,45 @@
import getSpecFromPackageManifest from 'supi/lib/getSpecFromPackageManifest'
import promisifyTape from 'tape-promise'
import tape = require('tape')
const test = promisifyTape(tape)
test('getSpecFromPackageManifest()', (t) => {
t.equal(
getSpecFromPackageManifest({
dependencies: {
foo: '3.0.0',
},
devDependencies: {
foo: '2.0.0',
},
optionalDependencies: {
foo: '1.0.0',
},
}, 'foo'),
'1.0.0',
'optionalDependencies is first priority'
)
t.equal(
getSpecFromPackageManifest({
dependencies: {
foo: '3.0.0',
},
devDependencies: {
foo: '2.0.0',
},
}, 'foo'),
'3.0.0',
'dependencies is second priority'
)
t.equal(
getSpecFromPackageManifest({
devDependencies: {
foo: '2.0.0',
},
}, 'foo'),
'2.0.0',
'devDependencies is third priority'
)
t.end()
})