Skip to content

fix: use separate hook object for each environment#21472

Merged
sapphi-red merged 2 commits into
vitejs:mainfrom
sapphi-red:fix/use-separate-hook-object-for-each-environment
Jan 23, 2026
Merged

fix: use separate hook object for each environment#21472
sapphi-red merged 2 commits into
vitejs:mainfrom
sapphi-red:fix/use-separate-hook-object-for-each-environment

Conversation

@sapphi-red

Copy link
Copy Markdown
Member

fixes #21466
refs #21443
close #21470

@sapphi-red sapphi-red added the p3-downstream-blocker Blocking the downstream ecosystem to work properly (priority) label Jan 23, 2026
@sapphi-red

Copy link
Copy Markdown
Member Author

/ecosystem-ci run

@pkg-pr-new

pkg-pr-new Bot commented Jan 23, 2026

Copy link
Copy Markdown

Open in StackBlitz

pnpm add https://pkg.pr.new/vitejs/vite/@vitejs/plugin-legacy@21472
npm i https://pkg.pr.new/vitejs/vite/@vitejs/plugin-legacy@21472
yarn add https://pkg.pr.new/vitejs/vite/@vitejs/plugin-legacy@21472.tgz
pnpm add https://pkg.pr.new/vitejs/vite@21472
npm i https://pkg.pr.new/vitejs/vite@21472
yarn add https://pkg.pr.new/vitejs/vite@21472.tgz

commit: 26957fb

@vite-ecosystem-ci

Copy link
Copy Markdown

📝 Ran ecosystem CI on 5d996bf: Open

suite result latest scheduled
one failure failure
histoire failure success
react-router failure success
laravel failure success
nuxt failure success
storybook failure success
astro ⏹️ cancelled failure
analogjs success failure
vite-plugin-pwa failure success
vite-plugin-react failure success
vike failure success
rakkas failure success
sveltekit failure success
qwik failure failure
vite-plugin-cloudflare failure success
waku failure success
vitest failure success

ladle, quasar, vite-plugin-vue, vite-environment-examples, vitepress, vite-plugin-svelte, vite-setup-catalogue, unocss, vuepress, marko, vite-plugin-rsc

@sapphi-red sapphi-red merged commit 66347f6 into vitejs:main Jan 23, 2026
22 checks passed
@sapphi-red sapphi-red deleted the fix/use-separate-hook-object-for-each-environment branch January 23, 2026 09:24
@wiesson

wiesson commented Jan 23, 2026

Copy link
Copy Markdown

has this been released?! :)

@joaopedrodcf

Copy link
Copy Markdown

@wiesson it was released in beta 10 already ( 1 hour ago )

@wiesson

wiesson commented Jan 24, 2026

Copy link
Copy Markdown

I have already deployed to prod and the issue has been resolved!

Thiladev pushed a commit to Thiladev/effect-fc that referenced this pull request Mar 16, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [vite](https://vite.dev) ([source](https://github.com/vitejs/vite/tree/HEAD/packages/vite)) | [`^7.3.1` → `^8.0.0`](https://renovatebot.com/diffs/npm/vite/7.3.1/8.0.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vite/8.0.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite/7.3.1/8.0.0?slim=true) |

---

### Release Notes

<details>
<summary>vitejs/vite (vite)</summary>

### [`v8.0.0`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#800-2026-03-12)

[Compare Source](vitejs/vite@v7.3.1...v8.0.0)

![Vite 8 is here!](../../docs/public/og-image-announcing-vite8.webp)

Today, we're thrilled to announce the release of the next Vite major:

- **[Vite 8.0 announcement blog post](https://vite.dev/blog/announcing-vite8.html)**
- [Docs](https://vite.dev/) (translations: [简体中文](https://cn.vite.dev/), [日本語](https://ja.vite.dev/), [Español](https://es.vite.dev/), [Português](https://pt.vite.dev/), [한국어](https://ko.vite.dev/), [Deutsch](https://de.vite.dev/), [فارسی](https://fa.vite.dev/))
- [Migration Guide](https://vite.dev/guide/migration.html)

##### ⚠ BREAKING CHANGES

- remove `import.meta.hot.accept` resolution fallback ([#&#8203;21382](vitejs/vite#21382))
- update default browser target ([#&#8203;21193](vitejs/vite#21193))
- the epic `rolldown-vite` merge ([#&#8203;21189](vitejs/vite#21189))

##### Features

- update rolldown to 1.0.0-rc.9 ([#&#8203;21813](vitejs/vite#21813)) ([f05be0e](vitejs/vite@f05be0e))
- warn when `vite-tsconfig-paths` plugin is detected ([#&#8203;21781](vitejs/vite#21781)) ([ada493e](vitejs/vite@ada493e))
- **css:** support es2025 build target for lightningcss ([#&#8203;21769](vitejs/vite#21769)) ([08906e7](vitejs/vite@08906e7))
- forward browser console logs and errors to dev server terminal ([#&#8203;20916](vitejs/vite#20916)) ([2540ed0](vitejs/vite@2540ed0))
- update rolldown to 1.0.0-rc.8 ([#&#8203;21790](vitejs/vite#21790)) ([a0c950e](vitejs/vite@a0c950e))
- export `Visitor` and `ESTree` from `rolldown/utils` ([#&#8203;21664](vitejs/vite#21664)) ([45de31e](vitejs/vite@45de31e))
- update rolldown to 1.0.0-rc.6 ([#&#8203;21714](vitejs/vite#21714)) ([37a65f8](vitejs/vite@37a65f8))
- use util.inspect for CLI error display ([#&#8203;21668](vitejs/vite#21668)) ([5f425a9](vitejs/vite@5f425a9))
- update rolldown to 1.0.0-rc.5 ([#&#8203;21660](vitejs/vite#21660)) ([b3ddbc5](vitejs/vite@b3ddbc5))
- update rolldown to 1.0.0-rc.4 ([#&#8203;21617](vitejs/vite#21617)) ([1ee5c7f](vitejs/vite@1ee5c7f))
- **wasm:** add SSR support for `.wasm?init` ([#&#8203;21102](vitejs/vite#21102)) ([216a3b5](vitejs/vite@216a3b5))
- integrate devtools ([#&#8203;21331](vitejs/vite#21331)) ([acbf507](vitejs/vite@acbf507))
- update rolldown to 1.0.0-rc.3 ([#&#8203;21554](vitejs/vite#21554)) ([43358e9](vitejs/vite@43358e9))
- **manifest:** add `assets` field for standalone CSS entry points ([#&#8203;21015](vitejs/vite#21015)) ([f289b9b](vitejs/vite@f289b9b))
- update rolldown to 1.0.0-rc.2 ([#&#8203;21512](vitejs/vite#21512)) ([fa136a9](vitejs/vite@fa136a9))
- **bundled-dev:** support worker in initial bundle ([#&#8203;21415](vitejs/vite#21415)) ([f3d3149](vitejs/vite@f3d3149))
- **dev:** detect port conflicts on wildcard hosts ([#&#8203;21381](vitejs/vite#21381)) ([b0dd5a9](vitejs/vite@b0dd5a9))
- shortcuts case insensitive ([#&#8203;21224](vitejs/vite#21224)) ([7796ade](vitejs/vite@7796ade))
- update rolldown to 1.0.0-rc.1 ([#&#8203;21463](vitejs/vite#21463)) ([ff9dd7f](vitejs/vite@ff9dd7f))
- warn if `envPrefix` contains spaces ([#&#8203;21292](vitejs/vite#21292)) ([9fcde3c](vitejs/vite@9fcde3c))
- update rolldown to 1.0.0-beta.60 ([#&#8203;21408](vitejs/vite#21408)) ([c33aa7c](vitejs/vite@c33aa7c))
- update rolldown to 1.0.0-beta.59 ([#&#8203;21374](vitejs/vite#21374)) ([0037943](vitejs/vite@0037943))
- add `ignoreOutdatedRequests` option to `optimizeDeps` ([#&#8203;21364](vitejs/vite#21364)) ([b2e75aa](vitejs/vite@b2e75aa))
- add ios to default esbuild targets ([#&#8203;21342](vitejs/vite#21342)) ([daae6e9](vitejs/vite@daae6e9))
- update rolldown to 1.0.0-beta.58 ([#&#8203;21354](vitejs/vite#21354)) ([ba40cef](vitejs/vite@ba40cef))
- update rolldown to 1.0.0-beta.57 ([#&#8203;21335](vitejs/vite#21335)) ([d5412ef](vitejs/vite@d5412ef))
- **css:** support es2024 build target for lightningcss ([#&#8203;21294](vitejs/vite#21294)) ([bd33b8e](vitejs/vite@bd33b8e))
- update rolldown to 1.0.0-beta.56 ([#&#8203;21323](vitejs/vite#21323)) ([9847a63](vitejs/vite@9847a63))
- introduce v2 native plugins and enable it by default ([#&#8203;21268](vitejs/vite#21268)) ([42f2ab3](vitejs/vite@42f2ab3))
- **ssr:** avoid errors when rewriting already rewritten stacktrace ([#&#8203;21269](vitejs/vite#21269)) ([98d9a33](vitejs/vite@98d9a33))
- update rolldown to 1.0.0-beta.55 ([#&#8203;21300](vitejs/vite#21300)) ([2c8db85](vitejs/vite@2c8db85))
- update rolldown to 1.0.0-beta.54 ([#&#8203;21267](vitejs/vite#21267)) ([c751172](vitejs/vite@c751172))
- add a warning that is output when a plugin sets esbuild related options ([#&#8203;21218](vitejs/vite#21218)) ([200646b](vitejs/vite@200646b))
- highly experimental full bundle mode ([#&#8203;21235](vitejs/vite#21235)) ([83d8c99](vitejs/vite@83d8c99))
- print esbuild options when both esbuild and oxc options are set ([#&#8203;21216](vitejs/vite#21216)) ([08ae87b](vitejs/vite@08ae87b))
- update default browser target ([#&#8203;21193](vitejs/vite#21193)) ([8c3dd06](vitejs/vite@8c3dd06))
- the epic `rolldown-vite` merge ([#&#8203;21189](vitejs/vite#21189)) ([4a7f8d4](vitejs/vite@4a7f8d4))

##### Bug Fixes

- **deps:** update all non-major dependencies ([#&#8203;21786](vitejs/vite#21786)) ([eaa4352](vitejs/vite@eaa4352))
- use `watch.watcher` instead of `watch.notify` ([#&#8203;21793](vitejs/vite#21793)) ([88953b3](vitejs/vite@88953b3))
- **css:** apply `server.origin` to public file URLs in CSS (fix [#&#8203;18457](vitejs/vite#18457)) ([#&#8203;21697](vitejs/vite#21697)) ([c967f48](vitejs/vite@c967f48))
- **deps:** update all non-major dependencies ([#&#8203;21732](vitejs/vite#21732)) ([5c921ca](vitejs/vite@5c921ca))
- **dev:** disable extglobs for consistency ([#&#8203;21745](vitejs/vite#21745)) ([1958eeb](vitejs/vite@1958eeb))
- **lib:** keep annotation comments for es output ([#&#8203;21740](vitejs/vite#21740)) ([dd3c4f4](vitejs/vite@dd3c4f4))
- **optimizer:** avoid error happening with a package with asset entrypoint ([#&#8203;21766](vitejs/vite#21766)) ([f7e1d07](vitejs/vite@f7e1d07))
- **ssr:** throw friendly error when calling `ssrLoadModule` with non-runnable ssr env ([#&#8203;21739](vitejs/vite#21739)) ([1fa736e](vitejs/vite@1fa736e))
- **types:** remove extends ImportMeta from ModuleRunnerImportMeta ([#&#8203;21710](vitejs/vite#21710)) ([0176d45](vitejs/vite@0176d45))
- **wasm:** reset assetUrlRE.lastIndex before .test() in SSR builds ([#&#8203;21780](vitejs/vite#21780)) ([3a0d8d9](vitejs/vite@3a0d8d9))
- **deps:** update all non-major dependencies ([#&#8203;21691](vitejs/vite#21691)) ([521fdc0](vitejs/vite@521fdc0))
- **optimizer:** avoid duplicate modules when `preserveSymlinks` is enabled ([#&#8203;21720](vitejs/vite#21720)) ([72165e0](vitejs/vite@72165e0))
- **dev:** only treat EADDRINUSE as port conflict in wildcard pre-check ([#&#8203;21642](vitejs/vite#21642)) ([e54e25f](vitejs/vite@e54e25f))
- **dev:** prevent concurrent server restarts ([#&#8203;21636](vitejs/vite#21636)) ([8ce23a3](vitejs/vite@8ce23a3))
- **dev:** return "502 Bad Gateway" on proxy failures instead of 500 ([#&#8203;21652](vitejs/vite#21652)) ([e240df2](vitejs/vite@e240df2))
- clear tsconfig cache only when tsconfig.json is cached ([#&#8203;21622](vitejs/vite#21622)) ([50c9675](vitejs/vite@50c9675))
- **deps:** update all non-major dependencies ([#&#8203;21594](vitejs/vite#21594)) ([becdc5d](vitejs/vite@becdc5d))
- **lib:** CSS injection point error with nested name IIFE output ([#&#8203;21606](vitejs/vite#21606)) ([5003de6](vitejs/vite@5003de6))
- **module-runner:** incorrect column with `sourcemapInterceptor: "prepareStackTrace"` ([#&#8203;21562](vitejs/vite#21562)) ([416c095](vitejs/vite@416c095))
- **module-runner:** prevent crash on negative column in stacktrace ([#&#8203;21585](vitejs/vite#21585)) ([a075590](vitejs/vite@a075590))
- rolldownOptions/rollupOptions merging at environment level ([#&#8203;21612](vitejs/vite#21612)) ([db2ecc7](vitejs/vite@db2ecc7))
- **scanner:** respect tsconfig.json ([#&#8203;21547](vitejs/vite#21547)) ([c6c04db](vitejs/vite@c6c04db))
- avoid registering customization hook for import meta resolver multiple times ([#&#8203;21518](vitejs/vite#21518)) ([8bb3203](vitejs/vite@8bb3203))
- **config:** avoid watching rolldown runtime virtual module ([#&#8203;21545](vitejs/vite#21545)) ([d18b139](vitejs/vite@d18b139))
- **deps:** update all non-major dependencies ([#&#8203;21540](vitejs/vite#21540)) ([9ebaeaa](vitejs/vite@9ebaeaa))
- populate originalFileNames when resolving CSS asset paths ([#&#8203;21542](vitejs/vite#21542)) ([8b47ff7](vitejs/vite@8b47ff7))
- **deps:** update all non-major dependencies ([#&#8203;21488](vitejs/vite#21488)) ([2b32ca2](vitejs/vite@2b32ca2))
- disable `tsconfig` option when loading config ([#&#8203;21517](vitejs/vite#21517)) ([5025c35](vitejs/vite@5025c35))
- **optimizer:** map relative `new URL` paths to correct relative file location ([#&#8203;21434](vitejs/vite#21434)) ([ca96cbc](vitejs/vite@ca96cbc))
- avoid using deprecated `output.inlineDynamicImport` option ([#&#8203;21464](vitejs/vite#21464)) ([471ce62](vitejs/vite@471ce62))
- use separate hook object for each environment ([#&#8203;21472](vitejs/vite#21472)) ([66347f6](vitejs/vite@66347f6))
- **deps:** update all non-major dependencies ([#&#8203;21440](vitejs/vite#21440)) ([1835995](vitejs/vite@1835995))
- **dev:** avoid event emitter leak caused by `server.listen` callback ([#&#8203;21451](vitejs/vite#21451)) ([602d786](vitejs/vite@602d786))
- lazy hook filter should work ([#&#8203;21443](vitejs/vite#21443)) ([bc0c207](vitejs/vite@bc0c207))
- **optimizer:** skip `rolldownCjsExternalPlugin` for `platform: neutral` ([#&#8203;21452](vitejs/vite#21452)) ([d2fc4be](vitejs/vite@d2fc4be))
- **deps:** update all non-major dependencies ([#&#8203;21389](vitejs/vite#21389)) ([30f48df](vitejs/vite@30f48df))
- **deps:** update esbuild peerDependency version ([#&#8203;21398](vitejs/vite#21398)) ([4266c97](vitejs/vite@4266c97))
- **hmr:** trigger prune event when last import is removed ([#&#8203;20781](vitejs/vite#20781)) ([#&#8203;21093](vitejs/vite#21093)) ([7576735](vitejs/vite@7576735))
- **module-runner:** use `process.getBuiltinModule` instead of `import('node:module')` ([#&#8203;21402](vitejs/vite#21402)) ([6633bcb](vitejs/vite@6633bcb))
- support .env file mounts (FIFOs) ([#&#8203;21365](vitejs/vite#21365)) ([6e6f82a](vitejs/vite@6e6f82a))
- **css:** stylus Evaluator support ([#&#8203;21376](vitejs/vite#21376)) ([cf9ace1](vitejs/vite@cf9ace1))
- **deps:** update all non-major dependencies ([#&#8203;21321](vitejs/vite#21321)) ([9bc7c2e](vitejs/vite@9bc7c2e))
- **import-analysis:** avoid cjs interop for built browser external module ([#&#8203;21333](vitejs/vite#21333)) ([dc5a2fb](vitejs/vite@dc5a2fb))
- **worker:** handle `new Worker(..., new URL(import.meta.url))` with trailing comma ([#&#8203;21325](vitejs/vite#21325)) ([4a47241](vitejs/vite@4a47241))
- detect `import.meta.resolve` when formatted across multiple lines ([#&#8203;21312](vitejs/vite#21312)) ([130e718](vitejs/vite@130e718))
- allow no-cors requests for non-script tag requests ([#&#8203;21299](vitejs/vite#21299)) ([ef3d596](vitejs/vite@ef3d596))
- **deps:** update all non-major dependencies ([#&#8203;21285](vitejs/vite#21285)) ([4635b2e](vitejs/vite@4635b2e))
- unreachable error when building with `experimental.bundledDev` is enabled ([#&#8203;21296](vitejs/vite#21296)) ([e81c183](vitejs/vite@e81c183))
- **deps:** update all non-major dependencies ([#&#8203;21231](vitejs/vite#21231)) ([859789c](vitejs/vite@859789c))
- don't strip base from imports ([#&#8203;21221](vitejs/vite#21221)) ([7da742b](vitejs/vite@7da742b))
- allow exiting process before optimizer cleanup is done ([#&#8203;21170](vitejs/vite#21170)) ([55ceffc](vitejs/vite@55ceffc))
- plugin shortcut support ([#&#8203;21211](vitejs/vite#21211)) ([6a3aca0](vitejs/vite@6a3aca0))

##### Performance Improvements

- **ssr:** skip circular import check for already-evaluated modules ([#&#8203;21632](vitejs/vite#21632)) ([235140b](vitejs/vite@235140b))
- use tsconfig cache for oxc transform in dev ([#&#8203;21643](vitejs/vite#21643)) ([57ff177](vitejs/vite@57ff177))

##### Documentation

- bulk of typo fixes ([#&#8203;21507](vitejs/vite#21507)) ([80755da](vitejs/vite@80755da))
- update `build.dynamicImportVarsOptions` ([#&#8203;21477](vitejs/vite#21477)) ([54ce2ed](vitejs/vite@54ce2ed))
- clarify the pronunciation of `vite` in IPA symbols ([#&#8203;21238](vitejs/vite#21238)) ([9b1d4d6](vitejs/vite@9b1d4d6))
- ensure https links ([#&#8203;21266](vitejs/vite#21266)) ([2eb259a](vitejs/vite@2eb259a))

##### Miscellaneous Chores

- **deps-dev:** bump rollup from 4.57.1 to 4.59.0 ([#&#8203;21717](vitejs/vite#21717)) ([25227bb](vitejs/vite@25227bb))
- **deps:** update dependency cac to v7 ([#&#8203;21788](vitejs/vite#21788)) ([44e33ae](vitejs/vite@44e33ae))
- **deps:** update dependency rolldown-plugin-dts to ^0.22.2 ([#&#8203;21731](vitejs/vite#21731)) ([d8ea652](vitejs/vite@d8ea652))
- **deps:** remove `fdir` and `@rollup/plugin-commonjs` ([#&#8203;21639](vitejs/vite#21639)) ([5abffd5](vitejs/vite@5abffd5))
- **deps:** update dependency [@&#8203;rollup/plugin-alias](https://github.com/rollup/plugin-alias) to v6 ([#&#8203;21097](vitejs/vite#21097)) ([44b5bdf](vitejs/vite@44b5bdf))
- fix broken link for future deprecations ([#&#8203;21603](vitejs/vite#21603)) ([25f4501](vitejs/vite@25f4501))
- update `customResolver` deprecation message to mention `enforce: 'pre'` ([#&#8203;21576](vitejs/vite#21576)) ([2ce34d5](vitejs/vite@2ce34d5))
- update rolldown-plugin-dts to 0.22.1 ([#&#8203;21559](vitejs/vite#21559)) ([77aab4b](vitejs/vite@77aab4b))
- **deps:** update dependency rolldown-plugin-dts to ^0.21.8 ([#&#8203;21539](vitejs/vite#21539)) ([33881cb](vitejs/vite@33881cb))
- add missing versions to changelog ([#&#8203;21515](vitejs/vite#21515)) ([4bfb239](vitejs/vite@4bfb239))
- **deps:** update rolldown-related dependencies ([#&#8203;21487](vitejs/vite#21487)) ([5863e51](vitejs/vite@5863e51))
- **deps:** update rolldown-related dependencies ([#&#8203;21390](vitejs/vite#21390)) ([be9dd4e](vitejs/vite@be9dd4e))
- fix typo in plugin.ts comment ([#&#8203;21435](vitejs/vite#21435)) ([d31fc66](vitejs/vite@d31fc66))
- replace caniuse link for ES2024 ([#&#8203;21355](vitejs/vite#21355)) ([2ba4e99](vitejs/vite@2ba4e99))
- cleanup changelog ([#&#8203;21202](vitejs/vite#21202)) ([8c8c56e](vitejs/vite@8c8c56e))
- **deps:** update rolldown-related dependencies ([#&#8203;21230](vitejs/vite#21230)) ([9349446](vitejs/vite@9349446))
- fix spelling error ([#&#8203;21223](vitejs/vite#21223)) ([cc10e20](vitejs/vite@cc10e20))

##### Code Refactoring

- don't add `optimization.inlineConst: { mode: 'smart' }` as it's enabled by default ([#&#8203;21794](vitejs/vite#21794)) ([22b3d11](vitejs/vite@22b3d11))
- enable some native plugins even with enable native plugin false ([#&#8203;21744](vitejs/vite#21744)) ([fc46c79](vitejs/vite@fc46c79))
- avoid deprecated `legalComments` option ([#&#8203;21721](vitejs/vite#21721)) ([e06496e](vitejs/vite@e06496e))
- use `ESTree` types from `rolldown/utils` ([#&#8203;21719](vitejs/vite#21719)) ([9239750](vitejs/vite@9239750))
- deprecate `customResolver` in `resolve.alias` ([#&#8203;21476](vitejs/vite#21476)) ([81275c9](vitejs/vite@81275c9))
- remove unnecessary `@rolldown/pluginutils` ([#&#8203;21560](vitejs/vite#21560)) ([c367b62](vitejs/vite@c367b62))
- enable some native plugins even with enable native plugin false ([#&#8203;21608](vitejs/vite#21608)) ([5a4f692](vitejs/vite@5a4f692))
- use `rolldown/utils` ([#&#8203;21577](vitejs/vite#21577)) ([e56103f](vitejs/vite@e56103f))
- use internal devtools config ([#&#8203;21609](vitejs/vite#21609)) ([9aea20f](vitejs/vite@9aea20f))
- use parseEnv ([#&#8203;21586](vitejs/vite#21586)) ([f859d2c](vitejs/vite@f859d2c))
- **wasm:** remove native wasm helper plugin usage ([#&#8203;21566](vitejs/vite#21566)) ([71a86be](vitejs/vite@71a86be))
- enable some native plugins even with enable native plugin false ([#&#8203;21511](vitejs/vite#21511)) ([b40292c](vitejs/vite@b40292c))
- remove `experimental.enableNativePlugin: 'resolver'` ([#&#8203;21510](vitejs/vite#21510)) ([f9d9213](vitejs/vite@f9d9213))
- use `import.meta.dirname` everywhere ([#&#8203;21509](vitejs/vite#21509)) ([7becf5f](vitejs/vite@7becf5f))
- **optimizer:** simplify `rolldownCjsExternalPlugin` ([#&#8203;21450](vitejs/vite#21450)) ([ebda8fd](vitejs/vite@ebda8fd))
- remove `import.meta.hot.accept` resolution fallback ([#&#8203;21382](vitejs/vite#21382)) ([71d0797](vitejs/vite@71d0797))
- **optimizer:** remove dead code ([#&#8203;21334](vitejs/vite#21334)) ([e9a2cdb](vitejs/vite@e9a2cdb))

##### Tests

- **ssr:** incorrect `handleInvoke` was called in server-worker-runner.invoke test ([#&#8203;21751](vitejs/vite#21751)) ([b95ca22](vitejs/vite@b95ca22))
- add more type tests for `defineConfig` ([#&#8203;21698](vitejs/vite#21698)) ([4fedbbd](vitejs/vite@4fedbbd))
- test case for catching invalid package resolution error ([#&#8203;21601](vitejs/vite#21601)) ([c9b9359](vitejs/vite@c9b9359))
- **bundled-dev:** add worker test cases ([#&#8203;21557](vitejs/vite#21557)) ([569bc98](vitejs/vite@569bc98))

##### Beta Changelogs

##### [8.0.0-beta.18](vitejs/vite@v8.0.0-beta.17...v8.0.0-beta.18) (2026-03-09)

See [8.0.0-beta.18 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.18/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.17](vitejs/vite@v8.0.0-beta.16...v8.0.0-beta.17) (2026-03-09)

See [8.0.0-beta.17 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.17/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.16](vitejs/vite@v8.0.0-beta.15...v8.0.0-beta.16) (2026-02-27)

See [8.0.0-beta.16 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.16/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.15](vitejs/vite@v8.0.0-beta.14...v8.0.0-beta.15) (2026-02-19)

See [8.0.0-beta.15 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.15/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.14](vitejs/vite@v8.0.0-beta.13...v8.0.0-beta.14) (2026-02-12)

See [8.0.0-beta.14 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.14/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.13](vitejs/vite@v8.0.0-beta.12...v8.0.0-beta.13) (2026-02-05)

See [8.0.0-beta.13 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.13/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.12](vitejs/vite@v8.0.0-beta.11...v8.0.0-beta.12) (2026-02-03)

See [8.0.0-beta.12 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.12/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.11](vitejs/vite@v8.0.0-beta.10...v8.0.0-beta.11) (2026-01-29)

See [8.0.0-beta.11 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.11/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.10](vitejs/vite@v8.0.0-beta.9...v8.0.0-beta.10) (2026-01-24)

See [8.0.0-beta.10 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.10/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.9](vitejs/vite@v8.0.0-beta.8...v8.0.0-beta.9) (2026-01-22)

See [8.0.0-beta.9 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.9/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.8](vitejs/vite@v8.0.0-beta.7...v8.0.0-beta.8) (2026-01-15)

See [8.0.0-beta.8 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.8/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.7](vitejs/vite@v8.0.0-beta.6...v8.0.0-beta.7) (2026-01-08)

See [8.0.0-beta.7 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.7/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.6](vitejs/vite@v8.0.0-beta.5...v8.0.0-beta.6) (2026-01-07)

See [8.0.0-beta.6 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.6/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.5](vitejs/vite@v8.0.0-beta.4...v8.0.0-beta.5) (2025-12-25)

See [8.0.0-beta.5 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.5/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.4](vitejs/vite@v8.0.0-beta.3...v8.0.0-beta.4) (2025-12-22)

See [8.0.0-beta.4 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.4/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.3](vitejs/vite@v8.0.0-beta.2...v8.0.0-beta.3) (2025-12-18)

See [8.0.0-beta.3 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.3/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.2](vitejs/vite@v8.0.0-beta.1...v8.0.0-beta.2) (2025-12-12)

See [8.0.0-beta.2 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.2/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.1](vitejs/vite@v8.0.0-beta.0...v8.0.0-beta.1) (2025-12-08)

See [8.0.0-beta.1 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.1/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.0](vitejs/vite@v7.2.4...v8.0.0-beta.0) (2025-12-03)

See [8.0.0-beta.0 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.0/packages/vite/CHANGELOG.md)

##### Rolldown-Vite changelogs

See [rolldown-vite changelog](https://github.com/vitejs/rolldown-vite/blob/v7.2.10/packages/vite/CHANGELOG.md)

</details>

---

### Configuration

📅 **Schedule**: 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.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

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

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni41IiwidXBkYXRlZEluVmVyIjoiNDMuNzYuMiIsInRhcmdldEJyYW5jaCI6Im5leHQiLCJsYWJlbHMiOltdfQ==-->

Reviewed-on: https://git.valverde.cloud/Thilawyn/effect-fc/pulls/37
Co-authored-by: Renovate Bot <renovate-bot@valverde.cloud>
Co-committed-by: Renovate Bot <renovate-bot@valverde.cloud>
rubentalstra added a commit to rubentalstra/ehrbase-ui that referenced this pull request Jun 10, 2026
…p run (#53)

* build: adopt Vite 8 + Vite+ toolchain, switch formatter to Oxfmt

Phase 0+1 of the Vite+ unified-toolchain migration.

- Vite 7.3.3 -> 8.0.16 (now GA; @tanstack/react-start peers vite >=7 and
  the Vite8+Nitro build break was fixed in Vite core, PR vitejs/vite#21472).
  @vitejs/plugin-react 5->6.0.2 (requires vite ^8), react-start
  1.168.18->1.168.25, react-router ->1.170.15, vitest 4.1.7->4.1.8.
- Add vite-plus 0.1.24 (exact pin) as the monorepo toolchain entry point;
  new root vite.config.ts holds the shared Oxfmt `fmt` block (singleQuote,
  no semi -- mirrors the former prettier.config.js).
- Exclude the pinned openEHR spec mirror (CLAUDE.md rule 17) and all
  packages/*/src/generated/** from formatting; fix the stale paraglide
  ignore path.

Verified green: vite build, tsc typecheck (20/20), regen:check (4/4),
full test suite (20/20), dev server boot.

* style: format entire repo with Oxfmt

One-time cosmetic reformat (quotes / semicolons / wrapping only -- no
logic changes) bringing the whole tree to Oxfmt style via `vp fmt --write`.

The repo was not formatter-clean even against its own prettier.config.js:
packages/* were committed with double-quotes + semicolons, so
`prettier --check .` already flagged ~613 files and Oxfmt ~593 -- the two
formatters agree on ~590, confirming this is a pre-existing cleanup, not an
Oxfmt incompatibility. Generated output and the openEHR spec mirror are
excluded.

* build(lint): re-encode the ESLint ruleset onto Oxlint (vp lint)

Phase 2 of the Vite+ migration. Adds the `lint` block to the root
vite.config.ts, reproducing packages/config-eslint/index.js on Oxlint:

- Rule-namespace map: react-hooks/* -> react/*, jsx-a11y-x/* -> jsx-a11y/*,
  @typescript-eslint/* -> typescript/*, the SDK-ban -> core no-restricted-imports.
- Inviolable rules verified to FIRE via an injected probe: no `as` casts
  (typescript/consistent-type-assertions), the openEHR-SDK import ban with its
  ADR-0003 message, only-throw-error (BFF `Response`/`Redirect` allowlist
  honoured), and the jsx-a11y anchor gate.
- Legal a11y gate (EAA / EN 301 549, architecture §12) reproduced 1:1: all 34
  jsx-a11y-x `strict` error rules at error + the 2 `off` rules; verified against
  the strict severity map and signed off by the a11y-auditor.
- TanStack `<Link to=>` handled via settings['jsx-a11y'].attributes
  (href: ['to','href']) since Oxlint does not honour the old `specialLink` option.
- Type-aware path enabled via the bundled tsgolint (options.typeAware/typeCheck).

`vp lint` is clean across the repo, matching the (clean) ESLint baseline.
ESLint stays installed until the Phase-5 hooks/scripts/CI cutover.

* build(test): run the test suites via `vp test`

Phase 3 of the Vite+ migration. `vp test` is a Vitest passthrough that
discovers the existing vitest.config.ts files unchanged, so the intricate
dual-project setup (jsdom `unit` + Storybook browser `storybook`), v8
coverage, setup files, and the workspace-spanning package include globs are
all preserved — no risky rewrite into the build vite.config.ts (which would
have pulled the Start/Nitro SSR plugins into the test runtime).

- All package + app `test` scripts: `vitest run` -> `vp test run`
  (watch variants -> `vp test watch`, since vp test is non-watch by default).
- Verified: web unit suite 832 passed | 13 skipped (identical to the Vitest
  baseline), openehr-query 99 passed, v8 coverage works, and the full
  `turbo run test` is green (20/20 tasks). vp fmt clean.

vitest + the vitest.config.ts files stay (the configs `import 'vitest/config'`
and vp reuses them); standalone-dep cleanup is deferred to Phase 6.

* build: route dev/build/preview through `vp`

Phase 4 of the Vite+ migration. The app's vite.config.ts (TanStack Start +
Nitro + Paraglide + Tailwind + React plugin chain) runs unchanged under vp.

- apps/web scripts: `vite dev` -> `vp dev`, `vite build` -> `vp build`
  (kept the build-migrate poststep), `vite preview` -> `vp preview`.
- playwright.config.ts smoke webServer: `vite dev` -> `vp dev`.

Verified: `vp build` produces a full client+ssr+nitro production build on
vite 8.0.16 (5.34s); `vp dev` boots DB-less and serves /en/login (200); the
Playwright smoke suite (incl. the WCAG 2.2 AA axe checks) is green booting
vp dev.

* build(toolchain): cut over orchestration, hooks, and CI to Vite+

Phase 5 of the Vite+ migration. Removes the parallel ESLint/Prettier/Husky
stack now that vp lint/fmt/test/build are proven, and wires the workspace
plumbing to vp.

- Remove ESLint (eslint.config.js, packages/config-eslint, 8 devDeps),
  Prettier (prettier.config.js, dep), and Husky + lint-staged (.husky, deps,
  config). .prettierignore stays as Oxfmt's ignore source (vp fmt reads it).
- Scripts -> vp: root lint/format/check = vp lint/fmt/check; apps/web the same;
  root `prepare` = `vp config` (installs .vite-hooks on every install).
- Commit hooks via .vite-hooks (core.hooksPath): pre-commit runs `vp staged`
  (staged block in vite.config.ts: lint --fix + fmt --write on staged files);
  commit-msg keeps commitlint (Conventional Commits) since vp does not lint
  commit messages. `vp config` is idempotent and preserves the commit-msg hook.
- Turbo: drop the per-package `lint` task (vp lint is monorepo-global, run once
  at root); build/typecheck/test/regen/paraglide/e2e tasks + their DAG stay.
- CI: voidzero-dev/setup-vp@v1 replaces pnpm/action-setup + setup-node across
  ci/release/security workflows; the CI lint step is now `vp lint`;
  VITE_GIT_HOOKS=0 skips hook install in CI; dependency-review allow-list drops
  the deleted config-eslint package.

Verified locally: vp lint clean, vp fmt clean, vp staged file-scoped fix works.

* build(orchestration): replace Turborepo with vp run

Completes full Vite+ adoption — the build is no longer Turbo. `vp run` derives
topological package order from the workspace package.json dependencies and runs
the per-package scripts; the codegen → typecheck/test/build ordering is
sequenced via a `codegen` script (regen + paraglide:compile).

- Root scripts: `turbo run X` -> `vp run -r X` / `vp run --filter @ehrbase-ui/web X`;
  new `codegen` = `vp run -r regen && vp run --filter @ehrbase-ui/i18n paraglide:compile`;
  build/typecheck/test depend on it.
- vite.config.ts gains a `run` block. Script result-caching is left OFF on
  purpose: regen/paraglide/build are file generators and vp only archives
  outputs for tasks with explicit `output` globs, so caching the scripts could
  skip regeneration when outputs are absent. Opt in with `vp run --cache`.
- Remove turbo.json, the turbo devDep, and the dead .turbo cache dir;
  .gitignore now points at node_modules/.vite (Vite Task cache).
- Stale "turbo" mentions in CI + test comments updated to vp run.

Verified locally green via vp run: pnpm typecheck (20 tasks), pnpm build
(vite 8 client+ssr+nitro), pnpm test (832 web + all package suites).

* docs(adr): ADR-0029 adopt Vite+ toolchain; update CLAUDE.md + REFERENCES

Phase 6 governance for the Vite+ migration.

- New ADR-0029 — adopt the Vite+ unified toolchain (vp build/dev/test/lint/fmt/
  run/staged/config; Vite 8). Records what it supersedes in ADR-0002 (the
  Vite-7 pin + ESLint/Prettier/Turbo choices) and ADR-0022 (lint/CI), the
  inviolable-rule preservation (no-as / SDK-ban / the EAA a11y gate 1:1 +
  a11y-auditor sign-off), pinning (vite-plus exact, setup-vp @v1), the alpha
  risk acceptance + vp implode rollback, and the vitest.config.ts retention.
- ADR index: add 0029; mark ADR-0002 toolchain/build as superseded.
- CLAUDE.md Versions: Vite 7.3.3 -> 8.0.16, TanStack Start -> 1.168.25,
  Vitest -> 4.1.8, add the Vite+/Oxlint/Oxfmt line, drop the ESLint plugin
  line; monorepo layout + task line now reference vp run; rule 3 cites Oxlint;
  config-eslint removed from the package list.
- REFERENCES.md: vite 8.0.16 + vite-plus/plugin-react rows, Vite+ lint/format
  section (ESLint/Prettier/Turbo removed), vitest 4.1.8, the drift note for
  Vite reversed to "adopted via ADR-0029".

* fix(scripts): run TS dev/ops entrypoints via tsx; Docker prepare hook guard

Surfaced by the live full-stack verification on Node 26. Node 26 only
strip-types TS (it removed --experimental-transform-types), so bare
`node src/.../cli.ts` fails on parameter properties / enums in the import
graph (e.g. openehr-am adl2/parse.ts) with ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX.
This is pre-existing, independent of the Vite+ migration.

- Run the TS entrypoints (seed:dev, db:bootstrap/migrate/setup, env:*,
  build-migrate) via `tsx` (4.22.4, already present as a Vite+ peer; pinned).
  Production still runs the built `.output` bundle, not tsx.
- Dockerfile: ENV VITE_GIT_HOOKS=0 so the root `prepare` script's `vp config`
  (ADR-0029) skips git-hook install in the git-less alpine build image.

Verified end-to-end on the live stack (Node 26): docker build, db:setup,
seed:dev (6 patients / 9 templates / 54 compositions), and the full-stack
auth e2e (10/10, real Keycloak login against the built server).

* fix(lint): disable tsgolint full typeCheck (preview panic); keep type-aware rules

`vp lint` intermittently crashed with a tsgolint (typescript-go) panic
`File ../.. has unknown extension` during full-program checking on this
monorepo's cross-package `exports` resolution — a flaky lint gate.

Set `lint.options.typeCheck: false` (the full tsc-style check inside the
linter, which `tsc --noEmit` already covers and which is the path that
panics) while keeping `typeAware: true`. Verified: 10/10 `vp lint` runs clean
(zero panics) and the type-aware rules still fire (only-throw-error,
no-misused-promises), alongside the AST inviolable rules (no-`as`, SDK-ban,
the a11y gate). Re-enable typeCheck when tsgolint stabilises. ADR-0029 updated.

* fix(ci): drop setup-vp (no pnpm on PATH); allowlist test-fixture secret

First CI run surfaced two failures:

- `pnpm: command not found` in every job — `voidzero-dev/setup-vp` installs
  Node + the `vp` CLI but does NOT put `pnpm` on PATH, and this CI is
  pnpm-script orchestrated (pnpm audit, `--filter exec`, restore-prepared,
  pnpm regen). `vp` is a workspace devDep (on node_modules/.bin after install),
  so setup-vp adds nothing here. Reverted ci/release/security + the
  restore-prepared composite to pnpm/action-setup@v6 + actions/setup-node@v6;
  the pnpm scripts still drive vp (build/lint/test/run). Kept `pnpm lint`
  (was eslint) + VITE_GIT_HOOKS=0.
- gitleaks flagged a pre-existing test fixture
  (apps/web/src/server/crypto/__tests__/keystore.test.ts: `test-root-secret-…`,
  a dummy SIGNING_KEY_SECRET) via generic-api-key. Added a narrow allowlist
  regex in .gitleaks.toml (the literal `test-root-secret-…` shape only, so real
  secrets in tests still trip). Verified: gitleaks reports no leaks.

* fix(security): resolve the CodeQL findings surfaced by the reformat

The Oxfmt reformat's large diff made CodeQL attribute 5 pre-existing findings
(2 high, 3 medium) to this PR ("code changes were too large"). Addressed each
on its merits — none are runtime/app code:

- js/insecure-temporary-file (admission-opt.e2e.test.ts): the OPT output
  defaulted to a predictable `/tmp/admission.opt`. Now defaults to a file in a
  freshly-created `mkdtempSync` dir (no symlink/pre-create race).
- js/file-system-race (check-adr-refs.mjs): removed the stat-then-read TOCTOU;
  read directly, then skip oversized text by length.
- js/file-access-to-http + js/http-to-file-access (openehr-fetch-schema.mjs):
  false positives — this dev-only tool's whole purpose is to read repo-pinned
  config (spec.json) and download the pinned openEHR schemas to disk, with every
  path segment validated by `safeSegment`. Added a narrow CodeQL `paths-ignore`
  for that one build script (out of the deployed app's attack surface).

Verified: check:adr OK, openehr-am typechecks, lint clean.

* fix(test): run the Storybook browser project on standalone vitest

The CI "Storybook tests (browser)" job hung to the 15-min timeout under
`vp test --project=storybook`. Root cause: vp bundles its own vitest, but the
browser project loads the standalone `@vitest/browser` / `@vitest/browser-playwright`
(4.1.8) — "Loaded vitest@0.1.24 and @vitest/browser@4.1.8 … Running mixed
versions is not supported", which hangs browser mode at dep-bundling.

Run the `storybook` browser project via the version-matched standalone `vitest`
(the `test-storybook` / `:watch` scripts) instead of `vp test`. The `unit` +
package suites stay on `vp test` (jsdom — no browser-mode version coupling).
Verified locally: 10 files / 28 tests pass in ~8s, clean exit. ADR-0029 noted.
rubentalstra added a commit to rubentalstra/ehrbase-ui that referenced this pull request Jun 11, 2026
…or EHR composition (#52)

* docs: consolidate to greenfield openEHR-native EPD architecture

Replace the contradictory 56-ADR set + drifted architecture doc with one coherent source of truth for the greenfield clean-slate rewrite.

- ADRs: remove old 56; add fresh coherent set 0001-0023 (services + EHRbase boundary, demographic+org service, access/audit/signing, storage+FOLDER, config-driven engine, terminology, operational+ISO13940, content governance, workflow/BPM, imaging/PACS, inbox, medication, clinical UI, roadmap, dev-stack, billing)
- openEHR: local spec mirror docs/openehr/specs (RM/BASE/AM/QUERY/TERM/LANG/CDS/PROC) + INDEX.md; CLAUDE.md rule 17 (validate against mirror)
- architecture.md -> concise overview pointing to the ADRs
- rewrite CLAUDE.md, README.md, IMPLEMENTATION_CHECKLIST.md to match
- billing: jurisdiction-agnostic FHIR-financial framework in v1 (M14, ADR-0023), national claim wires deferred
- delete stale docs (CLINICAL-UI, FOUNDATION-SCOPE, aql-catalogue, v1.x-roadmap, demo-accounts, CDS/PROC impl trackers)

* docs(M1): add canonical openEHR spec map; mark M1 complete

Distilled digest over the local spec mirror (the 5 services, RM building blocks, AQL, AM/templates, TERM, LANG, CDS/PROC, EHRbase boundary). Closes the last M1 checklist item.

* fix(M2): pin BASE to 1.1.0 (wire-coupled to EHRbase 2.31), not 1.2.0

Validation against the packages showed openehr-base/rm are pinned to BASE 1.1.0 (RM 1.1.0 is built on BASE 1.1.0; EHRbase 2.31 implements RM 1.1.0). The earlier 1.2.0 pin came from a pasted 'latest BASE' link, not from wire-coupling. Re-mirror BASE pages at Release-1.1.0; correct ADR-0003, CLAUDE.md, INDEX.md (plan too). Packages unchanged (already 1.1.0).

* feat(M2): add Orthanc PACS to the dev stack (DICOMweb)

Reuse the validated Orthanc infra from feat/orthanc-pacs-dicom-docs-infra, retargeted to the new ADR set (ADR-0017, M11). Adds: compose orthanc service (orthancteam/orthanc:26.6.0), orthanc/config/orthanc.json, platform-db-init/orthanc.sql + migrator bootstrap, and the ORTHANC_* env contract. docker compose config validates; .env.example regenerated. Old ADR-0057/0058 + DICOM-INTEGRATION docs not brought (superseded by ADR-0017).

* fix(openehr-proc): pass line number to DlmParseError (unblocks workspace typecheck)

parse.ts:99 constructed DlmParseError with only the message; the constructor requires (message, line). The message already computes i+1, so pass it. Restores green pnpm typecheck across all 20 packages.

* fix(M2): orthanc healthcheck uses python3; turbo typecheck outputs []

orthancteam/orthanc:26.6.0 ships no curl/wget, so the healthcheck now uses python3
for an authenticated GET /system. Verified by running the stack: Orthanc + DICOMweb
serve and the container reports healthy.

turbo.json: typecheck outputs [] (validation task) clears the 'no output files'
warnings; pnpm typecheck is 20/20 clean.

* docs(M2): mark M2 complete — platform foundation verified

Dev-stack incl. Orthanc verified running; regen + typecheck green.

* fix(M2): register a 'self' DICOMweb server in Orthanc; tidy config comments

Orthanc Explorer's DICOMweb-*client* page showed 'No DICOMweb server is configured'.
Add a 'self' peer (Orthanc -> its own /dicom-web) per the official docs so the client
page + STOW push work for dev. The EPD viewer uses Orthanc's DICOMweb *server* via the
BFF and does not depend on this. Verified: /dicom-web/servers -> ['self']; container healthy.

* docs(M3): capture the M3 implementation breakdown (demographic + org service)

From the implementation-level inventory: foundation (patient CRUD + seed-only directory)
vs the ADR-0005 delta (versioned directory + runtime org/role/group CRUD + admin UI).

* feat(M3): organisation runtime CRUD in the demographic directory service

Replace seed-only org/group management with runtime CRUD (ADR-0005): create / get /
list / update / deactivate ORGANISATION + GROUP on DemographicDirectoryService +
the builtin adapter. Ergonomic DTOs map to the RM PARTY snapshot; soft-deactivation
(no hard delete); name/kind/active filters; org-hierarchy parentId.
demographic-core typecheck + 47 tests green (PGlite). Server fns + admin UI are next.

* feat(M3): organisation admin server functions (createServerFn + RBAC)

organisation.functions.ts (client-importable createServerFn contracts) +
organisation.server.ts impl over the directory service. RBAC: reads
['clinician','admin'], writes ['admin']; org/group are workforce reference data
(non-PHI), so RBAC-gated, not on the PHI ATNA path. Named org* to avoid colliding
with the EHR FOLDER directory.functions.ts. Caller-facing DTOs use z.input so
defaulted fields are optional. typecheck 20/20 + 47 demographic-core tests green.

* feat(admin): organisation directory admin UI (M3.1)

Add the org/group management route-group under /admin/organisations: list +
name/active search, create, edit, and logical deactivate, mirroring the patient
admin patterns. Backed by the demographic DIRECTORY service CRUD (ADR-0005);
admin-gated (route gate + server requireRole). ORGANISATION (hospital / dept /
clinic / lab / pharmacy) and GROUP (ward / team) subtypes; actorType is
immutable post-create so the edit form hides the type picker. Wires the route
into the shared nav model so it surfaces in the sidebar + command palette.

* feat(admin): staff + role assignment admin UI (M3.4/M3.5)

Add runtime CRUD for staff PERSONs and their openEHR ROLE assignments to the
demographic directory service (ADR-0005/0007) plus the /admin/staff route-group:
- staff list / create / edit / logical deactivate; the structured HumanName
  round-trips via the stored party snapshot so the admin edits prefix/given/family
- per-staff ROLE management: assign / re-time / end (performer -> org,
  capabilities, validity window). Ending a role is logical (active:false), never a
  hard delete, preserving write lineage.
- auth-subject <-> PERSON link admin (sign-in identity resolves to a clinical
  actor; provenance only, never an access decision -- ADR-0065).
Admin-gated (route gate + server requireRole). Wired into the shared nav model so
it surfaces in the sidebar + command palette. 5 new directory tests (52 total).

* feat(admin): organisation hierarchy tree view (M3.2/M3.3)

Add a List / Hierarchy tab toggle to /admin/organisations. The hierarchy view
nests organisations by parentId (hospital -> department -> ward/team) as a
navigable tree; an org whose parent is absent from the result (e.g. filtered out
by search) renders as a root, so the view is never empty when matches exist.
Read/navigate only -- each node links to the detail page where the parent is
re-assigned (ADR-0005/0007). The tree is an openEHR-specific hierarchy view, not
a DataTable (rule 6a exemption).

* feat(admin): role catalogue picker + organisation roster (M3 polish)

Two M3 admin quality additions:
- Controlled clinical-role catalogue (CLINICAL_ROLE_CATALOGUE in demographic-core,
  ADR-0007/0040): the RoleForm now offers a template picker that prefills the role
  name + default capabilities for the standard personas, with a "Custom role"
  escape hatch (a custom roleKey is still allowed). Display names localized via
  Paraglide (rule 4); machine keys + capabilities live in the package.
- Organisation roster: listOrganisationRoster service method (reverse of
  listStaffRoles) + a roster panel on the org-detail page showing who acts at the
  organisation, each linking to the staff record. Closes the bidirectional
  staff<->org view.
Admin-gated. 1 new directory test (53 total).

* chore(turbo): drop spurious test-task cache outputs; add test:coverage

The `test` task declared outputs ["coverage/**"] but `pnpm test` runs vitest
without coverage, so turbo logged "no output files" for all 16 test tasks on
every run. Set test outputs to [] (matching typecheck/lint) and move the
coverage-output declaration to a dedicated test:coverage task. Also removed the
stale untracked packages/openehr-conformance phantom dir (only .turbo +
node_modules; conformance lives in per-package __tests__/conformance.test.ts).

* chore(adr): remap stale ADR references repo-wide + add integrity guard

The greenfield reset deleted the old 56 ADRs and wrote the fresh 0001-0023 set,
but ~197 code/doc comments still cited the deleted numbers (e.g. ADR-0040). This
remaps every stale cite to its successor, derived from each new ADR's own
"Supersedes (archived)" line: 0040->0007, 0041->0008/0009, 0052/0045/0049->0008,
0034->0013, 0032/0057-0061->0003, 0028/0029/0044->0006, 0037->0010,
0047/0050/0051/0053/0036/0055->0022, 0043->0004, 0064/0065/0031->0005, and the
context-split 0033 (demographic->0005, terminology->0013, FHIR-facade->0021). Also
fixes the broken adr/NNNN-slug.md link paths and rewrites a directory.ts comment
that still described the old open-access model.

docs/adr/** (its "Supersedes" lines cite archived numbers on purpose) and drizzle
migrations (content-hashed; frozen history) are intentionally left untouched.

Adds scripts/check-adr-refs.mjs + `pnpm check:adr`, wired into the CI lint job: it
fails if any tracked file outside docs/adr + migrations cites an ADR number or an
adr/ link that does not resolve to an existing docs/adr/NNNN-*.md, so a dangling
reference can never be committed again.

* feat(access): policy decision point core (M4a)

Add the BFF PDP (ADR-0008) as a pure, side-effect-free decision function
(apps/web/src/server/access/policy.ts): given actor + action + resource
sensitivity + the derived treatment relationship + what the session has already
established (declared reason / break-glass grant), it returns the access effect —
allow / reason-required / break-glass / deny. Care-first: a clinician is never
hard-denied (worst case is a one-tap reason or a break-the-glass confirm); deny is
reserved for a principal with no clinical/admin standing. Exhaustive decision-table
test (10 cases). The relationship engine + PEP wiring into callEhrbase follow next.

* docs: dev demo accounts reference + fix ABAC capability-row ADR link

Add DEV-ACCOUNTS.md: the 9 dev Keycloak logins (username + password + realm role +
linked staff PERSON / seeded ROLE) so the seeded surfaces are easy to test.
Dev-only fixtures (keycloak/config + the demo-directory seed); excluded from prod.

Also point the EHRBASE-CAPABILITIES ABAC row at ADR-0008 (access control) instead
of ADR-0009 (audit) — the old combined ADR-0041 split into both, and the repo-wide
remap had sent this access-control row to the audit successor.

* feat(access): relationship engine + PEP on the EHRbase choke point (M4a)

Wire the PDP into callEhrbase as the BFF PEP (ADR-0008). A patient-scoped call now
derives the treatment relationship (access/relationship.server.ts) and runs the
policy: no clinical/admin standing -> hard deny (conflated 404, §10); a clinician
with a relationship or an admin -> allow; a clinician without one -> access still
PROCEEDS (care-first, never blocked) tagged as a heightened-audit tier; a RESTRICTED
record -> break-the-glass (428; the sensitivity source lands in M4b). The PEP fails
OPEN on a relationship-derivation infra error.

The relationship engine OWNS the established-access declaration store (the Valkey
marker + the access_reason row within the rolling day); the reason-for-access flow
(access-reason.server) now reads/writes through it instead of a duplicate inline
check (rule 16). 4 new relationship tests (18 access-module tests total).

* feat(access): break-the-glass + openEHR-native sensitivity tier (M4b)

Complete the PDP's RESTRICTED tier (ADR-0008):

- Sensitivity is stored openEHR-NATIVELY in EHR_STATUS.other_details (in EHRbase),
  NOT in EHR_ACCESS (an abstract, never-finished placeholder the openEHR SEC group
  explicitly says not to use) and NOT in an app table. EHRbase has no ABAC, so the
  BFF PDP enforces (SMART-on-openEHR style) while the LABEL lives in the EHR for
  portability + AQL-queryability. The other_details ITEM_TREE round-trip is
  live-confirmed against EHRbase 2.31. The PEP reads it via a DIRECT, non-recursive
  fetch (cached in Valkey); the admin write is a read-modify-write with If-Match
  (sensitivity-admin.server.ts, split out to avoid an import cycle with the PEP).

- Break-the-glass: a clinician opening a RESTRICTED record with no relationship must
  grant break-glass — durable evidence in access_reason (kind='break-glass', new
  audit migration) + a strong BTG-coded ATNA event + a 1h marker. The PEP returns
  428 BREAK_GLASS_REQUIRED until granted.

- The PEP resolves relationship + sensitivity + break-glass concurrently, each
  failing open (care is never blocked). 10 new access tests (24 total). The deep
  EHR_ACCESS / SMART-on-openEHR research is recorded in the module headers.

* feat(access): break-glass + confidentiality UI + access-review sampling (M4b.2)

The UI + server-fn layer over the M4b access tiers (ADR-0008):
- access.functions/server: evaluateAccessGate (the PDP mirrored for the UI gate —
  allow / reason / break-glass), grantBreakGlass (clinician), get/setEhrSensitivity
  (admin), listAccessReview (audit-reviewer sampling).
- PatientAccessGate now mirrors the PDP: it shows the reason modal, the new
  BreakGlassModal for a RESTRICTED record, or renders the chart; fails open (care is
  never blocked).
- Admin: a confidentiality (RESTRICTED) toggle on the patient detail that writes the
  label into EHR_STATUS.other_details (openEHR-native).
- /access-review: the retrospective-sampling surface (audit-reviewer / admin)
  listing reason + break-glass declarations; wired into the shared nav.
28 access + gate tests pass; typecheck + lint clean.

* feat(access): consent flags (EHR_STATUS) + record write-lock + review modal (M4c)

openEHR-native consent/lifecycle enforcement (ADR-0008; RM 1.1.0 EHR_STATUS):
- The PDP now denies CONTENT writes to a write-locked record
  (EHR_STATUS.is_modifiable=false) -> 423 RECORD_LOCKED. Reads still pass; the
  EHR_STATUS itself stays modifiable so an admin can unlock. is_queryable
  (population-query opt-out) is enforced by EHRbase's AQL natively, so it is a
  set-only control, not re-checked in the PEP.
- The PEP reads sensitivity + modifiable from EHR_STATUS in ONE direct, cached
  fetch (readEhrStatusFlags). A shared EHR_STATUS read-modify-write
  (ehr-status-write.server.ts, If-Match) backs both the sensitivity label and the
  consent flags (rule 16 — no duplicated boilerplate).
- Admin: a "Consent & lifecycle" card on the patient detail toggles is_queryable
  (opt-out) + is_modifiable (lock), written natively to EHR_STATUS.
- Access-review rows now open a detail dialog with the full declaration.

The consent DOCUMENT (an openEHR consent COMPOSITION, IHE BPPC/APPC) is authored via
the composition/form engine (M6); this commit lands the enforceable flag layer.
30 access tests pass; typecheck + lint clean.

* feat(crypto): OpenPGP ATTESTATION signing + software keystore (M4d)

The openEHR signing layer (ADR-0010; RM common.html — ATTESTATION.proof is "a digital
signature ... generated using the openPGP"):
- canonical-json.ts: a deterministic, key-sorted JSON serialization — the exact bytes
  a signature is computed over, closing openEHR's "serialization TBD".
- signing.server.ts: RFC-4880 detached sign/verify over the Canonical JSON via
  openpgp.js (6.3.1, the sanctioned scoped exception to @noble), Ed25519 keys,
  armored. Live round-trip validated (generate/sign/verify/tamper) — rule 16.
- attestation.ts: builds an RM ATTESTATION wrapping the proof; change_type
  'attestation' = openEHR audit_change_type 666, spec-verified in the TERM mirror.
- keystore.server.ts + signing_key table: the v1 software keystore — one keypair per
  signer (sub <-> PERSON), private key armored + passphrase-protected with the
  passphrase derived (HKDF, @noble) from SIGNING_KEY_SECRET, never stored. signAs /
  verifyAs wrap the primitives. eIDAS/HSM is the M15 upgrade.

The migration also drops the dead recent_patient_view table (pre-existing schema
drift from the removed feature — no code references it). 12 crypto tests pass;
typecheck + lint + env-contract + ADR guard green.

* test(crypto): ATTESTATION tests + signing self-test tool; mark M3+M4 done

- attestation.test + keystore.test: cover the ATTESTATION builder shape (change_type
  666, committer external_ref, DV_EHR_URI items, is_pending) + the full keystore
  sign/verify round-trip with REAL openpgp (sign -> verify -> tampered-fail ->
  idempotent key). 19 crypto tests total.
- Workbench /workbench/signing self-test: sign a payload with your OpenPGP key,
  verify the proof, and show the openEHR ATTESTATION — the dev diagnostic for the
  signing layer (production signs content transparently on commit, M6+).
  Live-verified via Playwright: "Signature verified" + a spec-conformant ATTESTATION
  (change_type 666, committer, proof). signing.server now logs the cause if signAs
  fails (e.g. SIGNING_KEY_SECRET unset) instead of swallowing it.
- docs/IMPLEMENTATION_CHECKLIST.md: M3 + M4 marked complete (both live-verified), with
  the documented deferrals — consent COMPOSITION + wiring signing to content -> M6+.

* fix(dev): quiet dev-stack startup noise — token, hydration, route warnings

Four root-cause fixes for the noisy `pnpm dev` output:
- Keycloak token refresh failing every idle session: the dev realm's lifespans
  were far too short (accessTokenLifespan 5m, ssoSessionIdleTimeout 30m) so a dev
  session idled out and the refresh token died. Bumped to 30m / 8h idle / 24h max
  in ehrbase-realm.json (+ applied to the running realm). The handled stored-token
  fallback now logs concisely at warn (it is an expected branch, not an ERROR).
- Hydration mismatch on <html>: next-themes sets the theme class/color-scheme
  before hydration, so add suppressHydrationWarning on <html> (next-themes guidance).
- "does not export a Route" warnings: role-picker.stories.tsx + encounters.stories.tsx
  were colocated under routes/. Moved both stories (and their components) to
  src/components/, matching the app-sidebar/patient-banner convention.
- Code-split warnings: RolePicker + EncountersList were named exports of their route
  files. Relocated the components to src/components/; the route modules now export
  only `Route`. Also added `stories` to routeFileIgnorePattern as defence-in-depth.

* feat(operational): M5a.1 — ISO 13940 episode/encounter store + server fns

The app-owned operational layer openEHR does not model (PROC Task Planning §2.2.2:
the spec "does not try to directly address … bookings for appointments … assumes
that the existing systems … will manage to get patients to intended appointments").
It is the organizing layer over the EHR and LINKS to openEHR rather than duplicating
it: an encounter ↔ COMPOSITION.context (EVENT_CONTEXT) once a composition exists
(compositionUid, M6); an episode ↔ an EHR FOLDER (folderUid, M6).

- app schema: `episode` + `encounter` tables (status enums, indexes incl. the
  performer/ehr/status index the M5a.2 relationship lookup keys on). Rule 2: only
  operational fields — opaque ehrId/dept-org/staff ids, an openEHR `setting` code,
  an operational location string. No patient identifiers, no clinical free-text.
- operational/store.server.ts: pure data layer (createEpisode/listEpisodes/
  closeEpisode, createEncounter/listEncountersByEhr/updateEncounterStatus with
  end-time stamping, and hasActiveEncounter — the M4 treatment-relationship signal).
- operational.functions.ts + .server.ts: server fns with requireRole RBAC, the
  partyId→ehrId resolution (rule 15), and an IHE ATNA event keyed on the patient EHR
  before every return on success AND failure (rule 1, ADR-0009). settingCode is
  validated against the openEHR TERM `setting` code-set from the local mirror (rule 17).
- tests: 10 store tests against real SQL (PGlite + drizzle-kit pushSchema, zero DDL
  drift) + 8 schema-contract tests (setting-code/status validation). 18 total.

* feat(access): M5a.2 — wire the encounter source into the relationship engine

Closes the M5 seam left in M4a: an active encounter (planned / in-progress)
performed by the actor's staff PERSON is now a treatment relationship → zero-friction
access (no reason prompt), per the care-first model (ADR-0008).

- deriveRelationship gains an `actorStaffId` param + an ENCOUNTER source (checked
  before the established-access source; strongest first). An encounter-lookup error
  degrades to the declaration source — care is never blocked.
- actor-staff.server.ts: resolve the authenticated actor → demographic staff PERSON
  id via resolveSessionActorContext, Valkey-cached (positive + negative) on the PEP
  hot path.
- PEP (call-ehrbase) resolves the staff id (fail-open null) and passes it through;
  the UI gate (evaluateAccessGate) now routes through the SAME deriveRelationship
  instead of a private hasDeclaredAccess check — one source of truth for UI + PEP.
- relationship tests: encounter source matches, is skipped when unlinked, and
  degrades to declaration on a lookup error. 39 access/operational tests pass.

* feat(operational): M5a.2 — encounter UI + zero-friction demo seed

Completes M5a: the operational encounter surface + the demo seed that makes the
care-first relationship observable.

- OperationalEncounters component (patient Encounters tab): lists active/planned
  encounters (setting rubric from the openEHR TERM `setting` code-set, location,
  status, started) + a "Start encounter" dialog that self-assigns the acting
  clinician (the realistic "I'm seeing this patient" flow — assigning ANOTHER
  clinician is the M5b ADT path) + complete/cancel transitions. Recorded
  (composition) encounters render below it. Rule 4/6a/10/15; empty + loading states.
- createEncounterImpl defaults the performer to the actor's staff PERSON when none
  is given — that is what establishes the zero-friction relationship.
- Demo seed (rule 14): the first demo patient gets an open episode + an active
  encounter performed by dev-physician's staff, so signed in as dev-physician that
  patient opens with NO reason prompt while others still ask. Idempotent; seed-state
  hash bumped (v3) so it runs on existing stacks. DEV-DEMO-DATA.md updated.
- 95 operational/access/functions tests pass; typecheck + lint + i18n check clean.

* docs(checklist): M5a shipped (episode/encounter + care-first relationship)

* feat(operational): M5b — ADT (admit/transfer/discharge) + ward/bed board

The inpatient operational layer on top of the M5a encounter model. App-owned (openEHR
defers ADT — PROC §2.2.2); links to openEHR: a ward is a demographic GROUP (kind
'ward', ADR-0005), a bed is an operational resource, an admission is an inpatient
encounter, and bed occupancy is DERIVED (an active encounter referencing the bed).

- schema: `bed` table (belongs to a ward GROUP) + `encounter.bed_id` + occupancy
  index; `encounter.patient_party_id` (opaque, rule 15) so the board resolves the
  occupant name + links to the patient without an ehrId→subject reverse lookup.
- store: bed CRUD, occupancy (isBedOccupied / listActiveEncountersByBedIds), transfer
  (setEncounterBed). Admission reuses createEncounter (bedId + attending + inpatient
  setting); discharge reuses updateEncounterStatus → 'completed' (bed frees).
- server fns: listWards (GROUP kind 'ward'), listWardBeds (occupancy + resolved
  patient/attending names), admitPatient (admit-and-assign — attending defaults to the
  acting clinician), transferPatient, dischargePatient. RBAC + ATNA on every access.
- UI: /wards board (rule 6a DataTable) — occupancy + admit (reuses PatientSearch +
  listStaff), transfer, discharge, patient links. Nav entry (clinician/admin).
- seed (rule 14): Ward A + 4 beds + the 2nd demo patient admitted to Bed 1; idempotent
  (hash v4). 13 store tests (incl. ADT occupancy/transfer/discharge).

* feat(operational): M5c — scheduling (appointments) + complete M5

An appointment IS a PLANNED encounter with a (future) startTime, so M5c adds almost
no write path: booking reuses createEncounter (status='planned'), check-in/cancel
reuse updateEncounterStatus. App-owned (openEHR defers appointment booking — PROC
§2.2.2). Completes the M5 operational backbone (episode/encounter + ADT + scheduling),
all on one encounter model.

- store: listScheduledEncounters({performerStaffId?}) — planned encounters, soonest
  first, NULL startTime (waitlisted) last; optionally scoped to one clinician.
- server fn: listSchedule (mine|all; resolves patient + clinician names + ATNA).
- UI: /schedule board (rule 6a DataTable) — mine/all switch, book dialog (PatientSearch
  + clinician + datetime + setting → createEncounter planned), check-in (→ in-progress)
  + cancel (→ cancelled). Waitlist = a planned encounter with no time. Nav entry.
- seed (rule 14): a +24h appointment for the third demo patient (hash v5).
- checklist: M5 complete. 22 operational tests (+ schedule listing).

* fix(operational): use relative imports in store.server for the dev-seed CLI

The dev-seed CLI runs under raw node, where the @/ tsconfig path alias does not
resolve; the store is in the seed's import graph (operational seed), so it must use
relative imports like the rest of the seed graph (demographics/ehrbase/state).

* docs(m6): openEHR spec-conformance audit of the form engine (ENG-001..047)

Validate the existing template->Zod->FieldRenderer->FLAT pipeline against the local
spec mirror (RM 1.1.0 / AM, rule 17). Three-area audit (data types, data structures +
entries, cardinality + FLAT) → ~50 triaged findings with spec citations + status
(CONFIRMED / VERIFY / ADR). 'EHRbase requires X' claims cross-checked against real
accepted FLAT fixtures (rule 16) — e.g. DV_ORDINAL FLAT is |code+|ordinal+|value,
verified vs ncd.flat.json. Includes a 5-wave remediation order.

* fix(m6): conformance wave 1 — container types, cardinality, duration, boolean i18n

First batch of confirmed, low-risk spec-conformance fixes from the M6 engine audit
(docs/M6-ENGINE-CONFORMANCE.md), each validated against the local spec mirror:

- ENG-004/005: add ACTIVITY + ISM_TRANSITION to CONTAINER_RM_TYPES (RM ehr.html Entry
  package) — they recurse into children; before, every INSTRUCTION/ACTION form rendered
  the mandatory sub-node as a disabled placeholder.
- ENG-007: enforce the finite array upper bound in withCardinality (AM Multiplicity_
  interval) — .max(max) for bounded max>1; -1 stays unbounded.
- ENG-022: validate DV_DURATION against ISO 8601 in the Zod schema (RM data_types
  §7.2.5; allows leading '-' and weeks; empty = untouched optional).
- ENG-040: DV_BOOLEAN read-only renders via m.common_yes()/m.common_no() (rule 4).

Tests: ENG-007 (bounded/unbounded arrays) + ENG-022 (valid/invalid durations) in
web-template.test.ts. 21 pass; typecheck + lint clean.

* fix(m6): conformance wave 2 — DV_ORDINAL + DV_CODED_TEXT FLAT completeness

ENG-001/002 from the engine audit. The FLAT converter emitted only |code for an
ordinal and put the code in the |value slot for a static coded text — incomplete vs
RM data_types §6.2.4/§5.2.4 and vs the real EHRbase-accepted FLAT (ncd.flat.json:
`…/protein|code` + `|ordinal` + `|value`; op-consult.flat.json: `setting|code` +
`setting|value`).

- DV_ORDINAL: emit |code (symbol code) + |ordinal (Integer rank) + |value (rubric),
  looked up from the template input list ({value,label,ordinal}).
- DV_CODED_TEXT (static closed list): emit |code + |value (rubric); a value not in
  the list (open/free text) emits |value only.
- Bidirectional: flatToFormState maps only |code back to the scalar code string
  (|ordinal/|value are template-derived on write), preserving the round-trip.

Verified vs spec + the real seed FLAT fixtures + round-trip tests (new-types.test.ts,
71 pass). typecheck + lint clean.

* fix(m6): live FLAT round-trip harness + the round-trip bugs it caught

Add a gated (FORM_E2E=1) live harness that round-trips every seeded composition through
the engine (flatToFormState → formStateToFlat) and POSTs to the real EHRbase. First run
caught the engine's edit path broken on 7/8 real templates. Fixed the two highest-impact:

- ENG-050: CODE_PHRASE (the inContext language/territory COMPOSITION fields) was dropped
  on write — EHRbase emits it with inputs:null, so the converter treated it as an empty
  container. isLeaf now treats CODE_PHRASE as a leaf; its {code,terminology} round-trips
  via the composite path. Fixes COMPOSITION.territory existence 1..1 on 5/7 templates.
- ENG-002b: a coded value is always a code → DV_CODED_TEXT/DV_ORDINAL always emit |code
  (+ |value rubric / |ordinal from the template list, |terminology from the input). The
  earlier "not in list → |value" branch put a code in the rubric slot.

Result: live round-trips go 1/8 → 5/8. Remaining (tracked ENG-051/052/053): IPS
medication, op-consult multimedia (→ M6a storage), deterioration total_score. 72 flat
unit tests pass; typecheck + lint clean.

* fix(m6): FLAT round-trip — scalar DV_COUNT bare + DV_MULTIMEDIA data/uri preserved

Two more live-harness findings, each verified against real EHRbase-accepted FLAT:

- ENG-053: a scalar DV_COUNT is a BARE key, not |magnitude (real ereact-deterioration
  `…/news2_score/total_score`). FLAT_SCALAR_SUFFIX['DV_COUNT']=null; the round-trip is
  now symmetric (read consumed bare → write emits bare). Composite DV_COUNT (a
  magnitude-suffix input) still goes through the record path.
- ENG-052: DV_MULTIMEDIA dropped |data/|uri on round-trip (only name/size/mediatype),
  failing the Not_empty invariant (op-consult `…/content|data`). MULTIMEDIA_FLAT_KEYS +
  dvMultimediaSchema now preserve data + uri (descriptor fields made optional).

Live round-trips: 5/8 → 7/8. Unit tests updated to the real-data-confirmed shapes
(72 flat + 21 web-template pass). Only IPS remains (ENG-051: ELEMENT-choice + INSTRUCTION
medication — the choice-element ADR). typecheck + lint clean.

* refactor(m6): streamline app-sidebar and enhance TypeScript support in package.json

* fix(m6): FLAT round-trip 8/8 — bare scalars + DV_IDENTIFIER/DV_PARSABLE bare-primary

The live harness drove the engine's edit/round-trip to pass for ALL 7 seeded templates
incl. the kitchen-sink International Patient Summary. Three more findings, each verified
against the real EHRbase-accepted FLAT (rule 16):

- ENG-054: a scalar leaf is a BARE key — scalarSuffix is now input-driven (the |suffix
  comes from the input's `suffix`; a suffix-less input → bare). The old per-rmType
  value/magnitude table emitted |value/|magnitude that EHRbase rejected ("Could not
  consume Parts": IPS booleans/uri, deterioration counts).
- ENG-055: DV_IDENTIFIER.id and DV_PARSABLE.value are the BARE key (others |suffix) —
  `order_id:0` + `|type`, `timing` + `|formalism`. The composite path emitted |id/|value
  and the read dropped the bare seed key → existence 1..1 failed. BARE_PRIMARY_ATTR
  handles both bidirectionally.
- ENG-052b: DV_MULTIMEDIA external bare-URI + |alternatetext (IPS `multimedia_value`)
  now preserved (op-consult's |data already covered).

The 474 dropped `_`-prefixed keys are PARTICIPATION/health_care_facility — workflow/
context-managed (optional; EHRbase tolerates absence). 72 flat + 21 web-template unit
tests pass; typecheck + lint clean; live harness 8/8.

* fix(m6): conformance wave 1-rest — structured DV_DURATION read + leaf-helper DRY

- ENG-023: structuredToFormState returned { value: "P1Y…" } for a DV_DURATION instead
  of the scalar ISO string, because structured.ts had its OWN isScalarLeafNode that
  ignored the SCALAR_OVERRIDE (and had also diverged on CODE_PHRASE-as-leaf, ENG-050).
- Eliminated the duplicated leaf detection (rule 16): structured.ts now imports the
  single canonical isLeaf / isScalarLeaf from convert.ts, so the STRUCTURED read stays
  in lock-step with the FLAT path. Added a structuredToFormState DV_DURATION test.

73 flat tests pass; typecheck + lint clean.

* docs(m6): resolve Wave 4 — DV_SCALE unsupported by EHRbase 2.31 (live-verified)

Verified the unmapped rmTypes against the real pinned EHRbase 2.31 instead of guessing
their wire format (rule 16): DV_SCALE is rejected at template upload ('Unsupported type
DV_SCALE') so the engine's z.never sentinel is correct (no dead code); DV_INTERVAL is
supported + already container-handled (tested); DV_STATE isn't in EHRbase's
UNSUPPORTED_RM_TYPES but has no real template to verify (tracked); ITEM_TABLE is
EHRbase-unsupported. No implementation needed for the 2.31 pin.

* fix(m6): conformance wave 1-rest — DV_DATE/DV_DATE_TIME timezone correctness

ENG-020/021: the date inputs lost timezone data on edit (RM data_types §7.2).
- ENG-021: DV_DATE used Date.toISOString() (UTC) → off-by-one across the UTC
  boundary. Now localDateString() formats the local Y/M/D the clinician picked.
- ENG-020: DV_DATE_TIME re-emitted `${wall}:00`, discarding the original value's
  seconds + timezone offset on every edit. Now applyDateTimeTail() preserves the
  original tail (seconds/fraction/offset, incl. Z) across a datetime-local edit.

Logic extracted to a pure, unit-tested module (datetime-flat.ts); 7 tests cover the
offset/Z/seconds/fresh/empty cases. typecheck + lint clean.

* docs(m6): pin the ITS-REST simSDT/FLAT spec into the local mirror (ENG-047)

Rule 17 could not be applied to FLAT-grammar changes — the ITS-REST spec (incl. the
Simplified Data Template / simSDT FLAT format the form engine reads+writes) was
referenced (1.0.3) but not mirrored. Added
docs/openehr/specs/ITS-REST/simplified_data_template.html + INDEX.md entry. The spec
confirms the territory|code + language|terminology CODE_PHRASE pattern (ENG-050); it
is high-level, so per-rmType FLAT key conventions remain EHRbase-implementation-defined
and verified against real accepted FLAT (the live harness + fixtures).

* docs(m6): final conformance disposition — Waves 1-5 addressed, harness 8/8

Record the LOW-item dispositions: ENG-024 resolved by the bare-id fix (schema stays
lenient by design), ENG-046 covered by the IPS live round-trip, and ENG-028/041-045
deferred-LOW with rationale (UX/edge/interop-era). Every HIGH/MED finding is fixed +
tested; the engine is validated against the local spec mirror AND live EHRbase 2.31.

* docs(openehr): mirror the full ITS-REST 1.0.3 spec set (not just SDT)

Add the remaining STABLE ITS-REST 1.0.3 pages to the local mirror so rule 17 covers the
whole REST surface EHRbase exposes, not only the FLAT/SDT format:
- ITS-REST/overview.html   (APIs overview)
- ITS-REST/ehr.html        (EHR API — /ehr, /composition, /directory, /contribution, …)
- ITS-REST/query.html      (Query API — /query/aql + /definition/query)
- ITS-REST/definition.html (Definition API — archetypes, templates, OPTs, stored queries)
(simplified_data_template.html / SDT was added previously.) INDEX.md now lists all five
with their STABLE/DEVELOPMENT status. The OAS 3.0 YAML (TRIAL) stays in
packages/openehr-its-rest/openapi/ (orval codegen, ADR-0003) — referenced, not duplicated.

* fix(openehr): update DV_TEXT handling in tests to reflect suffix-less input format

* docs(openehr): mirror CNF + SM specs; ADR-0024 — CNF/SM are reference-only, not packages

Mirror the openEHR Conformance (CNF, development) + Service Model (SM, development)
spec pages and the All-Components catalogue into the local mirror (rule 17), and
record ADR-0024: CNF/SM get no openehr-* package — ITS-JSON publishes schemas only
for AM/BASE/RM and ITS-BMM only for AM/BASE/LANG/RM/TERM, so there is no codegen
source. CNF is conformance methodology (realised in the test harness); SM is the
abstract service model already bound concretely by openehr-its-rest (ADR-0004/0005).
Bump the ADR range in CLAUDE.md to 0001–0024.

* docs(conformance): CNF + SM platform audit — already conformant, no rewrite; 3 milestone-scoped gaps

Audit the platform against the openEHR Conformance (CNF) + Service Model (SM) specs
(now mirrored, ADR-0024). Conformance target is the ITS-REST surface (CNF guide
§3.3/§4.1), which we already build on, so the service decomposition, versioning,
identifier, logical-delete and audit conventions already match the stable, citable
SM + CNF requirements (CORE fully, STANDARD mostly). SIM-B/SDF/sJDT are
DEVELOPMENT-stage and not EHRbase-wire-coupled — explicitly not a target (ADR-0012
web-template + FLAT stands). Real gaps are additive and milestone-scoped:
CSM-001 atomic multi-version CONTRIBUTION commit (M10), CSM-002 composition
version-history/at-time reads (M6/M8), CSM-003 one-EHR-per-subject guard (verify live
then small fix). No major rewrite warranted.

* docs(conformance): fix wrapped '+ FLAT' mangled to a list item by prettier

* feat(storage): SeaweedFS document store (ADR-0025) + Mermaid architecture model

M6 document-store tier (ADR-0011 tier (c)) now uses SeaweedFS, not a Postgres bytea
blob — a real object store, off the clinical DB. Keeps the swappable StorageBackend
seam: seaweedfs-backend.server.ts speaks the filer HTTP API (POST/GET/DELETE,
live-verified), upload.server.ts decides inline (<=256 KiB -> DV_MULTIMEDIA.data) vs
offload (-> uri = document:<id>). New seaweedfs service in docker-compose (pinned
chrislusf/seaweedfs:4.32, health-gated) + SEAWEEDFS_FILER_URL env. ADR-0025 supersedes
ADR-0011 tier (c) (accepts +1 container as the cost of not bloating Postgres);
references updated (ADR README, CLAUDE.md, REFERENCES.md, .env.example).

architecture.md's ASCII "Layered model" -> a maintainable Mermaid flowchart (renders
in GitHub/IDE, diffs in PRs) with ADR tags + the EHR<->Demographic, EHR<->SeaweedFS
and Operational<->EHR links.

* feat(m6): wire DV_MULTIMEDIA upload end-to-end + audited blob-read route (B1)

DvMultimediaField now actually uploads: on file-select it POSTs to uploadAttachment
(server-side sniff + EXIF-strip + SHA-256 + inline-vs-SeaweedFS decision) and stores
the resulting DV_MULTIMEDIA descriptor in form-state — small media inline
(DV_MULTIMEDIA.data), large offloaded to the document store (uri = document:<id>).
uploadAttachment takes FormData via an inputValidator passthrough (TanStack Start sends
FormData as multipart natively). New GET /api/document/$id: BFF-audited (IHE ATNA, rule
1) blob read, auth-gated, nosniff/no-store, opaque-id resource (rule 2). Paraglide keys
for the upload states (rule 4).

Verified: 7 storage unit tests (mocked filer) + the live harness now 9/9 — incl. a new
case proving EHRbase 2.31 accepts a document:<id> DV_MULTIMEDIA URI. web suite 842 pass.
Closes ENG-052.

* feat(m6): one-EHR-per-subject guard on provisionEhr (CSM-003)

provisionEhrImpl now checks the linked EHR first and returns it idempotently instead of
POSTing a duplicate — EHRbase 2.31 rejects a second EHR for the same subject
(live-verified; CNF §6.4.2.3 / SM I_EHR_INDEX §7.1), which previously surfaced as an
opaque 502 on retry. createPatientImpl needs no guard (its partyRef.id is freshly
minted, so no EHR can pre-exist).

Tests: new gated live conformance test (ehr-subject-uniqueness-e2e-live, FORM_E2E=1)
proving EHRbase rejects the duplicate + resolves the subject; 2 BFF-guard unit tests
(existing-EHR → no create; none → create). web suite green.

* docs(conformance): close ENG-052 (B1 DV_MULTIMEDIA) + CSM-003 (one-EHR-per-subject)

* feat(adr): extend demographic and operational services with RM-faithful implementations

* feat(adt): openEHR-native admission via episode_institution + reusable OPT pipeline

Replace the custom episode/encounter/bed Postgres tables with openEHR
compositions (ADR-0026). Admit/transfer/discharge author an
openEHR-EHR-ADMIN_ENTRY.episode_institution.v0 (inside COMPOSITION.encounter.v1)
through the existing dynamic compose engine — no hand-written FLAT. The ward
board, occupancy and per-patient admissions are AQL-derived, keyed on archetype
at-codes (language-independent). Drops the episode/encounter/bed tables (app
migration) and operational/store.server.ts; the access relationship engine no
longer reads those tables (declaration-based interim — an ungated open-admission
AQL source is a documented follow-up). Scheduling is parked (PROC/TP is M10).

Add a reusable OPT-build pipeline in @ehrbase-ui/openehr-am: parse an ADL 1.4
archetype, flatten it, fill named slots, add archetypes into unconstrained RM
attributes (e.g. an ENTRY into COMPOSITION.content), and serialize to the
EHRbase OPT XML (OPERATIONAL_TEMPLATE). The C_ARCHETYPE_ROOT operational terms
use the template's primary language while the <ontology> retains every
languages_available, so the template is multi-language (all 15 langs preserved;
English-primary by default). Fixes an ADL 1.4 parser gap (matches {*}) found
against the real CKM archetypes.

Seed the admission template + a demo admission composition. Verified live
against EHRbase 2.31: template load, web-template projection, composition
write/read-back via AQL, and the /wards UI rendering admissions sourced from
compositions (patient names from the demographic service, attending from the
EVENT_CONTEXT participation). Full workspace gate green (834 tests).

* feat(demographic): AOM 1.4 archetype-constraint validator + CKM demographic archetypes

First increment of the openEHR-native demographic rewrite (ADR-0027): the
built-in adapter will validate RM PARTY structures against the CKM DEMOGRAPHIC
archetypes before commit. Adds validateInstance14(archetype, instance, resolve?)
in @ehrbase-ui/openehr-am — a conservative AOM 1.4 constraint validator
(rm_type / existence / cardinality / occurrences / primitive constraints /
C_DV_QUANTITY|ORDINAL|CODE_PHRASE / archetype-slot recursion; ERROR vs
INFO-unchecked so it never raises a false positive). Vendors the 12 core CKM
DEMOGRAPHIC archetypes (ADL 1.4) into packages/demographic-core. Fixes 3 ADL 1.4
parser gaps found against the real archetypes: generic types
(DV_INTERVAL<DV_DATE>), integer-interval isReal misdetection, and multi-line
ARCHETYPE_SLOT includes. 68 tests pass.

* feat(demographic): fully-canonical openEHR PARTY rewrite (ADR-0028)

Replace the FHIR-shaped Party projection + hand-mappings with canonical RM
PERSON/ORGANISATION/ROLE, stored and validated against the vendored CKM
DEMOGRAPHIC archetypes, with forms generated from the archetype AOM.

- Unified VERSIONED_PARTY store + one DemographicProvider keyed by party_type
  + extracted archetype_id (patient person-patient.v0, staff person.v0, org
  organisation.v0); directory service folded in.
- MRN = service-local handle (Option B), not archetype content.
- Archetype-driven form engine (packages/demographic-core/src/form): registry
  -> WebTemplate generator -> existing FieldRenderer + generateFormSchema;
  form-state <-> canonical RM converters; injected AOM 1.4 validator.
- Stripped the identifier/ dir (validators, registry, pseudonymize) and the
  FHIR Party types; audit subject = internal party UUID.
- Rebuilt all consumers + admin UI fresh against canonical accessors; deleted
  the hand-coded admin forms.
- Regenerated the unified Drizzle migration; canonical seed.

Shared form-engine fixes (web-template + field-renderer):
- demographic RM types recognised as containers
- direct-attribute DV leaves (PARTY_IDENTITY.name, ADDRESS.name) collapse
  DV_TEXT|DV_CODED_TEXT alternatives into one labeled leaf
- RM List attributes forced multiple; RM-mandatory details forced min=1
- structural-container materialisation + optional-empty-subtree collapse
- closed DV_CODED_TEXT renders a label-showing Select at any size (never the
  raw at-code)

openehr-am: parseAdl14 allows hyphenated concept ids; validateInstance14
handles C_SINGLE attributes whose instance is a List.

Verified: patient/organisation/staff create + edit driven live (Playwright)
-> canonical RM stored, auto-MRN, EHR provisioned. turbo typecheck/lint/test
green (37/37 tasks).

Specs: docs/openehr/specs/RM/demographic.html, RM/common.html, AM/AOM1.4.html.
Supersedes ADR-0027.

* feat(problem-list): implement patient problem list view and server-side AQL query

* feat(composition): update formState handling and context management for EHR composition

* build: migrate the toolchain to Vite+ (vp) — Vite 8, Oxlint, Oxfmt, vp run (#53)

* build: adopt Vite 8 + Vite+ toolchain, switch formatter to Oxfmt

Phase 0+1 of the Vite+ unified-toolchain migration.

- Vite 7.3.3 -> 8.0.16 (now GA; @tanstack/react-start peers vite >=7 and
  the Vite8+Nitro build break was fixed in Vite core, PR vitejs/vite#21472).
  @vitejs/plugin-react 5->6.0.2 (requires vite ^8), react-start
  1.168.18->1.168.25, react-router ->1.170.15, vitest 4.1.7->4.1.8.
- Add vite-plus 0.1.24 (exact pin) as the monorepo toolchain entry point;
  new root vite.config.ts holds the shared Oxfmt `fmt` block (singleQuote,
  no semi -- mirrors the former prettier.config.js).
- Exclude the pinned openEHR spec mirror (CLAUDE.md rule 17) and all
  packages/*/src/generated/** from formatting; fix the stale paraglide
  ignore path.

Verified green: vite build, tsc typecheck (20/20), regen:check (4/4),
full test suite (20/20), dev server boot.

* style: format entire repo with Oxfmt

One-time cosmetic reformat (quotes / semicolons / wrapping only -- no
logic changes) bringing the whole tree to Oxfmt style via `vp fmt --write`.

The repo was not formatter-clean even against its own prettier.config.js:
packages/* were committed with double-quotes + semicolons, so
`prettier --check .` already flagged ~613 files and Oxfmt ~593 -- the two
formatters agree on ~590, confirming this is a pre-existing cleanup, not an
Oxfmt incompatibility. Generated output and the openEHR spec mirror are
excluded.

* build(lint): re-encode the ESLint ruleset onto Oxlint (vp lint)

Phase 2 of the Vite+ migration. Adds the `lint` block to the root
vite.config.ts, reproducing packages/config-eslint/index.js on Oxlint:

- Rule-namespace map: react-hooks/* -> react/*, jsx-a11y-x/* -> jsx-a11y/*,
  @typescript-eslint/* -> typescript/*, the SDK-ban -> core no-restricted-imports.
- Inviolable rules verified to FIRE via an injected probe: no `as` casts
  (typescript/consistent-type-assertions), the openEHR-SDK import ban with its
  ADR-0003 message, only-throw-error (BFF `Response`/`Redirect` allowlist
  honoured), and the jsx-a11y anchor gate.
- Legal a11y gate (EAA / EN 301 549, architecture §12) reproduced 1:1: all 34
  jsx-a11y-x `strict` error rules at error + the 2 `off` rules; verified against
  the strict severity map and signed off by the a11y-auditor.
- TanStack `<Link to=>` handled via settings['jsx-a11y'].attributes
  (href: ['to','href']) since Oxlint does not honour the old `specialLink` option.
- Type-aware path enabled via the bundled tsgolint (options.typeAware/typeCheck).

`vp lint` is clean across the repo, matching the (clean) ESLint baseline.
ESLint stays installed until the Phase-5 hooks/scripts/CI cutover.

* build(test): run the test suites via `vp test`

Phase 3 of the Vite+ migration. `vp test` is a Vitest passthrough that
discovers the existing vitest.config.ts files unchanged, so the intricate
dual-project setup (jsdom `unit` + Storybook browser `storybook`), v8
coverage, setup files, and the workspace-spanning package include globs are
all preserved — no risky rewrite into the build vite.config.ts (which would
have pulled the Start/Nitro SSR plugins into the test runtime).

- All package + app `test` scripts: `vitest run` -> `vp test run`
  (watch variants -> `vp test watch`, since vp test is non-watch by default).
- Verified: web unit suite 832 passed | 13 skipped (identical to the Vitest
  baseline), openehr-query 99 passed, v8 coverage works, and the full
  `turbo run test` is green (20/20 tasks). vp fmt clean.

vitest + the vitest.config.ts files stay (the configs `import 'vitest/config'`
and vp reuses them); standalone-dep cleanup is deferred to Phase 6.

* build: route dev/build/preview through `vp`

Phase 4 of the Vite+ migration. The app's vite.config.ts (TanStack Start +
Nitro + Paraglide + Tailwind + React plugin chain) runs unchanged under vp.

- apps/web scripts: `vite dev` -> `vp dev`, `vite build` -> `vp build`
  (kept the build-migrate poststep), `vite preview` -> `vp preview`.
- playwright.config.ts smoke webServer: `vite dev` -> `vp dev`.

Verified: `vp build` produces a full client+ssr+nitro production build on
vite 8.0.16 (5.34s); `vp dev` boots DB-less and serves /en/login (200); the
Playwright smoke suite (incl. the WCAG 2.2 AA axe checks) is green booting
vp dev.

* build(toolchain): cut over orchestration, hooks, and CI to Vite+

Phase 5 of the Vite+ migration. Removes the parallel ESLint/Prettier/Husky
stack now that vp lint/fmt/test/build are proven, and wires the workspace
plumbing to vp.

- Remove ESLint (eslint.config.js, packages/config-eslint, 8 devDeps),
  Prettier (prettier.config.js, dep), and Husky + lint-staged (.husky, deps,
  config). .prettierignore stays as Oxfmt's ignore source (vp fmt reads it).
- Scripts -> vp: root lint/format/check = vp lint/fmt/check; apps/web the same;
  root `prepare` = `vp config` (installs .vite-hooks on every install).
- Commit hooks via .vite-hooks (core.hooksPath): pre-commit runs `vp staged`
  (staged block in vite.config.ts: lint --fix + fmt --write on staged files);
  commit-msg keeps commitlint (Conventional Commits) since vp does not lint
  commit messages. `vp config` is idempotent and preserves the commit-msg hook.
- Turbo: drop the per-package `lint` task (vp lint is monorepo-global, run once
  at root); build/typecheck/test/regen/paraglide/e2e tasks + their DAG stay.
- CI: voidzero-dev/setup-vp@v1 replaces pnpm/action-setup + setup-node across
  ci/release/security workflows; the CI lint step is now `vp lint`;
  VITE_GIT_HOOKS=0 skips hook install in CI; dependency-review allow-list drops
  the deleted config-eslint package.

Verified locally: vp lint clean, vp fmt clean, vp staged file-scoped fix works.

* build(orchestration): replace Turborepo with vp run

Completes full Vite+ adoption — the build is no longer Turbo. `vp run` derives
topological package order from the workspace package.json dependencies and runs
the per-package scripts; the codegen → typecheck/test/build ordering is
sequenced via a `codegen` script (regen + paraglide:compile).

- Root scripts: `turbo run X` -> `vp run -r X` / `vp run --filter @ehrbase-ui/web X`;
  new `codegen` = `vp run -r regen && vp run --filter @ehrbase-ui/i18n paraglide:compile`;
  build/typecheck/test depend on it.
- vite.config.ts gains a `run` block. Script result-caching is left OFF on
  purpose: regen/paraglide/build are file generators and vp only archives
  outputs for tasks with explicit `output` globs, so caching the scripts could
  skip regeneration when outputs are absent. Opt in with `vp run --cache`.
- Remove turbo.json, the turbo devDep, and the dead .turbo cache dir;
  .gitignore now points at node_modules/.vite (Vite Task cache).
- Stale "turbo" mentions in CI + test comments updated to vp run.

Verified locally green via vp run: pnpm typecheck (20 tasks), pnpm build
(vite 8 client+ssr+nitro), pnpm test (832 web + all package suites).

* docs(adr): ADR-0029 adopt Vite+ toolchain; update CLAUDE.md + REFERENCES

Phase 6 governance for the Vite+ migration.

- New ADR-0029 — adopt the Vite+ unified toolchain (vp build/dev/test/lint/fmt/
  run/staged/config; Vite 8). Records what it supersedes in ADR-0002 (the
  Vite-7 pin + ESLint/Prettier/Turbo choices) and ADR-0022 (lint/CI), the
  inviolable-rule preservation (no-as / SDK-ban / the EAA a11y gate 1:1 +
  a11y-auditor sign-off), pinning (vite-plus exact, setup-vp @v1), the alpha
  risk acceptance + vp implode rollback, and the vitest.config.ts retention.
- ADR index: add 0029; mark ADR-0002 toolchain/build as superseded.
- CLAUDE.md Versions: Vite 7.3.3 -> 8.0.16, TanStack Start -> 1.168.25,
  Vitest -> 4.1.8, add the Vite+/Oxlint/Oxfmt line, drop the ESLint plugin
  line; monorepo layout + task line now reference vp run; rule 3 cites Oxlint;
  config-eslint removed from the package list.
- REFERENCES.md: vite 8.0.16 + vite-plus/plugin-react rows, Vite+ lint/format
  section (ESLint/Prettier/Turbo removed), vitest 4.1.8, the drift note for
  Vite reversed to "adopted via ADR-0029".

* fix(scripts): run TS dev/ops entrypoints via tsx; Docker prepare hook guard

Surfaced by the live full-stack verification on Node 26. Node 26 only
strip-types TS (it removed --experimental-transform-types), so bare
`node src/.../cli.ts` fails on parameter properties / enums in the import
graph (e.g. openehr-am adl2/parse.ts) with ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX.
This is pre-existing, independent of the Vite+ migration.

- Run the TS entrypoints (seed:dev, db:bootstrap/migrate/setup, env:*,
  build-migrate) via `tsx` (4.22.4, already present as a Vite+ peer; pinned).
  Production still runs the built `.output` bundle, not tsx.
- Dockerfile: ENV VITE_GIT_HOOKS=0 so the root `prepare` script's `vp config`
  (ADR-0029) skips git-hook install in the git-less alpine build image.

Verified end-to-end on the live stack (Node 26): docker build, db:setup,
seed:dev (6 patients / 9 templates / 54 compositions), and the full-stack
auth e2e (10/10, real Keycloak login against the built server).

* fix(lint): disable tsgolint full typeCheck (preview panic); keep type-aware rules

`vp lint` intermittently crashed with a tsgolint (typescript-go) panic
`File ../.. has unknown extension` during full-program checking on this
monorepo's cross-package `exports` resolution — a flaky lint gate.

Set `lint.options.typeCheck: false` (the full tsc-style check inside the
linter, which `tsc --noEmit` already covers and which is the path that
panics) while keeping `typeAware: true`. Verified: 10/10 `vp lint` runs clean
(zero panics) and the type-aware rules still fire (only-throw-error,
no-misused-promises), alongside the AST inviolable rules (no-`as`, SDK-ban,
the a11y gate). Re-enable typeCheck when tsgolint stabilises. ADR-0029 updated.

* fix(ci): drop setup-vp (no pnpm on PATH); allowlist test-fixture secret

First CI run surfaced two failures:

- `pnpm: command not found` in every job — `voidzero-dev/setup-vp` installs
  Node + the `vp` CLI but does NOT put `pnpm` on PATH, and this CI is
  pnpm-script orchestrated (pnpm audit, `--filter exec`, restore-prepared,
  pnpm regen). `vp` is a workspace devDep (on node_modules/.bin after install),
  so setup-vp adds nothing here. Reverted ci/release/security + the
  restore-prepared composite to pnpm/action-setup@v6 + actions/setup-node@v6;
  the pnpm scripts still drive vp (build/lint/test/run). Kept `pnpm lint`
  (was eslint) + VITE_GIT_HOOKS=0.
- gitleaks flagged a pre-existing test fixture
  (apps/web/src/server/crypto/__tests__/keystore.test.ts: `test-root-secret-…`,
  a dummy SIGNING_KEY_SECRET) via generic-api-key. Added a narrow allowlist
  regex in .gitleaks.toml (the literal `test-root-secret-…` shape only, so real
  secrets in tests still trip). Verified: gitleaks reports no leaks.

* fix(security): resolve the CodeQL findings surfaced by the reformat

The Oxfmt reformat's large diff made CodeQL attribute 5 pre-existing findings
(2 high, 3 medium) to this PR ("code changes were too large"). Addressed each
on its merits — none are runtime/app code:

- js/insecure-temporary-file (admission-opt.e2e.test.ts): the OPT output
  defaulted to a predictable `/tmp/admission.opt`. Now defaults to a file in a
  freshly-created `mkdtempSync` dir (no symlink/pre-create race).
- js/file-system-race (check-adr-refs.mjs): removed the stat-then-read TOCTOU;
  read directly, then skip oversized text by length.
- js/file-access-to-http + js/http-to-file-access (openehr-fetch-schema.mjs):
  false positives — this dev-only tool's whole purpose is to read repo-pinned
  config (spec.json) and download the pinned openEHR schemas to disk, with every
  path segment validated by `safeSegment`. Added a narrow CodeQL `paths-ignore`
  for that one build script (out of the deployed app's attack surface).

Verified: check:adr OK, openehr-am typechecks, lint clean.

* fix(test): run the Storybook browser project on standalone vitest

The CI "Storybook tests (browser)" job hung to the 15-min timeout under
`vp test --project=storybook`. Root cause: vp bundles its own vitest, but the
browser project loads the standalone `@vitest/browser` / `@vitest/browser-playwright`
(4.1.8) — "Loaded vitest@0.1.24 and @vitest/browser@4.1.8 … Running mixed
versions is not supported", which hangs browser mode at dep-bundling.

Run the `storybook` browser project via the version-matched standalone `vitest`
(the `test-storybook` / `:watch` scripts) instead of `vp test`. The `unit` +
package suites stay on `vp test` (jsdom — no browser-mode version coupling).
Verified locally: 10 files / 28 tests pass in ~8s, clean exit. ADR-0029 noted.

* ci(licenses): expand allow-list to permissive + weak-copyleft; tsx exception

The license gate false-positived on two legitimate deps:

- openpgp 6.3.1 (LGPL-3.0+) — a weak-copyleft library used for signing
  (ADR-0010). The old allow-list "blocked copyleft by omission", flagging it.
- tsx 4.22.4 — MIT (esbuild-kit/tsx) but the scanner reads a null license.

Expanded `allow-licenses` from 15 to the full OSI PERMISSIVE + WEAK-COPYLEFT
set (67 ids: BSD/MIT/Apache/ISC/Zlib/Unicode/… + LGPL-2/3, MPL-1/2, EPL-1/2,
CDDL, CPL, MS-PL/MS-RL — all safe to consume as libraries from an Apache-2.0
app). Deliberately NOT added: STRONG / NETWORK copyleft (GPL-*, AGPL-*, OSL-*,
RPL-*, RPSL, CPAL, EUPL, SISSL/SSPL) — such a *dependency* would impose its
copyleft on this Apache-2.0 EPD, so it must stay a blocking review finding, not
a silent pass. Added `pkg:npm/tsx` to `allow-dependencies-licenses` for the
null-license false positive. Verified: covers the whole current dep graph
(only LGPL-3.0+ was missing); YAML parses; GPL/AGPL stay excluded.
eleboucher pushed a commit to eleboucher/memini that referenced this pull request Jun 15, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [vite](https://vite.dev) ([source](https://github.com/vitejs/vite/tree/HEAD/packages/vite)) | [`^7.0.0` → `^8.0.0`](https://renovatebot.com/diffs/npm/vite/7.3.5/8.0.16) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vite/8.0.16?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite/7.3.5/8.0.16?slim=true) |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/3) for more information.

---

### Release Notes

<details>
<summary>vitejs/vite (vite)</summary>

### [`v8.0.16`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-8016-2026-06-01-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.15...v8.0.16)

##### Bug Fixes

- **deps:** reject UNC paths for launch-editor-middleware ([#&#8203;22571](https://github.com/vitejs/vite/issues/22571)) ([50b9512](https://github.com/vitejs/vite/commit/50b951225bbf6151eb84a3ad5a454908ab4a76c9))
- reject windows alternate paths ([#&#8203;22572](https://github.com/vitejs/vite/issues/22572)) ([dc245c7](https://github.com/vitejs/vite/commit/dc245c71e5007ea4d891a025e2d69ac96c736546))

### [`v8.0.15`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-8015-2026-06-01-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.14...v8.0.15)

##### Features

- send 408 on request timeout ([#&#8203;22476](https://github.com/vitejs/vite/issues/22476)) ([c85c9ee](https://github.com/vitejs/vite/commit/c85c9eeb9aaf41f477b48b057146887bd5620797))
- update rolldown to 1.0.3 ([#&#8203;22538](https://github.com/vitejs/vite/issues/22538)) ([646dbed](https://github.com/vitejs/vite/commit/646dbedd2870f8ec48df0321177d8aa64bbd1575))

##### Bug Fixes

- capitalize error messages and remove spurious space in parse error ([#&#8203;22488](https://github.com/vitejs/vite/issues/22488)) ([85a0eff](https://github.com/vitejs/vite/commit/85a0eff1c82bbb7c99a0fe8e63704316578a40d3))
- **deps:** update all non-major dependencies ([#&#8203;22511](https://github.com/vitejs/vite/issues/22511)) ([2686d7d](https://github.com/vitejs/vite/commit/2686d7d0b722402204d3bcc687a87adea1bcf9fa))
- **dev:** fix html-proxy cache key mismatch for /@&#8203;fs/ HTML paths ([#&#8203;21762](https://github.com/vitejs/vite/issues/21762)) ([47c4213](https://github.com/vitejs/vite/commit/47c4213f134f562c41ed7c031e4788510cf7e31e))
- **glob:** error on relative glob in virtual module when no files match ([#&#8203;22497](https://github.com/vitejs/vite/issues/22497)) ([5c8e98f](https://github.com/vitejs/vite/commit/5c8e98f8b584ac5d42f0f9b8580c49792213b13c))
- **optimizer:** close the rolldown bundle when write() rejects ([#&#8203;22528](https://github.com/vitejs/vite/issues/22528)) ([e3cfb9d](https://github.com/vitejs/vite/commit/e3cfb9deecff563550fa1b8abd27656b8b292815))
- **resolve:** provide onWarn for viteResolvePlugin in JS plugin containers ([#&#8203;22509](https://github.com/vitejs/vite/issues/22509)) ([40985f1](https://github.com/vitejs/vite/commit/40985f1c09b7696e594e6c5695fbc315d2da2c83))

##### Miscellaneous Chores

- **deps:** update rolldown-related dependencies ([#&#8203;22566](https://github.com/vitejs/vite/issues/22566)) ([3052a67](https://github.com/vitejs/vite/commit/3052a67d9350f4c5076ab1c222c4a21a589cbcdd))

##### Code Refactoring

- correct logic in `collectAllModules` function ([#&#8203;22562](https://github.com/vitejs/vite/issues/22562)) ([6978a9c](https://github.com/vitejs/vite/commit/6978a9ceb942c4f5e211d52b8a1e569f8a65c80c))

### [`v8.0.14`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-8014-2026-05-21-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.13...v8.0.14)

##### Features

- update rolldown to 1.0.2 ([#&#8203;22484](https://github.com/vitejs/vite/issues/22484)) ([96efc88](https://github.com/vitejs/vite/commit/96efc88570b6a6ddf1a910f106920cbac07b3cf0))

##### Bug Fixes

- **deps:** update all non-major dependencies ([#&#8203;22471](https://github.com/vitejs/vite/issues/22471)) ([98b8163](https://github.com/vitejs/vite/commit/98b81632139d51820f82036e58d6fbbf122b77b3))
- **dev:** handle errors when sending messages to vite server ([#&#8203;22450](https://github.com/vitejs/vite/issues/22450)) ([e8e9a34](https://github.com/vitejs/vite/commit/e8e9a34dcf2540139de558a10187630884d10217))
- **html:** handle trailing slash paths in transformIndexHtml ([#&#8203;22480](https://github.com/vitejs/vite/issues/22480)) ([5d94d1b](https://github.com/vitejs/vite/commit/5d94d1bffdb2a15de9341194d89baec86ce1f693))
- **optimizer:** pass oxc jsx options to transformSync in dependency scan                                                            ([#&#8203;22342](https://github.com/vitejs/vite/issues/22342)) ([b3132da](https://github.com/vitejs/vite/commit/b3132dacea9c6e0cf526cd9f0f09d850f577c262))

##### Miscellaneous Chores

- **deps:** update rolldown-related dependencies ([#&#8203;22470](https://github.com/vitejs/vite/issues/22470)) ([7cb728e](https://github.com/vitejs/vite/commit/7cb728eb629cc677661f1bc52a044ffc0b87fc7f))
- remove irrelevant commits from changelog ([2c69495](https://github.com/vitejs/vite/commit/2c69495f250edf01132d4a20128de19dbe836086))

##### Code Refactoring

- **glob:** do not rewrite import path for absolute base ([#&#8203;22310](https://github.com/vitejs/vite/issues/22310)) ([0ae2844](https://github.com/vitejs/vite/commit/0ae2844ab6d6d1ccf78a2975b8132769fc35b302))

##### Tests

- **css:** sass does not use main field ([#&#8203;22449](https://github.com/vitejs/vite/issues/22449)) ([ebf39a0](https://github.com/vitejs/vite/commit/ebf39a04329ddc6ba765e006a5d463680a952270))

### [`v8.0.13`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-8013-2026-05-14-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.12...v8.0.13)

##### Features

- **bundled-dev:** add lazy bundling support ([#&#8203;21406](https://github.com/vitejs/vite/issues/21406)) ([4f0949f](https://github.com/vitejs/vite/commit/4f0949f3f13e4b2b34d32bf7b2b4de5f26bea192))
- **optimizer:** improve the esbuild plugin converter to pass some properties of build result to `onEnd` ([#&#8203;22357](https://github.com/vitejs/vite/issues/22357)) ([47071ce](https://github.com/vitejs/vite/commit/47071ce53f21726cf39e999c4407c4828ecbe957))
- update rolldown to 1.0.1 ([#&#8203;22444](https://github.com/vitejs/vite/issues/22444)) ([8c766a6](https://github.com/vitejs/vite/commit/8c766a6c5ee014969c4e32f29cc265e8e2c96e18))

##### Bug Fixes

- **build:** copy public directory after building same environment with `write=false` ([#&#8203;22328](https://github.com/vitejs/vite/issues/22328)) ([158e8ae](https://github.com/vitejs/vite/commit/158e8ae8efdf7075ab295727e36b5ff68da3243e))
- **css:** await sass/less/styl worker disposal on teardown (fix [#&#8203;22274](https://github.com/vitejs/vite/issues/22274)) ([#&#8203;22275](https://github.com/vitejs/vite/issues/22275)) ([b7edcb7](https://github.com/vitejs/vite/commit/b7edcb7d0dd17ddfeef4ace78d610c099216dade))
- **css:** keep deprecated `name`/`originalFileName` in synthetic `assetFileNames` call ([#&#8203;22439](https://github.com/vitejs/vite/issues/22439)) ([8e59c97](https://github.com/vitejs/vite/commit/8e59c97a44d923c4c06f67287a793c9aa5a4ebaa))
- make `isBundled` per environment ([#&#8203;22257](https://github.com/vitejs/vite/issues/22257)) ([a576326](https://github.com/vitejs/vite/commit/a5763266170f8606836da5c6f987b4b2fd6ddc55))
- **ssr:** avoid rewriting labels that collide with imports ([#&#8203;22451](https://github.com/vitejs/vite/issues/22451)) ([d9b18e0](https://github.com/vitejs/vite/commit/d9b18e0387a253628d3d834288e79c5f7e85d566))

##### Miscellaneous Chores

- remove irrelevant commits from changelog ([#&#8203;22430](https://github.com/vitejs/vite/issues/22430)) ([6ea3838](https://github.com/vitejs/vite/commit/6ea383859aaf0ef8e673b458f164e84aeb6ff51d))
- update changelog ([#&#8203;22413](https://github.com/vitejs/vite/issues/22413)) ([fcdc87c](https://github.com/vitejs/vite/commit/fcdc87cc6799857e2bab0f44f333a681694fff74))

### [`v8.0.12`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-8012-2026-05-11-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.11...v8.0.12)

##### Features

- update rolldown to 1.0.0 ([#&#8203;22401](https://github.com/vitejs/vite/issues/22401)) ([cf0ff41](https://github.com/vitejs/vite/commit/cf0ff4154b26cffbf18541ade1a50818842731d3))

##### Bug Fixes

- **deps:** update all non-major dependencies ([#&#8203;22420](https://github.com/vitejs/vite/issues/22420)) ([2be6000](https://github.com/vitejs/vite/commit/2be6000130e3ae2160acc301baa4f7913fbc1f6e))
- **module-runner:** prevent partial-exports race on concurrent imports of in-flight invalidated re-export chains ([#&#8203;22369](https://github.com/vitejs/vite/issues/22369)) ([f5a22e6](https://github.com/vitejs/vite/commit/f5a22e62ada75286138b7ceb3825e43958ef00e1))
- refer to `rolldownOptions` instead of deprecated `rollupOptions` in messages ([#&#8203;22400](https://github.com/vitejs/vite/issues/22400)) ([b675c7b](https://github.com/vitejs/vite/commit/b675c7b6697423275ad9dd521d3ce7c8679761a0))
- **worker:** apply `build.target` to worker bundle ([#&#8203;22404](https://github.com/vitejs/vite/issues/22404)) ([3c93fde](https://github.com/vitejs/vite/commit/3c93fde21f07d44db7669ca7484f4e7a8767afe5))
- **worker:** forward define to worker bundle transform ([#&#8203;22408](https://github.com/vitejs/vite/issues/22408)) ([d4838a0](https://github.com/vitejs/vite/commit/d4838a0358d9f04a980d4d2ac7263f21a6b28ee2))

##### Miscellaneous Chores

- **deps:** update dependency eslint-plugin-n to v18 ([#&#8203;22423](https://github.com/vitejs/vite/issues/22423)) ([2fe7bd2](https://github.com/vitejs/vite/commit/2fe7bd2d73beb697a3d149e943ac74b768c9d27f))
- **deps:** update rolldown-related dependencies ([#&#8203;22421](https://github.com/vitejs/vite/issues/22421)) ([66b9eb3](https://github.com/vitejs/vite/commit/66b9eb35188007e0e9a1bd03b4be820016cad60b))

### [`v8.0.11`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-8011-2026-05-07-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.10...v8.0.11)

##### Features

- update rolldown to 1.0.0-rc.18 ([#&#8203;22360](https://github.com/vitejs/vite/issues/22360)) ([3f80524](https://github.com/vitejs/vite/commit/3f80524aa1fa40bfa831f1a1bf2641c3979ba396))

##### Bug Fixes

- **deps:** update all non-major dependencies ([#&#8203;22334](https://github.com/vitejs/vite/issues/22334)) ([672c962](https://github.com/vitejs/vite/commit/672c96288fd5440bbecddc65551e713edeb8d403))
- **deps:** update all non-major dependencies ([#&#8203;22382](https://github.com/vitejs/vite/issues/22382)) ([5c0cfcb](https://github.com/vitejs/vite/commit/5c0cfcb83dde2c6e25b6c3215dd622956bf29631))
- **glob:** align hmr matcher options with glob enumeration ([#&#8203;22306](https://github.com/vitejs/vite/issues/22306)) ([30028f9](https://github.com/vitejs/vite/commit/30028f94516fa06dd0212567373169b3b3f6e393))
- make separate object instance for each environment ([#&#8203;22276](https://github.com/vitejs/vite/issues/22276)) ([7c2aa3b](https://github.com/vitejs/vite/commit/7c2aa3b40ba00ce1299e4f31932c7929f179a80a))

##### Documentation

- **create-vite:** list react-compiler templates in README ([#&#8203;22347](https://github.com/vitejs/vite/issues/22347)) ([7c3a61f](https://github.com/vitejs/vite/commit/7c3a61f42da6445904e93f0e29e9a2a838fa684a))
- explain mergeConfig skips null/undefined ([#&#8203;22325](https://github.com/vitejs/vite/issues/22325)) ([2151f70](https://github.com/vitejs/vite/commit/2151f701dc98270c905c540b209fb6d23d53d3ad))
- mention native config loader in CLI options ([#&#8203;22348](https://github.com/vitejs/vite/issues/22348)) ([0420c5d](https://github.com/vitejs/vite/commit/0420c5d37b6049476b6e6c16662be372575dd683))
- update evan's x handle ([640202a](https://github.com/vitejs/vite/commit/640202a2167b0c19b94e4d3b8ff87309ae1f44d0))

##### Miscellaneous Chores

- **deps:** update dependency tsdown to ^0.21.10 ([#&#8203;22333](https://github.com/vitejs/vite/issues/22333)) ([3b51e05](https://github.com/vitejs/vite/commit/3b51e050214c5a817c163838ab8643fe34c7d0c3))
- **deps:** update rolldown-related dependencies ([#&#8203;22383](https://github.com/vitejs/vite/issues/22383)) ([555ff36](https://github.com/vitejs/vite/commit/555ff36de70a43b3b3dc22f958bf78fe75e11d67))
- **deps:** update transitive packages to fix npm audit alerts ([#&#8203;22316](https://github.com/vitejs/vite/issues/22316)) ([86aee62](https://github.com/vitejs/vite/commit/86aee6268aa879d74f68a890392c1dee973ebf05))

##### Code Refactoring

- devtools integration ([#&#8203;22312](https://github.com/vitejs/vite/issues/22312)) ([3c8bf06](https://github.com/vitejs/vite/commit/3c8bf064ec76e311f2d8be3a37dcfdcdd4e4253c))
- remove unnecessary async ([#&#8203;22296](https://github.com/vitejs/vite/issues/22296)) ([b31fd35](https://github.com/vitejs/vite/commit/b31fd355d93eb166573362bd09c07745b9f76755))
- show direct path type in bad character warning ([#&#8203;22339](https://github.com/vitejs/vite/issues/22339)) ([0c162e9](https://github.com/vitejs/vite/commit/0c162e96a6545c93808e7338b9adeca2636596fa))

##### Tests

- **create-vite:** use short help alias ([#&#8203;22389](https://github.com/vitejs/vite/issues/22389)) ([994ab66](https://github.com/vitejs/vite/commit/994ab66bc4dc872278d8353d710ffc4bbd881f8d))

### [`v8.0.10`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-8010-2026-04-23-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.9...v8.0.10)

##### Features

- update rolldown to 1.0.0-rc.17 ([#&#8203;22299](https://github.com/vitejs/vite/issues/22299)) ([a4d06d9](https://github.com/vitejs/vite/commit/a4d06d9015167d30fe8ac63d1ce2edc146cdca31))

##### Bug Fixes

- `hmrClient.logger.debug` and `hmrClient.logger.error` looked different from other HMR logs ([#&#8203;22147](https://github.com/vitejs/vite/issues/22147)) ([a4d828f](https://github.com/vitejs/vite/commit/a4d828f2d5ed85440bc0774eab342e6f9a5e5f62))
- **css:** show filename in CSS minification warnings for `.css?inline` ([#&#8203;22292](https://github.com/vitejs/vite/issues/22292)) ([83f0a78](https://github.com/vitejs/vite/commit/83f0a785a2ae48d6761fb69f4b0523a24ae9342c))
- **optimizer:** allow user transform.target to override default in optimizeDeps ([#&#8203;22273](https://github.com/vitejs/vite/issues/22273)) ([5c7cec6](https://github.com/vitejs/vite/commit/5c7cec69b637544ab16009d8758df7dbbf7f2674))
- remove format sniffing module resolution from JS resolver ([#&#8203;22297](https://github.com/vitejs/vite/issues/22297)) ([b8a21cc](https://github.com/vitejs/vite/commit/b8a21cc821c1434ac9d2b85ec53005df9edc306b))

##### Code Refactoring

- enable some typecheck rules ([#&#8203;22278](https://github.com/vitejs/vite/issues/22278)) ([9437518](https://github.com/vitejs/vite/commit/943751801f70057ae94f9092e349c8f3fd9ccdf2))
- typecheck client directory ([#&#8203;22284](https://github.com/vitejs/vite/issues/22284)) ([40a0847](https://github.com/vitejs/vite/commit/40a0847276502b33a3942b3cfab04b20218f3543))

### [`v8.0.9`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-809-2026-04-20-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.8...v8.0.9)

##### Features

- update rolldown to 1.0.0-rc.16 ([#&#8203;22248](https://github.com/vitejs/vite/issues/22248)) ([2947edd](https://github.com/vitejs/vite/commit/2947edd57ceb64a0b4dc43269743e8e44e68c09b))

##### Bug Fixes

- allow binding when strictPort is set but wildcard port is in use ([#&#8203;22150](https://github.com/vitejs/vite/issues/22150)) ([dfc8aa5](https://github.com/vitejs/vite/commit/dfc8aa5057dd8ec2b1223980d1e2eeb946ac3384))
- **build:** emptyOutDir should happen for watch rebuilds ([#&#8203;22207](https://github.com/vitejs/vite/issues/22207)) ([ee52267](https://github.com/vitejs/vite/commit/ee522672bb374c7ff95a347f14732491121b1cd6))
- **bundled-dev:** reject requests to HMR patch files in non potentially trustworthy origins ([#&#8203;22269](https://github.com/vitejs/vite/issues/22269)) ([868f141](https://github.com/vitejs/vite/commit/868f1411a6f474baa4417f2d6524692dd452f760))
- **css:** use unique key for cssEntriesMap to prevent same-basename collision ([#&#8203;22039](https://github.com/vitejs/vite/issues/22039)) ([374bb5d](https://github.com/vitejs/vite/commit/374bb5d597fcd0485e929565c698d8ed219136f8))
- **deps:** update all non-major dependencies ([#&#8203;22219](https://github.com/vitejs/vite/issues/22219)) ([4cd0d67](https://github.com/vitejs/vite/commit/4cd0d6760edd5fb0841abe86538de3c225e880a1))
- **deps:** update all non-major dependencies ([#&#8203;22268](https://github.com/vitejs/vite/issues/22268)) ([c28e9c1](https://github.com/vitejs/vite/commit/c28e9c12a849f80e6fdc93f42283ad2863ab9dbc))
- detect Deno workspace root (fix [#&#8203;22237](https://github.com/vitejs/vite/issues/22237)) ([#&#8203;22238](https://github.com/vitejs/vite/issues/22238)) ([1b793c0](https://github.com/vitejs/vite/commit/1b793c0e1726467fffd06ffad9bc81c61a840188))
- **dev:** handle errors in `watchChange` hook ([#&#8203;22188](https://github.com/vitejs/vite/issues/22188)) ([fc08bda](https://github.com/vitejs/vite/commit/fc08bdab9bba871b03689f2f6997c3a4ba4351da))
- **optimizer:** handle more chars that will be sanitized ([#&#8203;22208](https://github.com/vitejs/vite/issues/22208)) ([3f24533](https://github.com/vitejs/vite/commit/3f24533ac4845ed22547279d1721bd82a35345e3))
- skip fallback sourcemap generation for `?raw` imports ([#&#8203;22148](https://github.com/vitejs/vite/issues/22148)) ([3ec9cda](https://github.com/vitejs/vite/commit/3ec9cdaac7936ca32d0956c4cb1eb6e172945996))

##### Documentation

- align the descriptions in READMEs ([#&#8203;22231](https://github.com/vitejs/vite/issues/22231)) ([44c42b9](https://github.com/vitejs/vite/commit/44c42b97639bb6ad777e66d752b2829cccb9a27a))
- fix reuses wording in dev environment comment ([#&#8203;22173](https://github.com/vitejs/vite/issues/22173)) ([9163412](https://github.com/vitejs/vite/commit/9163412fdfec7fb1656529713326a5b5c5e986ea))
- fix wording in sass error comment ([#&#8203;22214](https://github.com/vitejs/vite/issues/22214)) ([bc5c6a7](https://github.com/vitejs/vite/commit/bc5c6a7a498845dff20dc410c395355b79a4b753))
- update build CLI defaults ([#&#8203;22261](https://github.com/vitejs/vite/issues/22261)) ([605bb97](https://github.com/vitejs/vite/commit/605bb97994678a1bb70a8de9a85c29d5f5d48c5a))

##### Miscellaneous Chores

- **deps:** update dependency dotenv-expand to v13 ([#&#8203;22271](https://github.com/vitejs/vite/issues/22271)) ([0a3887d](https://github.com/vitejs/vite/commit/0a3887da18812cacb254c616e4dd35631e776fda))

### [`v8.0.8`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-808-2026-04-09-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.7...v8.0.8)

##### Features

- update rolldown to 1.0.0-rc.15 ([#&#8203;22201](https://github.com/vitejs/vite/issues/22201)) ([6baf587](https://github.com/vitejs/vite/commit/6baf587255936e91348cbe624caefd10e8c607ab))

##### Bug Fixes

- avoid `dns.getDefaultResultOrder` temporary ([#&#8203;22202](https://github.com/vitejs/vite/issues/22202)) ([15f1c15](https://github.com/vitejs/vite/commit/15f1c15ac9be343ee4f317fd025c3d67f0c7bd53))
- **ssr:** class property keys hoisting matching imports ([#&#8203;22199](https://github.com/vitejs/vite/issues/22199)) ([e137601](https://github.com/vitejs/vite/commit/e1376018cd516d6970534fce495e24f9ee683ce3))

### [`v8.0.7`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-807-2026-04-07-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.6...v8.0.7)

##### Bug Fixes

- use sync dns.getDefaultResultOrder instead of dns.promises ([#&#8203;22185](https://github.com/vitejs/vite/issues/22185)) ([5c05b04](https://github.com/vitejs/vite/commit/5c05b04db6f3f64af60ff6525eb5f04bc330fbb5))

### [`v8.0.6`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-806-2026-04-07-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.5...v8.0.6)

##### Features

- update rolldown to 1.0.0-rc.13 ([#&#8203;22097](https://github.com/vitejs/vite/issues/22097)) ([51d3e48](https://github.com/vitejs/vite/commit/51d3e48980bf3e352d31ecde49d1aa56859918e0))

##### Bug Fixes

- **css:** avoid mutating sass error multiple times ([#&#8203;22115](https://github.com/vitejs/vite/issues/22115)) ([d5081c2](https://github.com/vitejs/vite/commit/d5081c2f3e73f3fc06956d8cf5f2cf06463c2325))
- **optimize-deps:** hoist CJS interop assignment ([#&#8203;22156](https://github.com/vitejs/vite/issues/22156)) ([17a8f9e](https://github.com/vitejs/vite/commit/17a8f9edfcd3b9344668120a84e3328aeada3c97))

##### Performance Improvements

- early return in `getLocalhostAddressIfDiffersFromDNS` when DNS order is `verbatim` ([#&#8203;22151](https://github.com/vitejs/vite/issues/22151)) ([56ec256](https://github.com/vitejs/vite/commit/56ec25613dba6cc71911f7af6e545ebcb77ec012))

##### Miscellaneous Chores

- **create-vite:** remove unnecessary DOM.Iterable ([#&#8203;22168](https://github.com/vitejs/vite/issues/22168)) ([bdc53ab](https://github.com/vitejs/vite/commit/bdc53ab1e67f7e2e000112eeed9c85413ddb0e9e))
- replace remaining prettier script ([#&#8203;22179](https://github.com/vitejs/vite/issues/22179)) ([af71fb2](https://github.com/vitejs/vite/commit/af71fb26dd15098b9523efc3d8ed04f27553174b))

### [`v8.0.5`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-805-2026-04-06-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.4...v8.0.5)

##### Bug Fixes

- apply server.fs check to env transport ([#&#8203;22159](https://github.com/vitejs/vite/issues/22159)) ([f02d9fd](https://github.com/vitejs/vite/commit/f02d9fde0b195afe3ea2944414186962fbbe41e0))
- avoid path traversal with optimize deps sourcemap handler ([#&#8203;22161](https://github.com/vitejs/vite/issues/22161)) ([79f002f](https://github.com/vitejs/vite/commit/79f002f2286c03c88c7b74c511c7f9fc6dc46694))
- check `server.fs` after stripping query as well ([#&#8203;22160](https://github.com/vitejs/vite/issues/22160)) ([a9a3df2](https://github.com/vitejs/vite/commit/a9a3df299378d9cbc5f069e3536a369f8188c8ff))
- disallow referencing files outside the package from sourcemap ([#&#8203;22158](https://github.com/vitejs/vite/issues/22158)) ([f05f501](https://github.com/vitejs/vite/commit/f05f50173461789e0f1323fe06b51f18ca41c132))

### [`v8.0.4`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-804-2026-04-06-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.3...v8.0.4)

##### Features

- allow esbuild 0.28 as peer deps ([#&#8203;22155](https://github.com/vitejs/vite/issues/22155)) ([b0da973](https://github.com/vitejs/vite/commit/b0da97372f5dba73e78035d1cc7680466ff6cf7f))
- **hmr:** truncate list of files on hmr update ([#&#8203;21535](https://github.com/vitejs/vite/issues/21535)) ([d00e806](https://github.com/vitejs/vite/commit/d00e806d7be15ebbfe7875e9244963d80ee8b142))
- **optimizer:** log when dependency scanning or bundling takes over 1s ([#&#8203;21797](https://github.com/vitejs/vite/issues/21797)) ([f61a1ab](https://github.com/vitejs/vite/commit/f61a1ab33b05dc6f6a7eda6e8bc9c4c5b9aab133))

##### Bug Fixes

- `hasBothRollupOptionsAndRolldownOptions` should return `false` for proxy case ([#&#8203;22043](https://github.com/vitejs/vite/issues/22043)) ([99897d2](https://github.com/vitejs/vite/commit/99897d27b44dd73307fa03e2f11f0baa1a1dc939))
- add types for `vite/modulepreload-polyfill` ([#&#8203;22126](https://github.com/vitejs/vite/issues/22126)) ([17330d2](https://github.com/vitejs/vite/commit/17330d2b9e132460f194d6d4b547cfee7e25c788))
- **deps:** update all non-major dependencies ([#&#8203;22073](https://github.com/vitejs/vite/issues/22073)) ([6daa10f](https://github.com/vitejs/vite/commit/6daa10ff1e8d15a90f49d8dd909ff208da85d6d8))
- **deps:** update all non-major dependencies ([#&#8203;22143](https://github.com/vitejs/vite/issues/22143)) ([22b0166](https://github.com/vitejs/vite/commit/22b016612703320db45c64a2fe44472051ef5ec5))
- **resolve:** resolve tsconfig paths starting with `#` ([#&#8203;22038](https://github.com/vitejs/vite/issues/22038)) ([3460fc5](https://github.com/vitejs/vite/commit/3460fc55aa89aef4103d2c05ac2e446032511a6d))
- **ssr:** use browser platform for webworker SSR builds (fix [#&#8203;21969](https://github.com/vitejs/vite/issues/21969)) ([#&#8203;21963](https://github.com/vitejs/vite/issues/21963)) ([364c227](https://github.com/vitejs/vite/commit/364c2273a121dad4d93ec3b9ec87ffbe0d6e860b))

##### Documentation

- add `environment.fetchModule` documentation ([#&#8203;22035](https://github.com/vitejs/vite/issues/22035)) ([54229e7](https://github.com/vitejs/vite/commit/54229e78631ebf10d1db767b51ea85f3cf06718a))

##### Miscellaneous Chores

- **deps:** update rolldown-related dependencies ([#&#8203;21989](https://github.com/vitejs/vite/issues/21989)) ([0ded627](https://github.com/vitejs/vite/commit/0ded6274579e8bda6b22a7ba93b15d15b4c28b78))

##### Code Refactoring

- upgrade to typescript 6 ([#&#8203;22110](https://github.com/vitejs/vite/issues/22110)) ([cc41398](https://github.com/vitejs/vite/commit/cc41398c2cf0bb5061cf0ca5dc3b408ae7e41191))

### [`v8.0.3`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-803-2026-03-26-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.2...v8.0.3)

##### Features

- update rolldown to 1.0.0-rc.12 ([#&#8203;22024](https://github.com/vitejs/vite/issues/22024)) ([84164ef](https://github.com/vitejs/vite/commit/84164ef47b24b1de114f1c29446a9e650825d4ea))

##### Bug Fixes

- **html:** cache unfiltered CSS list to prevent missing styles across entries ([#&#8203;22017](https://github.com/vitejs/vite/issues/22017)) ([5464190](https://github.com/vitejs/vite/commit/5464190a3ee8f23db20004e7818186fbcc32b0e5))
- **module-runner:** handle non-ascii characters in base64 sourcemaps ([#&#8203;21985](https://github.com/vitejs/vite/issues/21985)) ([77c95bf](https://github.com/vitejs/vite/commit/77c95bff834c43f8be9fe513c10b5393805a7487))
- **module-runner:** skip re-import if the runner is closed ([#&#8203;22020](https://github.com/vitejs/vite/issues/22020)) ([ee2c2cd](https://github.com/vitejs/vite/commit/ee2c2cd2c2ce3f53088bd2313fa23e9d52a49b4f))
- **optimizer:** scan is not resolving sub path import if used in a glob import ([#&#8203;22018](https://github.com/vitejs/vite/issues/22018)) ([ddfe20d](https://github.com/vitejs/vite/commit/ddfe20d19e95a323fa3c8d2c19a02c4e02f93824))
- **ssr:** ssrTransform incorrectly rewrites `meta` identifier inside `import.meta` when a binding named `meta` exists ([#&#8203;22019](https://github.com/vitejs/vite/issues/22019)) ([cff5f0c](https://github.com/vitejs/vite/commit/cff5f0cca5f08c2ce50f233441485e10b6e115e9))

##### Miscellaneous Chores

- **deps:** bump picomatch from 4.0.3 to 4.0.4 ([#&#8203;22027](https://github.com/vitejs/vite/issues/22027)) ([7e56003](https://github.com/vitejs/vite/commit/7e56003fec3e1b94a20516a901580198a51da614))

##### Tests

- **html:** add tests for `getCssFilesForChunk` ([#&#8203;22016](https://github.com/vitejs/vite/issues/22016)) ([43fbbf9](https://github.com/vitejs/vite/commit/43fbbf9a09dfd17456ae0611d034c366fcb38998))

### [`v8.0.2`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-802-2026-03-23-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.1...v8.0.2)

##### Features

- update rolldown to 1.0.0-rc.11 ([#&#8203;21998](https://github.com/vitejs/vite/issues/21998)) ([ff91c31](https://github.com/vitejs/vite/commit/ff91c319facd602dc5eea81ed7e7d79ae7dadb95))

##### Bug Fixes

- **deps:** update all non-major dependencies ([#&#8203;21988](https://github.com/vitejs/vite/issues/21988)) ([9b7d150](https://github.com/vitejs/vite/commit/9b7d15002a75474421bc5636238336d88c7fe2f3))

##### Miscellaneous Chores

- **deps:** update dependency [@&#8203;vitejs/devtools](https://github.com/vitejs/devtools) to ^0.1.5 ([#&#8203;21992](https://github.com/vitejs/vite/issues/21992)) ([b2dd65b](https://github.com/vitejs/vite/commit/b2dd65bf2f113719b72450f2e19696213fd9e255))

### [`v8.0.1`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-8016-2026-06-01-small)

[Compare Source](https://github.com/vitejs/vite/compare/v8.0.0...v8.0.1)

##### Bug Fixes

- **deps:** reject UNC paths for launch-editor-middleware ([#&#8203;22571](https://github.com/vitejs/vite/issues/22571)) ([50b9512](https://github.com/vitejs/vite/commit/50b951225bbf6151eb84a3ad5a454908ab4a76c9))
- reject windows alternate paths ([#&#8203;22572](https://github.com/vitejs/vite/issues/22572)) ([dc245c7](https://github.com/vitejs/vite/commit/dc245c71e5007ea4d891a025e2d69ac96c736546))

### [`v8.0.0`](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#800-2026-03-12)

[Compare Source](https://github.com/vitejs/vite/compare/v7.3.5...v8.0.0)

![Vite 8 is here!](../../docs/public/og-image-announcing-vite8.webp)

Today, we're thrilled to announce the release of the next Vite major:

- **[Vite 8.0 announcement blog post](https://vite.dev/blog/announcing-vite8.html)**
- [Docs](https://vite.dev/) (translations: [简体中文](https://cn.vite.dev/), [日本語](https://ja.vite.dev/), [Español](https://es.vite.dev/), [Português](https://pt.vite.dev/), [한국어](https://ko.vite.dev/), [Deutsch](https://de.vite.dev/), [فارسی](https://fa.vite.dev/))
- [Migration Guide](https://vite.dev/guide/migration.html)

##### ⚠ BREAKING CHANGES

- remove `import.meta.hot.accept` resolution fallback ([#&#8203;21382](https://github.com/vitejs/vite/issues/21382)) ([71d0797](https://github.com/vitejs/vite/commit/71d0797a719440f2a09b3364bfcf18576c2b67fb))
- update default browser target ([#&#8203;21193](https://github.com/vitejs/vite/issues/21193)) ([8c3dd06](https://github.com/vitejs/vite/commit/8c3dd06bd9903bf0e6bc51f3554eea8cb6b26903))
- the epic `rolldown-vite` merge ([#&#8203;21189](https://github.com/vitejs/vite/issues/21189)) ([4a7f8d4](https://github.com/vitejs/vite/commit/4a7f8d43e6b14b89fef278c3ea86f9e3f64b7fc2))

##### Features

- update rolldown to 1.0.0-rc.9 ([#&#8203;21813](https://github.com/vitejs/vite/issues/21813)) ([f05be0e](https://github.com/vitejs/vite/commit/f05be0eabf5c045b8892d463081da3c8fbf5a5ae))
- warn when `vite-tsconfig-paths` plugin is detected ([#&#8203;21781](https://github.com/vitejs/vite/issues/21781)) ([ada493e](https://github.com/vitejs/vite/commit/ada493e4214ef2028b96583550443a386be2e2ae))
- **css:** support es2025 build target for lightningcss ([#&#8203;21769](https://github.com/vitejs/vite/issues/21769)) ([08906e7](https://github.com/vitejs/vite/commit/08906e76f2fc0e55c8aea6243f6203ce0c78f106))
- forward browser console logs and errors to dev server terminal ([#&#8203;20916](https://github.com/vitejs/vite/issues/20916)) ([2540ed0](https://github.com/vitejs/vite/commit/2540ed06d0b6f93829d2d764b6a02f7dbfd14923))
- update rolldown to 1.0.0-rc.8 ([#&#8203;21790](https://github.com/vitejs/vite/issues/21790)) ([a0c950e](https://github.com/vitejs/vite/commit/a0c950e30945cc97fb2381a2affac086730fa31e))
- export `Visitor` and `ESTree` from `rolldown/utils` ([#&#8203;21664](https://github.com/vitejs/vite/issues/21664)) ([45de31e](https://github.com/vitejs/vite/commit/45de31e5ffcc514832aec96fa6e09a189c26d684))
- update rolldown to 1.0.0-rc.6 ([#&#8203;21714](https://github.com/vitejs/vite/issues/21714)) ([37a65f8](https://github.com/vitejs/vite/commit/37a65f8c31b5baeb4dadecfd4da98f81bae4202e))
- use util.inspect for CLI error display ([#&#8203;21668](https://github.com/vitejs/vite/issues/21668)) ([5f425a9](https://github.com/vitejs/vite/commit/5f425a9126ad1a483f482970bef8c29a0e721a3c))
- update rolldown to 1.0.0-rc.5 ([#&#8203;21660](https://github.com/vitejs/vite/issues/21660)) ([b3ddbc5](https://github.com/vitejs/vite/commit/b3ddbc54ee5b836852b09811c8e920b2b2cde7cb))
- update rolldown to 1.0.0-rc.4 ([#&#8203;21617](https://github.com/vitejs/vite/issues/21617)) ([1ee5c7f](https://github.com/vitejs/vite/commit/1ee5c7f796c24d7319fbd5258bbdce4968859efe))
- **wasm:** add SSR support for `.wasm?init` ([#&#8203;21102](https://github.com/vitejs/vite/issues/21102)) ([216a3b5](https://github.com/vitejs/vite/commit/216a3b53c610918027a7713a0d5495628f77d306))
- integrate devtools ([#&#8203;21331](https://github.com/vitejs/vite/issues/21331)) ([acbf507](https://github.com/vitejs/vite/commit/acbf507bcb05f9cd9525c765431b3e0ed97328e4))
- update rolldown to 1.0.0-rc.3 ([#&#8203;21554](https://github.com/vitejs/vite/issues/21554)) ([43358e9](https://github.com/vitejs/vite/commit/43358e97cd6485513f25ee11133333cba05841e3))
- **manifest:** add `assets` field for standalone CSS entry points ([#&#8203;21015](https://github.com/vitejs/vite/issues/21015)) ([f289b9b](https://github.com/vitejs/vite/commit/f289b9b0ce7821b1554b878d083c426e7a695b59))
- update rolldown to 1.0.0-rc.2 ([#&#8203;21512](https://github.com/vitejs/vite/issues/21512)) ([fa136a9](https://github.com/vitejs/vite/commit/fa136a9e68921f3ca396e0870193fe805fbfb7b4))
- **bundled-dev:** support worker in initial bundle ([#&#8203;21415](https://github.com/vitejs/vite/issues/21415)) ([f3d3149](https://github.com/vitejs/vite/commit/f3d31499c714fe5c5acf8355520624c662f9d79f))
- **dev:** detect port conflicts on wildcard hosts ([#&#8203;21381](https://github.com/vitejs/vite/issues/21381)) ([b0dd5a9](https://github.com/vitejs/vite/commit/b0dd5a993fd2f95c8cb2190a3ca4296bc9e06359))
- shortcuts case insensitive ([#&#8203;21224](https://github.com/vitejs/vite/issues/21224)) ([7796ade](https://github.com/vitejs/vite/commit/7796aded764bca987abfec8ab0ad0438c5a5e7eb))
- update rolldown to 1.0.0-rc.1 ([#&#8203;21463](https://github.com/vitejs/vite/issues/21463)) ([ff9dd7f](https://github.com/vitejs/vite/commit/ff9dd7fef0d3c898e317fca84a629828f3e28936))
- warn if `envPrefix` contains spaces ([#&#8203;21292](https://github.com/vitejs/vite/issues/21292)) ([9fcde3c](https://github.com/vitejs/vite/commit/9fcde3c870896a62fbca19be8ee14efab9393f4a))
- update rolldown to 1.0.0-beta.60 ([#&#8203;21408](https://github.com/vitejs/vite/issues/21408)) ([c33aa7c](https://github.com/vitejs/vite/commit/c33aa7cfd142a0dd38ed89589fc7b04cf8866791))
- update rolldown to 1.0.0-beta.59 ([#&#8203;21374](https://github.com/vitejs/vite/issues/21374)) ([0037943](https://github.com/vitejs/vite/commit/00379439fa62383460b056d587d0366597c19ab4))
- add `ignoreOutdatedRequests` option to `optimizeDeps` ([#&#8203;21364](https://github.com/vitejs/vite/issues/21364)) ([b2e75aa](https://github.com/vitejs/vite/commit/b2e75aabe93e3219f40fa5ad8755d53cdd2439b5))
- add ios to default esbuild targets ([#&#8203;21342](https://github.com/vitejs/vite/issues/21342)) ([daae6e9](https://github.com/vitejs/vite/commit/daae6e9f5dd223258a9e7a9a7fa22c8a4564902f))
- update rolldown to 1.0.0-beta.58 ([#&#8203;21354](https://github.com/vitejs/vite/issues/21354)) ([ba40cef](https://github.com/vitejs/vite/commit/ba40cef16d20590f7115d4d628d9b79fa0783473))
- update rolldown to 1.0.0-beta.57 ([#&#8203;21335](https://github.com/vitejs/vite/issues/21335)) ([d5412ef](https://github.com/vitejs/vite/commit/d5412ef4c472bc5fef4ed69cfee4ef4a929c6be9))
- **css:** support es2024 build target for lightningcss ([#&#8203;21294](https://github.com/vitejs/vite/issues/21294)) ([bd33b8e](https://github.com/vitejs/vite/commit/bd33b8e08768fdcef0b09e3eefa649fdcafdd397))
- update rolldown to 1.0.0-beta.56 ([#&#8203;21323](https://github.com/vitejs/vite/issues/21323)) ([9847a63](https://github.com/vitejs/vite/commit/9847a634cf36de2e6ac0043ffd22cefb1b5951bd))
- introduce v2 native plugins and enable it by default ([#&#8203;21268](https://github.com/vitejs/vite/issues/21268)) ([42f2ab3](https://github.com/vitejs/vite/commit/42f2ab3aec7cd0e03e195611b1e1ddabbedc9d61))
- **ssr:** avoid errors when rewriting already rewritten stacktrace ([#&#8203;21269](https://github.com/vitejs/vite/issues/21269)) ([98d9a33](https://github.com/vitejs/vite/commit/98d9a33274d9ac90780786afa612d916feddf2e3))
- update rolldown to 1.0.0-beta.55 ([#&#8203;21300](https://github.com/vitejs/vite/issues/21300)) ([2c8db85](https://github.com/vitejs/vite/commit/2c8db858d7081e898f63ce9569c3f19a91a10956))
- update rolldown to 1.0.0-beta.54 ([#&#8203;21267](https://github.com/vitejs/vite/issues/21267)) ([c751172](https://github.com/vitejs/vite/commit/c75117213cb1d2d13554fbc26a75e8df191c27eb))
- add a warning that is output when a plugin sets esbuild related options ([#&#8203;21218](https://github.com/vitejs/vite/issues/21218)) ([200646b](https://github.com/vitejs/vite/commit/200646b14397bfb80e9b29d2e4b33fcfc72d6b2c))
- highly experimental full bundle mode ([#&#8203;21235](https://github.com/vitejs/vite/issues/21235)) ([83d8c99](https://github.com/vitejs/vite/commit/83d8c99753d8bd5c1ea9b7a00e6998c865dad4e2))
- print esbuild options when both esbuild and oxc options are set ([#&#8203;21216](https://github.com/vitejs/vite/issues/21216)) ([08ae87b](https://github.com/vitejs/vite/commit/08ae87b14a3ce5f7cb3f1a382f497d36d0c2e01b))
- update default browser target ([#&#8203;21193](https://github.com/vitejs/vite/issues/21193)) ([8c3dd06](https://github.com/vitejs/vite/commit/8c3dd06bd9903bf0e6bc51f3554eea8cb6b26903))
- the epic `rolldown-vite` merge ([#&#8203;21189](https://github.com/vitejs/vite/issues/21189)) ([4a7f8d4](https://github.com/vitejs/vite/commit/4a7f8d43e6b14b89fef278c3ea86f9e3f64b7fc2))

##### Bug Fixes

- **deps:** update all non-major dependencies ([#&#8203;21786](https://github.com/vitejs/vite/issues/21786)) ([eaa4352](https://github.com/vitejs/vite/commit/eaa4352af8f8658e3a10a9945ad9c227fcb2f28a))
- use `watch.watcher` instead of `watch.notify` ([#&#8203;21793](https://github.com/vitejs/vite/issues/21793)) ([88953b3](https://github.com/vitejs/vite/commit/88953b331d6b6acf20dc1731745f27712b091fd9))
- **css:** apply `server.origin` to public file URLs in CSS (fix [#&#8203;18457](https://github.com/vitejs/vite/issues/18457)) ([#&#8203;21697](https://github.com/vitejs/vite/issues/21697)) ([c967f48](https://github.com/vitejs/vite/commit/c967f48b2e888585e977c3a8d829f7370eb40922))
- **deps:** update all non-major dependencies ([#&#8203;21732](https://github.com/vitejs/vite/issues/21732)) ([5c921ca](https://github.com/vitejs/vite/commit/5c921ca9bfe64327df82b04ae34ccfe0a7cfa297))
- **dev:** disable extglobs for consistency ([#&#8203;21745](https://github.com/vitejs/vite/issues/21745)) ([1958eeb](https://github.com/vitejs/vite/commit/1958eeb34f9eab93f106b785c1c2ddf97b5c3b3a))
- **lib:** keep annotation comments for es output ([#&#8203;21740](https://github.com/vitejs/vite/issues/21740)) ([dd3c4f4](https://github.com/vitejs/vite/commit/dd3c4f4cf0f9e665e56e6d9a9cb7007fc3ac0dc3))
- **optimizer:** avoid error happening with a package with asset entrypoint ([#&#8203;21766](https://github.com/vitejs/vite/issues/21766)) ([f7e1d07](https://github.com/vitejs/vite/commit/f7e1d0720e6b9f2ce5d358b6a23ebdb72c51be70))
- **ssr:** throw friendly error when calling `ssrLoadModule` with non-runnable ssr env ([#&#8203;21739](https://github.com/vitejs/vite/issues/21739)) ([1fa736e](https://github.com/vitejs/vite/commit/1fa736e802c3f0fa0eacdda1d5d1c976794459bd))
- **types:** remove extends ImportMeta from ModuleRunnerImportMeta ([#&#8203;21710](https://github.com/vitejs/vite/issues/21710)) ([0176d45](https://github.com/vitejs/vite/commit/0176d45deb29f5db1f551d20d828598c2130be36))
- **wasm:** reset assetUrlRE.lastIndex before .test() in SSR builds ([#&#8203;21780](https://github.com/vitejs/vite/issues/21780)) ([3a0d8d9](https://github.com/vitejs/vite/commit/3a0d8d94a8868f5e118c81bc35a657ef19ff7d82))
- **deps:** update all non-major dependencies ([#&#8203;21691](https://github.com/vitejs/vite/issues/21691)) ([521fdc0](https://github.com/vitejs/vite/commit/521fdc0ced51ddee7f728e6f891f36ebc6c0e1ce))
- **optimizer:** avoid duplicate modules when `preserveSymlinks` is enabled ([#&#8203;21720](https://github.com/vitejs/vite/issues/21720)) ([72165e0](https://github.com/vitejs/vite/commit/72165e0f58d49b894a366af25993cbffbd0ee986))
- **dev:** only treat EADDRINUSE as port conflict in wildcard pre-check ([#&#8203;21642](https://github.com/vitejs/vite/issues/21642)) ([e54e25f](https://github.com/vitejs/vite/commit/e54e25fbb9b721b2c655d17e35706e070c92ff70))
- **dev:** prevent concurrent server restarts ([#&#8203;21636](https://github.com/vitejs/vite/issues/21636)) ([8ce23a3](https://github.com/vitejs/vite/commit/8ce23a3b6e1eb86eef2b50c1bfbad072bbf9a03a))
- **dev:** return "502 Bad Gateway" on proxy failures instead of 500 ([#&#8203;21652](https://github.com/vitejs/vite/issues/21652)) ([e240df2](https://github.com/vitejs/vite/commit/e240df2ea4accd11631aac0f361e846a2e3140b0))
- clear tsconfig cache only when tsconfig.json is cached ([#&#8203;21622](https://github.com/vitejs/vite/issues/21622)) ([50c9675](https://github.com/vitejs/vite/commit/50c9675aa6c488b9887b7849a3397b7b29d1bd74))
- **deps:** update all non-major dependencies ([#&#8203;21594](https://github.com/vitejs/vite/issues/21594)) ([becdc5d](https://github.com/vitejs/vite/commit/becdc5dcc49efa3769c92e9929fb2280fd776206))
- **lib:** CSS injection point error with nested name IIFE output ([#&#8203;21606](https://github.com/vitejs/vite/issues/21606)) ([5003de6](https://github.com/vitejs/vite/commit/5003de6253ffdb23d1a52b1b5e06281d34f3a6ec))
- **module-runner:** incorrect column with `sourcemapInterceptor: "prepareStackTrace"` ([#&#8203;21562](https://github.com/vitejs/vite/issues/21562)) ([416c095](https://github.com/vitejs/vite/commit/416c0959ebd63db622c6579b53065e95f09c63f8))
- **module-runner:** prevent crash on negative column in stacktrace ([#&#8203;21585](https://github.com/vitejs/vite/issues/21585)) ([a075590](https://github.com/vitejs/vite/commit/a075590c4091240a6f0caca6b052500fd122f041))
- rolldownOptions/rollupOptions merging at environment level ([#&#8203;21612](https://github.com/vitejs/vite/issues/21612)) ([db2ecc7](https://github.com/vitejs/vite/commit/db2ecc7675c3932fc9e127b726ab8b0cab25f75c))
- **scanner:** respect tsconfig.json ([#&#8203;21547](https://github.com/vitejs/vite/issues/21547)) ([c6c04db](https://github.com/vitejs/vite/commit/c6c04db9c67d1b390d40fd1fd026d49204957f8d))
- avoid registering customization hook for import meta resolver multiple times ([#&#8203;21518](https://github.com/vitejs/vite/issues/21518)) ([8bb3203](https://github.com/vitejs/vite/commit/8bb32036792a6f522f5c947112f3d688add755a0))
- **config:** avoid watching rolldown runtime virtual module ([#&#8203;21545](https://github.com/vitejs/vite/issues/21545)) ([d18b139](https://github.com/vitejs/vite/commit/d18b13957b3bec08eae5a9ff80340488c8150d46))
- **deps:** update all non-major dependencies ([#&#8203;21540](https://github.com/vitejs/vite/issues/21540)) ([9ebaeaa](https://github.com/vitejs/vite/commit/9ebaeaac094db996b1d12665052633c20ac8a9cf))
- populate originalFileNames when resolving CSS asset paths ([#&#8203;21542](https://github.com/vitejs/vite/issues/21542)) ([8b47ff7](https://github.com/vitejs/vite/commit/8b47ff76d28630b4dc39c77fbd2762b4c36ad23d))
- **deps:** update all non-major dependencies ([#&#8203;21488](https://github.com/vitejs/vite/issues/21488)) ([2b32ca2](https://github.com/vitejs/vite/commit/2b32ca24fe9d742901c2cb5c88e6b1fd734f8c73))
- disable `tsconfig` option when loading config ([#&#8203;21517](https://github.com/vitejs/vite/issues/21517)) ([5025c35](https://github.com/vitejs/vite/commit/5025c358d119aa0b60d0505f9dd705950ad897f6))
- **optimizer:** map relative `new URL` paths to correct relative file location ([#&#8203;21434](https://github.com/vitejs/vite/issues/21434)) ([ca96cbc](https://github.com/vitejs/vite/commit/ca96cbc8eff23091c288f9eaf1944af2de3c564f))
- avoid using deprecated `output.inlineDynamicImport` option ([#&#8203;21464](https://github.com/vitejs/vite/issues/21464)) ([471ce62](https://github.com/vitejs/vite/commit/471ce6275663f068afa241a55711fd646d482385))
- use separate hook object for each environment ([#&#8203;21472](https://github.com/vitejs/vite/issues/21472)) ([66347f6](https://github.com/vitejs/vite/commit/66347f6df0e723d9d03ea31ab41ab5b767ad15ba))
- **deps:** update all non-major dependencies ([#&#8203;21440](https://github.com/vitejs/vite/issues/21440)) ([1835995](https://github.com/vitejs/vite/commit/18359959cb2960a2fb2b9a340e5ae27d122a1501))
- **dev:** avoid event emitter leak caused by `server.listen` callback ([#&#8203;21451](https://github.com/vitejs/vite/issues/21451)) ([602d786](https://github.com/vitejs/vite/commit/602d7865db2b12835c8225f3e87076bef4e247b9))
- lazy hook filter should work ([#&#8203;21443](https://github.com/vitejs/vite/issues/21443)) ([bc0c207](https://github.com/vitejs/vite/commit/bc0c207f537789d10d55caa4ee3697aa923b8426))
- **optimizer:** skip `rolldownCjsExternalPlugin` for `platform: neutral` ([#&#8203;21452](https://github.com/vitejs/vite/issues/21452)) ([d2fc4be](https://github.com/vitejs/vite/commit/d2fc4be0447e384e18e557b70f7c345d5bcea941))
- **deps:** update all non-major dependencies ([#&#8203;21389](https://github.com/vitejs/vite/issues/21389)) ([30f48df](https://github.com/vitejs/vite/commit/30f48df33ec9e9bd0b8164461eede5574398370b))
- **deps:** update esbuild peerDependency version ([#&#8203;21398](https://github.com/vitejs/vite/issues/21398)) ([4266c97](https://github.com/vitejs/vite/commit/4266c978083b3afa8d09ac3d3a110ee79f8efde2))
- **hmr:** trigger prune event when last import is removed ([#&#8203;20781](https://github.com/vitejs/vite/issues/20781)) ([#&#8203;21093](https://github.com/vitejs/vite/issues/21093)) ([7576735](https://github.com/vitejs/vite/commit/757673528c64945b77aee4a8e01669ccd0644973))
- **module-runner:** use `process.getBuiltinModule` instead of `import('node:module')` ([#&#8203;21402](https://github.com/vitejs/vite/issues/21402)) ([6633bcb](https://github.com/vitejs/vite/commit/6633bcb94149a2923cb6419aa481c5384bcf9310))
- support .env file mounts (FIFOs) ([#&#8203;21365](https://github.com/vitejs/vite/issues/21365)) ([6e6f82a](https://github.com/vitejs/vite/commit/6e6f82a067acc6e158be3b82edb3d7d2888f9af2))
- **css:** stylus Evaluator support ([#&#8203;21376](https://github.com/vitejs/vite/issues/21376)) ([cf9ace1](https://github.com/vitejs/vite/commit/cf9ace1b40b2767b9b9cbbabb084fe2e32afc535))
- **deps:** update all non-major dependencies ([#&#8203;21321](https://github.com/vitejs/vite/issues/21321)) ([9bc7c2e](https://github.com/vitejs/vite/commit/9bc7c2ed4f387fb982b84d1988a26af8990096f7))
- **import-analysis:** avoid cjs interop for built browser external module ([#&#8203;21333](https://github.com/vitejs/vite/issues/21333)) ([dc5a2fb](https://github.com/vitejs/vite/commit/dc5a2fb86f10c69b0ba6bc1831d9a29c79754ba2))
- **worker:** handle `new Worker(..., new URL(import.meta.url))` with trailing comma ([#&#8203;21325](https://github.com/vitejs/vite/issues/21325)) ([4a47241](https://github.com/vitejs/vite/commit/4a472418c02a0821900678778752c2d361bae3bd))
- detect `import.meta.resolve` when formatted across multiple lines ([#&#8203;21312](https://github.com/vitejs/vite/issues/21312)) ([130e718](https://github.com/vitejs/vite/commit/130e7181a55c524383c63bbfb1749d0ff7185cad))
- allow no-cors requests for non-script tag requests ([#&#8203;21299](https://github.com/vitejs/vite/issues/21299)) ([ef3d596](https://github.com/vitejs/vite/commit/ef3d59648fd9dd3f9b3118d09d216dc0afcb8c33))
- **deps:** update all non-major dependencies ([#&#8203;21285](https://github.com/vitejs/vite/issues/21285)) ([4635b2e](https://github.com/vitejs/vite/commit/4635b2e90f833d1048d76381e20208c0e0841e97))
- unreachable error when building with `experimental.bundledDev` is enabled ([#&#8203;21296](https://github.com/vitejs/vite/issues/21296)) ([e81c183](https://github.com/vitejs/vite/commit/e81c183f8c8ccaf7774ef0d0ee125bf63dbf30b4))
- **deps:** update all non-major dependencies ([#&#8203;21231](https://github.com/vitejs/vite/issues/21231)) ([859789c](https://github.com/vitejs/vite/commit/859789c856412dfa67969232ddda1df754febf40))
- don't strip base from imports ([#&#8203;21221](https://github.com/vitejs/vite/issues/21221)) ([7da742b](https://github.com/vitejs/vite/commit/7da742b478d2309c7d8de4cb55614a6476f350b4))
- allow exiting process before optimizer cleanup is done ([#&#8203;21170](https://github.com/vitejs/vite/issues/21170)) ([55ceffc](https://github.com/vitejs/vite/commit/55ceffc8976b8bb8c819f5b47419f8499ba3f843))
- plugin shortcut support ([#&#8203;21211](https://github.com/vitejs/vite/issues/21211)) ([6a3aca0](https://github.com/vitejs/vite/commit/6a3aca084356316811ff62cbedb5a410a249e789))

##### Performance Improvements

- **ssr:** skip circular import check for already-evaluated modules ([#&#8203;21632](https://github.com/vitejs/vite/issues/21632)) ([235140b](https://github.com/vitejs/vite/commit/235140b2d519e866fc28f88fe8155a5091630daf))
- use tsconfig cache for oxc transform in dev ([#&#8203;21643](https://github.com/vitejs/vite/issues/21643)) ([57ff177](https://github.com/vitejs/vite/commit/57ff177575bef6bee81a250e853d2c99affa0015))

##### Documentation

- bulk of typo fixes ([#&#8203;21507](https://github.com/vitejs/vite/issues/21507)) ([80755da](https://github.com/vitejs/vite/commit/80755dacab296cd2083fef29e09280ceb810a943))
- update `build.dynamicImportVarsOptions` ([#&#8203;21477](https://github.com/vitejs/vite/issues/21477)) ([54ce2ed](https://github.com/vitejs/vite/commit/54ce2ed15a95619bd18ac6609b7d7b5f42b4965d))
- clarify the pronunciation of `vite` in IPA symbols ([#&#8203;21238](https://github.com/vitejs/vite/issues/21238)) ([9b1d4d6](https://github.com/vitejs/vite/commit/9b1d4d6f348c8899bd7651bd802f583e99b901ee))
- ensure https links ([#&#8203;21266](https://github.com/vitejs/vite/issues/21266)) ([2eb259a](https://github.com/vitejs/vite/commit/2eb259a84859c7656718258afed08eb80670f530))

##### Miscellaneous Chores

- **deps-dev:** bump rollup from 4.57.1 to 4.59.0 ([#&#8203;21717](https://github.com/vitejs/vite/issues/21717)) ([25227bb](https://github.com/vitejs/vite/commit/25227bbdc7de0ed07cf7bdc9a1a733e3a9a132bc))
- **deps:** update dependency cac to v7 ([#&#8203;21788](https://github.com/vitejs/vite/issues/21788)) ([44e33ae](https://github.com/vitejs/vite/commit/44e33ae6a7b64130831f08b2a20d04cbd106898d))
- **deps:** update dependency rolldown-plugin-dts to ^0.22.2 ([#&#8203;21731](https://github.com/vitejs/vite/issues/21731)) ([d8ea652](https://github.com/vitejs/vite/commit/d8ea652a8b295d9e012ac7ea607d813c69f77791))
- **deps:** remove `fdir` and `@rollup/plugin-commonjs` ([#&#8203;21639](https://github.com/vitejs/vite/issues/21639)) ([5abffd5](https://github.com/vitejs/vite/commit/5abffd5d04bf586a60970588a14d7e3b79445093))
- **deps:** update dependency [@&#8203;rollup/plugin-alias](https://github.com/rollup/plugin-alias) to v6 ([#&#8203;21097](https://github.com/vitejs/vite/issues/21097)) ([44b5bdf](https://github.com/vitejs/vite/commit/44b5bdfcf2b2c1b73563ed0526c48584b756360f))
- fix broken link for future deprecations ([#&#8203;21603](https://github.com/vitejs/vite/issues/21603)) ([25f4501](https://github.com/vitejs/vite/commit/25f45013b94e50acc5c3e476691aa2210b33cae4))
- update `customResolver` deprecation message to mention `enforce: 'pre'` ([#&#8203;21576](https://github.com/vitejs/vite/issues/21576)) ([2ce34d5](https://github.com/vitejs/vite/commit/2ce34d5580ed118db6361696e6283c1fea74e685))
- update rolldown-plugin-dts to 0.22.1 ([#&#8203;21559](https://github.com/vitejs/vite/issues/21559)) ([77aab4b](https://github.com/vitejs/vite/commit/77aab4b7f1e3a2131477659c909a3fbe02faa0a0))
- **deps:** update dependency rolldown-plugin-dts to ^0.21.8 ([#&#8203;21539](https://github.com/vitejs/vite/issues/21539)) ([33881cb](https://github.com/vitejs/vite/commit/33881cb34f4587919713975d13ce255ef744472d))
- add missing versions to changelog ([#&#8203;21515](https://github.com/vitejs/vite/issues/21515)) ([4bfb239](https://github.com/vitejs/vite/commit/4bfb239686a17343bc46c0d7c968e28b0d64041f))
- **deps:** update rolldown-related dependencies ([#&#8203;21487](https://github.com/vitejs/vite/issues/21487)) ([5863e51](https://github.com/vitejs/vite/commit/5863e513fab6b481cfb42da86202f9db728c077d))
- **deps:** update rolldown-related dependencies ([#&#8203;21390](https://github.com/vitejs/vite/issues/21390)) ([be9dd4e](https://github.com/vitejs/vite/commit/be9dd4e08d899f9ed27f2bdcb81bf27d018377a6))
- fix typo in plugin.ts comment ([#&#8203;21435](https://github.com/vitejs/vite/issues/21435)) ([d31fc66](https://github.com/vitejs/vite/commit/d31fc6685b4dde33062bf4dfe46e0502de4e1449))
- replace caniuse link for ES2024 ([#&#8203;21355](https://github.com/vitejs/vite/issues/21355)) ([2ba4e99](https://github.com/vitejs/vite/commit/2ba4e990192845e01c733aa186c9599cdb5bb8fe))
- cleanup changelog ([#&#8203;21202](https://github.com/vitejs/vite/issues/21202)) ([8c8c56e](https://github.com/vitejs/vite/commit/8c8c56e1eb465e6dcd0c1b40f187228edc0e2be4))
- **deps:** update rolldown-related dependencies ([#&#8203;21230](https://github.com/vitejs/vite/issues/21230)) ([9349446](https://github.com/vitejs/vite/commit/9349446e9344bd81ccfb37af482f479cd1b59bbc))
- fix spelling error ([#&#8203;21223](https://github.com/vitejs/vite/issues/21223)) ([cc10e20](https://github.com/vitejs/vite/commit/cc10e207ae87ac122fc1efbb5ab01b516eb9cce8))

##### Code Refactoring

- don't add `optimization.inlineConst: { mode: 'smart' }` as it's enabled by default ([#&#8203;21794](https://github.com/vitejs/vite/issues/21794)) ([22b3d11](https://github.com/vitejs/vite/commit/22b3d111c38deb76d3c07010bf9903e3ee1befc1))
- enable some native plugins even with enable native plugin false ([#&#8203;21744](https://github.com/vitejs/vite/issues/21744)) ([fc46c79](https://github.com/vitejs/vite/commit/fc46c79797e9ec22a5a4fb1999f6268f72d586f8))
- avoid deprecated `legalComments` option ([#&#8203;21721](https://github.com/vitejs/vite/issues/21721)) ([e06496e](https://github.com/vitejs/vite/commit/e06496ef259015b5a89f33a9965be25f8bea0624))
- use `ESTree` types from `rolldown/utils` ([#&#8203;21719](https://github.com/vitejs/vite/issues/21719)) ([9239750](https://github.com/vitejs/vite/commit/9239750e619afba03243d6d583eaca55b510ddfe))
- deprecate `customResolver` in `resolve.alias` ([#&#8203;21476](https://github.com/vitejs/vite/issues/21476)) ([81275c9](https://github.com/vitejs/vite/commit/81275c907211ac766013e6232c2cdf559534bed1))
- remove unnecessary `@rolldown/pluginutils` ([#&#8203;21560](https://github.com/vitejs/vite/issues/21560)) ([c367b62](https://github.com/vitejs/vite/commit/c367b62693f19040e64d14915877f0b05b8ac7ae))
- enable some native plugins even with enable native plugin false ([#&#8203;21608](https://github.com/vitejs/vite/issues/21608)) ([5a4f692](https://github.com/vitejs/vite/commit/5a4f6924260ef0f2683177a99935160badea3f3b))
- use `rolldown/utils` ([#&#8203;21577](https://github.com/vitejs/vite/issues/21577)) ([e56103f](https://github.com/vitejs/vite/commit/e56103f180216306de738769303f31ad4c078b26))
- use internal devtools config ([#&#8203;21609](https://github.com/vitejs/vite/issues/21609)) ([9aea20f](https://github.com/vitejs/vite/commit/9aea20f4a190e0e1c7edc656361d636cd6ce642f))
- use parseEnv ([#&#8203;21586](https://github.com/vitejs/vite/issues/21586)) ([f859d2c](https://github.com/vitejs/vite/commit/f859d2cdfcc18f139775c208be068461a91602e5))
- **wasm:** remove native wasm helper plugin usage ([#&#8203;21566](https://github.com/vitejs/vite/issues/21566)) ([71a86be](https://github.com/vitejs/vite/commit/71a86be6d9b9ea0329e92f20671f4db1f020874d))
- enable some native plugins even with enable native plugin false ([#&#8203;21511](https://github.com/vitejs/vite/issues/21511)) ([b40292c](https://github.com/vitejs/vite/commit/b40292ce6a7dbbbbac9c6dae5f126b7f44c3e1b7))
- remove `experimental.enableNativePlugin: 'resolver'` ([#&#8203;21510](https://github.com/vitejs/vite/issues/21510)) ([f9d9213](https://github.com/vitejs/vite/commit/f9d92130fa79c638f77a3a8e6e55506f185d5a49))
- use `import.meta.dirname` everywhere ([#&#8203;21509](https://github.com/vitejs/vite/issues/21509)) ([7becf5f](https://github.com/vitejs/vite/commit/7becf5f8fe9041cff60f495ef975faaba68f9eb2))
- **optimizer:** simplify `rolldownCjsExternalPlugin` ([#&#8203;21450](https://github.com/vitejs/vite/issues/21450)) ([ebda8fd](https://github.com/vitejs/vite/commit/ebda8fd3c14f60e63d13d22102cb3d79a12f47a9))
- remove `import.meta.hot.accept` resolution fallback ([#&#8203;21382](https://github.com/vitejs/vite/issues/21382)) ([71d0797](https://github.com/vitejs/vite/commit/71d0797a719440f2a09b3364bfcf18576c2b67fb))
- **optimizer:** remove dead code ([#&#8203;21334](https://github.com/vitejs/vite/issues/21334)) ([e9a2cdb](https://github.com/vitejs/vite/commit/e9a2cdbb7d96a3f8e15d25774708d4f4ab626bb9))

##### Tests

- **ssr:** incorrect `handleInvoke` was called in server-worker-runner.invoke test ([#&#8203;21751](https://github.com/vitejs/vite/issues/21751)) ([b95ca22](https://github.com/vitejs/vite/commit/b95ca22460fe39fc862444f8c642fd6a0794c87c))
- add more type tests for `defineConfig` ([#&#8203;21698](https://github.com/vitejs/vite/issues/21698)) ([4fedbbd](https://github.com/vitejs/vite/commit/4fedbbdd9178a3f92e491233f44d49b3ac095c69))
- test case for catching invalid package resolution error ([#&#8203;21601](https://github.com/vitejs/vite/issues/21601)) ([c9b9359](https://github.com/vitejs/vite/commit/c9b9359fe88fc4b8a69a0d5c5a7eed8961fb6e57))
- **bundled-dev:** add worker test cases ([#&#8203;21557](https://github.com/vitejs/vite/issues/21557)) ([569bc98](https://github.com/vitejs/vite/commit/569bc98d6bc42fbd1835c1c24a493776030b6cb4))

##### Beta Changelogs

##### [8.0.0-beta.18](https://github.com/vitejs/vite/compare/v8.0.0-beta.17...v8.0.0-beta.18) (2026-03-09)

See [8.0.0-beta.18 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.18/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.17](https://github.com/vitejs/vite/compare/v8.0.0-beta.16...v8.0.0-beta.17) (2026-03-09)

See [8.0.0-beta.17 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.17/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.16](https://github.com/vitejs/vite/compare/v8.0.0-beta.15...v8.0.0-beta.16) (2026-02-27)

See [8.0.0-beta.16 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.16/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.15](https://github.com/vitejs/vite/compare/v8.0.0-beta.14...v8.0.0-beta.15) (2026-02-19)

See [8.0.0-beta.15 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.15/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.14](https://github.com/vitejs/vite/compare/v8.0.0-beta.13...v8.0.0-beta.14) (2026-02-12)

See [8.0.0-beta.14 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.14/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.13](https://github.com/vitejs/vite/compare/v8.0.0-beta.12...v8.0.0-beta.13) (2026-02-05)

See [8.0.0-beta.13 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.13/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.12](https://github.com/vitejs/vite/compare/v8.0.0-beta.11...v8.0.0-beta.12) (2026-02-03)

See [8.0.0-beta.12 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.12/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.11](https://github.com/vitejs/vite/compare/v8.0.0-beta.10...v8.0.0-beta.11) (2026-01-29)

See [8.0.0-beta.11 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.11/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.10](https://github.com/vitejs/vite/compare/v8.0.0-beta.9...v8.0.0-beta.10) (2026-01-24)

See [8.0.0-beta.10 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.10/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.9](https://github.com/vitejs/vite/compare/v8.0.0-beta.8...v8.0.0-beta.9) (2026-01-22)

See [8.0.0-beta.9 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.9/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.8](https://github.com/vitejs/vite/compare/v8.0.0-beta.7...v8.0.0-beta.8) (2026-01-15)

See [8.0.0-beta.8 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.8/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.7](https://github.com/vitejs/vite/compare/v8.0.0-beta.6...v8.0.0-beta.7) (2026-01-08)

See [8.0.0-beta.7 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.7/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.6](https://github.com/vitejs/vite/compare/v8.0.0-beta.5...v8.0.0-beta.6) (2026-01-07)

See [8.0.0-beta.6 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.6/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.5](https://github.com/vitejs/vite/compare/v8.0.0-beta.4...v8.0.0-beta.5) (2025-12-25)

See [8.0.0-beta.5 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.5/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.4](https://github.com/vitejs/vite/compare/v8.0.0-beta.3...v8.0.0-beta.4) (2025-12-22)

See [8.0.0-beta.4 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.4/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.3](https://github.com/vitejs/vite/compare/v8.0.0-beta.2...v8.0.0-beta.3) (2025-12-18)

See [8.0.0-beta.3 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.3/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.2](https://github.com/vitejs/vite/compare/v8.0.0-beta.1...v8.0.0-beta.2) (2025-12-12)

See [8.0.0-beta.2 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.2/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.1](https://github.com/vitejs/vite/compare/v8.0.0-beta.0...v8.0.0-beta.1) (2025-12-08)

See [8.0.0-beta.1 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.1/packages/vite/CHANGELOG.md)

##### [8.0.0-beta.0](https://github.com/vitejs/vite/compare/v7.2.4...v8.0.0-beta.0) (2025-12-03)

See [8.0.0-beta.0 changelog](https://github.com/vitejs/vite/blob/v8.0.0-beta.0/packages/vite/CHANGELOG.md)

##### Rolldown-Vite changelogs

See [rolldown-vite changelog](https://github.com/vitejs/rolldown-vite/blob/v7.2.10/packages/vite/CHANGELOG.md)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), 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.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

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

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/memini/pulls/34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

p3-downstream-blocker Blocking the downstream ecosystem to work properly (priority) trigger: preview

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Vite 8.0.0-beta.9 builds failing tanstack/nitro

3 participants