diff --git a/.changeset/smooth-grapes-create.md b/.changeset/smooth-grapes-create.md new file mode 100644 index 0000000000..6d345b0bd4 --- /dev/null +++ b/.changeset/smooth-grapes-create.md @@ -0,0 +1,7 @@ +--- +"@pnpm/registry.pkg-metadata-filter": patch +"pnpm": patch +--- + +When the `latest` version doesn't satisfy the maturity requirement configured by `minimumReleaseAge`, pick the highest version that is mature enough, even if it has a different major version [#10100](https://github.com/pnpm/pnpm/issues/10100). + diff --git a/registry/pkg-metadata-filter/src/index.ts b/registry/pkg-metadata-filter/src/index.ts index df04e8f107..a135f9cf86 100644 --- a/registry/pkg-metadata-filter/src/index.ts +++ b/registry/pkg-metadata-filter/src/index.ts @@ -38,7 +38,7 @@ export function filterPkgMetadataByPublishDate ( distTagsWithinDate[tag] = distTagVersion continue } - // Repopulate the tag to the highest version available within date that has the same major as the original tag's version + // Repopulate the tag to the highest version available within date const originalSemVer = tryParseSemver(distTagVersion) if (!originalSemVer) continue const originalIsPrerelease = (originalSemVer.prerelease.length > 0) @@ -48,7 +48,7 @@ export function filterPkgMetadataByPublishDate ( const candidateParsed = tryParseSemver(candidate) if ( !candidateParsed || - candidateParsed.major !== originalSemVer.major || + (tag !== 'latest' && candidateParsed.major !== originalSemVer.major) || (candidateParsed.prerelease.length > 0) !== originalIsPrerelease ) continue if (!bestVersion) { diff --git a/registry/pkg-metadata-filter/test/__snapshots__/index.ts.snap b/registry/pkg-metadata-filter/test/__snapshots__/index.ts.snap index bc7f7902ae..717ff86513 100644 --- a/registry/pkg-metadata-filter/test/__snapshots__/index.ts.snap +++ b/registry/pkg-metadata-filter/test/__snapshots__/index.ts.snap @@ -41,3 +41,26 @@ exports[`filterPkgMetadataByPublishDate 1`] = ` }, } `; + +exports[`filterPkgMetadataByPublishDate 2`] = ` +{ + "dist-tags": { + "latest": "2.9.9", + }, + "name": "dist-tag-date", + "time": { + "2.9.9": "2020-03-01T00:00:00.000Z", + "3.0.0": "2020-05-01T00:00:00.000Z", + }, + "versions": { + "2.9.9": { + "dist": { + "shasum": "", + "tarball": "https://registry.npmjs.org/dist-tag-date/-/dist-tag-date-2.9.9.tgz", + }, + "name": "dist-tag-date", + "version": "2.9.9", + }, + }, +} +`; diff --git a/registry/pkg-metadata-filter/test/index.ts b/registry/pkg-metadata-filter/test/index.ts index 0b45868c7c..f0a0d6496a 100644 --- a/registry/pkg-metadata-filter/test/index.ts +++ b/registry/pkg-metadata-filter/test/index.ts @@ -38,4 +38,28 @@ test('filterPkgMetadataByPublishDate', () => { '3.2.0': '2020-05-01T00:00:00.000Z', }, }, cutoff)).toMatchSnapshot() + + expect(filterPkgMetadataByPublishDate({ + name, + versions: { + '3.0.0': { + name, + version: '3.0.0', + dist: { tarball: `https://registry.npmjs.org/${name}/-/${name}-3.0.0.tgz`, shasum: '' }, + }, + '2.9.9': { + name, + version: '2.9.9', + dist: { tarball: `https://registry.npmjs.org/${name}/-/${name}-2.9.9.tgz`, shasum: '' }, + }, + }, + 'dist-tags': { + latest: '3.0.0', + stable: '3.0.0', + }, + time: { + '2.9.9': '2020-03-01T00:00:00.000Z', + '3.0.0': '2020-05-01T00:00:00.000Z', + }, + }, cutoff)).toMatchSnapshot() })