diff --git a/.pnp.cjs b/.pnp.cjs index fbb9d8e5e11c..576e905142ee 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -42,6 +42,10 @@ const RAW_RUNTIME_STATE = "name": "make-fetch-smaller",\ "reference": "workspace:packages/make-fetch-smaller"\ },\ + {\ + "name": "@yarnpkg/plugin-catalog",\ + "reference": "workspace:packages/plugin-catalog"\ + },\ {\ "name": "@yarnpkg/plugin-compat",\ "reference": "workspace:packages/plugin-compat"\ @@ -220,6 +224,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/monorepo", ["workspace:."]],\ ["@yarnpkg/nm", ["workspace:packages/yarnpkg-nm"]],\ ["@yarnpkg/parsers", ["workspace:packages/yarnpkg-parsers"]],\ + ["@yarnpkg/plugin-catalog", ["virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-catalog", "virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-catalog", "virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-catalog", "virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-catalog", "virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-catalog", "virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-catalog", "virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-catalog", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-catalog", "virtual:6fc63e4d1a1b8c6564cfaaeabf378b05cdf49336a90189d76df005175060690d597b069801c0c39b9c60573a6fba29e7646274224b3007bd7f72c95871114cf2#workspace:packages/plugin-catalog", "virtual:7b82ac5a3734606065dc76f117982c681b5b5076260acfcac869c687f06db0b8c08eae0998f419d64b9e59f6c816bcc70e067c87fa32ffe9cb979faf85cd80b4#workspace:packages/plugin-catalog", "virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-catalog", "virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-catalog", "virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-catalog", "virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-catalog", "virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-catalog", "virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-catalog", "virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-catalog", "virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-catalog", "virtual:f8376ca2bc11738adced76b97627e7eff07ec08f93f5b76caf8d6bd4f78f5ae9c1911cb9d1a0bd256ef3e0601dedeba933acf0d2381588b6513ee81e25626459#workspace:packages/plugin-catalog", "workspace:packages/plugin-catalog"]],\ ["@yarnpkg/plugin-compat", ["virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-compat", "virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-compat", "virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-compat", "virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-compat", "virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-compat", "virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-compat", "virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-compat", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-compat", "virtual:6fc63e4d1a1b8c6564cfaaeabf378b05cdf49336a90189d76df005175060690d597b069801c0c39b9c60573a6fba29e7646274224b3007bd7f72c95871114cf2#workspace:packages/plugin-compat", "virtual:7b82ac5a3734606065dc76f117982c681b5b5076260acfcac869c687f06db0b8c08eae0998f419d64b9e59f6c816bcc70e067c87fa32ffe9cb979faf85cd80b4#workspace:packages/plugin-compat", "virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-compat", "virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-compat", "virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-compat", "virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-compat", "virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-compat", "virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-compat", "virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-compat", "virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-compat", "virtual:f8376ca2bc11738adced76b97627e7eff07ec08f93f5b76caf8d6bd4f78f5ae9c1911cb9d1a0bd256ef3e0601dedeba933acf0d2381588b6513ee81e25626459#workspace:packages/plugin-compat", "workspace:packages/plugin-compat"]],\ ["@yarnpkg/plugin-constraints", ["virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-constraints", "virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-constraints", "virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-constraints", "virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-constraints", "virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-constraints", "virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-constraints", "virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-constraints", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-constraints", "virtual:6fc63e4d1a1b8c6564cfaaeabf378b05cdf49336a90189d76df005175060690d597b069801c0c39b9c60573a6fba29e7646274224b3007bd7f72c95871114cf2#workspace:packages/plugin-constraints", "virtual:7b82ac5a3734606065dc76f117982c681b5b5076260acfcac869c687f06db0b8c08eae0998f419d64b9e59f6c816bcc70e067c87fa32ffe9cb979faf85cd80b4#workspace:packages/plugin-constraints", "virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-constraints", "virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-constraints", "virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-constraints", "virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-constraints", "virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-constraints", "virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-constraints", "virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-constraints", "virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-constraints", "virtual:f8376ca2bc11738adced76b97627e7eff07ec08f93f5b76caf8d6bd4f78f5ae9c1911cb9d1a0bd256ef3e0601dedeba933acf0d2381588b6513ee81e25626459#workspace:packages/plugin-constraints", "workspace:packages/plugin-constraints"]],\ ["@yarnpkg/plugin-dlx", ["virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-dlx", "virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-dlx", "virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-dlx", "virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-dlx", "virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-dlx", "virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-dlx", "virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-dlx", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-dlx", "virtual:6fc63e4d1a1b8c6564cfaaeabf378b05cdf49336a90189d76df005175060690d597b069801c0c39b9c60573a6fba29e7646274224b3007bd7f72c95871114cf2#workspace:packages/plugin-dlx", "virtual:7b82ac5a3734606065dc76f117982c681b5b5076260acfcac869c687f06db0b8c08eae0998f419d64b9e59f6c816bcc70e067c87fa32ffe9cb979faf85cd80b4#workspace:packages/plugin-dlx", "virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-dlx", "virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-dlx", "virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-dlx", "virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-dlx", "virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-dlx", "virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-dlx", "virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-dlx", "virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-dlx", "virtual:f8376ca2bc11738adced76b97627e7eff07ec08f93f5b76caf8d6bd4f78f5ae9c1911cb9d1a0bd256ef3e0601dedeba933acf0d2381588b6513ee81e25626459#workspace:packages/plugin-dlx", "workspace:packages/plugin-dlx"]],\ @@ -9264,6 +9269,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-dlx"],\ @@ -9314,6 +9320,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-dlx"],\ @@ -9364,6 +9371,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:6fc63e4d1a1b8c6564cfaaeabf378b05cdf49336a90189d76df005175060690d597b069801c0c39b9c60573a6fba29e7646274224b3007bd7f72c95871114cf2#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:6fc63e4d1a1b8c6564cfaaeabf378b05cdf49336a90189d76df005175060690d597b069801c0c39b9c60573a6fba29e7646274224b3007bd7f72c95871114cf2#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:6fc63e4d1a1b8c6564cfaaeabf378b05cdf49336a90189d76df005175060690d597b069801c0c39b9c60573a6fba29e7646274224b3007bd7f72c95871114cf2#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:6fc63e4d1a1b8c6564cfaaeabf378b05cdf49336a90189d76df005175060690d597b069801c0c39b9c60573a6fba29e7646274224b3007bd7f72c95871114cf2#workspace:packages/plugin-dlx"],\ @@ -9414,6 +9422,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-dlx"],\ @@ -9464,6 +9473,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-dlx"],\ @@ -9514,6 +9524,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:f8376ca2bc11738adced76b97627e7eff07ec08f93f5b76caf8d6bd4f78f5ae9c1911cb9d1a0bd256ef3e0601dedeba933acf0d2381588b6513ee81e25626459#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:f8376ca2bc11738adced76b97627e7eff07ec08f93f5b76caf8d6bd4f78f5ae9c1911cb9d1a0bd256ef3e0601dedeba933acf0d2381588b6513ee81e25626459#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:f8376ca2bc11738adced76b97627e7eff07ec08f93f5b76caf8d6bd4f78f5ae9c1911cb9d1a0bd256ef3e0601dedeba933acf0d2381588b6513ee81e25626459#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:f8376ca2bc11738adced76b97627e7eff07ec08f93f5b76caf8d6bd4f78f5ae9c1911cb9d1a0bd256ef3e0601dedeba933acf0d2381588b6513ee81e25626459#workspace:packages/plugin-dlx"],\ @@ -9564,6 +9575,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-dlx"],\ @@ -9614,6 +9626,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-dlx"],\ @@ -9664,6 +9677,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-dlx"],\ @@ -9714,6 +9728,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-dlx"],\ @@ -9764,6 +9779,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:7b82ac5a3734606065dc76f117982c681b5b5076260acfcac869c687f06db0b8c08eae0998f419d64b9e59f6c816bcc70e067c87fa32ffe9cb979faf85cd80b4#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:7b82ac5a3734606065dc76f117982c681b5b5076260acfcac869c687f06db0b8c08eae0998f419d64b9e59f6c816bcc70e067c87fa32ffe9cb979faf85cd80b4#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:7b82ac5a3734606065dc76f117982c681b5b5076260acfcac869c687f06db0b8c08eae0998f419d64b9e59f6c816bcc70e067c87fa32ffe9cb979faf85cd80b4#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:7b82ac5a3734606065dc76f117982c681b5b5076260acfcac869c687f06db0b8c08eae0998f419d64b9e59f6c816bcc70e067c87fa32ffe9cb979faf85cd80b4#workspace:packages/plugin-dlx"],\ @@ -9814,6 +9830,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-dlx"],\ @@ -9864,6 +9881,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-dlx"],\ @@ -9914,6 +9932,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-dlx"],\ @@ -9964,6 +9983,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-dlx"],\ @@ -10014,6 +10034,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-dlx"],\ @@ -10064,6 +10085,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-dlx"],\ @@ -10114,6 +10136,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-dlx"],\ @@ -10163,6 +10186,7 @@ const RAW_RUNTIME_STATE = ["@yarnpkg/libzip", "virtual:b73ceab179a3b4f89c4a5be81bd0c20a80eda623489cb284f304cc8104dbb771916bbc246d0ba809faebd8459cb6554cf114954badb021279ea7aee216456122#workspace:packages/yarnpkg-libzip"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/plugin-catalog", "virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-catalog"],\ ["@yarnpkg/plugin-compat", "virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-compat"],\ ["@yarnpkg/plugin-constraints", "virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-constraints"],\ ["@yarnpkg/plugin-dlx", "virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-dlx"],\ @@ -10569,6 +10593,380 @@ const RAW_RUNTIME_STATE = "linkType": "SOFT"\ }]\ ]],\ + ["@yarnpkg/plugin-catalog", [\ + ["virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-6ae8fa8342/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-b20f402598/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:16f564b30745199d7e07a913c371ce0c078051290c6e08b972f07b3f1bf057a6993fe67b7c6ee24931d0b1dd67e1274151612081733a79b961dd8336318fdfb9#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-b2250c1a95/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:1c3d72c6b31a8950672985f8306a860ecc80c9a006aac95cf4a7ba13a6e7cc4e095e37186a53c9909e9efe97bc0f7f570a74b3879778e2a2356cdcf407120006#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-54178d5436/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:2351fd5ac4f83ad35b714d8af9fdeea561ada341d529d0dba50742dd5735dc3750df6c56bd680e14833d5b987026a1eab6618211ea0ef1b34b727372b3c77bc9#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-ab9ca2eee4/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:45a6746f11cef24d8db9429cc5650999571e6bb77a8cfb3904a0e832f542be35246ec490516049308ca15b8678eb03bcf394199e514a8145ec32731af7235c91#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-887cdc61ca/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:4864d30fc563f2fd1b72a5e3869493c5f50bf38f98ed3886173d80c044d981c3f68220dbf17f2b5fc5b4c5fba7d0af2e003926efe3487086484049f41c449852#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-5259539e66/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:4ff153bc11101851444cc464184bde5e42ffd55b3939421c30a4c2b69483c3267c1680de4a4c00a49c98cbbe35e70111bb3c26f5ce8836b703c15cd5b753451a#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-d4c1117bcb/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:54c8b951e743ea46368d98ac86d4c1ac7d1aa57c9d31cbf6424fa2d918257654f26f71d51dbfe63844c533e97635ff97de50fd37e6e4bf74f2603a98754d6d22#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:6fc63e4d1a1b8c6564cfaaeabf378b05cdf49336a90189d76df005175060690d597b069801c0c39b9c60573a6fba29e7646274224b3007bd7f72c95871114cf2#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-04a5461da9/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:6fc63e4d1a1b8c6564cfaaeabf378b05cdf49336a90189d76df005175060690d597b069801c0c39b9c60573a6fba29e7646274224b3007bd7f72c95871114cf2#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:27ebb8cf1fa70157f710b4926b6d25c44192e74dbac3a766c8dc6505a59ebc433221bfb4b5aabc8cca814bbe95fcb6e1ecffcf94ba96ee6112a57c89364571ac#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:7b82ac5a3734606065dc76f117982c681b5b5076260acfcac869c687f06db0b8c08eae0998f419d64b9e59f6c816bcc70e067c87fa32ffe9cb979faf85cd80b4#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-c17e6e6f60/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:7b82ac5a3734606065dc76f117982c681b5b5076260acfcac869c687f06db0b8c08eae0998f419d64b9e59f6c816bcc70e067c87fa32ffe9cb979faf85cd80b4#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:8bb72793b532d34e63bbc26264dcbcfc4dc4faa0a42627635e997081722bf229d67b7a677d86a568dad949d756630e45b9d4da97ee14b1b4c506494f8a58ea91#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-6a2199eaab/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:a4e201fc3c2d8b3ec5632082d407d554bbf8ea8b84182577dde1ce419148ae0981b382a0805280637d50e1132628fef8f78ee6a015164963130b1310a4cca910#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-f9c8cd307b/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:a7c38e9a420fd3b408ea245831c2c9f0e880eac64b268fab3219f5f0b1d6015f44b1f92d23aabfc6e980bbbbda00a23e9faa983fb98544fab94119ccd31f2440#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-6c8b93bced/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:adaf1cec8728346f1bf6a263f1954625a52d60518b8d2084da8a926203282105d2b95fb9da84922062af8d4fc84b8a1c39f220238424024e56f55577bdbc7208#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-d2c469c83f/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:b4c0e602e8ac4e01a7b08db41bb5808da767dd1f6802758faa5125fb2423614bb0a8806ee1b30c3a0769f86da15ad37377f5118d93cd93fa48df0008a448fb35#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-53a578d5bb/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:b63ad861025672af62aed0e7c80dca4cfce3194ca046161e54fc14c498c39e3b82004ea844489c7a58d2f1a31867f388bf25b8128f5ccce46f35305e1f91e9ab#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-cd196d8663/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:c4bd2716e35986fb2e70f5fba6e9570c69eceabc69282df5bcff5d22c6b7d0e696d0cfb4bcbd9a20675fe3e2eb6192b59d41b97baa8b27e1d474b94eeda3f778#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-f717b8554c/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:ce4dc3135569e847b88addae1199f9468fb0b37867e1a86ba6725f71b9df587a8ae43356ae86c3bfe3b0cbbf07dcf8c1a4a95199810d9f20df387eec0a1e1965#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-9799aeafc5/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:d1d72d9e3903ca8b8d9c23a360395cc764db2689e5992ef9af91c79f03a839db10ec675af9e4c1c8f4842aff1a614eb5b115fcc0afe8256630151ef1252de94b#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:f8376ca2bc11738adced76b97627e7eff07ec08f93f5b76caf8d6bd4f78f5ae9c1911cb9d1a0bd256ef3e0601dedeba933acf0d2381588b6513ee81e25626459#workspace:packages/plugin-catalog", {\ + "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-catalog-virtual-c357f9b313/1/packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@types/yarnpkg__core", null],\ + ["@types/yarnpkg__plugin-pack", null],\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "virtual:f8376ca2bc11738adced76b97627e7eff07ec08f93f5b76caf8d6bd4f78f5ae9c1911cb9d1a0bd256ef3e0601dedeba933acf0d2381588b6513ee81e25626459#workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:4a733c8d9614e2148392368219d98ec1a70b4e8ce99164edd551241b22f6c5233e9d0ccf9f6d83265c8a5aafc617cfd3c4100b3efef1e092a42053c23770ed9a#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "packagePeers": [\ + "@types/yarnpkg__core",\ + "@types/yarnpkg__plugin-pack",\ + "@yarnpkg/core",\ + "@yarnpkg/plugin-pack"\ + ],\ + "linkType": "SOFT"\ + }],\ + ["workspace:packages/plugin-catalog", {\ + "packageLocation": "./packages/plugin-catalog/",\ + "packageDependencies": [\ + ["@yarnpkg/core", "workspace:packages/yarnpkg-core"],\ + ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ + ["@yarnpkg/plugin-catalog", "workspace:packages/plugin-catalog"],\ + ["@yarnpkg/plugin-pack", "virtual:572569575af06858e5d7f4d0dbe6c0741e76db5e6c65708522a93857213495bf1c60f4e618b217daf88fc14605c64ad49f87b67a6007ad69373fb6d52190ee49#workspace:packages/plugin-pack"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ ["@yarnpkg/plugin-compat", [\ ["virtual:10635d85d43c1773f587c2d6565f7a30c3bff1c16e39550dcdd44b3745dd69317ced5e20de16484758df2d6dc9314da646bf356d1ef8485a0dcd939b71a3327c#workspace:packages/plugin-compat", {\ "packageLocation": "./.yarn/__virtual__/@yarnpkg-plugin-compat-virtual-cf41aa914b/1/packages/plugin-compat/",\ diff --git a/.yarn/versions/ae3cd5fb.yml b/.yarn/versions/ae3cd5fb.yml new file mode 100644 index 000000000000..0bc138c1950b --- /dev/null +++ b/.yarn/versions/ae3cd5fb.yml @@ -0,0 +1,25 @@ +releases: + "@yarnpkg/cli": minor + "@yarnpkg/plugin-catalog": major + "@yarnpkg/plugin-pack": patch + +declined: + - "@yarnpkg/plugin-compat" + - "@yarnpkg/plugin-constraints" + - "@yarnpkg/plugin-dlx" + - "@yarnpkg/plugin-essentials" + - "@yarnpkg/plugin-init" + - "@yarnpkg/plugin-interactive-tools" + - "@yarnpkg/plugin-nm" + - "@yarnpkg/plugin-npm" + - "@yarnpkg/plugin-npm-cli" + - "@yarnpkg/plugin-patch" + - "@yarnpkg/plugin-pnp" + - "@yarnpkg/plugin-pnpm" + - "@yarnpkg/plugin-stage" + - "@yarnpkg/plugin-typescript" + - "@yarnpkg/plugin-version" + - "@yarnpkg/plugin-workspace-tools" + - "@yarnpkg/builder" + - "@yarnpkg/core" + - "@yarnpkg/doctor" diff --git a/packages/acceptance-tests/pkg-tests-specs/sources/features/catalogs.test.ts b/packages/acceptance-tests/pkg-tests-specs/sources/features/catalogs.test.ts new file mode 100644 index 000000000000..aa0dd0e8b951 --- /dev/null +++ b/packages/acceptance-tests/pkg-tests-specs/sources/features/catalogs.test.ts @@ -0,0 +1,340 @@ +import {PortablePath, xfs} from '@yarnpkg/fslib'; +import {yarn, fs as fsUtils} from 'pkg-tests-core'; + +describe(`Features`, () => { + describe(`Catalogs`, () => { + test( + `it should resolve dependencies from the default catalog during install`, + makeTemporaryEnv( + { + dependencies: { + [`no-deps`]: `catalog:`, + }, + }, + async ({path, run, source}) => { + await yarn.writeConfiguration(path, { + catalog: { + [`no-deps`]: `2.0.0`, + }, + }); + + await run(`install`); + + await expect(source(`require('no-deps')`)).resolves.toMatchObject({ + name: `no-deps`, + version: `2.0.0`, + }); + }, + ), + ); + + test( + `it should resolve dependencies from named catalogs during install`, + makeTemporaryEnv( + { + dependencies: { + [`no-deps`]: `catalog:react18`, + }, + }, + async ({path, run, source}) => { + await yarn.writeConfiguration(path, { + catalogs: { + react18: { + [`no-deps`]: `2.0.0`, + }, + }, + }); + + await run(`install`); + + await expect(source(`require('no-deps')`)).resolves.toMatchObject({ + name: `no-deps`, + version: `2.0.0`, + }); + }, + ), + ); + + test( + `it should resolve scoped package dependencies from catalogs`, + makeTemporaryEnv( + { + dependencies: { + [`@scoped/create-test-app`]: `catalog:`, + }, + }, + async ({path, run, source}) => { + await yarn.writeConfiguration(path, { + catalog: { + [`@scoped/create-test-app`]: `1.0.0`, + }, + }); + + await run(`install`); + + // Verify that the scoped package was resolved from catalog + const lockfile = await xfs.readFilePromise(`${path}/yarn.lock` as PortablePath, `utf8`); + expect(lockfile).toMatch(/@scoped\/create-test-app@npm:1\.0\.0/); + }, + ), + ); + + test( + `it should support multiple catalog entries in the same project`, + makeTemporaryEnv( + { + dependencies: { + [`no-deps`]: `catalog:`, + [`one-fixed-dep`]: `catalog:react18`, + }, + }, + async ({path, run, source}) => { + await yarn.writeConfiguration(path, { + catalog: { + [`no-deps`]: `2.0.0`, + }, + catalogs: { + react18: { + [`one-fixed-dep`]: `1.0.0`, + }, + }, + }); + + await run(`install`); + + await expect(source(`require('no-deps')`)).resolves.toMatchObject({ + name: `no-deps`, + version: `2.0.0`, + }); + + await expect(source(`require('one-fixed-dep')`)).resolves.toMatchObject({ + name: `one-fixed-dep`, + version: `1.0.0`, + }); + }, + ), + ); + + test( + `it should work with different dependency types (devDependencies, peerDependencies)`, + makeTemporaryEnv( + { + dependencies: { + [`one-fixed-dep`]: `catalog:tools`, + }, + devDependencies: { + [`no-deps`]: `catalog:`, + }, + }, + async ({path, run}) => { + await yarn.writeConfiguration(path, { + catalog: { + [`no-deps`]: `2.0.0`, + }, + catalogs: { + tools: { + [`one-fixed-dep`]: `1.0.0`, + }, + }, + }); + + await run(`install`); + + // Check that the lockfile contains the resolved versions + const lockfile = await xfs.readFilePromise(`${path}/yarn.lock` as PortablePath, `utf8`); + expect(lockfile).toMatch(/no-deps@npm:2\.0\.0/); + expect(lockfile).toMatch(/one-fixed-dep@npm:1\.0\.0/); + }, + ), + ); + + test( + `it should replace catalog references with actual versions during pack`, + makeTemporaryEnv( + { + name: `my-package`, + version: `1.0.0`, + dependencies: { + [`no-deps`]: `catalog:`, + }, + devDependencies: { + [`one-fixed-dep`]: `catalog:dev`, + }, + }, + async ({path, run}) => { + await yarn.writeConfiguration(path, { + catalog: { + [`no-deps`]: `^2.0.0`, + }, + catalogs: { + dev: { + [`one-fixed-dep`]: `~1.0.0`, + }, + }, + }); + + await run(`install`); + await run(`pack`); + + // Unpack the tarball and check the package.json content + await fsUtils.unpackToDirectory(path, `${path}/package.tgz` as PortablePath); + + const packedManifest = await xfs.readJsonPromise(`${path}/package/package.json` as PortablePath); + + expect(packedManifest.dependencies[`no-deps`]).toBe(`npm:^2.0.0`); + expect(packedManifest.devDependencies[`one-fixed-dep`]).toBe(`npm:~1.0.0`); + }, + ), + ); + + test( + `it should handle complex version ranges in catalogs`, + makeTemporaryEnv( + { + dependencies: { + [`no-deps`]: `catalog:`, + }, + }, + async ({path, run, source}) => { + await yarn.writeConfiguration(path, { + catalog: { + [`no-deps`]: `>=1.0.0 <3.0.0`, + }, + }); + + await run(`install`); + + // Should resolve to the highest compatible version (2.0.0) + await expect(source(`require('no-deps')`)).resolves.toMatchObject({ + name: `no-deps`, + version: `2.0.0`, + }); + }, + ), + ); + + test( + `it should throw an error when catalog is not found`, + makeTemporaryEnv( + { + dependencies: { + [`no-deps`]: `catalog:nonexistent`, + }, + }, + async ({path, run}) => { + await yarn.writeConfiguration(path, { + catalog: { + [`no-deps`]: `2.0.0`, + }, + }); + + await expect(run(`install`)).rejects.toThrow(); + }, + ), + ); + + test( + `it should throw an error when catalog entry is not found`, + makeTemporaryEnv( + { + dependencies: { + [`nonexistent-package`]: `catalog:`, + }, + }, + async ({path, run}) => { + await yarn.writeConfiguration(path, { + catalog: { + [`no-deps`]: `2.0.0`, + }, + }); + + await expect(run(`install`)).rejects.toThrow(); + }, + ), + ); + + test( + `it should throw an error when default catalog is empty`, + makeTemporaryEnv( + { + dependencies: { + [`no-deps`]: `catalog:`, + }, + }, + async ({path, run}) => { + await yarn.writeConfiguration(path, { + catalog: {}, + }); + + await expect(run(`install`)).rejects.toThrow(); + }, + ), + ); + + test( + `it should work with file: protocol ranges in catalogs`, + makeTemporaryEnv( + { + dependencies: { + [`my-local-package`]: `catalog:`, + }, + }, + async ({path, run}) => { + // Create a local package + await xfs.mkdirPromise(`${path}/local-package` as PortablePath, {recursive: true}); + await xfs.writeJsonPromise(`${path}/local-package/package.json` as PortablePath, { + name: `my-local-package`, + version: `1.0.0`, + }); + + await yarn.writeConfiguration(path, { + catalog: { + [`my-local-package`]: `file:./local-package`, + }, + }); + + await run(`install`); + + // Verify that the local package was installed + const lockfile = await xfs.readFilePromise(`${path}/yarn.lock` as PortablePath, `utf8`); + expect(lockfile).toMatch(/my-local-package@file:\.\/local-package/); + }, + ), + ); + + test( + `it should work in workspace environments`, + makeTemporaryMonorepoEnv( + { + workspaces: [`packages/*`], + }, + { + packages: {}, + }, + async ({path, run}) => { + // Create workspace package + await xfs.mkdirPromise(`${path}/packages/workspace-a` as PortablePath, {recursive: true}); + await xfs.writeJsonPromise(`${path}/packages/workspace-a/package.json` as PortablePath, { + name: `workspace-a`, + version: `1.0.0`, + dependencies: { + [`no-deps`]: `catalog:`, + }, + }); + + await yarn.writeConfiguration(path, { + catalog: { + [`no-deps`]: `2.0.0`, + }, + }); + + await run(`install`); + + // Verify that the workspace dependency was resolved from catalog + const lockfile = await xfs.readFilePromise(`${path}/yarn.lock` as PortablePath, `utf8`); + expect(lockfile).toMatch(/no-deps@npm:2\.0\.0/); + }, + ), + ); + }); +}); diff --git a/packages/docusaurus/docs/features/catalogs.mdx b/packages/docusaurus/docs/features/catalogs.mdx new file mode 100644 index 000000000000..6f045c2a719f --- /dev/null +++ b/packages/docusaurus/docs/features/catalogs.mdx @@ -0,0 +1,89 @@ +--- +category: features +slug: /features/catalogs +title: "Catalogs" +description: Centralize dependency version management across your workspace with reusable version catalogs. +--- + +## Overview + +Catalogs provide centralized dependency version management for workspaces. Inspired by [pnpm's catalog functionality](https://pnpm.io/catalogs), they allow you to define version ranges in your `.yarnrc.yml` and reference them across multiple `package.json` files using the `catalog:` protocol. + +This eliminates version duplication, ensures consistency across packages, and makes dependency upgrades much simpler — update one place instead of many files. + +:::info +The catalog plugin is included by default starting from Yarn 4.10.0. +::: + +### Basic usage + +Define a catalog in your `.yarnrc.yml`: + +```yaml +catalog: + react: ^18.3.1 + lodash: ^4.17.21 +``` + +Reference entries in your `package.json`: + +```json +{ + "dependencies": { + "react": "catalog:", + "lodash": "catalog:" + } +} +``` + +## Named catalogs + +You can define multiple named catalogs using the `catalogs` field for different purposes: + +```yaml +catalog: + lodash: ^4.17.21 + +catalogs: + react18: + react: ^18.3.1 + react-dom: ^18.3.1 + react17: + react: ^17.0.2 + react-dom: ^17.0.2 +``` + +Reference named catalogs by specifying the name: + +```json +{ + "dependencies": { + "lodash": "catalog:", + "react": "catalog:react18" + } +} +``` + +## Publishing + +When publishing packages, the `catalog:` protocol is automatically replaced with actual version ranges, ensuring compatibility with other package managers: + +```json +// Source package.json +{ + "dependencies": { + "react": "catalog:react18" + } +} + +// Published package.json +{ + "dependencies": { + "react": "^18.3.1" + } +} +``` + +## Supported fields + +The `catalog:` protocol works in `dependencies`, `devDependencies`, `peerDependencies`. diff --git a/packages/plugin-catalog/README.md b/packages/plugin-catalog/README.md new file mode 100644 index 000000000000..5a04fa64a69a --- /dev/null +++ b/packages/plugin-catalog/README.md @@ -0,0 +1,73 @@ +# `@yarnpkg/plugin-catalog` + +This plugin adds support for centralized dependency version management through catalogs, similar to pnpm's catalog feature. + +It hooks into: +- `reduceDependency` and replaces catalog ranges with the ones defined in a catalog. +- `beforeWorkspacePacking` replacing catalogs with actual ranges before packing + +## Install + +This plugin is included by default starting from Yarn 4.10.0. + +## Usage + +### Default Catalog + +Define a catalog in your `.yarnrc.yml`: + +```yaml +catalog: + react: ^18.0.0 + lodash: ^4.17.21 +``` + +Then reference catalog entries in your `package.json`: + +```json +{ + "dependencies": { + "react": "catalog:", + "lodash": "catalog:" + } +} +``` + +### Named Catalogs + +You can define multiple named catalogs for different purposes: + +```yaml +# Default catalog +catalog: + lodash: ^4.17.21 + typescript: ~4.9.0 + +# Named catalogs +catalogs: + react18: + react: ^18.3.1 + react-dom: ^18.3.1 + + react17: + react: ^17.0.2 + react-dom: ^17.0.2 + + vue3: + vue: ^3.4.0 + vuex: ^4.1.0 +``` + +Then reference them in your `package.json`: + +```json +{ + "dependencies": { + "lodash": "catalog:", + "react": "catalog:react18", + "vue": "catalog:vue3" + } +} +``` + +The comprehensive feature documentation can be found in `packages/docusaurus/docs/features/catalog.mdx`. diff --git a/packages/plugin-catalog/package.json b/packages/plugin-catalog/package.json new file mode 100644 index 000000000000..b71dc90b0e21 --- /dev/null +++ b/packages/plugin-catalog/package.json @@ -0,0 +1,45 @@ +{ + "name": "@yarnpkg/plugin-catalog", + "version": "0.0.1", + "license": "BSD-2-Clause", + "main": "./sources/index.ts", + "exports": { + ".": "./sources/index.ts", + "./package.json": "./package.json" + }, + "dependencies": { + "@yarnpkg/fslib": "workspace:^", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@yarnpkg/core": "workspace:^", + "@yarnpkg/plugin-pack": "workspace:^" + }, + "devDependencies": { + "@yarnpkg/core": "workspace:^", + "@yarnpkg/plugin-pack": "workspace:^" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/yarnpkg/berry.git", + "directory": "packages/plugin-catalog" + }, + "scripts": { + "postpack": "rm -rf lib", + "prepack": "run build:compile \"$(pwd)\"" + }, + "publishConfig": { + "main": "./lib/index.js", + "exports": { + ".": "./lib/index.js", + "./package.json": "./package.json" + } + }, + "files": [ + "/lib/**/*" + ], + "engines": { + "node": ">=18.12.0" + }, + "stableVersion": "0.0.1" +} diff --git a/packages/plugin-catalog/sources/constants.ts b/packages/plugin-catalog/sources/constants.ts new file mode 100644 index 000000000000..5d93c4893f64 --- /dev/null +++ b/packages/plugin-catalog/sources/constants.ts @@ -0,0 +1 @@ +export const CATALOG_DESCRIPTOR_PREFIX = `catalog:`; diff --git a/packages/plugin-catalog/sources/index.ts b/packages/plugin-catalog/sources/index.ts new file mode 100644 index 000000000000..478548bba475 --- /dev/null +++ b/packages/plugin-catalog/sources/index.ts @@ -0,0 +1,109 @@ +import {type Descriptor, type Locator, type Plugin, type Project, type Resolver, type ResolveOptions, type Workspace, SettingsType, structUtils, Manifest, ThrowReport} from '@yarnpkg/core'; +import {Hooks as CoreHooks} from '@yarnpkg/core'; +import {Hooks as PackHooks} from '@yarnpkg/plugin-pack'; + +import {isCatalogReference, resolveDescriptorFromCatalog} from './utils'; + +declare module '@yarnpkg/core' { + interface ConfigurationValueMap { + catalog: Map; + catalogs: Map>; + } +} + + +const plugin: Plugin = { + configuration: { + /** + * Example: + * ```yaml + * catalog: + * react: ^18.3.1 + * lodash: ^4.17.21 + * ``` + */ + catalog: { + description: `The default catalog of packages`, + type: SettingsType.MAP, + valueDefinition: { + description: `The catalog of packages`, + type: SettingsType.STRING, + }, + }, + /** + * Example: + * ```yaml + * catalogs: + * react18: + * react: ^18.3.1 + * react-dom: ^18.3.1 + * react17: + * react: ^17.0.2 + * react-dom: ^17.0.2 + * ``` + */ + catalogs: { + description: `Named catalogs of packages`, + type: SettingsType.MAP, + valueDefinition: { + description: `A named catalog`, + type: SettingsType.MAP, + valueDefinition: { + description: `Package version in the catalog`, + type: SettingsType.STRING, + }, + }, + }, + }, + hooks: { + /** + * To allow publishing packages with catalog references, we need to replace the + * catalog references with the actual version ranges during the packing phase. + */ + beforeWorkspacePacking: (workspace: Workspace, rawManifest: any) => { + const project = workspace.project; + + // Create resolver and resolveOptions from the project configuration + const resolver = project.configuration.makeResolver(); + const resolveOptions: ResolveOptions = { + project, + resolver, + report: new ThrowReport(), // Simple report implementation for internal resolution + }; + + for (const dependencyType of Manifest.allDependencies) { + const dependencies = rawManifest[dependencyType]; + if (!dependencies) continue; + + for (const [identStr, range] of Object.entries(dependencies)) { + if (typeof range !== `string` || !isCatalogReference(range)) continue; + + // Create a descriptor to resolve from catalog + const ident = structUtils.parseIdent(identStr); + const descriptor = structUtils.makeDescriptor(ident, range); + + // Resolve the catalog reference to get the actual version range + const resolvedDescriptor = resolveDescriptorFromCatalog(project, descriptor, resolver, resolveOptions); + + // Replace the catalog reference with the resolved range + dependencies[identStr] = resolvedDescriptor.range; + } + } + }, + + /** + * On this hook, we will check if the dependency is a catalog reference, and if so, + * we will replace the range with the actual range defined in the catalog. + */ + reduceDependency: async (dependency: Descriptor, project: Project, locator: Locator, initialDependency: Descriptor, {resolver, resolveOptions}: {resolver: Resolver, resolveOptions: ResolveOptions}) => { + if (isCatalogReference(dependency.range)) { + const resolvedDescriptor = resolveDescriptorFromCatalog(project, dependency, resolver, resolveOptions); + return resolvedDescriptor; + } + return dependency; + }, + }, +}; + +// eslint-disable-next-line arca/no-default-export +export default plugin; diff --git a/packages/plugin-catalog/sources/utils.ts b/packages/plugin-catalog/sources/utils.ts new file mode 100644 index 000000000000..2a930ee61902 --- /dev/null +++ b/packages/plugin-catalog/sources/utils.ts @@ -0,0 +1,62 @@ +import {Descriptor, Project, structUtils, ReportError, MessageName, Resolver, ResolveOptions} from '@yarnpkg/core'; + +import {CATALOG_DESCRIPTOR_PREFIX} from './constants'; + +export const isCatalogReference = (range: string) => { + return range.startsWith(CATALOG_DESCRIPTOR_PREFIX); +}; + +export const getCatalogName = (dependency: Descriptor) => { + return dependency.range.slice(CATALOG_DESCRIPTOR_PREFIX.length) || null; +}; + +const getCatalogErrorDisplayName = (catalogName: string | null) => { + return catalogName === null ? `default catalog` : `catalog "${catalogName}"`; +}; + +export const getCatalogEntryName = (dependency: Descriptor) => { + return dependency.scope ? `@${dependency.scope}/${dependency.name}` : dependency.name; +}; + +export const resolveDescriptorFromCatalog = (project: Project, dependency: Descriptor, resolver: Resolver, resolveOptions: ResolveOptions) => { + const catalogName = getCatalogName(dependency); + let catalog: Map | undefined; + + if (catalogName === null) { + // Use default catalog when no name is specified (catalog:) + catalog = project.configuration.get(`catalog`); + } else { + // Use named catalog when a name is specified (catalog:name) + try { + const catalogs = project.configuration.get(`catalogs`); + if (catalogs) { + catalog = catalogs.get(catalogName); + } + } catch { + catalog = undefined; + } + } + + + if (!catalog || catalog.size === 0) + throw new ReportError(MessageName.RESOLUTION_FAILED, `${structUtils.prettyDescriptor(project.configuration, dependency)}: ${getCatalogErrorDisplayName(catalogName)} not found or empty`); + + const catalogEntryName = getCatalogEntryName(dependency); + const resolvedRange = catalog.get(catalogEntryName); + if (!resolvedRange) + throw new ReportError(MessageName.RESOLUTION_FAILED, `${structUtils.prettyDescriptor(project.configuration, dependency)}: entry not found in ${getCatalogErrorDisplayName(catalogName)}`); + + + // The range resolved from the catalog may need to be normalized (.i.e. ^2.4.0 -> npm:^2.4.0) + // This process typically happens before the reduceDependency hook, but we need to do it here since + // when it is first called the dependency range still refers to the catalog + const normalizedDescriptor = project.configuration.normalizeDependency( + structUtils.makeDescriptor(dependency, resolvedRange), + ); + + // Bind the descriptor to the project's top level workspace (which should match the project root), + // addressing issues with relative file paths when using `file:` protocol + const boundDescriptor = resolver.bindDescriptor(normalizedDescriptor, project.topLevelWorkspace.anchoredLocator, resolveOptions); + + return boundDescriptor; +}; diff --git a/packages/plugin-catalog/tests/utils.test.ts b/packages/plugin-catalog/tests/utils.test.ts new file mode 100644 index 000000000000..3072b2b28979 --- /dev/null +++ b/packages/plugin-catalog/tests/utils.test.ts @@ -0,0 +1,441 @@ +import {Configuration, Project, structUtils, ReportError, Resolver, ResolveOptions, StreamReport} from '@yarnpkg/core'; +import {PortablePath, xfs, ppath, Filename} from '@yarnpkg/fslib'; + +import {isCatalogReference, getCatalogName, getCatalogEntryName, resolveDescriptorFromCatalog} from '../sources/utils'; + +describe(`utils`, () => { + describe(`isCatalogReference`, () => { + it(`should return true for ranges starting with catalog prefix`, () => { + expect(isCatalogReference(`catalog:`)).toBe(true); + expect(isCatalogReference(`catalog:some-reference`)).toBe(true); + expect(isCatalogReference(`catalog:@scope/package`)).toBe(true); + }); + + it(`should return false for ranges not starting with catalog prefix`, () => { + expect(isCatalogReference(`^1.0.0`)).toBe(false); + expect(isCatalogReference(`npm:^1.0.0`)).toBe(false); + expect(isCatalogReference(`file:./package`)).toBe(false); + expect(isCatalogReference(`workspace:^`)).toBe(false); + expect(isCatalogReference(``)).toBe(false); + expect(isCatalogReference(`not-catalog:`)).toBe(false); + }); + + it(`should return false when range is not properly formatted`, () => { + expect(isCatalogReference(`catalogs:`)).toBe(false); + expect(isCatalogReference(`catalog`)).toBe(false); + expect(isCatalogReference(`CATALOG:`)).toBe(false); + expect(isCatalogReference(` catalog:`)).toBe(false); + }); + }); + + describe(`getCatalogName`, () => { + it(`should return null when no reference name is provided`, () => { + const descriptor = structUtils.makeDescriptor( + structUtils.makeIdent(null, `test-package`), + `catalog:`, + ); + expect(getCatalogName(descriptor)).toBe(null); + }); + + it(`should return catalog name when reference name is provided`, () => { + const descriptor = structUtils.makeDescriptor( + structUtils.makeIdent(null, `test-package`), + `catalog:react18`, + ); + expect(getCatalogName(descriptor)).toBe(`react18`); + }); + + it(`should handle reference names with special characters`, () => { + const descriptor = structUtils.makeDescriptor( + structUtils.makeIdent(null, `test-package`), + `catalog:my-ref_with.special-chars`, + ); + expect(getCatalogName(descriptor)).toBe(`my-ref_with.special-chars`); + }); + }); + + describe(`getCatalogEntryName`, () => { + it(`should return package name for non-scoped packages`, () => { + const descriptor = structUtils.makeDescriptor( + structUtils.makeIdent(null, `react`), + `catalog:`, + ); + expect(getCatalogEntryName(descriptor)).toBe(`react`); + }); + + it(`should return full scoped name for scoped packages`, () => { + const descriptor = structUtils.makeDescriptor( + structUtils.makeIdent(`types`, `node`), + `catalog:`, + ); + expect(getCatalogEntryName(descriptor)).toBe(`@types/node`); + }); + }); + + describe(`resolveDescriptorFromCatalog`, () => { + let tmpDir: PortablePath; + let configuration: Configuration; + let project: Project; + let mockResolver: jest.Mocked; + let resolveOptions: ResolveOptions; + + beforeEach(async () => { + tmpDir = await xfs.mktempPromise(); + + // Create a basic package.json + await xfs.writeJsonPromise(ppath.join(tmpDir, Filename.manifest), { + name: `test-project`, + version: `1.0.0`, + }); + + configuration = Configuration.create(tmpDir, tmpDir, new Map()); + + const {project: foundProject} = await Project.find(configuration, tmpDir); + project = foundProject; + + // Create mock resolver with bindDescriptor method + mockResolver = { + bindDescriptor: jest.fn(descriptor => descriptor), + } as any; + + resolveOptions = { + project, + resolver: mockResolver, + report: new StreamReport({stdout: process.stdout, configuration}), + }; + }); + + it(`should resolve descriptor from catalog when entry exists`, () => { + // Set up catalog configuration + const catalog = new Map([ + [`react`, `npm:^18.0.0`], + [`lodash`, `npm:~4.17.21`], + ]); + configuration.values.set(`catalog`, catalog); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `react`), + `catalog:`, + ); + + const resolved = resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + + expect(resolved.range).toBe(`npm:^18.0.0`); + expect(structUtils.stringifyIdent(resolved)).toBe(`react`); + }); + + it(`should resolve descriptor using package name when no reference name is provided`, () => { + const catalog = new Map([ + [`lodash`, `npm:~4.17.21`], + ]); + configuration.values.set(`catalog`, catalog); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `lodash`), + `catalog:`, + ); + + const resolved = resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + + expect(resolved.range).toBe(`npm:~4.17.21`); + expect(structUtils.stringifyIdent(resolved)).toBe(`lodash`); + }); + + it(`should normalize the resolved descriptor`, () => { + const catalog = new Map([ + [`typescript`, `^5.0.0`], + ]); + configuration.values.set(`catalog`, catalog); + + // Mock the normalizeDependency function to test it's called + const originalNormalize = configuration.normalizeDependency; + const normalizeSpy = jest.fn(originalNormalize.bind(configuration)); + configuration.normalizeDependency = normalizeSpy; + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `typescript`), + `catalog:`, + ); + + const resolved = resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + + expect(normalizeSpy).toHaveBeenCalledWith( + expect.objectContaining({ + range: `^5.0.0`, + }), + ); + + expect(resolved.range).toBe(`npm:^5.0.0`); + }); + + it(`should throw ReportError when catalog is empty`, () => { + configuration.values.set(`catalog`, new Map()); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `react`), + `catalog:`, + ); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(ReportError); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(`catalog not found or empty`); + }); + + it(`should throw ReportError when catalog entry is not found`, () => { + const catalog = new Map([ + [`lodash`, `~4.17.21`], + ]); + configuration.values.set(`catalog`, catalog); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `react`), + `catalog:`, + ); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(ReportError); + }); + + it(`should handle scoped packages in catalog`, () => { + const catalog = new Map([ + [`@types/node`, `^20.0.0`], + ]); + configuration.values.set(`catalog`, catalog); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(`types`, `node`), + `catalog:`, + ); + + const resolved = resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + + expect(resolved.range).toBe(`npm:^20.0.0`); + expect(structUtils.stringifyIdent(resolved)).toBe(`@types/node`); + }); + + describe(`named catalogs`, () => { + it(`should resolve descriptor from named catalog when entry exists`, () => { + // Set up named catalogs configuration + const catalogs = new Map([ + [`react18`, new Map([ + [`react`, `npm:^18.3.1`], + [`react-dom`, `npm:^18.3.1`], + ])], + [`react17`, new Map([ + [`react`, `npm:^17.0.2`], + [`react-dom`, `npm:^17.0.2`], + ])], + ]); + configuration.values.set(`catalogs`, catalogs); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `react`), + `catalog:react18`, + ); + + const resolved = resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + + expect(resolved.range).toBe(`npm:^18.3.1`); + expect(structUtils.stringifyIdent(resolved)).toBe(`react`); + }); + + it(`should resolve descriptor from different named catalog`, () => { + const catalogs = new Map([ + [`react18`, new Map([ + [`react`, `npm:^18.3.1`], + ])], + [`react17`, new Map([ + [`react`, `npm:^17.0.2`], + ])], + ]); + configuration.values.set(`catalogs`, catalogs); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `react`), + `catalog:react17`, + ); + + const resolved = resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + + expect(resolved.range).toBe(`npm:^17.0.2`); + expect(structUtils.stringifyIdent(resolved)).toBe(`react`); + }); + + it(`should throw ReportError when named catalog does not exist`, () => { + const catalogs = new Map([ + [`react18`, new Map([ + [`react`, `npm:^18.3.1`], + ])], + ]); + configuration.values.set(`catalogs`, catalogs); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `react`), + `catalog:nonexistent`, + ); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(ReportError); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(`catalog "nonexistent" not found or empty`); + }); + + it(`should throw ReportError when entry is not found in named catalog`, () => { + const catalogs = new Map([ + [`react18`, new Map([ + [`react`, `npm:^18.3.1`], + ])], + ]); + configuration.values.set(`catalogs`, catalogs); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `vue`), + `catalog:react18`, + ); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(ReportError); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(`entry not found in catalog "react18"`); + }); + + it(`should work with both default and named catalogs simultaneously`, () => { + // Set up both default and named catalogs + const defaultCatalog = new Map([ + [`lodash`, `npm:^4.17.21`], + ]); + configuration.values.set(`catalog`, defaultCatalog); + + const catalogs = new Map([ + [`react18`, new Map([ + [`react`, `npm:^18.3.1`], + ])], + ]); + configuration.values.set(`catalogs`, catalogs); + + // Test default catalog + const defaultDependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `lodash`), + `catalog:`, + ); + const defaultResolved = resolveDescriptorFromCatalog(project, defaultDependency, mockResolver, resolveOptions); + expect(defaultResolved.range).toBe(`npm:^4.17.21`); + + // Test named catalog + const namedDependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `react`), + `catalog:react18`, + ); + const namedResolved = resolveDescriptorFromCatalog(project, namedDependency, mockResolver, resolveOptions); + expect(namedResolved.range).toBe(`npm:^18.3.1`); + }); + + it(`should throw ReportError when catalogs configuration does not exist`, () => { + // Don't set any catalogs configuration + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `react`), + `catalog:react18`, + ); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(ReportError); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(`catalog "react18" not found or empty`); + }); + + it(`should throw ReportError when named catalog is empty`, () => { + const catalogs = new Map([ + [`empty`, new Map()], + ]); + configuration.values.set(`catalogs`, catalogs); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `react`), + `catalog:empty`, + ); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(ReportError); + + expect(() => { + resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + }).toThrow(`catalog "empty" not found or empty`); + }); + }); + + it(`should call bindDescriptor with normalized descriptor and return its result`, () => { + const catalog = new Map([ + [`lodash`, `file:../packages/lodash`], + ]); + configuration.values.set(`catalog`, catalog); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(null, `lodash`), + `catalog:`, + ); + + // Mock bindDescriptor to return a modified descriptor + const boundDescriptor = structUtils.makeDescriptor( + structUtils.makeIdent(null, `lodash`), + `file:/absolute/path/to/packages/lodash`, + ); + mockResolver.bindDescriptor.mockReturnValue(boundDescriptor); + + const result = resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + + // Verify bindDescriptor was called with correct parameters + expect(mockResolver.bindDescriptor).toHaveBeenCalledWith( + expect.objectContaining({ + range: `file:../packages/lodash`, + }), + project.topLevelWorkspace.anchoredLocator, + resolveOptions, + ); + + // Verify the result from bindDescriptor is returned + expect(result).toBe(boundDescriptor); + expect(result.range).toBe(`file:/absolute/path/to/packages/lodash`); + }); + + it(`should preserve resolver behavior when bindDescriptor modifies the descriptor`, () => { + const catalog = new Map([ + [`@types/react`, `npm:^18.0.0`], + ]); + configuration.values.set(`catalog`, catalog); + + const dependency = structUtils.makeDescriptor( + structUtils.makeIdent(`types`, `react`), + `catalog:`, + ); + + // Mock bindDescriptor to simulate some transformation + const modifiedDescriptor = structUtils.makeDescriptor( + structUtils.makeIdent(`types`, `react`), + `npm:^18.0.0-modified`, + ); + mockResolver.bindDescriptor.mockReturnValue(modifiedDescriptor); + + const result = resolveDescriptorFromCatalog(project, dependency, mockResolver, resolveOptions); + + expect(mockResolver.bindDescriptor).toHaveBeenCalledTimes(1); + expect(result).toBe(modifiedDescriptor); + expect(result.range).toBe(`npm:^18.0.0-modified`); + }); + }); +}); diff --git a/packages/plugin-pack/sources/packUtils.ts b/packages/plugin-pack/sources/packUtils.ts index 636bd8c44eb6..176903089a68 100644 --- a/packages/plugin-pack/sources/packUtils.ts +++ b/packages/plugin-pack/sources/packUtils.ts @@ -79,61 +79,63 @@ export async function genPackStream(workspace: Workspace, files?: Array { - for (const fileRequest of files!) { - const file = ppath.normalize(fileRequest); + // I don't recall why this was necessary, but probably something to do + // with how Node.js streams process their events vs their drains. + await new Promise(process.nextTick); - const source = ppath.resolve(workspace.cwd, file); - const dest = ppath.join(`package`, file); + for (const fileRequest of files!) { + const file = ppath.normalize(fileRequest); - const stat = await xfs.lstatPromise(source); + const source = ppath.resolve(workspace.cwd, file); + const dest = ppath.join(`package`, file); - const opts = { - name: dest, - mtime: new Date(constants.SAFE_TIME * 1000), - }; + const stat = await xfs.lstatPromise(source); - const mode = executableFiles.has(file) - ? 0o755 - : 0o644; + const opts = { + name: dest, + mtime: new Date(constants.SAFE_TIME * 1000), + }; - let resolveFn: Function; - let rejectFn: Function; + const mode = executableFiles.has(file) + ? 0o755 + : 0o644; - const awaitTarget = new Promise((resolve, reject) => { - resolveFn = resolve; - rejectFn = reject; - }); + let resolveFn: Function; + let rejectFn: Function; - const cb = (error: any) => { - if (error) { - rejectFn(error); - } else { - resolveFn(); - } - }; - - if (stat.isFile()) { - let content: Buffer; - - // The root package.json supports replacement fields in publishConfig - if (file === `package.json`) - content = Buffer.from(JSON.stringify(await genPackageManifest(workspace), null, 2)); - else - content = await xfs.readFilePromise(source); + const awaitTarget = new Promise((resolve, reject) => { + resolveFn = resolve; + rejectFn = reject; + }); - pack.entry({...opts, mode, type: `file`}, content, cb); - } else if (stat.isSymbolicLink()) { - pack.entry({...opts, mode, type: `symlink`, linkname: await xfs.readlinkPromise(source)}, cb); + const cb = (error: any) => { + if (error) { + rejectFn(error); } else { - cb(new Error(`Unsupported file type ${stat.mode} for ${npath.fromPortablePath(file)}`)); + resolveFn(); } + }; + + if (stat.isFile()) { + let content: Buffer; + + // The root package.json supports replacement fields in publishConfig + if (file === `package.json`) + content = Buffer.from(JSON.stringify(await genPackageManifest(workspace), null, 2)); + else + content = await xfs.readFilePromise(source); - await awaitTarget; + pack.entry({...opts, mode, type: `file`}, content, cb); + } else if (stat.isSymbolicLink()) { + pack.entry({...opts, mode, type: `symlink`, linkname: await xfs.readlinkPromise(source)}, cb); + } else { + cb(new Error(`Unsupported file type ${stat.mode} for ${npath.fromPortablePath(file)}`)); } - pack.finalize(); - }); + await awaitTarget; + } + + pack.finalize(); const tgz = createGzip(); pack.pipe(tgz); diff --git a/packages/yarnpkg-cli/package.json b/packages/yarnpkg-cli/package.json index 99d128d0a8d4..2aeb3d749e96 100644 --- a/packages/yarnpkg-cli/package.json +++ b/packages/yarnpkg-cli/package.json @@ -13,6 +13,7 @@ "@yarnpkg/fslib": "workspace:^", "@yarnpkg/libzip": "workspace:^", "@yarnpkg/parsers": "workspace:^", + "@yarnpkg/plugin-catalog": "workspace:^", "@yarnpkg/plugin-compat": "workspace:^", "@yarnpkg/plugin-constraints": "workspace:^", "@yarnpkg/plugin-dlx": "workspace:^", @@ -100,7 +101,8 @@ "@yarnpkg/plugin-stage", "@yarnpkg/plugin-typescript", "@yarnpkg/plugin-version", - "@yarnpkg/plugin-workspace-tools" + "@yarnpkg/plugin-workspace-tools", + "@yarnpkg/plugin-catalog" ] } }, diff --git a/yarn.lock b/yarn.lock index e86ce8ae78af..f8bcfe0b7d3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5793,6 +5793,7 @@ __metadata: "@yarnpkg/libzip": "workspace:^" "@yarnpkg/monorepo": "workspace:^" "@yarnpkg/parsers": "workspace:^" + "@yarnpkg/plugin-catalog": "workspace:^" "@yarnpkg/plugin-compat": "workspace:^" "@yarnpkg/plugin-constraints": "workspace:^" "@yarnpkg/plugin-dlx": "workspace:^" @@ -6123,6 +6124,20 @@ __metadata: languageName: unknown linkType: soft +"@yarnpkg/plugin-catalog@workspace:^, @yarnpkg/plugin-catalog@workspace:packages/plugin-catalog": + version: 0.0.0-use.local + resolution: "@yarnpkg/plugin-catalog@workspace:packages/plugin-catalog" + dependencies: + "@yarnpkg/core": "workspace:^" + "@yarnpkg/fslib": "workspace:^" + "@yarnpkg/plugin-pack": "workspace:^" + tslib: "npm:^2.4.0" + peerDependencies: + "@yarnpkg/core": "workspace:^" + "@yarnpkg/plugin-pack": "workspace:^" + languageName: unknown + linkType: soft + "@yarnpkg/plugin-compat@workspace:^, @yarnpkg/plugin-compat@workspace:packages/plugin-compat": version: 0.0.0-use.local resolution: "@yarnpkg/plugin-compat@workspace:packages/plugin-compat"