diff --git a/.changeset/polite-buckets-watch.md b/.changeset/polite-buckets-watch.md new file mode 100644 index 0000000000..1d538df577 --- /dev/null +++ b/.changeset/polite-buckets-watch.md @@ -0,0 +1,5 @@ +--- +"@pnpm/npm-resolver": patch +--- + +Return the lowest version when `pickLowestVersion` is `true` and the only versions in the metadata are prerelease versions. diff --git a/resolving/npm-resolver/src/pickPackageFromMeta.ts b/resolving/npm-resolver/src/pickPackageFromMeta.ts index d4c8b12a89..4e91332a98 100644 --- a/resolving/npm-resolver/src/pickPackageFromMeta.ts +++ b/resolving/npm-resolver/src/pickPackageFromMeta.ts @@ -62,6 +62,9 @@ export function pickLowestVersionByVersionRange ( meta: PackageMeta, versionRange: string ) { + if (versionRange === '*') { + return Object.keys(meta.versions).sort(semver.compare)[0] + } return semver.minSatisfying(Object.keys(meta.versions), versionRange, true) } diff --git a/resolving/npm-resolver/test/index.ts b/resolving/npm-resolver/test/index.ts index 22513d75bd..837057930a 100644 --- a/resolving/npm-resolver/test/index.ts +++ b/resolving/npm-resolver/test/index.ts @@ -1794,3 +1794,36 @@ test('resolveFromNpm() should normalize the registry', async () => { expect(resolveResult!.manifest!.name).toBe('is-positive') expect(resolveResult!.manifest!.version).toBe('1.0.0') }) + +test('pick lowest version by * when there are only prerelease versions', async () => { + nock(registry) + .get('/is-positive') + .reply(200, { + versions: { + '1.0.0-alpha.1': { + name: 'is-positive', + version: '1.0.0-alpha.1', + dist: { + tarball: 'https://registry.npmjs.org/is-positive/-/is-positive-1.0.0-alpha.1.tgz', + }, + }, + }, + 'dist-tags': { + latest: '1.0.0-alpha.1', + }, + }) + + const cacheDir = tempy.directory() + const resolve = createResolveFromNpm({ + cacheDir, + }) + const resolveResult = await resolve({ alias: 'is-positive', pref: '*' }, { + pickLowestVersion: true, + registry, + }) + + expect(resolveResult!.resolvedVia).toBe('npm-registry') + expect(resolveResult!.id).toBe('registry.npmjs.org/is-positive/1.0.0-alpha.1') + expect(resolveResult!.manifest!.name).toBe('is-positive') + expect(resolveResult!.manifest!.version).toBe('1.0.0-alpha.1') +})