From 65563ae09810ddc2d9d693743f6185122451824f Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Sun, 5 Feb 2023 12:23:01 +0200 Subject: [PATCH] fix(npm-resolver): pick lowest version with * from prerelease versions only --- .changeset/polite-buckets-watch.md | 5 +++ .../npm-resolver/src/pickPackageFromMeta.ts | 3 ++ resolving/npm-resolver/test/index.ts | 33 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 .changeset/polite-buckets-watch.md 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') +})