Added in: v2.13.0

Filtering allows to restrict commands to subsets of packages.

pnpm supports a rich selector syntax for picking packages by name or by relation.

Selectors may be specified via the --filter flag:

pnpm <command> --filter <package_selector>

An article that compares Lerna's filtering to pnpm's: https://medium.com/pnpm/pnpm-vs-lerna-filtering-in-a-multi-package-repository-1f68bc644d6a

--filter <package_name>

Added in: v2.13.0

To select an exact package, just specify its name (@babel/core) or use a pattern to select a set of packages (@babel/*).

Usage examples:

pnpm test --filter @babel/core
pnpm test --filter "@babel/*"
pnpm test --filter "*core"

--filter <package_name>...

Added in: v2.13.0

To select a package and its dependencies (direct and non-direct), suffix the package name with 3 dots: <package_name>.... For instance, the next command will run installation in all dependencies of foo and in foo:

pnpm install --filter foo...

You may use a pattern to select a set of "root" packages:

pnpm install --filter "@babel/preset-*..."

--filter "<package_name>^..."

Added in: v4.4.0

Selects dependencies of a package (both direct and non-direct). For instance:

pnpm install --filter "foo^..."

--filter ...<package_name>

Added in: v2.14.0

To select a package and its dependent packages (direct and non-direct), prefix the package name with 3 dots: ...<package_name>. For instance, the next command will run installation in all dependents of foo and in foo:

pnpm install --filter ...foo

When packages in the workspace are filtered, every package is taken that matches at least one of the selectors. You can use as many filters as you want:

pnpm install --filter ...foo --filter bar --filter qar...

--filter "...^<package_name>"

Added in: v4.4.0

Selects dependent of a package (both direct and non-direct). For instance:

pnpm install --filter "...^foo"

--filter ./<directory>

Added in: v2.15.0

--filter {<directory>}

Added in: v4.7.0

Includes all projects that are under the specified directory.

It may be used with "..." to select dependents/dependencies as well:

pnpm <cmd> --filter ...{<directory>}
pnpm <cmd> --filter {<directory>}...
pnpm <cmd> --filter ...{<directory>}...

It may be combined with [<since>]. For instance, to select all changed projects inside a directory:

pnpm <cmd> --filter "{packages}[origin/master]"
pnpm <cmd> --filter "...{packages}[origin/master]"
pnpm <cmd> --filter "{packages}[origin/master]..."
pnpm <cmd> --filter "...{packages}[origin/master]..."

Or you may select all packages from a directory with names matching the given pattern:

pnpm <cmd> --filter "@babel/*{components}"
pnpm <cmd> --filter "@babel/*{components}[origin/master]"
pnpm <cmd> --filter "...@babel/*{components}[origin/master]"

--filter "[<since>]"

Added in: v4.6.0

Selects all the packages changed since the specified commit/branch. May be suffixed or prefixed with ... to include dependencies/dependents.

For example, the next command will run tests in all changed packages since master and on any dependent packages:

pnpm test --filter "...[origin/master]"

Excluding

Added in: v5.8.0

Any of the filter selectors may work as excluders, when they have a leading "!". In zsh "!" should be escaped: \!.

For instance, this will run the command in all projects except foo:

pnpm <cmd> --filter=!foo

On zsh:

pnpm <cmd> --filter=\!foo

And this one will run tests in all projects that are not under the lib directory:

pnpm <cmd> --filter=!./lib

On zsh:

pnpm <cmd> --filter=\!./lib

--test-pattern <glob>

Added in: v5.14.0

test-pattern allows detecting whether the modified files are related to tests. If they are, the dependent packages of such modified packages are not included.

This option is useful with the "changed since" filter. For instance, the next command will run tests in all changed packages, and if the changes are in the source code of the package, tests will run in the dependent packages as well:

pnpm --filter="...[origin/master]" --test-pattern="test/*" test