build: migrate from pnpm overrides to catalogs #14892
Draft
+94
−74
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Overview
Migrates Payload monorepo from
pnpm.overridestopnpm catalogsfor centralized dependency version management. This is Phase 1 of a two-phase migration, focusing on the 8 dependencies currently in overrides.Key Changes
Add pnpm catalog to
pnpm-workspace.yamlcopyfiles,cross-env,dotenv,graphql,mongodb-memory-server,react,react-dom,typescriptSingle source of truth for version management across workspace packages.
Update 9 package.json files to use
catalog:protocolpnpm.overridesblock from root package.jsonFix prod test setup for
--ignore-workspacesetupProd.tsnow resolvescatalog:entries to actual versions before runningpnpm i --ignore-workspaceThe
--ignore-workspaceflag ignores all workspace config including catalogs, so entries must be resolved beforehand.Design Decisions
Catalog over overrides:
pnpm.overridesforces versions on all transitive dependencies. Catalogs provide explicit opt-in version sharing viacatalog:protocol - cleaner and more intentional.Minimal scope (Phase 1): Only migrated the 8 existing override dependencies. Phase 2 will audit and expand to commonly-duplicated deps like
next,drizzle-orm, etc.peerDependencies unchanged: Packages like
@payloadcms/uikeep wide version ranges (e.g.,"react": "^19.0.1 || ^19.1.2 || ^19.2.1") for consumer compatibility.No external YAML parser:
setupProd.tsuses simple string parsing to extract catalog entries, avoiding new dependencies.Overall Flow
sequenceDiagram participant Root as pnpm-workspace.yaml participant Pkg as package.json files participant Install as pnpm install participant Pack as pnpm pack Root->>Root: Define catalog versions Pkg->>Pkg: Reference via "catalog:" Install->>Root: Resolve catalog: to versions Install->>Pkg: Install resolved versions Pack->>Pkg: Replace catalog: with actual versions in tarballReferences / Links