Skip to content

feat: version 3 - #15497

Draft
teemingc wants to merge 650 commits into
mainfrom
version-3
Draft

feat: version 3#15497
teemingc wants to merge 650 commits into
mainfrom
version-3

Conversation

@teemingc

@teemingc teemingc commented Mar 5, 2026

Copy link
Copy Markdown
Member

Opened just so that I could easily see CI checks

You can try SvelteKit 3 by installing any of the packages following #15497 (comment) or the ones published with the next tag https://npmx.dev/package/@sveltejs/kit


Please don't delete this checklist! Before submitting the PR, please make sure you do the following:

  • It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs
  • This message body should clearly illustrate what problems it solves.
  • Ideally, include a test that fails without this PR but passes with it.

Tests

  • Run the tests with pnpm test and lint the project with pnpm lint and pnpm check

Changesets

  • If your PR makes a change that should be noted in one or more packages' changelogs, generate a changeset by running pnpm changeset and following the prompts. Changesets that add features should be minor and those that fix bugs should be patch. Please prefix changeset messages with feat:, fix:, or chore:.

Edits

  • Please ensure that 'Allow edits from maintainers' is checked. PRs without this option may be closed.

@changeset-bot

changeset-bot Bot commented Mar 5, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 562ae23

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 8 packages
Name Type
@sveltejs/kit Major
@sveltejs/adapter-netlify Patch
@sveltejs/adapter-node Patch
@sveltejs/adapter-cloudflare Major
@sveltejs/adapter-vercel Patch
@sveltejs/adapter-auto Patch
@sveltejs/adapter-static Patch
@sveltejs/package Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@svelte-docs-bot

Copy link
Copy Markdown

@teemingc teemingc added needs-platform-tests This PR needs to run platform tests in order to merge. needs-ecosystem-ci This PR needs to have an ecosystem CI run started prior to its last commit before merging. breaking change labels Mar 5, 2026
@Rich-Harris

Copy link
Copy Markdown
Member

ok, bringing this up to date with main after #15934 etc is proving to be a bit of a PITA but we're getting there. (Unfortunately it also creates conflicts on #15574 — gah.) Logging off now, will pick it up tomorrow. We are at least able to delete quite a bit of stuff now

Comment thread .changeset/shaggy-walls-wave.md Outdated
Comment thread .changeset/tidy-toes-sort.md Outdated
@Rich-Harris Rich-Harris removed the needs-ecosystem-ci This PR needs to have an ecosystem CI run started prior to its last commit before merging. label Jun 4, 2026
@Rich-Harris

Copy link
Copy Markdown
Member

Finally it looks like we have a clean run and can go back to opening PRs against this branch. Will see how much work is involved in fixing the conflicts on #15574

Comment thread packages/kit/src/utils/url.js Fixed
@pkg-svelte-dev

pkg-svelte-dev Bot commented Jul 1, 2026

Copy link
Copy Markdown

Install the latest version of @sveltejs/kit from 562ae23:

pnpm add https://pkg.svelte.dev/@sveltejs/kit/c/562ae237e887133196b095775428164bb1ba9c8e

Open in pkg.svelte.dev: https://pkg.svelte.dev/repos/kit/pr/15497

Comment thread packages/kit/src/exports/url.js Fixed
@sveltejs sveltejs deleted a comment from netlify Bot Jul 6, 2026
@teemingc teemingc added needs-platform-tests This PR needs to run platform tests in order to merge. and removed needs-platform-tests This PR needs to run platform tests in order to merge. labels Jul 7, 2026
Rich-Harris and others added 10 commits July 19, 2026 16:07
tiny fix which should have been part of #16374 — we don't need to log
responses multiple times. will self-merge once green
There are two special kinds of modules in SvelteKit projects:
server-only modules and remote modules.

- `*.server.ts` is server-only, as is `*.server.*.ts` — any `.server.`
infix works
- `*.remote.ts` is remote, but `*.remote.*.ts` is not

This inconsistency is weird. It's also weird that `server.ts` _isn't_ a
server-only module. Similarly, it's annoying that `remote.ts` isn't
treated as a remote module, as it's not uncommon to have a folder
structure like this...

```bash
src/lib/my/feature
  index.ts # the interface the rest of the app uses
  index.remote.ts # an implementation detail of `my/feature`
```

The `index` part of `index.remote.ts` is there just because you need
_something_, but the name to identify it by is already in the path —
`my/feature`. Forcing people to add junk to the start of the filename
just to satisfy arbitrary internal assumptions is unsportsmanlike.
Simpler to be able to say that if your module includes a 'server'
segment in the filename it's server-only; same for remote modules.

Closes #16318 

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:
- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [x] Ideally, include a test that fails without this PR but passes with
it.

### Tests
- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets
- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.

---------

Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: Tee Ming Chew <chewteeming01@gmail.com>
this just yoinks the filter out of the handler, so that rolldown needs
to run less javascript

---------

Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: Tee Ming Chew <chewteeming01@gmail.com>
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to version-3, this PR
will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`version-3` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `version-3`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @sveltejs/kit@3.0.0-next.11

### Major Changes

- breaking: `config` exported from a universal route file takes
precedence over a server one
([#16400](#16400))

- breaking: consistent special filename patterns
([#16382](#16382))

### Minor Changes

- feat: support sourcemaps in production
([#16412](#16412))

- feat: support function validators for environment variables
([#16402](#16402))

- feat: better error logging
([#16374](#16374))

### Patch Changes

- fix: don't treat callable standard schemas as function param matchers
([#16403](#16403))

- fix: reject malformed streamed data encoding
([#16423](#16423))

- fix: hide stack traces for internal errors like 404s
([#16411](#16411))

- perf: match only unpaired surrogates when escaping HTML
([#16407](#16407))

- fix: don't report empty environment variables as missing
([#16401](#16401))

- chore: clarify which hooks run during server route resolution
([#16397](#16397))
## @sveltejs/adapter-node@6.0.0-next.5

### Minor Changes

- feat: better error logging
([#16374](#16374))

### Patch Changes

- Updated dependencies
[[`5220191`](5220191),
[`8cb2f7d`](8cb2f7d),
[`b88c7a7`](b88c7a7),
[`a6ea113`](a6ea113),
[`6446f64`](6446f64),
[`58f1789`](58f1789),
[`09774a2`](09774a2),
[`c542fdd`](c542fdd),
[`aedaa27`](aedaa27),
[`428ee1a`](428ee1a),
[`fefb3ae`](fefb3ae)]:
  - @sveltejs/kit@3.0.0-next.11

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
> ℹ️ **Note**
> 
> This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@changesets/changelog-github](https://redirect.github.com/changesets/changesets/tree/main#readme)
([source](https://redirect.github.com/changesets/changesets)) |
[`1.0.0-next.6` →
`1.0.0-next.7`](https://renovatebot.com/diffs/npm/@changesets%2fchangelog-github/1.0.0-next.6/1.0.0-next.7)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@changesets%2fchangelog-github/1.0.0-next.7?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@changesets%2fchangelog-github/1.0.0-next.6/1.0.0-next.7?slim=true)
|
|
[@opentelemetry/sdk-node](https://redirect.github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-sdk-node)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js))
| [`^0.219.0` →
`^0.220.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2fsdk-node/0.219.0/0.220.0)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@opentelemetry%2fsdk-node/0.220.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@opentelemetry%2fsdk-node/0.219.0/0.220.0?slim=true)
|
| [pnpm](https://pnpm.io)
([source](https://redirect.github.com/pnpm/pnpm/tree/HEAD/pnpm11/pnpm))
|
[`11.8.0+sha512.c1f5e7c4cb241c8f174b743851d82f42b802324afc8b0f116b96adb15aa06664948dde36960a3ba1079ba5b4b29dd0140135b94b5b5f5263592249d68e555f26`
→ `11.15.1`](https://renovatebot.com/diffs/npm/pnpm/11.8.0/11.15.1) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pnpm/11.15.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pnpm/11.8.0/11.15.1?slim=true)
|

---

### Release Notes

<details>
<summary>open-telemetry/opentelemetry-js
(@&#8203;opentelemetry/sdk-node)</summary>

###
[`v0.220.0`](https://redirect.github.com/open-telemetry/opentelemetry-js/compare/13a035bc695996cf4aec885fef7b9866f48bc555...40d67b7690a61bd9af0a4e5b5b9f4a14b11fc50e)

[Compare
Source](https://redirect.github.com/open-telemetry/opentelemetry-js/compare/13a035bc695996cf4aec885fef7b9866f48bc555...40d67b7690a61bd9af0a4e5b5b9f4a14b11fc50e)

</details>

<details>
<summary>pnpm/pnpm (pnpm)</summary>

###
[`v11.15.1`](https://redirect.github.com/pnpm/pnpm/compare/v11.15.0...v11.15.1)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.15.0...v11.15.1)

###
[`v11.15.0`](https://redirect.github.com/pnpm/pnpm/releases/tag/v11.15.0):
pnpm 11.15

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.14.0...v11.15.0)

##### Minor Changes

- Optional peer dependencies declared only via `peerDependenciesMeta`
(for example `debug`'s `supports-color` peer) are now resolved from a
satisfying version already present in the dependency graph, the same way
explicitly declared optional peer dependencies are. Previously such
peers were only resolved this way when the package's metadata was read
back from the lockfile, so an unrelated dependency change could rewrite
peer resolutions across the whole lockfile.

##### Patch Changes

- Updated `adm-zip` to prevent crafted ZIP archives from causing
excessive memory allocation.

- `pnpm version -r` no longer writes a versioning-ledger entry with no
consumed intents as a bare `intents:` key, which the next run failed to
read with `ERR_PNPM_INVALID_VERSIONING_LEDGER`. Empty intent lists are
now written as `intents: []`, and the ledger reader accepts the bare
form left by earlier releases.

- Fixed pnpr workspace resolution to preserve project names and versions
for `workspace:` dependencies.

<!-- sponsors -->

#### Platinum Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
<a href="https://bit.cloud/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer"><img
src="https://pnpm.io/img/users/bit.svg" width="80" alt="Bit"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://openai.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/openai_dark.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/openai_light.svg" />
<img src="https://pnpm.io/img/users/openai_dark.svg" width="160"
alt="OpenAI" />
          </picture>
        </a>
      </td>
    </tr>
  </tbody>
</table>

#### Gold Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
<a href="https://sanity.io/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/sanity.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/sanity_light.svg" />
<img src="https://pnpm.io/img/users/sanity.svg" width="120" alt="Sanity"
/>
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://discord.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/discord.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/discord_light.svg" />
<img src="https://pnpm.io/img/users/discord.svg" width="220"
alt="Discord" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://vite.dev/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer"><img
src="https://pnpm.io/img/users/vitejs.svg" width="42" alt="Vite"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://serpapi.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/serpapi_dark.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/serpapi_light.svg" />
<img src="https://pnpm.io/img/users/serpapi_dark.svg" width="160"
alt="SerpApi" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a
href="https://coderabbit.ai/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/coderabbit.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/coderabbit_light.svg" />
<img src="https://pnpm.io/img/users/coderabbit.svg" width="220"
alt="CodeRabbit" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a
href="https://stackblitz.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/stackblitz.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/stackblitz_light.svg" />
<img src="https://pnpm.io/img/users/stackblitz.svg" width="190"
alt="Stackblitz" />
          </picture>
        </a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://workleap.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/workleap.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/workleap_light.svg" />
<img src="https://pnpm.io/img/users/workleap.svg" width="190"
alt="Workleap" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://nx.dev/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/nx.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/nx_light.svg" />
<img src="https://pnpm.io/img/users/nx.svg" width="50" alt="Nx" />
          </picture>
        </a>
      </td>
    </tr>
  </tbody>
</table>

<!-- sponsors end -->

###
[`v11.14.0`](https://redirect.github.com/pnpm/pnpm/releases/tag/v11.14.0):
pnpm 11.14

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.13.1...v11.14.0)

#### Minor Changes

- `peerDependencies` now accept dependency specifiers that carry a
scheme — a named-registry spec (`<registry>:<version>`), an `npm:`
alias, or a `file:`/git/URL spec — instead of rejecting them with
`ERR_PNPM_INVALID_PEER_DEPENDENCY_SPECIFICATION`
[#&#8203;13095](https://redirect.github.com/pnpm/pnpm/issues/13095).
Such a peer is matched against the semver range carried by the specifier
(`work:5.x.x` is checked as `5.x.x`, `npm:bar@^5` as `^5`), or against
`*` when it carries no version, while the original specifier still
selects the package to auto-install. Bare `name@version` values, which
are almost always a mistake, are still rejected.

- Added `pnpm doctor`, which diagnoses the pnpm installation and the
environment it runs in: the versions and install method, whether the
global bin directory is on `PATH`, whether the store and cache are
writable, which link strategies (reflink, hardlink, symlink) the store's
filesystem supports, registry connectivity, and an offline `file:`
install that exercises the resolve/store/link path end to end. Each
check reports how to fix what it finds, and the command exits non-zero
when any check fails.

Use `--offline` to skip the checks that need network access, `--json`
for machine-readable output, and `--benchmark` to time the filesystem
and install checks.

- Added support for executing multiple scripts matching a RegExp passed
to `pnpm run` (e.g., `pnpm run "/^build:.*/"`), running matched scripts
in deterministic lexicographical order. Restored the `--sequential`
(`-s`) CLI option for `pnpm run`, which forces `workspaceConcurrency` to
1 so that matched scripts run sequentially one by one across and within
packages.

#### Patch Changes

- Fixed `pnpm install` failing with `ERR_PNPM_LOCKFILE_IS_SYMLINK` when
`pnpm-lock.yaml` is a symlink, as build sandboxes such as Bazel and Nix
stage it
[#&#8203;13073](https://redirect.github.com/pnpm/pnpm/issues/13073).
Reading a lockfile through a symlink is allowed again, and an install
that leaves the lockfile unchanged no longer rewrites it, so
`--frozen-lockfile` no longer needs to write at all. Writing a *changed*
lockfile through a symlink is still refused, as that would redirect the
write onto the symlink's target.

- Fixed frozen installs incorrectly treating equivalent Git dependency
specifiers as a stale lockfile. See
[#&#8203;13039](https://redirect.github.com/pnpm/pnpm/issues/13039).

- `pnpm owner ls` now reports authentication and authorization failures
(401/403) as dedicated errors that include the registry's response body,
matching `pnpm owner add`/`rm`, instead of a generic `Failed to fetch
owners` message.

- Recover from a metadata cache entry that disappears (concurrent cache
cleanup, antivirus) after the registry has already answered the
conditional request with `304 Not Modified`. The metadata is
re-requested once without cache validators instead of failing the
install with `ERR_PNPM_CACHE_MISSING_AFTER_304`.

- A project pinned to a broken pnpm release via `packageManager` or
`devEngines.packageManager` now reports which release is broken and what
to do about it, instead of failing inside the installer. `pnpm
self-update` already refused these releases; the version switch does
too.

- Prevent broken-lockfile errors from including snippets of the
lockfile's contents.

- `pnpm self-update` now checks that the version it installed can run
before making it the active pnpm. A release that installs but cannot
execute is discarded with an error instead of replacing a working
installation.

- Fixed an out-of-memory regression when workspace projects concurrently
resolve a package with large registry metadata
[pnpm/pnpm#13077](https://redirect.github.com/pnpm/pnpm/issues/13077).

- Fixed `pnpm update` rewriting exact version pins that use the `=`
operator (for example `=3.5.1`) to a caret range (`^3.5.1`). Exact pins
are now preserved and written back as the bare version. See
[#&#8203;12745](https://redirect.github.com/pnpm/pnpm/issues/12745).

<!-- sponsors -->

#### Platinum Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
<a href="https://bit.cloud/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer"><img
src="https://pnpm.io/img/users/bit.svg" width="80" alt="Bit"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://openai.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/openai_dark.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/openai_light.svg" />
<img src="https://pnpm.io/img/users/openai_dark.svg" width="160"
alt="OpenAI" />
          </picture>
        </a>
      </td>
    </tr>
  </tbody>
</table>

#### Gold Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
<a href="https://sanity.io/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/sanity.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/sanity_light.svg" />
<img src="https://pnpm.io/img/users/sanity.svg" width="120" alt="Sanity"
/>
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://discord.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/discord.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/discord_light.svg" />
<img src="https://pnpm.io/img/users/discord.svg" width="220"
alt="Discord" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://vite.dev/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer"><img
src="https://pnpm.io/img/users/vitejs.svg" width="42" alt="Vite"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://serpapi.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/serpapi_dark.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/serpapi_light.svg" />
<img src="https://pnpm.io/img/users/serpapi_dark.svg" width="160"
alt="SerpApi" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a
href="https://coderabbit.ai/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/coderabbit.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/coderabbit_light.svg" />
<img src="https://pnpm.io/img/users/coderabbit.svg" width="220"
alt="CodeRabbit" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a
href="https://stackblitz.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/stackblitz.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/stackblitz_light.svg" />
<img src="https://pnpm.io/img/users/stackblitz.svg" width="190"
alt="Stackblitz" />
          </picture>
        </a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://workleap.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/workleap.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/workleap_light.svg" />
<img src="https://pnpm.io/img/users/workleap.svg" width="190"
alt="Workleap" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://nx.dev/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/nx.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/nx_light.svg" />
<img src="https://pnpm.io/img/users/nx.svg" width="50" alt="Nx" />
          </picture>
        </a>
      </td>
    </tr>
  </tbody>
</table>

<!-- sponsors end -->

###
[`v11.13.1`](https://redirect.github.com/pnpm/pnpm/releases/tag/v11.13.1):
pnpm 11.13.1

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.13.0...v11.13.1)

#### Patch Changes

- Fixed `pnpm pack` applying workspace-root ignore rules when a
workspace package has its own `.npmignore` file.
- Keep the interactive `minimumReleaseAge` approval prompt visible
during `pnpm install`. The progress reporter now pauses its redraws
while a prompt is waiting for input instead of overwriting it, so the
install no longer hangs on a question the user cannot see
[#&#8203;13019](https://redirect.github.com/pnpm/pnpm/issues/13019).
- Fixed `pnpm self-update` failing to link native platform binaries
stored in sibling global virtual store slots.

###
[`v11.13.0`](https://redirect.github.com/pnpm/pnpm/releases/tag/v11.13.0):
pnpm 11.13

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.12.0...v11.13.0)

#### Minor Changes

- Added `versioning.epics` to `pnpm-workspace.yaml`. An epic ties a
group of member packages to a lead package, constraining every member's
major version to a band derived from the lead's major: while the lead is
on major `M`, members live in `M*100 … M*100+99`. Members move
independently inside the band (patch, minor, and a `major` intent that
stays in-band); a bump that would carry a member past the band ceiling
is rejected until the lead advances its own major. When a release plan
takes the lead to a new stable major, every member re-bases to the band
floor in the same plan. Membership is matched with pnpm's package
selectors — name globs, `./`-prefixed directory globs, and `!`-prefixed
negations.

- Added the `team` command for managing organization teams and team
memberships on the registry, with create, destroy, add, rm, and ls
subcommands and support for --otp, --parseable, and --json flags.

- Added native workspace release management
[#&#8203;12952](https://redirect.github.com/pnpm/pnpm/issues/12952): the
new `pnpm change` command records change intents as
changesets-compatible `.changeset/*.md` files (`pnpm change status`
shows the pending release plan), and the bare `pnpm version -r` consumes
them — bumping versions across the workspace with dependent propagation
through `workspace:` ranges, fixed groups, a `maxBump` cap, `--filter`
narrowing, and `--dry-run` — writing changelogs, and recording consumed
intents in a committed ledger that keeps cherry-picks and merge-backs
between release branches safe. Packages can be moved onto per-package
release lanes with the new `pnpm lane <name> --filter <pkg>` command and
back with `pnpm lane main --filter <pkg>` (`pnpm lane` shows the
membership), releasing `X.Y.Z-lane.N` prereleases from the same runs
that release stable versions of the packages on the main lane.
Configuration lives under the new `versioning` key of
`pnpm-workspace.yaml` (`fixed`, `ignore`, `maxBump`, `lanes`,
`changelog`). When two workspace projects publish the same name, intent
files, `versioning.lanes`, and `versioning.fixed`/`ignore` may reference
a project by its workspace-relative directory path (e.g.
`"./pnpm/npm/pnpm"`) — the one additive extension to the changesets
format, applied automatically by `pnpm change`.

Release changelogs default to `registry` storage
(`versioning.changelog.storage`): no `CHANGELOG.md` is committed. Each
release's section is composed at publish time and packed into the
published tarball on top of the previously published version's
changelog, and the consumed change intents are garbage-collected by a
later `pnpm version -r` only once the registry confirms the version is
published with its section. Set `versioning.changelog.storage:
repository` to keep committed `CHANGELOG.md` files instead.

- Added a new override selector form with an empty range — `"pkg@":
"<version>"` — called a convergence override. It rewrites a dependency
edge only when its exact version satisfies the edge's declared range, so
compatible consumers converge on one version while incompatible
consumers keep their own resolution — now and for any dependent added in
the future
[#&#8203;12794](https://redirect.github.com/pnpm/pnpm/issues/12794).

  ```yaml
  overrides:
    "form-data@": 4.0.6
  ```

The value must be an exact version. When a full resolution detects that
every declared range also admits a newer version, pnpm warns that the
override is stale and names the version to converge on. Previously an
empty range in an override selector was undocumented and behaved like a
bare (unscoped) override.

#### Patch Changes

- A `tokenHelper` set in the global pnpm `auth.ini` is no longer
rejected as project-level configuration. The guard that blocks
`tokenHelper` from a project `.npmrc` only treated `~/.npmrc` as a
trusted source, so a helper written to `auth.ini` (for example by `pnpm
config set`) failed on every command and could not even be removed with
`pnpm config delete`. A `tokenHelper` in a workspace or project `.npmrc`
is still rejected.

- `pnpm cache delete` now removes a package's metadata from every
metadata cache directory (`metadata`, `metadata-full`, and
`metadata-full-filtered`), instead of only the one the current
resolution mode reads. Previously a package cached under a different
mode (e.g. `metadata-full-filtered`) was left behind. Closes
[#&#8203;12753](https://redirect.github.com/pnpm/pnpm/issues/12753).

- Fixed an injected workspace dependency (`injectWorkspacePackages:
true`) incorrectly staying as `file:` instead of deduping back to
`link:` when an unrelated, ordinary shared dependency resolved to a
peer-suffixed variant for the target project's own copy but not for the
injected occurrence. See
[#&#8203;10433](https://redirect.github.com/pnpm/pnpm/issues/10433).

- `pnpm deploy` now supports workspaces that use catalogs.

- Fixed `pnpm deploy` with a shared lockfile so local `file:` tarball
dependencies keep their package name in the generated deploy lockfile.
This prevents warm-store deploys from failing with
`ERR_PNPM_UNEXPECTED_PKG_CONTENT_IN_STORE` when the tarball filename
includes the version.

- Options that follow `create`, `exec`, or `test` appearing as a
subcommand of another command are now parsed instead of being silently
treated as positional parameters. For example, `pnpm team create
@&#8203;org:team --registry <url>` previously ignored the `--registry`
option and sent the request to the default registry.

- `pnpm add -g`, `pnpm update -g`, `pnpm setup`, and the self-updater no
longer fail with `ERR_PNPM_MISSING_TIME` when `trustPolicy:
no-downgrade` or `resolutionMode: time-based` is set in the global
config
[#&#8203;12883](https://redirect.github.com/pnpm/pnpm/issues/12883). The
decision to fetch full registry metadata now lives in one place, and the
`no-downgrade` trust policy always requests full metadata (matching the
self-updater), since the trust evidence it checks is missing from
abbreviated metadata even on registries that include the `time` field.

- `pnpm list` and `pnpm why` no longer crash with `EMFILE: too many open
files` when a project has a large number of unsaved dependencies
(packages present in `node_modules` but not in the lockfile). The reads
of those packages are now concurrency-limited.

- The published `pnpm` package no longer declares `dependencies` or
`devDependencies`. Because the CLI bundles its runtime dependencies into
`dist/node_modules`, those fields are dropped when packing, so `npm
install` of the tarball no longer tries to resolve internal-only
packages such as `@pnpm/test-ipc-server`. Closes
[#&#8203;12955](https://redirect.github.com/pnpm/pnpm/issues/12955).

- Fixed `pnpm publish --otp` and `pnpm publish --batch --otp` to send
the configured OTP to the registry.

- `pnpm publish` again sends the package's README to the registry as
metadata, so registries can render it on the package page. The readme is
always included in the published metadata (matching the npm CLI), while
the `embed-readme` setting continues to control only whether the readme
is written into the `package.json` inside the tarball. This restores the
behavior that was lost when publishing became fully native. Closes
[#&#8203;12966](https://redirect.github.com/pnpm/pnpm/issues/12966).

- Fixed the dependency status check wrongly reporting "up to date" when
a `package.json`, `.pnpmfile.cjs`, or patch file was edited in the same
second as the previous install, on filesystems that record mtimes at
whole-second resolution (for example ext4 with 128-byte inodes). The
optimistic repeat-install fast path and `verify-deps-before-run`
compared mtimes strictly, so a same-second edit whose mtime rounded down
looked unchanged and re-resolution was skipped. Such a file's whole
second is now treated as possibly-modified, falling through to the
content check; behavior on sub-second filesystems is unchanged.

- Retry package metadata requests when a registry or proxy returns `304
Not Modified` to an unconditional request, preventing false
`ERR_PNPM_CACHE_MISSING_AFTER_304` failures
[pnpm/pnpm#12882](https://redirect.github.com/pnpm/pnpm/issues/12882).

If the retry also returns `304`, report
`ERR_PNPM_META_NOT_MODIFIED_WITHOUT_CACHE` instead.

- Fixed `pnpm update` removing transitive lockfile entries when
`dedupePeerDependents` is disabled and the selected package is absent
[pnpm/pnpm#12456](https://redirect.github.com/pnpm/pnpm/issues/12456).

- Limit modern deploy lockfiles and localized virtual stores to
dependencies reachable from the selected dependency groups.

- A `tokenHelper` command is now given a 60-second time limit. A helper
that hangs (deadlock, stuck I/O) is killed and reported as an error
instead of leaving the command waiting forever.

- Fixed orphaned child processes on Windows when pnpm exits on an error
while commands spawned by `pnpm exec` or `pnpm dlx` are still running
(for example, when one project's command fails during `pnpm --recursive
exec`). The PIDs of these commands are now recorded when they are
spawned and their whole process trees are terminated with `taskkill` on
an error exit. Previously the cleanup relied on enumerating the system
process list, which is so slow on Windows that the enumeration hit its
timeout and the cleanup was silently skipped
[#&#8203;12406](https://redirect.github.com/pnpm/pnpm/issues/12406).

- `pnpm pack` now respects workspace-root `.npmignore` and `.gitignore`
files when packing workspace packages.

<!-- sponsors -->

#### Platinum Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
<a href="https://bit.cloud/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer"><img
src="https://pnpm.io/img/users/bit.svg" width="80" alt="Bit"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://openai.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/openai_dark.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/openai_light.svg" />
<img src="https://pnpm.io/img/users/openai_dark.svg" width="160"
alt="OpenAI" />
          </picture>
        </a>
      </td>
    </tr>
  </tbody>
</table>

#### Gold Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
<a href="https://sanity.io/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/sanity.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/sanity_light.svg" />
<img src="https://pnpm.io/img/users/sanity.svg" width="120" alt="Sanity"
/>
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://discord.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/discord.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/discord_light.svg" />
<img src="https://pnpm.io/img/users/discord.svg" width="220"
alt="Discord" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://vite.dev/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer"><img
src="https://pnpm.io/img/users/vitejs.svg" width="42" alt="Vite"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://serpapi.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/serpapi_dark.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/serpapi_light.svg" />
<img src="https://pnpm.io/img/users/serpapi_dark.svg" width="160"
alt="SerpApi" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a
href="https://coderabbit.ai/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/coderabbit.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/coderabbit_light.svg" />
<img src="https://pnpm.io/img/users/coderabbit.svg" width="220"
alt="CodeRabbit" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a
href="https://stackblitz.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/stackblitz.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/stackblitz_light.svg" />
<img src="https://pnpm.io/img/users/stackblitz.svg" width="190"
alt="Stackblitz" />
          </picture>
        </a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://workleap.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/workleap.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/workleap_light.svg" />
<img src="https://pnpm.io/img/users/workleap.svg" width="190"
alt="Workleap" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://nx.dev/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/nx.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/nx_light.svg" />
<img src="https://pnpm.io/img/users/nx.svg" width="50" alt="Nx" />
          </picture>
        </a>
      </td>
    </tr>
  </tbody>
</table>

<!-- sponsors end -->

###
[`v11.12.0`](https://redirect.github.com/pnpm/pnpm/releases/tag/v11.12.0):
pnpm 11.12

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.11.0...v11.12.0)

#### Minor Changes

- [`a897ef7`](https://redirect.github.com/pnpm/pnpm/commit/a897ef7):
Custom fetchers exported from a pnpmfile can now delegate by returning a
`{ delegate: <resolution> }` envelope: pnpm rewrites the package's
resolution to the delegated shape and runs the built-in fetcher on it.
This is the portable delegation form that also works in pacquet, where
`cafs` and `fetchers` cannot be passed to the hook. Related to
[pnpm/pnpm#11685](https://redirect.github.com/pnpm/pnpm/issues/11685).

#### Patch Changes

- [`2b02764`](https://redirect.github.com/pnpm/pnpm/commit/2b02764): The
changed-packages filter (`--filter "...[<since>]"`) no longer allows an
option-like `<since>` value (such as `--output=<path>`) to be
interpreted as a git option — git now rejects it as a bad revision. The
repository root is also resolved to the nearest `.git` entry, so the
filter works in a git worktree checked out inside another repository's
tree.

- [`43711ce`](https://redirect.github.com/pnpm/pnpm/commit/43711ce):
`pnpm outdated` no longer checks the registry for dependencies that are
resolved from local `link:`, `file:`, or `workspace:` references in the
lockfile
[#&#8203;12827](https://redirect.github.com/pnpm/pnpm/issues/12827).

- [`3c6718b`](https://redirect.github.com/pnpm/pnpm/commit/3c6718b):
Fixed a deadlock in peer dependency resolution: `pnpm install` hung
forever when a peer dependency cycle spanned a project's own
dependencies and auto-installed peer providers, for example when
installing `electron-builder@26.15.3`
[#&#8203;12921](https://redirect.github.com/pnpm/pnpm/issues/12921).

- [`252f15e`](https://redirect.github.com/pnpm/pnpm/commit/252f15e):
Fixed peer dependency auto-install picking a version the peer range
rejects. In a workspace with several projects, a package declaring a
peer dependency with a semver range (for example `^1.0.0`) could get the
highest version found anywhere in the workspace (for example a `2.0.0`
resolved for another project) instead of a version that satisfies the
range. Peers are now deduplicated onto the highest preferred version
that satisfies the declared range, and when none does, the range is
resolved from the registry.

Also fixed re-resolving with an existing lockfile hoisting a different
peer version than a fresh install of the same manifest: root
dependencies reused from the lockfile were invisible to peer hoisting,
so a peer that a root dependency provides could be bound to another
version.

- [`a38adda`](https://redirect.github.com/pnpm/pnpm/commit/a38adda):
`pnpm self-update <version>` now installs the requested pnpm version
when it matches the currently running version but is missing from the
global self-update directory.

- [`6a85968`](https://redirect.github.com/pnpm/pnpm/commit/6a85968):
`pnpm stage list` now stops paginating after a fail-safe cap of 1000
pages, so a misbehaving registry cannot keep the command looping
forever.

- [`eee7c9a`](https://redirect.github.com/pnpm/pnpm/commit/eee7c9a):
`verify-deps-before-run` no longer spawns a `pnpm install` when pnpm is
executed in a directory that has no `package.json`. A mistyped command
run outside a project (for example `pnpm witch 10 login`) used to crash
with a confusing error from the spawned install; now it fails with the
regular "no package.json found" error.

<!-- sponsors -->

#### Platinum Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
<a href="https://bit.cloud/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer"><img
src="https://pnpm.io/img/users/bit.svg" width="80" alt="Bit"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://openai.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/openai_dark.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/openai_light.svg" />
<img src="https://pnpm.io/img/users/openai_dark.svg" width="160"
alt="OpenAI" />
          </picture>
        </a>
      </td>
    </tr>
  </tbody>
</table>

#### Gold Sponsors

<table>
  <tbody>
    <tr>
      <td align="center" valign="middle">
<a href="https://sanity.io/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/sanity.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/sanity_light.svg" />
<img src="https://pnpm.io/img/users/sanity.svg" width="120" alt="Sanity"
/>
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://discord.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/discord.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/discord_light.svg" />
<img src="https://pnpm.io/img/users/discord.svg" width="220"
alt="Discord" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://vite.dev/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer"><img
src="https://pnpm.io/img/users/vitejs.svg" width="42" alt="Vite"></a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://serpapi.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/serpapi_dark.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/serpapi_light.svg" />
<img src="https://pnpm.io/img/users/serpapi_dark.svg" width="160"
alt="SerpApi" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a
href="https://coderabbit.ai/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/coderabbit.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/coderabbit_light.svg" />
<img src="https://pnpm.io/img/users/coderabbit.svg" width="220"
alt="CodeRabbit" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a
href="https://stackblitz.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/stackblitz.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/stackblitz_light.svg" />
<img src="https://pnpm.io/img/users/stackblitz.svg" width="190"
alt="Stackblitz" />
          </picture>
        </a>
      </td>
    </tr>
    <tr>
      <td align="center" valign="middle">
<a href="https://workleap.com/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/workleap.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/workleap_light.svg" />
<img src="https://pnpm.io/img/users/workleap.svg" width="190"
alt="Workleap" />
          </picture>
        </a>
      </td>
      <td align="center" valign="middle">
<a href="https://nx.dev/?utm_source=pnpm&utm_medium=release_notes"
target="_blank" rel="noopener noreferrer">
          <picture>
<source media="(prefers-color-scheme: light)"
srcset="https://pnpm.io/img/users/nx.svg" />
<source media="(prefers-color-scheme: dark)"
srcset="https://pnpm.io/img/users/nx_light.svg" />
<img src="https://pnpm.io/img/users/nx.svg" width="50" alt="Nx" />
          </picture>
        </a>
      </td>
    </tr>
  </tbody>
</table>

<!-- sponsors end -->

###
[`v11.11.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm11/pnpm/CHANGELOG.md#11110)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.10.0...v11.11.0)

##### Minor Changes

- [`508b8c2`](https://redirect.github.com/pnpm/pnpm/commit/508b8c2):
Added the `pnpm access` command for managing package access and
visibility on the registry, supporting listing packages and
collaborators, getting and setting package status and MFA requirements,
and granting or revoking team access.

##### Patch Changes

- [`c70e33e`](https://redirect.github.com/pnpm/pnpm/commit/c70e33e):
Allow `allowBuilds` entries for git-hosted packages to match by
repository URL without pinning the resolved commit hash. This lets
trusted git repositories keep running their build scripts after branch
updates without approving each new commit, while package-name-only rules
still do not approve git-hosted artifacts.
- [`3067e4f`](https://redirect.github.com/pnpm/pnpm/commit/3067e4f):
Reduced peak memory usage during cold-cache dependency resolution. The
metadata fetch is memoized for the whole resolution phase, and it was
retaining each package's raw registry response body (used only to mirror
the response to disk) for that entire time. The memoized cache now holds
a body-less copy, so the raw body only lives as long as the call that
writes the disk mirror. On large graphs that fetch full metadata (e.g.
with `minimumReleaseAge` or `trustPolicy` enabled) this cuts peak RSS by
roughly 30%, back in line with pnpm 10. The resolved lockfile is
unchanged.
- [`51300fd`](https://redirect.github.com/pnpm/pnpm/commit/51300fd):
Prevent a crafted `pnpm-lock.yaml` from writing package content outside
the virtual store. A dependency path key whose name reconstructs to a
path-traversal sequence (e.g. `../../../tmp/x@1.0.0`) is now rejected by
the isolated (virtual-store) linker and the Plug'n'Play resolver map,
matching the containment already applied to the hoisted linker. Under
the global virtual store, a traversal in the version-derived path
segment (e.g. a snapshot `version: "../../x"`) is now rejected at
`formatGlobalVirtualStorePath`, the single point every
global-virtual-store slot path funnels through — closing the same escape
in the isolated linker, the resolver's dependency-graph builder, and the
config-dependency installer.
- [`f8058eb`](https://redirect.github.com/pnpm/pnpm/commit/f8058eb):
Reject symlinked `pnpm-lock.yaml` files when reading or writing the env
lockfile document.
- [`9318a11`](https://redirect.github.com/pnpm/pnpm/commit/9318a11):
Allow `registries` and `namedRegistries` to be configured in the global
`config.yaml` file.
- [`51300fd`](https://redirect.github.com/pnpm/pnpm/commit/51300fd):
Fixed a path traversal vulnerability where a dependency whose manifest
`name` was a scoped path traversal (e.g. `@x/../../../<path>`) could be
written outside `node_modules` to an attacker-controlled location during
`pnpm install`, even with `--ignore-scripts`. The isolated linker now
validates the package name before using it as a directory name, matching
the existing protection in the hoisted linker.
- [`14332f0`](https://redirect.github.com/pnpm/pnpm/commit/14332f0):
Fail instead of silently removing an optional dependency's locked
entries from `pnpm-lock.yaml` when the registry cannot resolve it.
Previously, when registry metadata lacked a version that the lockfile
already pinned (for example, a mirror that had not synced a recent
release yet), `pnpm install` and `pnpm dedupe` silently dropped the
optional dependency's entries — emptying maps such as the platform
binaries of `@napi-rs/canvas` — so the lockfile differed between
machines and frozen installs on other hosts had nothing to link
[#&#8203;12853](https://redirect.github.com/pnpm/pnpm/issues/12853).
- [`fecfe83`](https://redirect.github.com/pnpm/pnpm/commit/fecfe83):
Fixed peer dependency resolution with `autoInstallPeers` when a
workspace package depends on a version of a package that a transitive
dependency's self-contained closure also provides for itself. The peer
providers that are attached to the root project for reuse are no longer
peer-resolved a second time in the root context, so packages inside such
a closure no longer get their peers bound to the root project's
incompatible version
[#&#8203;4993](https://redirect.github.com/pnpm/pnpm/issues/4993).
- [`5a4daec`](https://redirect.github.com/pnpm/pnpm/commit/5a4daec):
`${...}` environment-variable placeholders in the `httpProxy`,
`httpsProxy`, `noProxy`, `proxy`, and `noproxy` settings are no longer
expanded when these settings come from a project's
`pnpm-workspace.yaml`. They now receive the same protection already
applied to `registry`, `namedRegistries`, and `pnprServer`.
- [`d1da02e`](https://redirect.github.com/pnpm/pnpm/commit/d1da02e):
`pnpm publish` no longer prints credentials when the target registry is
configured with inline `user:pass@` credentials (e.g.
`registry=https://user:pass@example.com/`). They are now redacted both
from the "publishing to registry" line and from the OIDC (trusted
publishing) failure messages.
- [`dcfc611`](https://redirect.github.com/pnpm/pnpm/commit/dcfc611):
`pnpm self-update` now honors `trustPolicy=no-downgrade`. It resolves
the target pnpm version against full registry metadata, so it refuses to
switch to a version whose supply-chain trust evidence is weaker than an
earlier-published one, the same way a regular install does.
- [`a8ad82d`](https://redirect.github.com/pnpm/pnpm/commit/a8ad82d):
Register the `pn` alias in generated shell completion scripts.
- [`25bd5c3`](https://redirect.github.com/pnpm/pnpm/commit/25bd5c3):
Fixed standalone installer downgrades from pnpm v12 to v11.
- [`23996e9`](https://redirect.github.com/pnpm/pnpm/commit/23996e9):
`pnpm runtime set <name> <version>` now validates its arguments: the
name must be `node`, `deno`, or `bun`, and the version must not contain
a comma. Previously these were interpolated straight into a `pnpm add`
selector, where an unsupported name or a comma (e.g. `node
22,is-positive`) could be misread as a list of packages or a local
directory and install unintended packages or bins.

###
[`v11.10.0`](https://redirect.github.com/pnpm/pnpm/blob/HEAD/pnpm11/pnpm/CHANGELOG.md#11100)

[Compare
Source](https://redirect.github.com/pnpm/pnpm/compare/v11.9.0...v11.10.0)

##### Minor Changes

- [`e2e3c81`](https://redirect.github.com/pnpm/pnpm/commit/e2e3c81):
Added the `issues` command as an alias of `bugs`, so `pnpm issues` opens
the package's bug tracker URL in the browser.

- [`8491f8e`](https://redirect.github.com/pnpm/pnpm/commit/8491f8e):
Added the `prefix` command which prints the current package prefix
directory (or global prefix directory if `-g` / `--global` is used).

- [`3425e80`](https://redirect.github.com/pnpm/pnpm/commit/3425e80):
Added an `_auth` setting for configuring registry authentication as a
single structured (URL-keyed) value. It can be set in the **global**
pnpm config (`config.yaml`) or, for CI, via the `pnpm_config__auth`
environment variable. The env form sidesteps the GitHub Actions / bash /
zsh limitation that broke the existing
`pnpm_config_//host/:_authToken=…` form (env var names containing `/`,
`:`, or `.` are silently dropped). Closes
[#&#8203;12314](https://redirect.github.com/pnpm/pnpm/issues/12314).

The value is keyed by registry URL so each secret is explicitly bound to
the host that may receive it. Registry URL keys must use `http` or
`https` and must not include credentials, query strings, or fragments:

  ```sh
export
pnpm_config__auth='{"https://registry.npmjs.org":{"@&#8203;":{"authToken":"npm-token"},"@&#8203;org":{"authToken":"org-token"}}}'
  ```

  The equivalent in the global `config.yaml`:

  ```yaml
  _auth:
    https://registry.npmjs.org:
      "@&#8203;":
        authToken: npm-token
      "@&#8203;org":
        authToken: org-token
  ```

Within each registry URL, `@` means registry-wide/default credentials
and package scopes like `@org` bind credentials to that scope on the
same host. The only supported credential field is `authToken` (maps to
`_authToken` / bearer auth); the deprecated `basicAuth` / `username` +
`password` forms are intentionally not accepted here.

Each entry also infers a trusted registry route: `@` routes the default
registry (and `pnpm add <pkg>` resolves there), and `@org` routes that
scope. Because the credential and destination host arrive in one trusted
value, repo-controlled `pnpm-workspace.yaml` or project `.npmrc` cannot
redirect the token to a different host. `_auth` is honored **only** from
the env var and the global config — it is ignored in a project
`pnpm-workspace.yaml` / `.npmrc`, so repo-controlled config can never
supply registry auth. Precedence: CLI flags (`--registry`,
`--@&#8203;scope:registry`) > `pnpm_config__auth` > global `config.yaml`
`_auth` > `pnpm-workspace.yaml`.

Both `pnpm_config__auth` (lowercase, documented form) and
`PNPM_CONFIG__AUTH` (all-caps, the shell convention some CI runners
apply) are honored. If both are set, lowercase wins unless it is empty,
in which case uppercase is used. The env var wins over the global
`config.yaml` `_auth` on a conflicting key. `tokenHelper` is not
supported in `_auth`. Parsing is strict: a malformed value (bad JSON,
wrong shape, invalid registry URL or scope, an unsupported credential
field) fails fast with an error rather than being silently dropped.

**Pacquet parity note:** the pacquet (Rust) port supports the same
single credential field as the TS CLI: `authToken`.

- [`a33eeec`](https://redirect.github.com/pnpm/pnpm/commit/a33eeec):
`pnpm self-update` and `packageManager` version-switching can now
install and link pnpm v12 (the Rust port), published with equal content
under both the `pnpm` and `@pnpm/exe` names on the `next-12` dist-tag.
Its native binaries ship as `@pnpm/exe.<platform>-<arch>` packages,
which pnpm's built-in installer links directly — no Node.js launcher, so
the command pays no Node startup cost. v12 is initialized exactly like
`@pnpm/exe`, including per-platform global-virtual-store hashing. From
v12 onward the install converges on the unscoped `pnpm` package (the
Rust exe) — even when updating from the SEA `@pnpm/exe` build.

- [`1dd12bd`](https://redirect.github.com/pnpm/pnpm/commit/1dd12bd):
When resolving through a pnpr install-accelerator server, pnpm no longer
forwards its own upstream registry credentials in the resolve request.
Only the `Authorization` header identifying the caller to pnpr is sent.
The pnpr server now selects upstream credentials from its own route
policy (operator-configured upstream credential aliases), so private
dependencies resolve through a pnpr-managed alias the caller is
authorized to use, rather than by sending the client's registry tokens
to the server.

- [`1e81761`](https://redirect.github.com/pnpm/pnpm/commit/1e81761):
Expose web authentication `authUrl` and `doneUrl` in JSON error output
when OTP is required in a non-interactive terminal
[#&#8203;12724](https://redirect.github.com/pnpm/pnpm/issues/12724).

##### Patch Changes

- [`2f389d6`](https://redirect.github.com/pnpm/pnpm/commit/2f389d6):
Added the Node.js release team's new signing key (Stewart X Addison,
`655F3B5C1FB3FA8D1A0CA6BDE4A7D232B936D2FD`) to the embedded Node.js
release keys, so runtimes whose `SHASUMS256.txt` is signed by the new
releaser verify successfully.

- [`acbdb94`](https://redirect.github.com/pnpm/pnpm/commit/acbdb94):
Fixed shell tab completion not suggesting workspaces after the `-F`
alias for `--filter` option.

- [`dcabb78`](https://redirect.github.com/pnpm/pnpm/commit/dcabb78):
Fixed `pnpm up -r <pkg>` bumping unrelated packages that have open
semver ranges. Previously, any update mutation nullified the
lockfile-derived `preferredVersions` globally, so packages with `^x.y.z`
ranges could re-resolve to newer compatible versions even though the
user only asked to update a specific package. The install layer now
always seeds `preferredVersions` from the lockfile, and caller-supplied
preferred versions (such as the vulnerability penalties of `pnpm audit
--fix`) layer on top of the seed instead of replacing it. The targeted
package still bumps: the per-resolve `updateRequested` flag makes the
resolver ignore the target's own lockfile pins.

Closes
[#&#8203;10662](https://redirect.github.com/pnpm/pnpm/issues/10662).

- [`d539172`](https://redirect.github.com/pnpm/pnpm/commit/d539172):
Fixed pnpm pack and pnpm publish failing when prepack generates files
that are included in the package and postpack cleans them up.

- [`be6505a`](https://redirect.github.com/pnpm/pnpm/commit/be6505a):
Hardened global package management:

- On Windows, removing or updating a global package now also cleans up
the `node.exe` flavor of a bin, so a stale `node.exe` no longer survives
on `PATH` after uninstall, and a new global install no longer silently
overwrites an existing `node.exe`.
- `pnpm add -g pnpm@<version>` (and `@pnpm/exe@<version>`) is now
rejected like the bare `pnpm` form, pointing to `pnpm self-update`.
- Dependency aliases read from a global package's manifest are validated
before being joined onto `node_modules` paths, preventing a tampered
manifest from escaping the install directory.
- Each global install group is created in its own freshly-made directory
(no longer reusing a colliding or pre-existing path).
- Removing or updating a global package no longer unlinks a bin that
belongs to a different globally installed package.

- [`25c7388`](https://redirect.github.com/pnpm/pnpm/commit/25c7388):
pnpm now rejects `jsr:` specifiers whose package name is not a valid npm
package name — an empty scope or name (e.g. `jsr:@&#8203;scope/`), path
separators inside the name, or any other shape
`validate-npm-package-name` rejects — with
`ERR_PNPM_INVALID_JSR_PACKAGE_NAME` instead of silently converting them
into a malformed `@jsr/...` npm package name.

- [`25c7388`](https://redirect.github.com/pnpm/pnpm/commit/25c7388):
pnpm now rejects named-registry specifiers (e.g. `gh:`) whose package
name is not a valid npm package name — an empty scope (e.g.
`gh:@&#8203;/bar`), path separators inside the name (e.g.
`gh:@&#8203;scope/../name`), or any other shape
`validate-npm-package-name` rejects — with
`ERR_PNPM_INVALID_NAMED_REGISTRY_PACKAGE_NAME` instead of passing the
name through to registry URLs and metadata cache file paths.

- [`96da7c5`](https://redirect.github.com/pnpm/pnpm/commit/96da7c5):
node-gyp's `gyp_main.py` and `gyp` entrypoints are now packed with the
executable bit in the `pnpm` and `@pnpm/exe` tarballs. Without it,
building native addons from

> ✂ **Note**
> 
> PR body was truncated to here.


</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/sveltejs/kit).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNjUuMSIsInVwZGF0ZWRJblZlciI6IjQzLjI2NS4xIiwidGFyZ2V0QnJhbmNoIjoidmVyc2lvbi0zIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
this was needed in v2, but we no longer use this flag
This PR allows you to do this inside service workers:

```js
import { version } from '$app/env';
```

This is useful for generating verison-scoped caches and suchlike.
Together with #16372 it brings us closer to resolving #16159 — the only
thing we would still need from the `$service-worker` module is a
replacement for `base`, which means getting `$app/paths` to work in a
service worker context.

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:
- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [x] Ideally, include a test that fails without this PR but passes with
it.

### Tests
- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets
- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.

---------

Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
While working on #16372 I had a realisation that we shouldn't prefix
`Asset` and `Pathname` strings with a `/`. It makes no sense — these are
intended to be relative to the base path, and so having them be
root-relative (`/favicon.png` instead of `favicon.png`) is wrong.

This change means `Pathname` is the wrong name, since it wrongly implies
a root-relative `url.pathname`. As well as removing the leading slash
this PR renames `Pathname` to `Path`, and `Asset` to `AssetPath`. (This
allows future us to add a new `Asset` type containing `path: AssetPath`,
and possibly other stuff like `type` and `size`.)

There are practical benefits to removing the leading slash:

- In #16372, we're adding an `$app/manifest` module with `immutable` and
`assets` exports. The latter is an array of objects with a `path`
property — rather than typing it as `string`, we can type it as
`AssetPath`. But if it had a leading slash then it would be unsuitable
for its main purpose, which is for use with `cache.add(path)` inside a
service worker. We can either make it base-path-relative (as this PR
proposes) or root-relative (i.e. `/my-basepath/favicon.png`) which is
inherently less portable.
- Similarly, we can type the `path` elements in the `prerendered` array
as `Path` rather than `string`
- We can more easily distinguish between `resolve(path)` and
`resolve(route_id)`, both type-wise and at runtime. At the moment
they're sort of smushed together awkwardly

I also think that `asset('favicon.png')` is just nicer to look at than
`asset('/favicon.png')` which is either weird or pointless depending on
whether there's a configured `base`.

Anyway: this is all somewhat independent of the `$app/manifest` stuff so
I figured it deserved its own PR.

Closes #16425, by tightening up the type of `AssetPath` (no `string &
{}`).

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:
- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [x] Ideally, include a test that fails without this PR but passes with
it.

### Tests
- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets
- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.

---------

Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: Tee Ming <chewteeming01@gmail.com>
The current types are a bit weird to work with...since it's expecting
something if you have a variable that can be `null` or `undefined` it
will yell at you (even tho it doesn't make sense since `undefined` is
technically an acceptable value).

Furthermore the `(string | {})` trick doesn't make sense here where the
value can be anything (a `number` for example).

There's still one issue that I wasn't fully able to solve yet: for
`checkbox` if you have a `boolean` value TS will complain because
`boolean` is not assignable to `true` and `false` which is what the type
is expecting (actual strict values, not just `boolean`).

Do you have any ideas on how to fix this?

---------

Co-authored-by: Tee Ming Chew <chewteeming01@gmail.com>
Nic-Polumeyv and others added 30 commits August 12, 2026 17:17
closes #16676

---------

Co-authored-by: Tee Ming <chewteeming01@gmail.com>
Uses `pnpm/setup` in accordance with [pnpm v11 docs for GitHub
actions](https://pnpm.io/continuous-integration#github-actions).

`--frozen-lockfile` is automatically added for CI environments:
https://pnpm.io/cli/install#--frozen-lockfile

I am not entirely sure of the performance impact on CI here tbh, so feel
free to close.

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [ ] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [ ] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [ ] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets

- [ ] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.
bumps `svelte2tsx` so we no longer have that type issue of it trying to
import magic-string
We were incorrectly installing `rolldown` as a dev dep, so the import to
`rolldown/filters` and the hook filter helpers weren't available after
installing sveltekit 3.

This PR fixes that by using the rolldown plugin utils dep. Also
optimises some of the filters

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [ ] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [ ] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [ ] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets

- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.
follow-up to #16744 — turns out we need this or `stdout` can buffer
updates for long enough that progress appears stalled.

before:



https://github.com/user-attachments/assets/25019619-5d60-42e8-aa8c-bc051fba64ca

after:



https://github.com/user-attachments/assets/094891d1-4028-4033-8c2e-56ab3dbcf394



---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [ ] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets

- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.

---------

Co-authored-by: Nic Polumeyv <nicolas.polum@outlook.com>
Replaces all instances of the legacy `{@const ...}` syntax with new
`{const ...}`
…s line (#16750)

If app code writes to stdout without a trailing newline during
prerendering on a TTY, the next progress line lands on the same row and
the update after that clears the row:

```
rendering /partial...
rendering /dynamic/foo...   <- app output destroyed
```

The write proxies now track whether the last chunk ended mid-line, and
the progress line starts a fresh row instead:

```
rendering /partial...
IMPORTANT APP OUTPUT (no newline)
rendering /dynamic/foo...
```

surfaced while reviewing #16748
Another piece of #16676. This began as 'we should probably move `Config`
to `@sveltejs/kit/vite` and quickly became 'oh, we can simplify a ton of
stuff that I've been meaning to get round to'.

It requires some corresponding changes on the svelte.dev side, which I
have locally. We should merge this first though so we can cut a release,
and I'll follow up with the changes over there

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [ ] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets

- [ ] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.

---------

Co-authored-by: Nic Polumeyv <nicolas.polum@outlook.com>
…ltejs/kit/remote` (#16764)

Moves the remote function types from `$app/server` to a new
`@sveltejs/kit/remote` module, same shape as `/hooks` and `/env`.
`isValidationError` moves there too, next to `ValidationError`.
Follow-up to #16740.

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [ ] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets

- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.

---------

Co-authored-by: Rich Harris <rich.harris@vercel.com>
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to version-3, this PR
will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`version-3` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `version-3`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @sveltejs/kit@3.0.0-next.21

### Major Changes

- breaking: move remote function types and `isValidationError` to
`@sveltejs/kit/remote`
([#16764](#16764))

- breaking: move `RequestEvent` and `Cookies` to `$app/server`
([#16751](#16751))

### Patch Changes

- fix: correctly implement Vite plugin hook filters
([#16760](#16760))

- fix: yield to allow prerender updates to be visible
([#16748](#16748))

- fix: don't destroy partial-line app output with the prerender progress
line ([#16750](#16750))
## @sveltejs/package@3.0.0-next.7

### Patch Changes

- chore: bump `svelte2tsx` to 0.7.60
([#16745](#16745))

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
For the longest time, we weren't logging stuff in build correctly. If
the user hasn't set the log level explicitly, Vite saves the value as
`undefined`, which should be treated the same as it being set to 'info'
(the default value).

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [ ] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [ ] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [ ] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets

- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Reverts #16751. Moving `RequestEvent` and `Cookies` to `$app/server` was
a reasonable enough idea but it leaves an awkward asymmetry with
`ServerLoadEvent` (which extends `RequestEvent` but remains in
`@sveltejs/kit`) and `LoadEvent` (which extends `NavigationEvent`; both
of these are also in `@sveltejs/kit`).

We _could_ move `ServerLoadEvent` to `$app/server` instead, though then
we would probably need to move `ServerLoad`, and at that point we should
probably also consider moving
`Action`/`Actions`/`ActionFailure`/`AwaitedActions` there too, and if
we're moving stuff that defines exports from route files then it would
probably be weird to leave `PrerenderOption` behind (except that
obviously doesn't belong in `$app/server`).

And if we did that, we should probably move `LoadEvent` and
`NavigationEvent` to... `$app/navigation` presumably? But then we would
also want to move `Load` and `LoadProperties` there and I'm not sure how
I feel about that.

I'm not 100% on any of this. But I think the safest option is _probably_
to move `RequestEvent` and `Cookies` back to the `@sveltejs/kit` dumping
ground.

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [ ] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets

- [ ] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.
this takes advantage of a small change on the `next` branch of
`svelte.dev` — collapses all the Private Types under the header, which
makes the page look a bit less chaotic
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to version-3, this PR
will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`version-3` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `version-3`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @sveltejs/kit@3.0.0-next.22

### Patch Changes

- fix: respect Vite default log level
([#16767](#16767))

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Fixes #16617

The client remote-function runtime is bundled and shipped to browsers
verbatim, but `Promise.withResolvers()` only shipped in Safari 17.4 /
Chrome 119 / Firefox 121. Vite 8's default `build.target` is Safari 16.4
/ Chrome 111, and the API is not polyfilled, so any app using remote
functions throws on Safari 16.4–17.3 (and older Chrome/Firefox).

PR #15510 removed the internal `with_resolvers()` helper in favour of
the native method on the assumption that Node 22 is the floor — which
holds for the server/build-time call sites but not for the client
runtime. This restores a plain executor wrapper and uses it at the four
client call sites only:

-
`packages/kit/src/runtime/client/remote-functions/query/instance.svelte.js`
-
`packages/kit/src/runtime/client/remote-functions/query-live/instance.svelte.js`
(constructor, `#main`, `reconnect`)

Server and build-time call sites keep the native
`Promise.withResolvers()`.

## Test

Added
`packages/kit/src/runtime/client/remote-functions/with-resolvers.svelte.spec.js`,
which stubs `Promise.withResolvers` to `undefined` (simulating a browser
that predates it) and:

- RED (before fix): `Query` returns `undefined` instead of `'value'`;
`LiveQuery` throws `TypeError: Promise.withResolvers is not a function`.
- GREEN (after fix): both pass.

`pnpm -F @sveltejs/kit test:unit` → 58 files / 729 passed, 110 skipped.
`check` and `lint` clean.

### Checklist
- [x] Fixes a real bug with a clear root cause
- [x] Includes a test that fails without this PR but passes with it
- [x] Changeset added (`@sveltejs/kit` patch)

Note: the full Playwright integration suite (`pnpm test:kit`) was not
run in this environment; the relevant surface is covered by the unit
test above.

---------

Co-authored-by: Sskift <Sskift@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Tee Ming <chewteeming01@gmail.com>
Okay I think _this_ is the last part of #16676. We already did this, but
briefly decided _not_ to put types in `$app/server`, even though that
would be more consistent with how we're doing everything else, because
then you might find yourself importing types from `$app/server` into
client-side code. But honestly, that's fine — it's an honest
representation of what's happening.

There _is_ a practical consideration in that these are treated
differently:

```ts
import type { RemoteQuery } from '$app/server';
import { type RemoteQuery } from '$app/server';
```

In the first case the import is removed entirely as far as bundling is
concerned; in the second case it's as though you imported `{}`. But I'm
not too concerned about it:

1. you will almost never need to import these things. it will basically
always be inferred
2. we can guide people towards the right outcome with a combination of
docs and good error messages

This PR also moves `invalid`, `isValidationError` and `ValidationError`
back into `@sveltejs/kit`, since they're closely related to `error` and
`redirect` etc. It also renames some of the remote function types that
for whatever reason ignored the naming conventions when they were
introduced.

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [x] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets

- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.
Fixes a small bug introduced in #16750 — the `moveCursor` and
`clearLine` calls were _themselves_ being intercepted, so `mid_line` was
always true, and we'd just print newline after newline

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [ ] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets

- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to version-3, this PR
will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`version-3` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `version-3`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @sveltejs/kit@3.0.0-next.23

### Patch Changes

- fix: only print prerender progress newline when necessary
([#16766](#16766))

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
closes #9423

With `rewriteRelativeImportExtensions` enabled, `svelte-package` already
emits `.ts` modules as `.js` and rewrites explicit imports. Static
`import.meta.glob` patterns were left pointing at the source extension,
so they no longer matched the packaged files.

This applies the same rewrite to relative static glob patterns,
including arrays, negated patterns, and no-substitution template
literals. Dynamic patterns and calls that are not Vite's exact
`import.meta.glob` form remain unchanged.

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [x] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

Validated with:
- `pnpm run format`
- `pnpm run lint`
- `pnpm run check`
- `pnpm -F @sveltejs/package test`
- `pnpm -F @sveltejs/kit test:unit`

### Changesets

- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.
# Add the new HTTP method

Adding the new QUERY method.
---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:

- [ ] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [x] Ideally, include a test that fails without this PR but passes with
it.

### Tests

- [ ] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets

- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.

---------

Co-authored-by: Nic Polumeyv <162764842+Nic-Polumeyv@users.noreply.github.com>
…n error is thrown during rendering (#16526)

Fixes the error page placement half of #16345.

Since #16301, an error thrown while rendering is caught by the boundary
at the depth that threw it, so the nearest `+error.svelte` renders
inside every layout between its own directory and the throwing
component. The same error thrown in `load` renders that component at its
own depth with the intervening layouts unmounted. Before #16301 the
generated root only armed a boundary at depths that own an error
component (`failed={errors[depth] ? failed : undefined}`), which made
render errors rethrow up to the owning depth. The unconditional boundary
plus the nearest-ancestor `findLast` changed that without a changeset,
first shipping in 3.0.0-next.8, the version #16345 was filed against.
SvelteKit 2 places the same error at the owning depth.

The client and the server now build that array with one shared function
instead of a copy each. Nearest-boundary selection (#14410, #15745) is
unchanged, only where the selected error page renders.

`set_nearest_error_page` rebuilt the chain with no errors at all, so a
render error inside a form error page fell back to the root one. It now
passes the route's.

Conditional arming exposed a latent ordering problem in the #16296 reset
path: `navigate` drains the resetters as soon as the new props are
applied, before the flush, so a stale failed boundary re-renders its old
content (which throws again) at a depth the new tree may no longer have.
Unconditionally armed boundaries silently re-swallowed that throw on
every teardown; with sparse arming it escaped to an ancestor boundary
and rendered an error page instead of the new route. The drain now runs
after `settled()`, matching the fork branch, which resets after state is
applied. Boundaries at removed depths are simply unmounted by the flush;
boundaries at surviving depths reset against a consistent tree.

The async test app's `/server-error-boundary` route already had exactly
this shape, with the root error page silently rendering inside the
section layout. The two existing tests now assert the layout is gone.

---------

Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
Co-authored-by: Rich Harris <rich.harris@vercel.com>
…xclude list (#16788)

Fixes #13310. Netlify treats a trailing slash in `excludedPath` as
required rather than optional, but the prerendered root is recorded as
`/base/` when a base path is set, and `trailingSlash: 'always'` pages as
`/foo/`, so they were never excluded and hit the edge function.

Alternative to #16472.
`walk` in `utils/filesystem.js` and `list_files` in `core/utils.js` were
the same recursive walk with minor drift. Merged into one generator that
yields posix paths. `walk`'s `dirs` parameter had no callers.

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:
- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [x] Ideally, include a test that fails without this PR but passes with
it.

### Tests
- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets
- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.

---------

Co-authored-by: Rich Harris <rich.harris@vercel.com>
closes #16116

`get_buffer` and `LazyFile#stream` each had their own copy of the
chunk-range scan, now shared as a `read_range` async generator. This
fixes reading a zero-length file at the exact end of the payload, which
errored with 'incomplete file data' because the scan never found a chunk
containing its offset. The new test fails without the change.

Body reads are also chained now so that at most one is pending at a
time, which workerd requires. Verified against the #16116 repro app
under wrangler: on 3.0.0-next.4 the upload fails as reported, with this
patch applied both files read completely.

---

### Please don't delete this checklist! Before submitting the PR, please
make sure you do the following:
- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] This message body should clearly illustrate what problems it
solves.
- [x] Ideally, include a test that fails without this PR but passes with
it.

### Tests
- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint` and `pnpm check`

### Changesets
- [x] If your PR makes a change that should be noted in one or more
packages' changelogs, generate a changeset by running `pnpm changeset`
and following the prompts. Changesets that add features should be
`minor` and those that fix bugs should be `patch`. Please prefix
changeset messages with `feat:`, `fix:`, or `chore:`.

### Edits

- [x] Please ensure that 'Allow edits from maintainers' is checked. PRs
without this option may be closed.

---------

Co-authored-by: Rich Harris <rich.harris@vercel.com>
…`nodeName` (#16769)

Fixes #15419

Named form controls shadow DOM properties on their form, so
`form.nodeName` can be an input element rather than a string. Same class
as #7593, #8467 and #16138.
…16774)

Stacked on #16526, the diff includes its commits until it merges. Second
half of the error-chain unification: the load-error rewind walk exists
in client and server copies. Server conversion and tests still to come.

---------

Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
…6793)

A request whose body has been fully read never aborts its signal on
client disconnect, because `readableAborted` requires the stream to die
before `end`. Give `getRequest` the response so disconnects are detected
on the response side instead — `writableEnded` rather than
`writableFinished` because HTTP/2 marks cancelled streams as finished.
Split out of #16790.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.