fix: default to ['.'] for workspacePackagePatterns when packages field is missing (#10996)

Commit 6eedf828b removed the ['.'] fallback for workspacePackagePatterns
when pnpm-workspace.yaml has no packages field. This caused findPackages
to default to ['.', '**'], discovering ALL directories with package.json
as workspace projects. This is the same regression that was previously
reverted in 595cd414f (close #10571), reintroduced by #10127.

Projects like cdxgen that use pnpm-workspace.yaml only for settings
(e.g. minimumReleaseAge) without a packages field were broken because
test data directories were picked up as workspace projects.

close #10909
This commit is contained in:
Dasa Paddock
2026-03-18 16:59:19 -07:00
committed by GitHub
parent 0c8ac8201e
commit 2e55dcf130
5 changed files with 24 additions and 1 deletions

View File

@@ -0,0 +1,6 @@
---
"@pnpm/fs.find-packages": patch
"pnpm": patch
---
Fix a regression where `pnpm-workspace.yaml` without a `packages` field caused all directories to be treated as workspace projects. This broke projects that use `pnpm-workspace.yaml` only for settings (e.g. `minimumReleaseAge`) without defining workspace packages [#10909](https://github.com/pnpm/pnpm/issues/10909).

View File

@@ -408,7 +408,7 @@ export async function getConfig (opts: {
if (pnpmConfig.workspaceDir != null) {
const workspaceManifest = await readWorkspaceManifest(pnpmConfig.workspaceDir)
pnpmConfig.workspacePackagePatterns = cliOptions['workspace-packages'] as string[] ?? workspaceManifest?.packages
pnpmConfig.workspacePackagePatterns = cliOptions['workspace-packages'] as string[] ?? workspaceManifest?.packages ?? ['.']
if (workspaceManifest) {
addSettingsFromWorkspaceManifestToConfig(pnpmConfig, {
configFromCliOpts,

View File

@@ -0,0 +1 @@
minimumReleaseAge: 4320

View File

@@ -815,6 +815,21 @@ test('reads workspacePackagePatterns', async () => {
expect(config.workspacePackagePatterns).toEqual(['packages/*'])
})
test('workspacePackagePatterns defaults to ["."] when pnpm-workspace.yaml has no packages field', async () => {
const workspaceDir = path.join(import.meta.dirname, 'fixtures/workspace-yaml-without-packages')
process.chdir(workspaceDir)
const { config } = await getConfig({
cliOptions: {},
packageManager: {
name: 'pnpm',
version: '1.0.0',
},
workspaceDir,
})
expect(config.workspacePackagePatterns).toEqual(['.'])
})
test('setting workspace-concurrency to negative number', async () => {
const workspaceDir = path.join(import.meta.dirname, 'fixtures/pkg-with-valid-workspace-yaml')
process.chdir(workspaceDir)

View File

@@ -286,6 +286,7 @@ test('recursive command with filter from config', async () => {
fs.writeFileSync('package.json', '{}', 'utf8')
writeYamlFileSync('pnpm-workspace.yaml', {
packages: ['*'],
filter: ['project-1', 'project-2'],
})
await execPnpm(['recursive', 'install'])