🚀 pnpm/pnpm - Release Notes

pnpm 10.7.1 (2025-04-01)

## Patch Changes

*   `pnpm config set` should convert the settings to their correct type before adding them to `pnpm-workspace.yaml` [#9355](https://github.com/pnpm/pnpm/issues/9355).
*   `pnpm config get` should read auth related settings via npm CLI [#9345](https://github.com/pnpm/pnpm/issues/9345).
*   Replace leading `~/` in a path in `.npmrc` with the home directory [#9217](https://github.com/pnpm/pnpm/issues/9217).


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 10.7 (2025-03-26)

## Minor Changes

*   `pnpm config get` and `list` also show settings set in `pnpm-workspace.yaml` files [#9316](https://github.com/pnpm/pnpm/pull/9316).

*   It should be possible to use env variables in `pnpm-workspace.yaml` setting names and value.

*   Add an ability to patch dependencies by version ranges. Exact versions override version ranges, which in turn override name-only patches. Version range `*` is the same as name-only, except that patch application failure will not be ignored.

    For example:

    ```yaml
    patchedDependencies:
      foo: patches/foo-1.patch
      foo@^2.0.0: patches/foo-2.patch
      foo@2.1.0: patches/foo-3.patch
    ```

    The above configuration would apply `patches/foo-3.patch` to `foo@2.1.0`, `patches/foo-2.patch` to all `foo` versions which satisfy `^2.0.0` except `2.1.0`, and `patches/foo-1.patch` to the remaining `foo` versions.

    > \[!WARNING]
    > The version ranges should not overlap. If you want to specialize a sub range, make sure to exclude it from the other keys. For example:
    >
    > ```yaml
    > # pnpm-workspace.yaml
    > patchedDependencies:
    >   # the specialized sub range
    >   'foo@2.2.0-2.8.0': patches/foo.2.2.0-2.8.0.patch
    >   # the more general patch, excluding the sub range above
    >   'foo@>=2.0.0 <2.2.0 || >2.8.0': 'patches/foo.gte2.patch
    > ```
    >
    > In most cases, however, it's sufficient to just define an exact version to override the range.

*   `pnpm config set --location=project` saves the setting to a `pnpm-workspace.yaml` file if no `.npmrc` file is present in the directory [#9316](https://github.com/pnpm/pnpm/pull/9316).

*   Rename `pnpm.allowNonAppliedPatches` to `pnpm.allowUnusedPatches`. The old name is still supported but it would print a deprecation warning message.

*   Add `pnpm.ignorePatchFailures` to manage whether pnpm would ignore patch application failures.

    If `ignorePatchFailures` is not set, pnpm would throw an error when patches with exact versions or version ranges fail to apply, and it would ignore failures from name-only patches.

    If `ignorePatchFailures` is explicitly set to `false`, pnpm would throw an error when any type of patch fails to apply.

    If `ignorePatchFailures` is explicitly set to `true`, pnpm would print a warning when any type of patch fails to apply.

## Patch Changes

*   Remove dependency paths from audit output to prevent out-of-memory errors [#9280](https://github.com/pnpm/pnpm/issues/9280).


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 10.6.5 (2025-03-19)

## Patch Changes

*   Remove warnings after having explicitly approved no builds [#9296](https://github.com/pnpm/pnpm/issues/9296).
*   When installing different dependency packages, should retain the `ignoredBuilds` field in the `.modules.yaml` file [#9240](https://github.com/pnpm/pnpm/issues/9240).
*   Fix usages of the [`catalog:` protocol](https://pnpm.io/catalogs) in [injected local workspace packages](https://pnpm.io/package_json#dependenciesmetainjected). This previously errored with `ERR_PNPM_SPEC_NOT_SUPPORTED_BY_ANY_RESOLVER`. [#8715](https://github.com/pnpm/pnpm/issues/8715)
*   Setting `workspace-concurrency` to less than or equal to 0 should work [#9297](https://github.com/pnpm/pnpm/issues/9297).


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 10.6.4 (2025-03-17)

## Patch Changes

*   Fix `pnpm dlx` with `--allow-build` flag [#9263](https://github.com/pnpm/pnpm/issues/9263).
*   Invalid Node.js version in `use-node-version` should not cause pnpm itself to break [#9276](https://github.com/pnpm/pnpm/issues/9276).
*   The max amount of workers running for linking packages from the store has been reduced to 4 to achieve optimal results [#9286](https://github.com/pnpm/pnpm/issues/9286). The workers are performing many file system operations, so increasing the number of CPUs doesn't help performance after some point.


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 10.6.3 (2025-03-13)

## Patch Changes

*   `pnpm install --prod=false` should not crash, when executed in a project with a `pnpm-workspace.yaml` file [#9233](https://github.com/pnpm/pnpm/issues/9233). This fixes regression introduced via [#9211](https://github.com/pnpm/pnpm/pull/9211).
*   Add the missing `node-options` config to `recursive run` [#9180](https://github.com/pnpm/pnpm/issues/9180).
*   Removed a branching code path that only executed when `dedupe-peer-dependents=false`. We believe this internal refactor will not result in behavior changes, but we expect it to make future pnpm versions behave more consistently for projects that override `dedupe-peer-dependents` to false. There should be less unique bugs from turning off `dedupe-peer-dependents`.

    See details in [#9259](https://github.com/pnpm/pnpm/pull/9259).


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 10.6.2 (2025-03-10)

## Patch Changes

*   `pnpm self-update` should always update the version in the `packageManager` field of `package.json`.
*   Fix running pnpm CLI from pnpm CLI on Windows when the CLI is bundled to an executable [#8971](https://github.com/pnpm/pnpm/issues/8971).
*   `pnpm patch-commit` will now use the same filesystem as the store directory to compare and create patch files.
*   Don't show info output when `--loglevel=error` is used.
*   `peerDependencyRules` should be set in `pnpm-workspace.yaml` to take effect.


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 9.15.9 (2025-03-10)

## Patch Changes

*   Fix running pnpm CLI from pnpm CLI on Windows when the CLI is bundled to an executable [#8971](https://github.com/pnpm/pnpm/issues/8971).


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 9.15.8 (2025-03-09)

## Patch Changes

*   `pnpm self-update` should always update the version in the `packageManager` field of `package.json`.
*   The pnpm CLI process should not stay hanging, when `--silent` reporting is used.
*   When `--loglevel` is set to `error`, don't show installation summary, execution time, and big tarball download progress.
*   Don't show info output when `--loglevel=error` is used.


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 10.6.1 (2025-03-07)

## Patch Changes

*   The pnpm CLI process should not stay hanging, when `--silent` reporting is used.
*   When `--loglevel` is set to `error`, don't show installation summary, execution time, and big tarball download progress.
*   Don't ignore pnpm.patchedDependencies from `package.json` [#9226](https://github.com/pnpm/pnpm/issues/9226).
*   When executing the `approve-builds` command, if package.json contains `onlyBuiltDependencies` or `ignoredBuiltDependencies`, the selected dependency package will continue to be written into `package.json`.
*   When a package version cannot be found in the package metadata, print the registry from which the package was fetched.


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 10.6 (2025-03-06)

## Minor Changes

*   `pnpm-workspace.yaml` can now hold all the settings that `.npmrc` accepts. The settings should use camelCase [#9211](https://github.com/pnpm/pnpm/pull/9211).

    `pnpm-workspace.yaml` example:

    ```yaml
    verifyDepsBeforeRun: install
    optimisticRepeatInstall: true
    publicHoistPattern:
      - "*types*"
      - "!@types/react"
    ```

*   Projects using a `file:` dependency on a local tarball file (i.e. `.tgz`, `.tar.gz`, `.tar`) will see a performance improvement during installation. Previously, using a `file:` dependency on a tarball caused the lockfile resolution step to always run. The lockfile will now be considered up-to-date if the tarball is unchanged.

## Patch Changes

*   `pnpm self-update` should not leave a directory with a broken pnpm installation if the installation fails.
*   `fast-glob` replace with `tinyglobby` to reduce the size of the pnpm CLI dependencies [#9169](https://github.com/pnpm/pnpm/pull/9169).
*   `pnpm deploy` should not remove fields from the deployed package's `package.json` file [#9215](https://github.com/pnpm/pnpm/issues/9215).
*   `pnpm self-update` should not read the pnpm settings from the `package.json` file in the current working directory.
*   Fix `pnpm deploy` creating a `package.json` without the `imports` and `license` field [#9193](https://github.com/pnpm/pnpm/issues/9193).
*   `pnpm update -i` should list only packages that have newer versions [#9206](https://github.com/pnpm/pnpm/issues/9206).
*   Fix a bug causing entries in the `catalogs` section of the `pnpm-lock.yaml` file to be removed when `dedupe-peer-dependents=false` on a filtered install. [#9112](https://github.com/pnpm/pnpm/issues/9112)


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 9.15.7 (2025-03-06)

## Patch Changes

*   `pnpm self-update` should not leave a directory with a broken pnpm installation if the installation fails.
*   Allow scope registry CLI option without `--config.` prefix such as `--@scope:registry=https://scope.example.com/npm` [#9089](https://github.com/pnpm/pnpm/pull/9089).
*   `pnpm self-update` should not read the pnpm settings from the `package.json` file in the current working directory.
*   `pnpm update -i` should list only packages that have newer versions [#9206](https://github.com/pnpm/pnpm/issues/9206).
*   Fix a bug causing entries in the `catalogs` section of the `pnpm-lock.yaml` file to be removed when `dedupe-peer-dependents=false` on a filtered install. [#9112](https://github.com/pnpm/pnpm/issues/9112)


## Platinum Sponsors

Bit Bit Syntax
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap Stackblitz

pnpm 10.5.2 (2025-02-27)

## Patch Changes

*   The `pnpm config set` command should change the global `.npmrc` file by default.
    This was a regression introduced by [#9151](https://github.com/pnpm/pnpm/pull/9151) and shipped in pnpm v10.5.0.


## Platinum Sponsors

Bit Bit
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap

pnpm 10.5.1 (2025-02-26)

## Patch Changes

*   Throw an error message if a `pnpm-workspaces.yaml` or `pnpm-workspaces.yml` file is found instead of a `pnpm-workspace.yaml` [#9170](https://github.com/pnpm/pnpm/issues/9170).
*   Fix the update of `pnpm-workspace.yaml` by the `pnpm approve-builds` command [#9168](https://github.com/pnpm/pnpm/issues/9168).
*   Normalize generated link paths in `package.json` [#9163](https://github.com/pnpm/pnpm/pull/9163)
*   Specifying `overrides` in `pnpm-workspace.yaml` should work.
*   `pnpm dlx` should ignore settings from the `package.json` file in the current working directory [#9178](https://github.com/pnpm/pnpm/issues/9178).


## Platinum Sponsors

Bit Bit
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap

pnpm 10.5 (2025-02-25)

## Minor Changes

* The `pnpm.*` settings from `package.json` can now be specified in the `pnpm-workspace.yaml` file instead [#9121](https://github.com/pnpm/pnpm/pull/9121).

  `package.json`:
  ```json
  {
    "pnpm": {
      "onlyBuiltDependencies": ["esbuild", "fuse-native"]
    }
  }
  ```
  `pnpm-workspace.yaml`:
  ```yaml
  onlyBuiltDependencies:
  - esbuild
  - fuse-native
  ```

*   Added support for automatically syncing files of injected workspace packages after `pnpm run` [#9081](https://github.com/pnpm/pnpm/issues/9081). Use the `sync-injected-deps-after-scripts` setting to specify which scripts build the workspace package. This tells pnpm when syncing is needed. The setting should be defined in a `.npmrc` file at the root of the workspace. Example:

    ```ini
    sync-injected-deps-after-scripts[]=compile
    ```

*   The `packages` field in `pnpm-workspace.yaml` became optional.

## Patch Changes

*   `pnpm link` with no parameters should work as if `--global` is specified [#9151](https://github.com/pnpm/pnpm/pull/9151).
*   Allow scope registry CLI option without `--config.` prefix such as `--@scope:registry=https://scope.example.com/npm` [#9089](https://github.com/pnpm/pnpm/pull/9089).
*   `pnpm link ` should calculate relative path from the root of the workspace directory [#9132](https://github.com/pnpm/pnpm/pull/9132).
*   Fix a bug causing catalog snapshots to be removed from the `pnpm-lock.yaml` file when using `--fix-lockfile` and `--filter`. [#8639](https://github.com/pnpm/pnpm/issues/8639)
*   Fix a bug causing catalog protocol dependencies to not re-resolve on a filtered install [#8638](https://github.com/pnpm/pnpm/issues/8638).


## Platinum Sponsors

Bit Bit
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap

pnpm 9.15.6 (2025-02-24)

## Patch Changes

*   Fix instruction for updating pnpm with corepack [#9101](https://github.com/pnpm/pnpm/pull/9101).
*   Print pnpm's version after the execution time at the end of the console output.
*   The pnpm version specified by `packageManager` cannot start with `v`.
*   Fix a bug causing catalog snapshots to be removed from the `pnpm-lock.yaml` file when using `--fix-lockfile` and `--filter`. [#8639](https://github.com/pnpm/pnpm/issues/8639)
*   Fix a bug causing catalog protocol dependencies to not re-resolve on a filtered install [#8638](https://github.com/pnpm/pnpm/issues/8638).

pnpm 10.4.1 (2025-02-16)

## Patch Changes

*   Throws an error when the value provided by the `--allow-build` option overlaps with the `pnpm.ignoredBuildDependencies` list [#9105](https://github.com/pnpm/pnpm/pull/9105).
*   Print pnpm's version after the execution time at the end of the console output.
*   Print warning about ignored builds of dependencies on repeat install [#9106](https://github.com/pnpm/pnpm/issues/9106).
*   Setting `init-package-manager` should work.


## Platinum Sponsors

Bit Bit
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap

pnpm 10.4 (2025-02-14)

See [breaking changes in v10](https://github.com/pnpm/pnpm/releases/tag/v10.0.0)

## Minor Changes

*   `pnpm approve-builds --global` works now for allowing dependencies of globally installed packages to run postinstall scripts.

*   The `pnpm add` command now supports a new flag, `--allow-build`, which allows building the specified dependencies. For instance, if you want to install a package called `bundle` that has `esbuild` as a dependency and want to allow `esbuild` to run postinstall scripts, you can run:

        pnpm --allow-build=esbuild add bundle

    This will run `esbuild`'s postinstall script and also add it to the `pnpm.onlyBuiltDependencies` field of `package.json`. So, `esbuild` will always be allowed to run its scripts in the future.

    Related PR: [#9086](https://github.com/pnpm/pnpm/pull/9086).

## Patch Changes

*   `pnpm approve-builds` should work after two consecutive `pnpm install` runs [#9083](https://github.com/pnpm/pnpm/pull/9083).
*   Fix instruction for updating pnpm with corepack [#9101](https://github.com/pnpm/pnpm/pull/9101).
*   The pnpm version specified by `packageManager` cannot start with `v`.


## Platinum Sponsors

Bit Bit
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap

pnpm 10.3 (2025-02-10)

See [breaking changes in v10](https://github.com/pnpm/pnpm/releases/tag/v10.0.0)

##  Minor Changes

*   Added a new setting called `strict-dep-builds`. When enabled, the installation will exit with a non-zero exit code if any dependencies have unreviewed build scripts (aka postinstall scripts) [#9071](https://github.com/pnpm/pnpm/pull/9071).

## Patch Changes

*   Fix a false negative of `verify-deps-before-run` after `pnpm install --production|--no-optional` [#9019](https://github.com/pnpm/pnpm/issues/9019).
*   Print the warning about blocked installation scripts at the end of the installation output and make it more prominent.


## Platinum Sponsors

Bit Bit
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap

pnpm 10.2.1 (2025-02-06)

## Patch Changes

*   Don't read a package from side-effects cache if it isn't allowed to be built [#9042](https://github.com/pnpm/pnpm/issues/9042).
*   `pnpm approve-builds` should work, when executed from a subdirectory of a workspace [#9042](https://github.com/pnpm/pnpm/issues/9042).
*   `pnpm deploy --legacy` should work without injected dependencies.
*   Add information about how to deploy without "injected dependencies" to the "pnpm deploy" error message.


## Platinum Sponsors

Bit Bit
## Gold Sponsors
Discord u|screen
JetBrains Nx
CodeRabbit Route4Me
Workleap

pnpm 10.2 (2025-02-03)

See [breaking changes in v10](https://github.com/pnpm/pnpm/releases/tag/v10.0.0)

## Minor Changes

*   Packages executed via `pnpm dlx` and `pnpm create` are allowed to be built (run postinstall scripts) by default.

    If the packages executed by `dlx` or `create` have dependencies that have to be built, they should be listed via the `--allow-build` flag. For instance, if you want to run a package called `bundle` that has `esbuild` in dependencies and want to allow `esbuild` to run postinstall scripts, run:

        pnpm --allow-build=esbuild dlx bundle

    Related PR: [#9026](https://github.com/pnpm/pnpm/pull/9026).

## Patch Changes

*   Quote args for scripts with shell-quote to support new lines (on POSIX only) [#8980](https://github.com/pnpm/pnpm/issues/8980).
*   Fix a bug in which `pnpm deploy` fails to read the correct `projectId` when the deploy source is the same as the workspace directory [#9001](https://github.com/pnpm/pnpm/issues/9001).
*   Proxy settings should be respected, when resolving Git-hosted dependencies [#6530](https://github.com/pnpm/pnpm/issues/6530).
*   Prevent `overrides` from adding invalid version ranges to `peerDependencies` by keeping the `peerDependencies` and overriding them with prod `dependencies` [#8978](https://github.com/pnpm/pnpm/issues/8978).
*   Sort the package names in the "pnpm.onlyBuiltDependencies" list saved by `pnpm approve-builds`.


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me Workleap
Canva

pnpm 9.15.5 (2025-02-02)

## Patch Changes

*   Verify that the package name is valid when executing the publish command.
*   When running `pnpm install`, the `preprepare` and `postprepare` scripts of the project should be executed [#8989](https://github.com/pnpm/pnpm/pull/8989).
*   Quote args for scripts with shell-quote to support new lines (on POSIX only) [#8980](https://github.com/pnpm/pnpm/issues/8980).
*   Proxy settings should be respected, when resolving Git-hosted dependencies [#6530](https://github.com/pnpm/pnpm/issues/6530).
*   Replace `strip-ansi` with the built-in `util.stripVTControlCharacters` [#9009](https://github.com/pnpm/pnpm/pull/9009).


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me Workleap
Canva

pnpm 10.1 (2025-01-26)

See [breaking changes in v10](https://github.com/pnpm/pnpm/releases/tag/v10.0.0)

## Minor Changes

*   Added a new command for printing the list of dependencies with ignored build scripts: `pnpm ignored-builds` [#8963](https://github.com/pnpm/pnpm/pull/8963).
*   Added a new command for approving dependencies for running scripts during installation: `pnpm approve-builds` [#8963](https://github.com/pnpm/pnpm/pull/8963).
*   Added a new setting called `optimistic-repeat-install`. When enabled, a fast check will be performed before proceeding to installation. This way a repeat install or an install on a project with everything up-to-date becomes a lot faster. But some edge cases might arise, so we keep it disabled by default for now [#8977](https://github.com/pnpm/pnpm/pull/8977).
*   Added a new field "pnpm.ignoredBuiltDependencies" for explicitly listing packages that should not be built. When a package is in the list, pnpm will not print an info message about that package not being built [#8935](https://github.com/pnpm/pnpm/issues/8935).

## Patch Changes

*   Verify that the package name is valid when executing the publish command.
*   When running `pnpm install`, the `preprepare` and `postprepare` scripts of the project should be executed [#8989](https://github.com/pnpm/pnpm/pull/8989).
*   Allow `workspace:` and `catalog:` to be part of wider version range in `peerDependencies`.
*   `pnpm deploy` should inherit the `pnpm` object from the root `package.json` [#8991](https://github.com/pnpm/pnpm/pull/8991).
*   Make sure that the deletion of a `node_modules` in a sub-project of a monorepo is detected as out-of-date [#8959](https://github.com/pnpm/pnpm/issues/8959).
*   Fix infinite loop caused by lifecycle scripts using `pnpm` to execute other scripts during `pnpm install` with `verify-deps-before-run=install` [#8954](https://github.com/pnpm/pnpm/issues/8954).
*   Replace `strip-ansi` with the built-in `util.stripVTControlCharacters` [#9009](https://github.com/pnpm/pnpm/pull/9009).
*   Do not print patched dependencies as ignored dependencies that require a build [#8952](https://github.com/pnpm/pnpm/issues/8952).


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me Workleap
Canva

pnpm 9.15.4 (2025-01-13)

## Patch Changes

*   Ensure that recursive `pnpm update --latest ` updates only the specified package, with `dedupe-peer-dependents=true`.


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me Workleap
Canva

pnpm 10 (2025-01-07)

## Major Changes

*   Lifecycle scripts of dependencies are not executed during installation by default! This is a breaking change aimed at increasing security. In order to allow lifecycle scripts of specific dependencies, they should be listed in the `pnpm.onlyBuiltDependencies` field of `package.json` [#8897](https://github.com/pnpm/pnpm/pull/8897). For example:

    ```json
    {
      "pnpm": {
        "onlyBuiltDependencies": ["fsevents"]
      }
    }
    ```

    Read [pnpm 10.0.0 Blocks Lifecycle Scripts by Default](https://socket.dev/blog/pnpm-10-0-0-blocks-lifecycle-scripts-by-default) to learn about the motivation of the change.

    If you want the old pre v10 behaviour, so you want to allow all dependencies to run postinstall scripts, then add this to your `package.json`:

    ```json
    {
      "pnpm": {
        "neverBuiltDependencies": []
      }
    }
    ```

*   `pnpm link` behavior updated:

    The `pnpm link` command now adds overrides to the root `package.json`.

    *   In a workspace: The override is added to the root of the workspace, linking the dependency to all projects in the workspace.
    *   Global linking: To link a package globally, run `pnpm link` from the package’s directory. Previously, you needed to use `pnpm link -g`.
        Related PR: [#8653](https://github.com/pnpm/pnpm/pull/8653)

*   Secure hashing with SHA256:

    Various hashing algorithms have been updated to SHA256 for enhanced security and consistency:

    *   Long paths inside `node_modules/.pnpm` are now hashed with SHA256.
    *   Long peer dependency hashes in the lockfile now use SHA256 instead of MD5. (This affects very few users since these are only used for long keys.)
    *   The hash stored in the `packageExtensionsChecksum` field of `pnpm-lock.yaml` is now SHA256.
    *   The side effects cache keys now use SHA256.
    *   The pnpmfile checksum in the lockfile now uses SHA256 ([#8530](https://github.com/pnpm/pnpm/pull/8530)).

*   Configuration updates:

    *   `manage-package-manager-versions`: enabled by default. pnpm now manages its own version based on the `packageManager` field in `package.json` by default.

    *   `public-hoist-pattern`: nothing is hoisted by default. Packages containing `eslint` or `prettier` in their name are no longer hoisted to the root of `node_modules`. Related Issue: [#8378](https://github.com/pnpm/pnpm/issues/8378)

    *   Upgraded `@yarnpkg/extensions` to v2.0.3. This may alter your lockfile.

    *   `virtual-store-dir-max-length`: the default value on Windows has been reduced to 60 characters.

    *   Reduced environment variables for scripts:
        During script execution, fewer `npm_package_*` environment variables are set. Only `name`, `version`, `bin`, `engines`, and `config` remain.
        Related Issue: [#8552](https://github.com/pnpm/pnpm/issues/8552)

    *   All dependencies are now installed even if `NODE_ENV=production`. Related Issue: [#8827](https://github.com/pnpm/pnpm/issues/8827)

*   Changes to the global store:

    *   Store version bumped to v10.

    *   Some registries allow identical content to be published under different package names or versions. To accommodate this, index files in the store are now stored using both the content hash and package identifier.

        This approach ensures that we can:

        1.  Validate that the integrity in the lockfile corresponds to the correct package, which might not be the case after a poorly resolved Git conflict.
        2.  Allow the same content to be referenced by different packages or different versions of the same package.
            Related PR: [#8510](https://github.com/pnpm/pnpm/pull/8510)
            Related Issue: [#8204](https://github.com/pnpm/pnpm/issues/8204)

    *   More efficient side effects indexing. The structure of index files in the store has changed. Side effects are now tracked more efficiently by listing only file differences rather than all files.
        Related PR: [#8636](https://github.com/pnpm/pnpm/pull/8636)

    *   A new `index` directory stores package content mappings. Previously, these files were in `files`.

*   Other breaking changes:
    *   The `#` character is now escaped in directory names within `node_modules/.pnpm`.
        Related PR: [#8557](https://github.com/pnpm/pnpm/pull/8557)
    *   Running `pnpm add --global pnpm` or `pnpm add --global @pnpm/exe` now fails with an error message, directing you to use `pnpm self-update` instead.
        Related PR: [#8728](https://github.com/pnpm/pnpm/pull/8728)
    *   Dependencies added via a URL now record the final resolved URL in the lockfile, ensuring that any redirects are fully captured.
        Related Issue: [#8833](https://github.com/pnpm/pnpm/issues/8833)
    *   The `pnpm deploy` command now only works in workspaces that have `inject-workspace-packages=true`. This limitation is introduced to allow us to create a proper lockfile for the deployed project using the workspace lockfile.
    *   Removed conversion from lockfile v6 to v9. If you need v6-to-v9 conversion, use pnpm CLI v9.
    *   `pnpm test` now passes all parameters after the `test` keyword directly to the underlying script. This matches the behavior of `pnpm run test`. Previously you needed to use the `--` prefix.
        Related PR: [#8619](https://github.com/pnpm/pnpm/pull/8619)

*   `node-gyp` updated to version 11.

*   `pnpm deploy` now tries creating a dedicated lockfile from a shared lockfile for deployment. It will fallback to deployment without a lockfile if there is no shared lockfile or `force-legacy-deploy` is set to `true`.

## Minor Changes

*   Added support for a new type of dependencies called "configurational dependencies". These dependencies are installed before all the other types of dependencies (before "dependencies", "devDependencies", "optionalDependencies").

    Configurational dependencies cannot have dependencies of their own or lifecycle scripts. They should be added using exact version and the integrity checksum. Example:

    ```json
    {
      "pnpm": {
        "configDependencies": {
          "my-configs": "1.0.0+sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="
        }
      }
    }
    ```

    Related RFC: [#8](https://github.com/pnpm/rfcs/pull/8).
    Related PR: [#8915](https://github.com/pnpm/pnpm/pull/8915).

*   New settings:

    *   New `verify-deps-before-run` setting. This setting controls how `pnpm` checks `node_modules` before running scripts:

        *   `install`: Automatically run `pnpm install` if `node_modules` is outdated.
        *   `warn`: Print a warning if `node_modules` is outdated.
        *   `prompt`: Prompt the user to confirm running `pnpm install` if `node_modules` is outdated.
        *   `error`: Throw an error if `node_modules` is outdated.
        *   `false`: Disable dependency checks.
            Related Issue: [#8585](https://github.com/pnpm/pnpm/issues/8585)

    *   New `inject-workspace-packages` setting enables hard-linking all local workspace dependencies instead of symlinking them. Previously, this could be achieved using [`dependenciesMeta[].injected`](https://pnpm.io/package_json#dependenciesmetainjected), which remains supported.
        Related PR: [#8836](https://github.com/pnpm/pnpm/pull/8836)

*   Faster repeat installs:

    On repeated installs, `pnpm` performs a quick check to ensure `node_modules` is up to date.
    Related PR: [#8838](https://github.com/pnpm/pnpm/pull/8838)

*   `pnpm add` integrates with default workspace catalog:

    When adding a dependency, `pnpm add` checks the default workspace catalog. If the dependency and version requirement match the catalog, `pnpm add` uses the `catalog:` protocol. Without a specified version, it matches the catalog’s version. If it doesn’t match, it falls back to standard behavior.
    Related Issue: [#8640](https://github.com/pnpm/pnpm/issues/8640)

*   `pnpm dlx` now resolves packages to their exact versions and uses these exact versions for cache keys. This ensures `pnpm dlx` always installs the latest requested packages.
    Related PR: [#8811](https://github.com/pnpm/pnpm/pull/8811)

*   No `node_modules` validation on certain commands. Commands that should not modify `node_modules` (e.g., `pnpm install --lockfile-only`) no longer validate or purge `node_modules`.
    Related PR: [#8657](https://github.com/pnpm/pnpm/pull/8657)


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me Workleap
Canva

pnpm 10.0 RC 3 (2025-01-05)

## Major Changes

*   Lifecycle scripts of dependencies are not executed during installation by default! This is a breaking change aimed at increasing security. In order to allow lifecycle scripts of specific dependencies, they should be listed in the `pnpm.onlyBuiltDependencies` field of `package.json` [#8897](https://github.com/pnpm/pnpm/pull/8897). For example:

    ```json
    {
      "pnpm": {
        "onlyBuiltDependencies": ["fsevents"]
      }
    }
    ```

*   `pnpm link` behavior updated:

    The `pnpm link` command now adds overrides to the root `package.json`.

    *   In a workspace: The override is added to the root of the workspace, linking the dependency to all projects in the workspace.
    *   Global linking: To link a package globally, run `pnpm link` from the package’s directory. Previously, you needed to use `pnpm link -g`.
        Related PR: [#8653](https://github.com/pnpm/pnpm/pull/8653)

*   Secure hashing with SHA256:

    Various hashing algorithms have been updated to SHA256 for enhanced security and consistency:

    *   Long paths inside `node_modules/.pnpm` are now hashed with SHA256.
    *   Long peer dependency hashes in the lockfile now use SHA256 instead of MD5. (This affects very few users since these are only used for long keys.)
    *   The hash stored in the `packageExtensionsChecksum` field of `pnpm-lock.yaml` is now SHA256.
    *   The side effects cache keys now use SHA256.
    *   The pnpmfile checksum in the lockfile now uses SHA256 ([#8530](https://github.com/pnpm/pnpm/pull/8530)).

*   Configuration updates:

    *   `manage-package-manager-versions`: enabled by default. pnpm now manages its own version based on the `packageManager` field in `package.json` by default.

    *   `public-hoist-pattern`: nothing is hoisted by default. Packages containing `eslint` or `prettier` in their name are no longer hoisted to the root of `node_modules`. Related Issue: [#8378](https://github.com/pnpm/pnpm/issues/8378)

    *   Upgraded `@yarnpkg/extensions` to v2.0.3. This may alter your lockfile.

    *   `virtual-store-dir-max-length`: the default value on Windows has been reduced to 60 characters.

    *   Reduced environment variables for scripts:
        During script execution, fewer `npm_package_*` environment variables are set. Only `name`, `version`, `bin`, `engines`, and `config` remain.
        Related Issue: [#8552](https://github.com/pnpm/pnpm/issues/8552)

    *   All dependencies are now installed even if `NODE_ENV=production`. Related Issue: [#8827](https://github.com/pnpm/pnpm/issues/8827)

*   Changes to the global store:

    *   Store version bumped to v10.

    *   Some registries allow identical content to be published under different package names or versions. To accommodate this, index files in the store are now stored using both the content hash and package identifier.

        This approach ensures that we can:

        1.  Validate that the integrity in the lockfile corresponds to the correct package, which might not be the case after a poorly resolved Git conflict.
        2.  Allow the same content to be referenced by different packages or different versions of the same package.
            Related PR: [#8510](https://github.com/pnpm/pnpm/pull/8510)
            Related Issue: [#8204](https://github.com/pnpm/pnpm/issues/8204)

    *   More efficient side effects indexing. The structure of index files in the store has changed. Side effects are now tracked more efficiently by listing only file differences rather than all files.
        Related PR: [#8636](https://github.com/pnpm/pnpm/pull/8636)

    *   A new `index` directory stores package content mappings. Previously, these files were in `files`.

*   Other breaking changes:
    *   The `#` character is now escaped in directory names within `node_modules/.pnpm`.
        Related PR: [#8557](https://github.com/pnpm/pnpm/pull/8557)
    *   Running `pnpm add --global pnpm` or `pnpm add --global @pnpm/exe` now fails with an error message, directing you to use `pnpm self-update` instead.
        Related PR: [#8728](https://github.com/pnpm/pnpm/pull/8728)
    *   Dependencies added via a URL now record the final resolved URL in the lockfile, ensuring that any redirects are fully captured.
        Related Issue: [#8833](https://github.com/pnpm/pnpm/issues/8833)
    *   The `pnpm deploy` command now only works in workspaces that have `inject-workspace-packages=true`. This limitation is introduced to allow us to create a proper lockfile for the deployed project using the workspace lockfile.
    *   Removed conversion from lockfile v6 to v9. If you need v6-to-v9 conversion, use pnpm CLI v9.
    *   `pnpm test` now passes all parameters after the `test` keyword directly to the underlying script. This matches the behavior of `pnpm run test`. Previously you needed to use the `--` prefix.
        Related PR: [#8619](https://github.com/pnpm/pnpm/pull/8619)

*   `node-gyp` updated to version 11.

*   `pnpm deploy` now tries creating a dedicated lockfile from a shared lockfile for deployment. It will fallback to deployment without a lockfile if there is no shared lockfile or `force-legacy-deploy` is set to `true`.

## Minor Changes

*   Added support for a new type of dependencies called "configurational dependencies". These dependencies are installed before all the other types of dependencies (before "dependencies", "devDependencies", "optionalDependencies").

    Configurational dependencies cannot have dependencies of their own or lifecycle scripts. They should be added using exact version and the integrity checksum. Example:

    ```json
    {
      "pnpm": {
        "configDependencies": {
          "my-configs": "1.0.0+sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="
        }
      }
    }
    ```

    Related RFC: [#8](https://github.com/pnpm/rfcs/pull/8).
    Related PR: [#8915](https://github.com/pnpm/pnpm/pull/8915).

*   New settings:

    *   New `verify-deps-before-run` setting. This setting controls how `pnpm` checks `node_modules` before running scripts:

        *   `install`: Automatically run `pnpm install` if `node_modules` is outdated.
        *   `warn`: Print a warning if `node_modules` is outdated.
        *   `prompt`: Prompt the user to confirm running `pnpm install` if `node_modules` is outdated.
        *   `error`: Throw an error if `node_modules` is outdated.
        *   `false`: Disable dependency checks.
            Related Issue: [#8585](https://github.com/pnpm/pnpm/issues/8585)

    *   New `inject-workspace-packages` setting enables hard-linking all local workspace dependencies instead of symlinking them. Previously, this could be achieved using [`dependenciesMeta[].injected`](https://pnpm.io/package_json#dependenciesmetainjected), which remains supported.
        Related PR: [#8836](https://github.com/pnpm/pnpm/pull/8836)

*   Faster repeat installs:

    On repeated installs, `pnpm` performs a quick check to ensure `node_modules` is up to date.
    Related PR: [#8838](https://github.com/pnpm/pnpm/pull/8838)

*   `pnpm add` integrates with default workspace catalog:

    When adding a dependency, `pnpm add` checks the default workspace catalog. If the dependency and version requirement match the catalog, `pnpm add` uses the `catalog:` protocol. Without a specified version, it matches the catalog’s version. If it doesn’t match, it falls back to standard behavior.
    Related Issue: [#8640](https://github.com/pnpm/pnpm/issues/8640)

*   `pnpm dlx` now resolves packages to their exact versions and uses these exact versions for cache keys. This ensures `pnpm dlx` always installs the latest requested packages.
    Related PR: [#8811](https://github.com/pnpm/pnpm/pull/8811)

*   No `node_modules` validation on certain commands. Commands that should not modify `node_modules` (e.g., `pnpm install --lockfile-only`) no longer validate or purge `node_modules`.
    Related PR: [#8657](https://github.com/pnpm/pnpm/pull/8657)


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me Workleap
Canva

pnpm 9.15.3 (2025-01-05)

## Patch Changes

*   Fixed the Regex used to find the package manifest during packing [#8938](https://github.com/pnpm/pnpm/pull/8938).
*   `pnpm update --filter  --latest ` should only change the specified package for the specified workspace, when `dedupe-peer-dependents` is set to `true` [#8877](https://github.com/pnpm/pnpm/issues/8877).
*   Exclude `.DS_Store` file at `patch-commit` [#8922](https://github.com/pnpm/pnpm/issues/8922).
*   Fix a bug in which `pnpm patch` is unable to bring back old patch without specifying `@version` suffix [#8919](https://github.com/pnpm/pnpm/issues/8919).


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me Workleap
Canva

pnpm 10.0 RC 2 (2024-12-29)

## Major Changes

*   Lifecycle scripts of dependencies are not executed during installation by default! This is a breaking change aimed at increasing security. In order to allow lifecycle scripts of specific dependencies, they should be listed in the `pnpm.onlyBuiltDependencies` field of `package.json` [#8897](https://github.com/pnpm/pnpm/pull/8897). For example:

    ```json
    {
      "pnpm": {
        "onlyBuiltDependencies": ["fsevents"]
      }
    }
    ```

*   `pnpm link` behavior updated:

    The `pnpm link` command now adds overrides to the root `package.json`.

    *   In a workspace: The override is added to the root of the workspace, linking the dependency to all projects in the workspace.
    *   Global linking: To link a package globally, run `pnpm link` from the package’s directory. Previously, you needed to use `pnpm link -g`.
        Related PR: [#8653](https://github.com/pnpm/pnpm/pull/8653)

*   Secure hashing with SHA256:

    Various hashing algorithms have been updated to SHA256 for enhanced security and consistency:

    *   Long paths inside `node_modules/.pnpm` are now hashed with SHA256.
    *   Long peer dependency hashes in the lockfile now use SHA256 instead of MD5. (This affects very few users since these are only used for long keys.)
    *   The hash stored in the `packageExtensionsChecksum` field of `pnpm-lock.yaml` is now SHA256.
    *   The side effects cache keys now use SHA256.
    *   The pnpmfile checksum in the lockfile now uses SHA256 ([#8530](https://github.com/pnpm/pnpm/pull/8530)).

*   Configuration updates:

    *   `manage-package-manager-versions`: enabled by default. pnpm now manages its own version based on the `packageManager` field in `package.json` by default.

    *   `public-hoist-pattern`: nothing is hoisted by default. Packages containing `eslint` or `prettier` in their name are no longer hoisted to the root of `node_modules`. Related Issue: [#8378](https://github.com/pnpm/pnpm/issues/8378)

    *   Upgraded `@yarnpkg/extensions` to v2.0.3. This may alter your lockfile.

    *   `virtual-store-dir-max-length`: the default value on Windows has been reduced to 60 characters.

    *   Reduced environment variables for scripts:
        During script execution, fewer `npm_package_*` environment variables are set. Only `name`, `version`, `bin`, `engines`, and `config` remain.
        Related Issue: [#8552](https://github.com/pnpm/pnpm/issues/8552)

    *   All dependencies are now installed even if `NODE_ENV=production`. Related Issue: [#8827](https://github.com/pnpm/pnpm/issues/8827)

*   Changes to the global store:

    *   Store version bumped to v10.

    *   Some registries allow identical content to be published under different package names or versions. To accommodate this, index files in the store are now stored using both the content hash and package identifier.

        This approach ensures that we can:

        1.  Validate that the integrity in the lockfile corresponds to the correct package, which might not be the case after a poorly resolved Git conflict.
        2.  Allow the same content to be referenced by different packages or different versions of the same package.
            Related PR: [#8510](https://github.com/pnpm/pnpm/pull/8510)
            Related Issue: [#8204](https://github.com/pnpm/pnpm/issues/8204)

    *   More efficient side effects indexing. The structure of index files in the store has changed. Side effects are now tracked more efficiently by listing only file differences rather than all files.
        Related PR: [#8636](https://github.com/pnpm/pnpm/pull/8636)

    *   A new `index` directory stores package content mappings. Previously, these files were in `files`.

*   Other breaking changes:
    *   The `#` character is now escaped in directory names within `node_modules/.pnpm`.
        Related PR: [#8557](https://github.com/pnpm/pnpm/pull/8557)
    *   Running `pnpm add --global pnpm` or `pnpm add --global @pnpm/exe` now fails with an error message, directing you to use `pnpm self-update` instead.
        Related PR: [#8728](https://github.com/pnpm/pnpm/pull/8728)
    *   Dependencies added via a URL now record the final resolved URL in the lockfile, ensuring that any redirects are fully captured.
        Related Issue: [#8833](https://github.com/pnpm/pnpm/issues/8833)
    *   The `pnpm deploy` command now only works in workspaces that have `inject-workspace-packages=true`. This limitation is introduced to allow us to create a proper lockfile for the deployed project using the workspace lockfile.
    *   Removed conversion from lockfile v6 to v9. If you need v6-to-v9 conversion, use pnpm CLI v9.
    *   `pnpm test` now passes all parameters after the `test` keyword directly to the underlying script. This matches the behavior of `pnpm run test`. Previously you needed to use the `--` prefix.
        Related PR: [#8619](https://github.com/pnpm/pnpm/pull/8619)

*   `node-gyp` updated to version 11.

*   `pnpm deploy` now tries creating a dedicated lockfile from a shared lockfile for deployment. It will fallback to deployment without a lockfile if there is no shared lockfile or `force-legacy-deploy` is set to `true`.

## Minor Changes

*   New settings:

    *   New `verify-deps-before-run` setting. This setting controls how `pnpm` checks `node_modules` before running scripts:

        *   `install`: Automatically run `pnpm install` if `node_modules` is outdated.
        *   `warn`: Print a warning if `node_modules` is outdated.
        *   `prompt`: Prompt the user to confirm running `pnpm install` if `node_modules` is outdated.
        *   `error`: Throw an error if `node_modules` is outdated.
        *   `false`: Disable dependency checks.
            Related Issue: [#8585](https://github.com/pnpm/pnpm/issues/8585)

    *   New `inject-workspace-packages` setting enables hard-linking all local workspace dependencies instead of symlinking them. Previously, this could be achieved using [`dependenciesMeta[].injected`](https://pnpm.io/package_json#dependenciesmetainjected), which remains supported.
        Related PR: [#8836](https://github.com/pnpm/pnpm/pull/8836)

*   Faster repeat installs:

    On repeated installs, `pnpm` performs a quick check to ensure `node_modules` is up to date.
    Related PR: [#8838](https://github.com/pnpm/pnpm/pull/8838)

*   `pnpm add` integrates with default workspace catalog:

    When adding a dependency, `pnpm add` checks the default workspace catalog. If the dependency and version requirement match the catalog, `pnpm add` uses the `catalog:` protocol. Without a specified version, it matches the catalog’s version. If it doesn’t match, it falls back to standard behavior.
    Related Issue: [#8640](https://github.com/pnpm/pnpm/issues/8640)

*   `pnpm dlx` now resolves packages to their exact versions and uses these exact versions for cache keys. This ensures `pnpm dlx` always installs the latest requested packages.
    Related PR: [#8811](https://github.com/pnpm/pnpm/pull/8811)

*   No `node_modules` validation on certain commands. Commands that should not modify `node_modules` (e.g., `pnpm install --lockfile-only`) no longer validate or purge `node_modules`.
    Related PR: [#8657](https://github.com/pnpm/pnpm/pull/8657)


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me Workleap
Canva

pnpm 10.0 RC 1 (2024-12-27)

## Major Changes

*   Lifecycle scripts of dependencies are not executed during installation by default! This is a breaking change aimed at increasing security. In order to allow lifecycle scripts of specific dependencies, they should be listed in the `pnpm.onlyBuiltDependencies` field of `package.json` [#8897](https://github.com/pnpm/pnpm/pull/8897). For example:

    ```json
    {
      "pnpm": {
        "onlyBuiltDependencies": ["fsevents"]
      }
    }
    ```

*   `pnpm link` behavior updated:

    The `pnpm link` command now adds overrides to the root `package.json`.

    *   In a workspace: The override is added to the root of the workspace, linking the dependency to all projects in the workspace.
    *   Global linking: To link a package globally, run `pnpm link` from the package’s directory. Previously, you needed to use `pnpm link -g`.
        Related PR: [#8653](https://github.com/pnpm/pnpm/pull/8653)

*   Secure hashing with SHA256:

    Various hashing algorithms have been updated to SHA256 for enhanced security and consistency:

    *   Long paths inside `node_modules/.pnpm` are now hashed with SHA256.
    *   Long peer dependency hashes in the lockfile now use SHA256 instead of MD5. (This affects very few users since these are only used for long keys.)
    *   The hash stored in the `packageExtensionsChecksum` field of `pnpm-lock.yaml` is now SHA256.
    *   The side effects cache keys now use SHA256.
    *   The pnpmfile checksum in the lockfile now uses SHA256 ([#8530](https://github.com/pnpm/pnpm/pull/8530)).

*   Configuration updates:

    *   `manage-package-manager-versions`: enabled by default. pnpm now manages its own version based on the `packageManager` field in `package.json` by default.

    *   `public-hoist-pattern`: nothing is hoisted by default. Packages containing `eslint` or `prettier` in their name are no longer hoisted to the root of `node_modules`. Related Issue: [#8378](https://github.com/pnpm/pnpm/issues/8378)

    *   Upgraded `@yarnpkg/extensions` to v2.0.3. This may alter your lockfile.

    *   `virtual-store-dir-max-length`: the default value on Windows has been reduced to 60 characters.

    *   Reduced environment variables for scripts:
        During script execution, fewer `npm_package_*` environment variables are set. Only `name`, `version`, `bin`, `engines`, and `config` remain.
        Related Issue: [#8552](https://github.com/pnpm/pnpm/issues/8552)

    *   All dependencies are now installed even if `NODE_ENV=production`. Related Issue: [#8827](https://github.com/pnpm/pnpm/issues/8827)

*   Changes to the global store:

    *   Store version bumped to v10.

    *   Some registries allow identical content to be published under different package names or versions. To accommodate this, index files in the store are now stored using both the content hash and package identifier.

        This approach ensures that we can:

        1.  Validate that the integrity in the lockfile corresponds to the correct package, which might not be the case after a poorly resolved Git conflict.
        2.  Allow the same content to be referenced by different packages or different versions of the same package.
            Related PR: [#8510](https://github.com/pnpm/pnpm/pull/8510)
            Related Issue: [#8204](https://github.com/pnpm/pnpm/issues/8204)

    *   More efficient side effects indexing. The structure of index files in the store has changed. Side effects are now tracked more efficiently by listing only file differences rather than all files.
        Related PR: [#8636](https://github.com/pnpm/pnpm/pull/8636)

    *   A new `index` directory stores package content mappings. Previously, these files were in `files`.

*   Other breaking changes:
    *   The `#` character is now escaped in directory names within `node_modules/.pnpm`.
        Related PR: [#8557](https://github.com/pnpm/pnpm/pull/8557)
    *   Running `pnpm add --global pnpm` or `pnpm add --global @pnpm/exe` now fails with an error message, directing you to use `pnpm self-update` instead.
        Related PR: [#8728](https://github.com/pnpm/pnpm/pull/8728)
    *   Dependencies added via a URL now record the final resolved URL in the lockfile, ensuring that any redirects are fully captured.
        Related Issue: [#8833](https://github.com/pnpm/pnpm/issues/8833)
    *   The `pnpm deploy` command now only works in workspaces that have `inject-workspace-packages=true`. This limitation is introduced to allow us to create a proper lockfile for the deployed project using the workspace lockfile.
    *   Removed conversion from lockfile v6 to v9. If you need v6-to-v9 conversion, use pnpm CLI v9.
    *   `pnpm test` now passes all parameters after the `test` keyword directly to the underlying script. This matches the behavior of `pnpm run test`. Previously you needed to use the `--` prefix.
        Related PR: [#8619](https://github.com/pnpm/pnpm/pull/8619)

*   `node-gyp` updated to version 11.

## Minor Changes

*   New settings:

    *   New `verify-deps-before-run` setting. This setting controls how `pnpm` checks `node_modules` before running scripts:

        *   `install`: Automatically run `pnpm install` if `node_modules` is outdated.
        *   `warn`: Print a warning if `node_modules` is outdated.
        *   `prompt`: Prompt the user to confirm running `pnpm install` if `node_modules` is outdated.
        *   `error`: Throw an error if `node_modules` is outdated.
        *   `false`: Disable dependency checks.
            Related Issue: [#8585](https://github.com/pnpm/pnpm/issues/8585)

    *   New `inject-workspace-packages` setting enables hard-linking all local workspace dependencies instead of symlinking them. Previously, this could be achieved using [`dependenciesMeta[].injected`](https://pnpm.io/package_json#dependenciesmetainjected), which remains supported.
        Related PR: [#8836](https://github.com/pnpm/pnpm/pull/8836)

*   Faster repeat installs:

    On repeated installs, `pnpm` performs a quick check to ensure `node_modules` is up to date.
    Related PR: [#8838](https://github.com/pnpm/pnpm/pull/8838)

*   `pnpm add` integrates with default workspace catalog:

    When adding a dependency, `pnpm add` checks the default workspace catalog. If the dependency and version requirement match the catalog, `pnpm add` uses the `catalog:` protocol. Without a specified version, it matches the catalog’s version. If it doesn’t match, it falls back to standard behavior.
    Related Issue: [#8640](https://github.com/pnpm/pnpm/issues/8640)

*   `pnpm dlx` now resolves packages to their exact versions and uses these exact versions for cache keys. This ensures `pnpm dlx` always installs the latest requested packages.
    Related PR: [#8811](https://github.com/pnpm/pnpm/pull/8811)

*   No `node_modules` validation on certain commands. Commands that should not modify `node_modules` (e.g., `pnpm install --lockfile-only`) no longer validate or purge `node_modules`.
    Related PR: [#8657](https://github.com/pnpm/pnpm/pull/8657)


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me Workleap
Canva

pnpm 9.15.2 (2024-12-27)

## Patch Changes

*   Fixed `publish`/`pack` error with workspace dependencies with relative paths [#8904](https://github.com/pnpm/pnpm/pull/8904). It was broken in `v9.4.0` ([398472c](https://github.com/pnpm/pnpm/commit/398472c)).
*   Use double quotes in the command suggestion by `pnpm patch` on Windows [#7546](https://github.com/pnpm/pnpm/issues/7546).
*   Do not fall back to SSH, when resolving a git-hosted package if `git ls-remote` works via HTTPS [#8906](https://github.com/pnpm/pnpm/pull/8906).
*   Improve how packages with blocked lifecycle scripts are reported during installation. Always print the list of ignored scripts at the end of the output. Include a hint about how to allow the execution of those packages.


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me Workleap
Canva

pnpm 9.15.1 (2024-12-20)

## Patch Changes

*   `pnpm remove` should not link dependencies from the workspace, when `link-workspace-packages` is set to `false` [#7674](https://github.com/pnpm/pnpm/issues/7674).
*   Installation with hoisted `node_modules` should not fail, when a dependency has itself in its own peer dependencies [#8854](https://github.com/pnpm/pnpm/issues/8854).


## Platinum Sponsors

Bit Bit Figma
## Gold Sponsors
Discord Prisma
u|screen JetBrains
Nx CodeRabbit
Route4Me