diff --git a/docs/start/framework/react/guide/hosting.md b/docs/start/framework/react/guide/hosting.md index aa1806c6bf8..1a653a22091 100644 --- a/docs/start/framework/react/guide/hosting.md +++ b/docs/start/framework/react/guide/hosting.md @@ -445,7 +445,70 @@ bun run server.ts 🚀 Server running at http://localhost:3000 ``` -For a complete working example, check out the [TanStack Start + Bun example](https://github.com/TanStack/router/tree/main/examples/react/start-bun) in this repository. +For a complete working example of **Vite build + Bun HTTP host**, check out the [TanStack Start + Bun example](https://github.com/TanStack/router/tree/main/examples/react/start-bun) in this repository. + +### Bun as the bundler (experimental) + +There is also an experimental path that uses **Bun as the bundler** (no Vite), via `@tanstack/react-start/plugin/bun`: + +```ts +import { tanstackStart } from '@tanstack/react-start/plugin/bun' + +const start = tanstackStart({ bun: { port: 3000 } }) +await start.build() +// or: await start.dev() +``` + +Default production output matches the **Rsbuild-style** host: `dist/client` + `dist/server/server.js` + `dist/server/host.js` (static assets then `fetch`). See the [`start-bun-bundler`](https://github.com/TanStack/router/tree/main/examples/react/start-bun-bundler) example. Solid/Vue mirrors: `@tanstack/solid-start/plugin/bun`, `@tanstack/vue-start/plugin/bun`. + +#### Optional Nitro bridge (production only) + +Unlike Vite Start (app composes `nitro()` from `nitro/vite`), the Bun bundler adapter **cannot** reuse `nitro/vite` (it depends on Vite Environments). Instead you can enable an optional post-build Nitro 3 bridge after dual `Bun.build`: + +```bash +npm install nitro +``` + +```ts +const start = tanstackStart({ + bun: { + nitro: { + preset: 'node-server', // or 'bun', 'vercel', … + // config: { /* NitroConfig subset */ }, + }, + }, +}) +await start.build() +// → also writes .output/ (public + server); prerender uses .output/public +``` + +| Path | Role | +|------|------| +| Vite + `nitro/vite` | Bun/Node/… as **runtime** after Vite build | +| Bun bundler + `host.js` | Bun as **bundler**; deploy `dist/` with Bun (default) | +| Bun bundler + `bun.nitro` | Bun as **bundler**, then programmatic Nitro 3 → `.output` | +| Bun bundler + `bun.standalone` | Bun as **bundler**, then `Bun.build({ compile })` → single OS/arch executable (embeds `dist/client`) | + +#### Optional Bun standalone executable (production only) + +```ts +const start = tanstackStart({ + bun: { + standalone: { + outfile: 'dist/server/start', // default + // target: 'linux-x64', // optional cross-compile + }, + }, +}) +await start.build() +// → dist/server/start (large binary; run directly, set PORT/HOST) +``` + +Always compiles from **`dist/`** (not Nitro `.output`). Binary size includes the Bun runtime and is platform-specific. Experimental — see [Bun executables](https://bun.com/docs/bundler/executables). + +Dev still uses the Bun host (`createBunDevServer`); Nitro and standalone compile are production-build only. + +> Module-level HMR and RSC are not part of this adapter yet. ### Appwrite Sites diff --git a/examples/react/start-bun-bundler/README.md b/examples/react/start-bun-bundler/README.md new file mode 100644 index 00000000000..920362214a2 --- /dev/null +++ b/examples/react/start-bun-bundler/README.md @@ -0,0 +1,53 @@ +# TanStack Start + Bun Bundler + +Minimal example that builds with **Bun as the bundler** (no Vite). + +## vs `start-bun` + +| | [`start-bun`](../start-bun) | **this example** | +|--|--|--| +| Dev / build | Vite (`vite dev` / `vite build`) | `tanstackStart().dev()` / `.build()` via Bun | +| Production host | `Bun.serve` + Vite `dist` | `host.js` / 可选 Nitro `.output` / 可选 standalone 可执行文件 | +| Plugin entry | `@tanstack/react-start/plugin/vite` | `@tanstack/react-start/plugin/bun` | + +## Scripts + +```bash +cd examples/react/start-bun-bundler +bun run build # → dist/client + dist/server/server.js + host.js +bun run start # bun dist/server/host.js +bun run build:nitro # + bun.nitro → .output/ +bun run start:nitro # node .output/server/index.mjs +bun run build:standalone # + bun.standalone → dist/server/start +bun run start:standalone # ./dist/server/start +bun run dev +bun run smoke +bun run smoke:nitro +bun run smoke:standalone +``` + +## Production hosts + +1. **Default (Rsbuild-style):** `dist/server/host.js` — deploy `dist/` + Bun +2. **Optional Nitro:** `bun.nitro` → `.output`(多 preset) +3. **Optional standalone executable:** `bun.standalone` → `dist/server/start`(嵌入 `dist/client`;体积大、按 OS/arch) + +`bun.nitro` 与 `bun.standalone` 可并存;standalone **始终基于 `dist/`**,不从 `.output` 再编译。 + +## What this proves + +- Dual `Bun.build` without Vite +- SSR + prerender + static host / optional Nitro / optional `--compile` executable +- Code-splitting, import protection, CSS pipeline, ESM HMR(dev) + +## Known gaps + +- No RSC;Nitro/standalone 仅生产;asset 管线仍薄于 Vite + +See `packages/start-plugin-core/src/bun/ARCHITECTURE.md`. + +## 给其它仓库用(GitHub Packages) + +本 fork 可通过 GitHub Packages 发布 `@running-grass/*`(脚本重写 scope)。其它仓用 npm alias 继续依赖 `@tanstack/*`。 + +详见 [`scripts/github-packages/README.md`](../../../scripts/github-packages/README.md)。 diff --git a/examples/react/start-bun-bundler/package.json b/examples/react/start-bun-bundler/package.json new file mode 100644 index 00000000000..1c4f337c2fa --- /dev/null +++ b/examples/react/start-bun-bundler/package.json @@ -0,0 +1,32 @@ +{ + "name": "tanstack-start-bun-bundler", + "private": true, + "type": "module", + "scripts": { + "dev": "bun run ./scripts/dev.ts", + "build": "bun run ./scripts/build.ts", + "build:nitro": "bun run ./scripts/build-nitro.ts", + "build:standalone": "bun run ./scripts/build-standalone.ts", + "start": "bun run ./dist/server/host.js", + "start:nitro": "node .output/server/index.mjs", + "start:standalone": "./dist/server/start", + "smoke": "bun run ./scripts/smoke.ts", + "smoke:nitro": "bun run ./scripts/smoke-nitro.ts", + "smoke:standalone": "bun run ./scripts/smoke-standalone.ts", + "test:e2e": "bun run smoke" + }, + "dependencies": { + "@tanstack/react-router": "workspace:*", + "@tanstack/react-start": "workspace:*", + "@tanstack/router-plugin": "workspace:*", + "nitro": "npm:nitro-nightly@latest", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@types/bun": "^1.2.22", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "typescript": "^5.9.0" + } +} diff --git a/examples/react/start-bun-bundler/scripts/build-nitro.ts b/examples/react/start-bun-bundler/scripts/build-nitro.ts new file mode 100644 index 00000000000..b70def07f6b --- /dev/null +++ b/examples/react/start-bun-bundler/scripts/build-nitro.ts @@ -0,0 +1,19 @@ +import { tanstackStart } from '@tanstack/react-start/plugin/bun' + +const start = tanstackStart({ + pages: [{ path: '/' }], + prerender: { + enabled: true, + failOnError: true, + }, + bun: { + nitro: { + preset: 'node-server', + }, + }, +}) + +await start.build() +console.info( + '[start-bun-bundler] nitro build complete → dist/* + .output/public + .output/server', +) diff --git a/examples/react/start-bun-bundler/scripts/build-standalone.ts b/examples/react/start-bun-bundler/scripts/build-standalone.ts new file mode 100644 index 00000000000..66fea4e00b6 --- /dev/null +++ b/examples/react/start-bun-bundler/scripts/build-standalone.ts @@ -0,0 +1,19 @@ +import { tanstackStart } from '@tanstack/react-start/plugin/bun' + +const start = tanstackStart({ + pages: [{ path: '/' }], + prerender: { + enabled: true, + failOnError: true, + }, + bun: { + standalone: { + outfile: 'dist/server/start', + }, + }, +}) + +await start.build() +console.info( + '[start-bun-bundler] standalone build complete → dist/server/start', +) diff --git a/examples/react/start-bun-bundler/scripts/build.ts b/examples/react/start-bun-bundler/scripts/build.ts new file mode 100644 index 00000000000..b1d77373d2c --- /dev/null +++ b/examples/react/start-bun-bundler/scripts/build.ts @@ -0,0 +1,12 @@ +import { tanstackStart } from '@tanstack/react-start/plugin/bun' + +const start = tanstackStart({ + pages: [{ path: '/' }], + prerender: { + enabled: true, + failOnError: true, + }, +}) + +await start.build() +console.info('[start-bun-bundler] build complete → dist/client + dist/server') diff --git a/examples/react/start-bun-bundler/scripts/dev.ts b/examples/react/start-bun-bundler/scripts/dev.ts new file mode 100644 index 00000000000..9aa826fe142 --- /dev/null +++ b/examples/react/start-bun-bundler/scripts/dev.ts @@ -0,0 +1,4 @@ +import { tanstackStart } from '@tanstack/react-start/plugin/bun' + +const start = tanstackStart({ bun: { port: 3000 } }) +await start.dev() diff --git a/examples/react/start-bun-bundler/scripts/smoke-nitro.ts b/examples/react/start-bun-bundler/scripts/smoke-nitro.ts new file mode 100644 index 00000000000..9beec9a2c7b --- /dev/null +++ b/examples/react/start-bun-bundler/scripts/smoke-nitro.ts @@ -0,0 +1,95 @@ +/** + * Smoke check: Nitro bridge build → .output/server → assert `/`, assets, public dir. + */ +import { spawn } from 'node:child_process' +import { existsSync } from 'node:fs' +import { join } from 'node:path' + +const root = join(import.meta.dir, '..') +const port = 3458 +const host = '127.0.0.1' + +async function waitForServer(url: string, attempts = 60) { + for (let i = 0; i < attempts; i++) { + try { + const res = await fetch(url) + if (res.ok || res.status === 200) { + return + } + } catch { + // retry + } + await Bun.sleep(150) + } + throw new Error(`Server did not become ready at ${url}`) +} + +console.info('[smoke-nitro] building with bun.nitro…') +const build = spawn('bun', ['run', './scripts/build-nitro.ts'], { + cwd: root, + stdio: 'inherit', +}) +await new Promise((resolve, reject) => { + build.on('exit', (code) => + code === 0 ? resolve() : reject(new Error(`build-nitro exited ${code}`)), + ) +}) + +const publicDir = join(root, '.output/public') +const serverEntry = join(root, '.output/server/index.mjs') +if (!existsSync(publicDir)) { + throw new Error(`missing ${publicDir}`) +} +if (!existsSync(serverEntry)) { + throw new Error(`missing ${serverEntry}`) +} + +const assetFiles = [...new Bun.Glob('assets/**/*').scanSync({ cwd: publicDir })] +if (assetFiles.length === 0) { + throw new Error(`.output/public has no assets/ files`) +} + +console.info('[smoke-nitro] starting .output/server/index.mjs…') +const server = spawn('node', [serverEntry], { + cwd: root, + env: { ...process.env, PORT: String(port), NITRO_PORT: String(port) }, + stdio: ['ignore', 'pipe', 'pipe'], +}) + +let stderr = '' +server.stderr?.on('data', (chunk) => { + stderr += String(chunk) +}) + +try { + await waitForServer(`http://${host}:${port}/`) + + const home = await fetch(`http://${host}:${port}/`) + const homeHtml = await home.text() + if (!home.ok) { + throw new Error(`GET / → ${home.status}`) + } + if (!homeHtml.includes('Hello from Bun-bundled Start')) { + throw new Error('GET / missing loader message in HTML') + } + + const preloadMatch = homeHtml.match( + /modulepreload[^>]+href="(\/assets\/[^"]+\.js)"/, + ) + if (!preloadMatch?.[1]) { + throw new Error('GET / missing modulepreload asset href') + } + const asset = await fetch(`http://${host}:${port}${preloadMatch[1]}`) + if (!asset.ok) { + throw new Error(`GET ${preloadMatch[1]} → ${asset.status}`) + } + + console.info('[smoke-nitro] ok') +} catch (err) { + if (stderr) { + console.error('[smoke-nitro] server stderr:\n', stderr) + } + throw err +} finally { + server.kill('SIGTERM') +} diff --git a/examples/react/start-bun-bundler/scripts/smoke-standalone.ts b/examples/react/start-bun-bundler/scripts/smoke-standalone.ts new file mode 100644 index 00000000000..36a591359e6 --- /dev/null +++ b/examples/react/start-bun-bundler/scripts/smoke-standalone.ts @@ -0,0 +1,88 @@ +/** + * Smoke: bun.standalone compile → run dist/server/start → assert `/` + assets. + */ +import { spawn } from 'node:child_process' +import { existsSync } from 'node:fs' +import { join } from 'node:path' + +const root = join(import.meta.dir, '..') +const port = 3459 +const host = '127.0.0.1' +const exe = join(root, 'dist/server/start') + +async function waitForServer(url: string, attempts = 80) { + for (let i = 0; i < attempts; i++) { + try { + const res = await fetch(url) + if (res.ok || res.status === 200) { + return + } + } catch { + // retry + } + await Bun.sleep(150) + } + throw new Error(`Server did not become ready at ${url}`) +} + +console.info('[smoke-standalone] building with bun.standalone…') +const build = spawn('bun', ['run', './scripts/build-standalone.ts'], { + cwd: root, + stdio: 'inherit', +}) +await new Promise((resolve, reject) => { + build.on('exit', (code) => + code === 0 + ? resolve() + : reject(new Error(`build-standalone exited ${code}`)), + ) +}) + +if (!existsSync(exe)) { + throw new Error(`missing standalone executable at ${exe}`) +} + +console.info('[smoke-standalone] starting executable…') +const server = spawn(exe, [], { + cwd: root, + env: { ...process.env, PORT: String(port), HOST: host }, + stdio: ['ignore', 'pipe', 'pipe'], +}) + +let stderr = '' +server.stderr?.on('data', (chunk) => { + stderr += String(chunk) +}) + +try { + await waitForServer(`http://${host}:${port}/`) + + const home = await fetch(`http://${host}:${port}/`) + const homeHtml = await home.text() + if (!home.ok) { + throw new Error(`GET / → ${home.status}`) + } + if (!homeHtml.includes('Hello from Bun-bundled Start')) { + throw new Error('GET / missing loader message in HTML') + } + + const preloadMatch = homeHtml.match( + /modulepreload[^>]+href="(\/assets\/[^"]+\.js)"/, + ) + if (!preloadMatch?.[1]) { + throw new Error('GET / missing modulepreload asset href') + } + const asset = await fetch(`http://${host}:${port}${preloadMatch[1]}`) + if (!asset.ok) { + throw new Error(`GET ${preloadMatch[1]} → ${asset.status}`) + } + + console.info('[smoke-standalone] ok') +} catch (err) { + if (stderr) { + console.error('[smoke-standalone] server stderr:\n', stderr) + } + throw err +} finally { + server.kill('SIGTERM') +} diff --git a/examples/react/start-bun-bundler/scripts/smoke.ts b/examples/react/start-bun-bundler/scripts/smoke.ts new file mode 100644 index 00000000000..c9dba94733b --- /dev/null +++ b/examples/react/start-bun-bundler/scripts/smoke.ts @@ -0,0 +1,87 @@ +/** + * Smoke check: build → host.js → assert `/`, `/about`, and static assets. + */ +import { spawn } from 'node:child_process' +import { join } from 'node:path' + +const root = join(import.meta.dir, '..') +const port = 3457 +const host = '127.0.0.1' + +async function waitForServer(url: string, attempts = 40) { + for (let i = 0; i < attempts; i++) { + try { + const res = await fetch(url) + if (res.ok || res.status === 200) { + return + } + } catch { + // retry + } + await Bun.sleep(100) + } + throw new Error(`Server did not become ready at ${url}`) +} + +console.info('[smoke] building…') +const build = spawn('bun', ['run', './scripts/build.ts'], { + cwd: root, + stdio: 'inherit', +}) +await new Promise((resolve, reject) => { + build.on('exit', (code) => + code === 0 ? resolve() : reject(new Error(`build exited ${code}`)), + ) +}) + +console.info('[smoke] starting host.js…') +const server = spawn('bun', ['run', './dist/server/host.js'], { + cwd: root, + env: { ...process.env, PORT: String(port) }, + stdio: ['ignore', 'pipe', 'pipe'], +}) + +try { + await waitForServer(`http://${host}:${port}/`) + + const home = await fetch(`http://${host}:${port}/`) + const homeHtml = await home.text() + if (!home.ok) { + throw new Error(`GET / → ${home.status}`) + } + if (!homeHtml.includes('Hello from Bun-bundled Start')) { + throw new Error('GET / missing loader message in HTML') + } + + const about = await fetch(`http://${host}:${port}/about`) + const aboutHtml = await about.text() + if (!about.ok) { + throw new Error(`GET /about → ${about.status}`) + } + if (!aboutHtml.includes('Second route')) { + throw new Error('GET /about missing expected body') + } + + const preloadMatch = homeHtml.match( + /modulepreload[^>]+href="(\/assets\/[^"]+\.js)"/, + ) + if (!preloadMatch?.[1]) { + throw new Error('GET / missing modulepreload asset href') + } + const asset = await fetch(`http://${host}:${port}${preloadMatch[1]}`) + if (!asset.ok) { + throw new Error(`GET ${preloadMatch[1]} → ${asset.status}`) + } + + const cssMatch = homeHtml.match(/href="(\/assets\/[^"]+\.css)"/) + if (cssMatch?.[1]) { + const css = await fetch(`http://${host}:${port}${cssMatch[1]}`) + if (!css.ok) { + throw new Error(`GET ${cssMatch[1]} → ${css.status}`) + } + } + + console.info('[smoke] ok') +} finally { + server.kill('SIGTERM') +} diff --git a/examples/react/start-bun-bundler/server.ts b/examples/react/start-bun-bundler/server.ts new file mode 100644 index 00000000000..d40fb590465 --- /dev/null +++ b/examples/react/start-bun-bundler/server.ts @@ -0,0 +1,30 @@ +/** + * Production host for the Bun-bundler example (static + SSR). + * Prefer `bun run dist/server/host.js` after build (same behavior, generated). + */ +const CLIENT_DIR = new URL('./dist/client/', import.meta.url).pathname +const SERVER_ENTRY = new URL('./dist/server/server.js', import.meta.url).pathname + +const handler = (await import(SERVER_ENTRY)) as { + default: { fetch: (req: Request) => Response | Promise } +} + +const server = Bun.serve({ + port: Number(process.env.PORT ?? 3000), + hostname: process.env.HOST ?? '0.0.0.0', + async fetch(req) { + const url = new URL(req.url) + if (url.pathname.startsWith('/assets/') || /\.\w+$/.test(url.pathname)) { + const relative = decodeURIComponent(url.pathname.replace(/^\//, '')) + if (!relative.includes('..')) { + const file = Bun.file(`${CLIENT_DIR}${relative}`) + if (await file.exists()) { + return new Response(file) + } + } + } + return handler.default.fetch(req) + }, +}) + +console.info(`[start-bun-bundler] http://localhost:${server.port}`) diff --git a/examples/react/start-bun-bundler/src/routeTree.gen.ts b/examples/react/start-bun-bundler/src/routeTree.gen.ts new file mode 100644 index 00000000000..12bc916ae46 --- /dev/null +++ b/examples/react/start-bun-bundler/src/routeTree.gen.ts @@ -0,0 +1,77 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as IndexRouteImport } from './routes/index' +import { Route as AboutRouteImport } from './routes/about' + +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) +const AboutRoute = AboutRouteImport.update({ + id: '/about', + path: '/about', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/about': typeof AboutRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/about': typeof AboutRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/about': typeof AboutRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/about' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/about' + id: '__root__' | '/' | '/about' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + AboutRoute: typeof AboutRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + '/about': { + id: '/about' + path: '/about' + fullPath: '/about' + preLoaderRoute: typeof AboutRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + AboutRoute: AboutRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/examples/react/start-bun-bundler/src/router.tsx b/examples/react/start-bun-bundler/src/router.tsx new file mode 100644 index 00000000000..a5954446483 --- /dev/null +++ b/examples/react/start-bun-bundler/src/router.tsx @@ -0,0 +1,10 @@ +import { createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +export const getRouter = () => { + return createRouter({ + routeTree, + scrollRestoration: true, + defaultPreloadStaleTime: 0, + }) +} diff --git a/examples/react/start-bun-bundler/src/routes/__root.tsx b/examples/react/start-bun-bundler/src/routes/__root.tsx new file mode 100644 index 00000000000..2d1a81bf317 --- /dev/null +++ b/examples/react/start-bun-bundler/src/routes/__root.tsx @@ -0,0 +1,26 @@ +import { HeadContent, Scripts, createRootRoute } from '@tanstack/react-router' + +export const Route = createRootRoute({ + head: () => ({ + meta: [ + { charSet: 'utf-8' }, + { name: 'viewport', content: 'width=device-width, initial-scale=1' }, + { title: 'TanStack Start Bun Bundler' }, + ], + }), + shellComponent: RootDocument, +}) + +function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + + {children} + + + + ) +} diff --git a/examples/react/start-bun-bundler/src/routes/about.tsx b/examples/react/start-bun-bundler/src/routes/about.tsx new file mode 100644 index 00000000000..bc1e2a18059 --- /dev/null +++ b/examples/react/start-bun-bundler/src/routes/about.tsx @@ -0,0 +1,17 @@ +import { createFileRoute, Link } from '@tanstack/react-router' + +export const Route = createFileRoute('/about')({ + component: About, +}) + +function About() { + return ( +
+

About

+

Second route to exercise Bun code-splitting.

+

+ Home +

+
+ ) +} diff --git a/examples/react/start-bun-bundler/src/routes/index.tsx b/examples/react/start-bun-bundler/src/routes/index.tsx new file mode 100644 index 00000000000..5197215a183 --- /dev/null +++ b/examples/react/start-bun-bundler/src/routes/index.tsx @@ -0,0 +1,27 @@ +import { createFileRoute, Link } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/react-start' + +const getMessage = createServerFn({ method: 'GET' }).handler(async () => { + return { message: 'Hello from Bun-bundled Start' } +}) + +export const Route = createFileRoute('/')({ + loader: () => getMessage(), + component: Home, +}) + +function Home() { + const data = Route.useLoaderData() + return ( +
+

TanStack Start + Bun bundler

+

{data.message}

+

+ This example uses @tanstack/react-start/plugin/bun (no Vite). +

+

+ About +

+
+ ) +} diff --git a/examples/react/start-bun-bundler/start.ts b/examples/react/start-bun-bundler/start.ts new file mode 100644 index 00000000000..3bacaf4587e --- /dev/null +++ b/examples/react/start-bun-bundler/start.ts @@ -0,0 +1,29 @@ +/** + * TanStack Start — Bun bundler entry (no Vite). + * + * Contrast with examples/react/start-bun which still uses Vite to build and + * Bun only as the production HTTP host. + */ +import { tanstackStart } from '@tanstack/react-start/plugin/bun' + +const start = tanstackStart({ + bun: { + port: 3000, + hostname: '0.0.0.0', + }, + pages: [{ path: '/' }], + prerender: { + enabled: true, + failOnError: true, + }, +}) + +const isDev = Bun.argv.includes('--dev') +const isBuild = Bun.argv.includes('--build') || !isDev + +if (isDev) { + await start.dev({ port: 3000 }) +} else if (isBuild) { + await start.build() + console.info('[start-bun-bundler] build complete → dist/client + dist/server') +} diff --git a/examples/react/start-bun-bundler/tsconfig.json b/examples/react/start-bun-bundler/tsconfig.json new file mode 100644 index 00000000000..cf0b9dfde27 --- /dev/null +++ b/examples/react/start-bun-bundler/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": true, + "noEmit": true, + "types": ["bun", "react", "react-dom"], + "paths": { + "#/*": ["./src/*"] + } + }, + "include": ["src", "scripts"] +} diff --git a/packages/react-start/package.json b/packages/react-start/package.json index 3a45bee126e..f07bcd33c15 100644 --- a/packages/react-start/package.json +++ b/packages/react-start/package.json @@ -94,6 +94,14 @@ "default": "./dist/esm/plugin/rsbuild.js" } }, + "./plugin/bun": { + "bun": "./src/plugin/bun.ts", + "import": { + "types": "./dist/esm/plugin/bun.d.ts", + "default": "./dist/esm/plugin/bun.js" + }, + "default": "./src/plugin/bun.ts" + }, "./server-entry": { "import": { "types": "./dist/default-entry/esm/server.d.ts", diff --git a/packages/react-start/src/plugin/bun.ts b/packages/react-start/src/plugin/bun.ts new file mode 100644 index 00000000000..d5d6b877ed2 --- /dev/null +++ b/packages/react-start/src/plugin/bun.ts @@ -0,0 +1,58 @@ +import { existsSync } from 'node:fs' +import { fileURLToPath } from 'node:url' +import path from 'pathe' +import { + BUN_ENVIRONMENT_NAMES, + tanStackStartBun, +} from '@tanstack/start-plugin-core/bun' +import { reactStartDefaultEntryPaths } from './shared' +import type { + TanStackStartBunInputConfig, + TanStackStartBunPluginCoreOptions, + TanStackStartBunAdapter, +} from '@tanstack/start-plugin-core/bun' + +function resolveDefaultEntryPaths() { + if (existsSync(reactStartDefaultEntryPaths.client)) { + return reactStartDefaultEntryPaths + } + + // Source-checkout fallback (before vite copies default-entry into plugin/) + const srcDefault = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../default-entry', + ) + return { + client: path.resolve(srcDefault, 'client.tsx'), + server: path.resolve(srcDefault, 'server.ts'), + start: path.resolve(srcDefault, 'start.ts'), + } +} + +/** + * TanStack Start Bun bundler adapter (imperative build/dev API). + * + * @example + * ```ts + * import { tanstackStart } from '@tanstack/react-start/plugin/bun' + * const start = tanstackStart() + * await start.build() + * // or + * await start.dev({ port: 3000 }) + * ``` + */ +export function tanstackStart( + options?: TanStackStartBunInputConfig, +): TanStackStartBunAdapter { + const corePluginOpts: TanStackStartBunPluginCoreOptions = { + framework: 'react', + defaultEntryPaths: resolveDefaultEntryPaths(), + providerEnvironmentName: BUN_ENVIRONMENT_NAMES.server, + ssrIsProvider: true, + bun: options?.bun, + } + + return tanStackStartBun(corePluginOpts, options) +} + +export type { TanStackStartBunAdapter, TanStackStartBunInputConfig } diff --git a/packages/react-start/vite.config.ts b/packages/react-start/vite.config.ts index 652e4ef8425..b5d83fd8f12 100644 --- a/packages/react-start/vite.config.ts +++ b/packages/react-start/vite.config.ts @@ -41,6 +41,7 @@ export default mergeConfig( './src/rsbuild/ssr-decode.ts', './src/plugin/rsbuild.ts', './src/plugin/vite.ts', + './src/plugin/bun.ts', './src/server-only.ts', './src/client-only.ts', ], diff --git a/packages/router-plugin/package.json b/packages/router-plugin/package.json index 6917fcc22ae..a0d345e4b5d 100644 --- a/packages/router-plugin/package.json +++ b/packages/router-plugin/package.json @@ -103,6 +103,18 @@ "default": "./dist/cjs/esbuild.cjs" } }, + "./bun": { + "bun": "./src/bun.ts", + "import": { + "types": "./dist/esm/bun.d.ts", + "default": "./dist/esm/bun.js" + }, + "require": { + "types": "./dist/cjs/bun.d.cts", + "default": "./dist/cjs/bun.cjs" + }, + "default": "./src/bun.ts" + }, "./package.json": "./package.json" }, "sideEffects": false, @@ -131,11 +143,13 @@ "@rsbuild/core": "^2.1.0", "@types/babel__core": "^7.20.5", "@types/babel__template": "^7.4.4", + "@types/bun": "^1.3.14", "@types/node": ">=20" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", "@tanstack/react-router": "workspace:^", + "bun": ">=1.2.0", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" @@ -147,6 +161,9 @@ "@tanstack/react-router": { "optional": true }, + "bun": { + "optional": true + }, "vite": { "optional": true }, diff --git a/packages/router-plugin/src/bun-shim.d.ts b/packages/router-plugin/src/bun-shim.d.ts new file mode 100644 index 00000000000..c8fecc5261f --- /dev/null +++ b/packages/router-plugin/src/bun-shim.d.ts @@ -0,0 +1,46 @@ +/** Minimal Bun ambient types for router-plugin bun entry. */ + +declare module 'bun' { + export interface OnLoadResult { + contents: string | Uint8Array + loader?: 'js' | 'jsx' | 'ts' | 'tsx' | 'json' | 'toml' | 'file' | 'text' + } + + export interface OnResolveResult { + path: string + namespace?: string + } + + export interface PluginBuilder { + onStart: (callback: () => void | Promise) => void + onResolve: ( + options: { filter: RegExp; namespace?: string }, + callback: (args: { + path: string + importer: string + namespace: string + kind: string + }) => OnResolveResult | undefined | Promise, + ) => void + onLoad: ( + options: { filter: RegExp; namespace?: string }, + callback: (args: { + path: string + namespace: string + }) => + | OnLoadResult + | undefined + | Promise + | null, + ) => void + } + + export interface BunPlugin { + name: string + setup: (build: PluginBuilder) => void | Promise + } +} + +declare var Bun: { + plugin: (plugin: import('bun').BunPlugin) => void +} diff --git a/packages/router-plugin/src/bun.ts b/packages/router-plugin/src/bun.ts new file mode 100644 index 00000000000..20828bc1ed1 --- /dev/null +++ b/packages/router-plugin/src/bun.ts @@ -0,0 +1,26 @@ +/** + * Bun bundler adapter for @tanstack/router-plugin. + * + * Prefer the native Bun code-splitter for `Bun.build({ plugins })`. + * Esbuild-shaped factories remain available for tools that accept esbuild plugins. + */ +export { configSchema } from './core/config' +export { + createBunRouterCodeSplitterPlugin, + createBunRouterCodeSplitterRuntime, +} from './core/bun-code-splitter-plugin' +export type { + BunCodeSplitterOptions, + BunCodeSplitterRuntime, +} from './core/bun-code-splitter-plugin' +export { createRouterPluginContext } from './core/router-plugin-context' + +export { + TanStackRouterGeneratorEsbuild as TanStackRouterGeneratorBun, + TanStackRouterCodeSplitterEsbuild as TanStackRouterCodeSplitterEsbuildBun, + TanStackRouterEsbuild as TanStackRouterBun, + tanstackRouter, + TanStackRouterEsbuild as default, +} from './esbuild' + +export type { Config, CodeSplittingOptions, RouterPluginContext } from './esbuild' diff --git a/packages/router-plugin/src/core/bun-code-splitter-plugin.ts b/packages/router-plugin/src/core/bun-code-splitter-plugin.ts new file mode 100644 index 00000000000..e9197224cb2 --- /dev/null +++ b/packages/router-plugin/src/core/bun-code-splitter-plugin.ts @@ -0,0 +1,352 @@ +/** + * Bun-native code-splitter (esbuild-adjacent onResolve/onLoad). + * Mirrors createRouterCodeSplitterPlugin transform handlers without unplugin. + * + * Reference-file transforms must be applied by the Start compiler host (or another + * onLoad owner) because Bun only allows one successful onLoad per module. + * This plugin only owns `tsr-split` / `tsr-shared` virtual modules. + */ + +import { readFile } from 'node:fs/promises' +import { fileURLToPath, pathToFileURL } from 'node:url' +import { decodeIdentifier, logDiff } from '@tanstack/router-utils' +import { getConfig, splitGroupingsSchema } from './config' +import { + compileCodeSplitReferenceRoute, + compileCodeSplitSharedRoute, + compileCodeSplitVirtualRoute, + computeSharedBindings, + detectCodeSplitGroupingsFromRoute, +} from './code-splitter/compilers' +import { getFrameworkHmrCompilerPlugins } from './code-splitter/plugins/framework-plugins' +import { + defaultCodeSplitGroupings, + splitRouteIdentNodes, + tsrShared, + tsrSplit, +} from './constants' +import { debug, normalizePath, routeFactoryCallCodeFilter } from './utils' +import type { CodeSplitGroupings, SplitRouteIdentNodes } from './constants' +import type { GetRoutesByFileMapResultValue } from '@tanstack/router-generator' +import type { CodeSplitCompilerPlugin } from './code-splitter/plugins' +import type { Config, HmrStyle } from './config' +import type { RouterPluginContext } from './router-plugin-context' +import type { BunPlugin } from 'bun' + +export type BunCodeSplitterOptions = { + root: string + isProduction?: boolean + /** Merged into getConfig / function options */ + config?: Partial | (() => Config) +} + +export type BunCodeSplitterRuntime = { + plugin: BunPlugin + /** Apply reference-route code-splitting; returns original code when unchanged. */ + transformReference: (code: string, id: string) => string +} + +function matchesRouteFactory(code: string): boolean { + return routeFactoryCallCodeFilter.some((re) => re.test(code)) +} + +function loaderForPath(filePath: string): 'tsx' | 'ts' | 'jsx' | 'js' { + if (filePath.endsWith('.tsx')) return 'tsx' + if (filePath.endsWith('.jsx')) return 'jsx' + if (filePath.endsWith('.ts')) return 'ts' + return 'js' +} + +function stripQuery(id: string): string { + const q = id.indexOf('?') + return q >= 0 ? id.slice(0, q) : id +} + +/** + * Create Bun code-splitter runtime: virtual-module plugin + reference transform. + */ +export function createBunRouterCodeSplitterRuntime( + routerPluginContext: RouterPluginContext, + bunOptions: BunCodeSplitterOptions, +): BunCodeSplitterRuntime { + const isProduction = + bunOptions.isProduction ?? process.env.NODE_ENV === 'production' + const ROOT = bunOptions.root + + let userConfig: Config + let addHmr: boolean + let hmrStyle: HmrStyle + let compilerPlugins: Array + let virtualRouteCompilerPlugins: Array + + const sharedBindingsMap = new Map>() + + const initUserConfig = () => { + const options = bunOptions.config ?? {} + if (typeof options === 'function') { + userConfig = options() + } else { + userConfig = getConfig(options, ROOT) + } + + addHmr = (userConfig.codeSplittingOptions?.addHmr ?? true) && !isProduction + hmrStyle = userConfig.plugin?.hmr?.style ?? 'vite' + compilerPlugins = [ + ...(addHmr + ? (getFrameworkHmrCompilerPlugins({ + targetFramework: userConfig.target, + hmrStyle, + }) ?? []) + : []), + ...(userConfig.codeSplittingOptions?.compilerPlugins ?? []), + ] + virtualRouteCompilerPlugins = compilerPlugins.filter( + (plugin) => plugin.onVirtualRouteSplitNode, + ) + } + + initUserConfig() + + const getGlobalCodeSplitGroupings = () => { + return ( + userConfig.codeSplittingOptions?.defaultBehavior || + defaultCodeSplitGroupings + ) + } + const getShouldSplitFn = () => { + return userConfig.codeSplittingOptions?.splitBehavior + } + + const handleCompilingReferenceFile = ( + code: string, + id: string, + generatorNodeInfo: GetRoutesByFileMapResultValue, + ): { code: string } | null => { + if (debug) console.info('[bun code-splitter] Compiling Route: ', id) + + const fromCode = detectCodeSplitGroupingsFromRoute({ + code, + filename: id, + }) + + if (fromCode.groupings !== undefined) { + const res = splitGroupingsSchema.safeParse(fromCode.groupings) + if (!res.success) { + const message = res.error.issues.map((e) => e.message).join('. ') + throw new Error( + `The groupings for the route "${id}" are invalid.\n${message}`, + ) + } + } + + const userShouldSplitFn = getShouldSplitFn() + const pluginSplitBehavior = userShouldSplitFn?.({ + routeId: generatorNodeInfo.routeId, + }) as CodeSplitGroupings | undefined + + if (pluginSplitBehavior) { + const res = splitGroupingsSchema.safeParse(pluginSplitBehavior) + if (!res.success) { + const message = res.error.issues.map((e) => e.message).join('. ') + throw new Error( + `The groupings returned when using \`splitBehavior\` for the route "${id}" are invalid.\n${message}`, + ) + } + } + + const splitGroupings: CodeSplitGroupings = + fromCode.groupings ?? pluginSplitBehavior ?? getGlobalCodeSplitGroupings() + + const sharedBindings = computeSharedBindings({ + code, + filename: id, + codeSplitGroupings: splitGroupings, + }) + if (sharedBindings.size > 0) { + sharedBindingsMap.set(id, sharedBindings) + } else { + sharedBindingsMap.delete(id) + } + + const compiledReferenceRoute = compileCodeSplitReferenceRoute({ + code, + codeSplitGroupings: splitGroupings, + targetFramework: userConfig.target, + filename: id, + id, + deleteNodes: userConfig.codeSplittingOptions?.deleteNodes + ? new Set(userConfig.codeSplittingOptions.deleteNodes) + : undefined, + addHmr, + hmrStyle, + hmrRouteId: generatorNodeInfo.routeId, + sharedBindings: sharedBindings.size > 0 ? sharedBindings : undefined, + compilerPlugins, + }) + + if (compiledReferenceRoute === null) { + return null + } + if (debug) { + logDiff(code, compiledReferenceRoute.code) + } + return compiledReferenceRoute + } + + const handleCompilingVirtualFile = (code: string, id: string) => { + if (debug) console.info('[bun code-splitter] Splitting Route: ', id) + + const [_, ...pathnameParts] = id.split('?') + const searchParams = new URLSearchParams(pathnameParts.join('?')) + const splitValue = searchParams.get(tsrSplit) + + if (!splitValue) { + throw new Error( + `The split value for the virtual route "${id}" was not found.`, + ) + } + + const rawGrouping = decodeIdentifier(splitValue) + const grouping = [...new Set(rawGrouping)].filter((p) => + splitRouteIdentNodes.includes(p as any), + ) as Array + + const baseId = id.split('?')[0]! + const resolvedSharedBindings = sharedBindingsMap.get(baseId) + + const result = compileCodeSplitVirtualRoute({ + code, + filename: id, + splitTargets: grouping, + sharedBindings: resolvedSharedBindings, + compilerPlugins: virtualRouteCompilerPlugins, + }) + + if (debug) { + logDiff(code, result.code) + } + return result + } + + const handleCompilingSharedFile = (code: string, id: string) => { + const url = pathToFileURL(id) + url.searchParams.delete('v') + const normalizedId = normalizePath(fileURLToPath(url)) + const [baseId] = normalizedId.split('?') + if (!baseId) return null + + const sharedBindings = sharedBindingsMap.get(baseId) + if (!sharedBindings || sharedBindings.size === 0) return null + + if (debug) console.info('[bun code-splitter] Shared Module: ', id) + + const result = compileCodeSplitSharedRoute({ + code, + sharedBindings, + filename: normalizedId, + }) + if (debug) { + logDiff(code, result.code) + } + return result + } + + const transformReference = (code: string, id: string): string => { + initUserConfig() + const normalizedId = normalizePath(stripQuery(id)) + const generatorFileInfo = + routerPluginContext.routesByFile.get(normalizedId) + if (!generatorFileInfo) { + return code + } + if (!matchesRouteFactory(code)) { + return code + } + const result = handleCompilingReferenceFile( + code, + normalizedId, + generatorFileInfo, + ) + return result?.code ?? code + } + + const plugin: BunPlugin = { + name: 'tanstack-router:code-splitter:bun', + setup(build) { + build.onStart(() => { + initUserConfig() + }) + + const resolveQueryModule = ( + args: { path: string }, + kind: 'split' | 'shared', + ) => { + const marker = kind === 'split' ? tsrSplit : tsrShared + if (!args.path.includes(marker)) { + return undefined + } + const filePath = stripQuery(args.path) + return { + path: args.path.includes('?') ? args.path : `${filePath}?${marker}=1`, + namespace: kind === 'split' ? 'tsr-split' : 'tsr-shared', + } + } + + build.onResolve({ filter: /tsr-split/ }, (args) => + resolveQueryModule(args, 'split'), + ) + build.onResolve({ filter: /tsr-shared/ }, (args) => + resolveQueryModule(args, 'shared'), + ) + build.onResolve({ filter: /^\// }, (args) => { + if (args.path.includes(tsrSplit)) { + return resolveQueryModule(args, 'split') + } + if (args.path.includes(tsrShared)) { + return resolveQueryModule(args, 'shared') + } + return undefined + }) + + build.onLoad({ filter: /.*/, namespace: 'tsr-split' }, async (args) => { + const filePath = stripQuery(args.path) + const code = await readFile(filePath, 'utf8') + const url = pathToFileURL(args.path) + url.searchParams.delete('v') + const normalizedId = normalizePath(fileURLToPath(url)) + const result = handleCompilingVirtualFile(code, normalizedId) + return { + contents: result.code, + loader: loaderForPath(filePath), + } + }) + + build.onLoad({ filter: /.*/, namespace: 'tsr-shared' }, async (args) => { + const filePath = stripQuery(args.path) + const code = await readFile(filePath, 'utf8') + const result = handleCompilingSharedFile(code, args.path) + if (!result) { + return { contents: code, loader: loaderForPath(filePath) } + } + return { + contents: result.code, + loader: loaderForPath(filePath), + } + }) + }, + } + + return { plugin, transformReference } +} + +/** + * Convenience: Bun plugin only (virtual modules). Prefer + * {@link createBunRouterCodeSplitterRuntime} when composing with StartCompiler. + */ +export function createBunRouterCodeSplitterPlugin( + routerPluginContext: RouterPluginContext, + bunOptions: BunCodeSplitterOptions, +): BunPlugin { + return createBunRouterCodeSplitterRuntime(routerPluginContext, bunOptions) + .plugin +} diff --git a/packages/router-plugin/tests/bun-code-splitter-plugin.test.ts b/packages/router-plugin/tests/bun-code-splitter-plugin.test.ts new file mode 100644 index 00000000000..38c21170ea2 --- /dev/null +++ b/packages/router-plugin/tests/bun-code-splitter-plugin.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it } from 'vitest' +import { createRouterPluginContext } from '../src/core/router-plugin-context' +import { createBunRouterCodeSplitterRuntime } from '../src/core/bun-code-splitter-plugin' + +describe('createBunRouterCodeSplitterRuntime', () => { + it('returns a named Bun plugin with setup and reference transform', () => { + const context = createRouterPluginContext() + context.routesByFile.set('/tmp/routes/index.tsx', { routeId: '/' }) + + const runtime = createBunRouterCodeSplitterRuntime(context, { + root: '/tmp', + isProduction: true, + config: { + target: 'react', + routesDirectory: './routes', + generatedRouteTree: './routeTree.gen.ts', + }, + }) + + expect(runtime.plugin.name).toBe('tanstack-router:code-splitter:bun') + expect(typeof runtime.plugin.setup).toBe('function') + expect(typeof runtime.transformReference).toBe('function') + }) +}) diff --git a/packages/router-plugin/vite.config.ts b/packages/router-plugin/vite.config.ts index e80f073d218..007d1bd28d3 100644 --- a/packages/router-plugin/vite.config.ts +++ b/packages/router-plugin/vite.config.ts @@ -22,6 +22,7 @@ export default mergeConfig( './src/rspack.ts', './src/webpack.ts', './src/esbuild.ts', + './src/bun.ts', ], srcDir: './src', }), diff --git a/packages/solid-start/package.json b/packages/solid-start/package.json index ce4216d506c..a67b0d73bc8 100644 --- a/packages/solid-start/package.json +++ b/packages/solid-start/package.json @@ -86,6 +86,14 @@ "default": "./dist/esm/plugin/rsbuild.js" } }, + "./plugin/bun": { + "bun": "./src/plugin/bun.ts", + "import": { + "types": "./dist/esm/plugin/bun.d.ts", + "default": "./dist/esm/plugin/bun.js" + }, + "default": "./src/plugin/bun.ts" + }, "./server-entry": { "import": { "types": "./dist/default-entry/esm/server.d.ts", diff --git a/packages/solid-start/src/plugin/bun.ts b/packages/solid-start/src/plugin/bun.ts new file mode 100644 index 00000000000..6facd97d069 --- /dev/null +++ b/packages/solid-start/src/plugin/bun.ts @@ -0,0 +1,48 @@ +import { existsSync } from 'node:fs' +import { fileURLToPath } from 'node:url' +import path from 'pathe' +import { + BUN_ENVIRONMENT_NAMES, + tanStackStartBun, +} from '@tanstack/start-plugin-core/bun' +import { solidStartDefaultEntryPaths } from './shared' +import type { + TanStackStartBunInputConfig, + TanStackStartBunPluginCoreOptions, + TanStackStartBunAdapter, +} from '@tanstack/start-plugin-core/bun' + +function resolveDefaultEntryPaths() { + if (existsSync(solidStartDefaultEntryPaths.client)) { + return solidStartDefaultEntryPaths + } + + const srcDefault = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../default-entry', + ) + return { + client: path.resolve(srcDefault, 'client.tsx'), + server: path.resolve(srcDefault, 'server.ts'), + start: path.resolve(srcDefault, 'start.ts'), + } +} + +/** + * TanStack Start Bun bundler adapter for Solid (imperative build/dev API). + */ +export function tanstackStart( + options?: TanStackStartBunInputConfig, +): TanStackStartBunAdapter { + const corePluginOpts: TanStackStartBunPluginCoreOptions = { + framework: 'solid', + defaultEntryPaths: resolveDefaultEntryPaths(), + providerEnvironmentName: BUN_ENVIRONMENT_NAMES.server, + ssrIsProvider: true, + bun: options?.bun, + } + + return tanStackStartBun(corePluginOpts, options) +} + +export type { TanStackStartBunAdapter, TanStackStartBunInputConfig } diff --git a/packages/solid-start/vite.config.ts b/packages/solid-start/vite.config.ts index 2c1a42d0e49..49fad9ffe88 100644 --- a/packages/solid-start/vite.config.ts +++ b/packages/solid-start/vite.config.ts @@ -34,6 +34,7 @@ export default mergeConfig( './src/server.tsx', './src/plugin/rsbuild.ts', './src/plugin/vite.ts', + './src/plugin/bun.ts', './src/server-only.ts', './src/client-only.ts', ], diff --git a/packages/start-plugin-core/package.json b/packages/start-plugin-core/package.json index 6bfb751f87b..84eef2c1582 100644 --- a/packages/start-plugin-core/package.json +++ b/packages/start-plugin-core/package.json @@ -74,6 +74,14 @@ "default": "./dist/esm/rsbuild/types.js" } }, + "./bun": { + "bun": "./src/bun/index.ts", + "import": { + "types": "./dist/esm/bun/index.d.ts", + "default": "./dist/esm/bun/index.js" + }, + "default": "./src/bun/index.ts" + }, "./package.json": "./package.json" }, "sideEffects": false, @@ -104,24 +112,38 @@ "ufo": "^1.5.4", "vitefu": "^1.1.1", "xmlbuilder2": "^4.0.3", - "zod": "^4.4.3" + "zod": "^4.4.3", + "react-refresh": "^0.18.0" }, "devDependencies": { "@rsbuild/core": "^2.1.0", "@types/babel__code-frame": "^7.0.6", "@types/babel__core": "^7.20.5", + "@types/bun": "^1.3.14", "@types/node": ">=20", "@types/picomatch": "^4.0.2", "vite": "*" }, "peerDependencies": { "@rsbuild/core": "^2.0.0", + "@tailwindcss/node": "^4.0.0", + "bun": ">=1.2.0", + "nitro": ">=3.0.0-alpha || >=3.0.0-beta || >=3.0.0", "vite": ">=7.0.0" }, "peerDependenciesMeta": { "@rsbuild/core": { "optional": true }, + "@tailwindcss/node": { + "optional": true + }, + "bun": { + "optional": true + }, + "nitro": { + "optional": true + }, "vite": { "optional": true } diff --git a/packages/start-plugin-core/src/bun/ARCHITECTURE.md b/packages/start-plugin-core/src/bun/ARCHITECTURE.md new file mode 100644 index 00000000000..5bd5b5a0a89 --- /dev/null +++ b/packages/start-plugin-core/src/bun/ARCHITECTURE.md @@ -0,0 +1,97 @@ +# Bun Adapter Architecture + +TanStack Start 的 Bun bundler 适配层。对齐 `rsbuild/`:共享核心(config / planning / start-compiler / manifestBuilder / import-protection / post-build)+ Bun 特有壳。 + +## 三种生产产物(勿混名) + +| 产物 | 配置 | 交付物 | 运行时 | +|------|------|--------|--------| +| **默认 dist** | (无) | `dist/client` + `dist/server/{server.js,host.js}` | 本机 Bun:`bun dist/server/host.js` | +| **Nitro `.output`** | `bun.nitro` | `.output/public` + `.output/server` | 按 preset(如 `node .output/server/index.mjs`) | +| **Standalone 可执行文件** | `bun.standalone` | 如 `dist/server/start`(嵌入 client + server) | 直接跑二进制(OS/arch 绑定) | + +与 Vite / Rsbuild 对照: + +| 路径 | Nitro | 生产宿主 | +|------|-------|----------| +| **Vite Start** | 应用侧组合 `nitro()` from `nitro/vite` | Nitro → `.output` | +| **Rsbuild Start** | **不支持** Nitro | `dist` + srvx / 静态+`fetch` | +| **Bun bundler** | 可选 `bun.nitro`;另可选 `bun.standalone` | 默认 `host.js`;或 `.output`;或 compile 二进制 | + +官方文档里多数「Bun 部署」是 **Vite 打包 + `nitro({ preset: 'bun' })`**(Bun 当 **runtime**),不是 Bun 当 bundler。 + +## API + +```ts +import { tanstackStart } from '@tanstack/react-start/plugin/bun' + +const start = tanstackStart({ bun: { port: 3000 } }) +await start.build() // client + server Bun.build + host.js + post-build +await start.serve() // 生产:dist/client 静态 + server.js fetch +const server = await start.dev() // build + Bun.serve + src watch rebuild + +// 可选 Nitro → .output(仅生产) +await tanstackStart({ bun: { nitro: { preset: 'node-server' } } }).build() + +// 可选 Bun standalone 可执行文件(仅生产;始终基于 dist/,不编 .output) +await tanstackStart({ + bun: { standalone: { outfile: 'dist/server/start' } }, +}).build() +``` + +## 产物契约 + +| 路径 | 含义 | +|------|------| +| `dist/server/server.js` | 纯 `default.fetch`(可挂到其他宿主) | +| `dist/server/host.js` | **默认生产推荐入口**:先静态 `../client`,再 SSR | +| `dist/client/**` | 浏览器资源(`/assets/...`) | +| `.output/**` | 仅当 `bun.nitro`:Nitro preset 产物 | +| `dist/server/start`(可配置) | 仅当 `bun.standalone`:`Bun.build({ compile })` 可执行文件 | + +## 冷构建顺序 + +1. `prepare`:解析 root / base / outDir,`resolveStartEntryPlan`,seed 虚拟模块 +2. Generator:写出 `routeTree.gen.ts` + `TSS_ROUTES_MANIFEST` +3. **Client `Bun.build`**(`target: 'browser'`) +4. 归一化产物 → `NormalizedClientBuild` → 更新 start manifest 虚拟模块 +5. 刷新 `#tanstack-start-server-fn-resolver` +6. **Server `Bun.build`**(`target: 'bun'`) +7. 写出 `dist/server/host.js` +8. **若 `bun.nitro`**:`createNitro` → … → `.output` +9. `postBuildWithBun`(prerender / sitemap) +10. **若 `bun.standalone`**:生成嵌入 `dist/client` 的 entry → `Bun.build({ compile })`(**始终嵌入 `dist/client`**,即使 Nitro prerender 写到了 `.output/public`) + +## CSS + +内置 `createCssAssetsPlugin`(`?url` / 副作用 CSS / 可选 Tailwind)。 + +## Nitro bridge(可选) + +- optional peer `nitro`;`nitro-bridge.ts`;Dev 仍用 Bun host + +## Standalone compile(可选) + +- `standalone-compile.ts`:`import … with { type: "file" }` 嵌入 public,再 `compile` +- 体积大、按 OS/arch 绑定;交叉编译用 `standalone.target` +- 与 `bun.nitro` 可并存(各产各的);不互相替代 + +## 虚拟模块键 + +| id | 内容 | +|----|------| +| `virtual:tanstack-start-*-entry` / `#tanstack-*` | entry alias | +| `#tanstack-start-server-fn-resolver` | serverFn registry | +| `tanstack-start-manifest:v` | SSR 资源 manifest | +| `#tanstack-start-plugin-adapters` | serialization adapters | + +## Dev / HMR + +`createBunDevServer`:分类重建 + ESM HMR + React Refresh。Dev **不**跑 Nitro / standalone compile。 + +## 文件 + +- `plugin.ts` — 编排 +- `nitro-bridge.ts` — 可选 Nitro 3 post-build +- `standalone-compile.ts` — 可选 Bun `--compile` 可执行文件 +- `static-host.ts` / `css-assets-plugin.ts` / `post-build.ts` / `dev-server.ts` … diff --git a/packages/start-plugin-core/src/bun/bun-plugins.ts b/packages/start-plugin-core/src/bun/bun-plugins.ts new file mode 100644 index 00000000000..5224df0272c --- /dev/null +++ b/packages/start-plugin-core/src/bun/bun-plugins.ts @@ -0,0 +1,99 @@ +import type { BunPlugin } from 'bun' +import { ENTRY_POINTS } from '../constants' +import { EMPTY_SERIALIZATION_ADAPTERS_MODULE } from '../serialization-adapters-module' +import { + isBunVirtualModuleId, + VIRTUAL_MODULES, +} from './virtual-modules' +import type { BunResolvedEntryAliases } from './planning' +import type { BunVirtualModuleStore } from './virtual-modules' + +const ALIAS_FILTER = new RegExp( + `^(${[ + ENTRY_POINTS.client, + ENTRY_POINTS.server, + ENTRY_POINTS.start, + ENTRY_POINTS.router, + VIRTUAL_MODULES.serverFnResolver, + VIRTUAL_MODULES.startManifest, + VIRTUAL_MODULES.pluginAdapters, + ] + .map((id) => id.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) + .join('|')}|virtual:tanstack-|tanstack-start-)`, +) + +/** Resolve entry aliases and virtual modules before filesystem lookup. */ +export function createBunAliasAndVirtualPlugin(opts: { + aliases: BunResolvedEntryAliases['alias'] + virtualModules: BunVirtualModuleStore +}): BunPlugin { + const aliasEntries = Object.entries(opts.aliases) + + return { + name: 'tanstack-start-bun-aliases', + setup(build) { + // IMPORTANT: do not use filter /.*/ — Bun can drop package imports when a + // catch-all onResolve participates in packages:'bundle' builds. + build.onResolve({ filter: ALIAS_FILTER }, (args) => { + for (const [id, target] of aliasEntries) { + if (args.path === id) { + return { path: target } + } + } + + if ( + args.path === VIRTUAL_MODULES.serverFnResolver || + args.path === VIRTUAL_MODULES.startManifest || + args.path === VIRTUAL_MODULES.pluginAdapters || + isBunVirtualModuleId(args.path) + ) { + return { + path: args.path, + namespace: 'tanstack-virtual', + } + } + + return undefined + }) + + build.onLoad({ filter: /.*/, namespace: 'tanstack-virtual' }, (args) => { + if (args.path === VIRTUAL_MODULES.pluginAdapters) { + return { + contents: + opts.virtualModules.get(VIRTUAL_MODULES.pluginAdapters) ?? + `export const hasPluginAdapters = false +export const pluginSerializationAdapters = [] +export const adapters = [] +export default adapters +`, + loader: 'js', + } + } + + const contents = opts.virtualModules.get(args.path) + if (contents === undefined) { + if (args.path === VIRTUAL_MODULES.serverFnResolver) { + return { + contents: `export async function getServerFnById() { throw new Error('Server function resolver not ready') }`, + loader: 'js', + } + } + if (args.path === VIRTUAL_MODULES.startManifest) { + return { + contents: `export const tsrStartManifest = () => ({ routes: {} })`, + loader: 'js', + } + } + return { + contents: 'export {}', + loader: 'js', + } + } + + return { contents, loader: 'js' } + }) + }, + } +} + +export { ENTRY_POINTS } diff --git a/packages/start-plugin-core/src/bun/bun-shim.d.ts b/packages/start-plugin-core/src/bun/bun-shim.d.ts new file mode 100644 index 00000000000..b49df4a4fe6 --- /dev/null +++ b/packages/start-plugin-core/src/bun/bun-shim.d.ts @@ -0,0 +1,114 @@ +/** Minimal Bun ambient types for the Start bun adapter (local fork). */ + +declare module 'bun' { + export type Loader = + | 'js' + | 'jsx' + | 'ts' + | 'tsx' + | 'json' + | 'toml' + | 'text' + | 'file' + | 'wasm' + | 'napi' + | 'html' + | 'css' + | 'object' + + export interface BunPlugin { + name: string + setup: (build: PluginBuilder) => void | Promise + } + + export interface PluginBuilder { + onStart: (callback: () => void | Promise) => void + onResolve: ( + options: { filter: RegExp; namespace?: string }, + callback: (args: { + path: string + importer: string + namespace: string + kind: string + }) => + | { path: string; namespace?: string } + | undefined + | Promise<{ path: string; namespace?: string } | undefined>, + ) => void + onLoad: ( + options: { filter: RegExp; namespace?: string }, + callback: (args: { + path: string + namespace: string + }) => + | { contents: string; loader?: Loader } + | undefined + | Promise<{ contents: string; loader?: Loader } | undefined>, + ) => void + } + + export interface BuildConfig { + entrypoints: Array + outdir?: string + outfile?: string + target?: 'browser' | 'bun' | 'node' + format?: 'esm' | 'cjs' | 'iife' + splitting?: boolean + minify?: boolean + sourcemap?: boolean | 'none' | 'linked' | 'external' | 'inline' + naming?: string | { entry?: string; chunk?: string; asset?: string } + define?: Record + plugins?: Array + packages?: 'bundle' | 'external' + /** Standalone executable (Bun --compile). */ + compile?: boolean | string | Record + } + + export interface BuildArtifact { + path: string + kind: 'entry-point' | 'chunk' | 'asset' | 'sourcemap' | string + } + + export interface BuildOutput { + success: boolean + outputs: Array + logs: Array<{ message: string }> + } + + export function build(config: BuildConfig): Promise + export function plugin(plugin: BunPlugin): void + export function resolve(id: string, from?: string): Promise + export function resolveSync(id: string, from?: string): string + export function sleep(ms: number): Promise + export function serve(options: { + port?: number + hostname?: string + fetch: (req: Request) => Response | Promise + }): { port: number; stop: (closeActiveConnections?: boolean) => void } + export function file( + path: string, + ): { + exists: () => Promise + } & Blob + + export class Transpiler { + constructor(options?: { loader?: Loader }) + transformSync(code: string, loader?: Loader): string + transform(code: string, loader?: Loader): Promise + } + + const Bun: { + build: typeof build + plugin: typeof plugin + resolve: typeof resolve + resolveSync: typeof resolveSync + serve: typeof serve + file: typeof file + sleep: typeof sleep + Transpiler: typeof Transpiler + } + + export default Bun +} + +declare var Bun: typeof import('bun').default diff --git a/packages/start-plugin-core/src/bun/css-assets-plugin.ts b/packages/start-plugin-core/src/bun/css-assets-plugin.ts new file mode 100644 index 00000000000..9f6cc8a7c10 --- /dev/null +++ b/packages/start-plugin-core/src/bun/css-assets-plugin.ts @@ -0,0 +1,238 @@ +/** + * First-class CSS pipeline for Bun.build: + * - `import x from './file.css?url'` → hashed asset + `export default "/assets/..."` + * - side-effect `import './file.css'` → hashed asset + empty JS module + * - optional Tailwind v4 via `@tailwindcss/node` (optional peer) + */ + +import { createHash } from 'node:crypto' +import { mkdir, readFile, writeFile } from 'node:fs/promises' +import { basename, dirname, join } from 'pathe' +import { globSync } from 'tinyglobby' +import type { BunCssOptions } from './types' +import type { BunPlugin } from 'bun' + +export interface CssAssetsPluginOptions { + root: string + clientOutDir: string + publicBase: string + srcDirectory: string + css?: BunCssOptions | undefined +} + +function normalizePublicBase(base: string): string { + if (!base || base === '/') { + return '/' + } + return base.endsWith('/') ? base : `${base}/` +} + +function stripQuery(id: string): string { + const q = id.indexOf('?') + return q >= 0 ? id.slice(0, q) : id +} + +function looksLikeTailwind(css: string): boolean { + return ( + /@import\s+["']tailwindcss["']/.test(css) || + /@tailwind\s+/.test(css) || + /@theme\b/.test(css) + ) +} + +async function collectTailwindCandidates( + root: string, + srcDirectory: string, + contentGlobs?: Array, +): Promise> { + const patterns = + contentGlobs && contentGlobs.length > 0 + ? contentGlobs + : [ + join(srcDirectory, '**/*.{js,jsx,ts,tsx,html}'), + join(srcDirectory, '**/*.{js,jsx,ts,tsx,html}').replace(/\\/g, '/'), + ] + + const files = globSync(patterns, { + cwd: root, + absolute: true, + onlyFiles: true, + }) + + const candidates = new Set() + // Rough class-like token scan (good enough for Tailwind utility discovery) + const classRe = /[^a-zA-Z0-9_-]([a-zA-Z][a-zA-Z0-9_:/\[\]%.+-]*)/g + for (const file of files) { + let text: string + try { + text = await readFile(file, 'utf8') + } catch { + continue + } + classRe.lastIndex = 0 + let match: RegExpExecArray | null + while ((match = classRe.exec(text)) !== null) { + const token = match[1] + if (token && token.length > 1 && !token.includes('://')) { + candidates.add(token) + } + } + } + return [...candidates] +} + +async function applyTailwind( + css: string, + opts: { + id: string + root: string + srcDirectory: string + content?: Array + }, +): Promise { + try { + // Resolve from the app root (not this package) so optional peer installs work + // when start-plugin-core is symlinked from a monorepo. + let twModulePath = '@tailwindcss/node' + try { + twModulePath = await Bun.resolve('@tailwindcss/node', opts.root) + } catch { + try { + const { createRequire } = await import('node:module') + const req = createRequire(join(opts.root, 'package.json')) + twModulePath = req.resolve('@tailwindcss/node') + } catch { + // fall through to bare specifier + } + } + + const tw = (await import(twModulePath)) as { + compile: ( + input: string, + options: { + base: string + from?: string + onDependency: (path: string) => void + }, + ) => Promise<{ build: (candidates: Array) => string }> + } + const compiled = await tw.compile(css, { + base: dirname(opts.id), + from: opts.id, + onDependency() {}, + }) + const candidates = await collectTailwindCandidates( + opts.root, + opts.srcDirectory, + opts.content, + ) + return compiled.build(candidates) + } catch (error) { + console.warn( + '[tanstack-start-bun] Tailwind CSS compile skipped:', + error instanceof Error ? error.message : error, + ) + return null + } +} + +export function createCssAssetsPlugin( + opts: CssAssetsPluginOptions, +): BunPlugin { + const publicBase = normalizePublicBase(opts.publicBase) + const written = new Map() // abs path → public url + const cssOpts = opts.css ?? {} + const tailwindMode = cssOpts.tailwind ?? 'auto' + + const transformCss = async (code: string, id: string): Promise => { + let next = code + if (cssOpts.transform) { + next = await cssOpts.transform(next, { id }) + } + + const wantTailwind = + tailwindMode === true || + (tailwindMode === 'auto' && looksLikeTailwind(next)) + + if (wantTailwind) { + const tw = await applyTailwind(next, { + id, + root: opts.root, + srcDirectory: opts.srcDirectory, + content: cssOpts.content, + }) + if (tw !== null) { + next = tw + } else if (tailwindMode === true) { + console.warn( + '[tanstack-start-bun] bun.css.tailwind=true but @tailwindcss/node failed; emitting raw CSS', + ) + } + } + + return next + } + + const emitCssAsset = async (filePath: string, css: string) => { + const cached = written.get(filePath) + if (cached) { + return cached + } + const hash = createHash('sha256').update(css).digest('hex').slice(0, 8) + const outName = `${basename(filePath, '.css')}-${hash}.css` + const assetsDir = join(opts.clientOutDir, 'assets') + await mkdir(assetsDir, { recursive: true }) + await writeFile(join(assetsDir, outName), css, 'utf8') + const prefix = + publicBase === '/' ? '' : publicBase.replace(/\/$/, '') + const publicUrl = `${prefix}/assets/${outName}` + written.set(filePath, publicUrl) + return publicUrl + } + + return { + name: 'tanstack-start-bun:css-assets', + setup(build) { + build.onResolve({ filter: /\.css\?url$/ }, (args) => { + const bare = args.path.replace(/\?url$/, '') + let resolved = bare + try { + // Bun.resolve is async in some typings; prefer sync path join fallback + const importerDir = dirname(args.importer || opts.root) + resolved = bare.startsWith('/') + ? bare + : join(importerDir, bare) + } catch { + // keep bare + } + return { path: resolved, namespace: 'tss-css-url' } + }) + + build.onLoad({ filter: /.*/, namespace: 'tss-css-url' }, async (args) => { + const filePath = stripQuery(args.path) + const raw = await readFile(filePath, 'utf8') + const css = await transformCss(raw, filePath) + const url = await emitCssAsset(filePath, css) + return { + contents: `export default ${JSON.stringify(url)}`, + loader: 'js', + } + }) + + build.onLoad({ filter: /\.css$/ }, async (args) => { + if (args.namespace === 'tss-css-url') { + return undefined + } + const filePath = args.path + const raw = await readFile(filePath, 'utf8') + const css = await transformCss(raw, filePath) + await emitCssAsset(filePath, css) + // Side-effect import: empty module (CSS is a separate static asset) + return { + contents: 'export {}', + loader: 'js', + } + }) + }, + } +} diff --git a/packages/start-plugin-core/src/bun/dev-server.ts b/packages/start-plugin-core/src/bun/dev-server.ts new file mode 100644 index 00000000000..6c9e5778423 --- /dev/null +++ b/packages/start-plugin-core/src/bun/dev-server.ts @@ -0,0 +1,415 @@ +import { watch } from 'node:fs' +import { join, normalize } from 'pathe' +import { tryServeClientAsset } from './static-host' +import { + classifyBunChange, + hmrEventForScope, + rebuildScopeForChange, + shouldRegenerateRoutes, + type BunChangeInfo, + type BunHmrEventType, + type BunRebuildResult, +} from './hmr-protocol' +import { + DEV_CLIENT_PATH, + FS_PREFIX, + getHmrClientModuleSource, + getHmrClientScriptTag, + HMR_CLIENT_PATH, + HMR_SSE_PATH, + REACT_REFRESH_PATH, + rewriteImportMetaHot, +} from './hmr-runtime' +import { + fileExists, + resolveBareSpecifier, + transformDevModule, + type DevTransformOptions, +} from './dev-transform' +import { + applyReactRefreshBabel, + getReactRefreshBrowserEntry, +} from './react-refresh' +import type { CompileStartFrameworkOptions } from '../types' + +export interface BunDevServerOptions { + root: string + port: number + hostname: string + clientOutDir: string + serverOutDir: string + publicBase: string + framework: CompileStartFrameworkOptions + /** Absolute path to the app client entry (resolved file). */ + clientEntryPath: string + /** + * When true (default), serve client modules via on-demand ESM transform + * (Phase 2). Server still uses the built handler. + */ + esmDev?: boolean + rebuild: (change: BunChangeInfo) => Promise + invalidate: (ids: Iterable) => void + /** App module transform (code-splitter + StartCompiler). */ + transformAppModule?: DevTransformOptions['transformAppModule'] + /** Debounce window for coalescing rapid fs events (ms). */ + debounceMs?: number +} + +function injectDevScripts( + html: string, + opts: { framework: CompileStartFrameworkOptions; esmDev: boolean }, +): string { + const parts: Array = [] + if (opts.framework === 'react' && opts.esmDev) { + parts.push( + ``, + ) + } + parts.push(getHmrClientScriptTag()) + + // In ESM dev, ensure a module entry exists if HTML has no client script yet. + if (opts.esmDev && !html.includes(DEV_CLIENT_PATH)) { + parts.push(``) + } + + const injection = parts.join('\n') + if (html.includes(HMR_SSE_PATH) || html.includes(HMR_CLIENT_PATH)) { + return html + } + if (html.includes('')) { + return html.replace('', `${injection}`) + } + return `${html}${injection}` +} + +function encodeSse(event: BunHmrEventType, modules?: Array): string { + const payload = + event === 'update' + ? JSON.stringify({ type: event, modules: modules ?? [] }) + : JSON.stringify({ type: event }) + return `data: ${payload}\n\n` +} + +/** + * Bun.serve hosting built server handler + client assets / ESM middleware, + * with classified rebuild and HMR EventSource protocol. + */ +export async function createBunDevServer(opts: BunDevServerOptions): Promise<{ + stop: () => void + port: number + hostname: string +}> { + const serverEntry = join(opts.serverOutDir, 'server.js') + const debounceMs = opts.debounceMs ?? 120 + const esmDev = opts.esmDev !== false + + let handlerModule = (await import(`${serverEntry}?t=${Date.now()}`)) as { + default: { fetch: (req: Request) => Response | Promise } + } + + const reloadClients = new Set>() + const encoder = new TextEncoder() + + const notify = (event: BunHmrEventType, modules?: Array) => { + const payload = encoder.encode(encodeSse(event, modules)) + for (const controller of reloadClients) { + try { + controller.enqueue(payload) + } catch { + reloadClients.delete(controller) + } + } + } + + let rebuildTimer: ReturnType | undefined + let rebuildQueued = false + let pendingPath: string | undefined + + const runRebuild = async () => { + if (rebuildQueued) return + rebuildQueued = true + const changedPath = pendingPath + pendingPath = undefined + try { + if (changedPath) { + opts.invalidate([changedPath]) + } + const kind = changedPath + ? classifyBunChange(opts.root, changedPath) + : 'unknown' + const result = await opts.rebuild({ + path: changedPath ?? '', + kind, + }) + handlerModule = (await import(`${serverEntry}?t=${Date.now()}`)) as { + default: { fetch: (req: Request) => Response | Promise } + } + + // Phase 2: prefer module updates when ESM graph is live and only client changed + if ( + esmDev && + changedPath && + (result.event === 'client-reload' || result.event === 'update') + ) { + const modules = + result.modules ?? + (changedPath + ? [`${FS_PREFIX}${normalize(changedPath)}`] + : undefined) + notify('update', modules) + } else { + notify(result.event, result.modules) + } + console.info( + `[tanstack-start-bun] rebuilt (${result.scope} → ${result.event})`, + ) + } catch (error) { + console.error('[tanstack-start-bun] rebuild failed', error) + } finally { + rebuildQueued = false + if (pendingPath) { + scheduleRebuild(pendingPath) + } + } + } + + const scheduleRebuild = (changedPath: string) => { + pendingPath = changedPath + if (rebuildTimer) { + clearTimeout(rebuildTimer) + } + rebuildTimer = setTimeout(() => { + rebuildTimer = undefined + void runRebuild() + }, debounceMs) + } + + const watcher = watch( + join(opts.root, 'src'), + { recursive: true }, + (_event, filename) => { + if (!filename) return + if (filename.includes('routeTree.gen.')) return + scheduleRebuild(join(opts.root, 'src', filename)) + }, + ) + + const transformOpts: DevTransformOptions = { + root: opts.root, + framework: opts.framework, + transformAppModule: opts.transformAppModule, + applyReactRefresh: + opts.framework === 'react' + ? (code, absPath) => applyReactRefreshBabel(code, absPath) + : undefined, + } + + async function serveEsmPath(url: URL): Promise { + if (!esmDev) return null + + if (url.pathname === HMR_CLIENT_PATH) { + return new Response( + getHmrClientModuleSource({ + ssePath: HMR_SSE_PATH, + enableReactRefresh: opts.framework === 'react', + }), + { + headers: { + 'Content-Type': 'text/javascript; charset=utf-8', + 'Cache-Control': 'no-store', + }, + }, + ) + } + + if (url.pathname === REACT_REFRESH_PATH) { + return new Response(getReactRefreshBrowserEntry(), { + headers: { + 'Content-Type': 'text/javascript; charset=utf-8', + 'Cache-Control': 'no-store', + }, + }) + } + + if (url.pathname === DEV_CLIENT_PATH) { + const entryUrl = `${FS_PREFIX}${normalize(opts.clientEntryPath)}` + let code = `import ${JSON.stringify(entryUrl)}\n` + code = rewriteImportMetaHot(code) + return new Response(code, { + headers: { + 'Content-Type': 'text/javascript; charset=utf-8', + 'Cache-Control': 'no-store', + }, + }) + } + + if (url.pathname.startsWith('/@id/')) { + const encoded = url.pathname.slice('/@id/'.length) + const spec = decodeURIComponent(encoded) + const importer = + url.searchParams.get('importer') ?? opts.clientEntryPath + const resolved = await resolveBareSpecifier(spec, importer) + if (!resolved) { + return new Response(`Cannot resolve ${spec}`, { status: 404 }) + } + // Redirect browser to /@fs so subsequent relative imports work + return Response.redirect( + `${url.origin}${FS_PREFIX}${normalize(resolved)}`, + 302, + ) + } + + if (url.pathname.startsWith(`${FS_PREFIX}/`) || url.pathname.startsWith(FS_PREFIX)) { + const abs = normalize(url.pathname.slice(FS_PREFIX.length) || '/') + if (!(await fileExists(abs))) { + return new Response(`Not found: ${abs}`, { status: 404 }) + } + try { + const result = await transformDevModule(transformOpts, abs) + return new Response(result.code, { + headers: { + 'Content-Type': result.contentType, + 'Cache-Control': 'no-store', + }, + }) + } catch (error) { + const message = + error instanceof Error ? error.stack ?? error.message : String(error) + console.error('[tanstack-start-bun] transform failed', abs, error) + return new Response(message, { + status: 500, + headers: { 'Content-Type': 'text/plain; charset=utf-8' }, + }) + } + } + + // /src/... convenience + if (url.pathname.startsWith('/src/')) { + const abs = normalize(join(opts.root, url.pathname)) + if (!(await fileExists(abs))) { + return new Response(`Not found: ${abs}`, { status: 404 }) + } + try { + const result = await transformDevModule(transformOpts, abs) + return new Response(result.code, { + headers: { + 'Content-Type': result.contentType, + 'Cache-Control': 'no-store', + }, + }) + } catch (error) { + const message = + error instanceof Error ? error.stack ?? error.message : String(error) + console.error('[tanstack-start-bun] transform failed', abs, error) + return new Response(message, { + status: 500, + headers: { 'Content-Type': 'text/plain; charset=utf-8' }, + }) + } + } + + return null + } + + const server = Bun.serve({ + port: opts.port, + hostname: opts.hostname, + async fetch(req) { + const url = new URL(req.url) + + if (url.pathname === HMR_SSE_PATH) { + let streamController: ReadableStreamDefaultController + const stream = new ReadableStream({ + start(controller) { + streamController = controller + reloadClients.add(controller) + controller.enqueue(encoder.encode(`: connected\n\n`)) + }, + cancel() { + reloadClients.delete(streamController) + }, + }) + return new Response(stream, { + headers: { + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache', + Connection: 'keep-alive', + }, + }) + } + + const esmResponse = await serveEsmPath(url) + if (esmResponse) { + return esmResponse + } + + const staticResponse = await tryServeClientAsset( + opts.clientOutDir, + url.pathname, + ) + if (staticResponse) { + return staticResponse + } + + const response = await handlerModule.default.fetch(req) + const contentType = response.headers.get('content-type') ?? '' + if (contentType.includes('text/html')) { + let html = await response.text() + // Point hashed entry at ESM dev entry when possible + if (esmDev) { + html = html.replace( + /]+type=["']module["'][^>]+src=["'][^"']*assets\/[^"']+["'][^>]*><\/script>/g, + ``, + ) + } + return new Response( + injectDevScripts(html, { + framework: opts.framework, + esmDev, + }), + { + status: response.status, + headers: { + 'Content-Type': 'text/html; charset=utf-8', + }, + }, + ) + } + return response + }, + }) + + console.info( + `[tanstack-start-bun] dev server http://${opts.hostname}:${server.port}` + + (esmDev ? ' (esm HMR)' : ''), + ) + + return { + port: Number(server.port), + hostname: opts.hostname, + stop() { + if (rebuildTimer) { + clearTimeout(rebuildTimer) + } + watcher.close() + for (const controller of reloadClients) { + try { + controller.close() + } catch { + // ignore + } + } + reloadClients.clear() + server.stop(true) + }, + } +} + +// Re-export helpers for tests / plugin wiring +export { + classifyBunChange, + rebuildScopeForChange, + hmrEventForScope, + shouldRegenerateRoutes, +} +export type { BunChangeInfo, BunRebuildResult, BunHmrEventType } diff --git a/packages/start-plugin-core/src/bun/dev-transform.ts b/packages/start-plugin-core/src/bun/dev-transform.ts new file mode 100644 index 00000000000..3c00279d1f9 --- /dev/null +++ b/packages/start-plugin-core/src/bun/dev-transform.ts @@ -0,0 +1,211 @@ +/** + * Dev-time on-demand ESM transform for Bun Start (Phase 2). + */ + +import { readFile, stat } from 'node:fs/promises' +import { dirname, extname, isAbsolute, join, normalize } from 'pathe' +import { rewriteImportMetaHot } from './hmr-runtime' +import type { CompileStartFrameworkOptions } from '../types' + +export interface DevTransformOptions { + root: string + framework: CompileStartFrameworkOptions + /** Optional Start/route preprocess (code-splitter + serverFn) */ + transformAppModule?: ( + code: string, + absPath: string, + ) => string | Promise + /** Optional React Refresh Babel transform */ + applyReactRefresh?: ( + code: string, + absPath: string, + ) => string | Promise +} + +export interface DevTransformResult { + code: string + contentType: string +} + +const APP_EXT = /\.(m|c)?[jt]sx?$/ +const TEXT_EXT = /\.(css|json|svg)$/ + +function guessLoader(filePath: string): 'tsx' | 'ts' | 'jsx' | 'js' { + const ext = extname(filePath) + if (ext === '.tsx') return 'tsx' + if (ext === '.jsx') return 'jsx' + if (ext === '.ts' || ext === '.mts' || ext === '.cts') return 'ts' + return 'js' +} + +function toFsUrl(absPath: string): string { + return `/@fs${absPath.startsWith('/') ? absPath : `/${absPath}`}` +} + +/** + * Rewrite bare and relative imports so the browser loads them through + * the Bun Start transform middleware. + */ +export function rewriteImportsForDevMiddleware( + code: string, + filePath: string, + root: string, +): string { + const importRe = + /(\bfrom\s+|\bimport\s*\(\s*)(['"])([^'"]+)\2|(\bimport\s+)(['"])([^'"]+)\5/g + + return code.replace( + importRe, + ( + full, + fromOrDyn, + q1, + spec1, + importKw, + q2, + spec2, + ) => { + const spec = (spec1 ?? spec2) as string + const quote = (q1 ?? q2) as string + const prefix = (fromOrDyn ?? importKw) as string + const rewritten = rewriteOneSpecifier(spec, filePath, root) + return `${prefix}${quote}${rewritten}${quote}` + }, + ) +} + +function rewriteOneSpecifier( + spec: string, + filePath: string, + root: string, +): string { + if ( + spec.startsWith('/@') || + spec.startsWith('/__') || + spec.startsWith('data:') || + spec.startsWith('blob:') || + spec.startsWith('http:') || + spec.startsWith('https:') + ) { + return spec + } + + // Relative / absolute filesystem + if (spec.startsWith('.') || spec.startsWith('/') || spec.startsWith('file:')) { + try { + const base = dirname(filePath) + const resolved = spec.startsWith('file:') + ? spec.replace(/^file:\/\//, '') + : isAbsolute(spec) + ? spec + : normalize(join(base, spec)) + return `${toFsUrl(resolved)}` + } catch { + return spec + } + } + + // Bare specifier → resolve with Bun and serve via /@fs + try { + // Sync resolve is not always available; leave bare for async path + return `/@id/${encodeURIComponent(spec)}?importer=${encodeURIComponent(filePath)}` + } catch { + return spec + } +} + +export async function resolveBareSpecifier( + spec: string, + importer: string, +): Promise { + try { + return await Bun.resolve(spec, dirname(importer)) + } catch { + try { + return await Bun.resolve(spec, importer) + } catch { + return null + } + } +} + +export async function transformDevModule( + opts: DevTransformOptions, + absPath: string, +): Promise { + const filePath = absPath.split('?')[0]! + const code = await readFile(filePath, 'utf8') + + if (filePath.endsWith('.css')) { + const escaped = JSON.stringify(code) + return { + code: `const css = ${escaped}; +if (typeof document !== 'undefined') { + const el = document.createElement('style'); + el.setAttribute('data-tanstack-dev-css', ${JSON.stringify(filePath)}); + el.textContent = css; + document.head.appendChild(el); +} +export default css; +`, + contentType: 'text/javascript; charset=utf-8', + } + } + + if (filePath.endsWith('.json')) { + return { + code: `export default ${code}`, + contentType: 'text/javascript; charset=utf-8', + } + } + + let next = code + if (opts.transformAppModule && shouldTransformApp(filePath, opts.root)) { + next = await opts.transformAppModule(next, filePath) + } + + // Transpile TSX/TS with Bun + if (APP_EXT.test(filePath)) { + const loader = guessLoader(filePath) + const transpiler = new Bun.Transpiler({ loader }) + next = transpiler.transformSync(next, loader) + } + + if (opts.applyReactRefresh && opts.framework === 'react') { + next = await opts.applyReactRefresh(next, filePath) + } + + next = rewriteImportMetaHot(next) + next = rewriteImportsForDevMiddleware(next, filePath, opts.root) + + return { + code: next, + contentType: 'text/javascript; charset=utf-8', + } +} + +function shouldTransformApp(filePath: string, root: string): boolean { + const n = filePath.replace(/\\/g, '/') + const r = root.replace(/\\/g, '/') + if (n.includes('/node_modules/')) return false + return n.startsWith(r) +} + +export async function fileExists(path: string): Promise { + try { + await stat(path) + return true + } catch { + return false + } +} + +export function isTransformablePath(pathname: string): boolean { + return ( + pathname.startsWith('/@fs/') || + pathname.startsWith('/@id/') || + pathname.startsWith('/src/') || + APP_EXT.test(pathname) || + TEXT_EXT.test(pathname) + ) +} diff --git a/packages/start-plugin-core/src/bun/hmr-protocol.ts b/packages/start-plugin-core/src/bun/hmr-protocol.ts new file mode 100644 index 00000000000..dfdf22d808f --- /dev/null +++ b/packages/start-plugin-core/src/bun/hmr-protocol.ts @@ -0,0 +1,108 @@ +/** + * Change classification and SSE protocol for Bun Start HMR (Phase 1+). + */ + +export type BunHmrEventType = + | 'full-reload' + | 'client-reload' + | 'server-only' + | 'update' + +export type BunRebuildScope = 'client' | 'server' | 'both' + +export type BunChangeKind = + | 'route' + | 'route-tree' + | 'server-only' + | 'client' + | 'src' + | 'unknown' + +export interface BunRebuildResult { + scope: BunRebuildScope + /** SSE event to broadcast after rebuild */ + event: BunHmrEventType + /** Absolute module URLs/paths for Phase 2 `update` events */ + modules?: Array +} + +export interface BunChangeInfo { + path: string + kind: BunChangeKind +} + +const SERVER_ONLY_RE = + /\.(server|server-fn)\.[cm]?[jt]sx?$|\.server\.[cm]?[jt]sx?$/i + +/** + * Classify a changed file for rebuild scoping. + */ +export function classifyBunChange( + root: string, + absPath: string, +): BunChangeKind { + const normalized = absPath.replace(/\\/g, '/') + const rootNorm = root.replace(/\\/g, '/').replace(/\/$/, '') + + if (normalized.includes('routeTree.gen.')) { + return 'route-tree' + } + + if ( + normalized.includes('/routes/') && + /\.[cm]?[jt]sx?$/.test(normalized) + ) { + return 'route' + } + + if (SERVER_ONLY_RE.test(normalized)) { + return 'server-only' + } + + if (normalized.startsWith(`${rootNorm}/src/`)) { + if (/\.(css|scss|sass|less)$/i.test(normalized)) { + return 'client' + } + if ( + /\/(components|hooks|ui)(\/|$)/i.test(normalized) || + /\.client\.[cm]?[jt]sx?$/i.test(normalized) + ) { + return 'client' + } + return 'src' + } + + return 'unknown' +} + +export function rebuildScopeForChange(kind: BunChangeKind): BunRebuildScope { + switch (kind) { + case 'server-only': + return 'server' + case 'client': + return 'client' + case 'route': + case 'route-tree': + case 'src': + case 'unknown': + default: + return 'both' + } +} + +export function hmrEventForScope(scope: BunRebuildScope): BunHmrEventType { + switch (scope) { + case 'server': + return 'server-only' + case 'client': + return 'client-reload' + case 'both': + default: + return 'full-reload' + } +} + +/** Whether route generator should re-run for this change. */ +export function shouldRegenerateRoutes(kind: BunChangeKind): boolean { + return kind === 'route' || kind === 'route-tree' || kind === 'unknown' +} diff --git a/packages/start-plugin-core/src/bun/hmr-runtime.ts b/packages/start-plugin-core/src/bun/hmr-runtime.ts new file mode 100644 index 00000000000..d474919e3d8 --- /dev/null +++ b/packages/start-plugin-core/src/bun/hmr-runtime.ts @@ -0,0 +1,137 @@ +/** + * Browser HMR client + import.meta.hot shim helpers (served as a module). + * Used by Bun Start Phase 2; Phase 1 only needs full/client reload handling. + */ + +export const HMR_CLIENT_PATH = '/__tanstack_hmr_client.js' +export const HMR_SSE_PATH = '/__tanstack_bun_reload' +export const DEV_CLIENT_PATH = '/@tanstack-dev/client' +export const REACT_REFRESH_PATH = '/__tanstack_react_refresh.js' +export const FS_PREFIX = '/@fs' + +/** Source for the browser HMR client module (injected as type=module). */ +export function getHmrClientModuleSource(opts: { + ssePath?: string + enableReactRefresh?: boolean +}): string { + const ssePath = JSON.stringify(opts.ssePath ?? HMR_SSE_PATH) + const enableRefresh = opts.enableReactRefresh === true + + return `const ssePath = ${ssePath}; +const enableRefresh = ${enableRefresh ? 'true' : 'false'}; +const acceptors = new Map(); +const hotData = new Map(); + +function createHot(url) { + const key = String(url); + if (!hotData.has(key)) hotData.set(key, {}); + return { + get data() { return hotData.get(key); }, + accept(cb) { + if (typeof cb === 'function') { + acceptors.set(key, cb); + } else { + acceptors.set(key, true); + } + }, + prune(cb) { /* no-op stub */ }, + invalidate() { + location.reload(); + }, + decline() { + acceptors.delete(key); + }, + }; +} + +globalThis.__tanstack_hot__ = createHot; +globalThis.__TANSTACK_HMR__ = { + acceptors, + createHot, + async applyUpdate(modules) { + const list = Array.isArray(modules) ? modules : []; + if (!list.length) { + location.reload(); + return; + } + let handled = false; + for (const id of list) { + const key = String(id); + const acceptor = acceptors.get(key); + try { + const mod = await import(key + (key.includes('?') ? '&' : '?') + 't=' + Date.now()); + if (typeof acceptor === 'function') { + acceptor(mod); + handled = true; + } else if (acceptor === true) { + handled = true; + } + } catch (err) { + console.warn('[tanstack-hmr] update failed for', key, err); + location.reload(); + return; + } + } + if (!handled) { + location.reload(); + } else if (enableRefresh && globalThis.__tanstack_refresh_runtime__) { + try { + globalThis.__tanstack_refresh_runtime__.performReactRefresh(); + } catch (err) { + console.warn('[tanstack-hmr] react refresh failed', err); + location.reload(); + } + } + }, +}; + +function connect() { + const es = new EventSource(ssePath); + es.onmessage = (ev) => { + let msg = ev.data; + try { msg = JSON.parse(ev.data); } catch { /* plain string */ } + const type = typeof msg === 'string' ? msg : msg?.type; + if (type === 'server-only') { + return; + } + if (type === 'update' && msg?.modules) { + void globalThis.__TANSTACK_HMR__.applyUpdate(msg.modules); + return; + } + if (type === 'client-reload' || type === 'full-reload' || type === 'reload') { + location.reload(); + return; + } + }; + es.onerror = () => { + try { es.close(); } catch {} + setTimeout(connect, 1000); + }; +} +connect(); +` +} + +/** HTML snippet: load HMR client before app scripts. */ +export function getHmrClientScriptTag(): string { + return `` +} + +/** + * Rewrite Vite-style `import.meta.hot` to the Bun HMR shim so bundled/dev + * modules can register acceptors. + * + * Uses a local const so assignments like `import.meta.hot.data ??= {}` remain valid + * (optional-chaining on the left-hand side is a SyntaxError). + */ +export function rewriteImportMetaHot(code: string): string { + if (!code.includes('import.meta.hot')) { + return code + } + const preamble = + 'const __tanstack_import_meta_hot__ = globalThis.__tanstack_hot__?.(import.meta.url);\n' + return ( + preamble + + code.replaceAll('import.meta.hot', '__tanstack_import_meta_hot__') + ) +} diff --git a/packages/start-plugin-core/src/bun/import-protection.ts b/packages/start-plugin-core/src/bun/import-protection.ts new file mode 100644 index 00000000000..478fb324d61 --- /dev/null +++ b/packages/start-plugin-core/src/bun/import-protection.ts @@ -0,0 +1,170 @@ +import { readFile } from 'node:fs/promises' +import { + getDefaultImportProtectionRules, +} from '../import-protection/defaults' +import { compileMatchers } from '../import-protection/matchers' +import { + getImportProtectionRelativePath, + shouldCheckImportProtectionImporter, +} from '../import-protection/adapterUtils' +import { getImportSources } from '../import-protection/analysis' +import { rewriteDeniedImports } from '../import-protection/rewrite' +import { loadSilentMockModule } from '../import-protection/virtualModules' +import { + checkFileDenial, + normalizeFilePath, +} from '../import-protection/utils' +import { MOCK_MODULE_ID } from '../import-protection/constants' +import type { BunPlugin } from 'bun' +import type { ImportProtectionAdapterConfig } from '../import-protection/adapterUtils' +import type { ImportProtectionOptions } from '../schema' + +/** + * Simplified Bun import-protection plugin. + * Full Vite/Rsbuild adapters include graph tracing and source maps; this + * covers the core deny/mock path using the shared analysis/rewrite layer. + */ +export function createBunImportProtectionPlugin(opts: { + envName: string + envType: 'client' | 'server' + root: string + srcDirectory: string + importProtection?: ImportProtectionOptions +}): BunPlugin { + const defaults = getDefaultImportProtectionRules() + const user = opts.importProtection ?? {} + + const clientSpecifiers = compileMatchers([ + ...defaults.client.specifiers, + ...(user.client?.specifiers ?? []), + ]) + const clientFiles = compileMatchers([ + ...defaults.client.files, + ...(user.client?.files ?? []), + ]) + const clientExclude = compileMatchers([ + ...defaults.client.excludeFiles, + ...(user.client?.excludeFiles ?? []), + ]) + const serverSpecifiers = compileMatchers([ + ...defaults.server.specifiers, + ...(user.server?.specifiers ?? []), + ]) + const serverFiles = compileMatchers([ + ...defaults.server.files, + ...(user.server?.files ?? []), + ]) + const serverExclude = compileMatchers([ + ...defaults.server.excludeFiles, + ...(user.server?.excludeFiles ?? []), + ]) + + const adapterConfig: ImportProtectionAdapterConfig = { + root: opts.root, + srcDirectory: opts.srcDirectory, + compiledRules: { + client: { + specifiers: clientSpecifiers, + files: clientFiles, + excludeFiles: clientExclude, + }, + server: { + specifiers: serverSpecifiers, + files: serverFiles, + excludeFiles: serverExclude, + }, + }, + includeMatchers: compileMatchers(user.include ?? []), + excludeMatchers: compileMatchers(user.exclude ?? []), + ignoreImporterMatchers: compileMatchers(user.ignoreImporters ?? []), + envTypeMap: new Map([ + ['client', 'client'], + ['ssr', 'server'], + ]), + } + + const rules = + opts.envType === 'client' + ? adapterConfig.compiledRules.client + : adapterConfig.compiledRules.server + + return { + name: `tanstack-start-import-protection:${opts.envName}`, + setup(build) { + build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, async (args) => { + if (args.path.includes('node_modules')) { + return undefined + } + + if ( + !shouldCheckImportProtectionImporter(adapterConfig, args.path) + ) { + return undefined + } + + const code = await readFile(args.path, 'utf8') + const sources = getImportSources(code) + const denied = new Set() + + for (const source of sources) { + // Specifier deny + if (rules.specifiers.some((m) => m.test(source))) { + denied.add(source) + continue + } + + // File deny (best-effort absolute resolve) + try { + const resolved = await Bun.resolve(source, args.path) + const relative = getImportProtectionRelativePath( + opts.root, + normalizeFilePath(resolved), + ) + const fileHit = checkFileDenial(relative, { + files: rules.files, + excludeFiles: rules.excludeFiles, + }) + if (fileHit) { + denied.add(source) + } + } catch { + // unresolved — skip file rules + } + } + + if (denied.size === 0) { + return undefined + } + + const rewritten = rewriteDeniedImports( + code, + args.path, + denied, + () => MOCK_MODULE_ID, + ) + + if (!rewritten) { + return undefined + } + + return { + contents: rewritten.code, + loader: args.path.endsWith('x') ? 'tsx' : 'ts', + } + }) + + build.onResolve({ filter: /^tanstack-start-import-protection:mock/ }, (args) => ({ + path: args.path, + namespace: 'tanstack-import-protection', + })) + + build.onLoad( + { filter: /.*/, namespace: 'tanstack-import-protection' }, + () => { + const mock = loadSilentMockModule() + return { contents: mock.code, loader: 'js' } + }, + ) + }, + } +} diff --git a/packages/start-plugin-core/src/bun/index.ts b/packages/start-plugin-core/src/bun/index.ts new file mode 100644 index 00000000000..8bf8024d61d --- /dev/null +++ b/packages/start-plugin-core/src/bun/index.ts @@ -0,0 +1,28 @@ +export { BUN_ENVIRONMENT_NAMES } from './types' +export type { + TanStackStartBunPluginCoreOptions, + TanStackStartBunAdapter, + BunCoreOptions, + BunCssOptions, + BunNitroOptions, + BunStandaloneOptions, + BunEnvironmentName, +} from './types' +export { runBunNitroBuild } from './nitro-bridge' +export type { BunNitroBuildResult } from './nitro-bridge' +export { runBunStandaloneCompile } from './standalone-compile' +export type { BunStandaloneCompileResult } from './standalone-compile' +export { + createStaticThenFetch, + createBunProdServer, + resolveClientAssetPath, + tryServeClientAsset, +} from './static-host' +export { createCssAssetsPlugin } from './css-assets-plugin' +export type { TanStackStartBunInputConfig } from './schema' +export type { + StartCompilerImportTransform, + StartCompilerTransformCandidate, + StartCompilerTransformContext, +} from '../types' +export { tanStackStartBun } from './plugin' diff --git a/packages/start-plugin-core/src/bun/nitro-bridge.ts b/packages/start-plugin-core/src/bun/nitro-bridge.ts new file mode 100644 index 00000000000..345792bd47f --- /dev/null +++ b/packages/start-plugin-core/src/bun/nitro-bridge.ts @@ -0,0 +1,116 @@ +import { createRequire } from 'node:module' +import { pathToFileURL } from 'node:url' +import { join } from 'pathe' +import type { BunNitroOptions } from './types' + +export interface BunNitroBuildResult { + /** Final public assets directory (typically `.output/public`) */ + publicDir: string + /** Nitro server output directory (typically `.output/server`) */ + serverDir: string + /** Nitro output root (typically `.output`) */ + outputDir: string +} + +async function importNitroBuilder(root: string): Promise< + typeof import('nitro/builder') +> { + try { + // Resolve from the app root (optional peer), not from this package. + const requireFromApp = createRequire(join(root, 'package.json')) + const builderPath = requireFromApp.resolve('nitro/builder') + return (await import(pathToFileURL(builderPath).href)) as typeof import( + 'nitro/builder' + ) + } catch (err) { + throw new Error( + `[tanstack-start-bun] bun.nitro requires the optional peer dependency "nitro" (Nitro 3). Install it in the app (e.g. \`npm install nitro\`).\n` + + `Original error: ${err instanceof Error ? err.message : String(err)}`, + ) + } +} + +/** + * After dual `Bun.build`, optionally re-package with Nitro 3 (programmatic API). + * Mirrors `nitro-v2-vite-plugin` post-build `createNitro`, not `nitro/vite`. + */ +export async function runBunNitroBuild(opts: { + root: string + clientOutDir: string + serverEntry: string + publicBase: string + nitro: BunNitroOptions +}): Promise { + const builder = await importNitroBuilder(opts.root) + const { createNitro, prepare, copyPublicAssets, build } = builder + + const userConfig = (opts.nitro.config ?? {}) as Record + const outputDir = + (typeof userConfig.output === 'object' && + userConfig.output && + typeof (userConfig.output as { dir?: string }).dir === 'string' + ? (userConfig.output as { dir: string }).dir + : undefined) ?? join(opts.root, '.output') + + const baseURL = + typeof userConfig.baseURL === 'string' + ? userConfig.baseURL + : opts.publicBase === '/' + ? undefined + : opts.publicBase + + const userPublicAssets = Array.isArray(userConfig.publicAssets) + ? (userConfig.publicAssets as Array>) + : [] + + const userServerEntry = userConfig.serverEntry + + const nitro = await createNitro({ + rootDir: opts.root, + ...userConfig, + ...(baseURL ? { baseURL } : {}), + preset: + opts.nitro.preset ?? + (userConfig.preset as string | undefined) ?? + 'node-server', + output: { + ...((typeof userConfig.output === 'object' && userConfig.output) || {}), + dir: outputDir, + }, + // Avoid scanning the app for Nitro file routes; Start owns routing. + scanDirs: + userConfig.scanDirs !== undefined + ? (userConfig.scanDirs as string[]) + : [], + // Disable auto-detect of root `server.ts` (app host entry ≠ SSR fetch handler). + serverEntry: + userServerEntry !== undefined + ? userServerEntry + : { + handler: opts.serverEntry, + format: 'web', + }, + publicAssets: [ + { + dir: opts.clientOutDir, + baseURL: '/', + maxAge: 31536000, + }, + ...userPublicAssets, + ], + }) + + try { + await prepare(nitro) + await copyPublicAssets(nitro) + await build(nitro) + } finally { + await nitro.close() + } + + return { + publicDir: nitro.options.output.publicDir, + serverDir: nitro.options.output.serverDir, + outputDir: nitro.options.output.dir, + } +} diff --git a/packages/start-plugin-core/src/bun/nitro-shim.d.ts b/packages/start-plugin-core/src/bun/nitro-shim.d.ts new file mode 100644 index 00000000000..d6ff119a9a4 --- /dev/null +++ b/packages/start-plugin-core/src/bun/nitro-shim.d.ts @@ -0,0 +1,20 @@ +declare module 'nitro/builder' { + export interface Nitro { + options: { + output: { + dir: string + publicDir: string + serverDir: string + } + [key: string]: unknown + } + close: () => Promise + } + + export function createNitro( + config: Record, + ): Promise + export function prepare(nitro: Nitro): Promise + export function copyPublicAssets(nitro: Nitro): Promise + export function build(nitro: Nitro): Promise +} diff --git a/packages/start-plugin-core/src/bun/normalized-client-build.ts b/packages/start-plugin-core/src/bun/normalized-client-build.ts new file mode 100644 index 00000000000..279f97eaf1e --- /dev/null +++ b/packages/start-plugin-core/src/bun/normalized-client-build.ts @@ -0,0 +1,219 @@ +import { readFile } from 'node:fs/promises' +import { relative } from 'pathe' +import { tsrSplit } from '@tanstack/router-plugin' +import type { NormalizedClientBuild, NormalizedClientChunk } from '../types' + +export interface BunClientOutputLike { + path: string + fileName: string + kind: string + /** Optional Bun input paths (may include ?tsr-split=...) when available. */ + inputs?: Array<{ path: string }> + /** Absolute path to a sibling `.map` file when sourcemaps are linked. */ + sourcemapPath?: string +} + +/** + * Best-effort normalization of Bun.build client outputs into NormalizedClientBuild. + * + * Bun BuildArtifact does not expose Rollup-style module graphs, so routeFilePaths + * are recovered from linked sourcemap `sources` (and optional `inputs`) that include + * `?tsr-split=...` virtual modules. + */ +export function normalizeBunClientBuild(opts: { + outputs: Array + clientOutDir: string +}): NormalizedClientBuild { + const chunksByFileName = new Map() + const chunkFileNamesByRouteFilePath = new Map>() + const cssFilesBySourcePath = new Map>() + const cssContentByFileName = new Map() + let entryChunkFileName: string | undefined + + for (const artifact of opts.outputs) { + const fileName = artifact.fileName.replace(/^\.\//, '') + const kind = artifact.kind + + if (kind === 'asset' && fileName.endsWith('.css')) { + cssContentByFileName.set(fileName, '') + continue + } + + if (kind !== 'entry-point' && kind !== 'chunk') { + continue + } + + const isEntry = kind === 'entry-point' + const routeFilePaths = getRouteFilePathsFromInputs(artifact.inputs) + + chunksByFileName.set(fileName, { + fileName, + isEntry, + imports: [], + dynamicImports: [], + css: [], + routeFilePaths, + hydrationIds: [], + }) + + for (const routeFilePath of routeFilePaths) { + const existing = chunkFileNamesByRouteFilePath.get(routeFilePath) ?? [] + existing.push(fileName) + chunkFileNamesByRouteFilePath.set(routeFilePath, existing) + } + + if (isEntry && !entryChunkFileName) { + entryChunkFileName = fileName + } + } + + if (!entryChunkFileName) { + for (const fileName of chunksByFileName.keys()) { + if (/\.(m?js)$/.test(fileName)) { + entryChunkFileName = fileName + const chunk = chunksByFileName.get(fileName)! + chunksByFileName.set(fileName, { ...chunk, isEntry: true }) + break + } + } + } + + if (!entryChunkFileName) { + throw new Error( + '[tanstack-start-bun] Could not determine client entry chunk from Bun.build outputs', + ) + } + + return { + entryChunkFileName, + chunksByFileName, + chunkFileNamesByRouteFilePath, + cssFilesBySourcePath, + cssContentByFileName, + } +} + +/** + * Enrich a NormalizedClientBuild by reading linked `.js.map` sources next to outputs. + */ +export async function enrichBunClientBuildFromSourcemaps(opts: { + clientBuild: NormalizedClientBuild + outputs: Array +}): Promise { + const chunksByFileName = new Map(opts.clientBuild.chunksByFileName) + const chunkFileNamesByRouteFilePath = new Map( + [...opts.clientBuild.chunkFileNamesByRouteFilePath.entries()].map( + ([key, value]) => [key, [...value]] as [string, Array], + ), + ) + + for (const artifact of opts.outputs) { + if (artifact.kind !== 'entry-point' && artifact.kind !== 'chunk') { + continue + } + const fileName = artifact.fileName.replace(/^\.\//, '') + const chunk = chunksByFileName.get(fileName) + if (!chunk) { + continue + } + + const mapPath = artifact.sourcemapPath ?? `${artifact.path}.map` + const sources = await readSourcemapSources(mapPath) + if (!sources.length) { + continue + } + + const routeFilePaths = getRouteFilePathsFromInputs( + sources.map((path) => ({ path })), + ) + if (!routeFilePaths.length) { + continue + } + + const merged = [...new Set([...chunk.routeFilePaths, ...routeFilePaths])] + chunksByFileName.set(fileName, { + ...chunk, + routeFilePaths: merged, + }) + + for (const routeFilePath of routeFilePaths) { + const existing = chunkFileNamesByRouteFilePath.get(routeFilePath) ?? [] + if (!existing.includes(fileName)) { + existing.push(fileName) + } + chunkFileNamesByRouteFilePath.set(routeFilePath, existing) + } + } + + return { + ...opts.clientBuild, + chunksByFileName, + chunkFileNamesByRouteFilePath, + } +} + +export function toClientRelativeFileName( + absolutePath: string, + clientOutDir: string, +): string { + const rel = relative(clientOutDir, absolutePath) + return rel.replace(/\\/g, '/') +} + +export function getRouteFilePathsFromInputs( + inputs: Array<{ path: string }> | undefined, +): Array { + if (!inputs?.length) return [] + + const paths: Array = [] + const seen = new Set() + + for (const input of inputs) { + const routeFilePath = extractRouteFilePathFromSource(input.path) + if (!routeFilePath || seen.has(routeFilePath)) continue + seen.add(routeFilePath) + paths.push(routeFilePath) + } + + return paths +} + +function extractRouteFilePathFromSource(id: string): string | undefined { + // Bun sourcemaps often prefix virtual namespaces: tsr-split:/abs/path?tsr-split=... + let normalized = id + const ns = normalized.indexOf(':/') + if ( + ns > 0 && + !normalized.startsWith('/') && + !normalized.startsWith('file:') + ) { + // Keep absolute path after "namespace:" + const after = normalized.slice(ns + 1) + if (after.startsWith('/')) { + normalized = after + } + } + + const queryIndex = normalized.indexOf('?') + if (queryIndex < 0) { + return undefined + } + const query = normalized.slice(queryIndex + 1) + if (!query.includes(tsrSplit)) { + return undefined + } + if (!new URLSearchParams(query).has(tsrSplit)) { + return undefined + } + return normalized.slice(0, queryIndex) +} + +async function readSourcemapSources(mapPath: string): Promise> { + try { + const raw = await readFile(mapPath, 'utf8') + const parsed = JSON.parse(raw) as { sources?: Array } + return parsed.sources ?? [] + } catch { + return [] + } +} diff --git a/packages/start-plugin-core/src/bun/planning.ts b/packages/start-plugin-core/src/bun/planning.ts new file mode 100644 index 00000000000..355297498e1 --- /dev/null +++ b/packages/start-plugin-core/src/bun/planning.ts @@ -0,0 +1,73 @@ +import { join } from 'pathe' +import { ENTRY_POINTS } from '../constants' +import type { ResolvedStartEntryPlan } from '../planning' +import { BUN_ENVIRONMENT_NAMES } from './types' + +export { BUN_ENVIRONMENT_NAMES } + +export interface BunResolvedEntryAliases { + client: string + server: string + start: string + router: string + alias: Record<(typeof ENTRY_POINTS)[keyof typeof ENTRY_POINTS], string> +} + +function normalizeEntryPath(filePath: string): string { + return filePath.startsWith('file:') + ? filePath + : filePath.startsWith('/') + ? filePath + : join(process.cwd(), filePath) +} + +export function createBunResolvedEntryAliases(opts: { + entryPaths: ResolvedStartEntryPlan['entryPaths'] +}): BunResolvedEntryAliases { + const client = normalizeEntryPath(opts.entryPaths.client) + const server = normalizeEntryPath(opts.entryPaths.server) + const start = normalizeEntryPath(opts.entryPaths.start) + const router = normalizeEntryPath(opts.entryPaths.router) + + return { + client, + server, + start, + router, + alias: { + [ENTRY_POINTS.client]: client, + [ENTRY_POINTS.server]: server, + [ENTRY_POINTS.start]: start, + [ENTRY_POINTS.router]: router, + }, + } +} + +export function createBunDefine(opts: { + serverFnBase: string + routerBasepath: string + publicBase: string + isDev: boolean + inlineCssEnabled: boolean +}): Record { + return { + 'process.env.TSS_SERVER_FN_BASE': JSON.stringify(opts.serverFnBase), + 'process.env.TSS_ROUTER_BASEPATH': JSON.stringify(opts.routerBasepath), + 'process.env.TSS_DEV_SERVER': JSON.stringify(opts.isDev), + 'process.env.TSS_SHELL': JSON.stringify(false), + 'process.env.TSS_INLINE_CSS_ENABLED': JSON.stringify(opts.inlineCssEnabled), + 'process.env.TSS_DEV_SSR_STYLES_ENABLED': JSON.stringify(false), + 'import.meta.env.TSS_PUBLIC_BASE': JSON.stringify(opts.publicBase), + } +} + +export function resolveBunOutputDirectories(opts: { + root: string + clientOutDir?: string + serverOutDir?: string +}): { client: string; server: string } { + return { + client: join(opts.root, opts.clientOutDir ?? 'dist/client'), + server: join(opts.root, opts.serverOutDir ?? 'dist/server'), + } +} diff --git a/packages/start-plugin-core/src/bun/plugin.ts b/packages/start-plugin-core/src/bun/plugin.ts new file mode 100644 index 00000000000..73521454e49 --- /dev/null +++ b/packages/start-plugin-core/src/bun/plugin.ts @@ -0,0 +1,455 @@ +import { mkdir, writeFile } from 'node:fs/promises' +import { join } from 'pathe' +import { + applyResolvedBaseAndOutput, + applyResolvedRouterBasepath, + createStartConfigContext, +} from '../config-context' +import { createServerFnBasePath, normalizePublicBase } from '../planning' +import { generateSerializationAdaptersModule } from '../serialization-adapters-module' +import { parseStartConfig } from './schema' +import { + BUN_ENVIRONMENT_NAMES, + createBunDefine, + createBunResolvedEntryAliases, + resolveBunOutputDirectories, +} from './planning' +import { createBunVirtualModuleStore, VIRTUAL_MODULES } from './virtual-modules' +import { createBunCompilerHosts } from './start-compiler-host' +import { createBunImportProtectionPlugin } from './import-protection' +import { createBunRouterSession } from './start-router-plugin' +import { createBunAliasAndVirtualPlugin } from './bun-plugins' +import { createCssAssetsPlugin } from './css-assets-plugin' +import { + enrichBunClientBuildFromSourcemaps, + normalizeBunClientBuild, + toClientRelativeFileName, +} from './normalized-client-build' +import { postBuildWithBun } from './post-build' +import { runBunNitroBuild } from './nitro-bridge' +import { runBunStandaloneCompile } from './standalone-compile' +import { createBunDevServer } from './dev-server' +import { + hmrEventForScope, + rebuildScopeForChange, + shouldRegenerateRoutes, +} from './hmr-protocol' +import { rewriteImportMetaHot } from './hmr-runtime' +import { + createBunProdServer, + generateHostEntrySource, +} from './static-host' +import type { ServerFn } from '../start-compiler/types' +import type { TanStackStartBunPluginCoreOptions } from './types' +import type { TanStackStartBunInputConfig } from './schema' +import type { TanStackStartBunAdapter } from './types' + +export function tanStackStartBun( + corePluginOpts: TanStackStartBunPluginCoreOptions, + startPluginOpts: TanStackStartBunInputConfig = {}, +): TanStackStartBunAdapter { + const configContext = createStartConfigContext({ + corePluginOpts, + startPluginOpts, + parseConfig: parseStartConfig, + }) + + async function prepare(root: string, mode: 'dev' | 'build') { + const publicBase = normalizePublicBase( + startPluginOpts.bun?.publicBase ?? + corePluginOpts.bun?.publicBase ?? + '/', + ) + const outDirs = resolveBunOutputDirectories({ + root, + clientOutDir: + startPluginOpts.bun?.clientOutDir ?? corePluginOpts.bun?.clientOutDir, + serverOutDir: + startPluginOpts.bun?.serverOutDir ?? corePluginOpts.bun?.serverOutDir, + }) + + applyResolvedBaseAndOutput({ + resolvedStartConfig: configContext.resolvedStartConfig, + root, + publicBase, + clientOutputDirectory: outDirs.client, + serverOutputDirectory: outDirs.server, + }) + + const { startConfig, resolvedStartConfig } = configContext.getConfig() + const routerBasepath = applyResolvedRouterBasepath({ + resolvedStartConfig, + startConfig, + }) + + const entryPlan = configContext.resolveEntries() + const entryAliases = createBunResolvedEntryAliases({ + entryPaths: entryPlan.entryPaths, + }) + + const serverFnBase = createServerFnBasePath({ + routerBasepath, + serverFnBase: startConfig.serverFns.base, + }) + + const inlineCssEnabled = + mode === 'build' && startConfig.server.build.inlineCss.enabled + + const define = createBunDefine({ + serverFnBase, + routerBasepath, + publicBase: resolvedStartConfig.basePaths.publicBase, + isDev: mode === 'dev', + inlineCssEnabled, + }) + + const serverFnsById: Record = {} + const virtualModules = createBunVirtualModuleStore() + + const setPluginAdapters = (runtime: 'client' | 'server') => { + virtualModules.set( + VIRTUAL_MODULES.pluginAdapters, + generateSerializationAdaptersModule({ + adapters: corePluginOpts.serializationAdapters, + runtime, + }), + ) + } + setPluginAdapters('server') + + const refreshResolver = () => { + virtualModules.updateServerFnResolver(serverFnsById, { + includeClientReferencedCheck: !corePluginOpts.ssrIsProvider, + }) + } + refreshResolver() + + const routerSession = createBunRouterSession({ + root, + framework: corePluginOpts.framework, + routerConfig: startConfig.router, + prerenderEnabled: startConfig.prerender?.enabled === true, + isProduction: mode === 'build', + }) + await routerSession.generate() + + const compilers = createBunCompilerHosts({ + root, + framework: corePluginOpts.framework, + providerEnvName: corePluginOpts.providerEnvironmentName, + mode, + ssrIsProvider: corePluginOpts.ssrIsProvider, + serverFnsById, + onRegistryChange: refreshResolver, + preprocessCode: (code, id, env) => + routerSession.getCodeSplitterRuntime(env).transformReference(code, id), + }) + + return { + startConfig, + resolvedStartConfig, + entryAliases, + define, + serverFnsById, + virtualModules, + compilers, + routerSession, + outDirs, + publicBase: resolvedStartConfig.basePaths.publicBase, + refreshResolver, + setPluginAdapters, + } + } + + async function buildClient(ctx: Awaited>) { + await mkdir(ctx.outDirs.client, { recursive: true }) + ctx.setPluginAdapters('client') + + const bunOpts = startPluginOpts.bun ?? corePluginOpts.bun + const cssPlugin = createCssAssetsPlugin({ + root: ctx.resolvedStartConfig.root, + clientOutDir: ctx.outDirs.client, + publicBase: ctx.publicBase, + css: bunOpts?.css, + srcDirectory: ctx.resolvedStartConfig.srcDirectory, + }) + const extraPlugins = [ + ...(bunOpts?.plugins ?? []), + ...(bunOpts?.clientPlugins ?? []), + ] + + const result = await Bun.build({ + entrypoints: [ctx.entryAliases.client], + outdir: ctx.outDirs.client, + target: 'browser', + format: 'esm', + packages: 'bundle', + splitting: true, + sourcemap: 'linked', + minify: false, + naming: { + entry: 'assets/[name]-[hash].js', + chunk: 'assets/[name]-[hash].js', + asset: 'assets/[name]-[hash].[ext]', + }, + define: ctx.define, + plugins: [ + ...extraPlugins, + cssPlugin, + createBunAliasAndVirtualPlugin({ + aliases: ctx.entryAliases.alias, + virtualModules: ctx.virtualModules, + }), + ctx.routerSession.createCodeSplitterPlugin('client'), + ctx.compilers.createTransformPlugin('client'), + createBunImportProtectionPlugin({ + envName: BUN_ENVIRONMENT_NAMES.client, + envType: 'client', + root: ctx.resolvedStartConfig.root, + srcDirectory: ctx.resolvedStartConfig.srcDirectory, + importProtection: ctx.startConfig.importProtection, + }), + ], + }) + + if (!result.success) { + const message = result.logs.map(String).join('\n') + throw new Error(`[tanstack-start-bun] Client build failed:\n${message}`) + } + + const outputs = result.outputs.map((o) => ({ + path: o.path, + fileName: toClientRelativeFileName(o.path, ctx.outDirs.client), + kind: o.kind, + sourcemapPath: `${o.path}.map`, + })) + + let clientBuild = normalizeBunClientBuild({ + outputs, + clientOutDir: ctx.outDirs.client, + }) + clientBuild = await enrichBunClientBuildFromSourcemaps({ + clientBuild, + outputs, + }) + + ctx.virtualModules.updateManifest({ + clientBuild, + publicBase: ctx.publicBase, + scriptFormat: 'module', + inlineCss: { + enabled: ctx.startConfig.server.build.inlineCss.enabled, + transformAssets: ctx.startConfig.server.build.inlineCss.transformAssets, + }, + }) + ctx.refreshResolver() + + return { result, clientBuild } + } + + async function buildServer(ctx: Awaited>) { + await mkdir(ctx.outDirs.server, { recursive: true }) + ctx.setPluginAdapters('server') + + const bunOpts = startPluginOpts.bun ?? corePluginOpts.bun + const cssPlugin = createCssAssetsPlugin({ + root: ctx.resolvedStartConfig.root, + clientOutDir: ctx.outDirs.client, + publicBase: ctx.publicBase, + css: bunOpts?.css, + srcDirectory: ctx.resolvedStartConfig.srcDirectory, + }) + const extraPlugins = [ + ...(bunOpts?.plugins ?? []), + ...(bunOpts?.serverPlugins ?? []), + ] + + const result = await Bun.build({ + entrypoints: [ctx.entryAliases.server], + outdir: ctx.outDirs.server, + target: 'bun', + format: 'esm', + // Bundle deps so #tanstack-* aliases inside start-server-core resolve + // at build time via createBunAliasAndVirtualPlugin. + packages: 'bundle', + splitting: false, + sourcemap: 'linked', + naming: { + entry: 'server.js', + }, + define: ctx.define, + plugins: [ + ...extraPlugins, + cssPlugin, + createBunAliasAndVirtualPlugin({ + aliases: ctx.entryAliases.alias, + virtualModules: ctx.virtualModules, + }), + ctx.routerSession.createCodeSplitterPlugin('server'), + ctx.compilers.createTransformPlugin('server'), + createBunImportProtectionPlugin({ + envName: BUN_ENVIRONMENT_NAMES.server, + envType: 'server', + root: ctx.resolvedStartConfig.root, + srcDirectory: ctx.resolvedStartConfig.srcDirectory, + importProtection: ctx.startConfig.importProtection, + }), + ], + }) + + if (!result.success) { + const message = result.logs.map(String).join('\n') + throw new Error(`[tanstack-start-bun] Server build failed:\n${message}`) + } + + return result + } + + return { + async build(opts) { + const root = opts?.root ?? process.cwd() + const ctx = await prepare(root, 'build') + await buildClient(ctx) + await buildServer(ctx) + await writeFile( + join(ctx.outDirs.server, 'host.js'), + generateHostEntrySource(), + 'utf8', + ) + + const nitroOpt = + startPluginOpts.bun?.nitro ?? corePluginOpts.bun?.nitro + let clientOutDirForPostBuild = ctx.outDirs.client + + // Nitro after dual Bun.build; prerender after Nitro so public dir is final. + if (nitroOpt) { + const nitroResult = await runBunNitroBuild({ + root, + clientOutDir: ctx.outDirs.client, + serverEntry: join(ctx.outDirs.server, 'server.js'), + publicBase: ctx.publicBase, + nitro: nitroOpt, + }) + clientOutDirForPostBuild = nitroResult.publicDir + } + + await postBuildWithBun({ + startConfig: ctx.startConfig, + serverOutDir: ctx.outDirs.server, + clientOutDir: clientOutDirForPostBuild, + }) + + const standaloneOpt = + startPluginOpts.bun?.standalone ?? corePluginOpts.bun?.standalone + // Always embed dist/client (not Nitro .output/public). + if (standaloneOpt) { + const result = await runBunStandaloneCompile({ + root, + clientOutDir: ctx.outDirs.client, + serverOutDir: ctx.outDirs.server, + standalone: standaloneOpt, + }) + console.info( + `[tanstack-start-bun] standalone executable → ${result.outfile}`, + ) + } + }, + + async dev(opts) { + const root = opts?.root ?? process.cwd() + const ctx = await prepare(root, 'dev') + + // Initial builds so SSR has a server entry and client assets (fallback) + await buildClient(ctx) + await buildServer(ctx) + + return createBunDevServer({ + root, + port: opts?.port ?? startPluginOpts.bun?.port ?? 3000, + hostname: + opts?.hostname ?? startPluginOpts.bun?.hostname ?? '0.0.0.0', + clientOutDir: ctx.outDirs.client, + serverOutDir: ctx.outDirs.server, + publicBase: ctx.publicBase, + framework: corePluginOpts.framework, + clientEntryPath: ctx.entryAliases.client, + esmDev: true, + transformAppModule: async (code, absPath) => { + let next = ctx.routerSession + .getCodeSplitterRuntime('client') + .transformReference(code, absPath) + // StartCompiler transform for serverFn discovery on the fly + const { detectKindsInCode } = await import( + '../start-compiler/compiler' + ) + const { getTransformCodeFilterForEnv } = await import( + '../start-compiler/config' + ) + const { matchesCodeFilters } = await import( + '../start-compiler/host' + ) + const env = 'client' as const + const filters = getTransformCodeFilterForEnv(env) + if (matchesCodeFilters(next, filters)) { + const kinds = detectKindsInCode(next, env) + if (kinds.size > 0) { + const result = await ctx.compilers.client.compile({ + code: next, + id: absPath, + detectedKinds: kinds, + }) + if (result?.code) { + next = result.code + } + } + } + return rewriteImportMetaHot(next) + }, + rebuild: async (change) => { + Object.keys(ctx.serverFnsById).forEach((k) => { + delete ctx.serverFnsById[k] + }) + + const scope = rebuildScopeForChange(change.kind) + if (shouldRegenerateRoutes(change.kind)) { + await ctx.routerSession.generate() + } + + if (scope === 'client' || scope === 'both') { + await buildClient(ctx) + } + if (scope === 'server' || scope === 'both') { + await buildServer(ctx) + } + + return { + scope, + event: hmrEventForScope(scope), + modules: change.path + ? [`/@fs${change.path.replace(/\\/g, '/')}`] + : undefined, + } + }, + invalidate: (ids) => ctx.compilers.invalidate(ids), + }) + }, + + async serve(opts) { + const root = opts?.root ?? process.cwd() + const outDirs = resolveBunOutputDirectories({ + root, + clientOutDir: + startPluginOpts.bun?.clientOutDir ?? corePluginOpts.bun?.clientOutDir, + serverOutDir: + startPluginOpts.bun?.serverOutDir ?? corePluginOpts.bun?.serverOutDir, + }) + return createBunProdServer({ + clientOutDir: outDirs.client, + serverOutDir: outDirs.server, + port: opts?.port ?? startPluginOpts.bun?.port ?? 3000, + hostname: + opts?.hostname ?? startPluginOpts.bun?.hostname ?? '0.0.0.0', + }) + }, + } +} diff --git a/packages/start-plugin-core/src/bun/post-build.ts b/packages/start-plugin-core/src/bun/post-build.ts new file mode 100644 index 00000000000..8c5e2558221 --- /dev/null +++ b/packages/start-plugin-core/src/bun/post-build.ts @@ -0,0 +1,55 @@ +import { pathToFileURL } from 'node:url' +import { join } from 'pathe' +import { postBuild } from '../post-build' +import { prerender } from '../prerender' +import type { TanStackStartOutputConfig } from '../schema' + +/** + * Post-build prerender/sitemap for Bun adapter. + * Imports the built server entry and uses its `default.fetch` as the request handler. + * + * When Nitro bridge is enabled, call this **after** Nitro so + * `clientOutDir` / `TSS_CLIENT_OUTPUT_DIR` point at the final public dir + * (e.g. `.output/public`), matching Vite + Nitro (#6940). + */ +export async function postBuildWithBun(opts: { + startConfig: TanStackStartOutputConfig + serverOutDir: string + clientOutDir: string +}): Promise { + const serverEntry = join(opts.serverOutDir, 'server.js') + + process.env.TSS_PRERENDERING = 'true' + process.env.TSS_CLIENT_OUTPUT_DIR = opts.clientOutDir + + await postBuild({ + startConfig: opts.startConfig, + adapter: { + getClientOutputDirectory: () => opts.clientOutDir, + prerender: async (startConfig) => { + const mod = (await import(pathToFileURL(serverEntry).href)) as { + default?: { fetch?: (req: Request) => Response | Promise } + } + const fetchHandler = mod.default?.fetch + if (!fetchHandler) { + throw new Error( + `[tanstack-start-bun] Server entry ${serverEntry} missing default.fetch`, + ) + } + + await prerender({ + startConfig, + handler: { + getClientOutputDirectory: () => opts.clientOutDir, + request: async (path, init) => { + const url = path.startsWith('http') + ? path + : `http://localhost${path.startsWith('/') ? path : `/${path}`}` + return fetchHandler(new Request(url, init)) + }, + }, + }) + }, + }, + }) +} diff --git a/packages/start-plugin-core/src/bun/react-refresh.ts b/packages/start-plugin-core/src/bun/react-refresh.ts new file mode 100644 index 00000000000..013974e49cc --- /dev/null +++ b/packages/start-plugin-core/src/bun/react-refresh.ts @@ -0,0 +1,101 @@ +/** + * React Refresh helpers for Bun Start Phase 2c. + */ + +import { createRequire } from 'node:module' + +const require = createRequire(import.meta.url) + +export function getReactRefreshRuntimeSource(): string { + try { + const runtimePath = require.resolve('react-refresh/runtime') + // Prefer CJS runtime wrapped as ESM for the browser + return ` +import runtime from ${JSON.stringify(runtimePath)}; +runtime.injectIntoGlobalHook(window); +window.$RefreshReg$ = () => {}; +window.$RefreshSig$ = () => (type) => type; +window.__vite_plugin_react_preamble_installed__ = true; +window.__tanstack_refresh_runtime__ = runtime; +export default runtime; +` + } catch { + return ` +export function performReactRefresh() {} +window.$RefreshReg$ = () => {}; +window.$RefreshSig$ = () => (type) => type; +window.__tanstack_refresh_runtime__ = { performReactRefresh() {} }; +` + } +} + +/** + * Browser-safe React Refresh runtime bundle. + * We inline a minimal shim when react-refresh cannot be resolved for the browser; + * Bun.dev middleware will prefer serving the package via /@id/react-refresh/runtime. + */ +export function getReactRefreshBrowserEntry(): string { + return `import * as RefreshRuntime from '/@id/${encodeURIComponent('react-refresh/runtime')}?importer=${encodeURIComponent(import.meta.url)}'; +const runtime = RefreshRuntime.default ?? RefreshRuntime; +runtime.injectIntoGlobalHook(window); +window.$RefreshReg$ = () => {}; +window.$RefreshSig$ = () => (type) => type; +window.__vite_plugin_react_preamble_installed__ = true; +window.__tanstack_refresh_runtime__ = runtime; +export default runtime; +` +} + +export function getReactRefreshPreambleHtml( + refreshModulePath: string, +): string { + return `` +} + +/** + * Apply react-refresh/babel when available. Falls back to identity. + */ +export async function applyReactRefreshBabel( + code: string, + filename: string, +): Promise { + try { + const babel = await import('@babel/core') + let refreshPlugin: unknown + try { + refreshPlugin = require('react-refresh/babel') + } catch { + return code + } + + const result = babel.transformSync(code, { + filename, + babelrc: false, + configFile: false, + plugins: [ + [ + refreshPlugin, + { + skipEnvCheck: true, + }, + ], + ], + // Already transpiled by Bun.Transpiler; parse as plain JS/JSX + sourceType: 'module', + parserOpts: { + sourceType: 'module', + plugins: ['jsx'], + }, + }) + + return result?.code ?? code + } catch { + return code + } +} diff --git a/packages/start-plugin-core/src/bun/schema.ts b/packages/start-plugin-core/src/bun/schema.ts new file mode 100644 index 00000000000..b774401f83c --- /dev/null +++ b/packages/start-plugin-core/src/bun/schema.ts @@ -0,0 +1,76 @@ +import { z } from 'zod' +import { + parseStartConfig as parseCoreStartConfig, + tanstackStartOptionsObjectSchema, +} from '../schema' +import type { CompileStartFrameworkOptions } from '../types' +import type { InlineCssInputOptions } from '../schema' +import type { BunCssOptions, BunCoreOptions } from './types' + +export const tanstackStartBunOptionsSchema = tanstackStartOptionsObjectSchema + .extend({ + bun: z + .object({ + clientOutDir: z.string().optional(), + serverOutDir: z.string().optional(), + publicBase: z.string().optional(), + port: z.number().int().positive().optional(), + hostname: z.string().optional(), + // Plugins / css.transform are runtime-only; keep schema permissive + plugins: z.array(z.any()).optional(), + clientPlugins: z.array(z.any()).optional(), + serverPlugins: z.array(z.any()).optional(), + css: z + .object({ + tailwind: z.union([z.boolean(), z.literal('auto')]).optional(), + transform: z.any().optional(), + content: z.array(z.string()).optional(), + }) + .optional(), + nitro: z + .union([ + z.literal(false), + z.object({ + preset: z.string().optional(), + config: z.record(z.string(), z.any()).optional(), + }), + ]) + .optional(), + standalone: z + .union([ + z.literal(false), + z.object({ + outfile: z.string().optional(), + target: z.string().optional(), + compile: z.record(z.string(), z.any()).optional(), + }), + ]) + .optional(), + }) + .optional(), + }) + .optional() + .prefault({}) + +export function parseStartConfig( + opts: z.input, + corePluginOpts: { framework: CompileStartFrameworkOptions }, + root: string, +) { + tanstackStartBunOptionsSchema.parse(opts) + const { bun: _bun, ...coreOptions } = opts ?? {} + return parseCoreStartConfig(coreOptions, corePluginOpts, root) +} + +export type TanStackStartBunInputConfig = z.input< + typeof tanstackStartBunOptionsSchema +> & { + bun?: BunCoreOptions & { + css?: BunCssOptions + } + server?: { + build?: { + inlineCss?: InlineCssInputOptions + } + } +} diff --git a/packages/start-plugin-core/src/bun/standalone-compile.ts b/packages/start-plugin-core/src/bun/standalone-compile.ts new file mode 100644 index 00000000000..66d5ca50b45 --- /dev/null +++ b/packages/start-plugin-core/src/bun/standalone-compile.ts @@ -0,0 +1,188 @@ +import { mkdir, writeFile } from 'node:fs/promises' +import { join, relative, dirname, isAbsolute } from 'pathe' +import { glob } from 'tinyglobby' +import type { BunStandaloneOptions } from './types' + +export interface BunStandaloneCompileResult { + outfile: string +} + +function defaultOutfile(serverOutDir: string): string { + const base = join(serverOutDir, 'start') + if (process.platform === 'win32') { + return `${base}.exe` + } + return base +} + +function resolveOutfile( + root: string, + serverOutDir: string, + standalone: BunStandaloneOptions, +): string { + const raw = standalone.outfile ?? defaultOutfile(serverOutDir) + const abs = isAbsolute(raw) ? raw : join(root, raw) + if ( + process.platform === 'win32' && + !abs.toLowerCase().endsWith('.exe') && + !standalone.target + ) { + return `${abs}.exe` + } + if ( + typeof standalone.target === 'string' && + standalone.target.startsWith('windows') && + !abs.toLowerCase().endsWith('.exe') + ) { + return `${abs}.exe` + } + return abs +} + +function toImportSpecifier(fromFile: string, assetAbs: string): string { + let rel = relative(dirname(fromFile), assetAbs) + if (!rel.startsWith('.')) { + rel = `./${rel}` + } + // Bun on Windows accepts / in import paths + return rel.replace(/\\/g, '/') +} + +function publicUrlPath(clientOutDir: string, assetAbs: string): string { + const rel = relative(clientOutDir, assetAbs).replace(/\\/g, '/') + return `/${rel}` +} + +/** + * After dual Bun.build + post-build, optionally `Bun.build({ compile })` + * a single executable that embeds `dist/client` and serves via server.js. + */ +export async function runBunStandaloneCompile(opts: { + root: string + clientOutDir: string + serverOutDir: string + standalone: BunStandaloneOptions +}): Promise { + const outfile = resolveOutfile( + opts.root, + opts.serverOutDir, + opts.standalone, + ) + await mkdir(dirname(outfile), { recursive: true }) + + const assetFiles = ( + await glob(['**/*'], { + cwd: opts.clientOutDir, + absolute: true, + onlyFiles: true, + dot: false, + }) + ).sort() + + const entryPath = join(opts.serverOutDir, '.standalone-entry.js') + const importLines: Array = [ + `import * as handler from ${JSON.stringify('./server.js')}`, + ] + const mapEntries: Array = [] + + for (let i = 0; i < assetFiles.length; i++) { + const abs = assetFiles[i]! + const spec = toImportSpecifier(entryPath, abs) + const id = `asset_${i}` + importLines.push( + `import ${id} from ${JSON.stringify(spec)} with { type: "file" }`, + ) + const urlPath = publicUrlPath(opts.clientOutDir, abs) + mapEntries.push(` [${JSON.stringify(urlPath)}, ${id}]`) + } + + const entrySource = `${importLines.join('\n')} + +const assets = new Map([ +${mapEntries.join(',\n')} +]) + +function resolveEmbedded(pathname) { + if (assets.has(pathname)) { + return assets.get(pathname) + } + if (pathname.endsWith('/')) { + const withIndex = pathname + 'index.html' + if (assets.has(withIndex)) { + return assets.get(withIndex) + } + } + if (!pathname.includes('.') && assets.has(pathname + '.html')) { + return assets.get(pathname + '.html') + } + if (pathname === '/' && assets.has('/index.html')) { + return assets.get('/index.html') + } + return null +} + +function resolveFetchHandler(mod) { + const candidates = [mod?.default, mod?.default?.default, mod] + for (const candidate of candidates) { + if (candidate && typeof candidate.fetch === 'function') { + return (req) => candidate.fetch(req) + } + } + throw new Error( + '[tanstack-start-bun] standalone: server entry missing default.fetch', + ) +} + +const fetchHandler = resolveFetchHandler(handler) + +const port = Number(process.env.PORT ?? 3000) +const hostname = process.env.HOST ?? '0.0.0.0' + +const server = Bun.serve({ + port, + hostname, + async fetch(req) { + const url = new URL(req.url) + const embedded = resolveEmbedded(url.pathname) + if (embedded) { + // import with { type: "file" } yields a bunfs path string + return new Response(Bun.file(embedded)) + } + return fetchHandler(req) + }, +}) + +console.info(\`[tanstack-start-bun] standalone http://\${hostname}:\${server.port}\`) +` + + await writeFile(entryPath, entrySource, 'utf8') + + const compileOpt: Record = { + ...(opts.standalone.compile ?? {}), + outfile, + } + if (opts.standalone.target != null) { + compileOpt.target = opts.standalone.target + } + + const result = await Bun.build({ + entrypoints: [entryPath], + target: 'bun', + format: 'esm', + packages: 'bundle', + sourcemap: 'none', + // outfile must live under `compile` (top-level outfile is ignored when compiling) + compile: compileOpt, + } as import('bun').BuildConfig) + + if (!result.success) { + const message = result.logs.map(String).join('\n') + throw new Error( + `[tanstack-start-bun] bun.standalone compile failed (see Bun --compile limits for native addons / dynamic requires):\n${message}`, + ) + } + + const written = + result.outputs.find((o) => o.kind === 'entry-point')?.path ?? outfile + return { outfile: written } +} diff --git a/packages/start-plugin-core/src/bun/start-compiler-host.ts b/packages/start-plugin-core/src/bun/start-compiler-host.ts new file mode 100644 index 00000000000..719ae9c37b5 --- /dev/null +++ b/packages/start-plugin-core/src/bun/start-compiler-host.ts @@ -0,0 +1,229 @@ +import { readFile } from 'node:fs/promises' +import { resolve as resolvePath } from 'pathe' +import { + createStartCompiler, + mergeServerFnsById, + matchesCodeFilters, +} from '../start-compiler/host' +import { detectKindsInCode } from '../start-compiler/compiler' +import { getTransformCodeFilterForEnv } from '../start-compiler/config' +import { TRANSFORM_ID_REGEX } from '../constants' +import type { StartCompiler } from '../start-compiler/compiler' +import type { ServerFn } from '../start-compiler/types' +import type { CompileStartFrameworkOptions } from '../types' +import type { BunPlugin } from 'bun' + +export interface BunCompilerHostOptions { + root: string + framework: CompileStartFrameworkOptions + providerEnvName: string + mode: 'dev' | 'build' + ssrIsProvider: boolean + serverFnsById: Record + /** Called after registry mutations so virtual modules can refresh */ + onRegistryChange?: () => void + /** + * Optional preprocess (e.g. route code-splitter reference transform). + * Runs before StartCompiler so both share a single Bun onLoad. + */ + preprocessCode?: ( + code: string, + id: string, + env: 'client' | 'server', + ) => string | Promise +} + +export interface BunCompilerHosts { + client: StartCompiler + server: StartCompiler + createTransformPlugin: (env: 'client' | 'server') => BunPlugin + invalidate: (ids: Iterable) => void +} + +function shouldTransformId(id: string): boolean { + if (id.includes('node_modules')) return false + return TRANSFORM_ID_REGEX.some((re) => re.test(id)) +} + +export function createBunCompilerHosts( + opts: BunCompilerHostOptions, +): BunCompilerHosts { + const sharedResolve = async (id: string, importer?: string) => { + try { + const resolved = await Bun.resolve(id, importer ?? opts.root) + return resolved + } catch { + try { + return resolvePath(importer ? resolvePath(importer, '..') : opts.root, id) + } catch { + return null + } + } + } + + const makeCompiler = (env: 'client' | 'server', envName: string) => { + // loadModule must ingest into the same compiler instance (Vite does this too). + let compiler!: StartCompiler + compiler = createStartCompiler({ + env, + envName, + root: opts.root, + framework: opts.framework, + providerEnvName: opts.providerEnvName, + mode: opts.mode, + getKnownServerFns: () => opts.serverFnsById, + onServerFnsById: (discovered) => { + mergeServerFnsById(opts.serverFnsById, discovered) + opts.onRegistryChange?.() + }, + loadModule: async (id: string) => { + const filePath = id.includes('?') ? id.slice(0, id.indexOf('?')) : id + try { + const code = await readFile(filePath, 'utf8') + compiler.ingestModule({ code, id }) + } catch { + // ignore missing during graph crawl + } + }, + resolveId: sharedResolve, + encodeModuleSpecifierInDev: + opts.mode === 'dev' + ? ({ extractedFilename }) => + Buffer.from(extractedFilename, 'utf8').toString('base64url') + : undefined, + }) + return compiler + } + + const client = makeCompiler('client', 'client') + const server = makeCompiler('server', 'ssr') + + const createTransformPlugin = (env: 'client' | 'server'): BunPlugin => { + const compiler = env === 'client' ? client : server + const codeFilter = getTransformCodeFilterForEnv(env) + + return { + name: `tanstack-start-compiler:${env}`, + setup(build) { + // Provider split modules: absolute/file?tss-serverfn-split + // Bun may not invoke plugins for absolute paths unless the filter matches. + const resolveServerFnSplit = (args: { path: string }) => { + if (!args.path.includes('tss-serverfn-split')) { + return undefined + } + const q = args.path.indexOf('?') + const filePath = q >= 0 ? args.path.slice(0, q) : args.path + return { + path: `${filePath}?tss-serverfn-split`, + namespace: 'tanstack-serverfn', + } + } + + build.onResolve( + { filter: /tss-serverfn-split/ }, + resolveServerFnSplit, + ) + build.onResolve( + { filter: /^\// }, + (args) => + args.path.includes('tss-serverfn-split') + ? resolveServerFnSplit(args) + : undefined, + ) + + build.onLoad( + { filter: /.*/, namespace: 'tanstack-serverfn' }, + async (args) => { + const filePath = args.path.includes('?') + ? args.path.slice(0, args.path.indexOf('?')) + : args.path + const code = await readFile(filePath, 'utf8') + const detectedKinds = detectKindsInCode(code, env) + const result = await compiler.compile({ + code, + id: args.path, + detectedKinds, + }) + if (!result) { + return { contents: code, loader: filePath.endsWith('x') ? 'tsx' : 'ts' } + } + return { + contents: result.code, + loader: filePath.endsWith('x') ? 'tsx' : 'ts', + } + }, + ) + + build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, async (args) => { + if (args.namespace === 'tanstack-serverfn') { + return undefined + } + if (!shouldTransformId(args.path)) { + return undefined + } + + let code = await readFile(args.path, 'utf8') + const originalCode = code + if (opts.preprocessCode) { + code = await opts.preprocessCode(code, args.path, env) + } + const preprocessed = code !== originalCode + + const needsStartCompile = + matchesCodeFilters(code, codeFilter) && + detectKindsInCode(code, env).size > 0 + + if (!needsStartCompile) { + if (preprocessed) { + return { + contents: code, + loader: args.path.endsWith('x') ? 'tsx' : 'ts', + } + } + return undefined + } + + const detectedKinds = detectKindsInCode(code, env) + const result = await compiler.compile({ + code, + id: args.path, + detectedKinds, + }) + + if (!result) { + if (preprocessed) { + return { + contents: code, + loader: args.path.endsWith('x') ? 'tsx' : 'ts', + } + } + return undefined + } + + return { + contents: result.code, + loader: args.path.endsWith('x') ? 'tsx' : 'ts', + } + }) + }, + } + } + + return { + client, + server, + createTransformPlugin, + invalidate(ids) { + client.invalidateModules(ids) + server.invalidateModules(ids) + for (const id of ids) { + for (const [fnId, fn] of Object.entries(opts.serverFnsById)) { + if (fn.filename === id || fn.extractedFilename.startsWith(id)) { + delete opts.serverFnsById[fnId] + } + } + } + opts.onRegistryChange?.() + }, + } +} diff --git a/packages/start-plugin-core/src/bun/start-router-plugin.ts b/packages/start-plugin-core/src/bun/start-router-plugin.ts new file mode 100644 index 00000000000..96b90918f4b --- /dev/null +++ b/packages/start-plugin-core/src/bun/start-router-plugin.ts @@ -0,0 +1,121 @@ +import { Generator } from '@tanstack/router-generator' +import { getConfig } from '@tanstack/router-plugin' +import { createBunRouterCodeSplitterRuntime } from '@tanstack/router-plugin/bun' +import { createRouterPluginContext } from '@tanstack/router-plugin/context' +import { routesManifestPlugin } from '../start-router-plugin/generator-plugins/routes-manifest-plugin' +import { prerenderRoutesPlugin } from '../start-router-plugin/generator-plugins/prerender-routes-plugin' +import type { Config, RouterPluginContext } from '@tanstack/router-plugin' +import type { BunCodeSplitterRuntime } from '@tanstack/router-plugin/bun' +import type { CompileStartFrameworkOptions } from '../types' +import type { BunPlugin } from 'bun' + +export interface BunRouterSession { + context: RouterPluginContext + generate: () => Promise + /** Virtual-module Bun plugin (`tsr-split` / `tsr-shared`). */ + createCodeSplitterPlugin: (env: 'client' | 'server') => BunPlugin + /** + * Reference-route transform to run inside the StartCompiler onLoad + * (Bun allows only one successful onLoad per module). + */ + getCodeSplitterRuntime: (env: 'client' | 'server') => BunCodeSplitterRuntime +} + +/** + * Shared Generator + code-splitter session for the Start Bun adapter. + * Generator populates `context.routesByFile` consumed by the Bun code-splitter. + */ +export function createBunRouterSession(opts: { + root: string + framework: CompileStartFrameworkOptions + routerConfig?: Partial + prerenderEnabled?: boolean + isProduction: boolean +}): BunRouterSession { + const context = createRouterPluginContext() + const runtimes = new Map<'client' | 'server', BunCodeSplitterRuntime>() + + const generate = async () => { + const config = getConfig( + { + ...opts.routerConfig, + target: opts.framework, + plugins: [ + routesManifestPlugin(), + ...(opts.prerenderEnabled === true ? [prerenderRoutesPlugin()] : []), + ...((opts.routerConfig?.plugins as Array | undefined) ?? + []), + ], + } as Partial, + opts.root, + ) + const generator = new Generator({ + config, + root: opts.root, + }) + await generator.run() + context.routesByFile = generator.getRoutesByFileMap() + return generator + } + + const getCodeSplitterRuntime = ( + env: 'client' | 'server', + ): BunCodeSplitterRuntime => { + const cached = runtimes.get(env) + if (cached) { + return cached + } + const isClient = env === 'client' + const runtime = createBunRouterCodeSplitterRuntime(context, { + root: opts.root, + isProduction: opts.isProduction, + config: () => + getConfig( + { + ...opts.routerConfig, + target: opts.framework, + codeSplittingOptions: { + ...opts.routerConfig?.codeSplittingOptions, + deleteNodes: isClient + ? ['ssr', 'server', 'headers'] + : opts.routerConfig?.codeSplittingOptions?.deleteNodes, + addHmr: isClient && !opts.isProduction, + }, + plugin: { + ...opts.routerConfig?.plugin, + hmr: { + style: 'vite', + ...opts.routerConfig?.plugin?.hmr, + }, + }, + } as Partial, + opts.root, + ), + }) + runtimes.set(env, runtime) + return runtime + } + + return { + context, + generate, + getCodeSplitterRuntime, + createCodeSplitterPlugin: (env) => getCodeSplitterRuntime(env).plugin, + } +} + +/** + * @deprecated Prefer {@link createBunRouterSession}. + */ +export async function runBunRouterGenerator(opts: { + root: string + routerConfig?: Partial +}): Promise { + const session = createBunRouterSession({ + root: opts.root, + framework: 'react', + routerConfig: opts.routerConfig, + isProduction: true, + }) + return session.generate() +} diff --git a/packages/start-plugin-core/src/bun/static-host.ts b/packages/start-plugin-core/src/bun/static-host.ts new file mode 100644 index 00000000000..821796ccd94 --- /dev/null +++ b/packages/start-plugin-core/src/bun/static-host.ts @@ -0,0 +1,169 @@ +import { join } from 'pathe' + +export type BunFetchHandler = (req: Request) => Response | Promise + +/** + * Map a request pathname to a file under the client output directory. + * Returns null when the path should fall through to the SSR handler. + */ +export function resolveClientAssetPath( + clientOutDir: string, + pathname: string, +): string | null { + const decoded = decodeURIComponent(pathname) + if (!decoded.startsWith('/assets/') && !/\.\w+$/.test(decoded)) { + return null + } + // Prevent path traversal + const relative = decoded.replace(/^\//, '') + if (relative.includes('..')) { + return null + } + return join(clientOutDir, relative) +} + +/** + * Try to serve a static file from clientOutDir; otherwise null. + */ +export async function tryServeClientAsset( + clientOutDir: string, + pathname: string, +): Promise { + const assetPath = resolveClientAssetPath(clientOutDir, pathname) + if (!assetPath) { + return null + } + const file = Bun.file(assetPath) + if (!(await file.exists())) { + return null + } + return new Response(file) +} + +export interface StaticThenFetchOptions { + clientOutDir: string + fetch: BunFetchHandler +} + +/** + * Production / shared fetch: static assets first, then SSR handler. + */ +export function createStaticThenFetch( + opts: StaticThenFetchOptions, +): BunFetchHandler { + return async (req) => { + const url = new URL(req.url) + const staticResponse = await tryServeClientAsset( + opts.clientOutDir, + url.pathname, + ) + if (staticResponse) { + return staticResponse + } + return opts.fetch(req) + } +} + +export interface BunProdServeOptions { + clientOutDir: string + serverOutDir: string + port?: number + hostname?: string +} + +/** + * Production Bun.serve wrapping dist/server/server.js + dist/client. + */ +export async function createBunProdServer(opts: BunProdServeOptions): Promise<{ + stop: () => void + port: number + hostname: string +}> { + const serverEntry = join(opts.serverOutDir, 'server.js') + const handlerModule = (await import(`${serverEntry}?t=${Date.now()}`)) as { + default: { fetch: BunFetchHandler } + } + const fetch = createStaticThenFetch({ + clientOutDir: opts.clientOutDir, + fetch: (req) => handlerModule.default.fetch(req), + }) + + const hostname = opts.hostname ?? '0.0.0.0' + const server = Bun.serve({ + port: opts.port ?? 3000, + hostname, + fetch, + }) + + console.info( + `[tanstack-start-bun] serve http://${hostname}:${server.port}`, + ) + + return { + port: Number(server.port), + hostname, + stop() { + server.stop(true) + }, + } +} + +/** + * Source for dist/server/host.js written at build time. + * Resolves client dir relative to this file (../client). + */ +export function generateHostEntrySource(): string { + return `/** + * Generated by @tanstack/start-plugin-core/bun — production host. + * Serves dist/client static assets, then delegates to ./server.js. + */ +import { join, dirname } from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const clientOutDir = join(__dirname, '../client') +const handler = await import('./server.js') + +function resolveClientAssetPath(pathname) { + const decoded = decodeURIComponent(pathname) + if (!decoded.startsWith('/assets/') && !/\\.\\w+$/.test(decoded)) { + return null + } + const relative = decoded.replace(/^\\//, '') + if (relative.includes('..')) { + return null + } + return join(clientOutDir, relative) +} + +async function tryServeClientAsset(pathname) { + const assetPath = resolveClientAssetPath(pathname) + if (!assetPath) { + return null + } + const file = Bun.file(assetPath) + if (!(await file.exists())) { + return null + } + return new Response(file) +} + +const port = Number(process.env.PORT ?? 3000) +const hostname = process.env.HOST ?? '0.0.0.0' + +const server = Bun.serve({ + port, + hostname, + async fetch(req) { + const url = new URL(req.url) + const staticResponse = await tryServeClientAsset(url.pathname) + if (staticResponse) { + return staticResponse + } + return handler.default.fetch(req) + }, +}) + +console.info(\`[tanstack-start-bun] host http://\${hostname}:\${server.port}\`) +` +} diff --git a/packages/start-plugin-core/src/bun/tailwindcss-node-shim.d.ts b/packages/start-plugin-core/src/bun/tailwindcss-node-shim.d.ts new file mode 100644 index 00000000000..03f3a3bd951 --- /dev/null +++ b/packages/start-plugin-core/src/bun/tailwindcss-node-shim.d.ts @@ -0,0 +1,13 @@ +/** Optional peer — present only when the app installs Tailwind. */ +declare module '@tailwindcss/node' { + export function compile( + css: string, + options: { + base: string + from?: string + onDependency: (path: string) => void + }, + ): Promise<{ + build: (candidates: Array) => string + }> +} diff --git a/packages/start-plugin-core/src/bun/types.ts b/packages/start-plugin-core/src/bun/types.ts new file mode 100644 index 00000000000..32bb77b1037 --- /dev/null +++ b/packages/start-plugin-core/src/bun/types.ts @@ -0,0 +1,109 @@ +import type { TanStackStartCoreOptions } from '../types' + +export interface BunCssOptions { + /** + * Tailwind v4 via optional peer `@tailwindcss/node`. + * - `'auto'` (default): enable when CSS references tailwindcss and the peer resolves + * - `true` / `false`: force on/off + */ + tailwind?: boolean | 'auto' | undefined + /** Custom CSS transform; runs before Tailwind when both are set. */ + transform?: + | ((css: string, ctx: { id: string }) => string | Promise) + | undefined + /** Globs for Tailwind class scanning (default under src/). */ + content?: Array | undefined +} + +/** + * Optional post-build Nitro 3 bridge (production only). + * `false` / omitted → `dist/*` + `host.js` only (Rsbuild-style). + */ +export interface BunNitroOptions { + /** Nitro preset (e.g. `node-server`, `bun`, `vercel`). Default: `node-server`. */ + preset?: string | undefined + /** + * Pass-through NitroConfig subset (baseURL, routeRules, hooks, output, …). + * Start still injects `publicAssets` + `serverEntry` web handler for `server.js`. + */ + config?: Record | undefined +} + +/** + * Optional Bun `--compile` standalone executable (production only). + * Embeds `dist/client` + `server.js` into a single binary for the target OS/arch. + */ +export interface BunStandaloneOptions { + /** Output path (default: `dist/server/start`, `.exe` on Windows). */ + outfile?: string | undefined + /** + * Cross-compile target (e.g. `linux-x64`, `darwin-arm64`). + * Omitted → current platform (`compile: true`). + */ + target?: string | undefined + /** Pass-through Bun `CompileBuildOptions` subset (windows.*, execArgv, …). */ + compile?: Record | undefined +} + +export interface BunCoreOptions { + /** Client output subdirectory under root (default: dist/client) */ + clientOutDir?: string | undefined + /** Server output subdirectory under root (default: dist/server) */ + serverOutDir?: string | undefined + /** Public asset base path (default: /) */ + publicBase?: string | undefined + /** Dev / serve port */ + port?: number | undefined + /** Dev / serve hostname */ + hostname?: string | undefined + /** + * Extra Bun.build plugins prepended for both client and server builds. + * Use `clientPlugins` / `serverPlugins` for env-specific plugins. + */ + plugins?: Array | undefined + clientPlugins?: Array | undefined + serverPlugins?: Array | undefined + /** CSS asset pipeline (`?url` / side-effect CSS + optional Tailwind). */ + css?: BunCssOptions | undefined + /** + * Optional Nitro 3 post-build packaging to `.output`. + * Dev still uses `createBunDevServer` (Nitro is production-only in v1). + */ + nitro?: false | BunNitroOptions | undefined + /** + * Optional Bun standalone executable via `Bun.build({ compile })`. + * Always based on `dist/` (not `.output`). Production build only. + */ + standalone?: false | BunStandaloneOptions | undefined +} + +export type TanStackStartBunPluginCoreOptions = TanStackStartCoreOptions & { + providerEnvironmentName: string + ssrIsProvider: boolean + bun?: BunCoreOptions | undefined +} + +export interface TanStackStartBunAdapter { + /** Production dual Bun.build (client then server) + host.js */ + build: (opts?: { root?: string }) => Promise + /** Integrated Bun.serve development server */ + dev: (opts?: { + root?: string + port?: number + hostname?: string + }) => Promise<{ stop: () => void; port: number; hostname: string }> + /** Production Bun.serve: dist/client static + dist/server/server.js */ + serve: (opts?: { + root?: string + port?: number + hostname?: string + }) => Promise<{ stop: () => void; port: number; hostname: string }> +} + +export const BUN_ENVIRONMENT_NAMES = { + client: 'client', + server: 'ssr', +} as const + +export type BunEnvironmentName = + (typeof BUN_ENVIRONMENT_NAMES)[keyof typeof BUN_ENVIRONMENT_NAMES] diff --git a/packages/start-plugin-core/src/bun/virtual-modules.ts b/packages/start-plugin-core/src/bun/virtual-modules.ts new file mode 100644 index 00000000000..9b625a0bb2d --- /dev/null +++ b/packages/start-plugin-core/src/bun/virtual-modules.ts @@ -0,0 +1,90 @@ +import { VIRTUAL_MODULES } from '@tanstack/start-server-core/virtual-modules' +import { generateServerFnResolverModule } from '../start-compiler/server-fn-resolver-module' +import { + buildStartManifest, + serializeStartManifest, +} from '../start-manifest-plugin/manifestBuilder' +import type { ServerFn } from '../start-compiler/types' +import type { NormalizedClientBuild } from '../types' +import type { ScriptFormat } from '@tanstack/router-core' + +export { VIRTUAL_MODULES } + +export interface BunVirtualModuleStore { + get: (id: string) => string | undefined + set: (id: string, contents: string) => void + has: (id: string) => boolean + clear: () => void + updateServerFnResolver: ( + serverFnsById: Record, + opts: { includeClientReferencedCheck: boolean }, + ) => void + updateManifest: (opts: { + clientBuild: NormalizedClientBuild + publicBase: string + scriptFormat?: ScriptFormat + inlineCss?: { enabled: boolean; transformAssets: boolean } + }) => void +} + +export function createBunVirtualModuleStore(): BunVirtualModuleStore { + const modules = new Map() + + return { + get(id) { + return modules.get(id) + }, + set(id, contents) { + modules.set(id, contents) + }, + has(id) { + return modules.has(id) + }, + clear() { + modules.clear() + }, + updateServerFnResolver(serverFnsById, opts) { + const code = generateServerFnResolverModule({ + serverFnsById, + includeClientReferencedCheck: opts.includeClientReferencedCheck, + }) + modules.set(VIRTUAL_MODULES.serverFnResolver, code) + }, + updateManifest({ clientBuild, publicBase, scriptFormat, inlineCss }) { + const routeTreeRoutes = + ( + globalThis as { + TSS_ROUTES_MANIFEST?: Parameters< + typeof buildStartManifest + >[0]['routeTreeRoutes'] + } + ).TSS_ROUTES_MANIFEST ?? {} + + const startManifest = buildStartManifest({ + clientBuild, + routeTreeRoutes, + basePath: publicBase, + inlineCss, + scriptFormat: scriptFormat ?? 'module', + }) + + const serialized = serializeStartManifest(startManifest) + modules.set( + VIRTUAL_MODULES.startManifest, + `export const tsrStartManifest = () => (${serialized})`, + ) + }, + } +} + +/** Match virtual / aliased module IDs that should not hit the filesystem. */ +export function isBunVirtualModuleId(id: string): boolean { + return ( + id === VIRTUAL_MODULES.serverFnResolver || + id === VIRTUAL_MODULES.startManifest || + id === VIRTUAL_MODULES.pluginAdapters || + id.startsWith('virtual:tanstack-') || + id.startsWith('#tanstack-') || + id.startsWith('tanstack-start-') + ) +} diff --git a/packages/start-plugin-core/tests/bun-css-assets-plugin.test.ts b/packages/start-plugin-core/tests/bun-css-assets-plugin.test.ts new file mode 100644 index 00000000000..21d690c8329 --- /dev/null +++ b/packages/start-plugin-core/tests/bun-css-assets-plugin.test.ts @@ -0,0 +1,79 @@ +import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { describe, expect, it } from 'vitest' +import { createCssAssetsPlugin } from '../src/bun/css-assets-plugin' + +describe('createCssAssetsPlugin', () => { + it('exposes a named Bun plugin', () => { + const plugin = createCssAssetsPlugin({ + root: '/tmp', + clientOutDir: '/tmp/client', + publicBase: '/', + srcDirectory: 'src', + css: { tailwind: false }, + }) + expect(plugin.name).toBe('tanstack-start-bun:css-assets') + expect(typeof plugin.setup).toBe('function') + }) + + it('emits hashed css for ?url via onLoad handler', async () => { + const dir = await mkdtemp(join(tmpdir(), 'tss-css-')) + const clientOutDir = join(dir, 'client') + const cssPath = join(dir, 'styles.css') + await writeFile(cssPath, 'body{color:red}', 'utf8') + await mkdir(clientOutDir, { recursive: true }) + + const plugin = createCssAssetsPlugin({ + root: dir, + clientOutDir, + publicBase: '/', + srcDirectory: 'src', + css: { tailwind: false }, + }) + + const loads: Array<{ + filter: RegExp + namespace?: string + cb: (args: { path: string; namespace: string }) => Promise<{ + contents: string + loader?: string + }> + }> = [] + + await plugin.setup({ + onStart() {}, + onResolve() {}, + onLoad(options, cb) { + loads.push({ + filter: options.filter, + namespace: options.namespace, + cb: cb as (args: { + path: string + namespace: string + }) => Promise<{ contents: string; loader?: string }>, + }) + }, + }) + + const urlLoad = loads.find((l) => l.namespace === 'tss-css-url') + expect(urlLoad).toBeTruthy() + const result = await urlLoad!.cb({ + path: cssPath, + namespace: 'tss-css-url', + }) + expect(result.contents).toMatch( + /export default "\/assets\/styles-[a-f0-9]{8}\.css"/, + ) + + const match = result.contents.match( + /\/assets\/(styles-[a-f0-9]{8}\.css)/, + ) + expect(match?.[1]).toBeTruthy() + const written = await readFile( + join(clientOutDir, 'assets', match![1]!), + 'utf8', + ) + expect(written).toBe('body{color:red}') + }) +}) diff --git a/packages/start-plugin-core/tests/bun-hmr.test.ts b/packages/start-plugin-core/tests/bun-hmr.test.ts new file mode 100644 index 00000000000..cb63b9e3293 --- /dev/null +++ b/packages/start-plugin-core/tests/bun-hmr.test.ts @@ -0,0 +1,60 @@ +import { describe, expect, it } from 'vitest' +import { + classifyBunChange, + hmrEventForScope, + rebuildScopeForChange, + shouldRegenerateRoutes, +} from '../src/bun/hmr-protocol' +import { rewriteImportMetaHot } from '../src/bun/hmr-runtime' + +describe('hmr-protocol', () => { + const root = '/app' + + it('classifies route files', () => { + expect(classifyBunChange(root, '/app/src/routes/index.tsx')).toBe('route') + }) + + it('classifies server-only files', () => { + expect(classifyBunChange(root, '/app/src/db.server.ts')).toBe('server-only') + }) + + it('classifies client components', () => { + expect( + classifyBunChange(root, '/app/src/components/Button.tsx'), + ).toBe('client') + }) + + it('maps scopes to SSE events', () => { + expect(hmrEventForScope('server')).toBe('server-only') + expect(hmrEventForScope('client')).toBe('client-reload') + expect(hmrEventForScope('both')).toBe('full-reload') + }) + + it('rebuild scopes', () => { + expect(rebuildScopeForChange('server-only')).toBe('server') + expect(rebuildScopeForChange('client')).toBe('client') + expect(rebuildScopeForChange('route')).toBe('both') + }) + + it('regenerates routes for route changes', () => { + expect(shouldRegenerateRoutes('route')).toBe(true) + expect(shouldRegenerateRoutes('server-only')).toBe(false) + }) +}) + +describe('rewriteImportMetaHot', () => { + it('rewrites import.meta.hot to the Bun shim', () => { + const input = `if (import.meta.hot) { import.meta.hot.accept(() => {}) }` + const out = rewriteImportMetaHot(input) + expect(out).toContain('__tanstack_import_meta_hot__') + expect(out).toContain('globalThis.__tanstack_hot__?.(import.meta.url)') + expect(out).not.toMatch(/(? { + const input = `import.meta.hot.data ??= {}` + const out = rewriteImportMetaHot(input) + expect(out).toContain('__tanstack_import_meta_hot__.data ??= {}') + expect(out.split('\n').slice(1).join('\n')).not.toContain('?.(') + }) +}) diff --git a/packages/start-plugin-core/tests/bun-normalized-client-build.test.ts b/packages/start-plugin-core/tests/bun-normalized-client-build.test.ts new file mode 100644 index 00000000000..d4e28e0908c --- /dev/null +++ b/packages/start-plugin-core/tests/bun-normalized-client-build.test.ts @@ -0,0 +1,105 @@ +import { describe, expect, it } from 'vitest' +import { writeFile, mkdir } from 'node:fs/promises' +import { join } from 'node:path' +import { tmpdir } from 'node:os' +import { + enrichBunClientBuildFromSourcemaps, + normalizeBunClientBuild, +} from '../src/bun/normalized-client-build' + +describe('normalizeBunClientBuild', () => { + it('marks entry-point as the SSR entry chunk', () => { + const build = normalizeBunClientBuild({ + clientOutDir: '/app/dist/client', + outputs: [ + { + path: '/app/dist/client/assets/main-abc.js', + fileName: 'assets/main-abc.js', + kind: 'entry-point', + }, + { + path: '/app/dist/client/assets/chunk-1.js', + fileName: 'assets/chunk-1.js', + kind: 'chunk', + }, + ], + }) + + expect(build.entryChunkFileName).toBe('assets/main-abc.js') + expect(build.chunksByFileName.get('assets/main-abc.js')?.isEntry).toBe(true) + expect(build.chunksByFileName.size).toBe(2) + }) + + it('collects tsr-split route file paths from inputs', () => { + const build = normalizeBunClientBuild({ + clientOutDir: '/app/dist/client', + outputs: [ + { + path: '/app/dist/client/assets/index.js', + fileName: 'assets/index.js', + kind: 'entry-point', + inputs: [ + { + path: '/app/src/routes/posts.tsx?tsr-split=component', + }, + ], + }, + ], + }) + + expect( + build.chunksByFileName.get('assets/index.js')?.routeFilePaths, + ).toEqual(['/app/src/routes/posts.tsx']) + expect( + build.chunkFileNamesByRouteFilePath.get('/app/src/routes/posts.tsx'), + ).toEqual(['assets/index.js']) + }) + + it('enriches route file paths from linked sourcemap sources', async () => { + const dir = join(tmpdir(), `bun-ncb-${Date.now()}`) + await mkdir(dir, { recursive: true }) + const jsPath = join(dir, 'about.js') + const mapPath = `${jsPath}.map` + await writeFile(jsPath, 'export {}') + await writeFile( + mapPath, + JSON.stringify({ + version: 3, + sources: [ + 'tsr-split:/app/src/routes/about.tsx?tsr-split=component', + ], + mappings: '', + }), + ) + + const outputs = [ + { + path: jsPath, + fileName: 'about.js', + kind: 'chunk' as const, + sourcemapPath: mapPath, + }, + { + path: join(dir, 'main.js'), + fileName: 'main.js', + kind: 'entry-point' as const, + }, + ] + + let build = normalizeBunClientBuild({ + clientOutDir: dir, + outputs, + }) + build = await enrichBunClientBuildFromSourcemaps({ + clientBuild: build, + outputs, + }) + + expect(build.chunksByFileName.get('about.js')?.routeFilePaths).toEqual([ + '/app/src/routes/about.tsx', + ]) + expect( + build.chunkFileNamesByRouteFilePath.get('/app/src/routes/about.tsx'), + ).toEqual(['about.js']) + }) +}) diff --git a/packages/start-plugin-core/tests/bun-static-host.test.ts b/packages/start-plugin-core/tests/bun-static-host.test.ts new file mode 100644 index 00000000000..2c52451f863 --- /dev/null +++ b/packages/start-plugin-core/tests/bun-static-host.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it } from 'vitest' +import { resolveClientAssetPath } from '../src/bun/static-host' + +describe('resolveClientAssetPath', () => { + const clientOutDir = '/app/dist/client' + + it('maps /assets/... paths', () => { + expect(resolveClientAssetPath(clientOutDir, '/assets/app.css')).toBe( + '/app/dist/client/assets/app.css', + ) + }) + + it('maps extensioned paths outside assets', () => { + expect(resolveClientAssetPath(clientOutDir, '/favicon.ico')).toBe( + '/app/dist/client/favicon.ico', + ) + }) + + it('rejects traversal and plain routes', () => { + expect(resolveClientAssetPath(clientOutDir, '/../etc/passwd')).toBeNull() + expect(resolveClientAssetPath(clientOutDir, '/assets/../../x')).toBeNull() + expect(resolveClientAssetPath(clientOutDir, '/login')).toBeNull() + }) +}) diff --git a/packages/start-plugin-core/tests/bun-virtual-modules.test.ts b/packages/start-plugin-core/tests/bun-virtual-modules.test.ts new file mode 100644 index 00000000000..bf88c1f0021 --- /dev/null +++ b/packages/start-plugin-core/tests/bun-virtual-modules.test.ts @@ -0,0 +1,63 @@ +import { describe, expect, it } from 'vitest' +import { + createBunVirtualModuleStore, + VIRTUAL_MODULES, +} from '../src/bun/virtual-modules' +import type { NormalizedClientBuild } from '../src/types' +import type { ServerFn } from '../src/start-compiler/types' + +describe('createBunVirtualModuleStore', () => { + it('writes serverFn resolver module from registry', () => { + const store = createBunVirtualModuleStore() + const serverFnsById: Record = { + abc123: { + functionName: 'getMessage', + functionId: 'abc123', + filename: '/app/src/routes/index.tsx', + extractedFilename: '/app/src/routes/index.tsx?tss-serverfn-split', + }, + } + + store.updateServerFnResolver(serverFnsById, { + includeClientReferencedCheck: false, + }) + + const code = store.get(VIRTUAL_MODULES.serverFnResolver) + expect(code).toBeTruthy() + expect(code).toContain('getServerFnById') + expect(code).toContain('abc123') + }) + + it('writes start manifest from NormalizedClientBuild', () => { + const store = createBunVirtualModuleStore() + const clientBuild: NormalizedClientBuild = { + entryChunkFileName: 'assets/client.js', + chunksByFileName: new Map([ + [ + 'assets/client.js', + { + fileName: 'assets/client.js', + isEntry: true, + imports: [], + dynamicImports: [], + css: [], + routeFilePaths: [], + hydrationIds: [], + }, + ], + ]), + chunkFileNamesByRouteFilePath: new Map(), + cssFilesBySourcePath: new Map(), + } + + store.updateManifest({ + clientBuild, + publicBase: '/', + scriptFormat: 'module', + }) + + const code = store.get(VIRTUAL_MODULES.startManifest) + expect(code).toContain('tsrStartManifest') + expect(code).toContain('assets/client.js') + }) +}) diff --git a/packages/start-plugin-core/vite.config.ts b/packages/start-plugin-core/vite.config.ts index fc76204069d..36eef1c188c 100644 --- a/packages/start-plugin-core/vite.config.ts +++ b/packages/start-plugin-core/vite.config.ts @@ -22,6 +22,7 @@ export default mergeConfig( './src/rsbuild/index.ts', './src/rsbuild/types.ts', './src/rsbuild/start-compiler-metadata-loader.ts', + './src/bun/index.ts', ], srcDir: './src', outDir: './dist', diff --git a/packages/vue-start/package.json b/packages/vue-start/package.json index ecc6fdccb97..80a39fd0b33 100644 --- a/packages/vue-start/package.json +++ b/packages/vue-start/package.json @@ -80,6 +80,14 @@ "default": "./dist/esm/plugin/rsbuild.js" } }, + "./plugin/bun": { + "bun": "./src/plugin/bun.ts", + "import": { + "types": "./dist/esm/plugin/bun.d.ts", + "default": "./dist/esm/plugin/bun.js" + }, + "default": "./src/plugin/bun.ts" + }, "./server-entry": { "import": { "types": "./dist/default-entry/esm/server.d.ts", diff --git a/packages/vue-start/src/plugin/bun.ts b/packages/vue-start/src/plugin/bun.ts new file mode 100644 index 00000000000..ac6576f43b9 --- /dev/null +++ b/packages/vue-start/src/plugin/bun.ts @@ -0,0 +1,48 @@ +import { existsSync } from 'node:fs' +import { fileURLToPath } from 'node:url' +import path from 'pathe' +import { + BUN_ENVIRONMENT_NAMES, + tanStackStartBun, +} from '@tanstack/start-plugin-core/bun' +import { vueStartDefaultEntryPaths } from './shared' +import type { + TanStackStartBunInputConfig, + TanStackStartBunPluginCoreOptions, + TanStackStartBunAdapter, +} from '@tanstack/start-plugin-core/bun' + +function resolveDefaultEntryPaths() { + if (existsSync(vueStartDefaultEntryPaths.client)) { + return vueStartDefaultEntryPaths + } + + const srcDefault = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../default-entry', + ) + return { + client: path.resolve(srcDefault, 'client.tsx'), + server: path.resolve(srcDefault, 'server.ts'), + start: path.resolve(srcDefault, 'start.ts'), + } +} + +/** + * TanStack Start Bun bundler adapter for Vue (imperative build/dev API). + */ +export function tanstackStart( + options?: TanStackStartBunInputConfig, +): TanStackStartBunAdapter { + const corePluginOpts: TanStackStartBunPluginCoreOptions = { + framework: 'vue', + defaultEntryPaths: resolveDefaultEntryPaths(), + providerEnvironmentName: BUN_ENVIRONMENT_NAMES.server, + ssrIsProvider: true, + bun: options?.bun, + } + + return tanStackStartBun(corePluginOpts, options) +} + +export type { TanStackStartBunAdapter, TanStackStartBunInputConfig } diff --git a/packages/vue-start/vite.config.ts b/packages/vue-start/vite.config.ts index dc421ef7ffe..a29a2b10fe9 100644 --- a/packages/vue-start/vite.config.ts +++ b/packages/vue-start/vite.config.ts @@ -35,6 +35,7 @@ export default mergeConfig( './src/server.tsx', './src/plugin/rsbuild.ts', './src/plugin/vite.ts', + './src/plugin/bun.ts', './src/server-only.ts', './src/client-only.ts', ], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28d43365cb4..077f1dc0332 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,7 +78,7 @@ importers: version: 1.26.2(@typescript/typescript6@6.0.2)(eslint@9.22.0(jiti@2.7.0))(ts-api-utils@2.4.0(@typescript/typescript6@6.0.2)) '@nx/devkit': specifier: 22.7.5 - version: 22.7.5(nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3)) + version: 22.7.5(nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))) '@playwright/test': specifier: ^1.61.0 version: 1.61.1 @@ -141,7 +141,7 @@ importers: version: 4.0.3 nx: specifier: 22.7.5 - version: 22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3) + version: 22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23)) prettier: specifier: ^3.8.0 version: 3.8.1 @@ -238,7 +238,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.28.5)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-vue': specifier: ^6.0.5 version: 6.0.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) @@ -287,7 +287,7 @@ importers: devDependencies: '@codspeed/vitest-plugin': specifier: ^5.5.0 - version: 5.5.0(debug@4.4.3)(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4) + version: 5.5.0(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4) '@platformatic/flame': specifier: ^1.6.0 version: 1.6.0 @@ -305,7 +305,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-vue': specifier: ^6.0.5 version: 6.0.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) @@ -357,7 +357,7 @@ importers: devDependencies: '@codspeed/vitest-plugin': specifier: ^5.5.0 - version: 5.5.0(debug@4.4.3)(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4) + version: 5.5.0(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4) '@datadog/pprof': specifier: ^5.13.2 version: 5.13.2 @@ -375,7 +375,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-vue': specifier: ^6.0.5 version: 6.0.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) @@ -433,7 +433,7 @@ importers: devDependencies: '@codspeed/vitest-plugin': specifier: ^5.5.0 - version: 5.5.0(debug@4.4.3)(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4) + version: 5.5.0(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4) '@datadog/pprof': specifier: ^5.13.2 version: 5.13.2 @@ -445,7 +445,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.5 version: 5.1.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) @@ -497,13 +497,13 @@ importers: devDependencies: '@codspeed/vitest-plugin': specifier: ^5.5.0 - version: 5.5.0(debug@4.4.3)(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4) + version: 5.5.0(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-vue-jsx': specifier: ^5.1.5 version: 5.1.5(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vue@3.5.25(@typescript/typescript6@6.0.2)) @@ -600,7 +600,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -643,7 +643,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -732,7 +732,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -781,7 +781,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -830,7 +830,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -885,7 +885,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -931,7 +931,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: ~5.9.0 version: 5.9.3 @@ -986,7 +986,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1038,7 +1038,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1072,7 +1072,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1118,7 +1118,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1167,7 +1167,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -1201,7 +1201,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1235,7 +1235,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1272,7 +1272,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1318,7 +1318,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1371,7 +1371,7 @@ importers: version: 1.61.1 '@rolldown/plugin-babel': specifier: ^0.2.0 - version: 0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -1383,7 +1383,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -1548,7 +1548,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1600,7 +1600,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -1652,7 +1652,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -1728,7 +1728,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -1804,7 +1804,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -1865,7 +1865,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -1938,7 +1938,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -2042,7 +2042,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2143,7 +2143,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -2189,7 +2189,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -2259,7 +2259,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) cross-env: specifier: ^10.0.0 version: 10.0.0 @@ -2381,7 +2381,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.15 @@ -2430,7 +2430,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -2485,7 +2485,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) node-forge: specifier: ^1.3.1 version: 1.3.1 @@ -2528,7 +2528,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) autocannon: specifier: ^8.0.0 version: 8.0.0 @@ -2592,7 +2592,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2647,7 +2647,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2702,7 +2702,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -2748,7 +2748,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -2788,7 +2788,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) vite: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -2849,7 +2849,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -2895,7 +2895,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -2996,7 +2996,7 @@ importers: version: 8.44.1(eslint@9.22.0(jiti@2.7.0))(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-rsc': specifier: ^0.5.30 version: 0.5.30(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3048,7 +3048,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-rsc': specifier: ^0.5.30 version: 0.5.30(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3106,7 +3106,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-rsc': specifier: ^0.5.30 version: 0.5.30(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3213,7 +3213,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -3271,7 +3271,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3326,7 +3326,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3411,7 +3411,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -3466,7 +3466,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3542,7 +3542,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -3597,7 +3597,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3695,7 +3695,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3741,7 +3741,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -3765,7 +3765,7 @@ importers: version: link:../../../packages/start-static-server-functions nitro: specifier: ^3.0.1-alpha.2 - version: 3.0.1-alpha.2(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(ioredis@5.9.2)(lru-cache@11.5.1)(mysql2@3.15.3)(rolldown@1.0.2)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 3.0.1-alpha.2(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(ioredis@5.9.2)(lru-cache@11.5.1)(mysql2@3.15.3)(rolldown@1.2.4)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) react: specifier: ^19.2.3 version: 19.2.3 @@ -3793,7 +3793,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -3888,7 +3888,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -3952,7 +3952,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) combinate: specifier: ^1.1.11 version: 1.1.11 @@ -4019,7 +4019,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) srvx: specifier: ^0.11.9 version: 0.11.12 @@ -7688,7 +7688,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7743,7 +7743,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7786,7 +7786,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7835,7 +7835,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7881,7 +7881,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7930,7 +7930,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -7973,7 +7973,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8022,7 +8022,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8077,7 +8077,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8129,7 +8129,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8181,7 +8181,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8233,7 +8233,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8285,7 +8285,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8331,7 +8331,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8377,7 +8377,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8426,7 +8426,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8478,7 +8478,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8533,7 +8533,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8591,7 +8591,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8643,7 +8643,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8692,7 +8692,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8738,7 +8738,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8778,7 +8778,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -8861,7 +8861,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9008,7 +9008,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9054,7 +9054,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9097,7 +9097,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9125,7 +9125,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9174,7 +9174,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9220,7 +9220,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9266,7 +9266,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9309,7 +9309,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9349,7 +9349,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9395,7 +9395,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9438,7 +9438,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9475,7 +9475,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9521,7 +9521,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9567,7 +9567,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9637,7 +9637,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9680,7 +9680,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -9729,7 +9729,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) nitro: specifier: ^3.0.260311-beta version: 3.0.260311-beta(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(miniflare@4.20260317.0)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -9793,7 +9793,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -9854,7 +9854,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9903,7 +9903,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -9967,7 +9967,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10049,7 +10049,7 @@ importers: version: link:../../../packages/start-static-server-functions '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) react: specifier: ^19.2.3 version: 19.2.3 @@ -10147,7 +10147,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) jsdom: specifier: ^27.0.0 version: 27.0.0(postcss@8.5.15) @@ -10167,6 +10167,40 @@ importers: specifier: ^5.1.0 version: 5.1.0 + examples/react/start-bun-bundler: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/react-start': + specifier: workspace:* + version: link:../../../packages/react-start + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + nitro: + specifier: npm:nitro-nightly@latest + version: nitro-nightly@3.0.1-20260810-113911-16ff2809(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(wrangler@4.75.0) + react: + specifier: ^19.2.3 + version: 19.2.3 + react-dom: + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) + devDependencies: + '@types/bun': + specifier: ^1.2.22 + version: 1.3.14 + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.9) + typescript: + specifier: ^5.9.0 + version: 5.9.3 + examples/react/start-clerk-basic: dependencies: '@clerk/tanstack-react-start': @@ -10183,7 +10217,7 @@ importers: version: link:../../../packages/react-start '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) react: specifier: ^19.2.3 version: 19.2.3 @@ -10296,7 +10330,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10339,7 +10373,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10388,7 +10422,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10446,7 +10480,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10507,7 +10541,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10559,7 +10593,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) '@vitejs/plugin-rsc': specifier: ^0.5.30 version: 0.5.30(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -10611,7 +10645,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10660,7 +10694,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10712,7 +10746,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10785,7 +10819,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tailwindcss: specifier: ^4.2.2 version: 4.2.2 @@ -10831,7 +10865,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10880,7 +10914,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10929,7 +10963,7 @@ importers: version: typescript@7.0.2 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -10987,7 +11021,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tsx: specifier: ^4.20.3 version: 4.20.3 @@ -11054,7 +11088,7 @@ importers: version: 19.2.3(@types/react@19.2.9) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) tsx: specifier: ^4.20.3 version: 4.20.3 @@ -13504,7 +13538,7 @@ importers: dependencies: nitropack: specifier: ^2.13.1 - version: 2.13.1(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(mysql2@3.15.3)(rolldown@1.0.2) + version: 2.13.1(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(mysql2@3.15.3)(rolldown@1.2.4) pathe: specifier: ^2.0.3 version: 2.0.3 @@ -13934,6 +13968,9 @@ importers: '@tanstack/router-utils': specifier: workspace:* version: link:../router-utils + bun: + specifier: '>=1.2.0' + version: 1.3.14 chokidar: specifier: ^5.0.0 version: 5.0.0 @@ -13962,6 +13999,9 @@ importers: '@types/babel__template': specifier: ^7.4.4 version: 7.4.4 + '@types/bun': + specifier: ^1.3.14 + version: 1.3.14 '@types/node': specifier: 25.0.9 version: 25.0.9 @@ -14253,6 +14293,9 @@ importers: '@babel/types': specifier: ^7.28.5 version: 7.28.5 + '@tailwindcss/node': + specifier: ^4.0.0 + version: 4.3.1 '@tanstack/router-core': specifier: workspace:* version: link:../router-core @@ -14268,18 +14311,27 @@ importers: '@tanstack/start-server-core': specifier: workspace:* version: link:../start-server-core + bun: + specifier: '>=1.2.0' + version: 1.3.14 exsolve: specifier: ^1.0.7 version: 1.0.7 lightningcss: specifier: ^1.32.0 version: 1.32.0 + nitro: + specifier: '>=3.0.0-alpha || >=3.0.0-beta || >=3.0.0' + version: 3.0.0(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@4.0.3)(ioredis@5.9.2)(lru-cache@11.5.1)(mysql2@3.15.3)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) pathe: specifier: ^2.0.3 version: 2.0.3 picomatch: specifier: ^4.0.3 version: 4.0.3 + react-refresh: + specifier: ^0.18.0 + version: 0.18.0 seroval: specifier: ^1.6.2 version: 1.6.2 @@ -14314,6 +14366,9 @@ importers: '@types/babel__core': specifier: ^7.20.5 version: 7.20.5 + '@types/bun': + specifier: ^1.3.14 + version: 1.3.14 '@types/node': specifier: 25.0.9 version: 25.0.9 @@ -14343,7 +14398,7 @@ importers: version: 0.1.7 h3-v2: specifier: npm:h3@2.0.1-rc.20 - version: h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.22)) + version: h3@2.0.1-rc.20(crossws@0.4.10(srvx@0.12.5)) seroval: specifier: ^1.6.2 version: 1.6.2 @@ -17605,6 +17660,86 @@ packages: resolution: {integrity: sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==} engines: {node: '>=14'} + '@oven/bun-darwin-aarch64@1.3.14': + resolution: {integrity: sha512-Omj20SuiHBOUjUBIyqtkNjSUIjOtEOJwmbix/ZyFH4BaQ6OZTaaRWIR4TjHVz0yadHgli6lLTiAh1uarnvD49A==} + cpu: [arm64] + os: [darwin] + + '@oven/bun-darwin-x64-baseline@1.3.14': + resolution: {integrity: sha512-OSfsTZstc898HHElhU4NccaBGOSSDn5VfahiVTnidZ9B/+wb7WTyfZJaBeJcfjwJ9H2W9uTh2TGtl3UfcXgV9g==} + cpu: [x64] + os: [darwin] + + '@oven/bun-darwin-x64@1.3.14': + resolution: {integrity: sha512-FFj3QdU/OhlDyZOJ8CWfN5eWLpRlT4qjZg7lMQi7jA6GuoY5ajlO1zWLP/MuHYRSbXQUvV52RejNi8DVnAp13w==} + cpu: [x64] + os: [darwin] + + '@oven/bun-freebsd-aarch64@1.3.14': + resolution: {integrity: sha512-LIKrXaFxAHybVO5Pf+9XP2FHUj/5APvXTUKk9dqHm5iFz4oH+W24cmhjkJirNujh9hKeTyrpWSe3no9JZKowIw==} + cpu: [arm64] + os: [freebsd] + + '@oven/bun-freebsd-x64@1.3.14': + resolution: {integrity: sha512-uwD+fGUH1ADpIF3B1U2jWzzb20QwRLZfj5QZ28GUCGrAJ/nTmWrD6YYGsblCY1wuhldRez3lU40AyuvSCyLYmw==} + cpu: [x64] + os: [freebsd] + + '@oven/bun-linux-aarch64-android@1.3.14': + resolution: {integrity: sha512-y4kq5b85lsrmFb9Xvi4w9mA5IEFJkLMrSmYn06q24KjL9rUWDWO3VFZEtteZxUN5+ec3Zm5S8OnJw1umaCbVjA==} + cpu: [arm64] + os: [android] + + '@oven/bun-linux-aarch64-musl@1.3.14': + resolution: {integrity: sha512-jmqOA92Cd1NL/1XBd4bFkJLxQ86K0RW7ohxS2qzzAvuitO4JiIxjjTeCspoU44zCozH72HpfZfUE2On31OjnWA==} + cpu: [arm64] + os: [linux] + + '@oven/bun-linux-aarch64@1.3.14': + resolution: {integrity: sha512-X5SsPZHs+iYO8R/efIcRtc7gT2Q2DgPfliCxEkx4cXBumwkw0c/EsHMNwH3EgGpCDaZ7IYVPhpCG/xBOQHEwZw==} + cpu: [arm64] + os: [linux] + + '@oven/bun-linux-x64-android@1.3.14': + resolution: {integrity: sha512-qe9e1d+3VAEU7nAA2ol9Jvmy/o99PVMSgZhHn7Q/9O3YcDrfEqyQ8zm4zoe5qTEo8HZH0dN03Le0Ys2eQPs7eg==} + cpu: [x64] + os: [android] + + '@oven/bun-linux-x64-baseline@1.3.14': + resolution: {integrity: sha512-q/8EdOC0yUE8FPeoOVq8/Pw5I9/tJaYmUfO/uDUAREx8IUnOJH1RJ5A3BjFqre8pvJoiZA9AovPJq5FnNNjSxA==} + cpu: [x64] + os: [linux] + + '@oven/bun-linux-x64-musl-baseline@1.3.14': + resolution: {integrity: sha512-n6iE71G4lQE4XkrZhQQcL5YUlxDbnq6nqV7zeQi33PMsLT/0kYE+RvHOtBWZ3w0wMdXZfINmp63hIb9ijUBGtw==} + cpu: [x64] + os: [linux] + + '@oven/bun-linux-x64-musl@1.3.14': + resolution: {integrity: sha512-GBCB/k/sIqcr06eTNgg7g46qiUv35Jasx4XiccJ/n7RGqrE4RWUD/XJBbWFprVPjvqd59+QtSnS99XGqvftHfg==} + cpu: [x64] + os: [linux] + + '@oven/bun-linux-x64@1.3.14': + resolution: {integrity: sha512-7OVTAKvwfPmSbIV1HpdOoVVx5VRc427GuPPne93N6vk4eQBPId9nXmZDh9/zGaKPdbVjVtQSZafWQoUjx38Utw==} + cpu: [x64] + os: [linux] + + '@oven/bun-windows-aarch64@1.3.14': + resolution: {integrity: sha512-T7s3x/BsVKQObGU6QDkZeI6wKynzqGbBH1yI77jrrj5siElclxr3DQrDIk8CV4G5/SJq2HHq4kpLyYY2DKCSmA==} + cpu: [arm64] + os: [win32] + + '@oven/bun-windows-x64-baseline@1.3.14': + resolution: {integrity: sha512-uIjLUC1S9DWgICzuoMba7vurBJnBruE4S5CxnvmZkdqWVXRzx1Rgu636HoH+k0qeaQCFh3jeG3JQ1y6fRHv0sw==} + cpu: [x64] + os: [win32] + + '@oven/bun-windows-x64@1.3.14': + resolution: {integrity: sha512-mUFWL3BoYkNpjd8e9PqROiFF/1Xeotq20mABJsiQH62jM1g5zqWh4khw1RZ6bX8Q8fWvlPaxG1PjofkmjUi3vg==} + cpu: [x64] + os: [win32] + '@oxc-minify/binding-android-arm-eabi@0.110.0': resolution: {integrity: sha512-43fMTO8/5bMlqfOiNSZNKUzIqeLIYuB9Hr1Ohyf58B1wU11S2dPGibTXOGNaWsfgHy99eeZ1bSgeIHy/fEYqbw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -17738,6 +17873,9 @@ packages: '@oxc-project/types@0.132.0': resolution: {integrity: sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ==} + '@oxc-project/types@0.144.0': + resolution: {integrity: sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==} + '@oxc-resolver/binding-android-arm-eabi@11.19.1': resolution: {integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==} cpu: [arm] @@ -18910,6 +19048,12 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.2.4': + resolution: {integrity: sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-rc.9': resolution: {integrity: sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -18922,6 +19066,12 @@ packages: cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.2.4': + resolution: {integrity: sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.9': resolution: {integrity: sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -18934,6 +19084,12 @@ packages: cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.2.4': + resolution: {integrity: sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-rc.9': resolution: {integrity: sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -18946,6 +19102,12 @@ packages: cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.2.4': + resolution: {integrity: sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9': resolution: {integrity: sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -18958,6 +19120,12 @@ packages: cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.2.4': + resolution: {integrity: sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9': resolution: {integrity: sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -18972,6 +19140,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.2.4': + resolution: {integrity: sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9': resolution: {integrity: sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -18986,6 +19161,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.2.4': + resolution: {integrity: sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9': resolution: {integrity: sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -19000,6 +19182,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.2.4': + resolution: {integrity: sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9': resolution: {integrity: sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -19014,6 +19203,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.2.4': + resolution: {integrity: sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9': resolution: {integrity: sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -19028,6 +19224,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.2.4': + resolution: {integrity: sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.9': resolution: {integrity: sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -19042,6 +19245,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.2.4': + resolution: {integrity: sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.9': resolution: {integrity: sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==} engines: {node: ^20.19.0 || >=22.12.0} @@ -19054,6 +19264,12 @@ packages: cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.2.4': + resolution: {integrity: sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.9': resolution: {integrity: sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==} engines: {node: '>=14.0.0'} @@ -19076,6 +19292,12 @@ packages: cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.2.4': + resolution: {integrity: sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.9': resolution: {integrity: sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -19088,6 +19310,12 @@ packages: cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.2.4': + resolution: {integrity: sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/plugin-babel@0.2.3': resolution: {integrity: sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==} engines: {node: '>=22.12.0 || ^24.0.0'} @@ -20555,6 +20783,9 @@ packages: '@types/bun@1.2.22': resolution: {integrity: sha512-5A/KrKos2ZcN0c6ljRSOa1fYIyCKhZfIVYeuyb4snnvomnpFqC0tTsEkdqNxbAgExV384OETQ//WAjl3XbYqQA==} + '@types/bun@1.3.14': + resolution: {integrity: sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw==} + '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -21972,6 +22203,15 @@ packages: peerDependencies: '@types/react': ^19.2.8 + bun-types@1.3.14: + resolution: {integrity: sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ==} + + bun@1.3.14: + resolution: {integrity: sha512-aB6GVd42x1Y5ie1K16SF+oLGtgSkwX9hgoDdIW88pjvfTccU8F1vfpoOt34QLv0dZ1v3XimtaxPlZUG81Gx9Zg==} + cpu: [arm64, x64] + os: [darwin, linux, android, freebsd, win32] + hasBin: true + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -22436,6 +22676,14 @@ packages: crossws@0.3.5: resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + crossws@0.4.10: + resolution: {integrity: sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA==} + peerDependencies: + srvx: '>=0.11.5' + peerDependenciesMeta: + srvx: + optional: true + crossws@0.4.3: resolution: {integrity: sha512-lmf5mtwHiToP3HumOx53cqS0T5TK8GMBpsbSCXRB5OuszbltTgGOO4B1WhrDYqTeXOk3BAemibNjJx8E0/ecNw==} peerDependencies: @@ -22913,14 +23161,6 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} - engines: {node: '>=10.13.0'} - - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} - engines: {node: '>=10.13.0'} - enhanced-resolve@5.21.6: resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==} engines: {node: '>=10.13.0'} @@ -22956,6 +23196,24 @@ packages: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + env-runner@0.1.16: + resolution: {integrity: sha512-2LRJM4P2KLX6J83QZZrMqvgCDt/D5ea7wPcI3yYiy5cG/9rX5QwdwZFx0D7ktWnjdRyZxYjttGGorb5nFqb1CA==} + hasBin: true + peerDependencies: + '@netlify/runtime': ^4.1.23 + '@vercel/queue': '>=0.2.0' + miniflare: ^4.20260515.0 + wrangler: ^4.0.0 + peerDependenciesMeta: + '@netlify/runtime': + optional: true + '@vercel/queue': + optional: true + miniflare: + optional: true + wrangler: + optional: true + env-runner@0.1.6: resolution: {integrity: sha512-fSb7X1zdda8k6611a6/SdSQpDe7a/bqMz2UWdbHjk9YWzpUR4/fn9YtE/hqgGQ2nhvVN0zUtcL1SRMKwIsDbAA==} hasBin: true @@ -23338,6 +23596,9 @@ packages: exsolve@1.0.8: resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + exsolve@1.1.1: + resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -23723,6 +23984,15 @@ packages: resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + h3-rules@0.1.0: + resolution: {integrity: sha512-MrUUH1E/yoM7hvpKVbLs/CFeindwiTn7Fcfo+zXDpfuRYbcpJDPkYGGttCSiHNJmjUQNYQ5yn9veUIqFonYXuw==} + peerDependencies: + h3: ^2.0.1-rc.25 + ocache: '>=0.2.0' + peerDependenciesMeta: + ocache: + optional: true + h3@1.15.5: resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} @@ -23746,6 +24016,15 @@ packages: crossws: optional: true + h3@2.0.1-rc.2: + resolution: {integrity: sha512-2vS7OETzPDzGQxmmcs6ttu7p0NW25zAdkPXYOr43dn4GZf81uUljJvupa158mcpUGpsQUqIy4O4THWUQT1yVeA==} + engines: {node: '>=20.11.1'} + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + h3@2.0.1-rc.20: resolution: {integrity: sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg==} engines: {node: '>=20.11.1'} @@ -23756,6 +24035,16 @@ packages: crossws: optional: true + h3@2.0.1-rc.26: + resolution: {integrity: sha512-GDxlvDsKxgjRvG5UBRJYyGJTMWLV30CJ4cV+e7QCTgftDHihrvio1fVPbNembhEr6J4WNm8IWy3fookgyTweLw==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.9 + peerDependenciesMeta: + crossws: + optional: true + handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -23826,6 +24115,9 @@ packages: hookable@6.1.0: resolution: {integrity: sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw==} + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -23934,6 +24226,9 @@ packages: httpxy@0.3.1: resolution: {integrity: sha512-XjG/CEoofEisMrnFr0D6U6xOZ4mRfnwcYQ9qvvnT4lvnX8BoeA3x3WofB75D+vZwpaobFVkBIHrZzoK40w8XSw==} + httpxy@0.5.5: + resolution: {integrity: sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==} + human-id@4.1.1: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true @@ -25016,12 +25311,66 @@ packages: netlify-redirector@0.5.0: resolution: {integrity: sha512-4zdzIP+6muqPCuE8avnrgDJ6KW/2+UpHTRcTbMXCIRxiRmyrX+IZ4WSJGZdHPWF3WmQpXpy603XxecZ9iygN7w==} + nf3@0.1.12: + resolution: {integrity: sha512-qbMXT7RTGh74MYWPeqTIED8nDW70NXOULVHpdWcdZ7IVHVnAsMV9fNugSNnvooipDc1FMOzpis7T9nXJEbJhvQ==} + nf3@0.3.11: resolution: {integrity: sha512-ObKp/SA3f1g1f/OMeDlRWaZmqGgk7A0NnDIbeO7c/MV4r/quMlpP/BsqMGuTi3lUlXbC1On8YH7ICM2u2bIAOw==} + nf3@0.3.23: + resolution: {integrity: sha512-RWVLAWozmVD3AaDmaU3qMGB3v+yNlH5d9qqStI4e/WLlNQVnJ4YErGDbYCIrGFyrHdbF6I6Baf0Ae6c7tFYmSg==} + nf3@0.3.6: resolution: {integrity: sha512-/XRUUILTAyuy1XunyVQuqGp8aEmZ2TfRTn8Rji+FA4xqv20qzL4jV7Reqbuey2XucKgPeRVcEYGScmJM0UnB6Q==} + nitro-nightly@3.0.1-20260810-113911-16ff2809: + resolution: {integrity: sha512-CD/oRD6udCLWDMOHRRulls448wD1bUzQ6GYfzlUKXTSERDGML9orZhp0dfXTDMZ0A4EtUkRogFH/vHAj9P42ow==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@vercel/queue': ^0.4.0 + dotenv: '*' + giget: '*' + jiti: ^2.7.0 + rollup: ^4.62.2 + vite: ^8.0.14 + xml2js: ^0.6.2 + zephyr-agent: ^1.1.2 + peerDependenciesMeta: + '@vercel/queue': + optional: true + dotenv: + optional: true + giget: + optional: true + jiti: + optional: true + rollup: + optional: true + vite: + optional: true + xml2js: + optional: true + zephyr-agent: + optional: true + + nitro@3.0.0: + resolution: {integrity: sha512-pPrH77/oiYz3q1xGgOYQPEkXERsCi4PkErL2DpHhg4raag3EX7Zh41KFJ0ploSmflmDOPRPeAtC1/19fVrOqoQ==} + engines: {node: ^20.19.0 || >=22.12.0} + deprecated: 'IMPORTANT: please use nitro@3.0.1' + hasBin: true + peerDependencies: + rolldown: '*' + vite: ^8.0.14 + xml2js: ^0.6.2 + peerDependenciesMeta: + rolldown: + optional: true + vite: + optional: true + xml2js: + optional: true + nitro@3.0.1-alpha.2: resolution: {integrity: sha512-YviDY5J/trS821qQ1fpJtpXWIdPYiOizC/meHavlm1Hfuhx//H+Egd1+4C5SegJRgtWMnRPW9n//6Woaw81cTQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -25224,6 +25573,9 @@ packages: ocache@0.1.2: resolution: {integrity: sha512-lI34wjM7cahEdrq2I5obbF7MEdE97vULf6vNj6ZCzwEadzyXO1w7QOl2qzzG4IL8cyO7wDtXPj9CqW/aG3mn7g==} + ocache@0.2.0: + resolution: {integrity: sha512-QE+SxXf/A8yR01rEOg2X5KwUe+mARHo1xQXl+iwLMzLIH06S5lBOZhhHQWp7T5etfFa8nOnRhvjGuo9YBCWwig==} + ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} @@ -26029,6 +26381,10 @@ packages: renderkid@3.0.0: resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + rendu@0.0.6: + resolution: {integrity: sha512-nZ512Dw0MxKiIYfCVv8DPe6ig4m0Qt3FOYBJEXrammjIYBBPuHaudc0AGfYx+iyOw2q0itAtPywiVZXtTFCsig==} + hasBin: true + repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} @@ -26125,6 +26481,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.2.4: + resolution: {integrity: sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-visualizer@6.0.5: resolution: {integrity: sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==} engines: {node: '>=18'} @@ -26149,6 +26510,9 @@ packages: rou3@0.8.1: resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} + rou3@0.9.2: + resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==} + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -26546,6 +26910,16 @@ packages: engines: {node: '>=20.16.0'} hasBin: true + srvx@0.12.5: + resolution: {integrity: sha512-IuvtDNQg5EIwv3c6dleyau7u8hCyGQ7D6+V/QM799Aud07z0wCUcurKLTRfyG33C8oUY+UWcVBFkfHMcbtmRLA==} + engines: {node: '>=20.16.0'} + hasBin: true + + srvx@0.8.16: + resolution: {integrity: sha512-hmcGW4CgroeSmzgF1Ihwgl+Ths0JqAJ7HwjP2X7e3JzY7u4IydLMcdnlqGQiQGUswz+PO9oh/KtCpOISIvs9QQ==} + engines: {node: '>=20.16.0'} + hasBin: true + stable-hash-x@0.2.0: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} @@ -26729,10 +27103,6 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} @@ -27092,6 +27462,9 @@ packages: ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + uint8array-extras@1.5.0: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} @@ -27127,6 +27500,9 @@ packages: resolution: {integrity: sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==} engines: {node: '>=20.18.1'} + unenv@2.0.0-rc.21: + resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} + unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} @@ -27242,6 +27618,80 @@ packages: uploadthing: optional: true + unstorage@2.0.0-alpha.3: + resolution: {integrity: sha512-BeoqISVh8jxqnPseHH7/92twe2VkQztrudXg8RFZVbXb4ckkFdpLk1LnNvsUndDltyodBMVxgI6V7JcbJYt2VQ==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + chokidar: ^4.0.3 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + lru-cache: ^11.2.2 + mongodb: ^6.20.0 + ofetch: ^1.4.1 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + chokidar: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + lru-cache: + optional: true + mongodb: + optional: true + ofetch: + optional: true + uploadthing: + optional: true + unstorage@2.0.0-alpha.5: resolution: {integrity: sha512-Sj8btci21Twnd6M+N+MHhjg3fVn6lAPElPmvFTe0Y/wR0WImErUdA1PzlAaUavHylJ7uDiFwlZDQKm0elG4b7g==} peerDependencies: @@ -27390,6 +27840,80 @@ packages: uploadthing: optional: true + unstorage@2.0.0-alpha.7: + resolution: {integrity: sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog==} + peerDependencies: + '@azure/app-configuration': ^1.11.0 + '@azure/cosmos': ^4.9.1 + '@azure/data-tables': ^13.3.2 + '@azure/identity': ^4.13.0 + '@azure/keyvault-secrets': ^4.10.0 + '@azure/storage-blob': ^12.31.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.13.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.36.2 + '@vercel/blob': '>=0.27.3' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + chokidar: ^4 || ^5 + db0: '>=0.3.4' + idb-keyval: ^6.2.2 + ioredis: ^5.9.3 + lru-cache: ^11.2.6 + mongodb: ^6 || ^7 + ofetch: '*' + uploadthing: ^7.7.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + chokidar: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + lru-cache: + optional: true + mongodb: + optional: true + ofetch: + optional: true + uploadthing: + optional: true + untun@0.1.3: resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} hasBin: true @@ -29029,9 +29553,9 @@ snapshots: '@cloudflare/workerd-windows-64@1.20260317.1': optional: true - '@codspeed/core@5.5.0(debug@4.4.3)': + '@codspeed/core@5.5.0': dependencies: - axios: 1.17.0(debug@4.4.3) + axios: 1.17.0 find-up: 6.3.0 form-data: 4.0.5 node-gyp-build: 4.8.4 @@ -29040,9 +29564,9 @@ snapshots: - debug - supports-color - '@codspeed/vitest-plugin@5.5.0(debug@4.4.3)(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4)': + '@codspeed/vitest-plugin@5.5.0(tinybench@2.9.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(vitest@4.1.4)': dependencies: - '@codspeed/core': 5.5.0(debug@4.4.3) + '@codspeed/core': 5.5.0 tinybench: 2.9.0 vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) vitest: 4.1.4(@types/node@25.0.9)(@vitest/ui@4.1.4)(jsdom@29.1.1(@noble/hashes@2.0.1))(msw@2.7.0(@types/node@25.0.9)(@typescript/typescript6@6.0.2))(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) @@ -31289,13 +31813,13 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.0 - '@nx/devkit@22.7.5(nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3))': + '@nx/devkit@22.7.5(nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23)))': dependencies: '@zkochan/js-yaml': 0.0.7 ejs: 5.0.1 enquirer: 2.3.6 minimatch: 10.2.5 - nx: 22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3) + nx: 22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23)) semver: 7.8.2 tslib: 2.8.1 yargs-parser: 21.1.1 @@ -31360,6 +31884,54 @@ snapshots: '@opentelemetry/semantic-conventions@1.41.1': {} + '@oven/bun-darwin-aarch64@1.3.14': + optional: true + + '@oven/bun-darwin-x64-baseline@1.3.14': + optional: true + + '@oven/bun-darwin-x64@1.3.14': + optional: true + + '@oven/bun-freebsd-aarch64@1.3.14': + optional: true + + '@oven/bun-freebsd-x64@1.3.14': + optional: true + + '@oven/bun-linux-aarch64-android@1.3.14': + optional: true + + '@oven/bun-linux-aarch64-musl@1.3.14': + optional: true + + '@oven/bun-linux-aarch64@1.3.14': + optional: true + + '@oven/bun-linux-x64-android@1.3.14': + optional: true + + '@oven/bun-linux-x64-baseline@1.3.14': + optional: true + + '@oven/bun-linux-x64-musl-baseline@1.3.14': + optional: true + + '@oven/bun-linux-x64-musl@1.3.14': + optional: true + + '@oven/bun-linux-x64@1.3.14': + optional: true + + '@oven/bun-windows-aarch64@1.3.14': + optional: true + + '@oven/bun-windows-x64-baseline@1.3.14': + optional: true + + '@oven/bun-windows-x64@1.3.14': + optional: true + '@oxc-minify/binding-android-arm-eabi@0.110.0': optional: true @@ -31429,6 +32001,8 @@ snapshots: '@oxc-project/types@0.132.0': {} + '@oxc-project/types@0.144.0': {} + '@oxc-resolver/binding-android-arm-eabi@11.19.1': optional: true @@ -32589,72 +33163,108 @@ snapshots: '@rolldown/binding-android-arm64@1.0.2': optional: true + '@rolldown/binding-android-arm64@1.2.4': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.9': optional: true '@rolldown/binding-darwin-arm64@1.0.2': optional: true + '@rolldown/binding-darwin-arm64@1.2.4': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.9': optional: true '@rolldown/binding-darwin-x64@1.0.2': optional: true + '@rolldown/binding-darwin-x64@1.2.4': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.9': optional: true '@rolldown/binding-freebsd-x64@1.0.2': optional: true + '@rolldown/binding-freebsd-x64@1.2.4': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.2': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.2.4': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.2': optional: true + '@rolldown/binding-linux-arm64-gnu@1.2.4': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9': optional: true '@rolldown/binding-linux-arm64-musl@1.0.2': optional: true + '@rolldown/binding-linux-arm64-musl@1.2.4': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9': optional: true '@rolldown/binding-linux-ppc64-gnu@1.0.2': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.2.4': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9': optional: true '@rolldown/binding-linux-s390x-gnu@1.0.2': optional: true + '@rolldown/binding-linux-s390x-gnu@1.2.4': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9': optional: true '@rolldown/binding-linux-x64-gnu@1.0.2': optional: true + '@rolldown/binding-linux-x64-gnu@1.2.4': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-rc.9': optional: true '@rolldown/binding-linux-x64-musl@1.0.2': optional: true + '@rolldown/binding-linux-x64-musl@1.2.4': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-rc.9': optional: true '@rolldown/binding-openharmony-arm64@1.0.2': optional: true + '@rolldown/binding-openharmony-arm64@1.2.4': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.9(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) @@ -32676,26 +33286,23 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.2': optional: true + '@rolldown/binding-win32-arm64-msvc@1.2.4': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.9': optional: true '@rolldown/binding-win32-x64-msvc@1.0.2': optional: true - '@rolldown/plugin-babel@0.2.3(@babel/core@7.28.5)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': - dependencies: - '@babel/core': 7.28.5 - picomatch: 4.0.4 - rolldown: 1.0.2 - optionalDependencies: - vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + '@rolldown/binding-win32-x64-msvc@1.2.4': optional: true - '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': + '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 picomatch: 4.0.4 - rolldown: 1.0.2 + rolldown: 1.2.4 optionalDependencies: vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) @@ -33559,8 +34166,8 @@ snapshots: '@tailwindcss/node@4.2.2': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.20.1 - jiti: 2.6.1 + enhanced-resolve: 5.21.6 + jiti: 2.7.0 lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 @@ -34094,6 +34701,10 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@types/bun@1.3.14': + dependencies: + bun-types: 1.3.14 + '@types/chai@5.2.2': dependencies: '@types/deep-eql': 4.0.2 @@ -34967,20 +35578,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.28.5)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': - dependencies: - '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) - optionalDependencies: - '@rolldown/plugin-babel': 0.2.3(@babel/core@7.28.5)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) - babel-plugin-react-compiler: 1.0.0 - - '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': + '@vitejs/plugin-react@6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) optionalDependencies: - '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.0)(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.0)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) babel-plugin-react-compiler: 1.0.0 '@vitejs/plugin-rsc@0.5.30(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))': @@ -35770,7 +36373,7 @@ snapshots: aws-ssl-profiles@1.1.2: {} - axios@1.16.0(debug@4.4.3): + axios@1.16.0: dependencies: follow-redirects: 1.16.0(debug@4.4.3) form-data: 4.0.5 @@ -35778,7 +36381,7 @@ snapshots: transitivePeerDependencies: - debug - axios@1.17.0(debug@4.4.3): + axios@1.17.0: dependencies: follow-redirects: 1.16.0(debug@4.4.3) form-data: 4.0.5 @@ -36064,6 +36667,29 @@ snapshots: '@types/node': 25.0.9 '@types/react': 19.2.9 + bun-types@1.3.14: + dependencies: + '@types/node': 25.0.9 + + bun@1.3.14: + optionalDependencies: + '@oven/bun-darwin-aarch64': 1.3.14 + '@oven/bun-darwin-x64': 1.3.14 + '@oven/bun-darwin-x64-baseline': 1.3.14 + '@oven/bun-freebsd-aarch64': 1.3.14 + '@oven/bun-freebsd-x64': 1.3.14 + '@oven/bun-linux-aarch64': 1.3.14 + '@oven/bun-linux-aarch64-android': 1.3.14 + '@oven/bun-linux-aarch64-musl': 1.3.14 + '@oven/bun-linux-x64': 1.3.14 + '@oven/bun-linux-x64-android': 1.3.14 + '@oven/bun-linux-x64-baseline': 1.3.14 + '@oven/bun-linux-x64-musl': 1.3.14 + '@oven/bun-linux-x64-musl-baseline': 1.3.14 + '@oven/bun-windows-aarch64': 1.3.14 + '@oven/bun-windows-x64': 1.3.14 + '@oven/bun-windows-x64-baseline': 1.3.14 + bundle-name@4.1.0: dependencies: run-applescript: 7.0.0 @@ -36080,7 +36706,7 @@ snapshots: dotenv: 16.6.1 exsolve: 1.0.8 giget: 2.0.0 - jiti: 2.6.1 + jiti: 2.7.0 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 @@ -36095,7 +36721,7 @@ snapshots: dotenv: 17.4.2 exsolve: 1.0.8 giget: 2.0.0 - jiti: 2.6.1 + jiti: 2.7.0 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 2.0.0 @@ -36532,6 +37158,15 @@ snapshots: dependencies: uncrypto: 0.1.3 + crossws@0.4.10(srvx@0.11.22): + optionalDependencies: + srvx: 0.11.22 + + crossws@0.4.10(srvx@0.12.5): + optionalDependencies: + srvx: 0.12.5 + optional: true + crossws@0.4.3(srvx@0.10.1): optionalDependencies: srvx: 0.10.1 @@ -36540,14 +37175,13 @@ snapshots: optionalDependencies: srvx: 0.11.15 - crossws@0.4.4(srvx@0.11.18): - optionalDependencies: - srvx: 0.11.18 - crossws@0.4.5(srvx@0.11.22): optionalDependencies: srvx: 0.11.22 - optional: true + + crossws@0.4.5(srvx@0.8.16): + optionalDependencies: + srvx: 0.8.16 css-loader@7.1.2(webpack@5.97.1): dependencies: @@ -36969,16 +37603,6 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 - enhanced-resolve@5.18.3: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - - enhanced-resolve@5.20.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - enhanced-resolve@5.21.6: dependencies: graceful-fs: 4.2.11 @@ -37005,11 +37629,20 @@ snapshots: env-paths@3.0.0: {} + env-runner@0.1.16(wrangler@4.75.0): + dependencies: + crossws: 0.4.10(srvx@0.11.22) + exsolve: 1.1.1 + httpxy: 0.5.5 + srvx: 0.11.22 + optionalDependencies: + wrangler: 4.75.0 + env-runner@0.1.6(miniflare@4.20260317.0): dependencies: - crossws: 0.4.4(srvx@0.11.18) + crossws: 0.4.5(srvx@0.11.22) httpxy: 0.3.1 - srvx: 0.11.18 + srvx: 0.11.22 optionalDependencies: miniflare: 4.20260317.0 @@ -37279,7 +37912,7 @@ snapshots: eslint-plugin-n@17.23.1(@typescript/typescript6@6.0.2)(eslint@9.22.0(jiti@2.7.0)): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.22.0(jiti@2.7.0)) - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.21.6 eslint: 9.22.0(jiti@2.7.0) eslint-plugin-es-x: 7.8.0(eslint@9.22.0(jiti@2.7.0)) get-tsconfig: 4.10.1 @@ -37294,7 +37927,7 @@ snapshots: eslint-plugin-n@17.24.0(@typescript/typescript6@6.0.2)(eslint@9.22.0(jiti@2.7.0)): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.22.0(jiti@2.7.0)) - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.21.6 eslint: 9.22.0(jiti@2.7.0) eslint-plugin-es-x: 7.8.0(eslint@9.22.0(jiti@2.7.0)) get-tsconfig: 4.10.1 @@ -37662,6 +38295,8 @@ snapshots: exsolve@1.0.8: {} + exsolve@1.1.1: {} + extendable-error@0.1.7: {} extract-zip@2.0.1: @@ -38102,6 +38737,14 @@ snapshots: dependencies: duplexer: 0.1.2 + h3-rules@0.1.0(h3@2.0.1-rc.26(crossws@0.4.10(srvx@0.11.22)))(ocache@0.2.0): + dependencies: + h3: 2.0.1-rc.26(crossws@0.4.10(srvx@0.11.22)) + rou3: 0.9.2 + ufo: 1.6.4 + optionalDependencies: + ocache: 0.2.0 + h3@1.15.5: dependencies: cookie-es: 1.2.2 @@ -38117,23 +38760,39 @@ snapshots: h3@2.0.1-rc.14(crossws@0.4.3(srvx@0.10.1)): dependencies: rou3: 0.7.12 - srvx: 0.11.15 + srvx: 0.11.22 optionalDependencies: crossws: 0.4.3(srvx@0.10.1) h3@2.0.1-rc.16(crossws@0.4.4(srvx@0.11.15)): dependencies: rou3: 0.8.1 - srvx: 0.11.18 + srvx: 0.11.22 optionalDependencies: crossws: 0.4.4(srvx@0.11.15) - h3@2.0.1-rc.20(crossws@0.4.5(srvx@0.11.22)): + h3@2.0.1-rc.2(crossws@0.4.5(srvx@0.11.12)): + dependencies: + cookie-es: 2.0.0 + fetchdts: 0.1.7 + rou3: 0.7.12 + srvx: 0.8.16 + optionalDependencies: + crossws: 0.4.5(srvx@0.8.16) + + h3@2.0.1-rc.20(crossws@0.4.10(srvx@0.12.5)): dependencies: rou3: 0.8.1 srvx: 0.11.15 optionalDependencies: - crossws: 0.4.5(srvx@0.11.22) + crossws: 0.4.10(srvx@0.12.5) + + h3@2.0.1-rc.26(crossws@0.4.10(srvx@0.11.22)): + dependencies: + rou3: 0.9.2 + srvx: 0.12.5 + optionalDependencies: + crossws: 0.4.10(srvx@0.11.22) handle-thing@2.0.1: {} @@ -38189,6 +38848,8 @@ snapshots: hookable@6.1.0: {} + hookable@6.1.1: {} + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -38339,6 +39000,8 @@ snapshots: httpxy@0.3.1: {} + httpxy@0.5.5: {} + human-id@4.1.1: {} human-signals@5.0.0: {} @@ -39011,7 +39674,7 @@ snapshots: get-port-please: 3.2.0 h3: 1.15.5 http-shutdown: 1.2.2 - jiti: 2.6.1 + jiti: 2.7.0 mlly: 1.8.0 node-forge: 1.3.1 pathe: 1.1.2 @@ -39409,11 +40072,121 @@ snapshots: netlify-redirector@0.5.0: {} + nf3@0.1.12: {} + nf3@0.3.11: {} + nf3@0.3.23: {} + nf3@0.3.6: {} - nitro@3.0.1-alpha.2(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(ioredis@5.9.2)(lru-cache@11.5.1)(mysql2@3.15.3)(rolldown@1.0.2)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): + nitro-nightly@3.0.1-20260810-113911-16ff2809(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(dotenv@17.4.2)(giget@2.0.0)(jiti@2.7.0)(lru-cache@11.5.1)(mysql2@3.15.3)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0))(wrangler@4.75.0): + dependencies: + consola: 3.4.2 + crossws: 0.4.10(srvx@0.11.22) + db0: 0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3) + env-runner: 0.1.16(wrangler@4.75.0) + h3: 2.0.1-rc.26(crossws@0.4.10(srvx@0.11.22)) + h3-rules: 0.1.0(h3@2.0.1-rc.26(crossws@0.4.10(srvx@0.11.22)))(ocache@0.2.0) + hookable: 6.1.1 + nf3: 0.3.23 + ocache: 0.2.0 + ofetch: 2.0.0-alpha.3 + ohash: 2.0.11 + rolldown: 1.2.4 + rou3: 0.9.2 + srvx: 0.11.22 + unenv: 2.0.0-rc.24 + unstorage: 2.0.0-alpha.7(@netlify/blobs@10.1.0)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3) + optionalDependencies: + dotenv: 17.4.2 + giget: 2.0.0 + jiti: 2.7.0 + vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@netlify/runtime' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - chokidar + - drizzle-orm + - idb-keyval + - ioredis + - lru-cache + - miniflare + - mongodb + - mysql2 + - sqlite3 + - uploadthing + - wrangler + + nitro@3.0.0(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@4.0.3)(ioredis@5.9.2)(lru-cache@11.5.1)(mysql2@3.15.3)(rolldown@1.2.4)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): + dependencies: + consola: 3.4.2 + cookie-es: 2.0.0 + crossws: 0.4.5(srvx@0.8.16) + db0: 0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3) + esbuild: 0.25.10 + fetchdts: 0.1.7 + h3: 2.0.1-rc.2(crossws@0.4.5(srvx@0.11.12)) + jiti: 2.7.0 + nf3: 0.1.12 + ofetch: 1.5.1 + ohash: 2.0.11 + rendu: 0.0.6 + rollup: 4.56.0 + srvx: 0.8.16 + undici: 7.27.2 + unenv: 2.0.0-rc.21 + unstorage: 2.0.0-alpha.3(@netlify/blobs@10.1.0)(chokidar@4.0.3)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.9.2)(lru-cache@11.5.1)(ofetch@1.5.1) + optionalDependencies: + rolldown: 1.2.4 + vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - chokidar + - drizzle-orm + - idb-keyval + - ioredis + - lru-cache + - mongodb + - mysql2 + - sqlite3 + - uploadthing + + nitro@3.0.1-alpha.2(@electric-sql/pglite@0.3.2)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(chokidar@5.0.0)(ioredis@5.9.2)(lru-cache@11.5.1)(mysql2@3.15.3)(rolldown@1.2.4)(rollup@4.56.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)): dependencies: consola: 3.4.2 crossws: 0.4.3(srvx@0.10.1) @@ -39430,7 +40203,7 @@ snapshots: unenv: 2.0.0-rc.24 unstorage: 2.0.0-alpha.5(@netlify/blobs@10.1.0)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.9.2)(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3) optionalDependencies: - rolldown: 1.0.2 + rolldown: 1.2.4 rollup: 4.56.0 vite: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) transitivePeerDependencies: @@ -39517,7 +40290,7 @@ snapshots: - sqlite3 - uploadthing - nitropack@2.13.1(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(mysql2@3.15.3)(rolldown@1.0.2): + nitropack@2.13.1(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(@netlify/blobs@10.1.0)(mysql2@3.15.3)(rolldown@1.2.4): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.56.0) @@ -39570,7 +40343,7 @@ snapshots: pretty-bytes: 7.1.0 radix3: 1.1.2 rollup: 4.56.0 - rollup-plugin-visualizer: 6.0.5(rolldown@1.0.2)(rollup@4.56.0) + rollup-plugin-visualizer: 6.0.5(rolldown@1.2.4)(rollup@4.56.0) scule: 1.3.0 semver: 7.7.3 serve-placeholder: 2.0.2 @@ -39699,7 +40472,7 @@ snapshots: nwsapi@2.2.16: {} - nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23))(debug@4.4.3): + nx@22.7.5(@swc-node/register@1.11.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@swc/core@1.15.33(@swc/helpers@0.5.23))(@swc/types@0.1.26)(@typescript/typescript6@6.0.2))(@swc/core@1.15.33(@swc/helpers@0.5.23)): dependencies: '@emnapi/core': 1.4.5 '@emnapi/runtime': 1.4.5 @@ -39714,7 +40487,7 @@ snapshots: ansi-styles: 4.3.0 argparse: 2.0.1 asynckit: 0.4.0 - axios: 1.16.0(debug@4.4.3) + axios: 1.16.0 balanced-match: 4.0.3 base64-js: 1.5.1 bl: 4.1.0 @@ -39865,6 +40638,10 @@ snapshots: dependencies: ohash: 2.0.11 + ocache@0.2.0: + dependencies: + ohash: 2.0.11 + ofetch@1.5.1: dependencies: destr: 2.0.5 @@ -40805,6 +41582,11 @@ snapshots: lodash: 4.17.21 strip-ansi: 6.0.1 + rendu@0.0.6: + dependencies: + cookie-es: 2.0.0 + srvx: 0.8.16 + repeat-string@1.6.1: {} require-directory@2.1.1: {} @@ -40916,14 +41698,34 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.2 '@rolldown/binding-win32-x64-msvc': 1.0.2 - rollup-plugin-visualizer@6.0.5(rolldown@1.0.2)(rollup@4.56.0): + rolldown@1.2.4: + dependencies: + '@oxc-project/types': 0.144.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.2.4 + '@rolldown/binding-darwin-arm64': 1.2.4 + '@rolldown/binding-darwin-x64': 1.2.4 + '@rolldown/binding-freebsd-x64': 1.2.4 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.4 + '@rolldown/binding-linux-arm64-gnu': 1.2.4 + '@rolldown/binding-linux-arm64-musl': 1.2.4 + '@rolldown/binding-linux-ppc64-gnu': 1.2.4 + '@rolldown/binding-linux-s390x-gnu': 1.2.4 + '@rolldown/binding-linux-x64-gnu': 1.2.4 + '@rolldown/binding-linux-x64-musl': 1.2.4 + '@rolldown/binding-openharmony-arm64': 1.2.4 + '@rolldown/binding-win32-arm64-msvc': 1.2.4 + '@rolldown/binding-win32-x64-msvc': 1.2.4 + + rollup-plugin-visualizer@6.0.5(rolldown@1.2.4)(rollup@4.56.0): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rolldown: 1.0.2 + rolldown: 1.2.4 rollup: 4.56.0 rollup@4.56.0: @@ -40961,6 +41763,8 @@ snapshots: rou3@0.8.1: {} + rou3@0.9.2: {} + router@2.2.0: dependencies: debug: 4.4.3 @@ -41439,6 +42243,10 @@ snapshots: srvx@0.11.22: {} + srvx@0.12.5: {} + + srvx@0.8.16: {} + stable-hash-x@0.2.0: {} stack-trace@0.0.10: {} @@ -41604,8 +42412,6 @@ snapshots: tapable@2.2.1: {} - tapable@2.3.0: {} - tapable@2.3.3: {} tar-stream@2.2.0: @@ -41961,6 +42767,8 @@ snapshots: ufo@1.6.3: {} + ufo@1.6.4: {} + uint8array-extras@1.5.0: {} ulid@3.0.1: {} @@ -41986,6 +42794,14 @@ snapshots: undici@7.27.2: {} + unenv@2.0.0-rc.21: + dependencies: + defu: 6.1.4 + exsolve: 1.0.8 + ohash: 2.0.11 + pathe: 2.0.3 + ufo: 1.6.3 + unenv@2.0.0-rc.24: dependencies: pathe: 2.0.3 @@ -42087,6 +42903,15 @@ snapshots: db0: 0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3) ioredis: 5.9.2 + unstorage@2.0.0-alpha.3(@netlify/blobs@10.1.0)(chokidar@4.0.3)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.9.2)(lru-cache@11.5.1)(ofetch@1.5.1): + optionalDependencies: + '@netlify/blobs': 10.1.0 + chokidar: 4.0.3 + db0: 0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3) + ioredis: 5.9.2 + lru-cache: 11.5.1 + ofetch: 1.5.1 + unstorage@2.0.0-alpha.5(@netlify/blobs@10.1.0)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.9.2)(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3): optionalDependencies: '@netlify/blobs': 10.1.0 @@ -42104,6 +42929,14 @@ snapshots: lru-cache: 11.5.1 ofetch: 2.0.0-alpha.3 + unstorage@2.0.0-alpha.7(@netlify/blobs@10.1.0)(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(lru-cache@11.5.1)(ofetch@2.0.0-alpha.3): + optionalDependencies: + '@netlify/blobs': 10.1.0 + chokidar: 5.0.0 + db0: 0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3) + lru-cache: 11.5.1 + ofetch: 2.0.0-alpha.3 + untun@0.1.3: dependencies: citty: 0.1.6 @@ -42114,7 +42947,7 @@ snapshots: dependencies: citty: 0.1.6 defu: 6.1.4 - jiti: 2.6.1 + jiti: 2.7.0 knitwork: 1.3.0 scule: 1.3.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index aca73336f9c..ac6efc39882 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -143,3 +143,4 @@ allowBuilds: # protobufjs protobufjs: false # transitive dep + bun: set this to true or false