fix: update without specify --latest should not update tag version (#5996)

This commit is contained in:
await-ovo
2023-02-01 09:02:04 +08:00
committed by GitHub
parent db74f9da6b
commit 6348f59314
5 changed files with 49 additions and 5 deletions

View 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).

View File

@@ -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 {

View File

@@ -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')
})

View File

@@ -73,6 +73,7 @@ export type ImporterToResolve = Importer<{
pinnedVersion?: PinnedVersion
raw: string
updateSpec?: boolean
preserveNonSemverVersionSpec?: boolean
}>
& {
peer?: boolean

View File

@@ -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)
}
}