mirror of
https://github.com/pnpm/pnpm.git
synced 2026-02-14 09:02:44 -05:00
fix: update without specify --latest should not update tag version (#5996)
This commit is contained in:
7
.changeset/tasty-coins-join.md
Normal file
7
.changeset/tasty-coins-join.md
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
"@pnpm/plugin-commands-installation": patch
|
||||
"@pnpm/resolve-dependencies": patch
|
||||
"pnpm": patch
|
||||
---
|
||||
|
||||
The update command should not replace dependency versions specified via dist-tags [#5996](https://github.com/pnpm/pnpm/pull/5996).
|
||||
@@ -507,7 +507,7 @@ export async function mutateModules (
|
||||
updateWorkspaceDependencies: opts.update,
|
||||
nodeExecPath: opts.nodeExecPath,
|
||||
})
|
||||
.map((wantedDependency) => ({ ...wantedDependency, updateSpec: true }))
|
||||
.map((wantedDependency) => ({ ...wantedDependency, updateSpec: true, preserveNonSemverVersionSpec: true }))
|
||||
|
||||
if (ctx.wantedLockfile?.importers) {
|
||||
forgetResolutionsOfPrevWantedDeps(ctx.wantedLockfile.importers[project.id], wantedDependencies)
|
||||
@@ -719,7 +719,7 @@ export type ImporterToUpdate = {
|
||||
pruneDirectDependencies: boolean
|
||||
removePackages?: string[]
|
||||
updatePackageManifest: boolean
|
||||
wantedDependencies: Array<WantedDependency & { isNew?: boolean, updateSpec?: boolean }>
|
||||
wantedDependencies: Array<WantedDependency & { isNew?: boolean, updateSpec?: boolean, preserveNonSemverVersionSpec?: boolean }>
|
||||
} & DependenciesMutation
|
||||
|
||||
export interface UpdatedProject {
|
||||
|
||||
@@ -335,3 +335,33 @@ test('do not update anything if all the dependencies are ignored and trying to u
|
||||
const lockfileUpdated = await project.readLockfile()
|
||||
expect(lockfileUpdated.packages['/@pnpm.e2e/foo/100.0.0']).toBeTruthy()
|
||||
})
|
||||
|
||||
test('should not update tag version when --latest not set', async () => {
|
||||
await addDistTag({ package: '@pnpm.e2e/peer-a', version: '1.0.1', distTag: 'latest' })
|
||||
await addDistTag({ package: '@pnpm.e2e/peer-c', version: '2.0.0', distTag: 'canary' })
|
||||
await addDistTag({ package: '@pnpm.e2e/foo', version: '2.0.0', distTag: 'latest' })
|
||||
|
||||
prepare({
|
||||
dependencies: {
|
||||
'@pnpm.e2e/peer-a': 'latest',
|
||||
'@pnpm.e2e/peer-c': 'canary',
|
||||
'@pnpm.e2e/foo': '1.0.0',
|
||||
},
|
||||
})
|
||||
|
||||
await install.handler({
|
||||
...DEFAULT_OPTS,
|
||||
dir: process.cwd(),
|
||||
})
|
||||
|
||||
await update.handler({
|
||||
...DEFAULT_OPTS,
|
||||
dir: process.cwd(),
|
||||
latest: false,
|
||||
})
|
||||
|
||||
const manifest = await loadJsonFile<ProjectManifest>('package.json')
|
||||
expect(manifest.dependencies?.['@pnpm.e2e/peer-a']).toBe('latest')
|
||||
expect(manifest.dependencies?.['@pnpm.e2e/peer-c']).toBe('canary')
|
||||
expect(manifest.dependencies?.['@pnpm.e2e/foo']).toBe('1.0.0')
|
||||
})
|
||||
|
||||
@@ -73,6 +73,7 @@ export type ImporterToResolve = Importer<{
|
||||
pinnedVersion?: PinnedVersion
|
||||
raw: string
|
||||
updateSpec?: boolean
|
||||
preserveNonSemverVersionSpec?: boolean
|
||||
}>
|
||||
& {
|
||||
peer?: boolean
|
||||
|
||||
@@ -25,7 +25,7 @@ export async function updateProjectManifest (
|
||||
.filter((rdd, index) => importer.wantedDependencies[index]?.updateSpec)
|
||||
.map((rdd, index) => {
|
||||
const wantedDep = importer.wantedDependencies[index]!
|
||||
return resolvedDirectDepToSpecObject({ ...rdd, isNew: wantedDep.isNew, specRaw: wantedDep.raw }, importer, {
|
||||
return resolvedDirectDepToSpecObject({ ...rdd, isNew: wantedDep.isNew, specRaw: wantedDep.raw, preserveNonSemverVersionSpec: wantedDep.preserveNonSemverVersionSpec }, importer, {
|
||||
nodeExecPath: wantedDep.nodeExecPath,
|
||||
pinnedVersion: wantedDep.pinnedVersion ?? importer.pinnedVersion ?? 'major',
|
||||
preserveWorkspaceProtocol: opts.preserveWorkspaceProtocol,
|
||||
@@ -66,7 +66,8 @@ function resolvedDirectDepToSpecObject (
|
||||
resolution,
|
||||
specRaw,
|
||||
version,
|
||||
}: ResolvedDirectDependency & { isNew?: Boolean, specRaw: string },
|
||||
preserveNonSemverVersionSpec,
|
||||
}: ResolvedDirectDependency & { isNew?: Boolean, specRaw: string, preserveNonSemverVersionSpec?: boolean },
|
||||
importer: ImporterToResolve,
|
||||
opts: {
|
||||
nodeExecPath?: string
|
||||
@@ -103,6 +104,7 @@ function resolvedDirectDepToSpecObject (
|
||||
specRaw,
|
||||
version,
|
||||
rolling: shouldUseWorkspaceProtocol && opts.saveWorkspaceProtocol === 'rolling',
|
||||
preserveNonSemverVersionSpec,
|
||||
})
|
||||
}
|
||||
if (
|
||||
@@ -156,6 +158,7 @@ function getPrefPreferSpecifiedExoticSpec (
|
||||
specRaw: string
|
||||
pinnedVersion: PinnedVersion
|
||||
rolling: boolean
|
||||
preserveNonSemverVersionSpec?: boolean
|
||||
}
|
||||
) {
|
||||
const prefix = getPrefix(opts.alias, opts.name)
|
||||
@@ -168,7 +171,10 @@ function getPrefPreferSpecifiedExoticSpec (
|
||||
}
|
||||
}
|
||||
const selector = versionSelectorType(specWithoutName)
|
||||
if (!selector) {
|
||||
if (
|
||||
((selector == null) || (selector.type !== 'version' && selector.type !== 'range')) &&
|
||||
opts.preserveNonSemverVersionSpec
|
||||
) {
|
||||
return opts.specRaw.slice(opts.alias.length + 1)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user