mirror of
https://github.com/pnpm/pnpm.git
synced 2026-04-10 18:18:56 -04:00
fix: specs in lockfile when same dep is duplicated
close #2807 PR #2809
This commit is contained in:
5
.changeset/popular-bugs-draw.md
Normal file
5
.changeset/popular-bugs-draw.md
Normal 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.
|
||||
@@ -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] ??
|
||||
''
|
||||
}
|
||||
|
||||
@@ -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}`,
|
||||
|
||||
@@ -8,6 +8,7 @@ import './link'
|
||||
import './lockfile'
|
||||
import './offline'
|
||||
import './packageImportMethods'
|
||||
import './parseWantedDependencies.test'
|
||||
import './prune'
|
||||
import './uninstall'
|
||||
import './unlink'
|
||||
|
||||
45
packages/supi/test/parseWantedDependencies.test.ts
Normal file
45
packages/supi/test/parseWantedDependencies.test.ts
Normal 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()
|
||||
})
|
||||
Reference in New Issue
Block a user