feat: show available workspace versions on mismatch (#10466)

This commit is contained in:
Vedant Madane
2026-01-16 22:17:30 +05:30
committed by GitHub
parent cc1b8e310a
commit 29a3151b60
4 changed files with 15 additions and 7 deletions

View File

@@ -217,6 +217,7 @@
"proxied",
"pwsh",
"quux",
"rcompare",
"redownload",
"refclone",
"reflattened",

View File

@@ -71,7 +71,7 @@ test('request package', async () => {
})
const { files } = await pkgResponse.fetching!()
expect(Array.from(files.filesMap.keys()).sort()).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort())
expect(Array.from(files.filesMap.keys()).sort((a, b) => a.localeCompare(b))).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort((a, b) => a.localeCompare(b)))
expect(files.resolvedFrom).toBe('remote')
})
@@ -383,7 +383,7 @@ test('fetchPackageToStore()', async () => {
const { files, bundledManifest } = await fetchResult.fetching()
expect(bundledManifest).toBeTruthy() // we always read the bundled manifest
expect(Array.from(files.filesMap.keys()).sort()).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort())
expect(Array.from(files.filesMap.keys()).sort((a, b) => a.localeCompare(b))).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort((a, b) => a.localeCompare(b)))
expect(files.resolvedFrom).toBe('remote')
const indexFile = loadJsonFileSync<PackageFilesIndex>(fetchResult.filesIndexFile)
@@ -473,7 +473,7 @@ test('fetchPackageToStore() concurrency check', async () => {
ino1 = fs.statSync(files.filesMap.get('package.json') as string).ino
expect(Array.from(files.filesMap.keys()).sort()).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort())
expect(Array.from(files.filesMap.keys()).sort((a, b) => a.localeCompare(b))).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort((a, b) => a.localeCompare(b)))
expect(files.resolvedFrom).toBe('remote')
}
@@ -483,7 +483,7 @@ test('fetchPackageToStore() concurrency check', async () => {
ino2 = fs.statSync(files.filesMap.get('package.json') as string).ino
expect(Array.from(files.filesMap.keys()).sort()).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort())
expect(Array.from(files.filesMap.keys()).sort((a, b) => a.localeCompare(b))).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort((a, b) => a.localeCompare(b)))
expect(files.resolvedFrom).toBe('remote')
}
@@ -551,7 +551,7 @@ test('fetchPackageToStore() does not cache errors', async () => {
},
})
const { files } = await fetchResult.fetching()
expect(Array.from(files.filesMap.keys()).sort()).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort())
expect(Array.from(files.filesMap.keys()).sort((a, b) => a.localeCompare(b))).toStrictEqual(['package.json', 'index.js', 'license', 'readme.md'].sort((a, b) => a.localeCompare(b)))
expect(files.resolvedFrom).toBe('remote')
expect(nock.isDone()).toBeTruthy()

View File

@@ -639,9 +639,16 @@ function tryResolveFromWorkspacePackages (
opts.update ? { name: spec.name, fetchSpec: '*', type: 'range' } : spec
)
if (!localVersion) {
const availableVersions = Array.from(workspacePkgsMatchingName.keys()).sort((a, b) => semver.rcompare(a, b))
throw new PnpmError(
'NO_MATCHING_VERSION_INSIDE_WORKSPACE',
`In ${path.relative(process.cwd(), opts.projectDir)}: No matching version found for ${opts.wantedDependency.alias ?? ''}@${opts.wantedDependency.bareSpecifier ?? ''} inside the workspace`
`In ${path.relative(process.cwd(), opts.projectDir)}: No matching version found for ${opts.wantedDependency.alias ?? ''}@${opts.wantedDependency.bareSpecifier ?? ''} inside the workspace` +
(availableVersions.length ? `. Available versions: ${availableVersions.join(', ')}` : ''),
availableVersions.length
? {
hint: `Available workspace versions for "${spec.name}": ${availableVersions.join(', ')}`,
}
: undefined
)
}
return resolveFromLocalPackage(workspacePkgsMatchingName.get(localVersion)!, spec, opts)

View File

@@ -1767,7 +1767,7 @@ test('workspace protocol: resolution fails if there is no matching local package
expect(err).toBeTruthy()
expect(err.code).toBe('ERR_PNPM_NO_MATCHING_VERSION_INSIDE_WORKSPACE')
expect(err.message).toBe(`In ${path.relative(process.cwd(), projectDir)}: No matching version found for is-positive@workspace:^3.0.0 inside the workspace`)
expect(err.message).toBe(`In ${path.relative(process.cwd(), projectDir)}: No matching version found for is-positive@workspace:^3.0.0 inside the workspace. Available versions: 2.0.0`)
})
test('workspace protocol: resolution fails if there are no local packages', async () => {