diff --git a/.changeset/vast-yaks-cut.md b/.changeset/vast-yaks-cut.md new file mode 100644 index 0000000000..f89a69815b --- /dev/null +++ b/.changeset/vast-yaks-cut.md @@ -0,0 +1,14 @@ +--- +"pnpm": patch +"@pnpm/resolve-dependencies": patch +--- + +`minimumReleaseAgeExclude` config support patterns. For instance: + +```yaml +minimumReleaseAge: 1440 +minimumReleaseAgeExclude: + - '@eslint/*' +``` + +Related PR: [#9984](https://github.com/pnpm/pnpm/pull/9984). diff --git a/pkg-manager/core/test/install/minimumReleaseAge.ts b/pkg-manager/core/test/install/minimumReleaseAge.ts index be43134189..05543c00f6 100644 --- a/pkg-manager/core/test/install/minimumReleaseAge.ts +++ b/pkg-manager/core/test/install/minimumReleaseAge.ts @@ -22,3 +22,12 @@ test('minimumReleaseAge is ignored for packages in the minimumReleaseAgeExclude expect(manifest.dependencies!['is-odd']).toEqual('~0.1.2') }) + +test('minimumReleaseAge is ignored for packages in the minimumReleaseAgeExclude array, using a pattern', async () => { + prepareEmpty() + + const opts = testDefaults({ minimumReleaseAge, minimumReleaseAgeExclude: ['is-*'] }) + const { updatedManifest: manifest } = await addDependenciesToPackage({}, ['is-odd@0.1'], opts) + + expect(manifest.dependencies!['is-odd']).toEqual('~0.1.2') +}) diff --git a/pkg-manager/resolve-dependencies/package.json b/pkg-manager/resolve-dependencies/package.json index a4f02aa84b..a731d258c3 100644 --- a/pkg-manager/resolve-dependencies/package.json +++ b/pkg-manager/resolve-dependencies/package.json @@ -44,6 +44,7 @@ "@pnpm/lockfile.types": "workspace:*", "@pnpm/lockfile.utils": "workspace:*", "@pnpm/manifest-utils": "workspace:*", + "@pnpm/matcher": "workspace:*", "@pnpm/npm-resolver": "workspace:*", "@pnpm/patching.config": "workspace:*", "@pnpm/patching.types": "workspace:*", diff --git a/pkg-manager/resolve-dependencies/src/resolveDependencies.ts b/pkg-manager/resolve-dependencies/src/resolveDependencies.ts index 89cbc0fe0d..9bb6e74f42 100644 --- a/pkg-manager/resolve-dependencies/src/resolveDependencies.ts +++ b/pkg-manager/resolve-dependencies/src/resolveDependencies.ts @@ -177,7 +177,7 @@ export interface ResolutionContext { missingPeersOfChildrenByPkgId: Record hoistPeers?: boolean maximumPublishedBy?: Date - minimumReleaseAgeExclude?: string[] + minimumReleaseAgeExclude?: (pkgName: string) => boolean } export interface MissingPeerInfo { @@ -1311,7 +1311,7 @@ async function resolveDependency ( ( ctx.minimumReleaseAgeExclude == null || wantedDependency.alias == null || - !ctx.minimumReleaseAgeExclude.includes(wantedDependency.alias) + !ctx.minimumReleaseAgeExclude(wantedDependency.alias) ) ) { publishedBy = options.publishedBy diff --git a/pkg-manager/resolve-dependencies/src/resolveDependencyTree.ts b/pkg-manager/resolve-dependencies/src/resolveDependencyTree.ts index 92f1975c06..727f0a564f 100644 --- a/pkg-manager/resolve-dependencies/src/resolveDependencyTree.ts +++ b/pkg-manager/resolve-dependencies/src/resolveDependencyTree.ts @@ -2,6 +2,7 @@ import { resolveFromCatalog } from '@pnpm/catalogs.resolver' import { type Catalogs } from '@pnpm/catalogs.types' import { type LockfileObject } from '@pnpm/lockfile.types' import { globalWarn } from '@pnpm/logger' +import { createMatcher } from '@pnpm/matcher' import { type PatchGroupRecord } from '@pnpm/patching.config' import { type PreferredVersions, type Resolution, type WorkspacePackages } from '@pnpm/resolver-base' import { type StoreController } from '@pnpm/store-controller-types' @@ -196,7 +197,7 @@ export async function resolveDependencyTree ( hoistPeers: autoInstallPeers || opts.dedupePeerDependents, allPeerDepNames: new Set(), maximumPublishedBy: opts.minimumReleaseAge ? new Date(Date.now() - opts.minimumReleaseAge * 60 * 1000) : undefined, - minimumReleaseAgeExclude: opts.minimumReleaseAgeExclude, + minimumReleaseAgeExclude: opts.minimumReleaseAgeExclude ? createMatcher(opts.minimumReleaseAgeExclude) : undefined, } const resolveArgs: ImporterToResolve[] = importers.map((importer) => { diff --git a/pkg-manager/resolve-dependencies/tsconfig.json b/pkg-manager/resolve-dependencies/tsconfig.json index 6401a9d1f5..7a35618f5b 100644 --- a/pkg-manager/resolve-dependencies/tsconfig.json +++ b/pkg-manager/resolve-dependencies/tsconfig.json @@ -15,6 +15,9 @@ { "path": "../../catalogs/types" }, + { + "path": "../../config/matcher" + }, { "path": "../../fetching/pick-fetcher" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3edb5caff3..871934f1d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6044,6 +6044,9 @@ importers: '@pnpm/manifest-utils': specifier: workspace:* version: link:../../pkg-manifest/manifest-utils + '@pnpm/matcher': + specifier: workspace:* + version: link:../../config/matcher '@pnpm/npm-resolver': specifier: workspace:* version: link:../../resolving/npm-resolver