From f1cb40c4e1fb689bab4eedb56172fa7bb50c2009 Mon Sep 17 00:00:00 2001 From: Ryo Matsukawa <76232929+ryo-manba@users.noreply.github.com> Date: Sat, 7 Feb 2026 01:13:15 +0900 Subject: [PATCH] fix: allow pnpm `run -r` to work with empty pnpm-workspace.yaml (#10520) close #10497 --- .changeset/fifty-mangos-arrive.md | 5 +++++ pnpm/src/main.ts | 2 +- pnpm/test/monorepo/index.ts | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 .changeset/fifty-mangos-arrive.md diff --git a/.changeset/fifty-mangos-arrive.md b/.changeset/fifty-mangos-arrive.md new file mode 100644 index 0000000000..fde47be53d --- /dev/null +++ b/.changeset/fifty-mangos-arrive.md @@ -0,0 +1,5 @@ +--- +"pnpm": patch +--- + +Fixed `pnpm run -r` failing with "No projects matched the filters" when an empty `pnpm-workspace.yaml` exists [#10497](https://github.com/pnpm/pnpm/issues/10497). diff --git a/pnpm/src/main.ts b/pnpm/src/main.ts index 6a478b1adf..527441d9e8 100644 --- a/pnpm/src/main.ts +++ b/pnpm/src/main.ts @@ -213,7 +213,7 @@ export async function main (inputArgv: string[]): Promise { const relativeWSDirPath = () => path.relative(process.cwd(), wsDir) || '.' if (config.workspaceRoot) { filters.push({ filter: `{${relativeWSDirPath()}}`, followProdDepsOnly: Boolean(config.filterProd.length) }) - } else if (filters.length === 0 && workspaceDir && !config.includeWorkspaceRoot && (cmd === 'run' || cmd === 'exec' || cmd === 'add' || cmd === 'test')) { + } else if (filters.length === 0 && workspaceDir && config.workspacePackagePatterns && !config.includeWorkspaceRoot && (cmd === 'run' || cmd === 'exec' || cmd === 'add' || cmd === 'test')) { filters.push({ filter: `!{${relativeWSDirPath()}}`, followProdDepsOnly: Boolean(config.filterProd.length) }) } diff --git a/pnpm/test/monorepo/index.ts b/pnpm/test/monorepo/index.ts index 07339ca830..4301a2ba45 100644 --- a/pnpm/test/monorepo/index.ts +++ b/pnpm/test/monorepo/index.ts @@ -61,6 +61,22 @@ test('no projects found', async () => { } }) +test('empty pnpm-workspace.yaml should not break pnpm run -r', async () => { + prepare({ + name: 'project', + version: '1.0.0', + scripts: { + test: 'echo Passed', + }, + }) + + fs.writeFileSync('pnpm-workspace.yaml', '') + + const { stdout, status } = execPnpmSync(['run', '-r', 'test']) + expect(status).toBe(0) + expect(stdout.toString()).toContain('Passed') +}) + const invalidWorkspaceManifests = [ 'pnpm-workspaces.yaml', 'pnpm-workspaces.yml',