From ba1857502e66172bd043802fc564ed3a8b258e40 Mon Sep 17 00:00:00 2001 From: Alexey Orlenko's AI Agent Date: Fri, 17 Jul 2026 14:40:51 +0200 Subject: [PATCH 1/2] feat(node): support TanStack Start applications Signed-off-by: Alexey Orlenko's AI Agent --- .gitignore | 3 + README.md | 3 +- biome.jsonc | 1 + docs/guides/building-an-app.md | 21 + docs/guides/getting-started.md | 17 + examples/tanstack-start/module.ts | 6 + examples/tanstack-start/package.json | 32 + .../tanstack-start/prisma-composer.config.ts | 8 + examples/tanstack-start/public/composer.txt | 1 + examples/tanstack-start/src/routeTree.gen.ts | 68 + examples/tanstack-start/src/router.tsx | 12 + examples/tanstack-start/src/routes/__root.tsx | 28 + examples/tanstack-start/src/routes/index.tsx | 13 + examples/tanstack-start/src/service.ts | 14 + .../tests/tanstack-start.test.ts | 85 ++ examples/tanstack-start/tsconfig.json | 9 + examples/tanstack-start/vite.config.ts | 8 + pnpm-lock.yaml | 1344 ++++++++++++++++- skills/prisma-composer/SKILL.md | 16 + turbo.json | 2 +- 20 files changed, 1627 insertions(+), 64 deletions(-) create mode 100644 examples/tanstack-start/module.ts create mode 100644 examples/tanstack-start/package.json create mode 100644 examples/tanstack-start/prisma-composer.config.ts create mode 100644 examples/tanstack-start/public/composer.txt create mode 100644 examples/tanstack-start/src/routeTree.gen.ts create mode 100644 examples/tanstack-start/src/router.tsx create mode 100644 examples/tanstack-start/src/routes/__root.tsx create mode 100644 examples/tanstack-start/src/routes/index.tsx create mode 100644 examples/tanstack-start/src/service.ts create mode 100644 examples/tanstack-start/tests/tanstack-start.test.ts create mode 100644 examples/tanstack-start/tsconfig.json create mode 100644 examples/tanstack-start/vite.config.ts diff --git a/.gitignore b/.gitignore index 47777b4d..82cea88b 100644 --- a/.gitignore +++ b/.gitignore @@ -62,6 +62,9 @@ skills-lock.json .next/ next-env.d.ts +# TanStack Start / Nitro build output +.output/ + # Deploy working dir — assembled artifacts staged per graph address (ADR-0005) .prisma-composer/ wip/ diff --git a/README.md b/README.md index 21277e23..0f761ffb 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ have. | Guide | Covers | | --- | --- | -| [Getting started](docs/guides/getting-started.md) | Your first app end to end; porting an existing Node or Next.js app | +| [Getting started](docs/guides/getting-started.md) | Your first app end to end; porting an existing Node, TanStack Start, or Next.js app | | [Building an app](docs/guides/building-an-app.md) | Contracts, databases (plain + Prisma Next-typed with migrations), reusable Modules, cron/storage/streams, config, secrets | | [Testing](docs/guides/testing.md) | Unit tests with `mockService`, integration tests with `bootstrapService` | | [Deploying and operating](docs/guides/deploying.md) | Stages, destroy, CI, how apps behave in production | @@ -142,6 +142,7 @@ Complete, deployable apps under [`examples/`](examples/): | Example | Demonstrates | | --- | --- | | [pn-widgets](examples/pn-widgets/) | The minimal app: one service + one Prisma Next-typed Postgres | +| [tanstack-start](examples/tanstack-start/) | TanStack Start SSR and static assets from Nitro's multi-file output | | [storefront-auth](examples/storefront-auth/) | Next.js frontend + API service, a reusable Module owning its database, secrets | | [store](examples/store/) | Four modules, typed databases with migrations, the shared cron module | | [cron](examples/cron/) | Scheduled jobs: `defineSchedule` + `serveSchedule` + the cron module | diff --git a/biome.jsonc b/biome.jsonc index 3f27b1e2..a07ec08e 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -20,6 +20,7 @@ "!**/.prisma", "!**/.alchemy", "!**/*.d.ts", + "!**/routeTree.gen.ts", "!**/fixtures/**/emitted", "!**/examples/**/migrations", "!examples/pn-widgets/contract.json", diff --git a/docs/guides/building-an-app.md b/docs/guides/building-an-app.md index 2b287b2e..cd5dfa05 100644 --- a/docs/guides/building-an-app.md +++ b/docs/guides/building-an-app.md @@ -455,6 +455,27 @@ ships. Two things to know: Without `dir` you get the single-file form above, unchanged. +**TanStack Start — a Nitro directory build.** TanStack Start's Nitro +`node-server` build is the directory form: `.output/server/index.mjs` imports +sibling server chunks and serves the client and public assets in the same +`.output` tree. Name both paths explicitly: + +```ts +build: node({ + module: import.meta.url, + dir: '../.output', + entry: 'server/index.mjs', +}) +``` + +Run `vite build` before deploy and register `nodeBuild()` in +`prisma-composer.config.ts`. Do not use the single-file form for the server +entry: copying only `server/index.mjs` leaves its imported siblings and public +assets behind. Composer does not rebuild or interpret Nitro output; it copies +the named `.output` tree verbatim and boots the named entry. The complete, +tested shape is in +[`examples/tanstack-start`](../../examples/tanstack-start/). + **`nextjs` — a Next.js app.** `next build` with `output: 'standalone'` is the whole build; the adapter just needs to know where the app lives: diff --git a/docs/guides/getting-started.md b/docs/guides/getting-started.md index 0057f096..81f66e11 100644 --- a/docs/guides/getting-started.md +++ b/docs/guides/getting-started.md @@ -350,6 +350,23 @@ your built server file, then make three changes to the server itself: Your build must produce a self-contained entry file — keep your own build if it already does. +**A TanStack Start app.** Keep its Nitro `node-server` build and use the +`node` adapter's directory form. Point `dir` at `.output` and `entry` at +`server/index.mjs` inside it: + +```ts +build: node({ + module: import.meta.url, + dir: '../.output', + entry: 'server/index.mjs', +}) +``` + +Composer copies the complete Nitro output, including server chunks, the +client bundle, and `public/`, then boots the entry you named. Run `vite build` +before deploy and include `nodeBuild()` in the deploy config. See the complete +[`examples/tanstack-start`](../../examples/tanstack-start/) app. + **A Next.js app.** Use the `nextjs` build adapter instead of `node`; `next build` with `output: 'standalone'` is the whole build: diff --git a/examples/tanstack-start/module.ts b/examples/tanstack-start/module.ts new file mode 100644 index 00000000..5be86741 --- /dev/null +++ b/examples/tanstack-start/module.ts @@ -0,0 +1,6 @@ +import { module } from '@prisma/composer'; +import webService from './src/service.ts'; + +export default module('tanstack-start-example', ({ provision }) => { + provision(webService); +}); diff --git a/examples/tanstack-start/package.json b/examples/tanstack-start/package.json new file mode 100644 index 00000000..bcd7d6f4 --- /dev/null +++ b/examples/tanstack-start/package.json @@ -0,0 +1,32 @@ +{ + "name": "@prisma/example-tanstack-start", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite --port 3000", + "typecheck": "tsc --noEmit", + "test": "bun test tests", + "deploy": "pnpm turbo run build --filter @prisma/example-tanstack-start... && ( set -a; . \"${PRISMA_DEPLOY_ENV:-../../.env}\"; set +a; bun node_modules/.bin/prisma-composer deploy module.ts ${TANSTACK_START_STACK_NAME:+--name \"$TANSTACK_START_STACK_NAME\"} ${TANSTACK_START_STAGE:+--stage \"$TANSTACK_START_STAGE\"} )", + "destroy": "( set -a; . \"${PRISMA_DEPLOY_ENV:-../../.env}\"; set +a; bun node_modules/.bin/prisma-composer destroy module.ts --production ${TANSTACK_START_STACK_NAME:+--name \"$TANSTACK_START_STACK_NAME\"} )", + "destroy:stage": "( set -a; . \"${PRISMA_DEPLOY_ENV:-../../.env}\"; set +a; bun node_modules/.bin/prisma-composer destroy module.ts --stage \"${TANSTACK_START_STAGE:?TANSTACK_START_STAGE is required}\" ${TANSTACK_START_STACK_NAME:+--name \"$TANSTACK_START_STACK_NAME\"} )" + }, + "dependencies": { + "@prisma/composer": "workspace:0.1.0", + "@prisma/composer-prisma-cloud": "workspace:0.1.0", + "@tanstack/react-router": "1.170.18", + "@tanstack/react-start": "1.168.28", + "nitro": "npm:nitro-nightly@3.0.1-20260717-080150-bfc2f5ef", + "react": "19.2.7", + "react-dom": "19.2.7" + }, + "devDependencies": { + "@types/bun": "^1.3.13", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "6.0.3", + "typescript": "^6.0.3", + "vite": "8.1.2" + } +} diff --git a/examples/tanstack-start/prisma-composer.config.ts b/examples/tanstack-start/prisma-composer.config.ts new file mode 100644 index 00000000..7308db8e --- /dev/null +++ b/examples/tanstack-start/prisma-composer.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from '@prisma/composer/config'; +import { nodeBuild } from '@prisma/composer/node/control'; +import { prismaCloud, prismaState } from '@prisma/composer-prisma-cloud/control'; + +export default defineConfig({ + extensions: [prismaCloud(), nodeBuild()], + state: () => prismaState(), +}); diff --git a/examples/tanstack-start/public/composer.txt b/examples/tanstack-start/public/composer.txt new file mode 100644 index 00000000..2f1838f5 --- /dev/null +++ b/examples/tanstack-start/public/composer.txt @@ -0,0 +1 @@ +tanstack-start-composer-public-asset diff --git a/examples/tanstack-start/src/routeTree.gen.ts b/examples/tanstack-start/src/routeTree.gen.ts new file mode 100644 index 00000000..dceedffd --- /dev/null +++ b/examples/tanstack-start/src/routeTree.gen.ts @@ -0,0 +1,68 @@ +/* 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' + +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' + fileRoutesByTo: FileRoutesByTo + to: '/' + id: '__root__' | '/' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +import type { getRouter } from './router.tsx' +import type { createStart } from '@tanstack/react-start' +declare module '@tanstack/react-start' { + interface Register { + ssr: true + router: Awaited> + } +} diff --git a/examples/tanstack-start/src/router.tsx b/examples/tanstack-start/src/router.tsx new file mode 100644 index 00000000..490d8011 --- /dev/null +++ b/examples/tanstack-start/src/router.tsx @@ -0,0 +1,12 @@ +import { createRouter } from '@tanstack/react-router'; +import { routeTree } from './routeTree.gen.ts'; + +export function getRouter() { + return createRouter({ routeTree }); +} + +declare module '@tanstack/react-router' { + interface Register { + router: ReturnType; + } +} diff --git a/examples/tanstack-start/src/routes/__root.tsx b/examples/tanstack-start/src/routes/__root.tsx new file mode 100644 index 00000000..76ac3f18 --- /dev/null +++ b/examples/tanstack-start/src/routes/__root.tsx @@ -0,0 +1,28 @@ +import { createRootRoute, HeadContent, Outlet, Scripts } from '@tanstack/react-router'; +import type { ReactNode } from 'react'; + +export const Route = createRootRoute({ + head: () => ({ + meta: [ + { charSet: 'utf-8' }, + { name: 'viewport', content: 'width=device-width, initial-scale=1' }, + { title: 'TanStack Start on Prisma Composer' }, + ], + }), + component: Outlet, + shellComponent: RootDocument, +}); + +function RootDocument({ children }: { children: ReactNode }) { + return ( + + + + + + {children} + + + + ); +} diff --git a/examples/tanstack-start/src/routes/index.tsx b/examples/tanstack-start/src/routes/index.tsx new file mode 100644 index 00000000..ce122dfc --- /dev/null +++ b/examples/tanstack-start/src/routes/index.tsx @@ -0,0 +1,13 @@ +import { createFileRoute } from '@tanstack/react-router'; + +export const Route = createFileRoute('/')({ component: Home }); + +function Home() { + return ( +
+

TanStack Start on Prisma Composer

+

Rendered by the Nitro server from Composer's directory build adapter.

+ Public asset +
+ ); +} diff --git a/examples/tanstack-start/src/service.ts b/examples/tanstack-start/src/service.ts new file mode 100644 index 00000000..b29d3f4a --- /dev/null +++ b/examples/tanstack-start/src/service.ts @@ -0,0 +1,14 @@ +import node from '@prisma/composer/node'; +import { compute } from '@prisma/composer-prisma-cloud'; + +export default compute({ + name: 'web', + deps: {}, + // Nitro's server imports sibling chunks and serves assets from this tree. + // The directory form preserves the runnable exactly as `vite build` emitted it. + build: node({ + module: import.meta.url, + dir: '../.output', + entry: 'server/index.mjs', + }), +}); diff --git a/examples/tanstack-start/tests/tanstack-start.test.ts b/examples/tanstack-start/tests/tanstack-start.test.ts new file mode 100644 index 00000000..0f41c40d --- /dev/null +++ b/examples/tanstack-start/tests/tanstack-start.test.ts @@ -0,0 +1,85 @@ +import { afterEach, describe, expect, test } from 'bun:test'; +import * as fs from 'node:fs'; +import * as net from 'node:net'; +import * as os from 'node:os'; +import * as path from 'node:path'; +import { assemble } from '@prisma/composer/node/control'; +import webService from '../src/service.ts'; + +const tmpDirs: string[] = []; +const processes: ReturnType[] = []; + +afterEach(async () => { + for (const process of processes.splice(0)) { + process.kill(); + await process.exited; + } + for (const dir of tmpDirs.splice(0)) fs.rmSync(dir, { recursive: true, force: true }); +}); + +async function freePort(): Promise { + const server = net.createServer(); + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(0, '127.0.0.1', resolve); + }); + const address = server.address(); + await new Promise((resolve, reject) => + server.close((error) => (error ? reject(error) : resolve())), + ); + if (address === null || typeof address === 'string') + throw new Error('failed to reserve a TCP port'); + return address.port; +} + +async function fetchWhenReady(url: string): Promise { + const deadline = Date.now() + 10_000; + while (Date.now() < deadline) { + try { + const response = await fetch(url); + if (response.ok) return response; + } catch { + // Nitro has not started listening yet. + } + await Bun.sleep(50); + } + throw new Error(`Nitro did not serve ${url} within 10 seconds`); +} + +describe('TanStack Start directory build', () => { + test('assembles the complete Nitro output and selects its server entry', async () => { + const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'composer-tanstack-start-')); + tmpDirs.push(cwd); + + const artifact = await assemble({ build: webService.build, address: 'web', cwd }); + + expect(artifact.entry).toBe('bundle/server/index.mjs'); + expect(fs.existsSync(path.join(artifact.dir, 'main.mjs'))).toBe(true); + expect(fs.existsSync(path.join(artifact.dir, 'bundle', 'nitro.json'))).toBe(true); + expect( + fs.readFileSync(path.join(artifact.dir, 'bundle', 'public', 'composer.txt'), 'utf8'), + ).toBe('tanstack-start-composer-public-asset\n'); + }, 20_000); + + test('the built Nitro server renders SSR and serves its public tree', async () => { + const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'composer-tanstack-start-')); + tmpDirs.push(cwd); + const artifact = await assemble({ build: webService.build, address: 'web', cwd }); + + const port = await freePort(); + const child = Bun.spawn([process.execPath, path.join(artifact.dir, artifact.entry)], { + cwd: artifact.dir, + env: { ...process.env, HOST: '127.0.0.1', PORT: String(port) }, + stdout: 'ignore', + stderr: 'inherit', + }); + processes.push(child); + + const origin = `http://127.0.0.1:${port}`; + const html = await (await fetchWhenReady(origin)).text(); + expect(html).toContain('TanStack Start on Prisma Composer'); + + const asset = await (await fetchWhenReady(`${origin}/composer.txt`)).text(); + expect(asset).toBe('tanstack-start-composer-public-asset\n'); + }, 20_000); +}); diff --git a/examples/tanstack-start/tsconfig.json b/examples/tanstack-start/tsconfig.json new file mode 100644 index 00000000..22eef97e --- /dev/null +++ b/examples/tanstack-start/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "jsx": "react-jsx", + "types": ["bun", "vite/client"] + }, + "include": ["module.ts", "prisma-composer.config.ts", "vite.config.ts", "src", "tests"] +} diff --git a/examples/tanstack-start/vite.config.ts b/examples/tanstack-start/vite.config.ts new file mode 100644 index 00000000..90da6a71 --- /dev/null +++ b/examples/tanstack-start/vite.config.ts @@ -0,0 +1,8 @@ +import { tanstackStart } from '@tanstack/react-start/plugin/vite'; +import react from '@vitejs/plugin-react'; +import { nitro } from 'nitro/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [nitro(), tanstackStart(), react()], +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa51fbe5..aa03be4b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,7 +52,7 @@ importers: version: link:../../packages/9-public/composer-prisma-cloud alchemy: specifier: 2.0.0-beta.59 - version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) + version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -124,7 +124,7 @@ importers: version: link:../../packages/9-public/composer-prisma-cloud alchemy: specifier: 2.0.0-beta.59 - version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) + version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) effect: specifier: 4.0.0-beta.93 version: 4.0.0-beta.93 @@ -161,7 +161,7 @@ importers: version: link:modules/storefront alchemy: specifier: 2.0.0-beta.59 - version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) + version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -295,7 +295,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) examples/storefront-auth: dependencies: @@ -316,7 +316,7 @@ importers: version: link:modules/storefront alchemy: specifier: 2.0.0-beta.59 - version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) + version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -391,7 +391,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) examples/streams: dependencies: @@ -409,6 +409,49 @@ importers: specifier: ^6.0.3 version: 6.0.3 + examples/tanstack-start: + dependencies: + '@prisma/composer': + specifier: workspace:0.1.0 + version: link:../../packages/9-public/composer + '@prisma/composer-prisma-cloud': + specifier: workspace:0.1.0 + version: link:../../packages/9-public/composer-prisma-cloud + '@tanstack/react-router': + specifier: 1.170.18 + version: 1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-start': + specifier: 1.168.28 + version: 1.168.28(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + nitro: + specifier: npm:nitro-nightly@3.0.1-20260717-080150-bfc2f5ef + version: nitro-nightly@3.0.1-20260717-080150-bfc2f5ef(@libsql/client@0.17.4)(aws4fetch@1.0.20)(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.0)(ioredis@5.11.1)(jiti@2.7.0)(mysql2@3.22.5(@types/node@26.1.1))(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + react: + specifier: 19.2.7 + version: 19.2.7 + react-dom: + specifier: 19.2.7 + version: 19.2.7(react@19.2.7) + devDependencies: + '@types/bun': + specifier: ^1.3.13 + version: 1.3.14 + '@types/react': + specifier: ^19.2.17 + version: 19.2.17 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.17) + '@vitejs/plugin-react': + specifier: 6.0.3 + version: 6.0.3(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + typescript: + specifier: ^6.0.3 + version: 6.0.3 + vite: + specifier: 8.1.2 + version: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) + packages/0-framework/0-foundation/foundation: devDependencies: '@internal/tsdown-config': @@ -440,7 +483,7 @@ importers: version: 1.1.0 alchemy: specifier: 2.0.0-beta.59 - version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) + version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) effect: specifier: 4.0.0-beta.93 version: 4.0.0-beta.93 @@ -459,7 +502,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) packages/0-framework/2-authoring/nextjs: dependencies: @@ -540,7 +583,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) packages/0-framework/3-tooling/assemble: dependencies: @@ -614,7 +657,7 @@ importers: version: 1.47.0 alchemy: specifier: 2.0.0-beta.59 - version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@25.9.5)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) + version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@25.9.5)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) effect: specifier: 4.0.0-beta.93 version: 4.0.0-beta.93 @@ -678,7 +721,7 @@ importers: version: 1.1.0 alchemy: specifier: 2.0.0-beta.59 - version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) + version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -712,7 +755,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) packages/1-prisma-cloud/2-shared-modules/cron: dependencies: @@ -749,7 +792,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) packages/1-prisma-cloud/2-shared-modules/storage: dependencies: @@ -783,7 +826,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) packages/1-prisma-cloud/2-shared-modules/streams: dependencies: @@ -808,7 +851,7 @@ importers: devDependencies: '@durable-streams/server-conformance-tests': specifier: ^0.3.5 - version: 0.3.5(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + version: 0.3.5(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) '@internal/tsdown-config': specifier: workspace:0.1.0 version: link:../../../0-framework/0-foundation/tsdown-config @@ -823,7 +866,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) packages/9-public/composer: dependencies: @@ -835,7 +878,7 @@ importers: version: 1.1.0 alchemy: specifier: 2.0.0-beta.59 - version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@25.9.5)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) + version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@25.9.5)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -923,7 +966,7 @@ importers: version: 1.1.0 alchemy: specifier: 2.0.0-beta.59 - version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@25.9.5)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) + version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@25.9.5)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) arktype: specifier: ^2.2.3 version: 2.2.3 @@ -1011,7 +1054,7 @@ importers: version: link:../packages/9-public/composer-prisma-cloud alchemy: specifier: 2.0.0-beta.59 - version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) + version: 2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1) devDependencies: '@prisma/management-api-sdk': specifier: ^1.47.0 @@ -1202,6 +1245,77 @@ packages: resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==} engines: {node: '>=18.0.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + '@biomejs/biome@2.5.3': resolution: {integrity: sha512-MrJswFdei9EfDwwUy2tQrPDpK0AO+RmMFvBoaaJ6ayBc3sUbHdCE+XG5N8vp+5So41ZupZJQm0roHFFhMGVD7A==} engines: {node: '>=14.21.3'} @@ -1725,9 +1839,22 @@ packages: '@ioredis/commands@1.10.0': resolution: {integrity: sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@libsql/client@0.17.4': resolution: {integrity: sha512-lYayFWasDV78A+TjlEhr6ubb3odBV6OHjb+wdp8VQcyWWAEIjuwbCHaraEUS4m4yWoo0BvZo96It4VdzZRmRWw==} @@ -1960,6 +2087,22 @@ packages: resolution: {integrity: sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==} engines: {node: '>= 20'} + '@oozcitak/dom@2.0.2': + resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==} + engines: {node: '>=20.0'} + + '@oozcitak/infra@2.0.2': + resolution: {integrity: sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==} + engines: {node: '>=20.0'} + + '@oozcitak/url@3.0.0': + resolution: {integrity: sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==} + engines: {node: '>=20.0'} + + '@oozcitak/util@10.0.0': + resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} + engines: {node: '>=20.0'} + '@oxc-project/types@0.130.0': resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} @@ -2559,6 +2702,139 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@tanstack/history@1.162.0': + resolution: {integrity: sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==} + engines: {node: '>=20.19'} + + '@tanstack/react-router@1.170.18': + resolution: {integrity: sha512-wpbGYZEp/fmz1q4bn7BD8VZ+/VZ7GBqSJv5V969pU+chP8y7dquWDmKTFMohvUegb9lg12m1uPVvD6kB2wORvQ==} + engines: {node: '>=20.19'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-client@1.168.16': + resolution: {integrity: sha512-1OfHgy0wpHwe2tlB3FxMeA+IMX6Il/QAMf+8UdXuimReIc2Lz3BkMLBL38k4GIxBguX9sI8EMLO5jlTZ4e1olw==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-rsc@0.1.27': + resolution: {integrity: sha512-4Gt8+XHRhcYJjfw1rTlkW5ZxRWcp6AmvPoBf1p7ysOSVlnfVitQBqgAAFNGy+d745vWfoz1/JWqyFBP8IVVYYg==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@rspack/core': '>=2.0.0-0' + '@vitejs/plugin-rsc': '>=0.5.20' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + react-server-dom-rspack: '>=0.0.2' + peerDependenciesMeta: + '@rspack/core': + optional: true + '@vitejs/plugin-rsc': + optional: true + react-server-dom-rspack: + optional: true + + '@tanstack/react-start-server@1.167.22': + resolution: {integrity: sha512-eH2PeHuLfL3R5YzE9+y2FfcE4Ld1LNV2ZfrCNVPJMMJFt+9nXDaRHg9BsEmc+JkTAGzz3FKLyQEoWwpbG6Ehqg==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start@1.168.28': + resolution: {integrity: sha512-UyJ/OYBw7x8MQclyXKlbg72qzSTK6Do4AugHcx0LoagHNg6tQgvF0l2HZqll2CrxKAlv2Ar8+0gEkHnFYxxI5Q==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@rsbuild/core': ^2.0.0 + '@vitejs/plugin-rsc': '*' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: '>=7.0.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@vitejs/plugin-rsc': + optional: true + vite: + optional: true + + '@tanstack/react-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/router-core@1.171.15': + resolution: {integrity: sha512-IILCDcLaItMZQ2jEmCABHY1Nhjjn5XUvwpQp3e4Nmu+vfg0BgYFuu/QASz2SwE2ZNbVMrvt8X/wxa+Gg5aErxA==} + engines: {node: '>=20.19'} + + '@tanstack/router-generator@1.167.19': + resolution: {integrity: sha512-db3AQGLinf8ZQ8AKMyxLVWwHIFZxtx+zLktvPXv/nFH/B793/Z7lKLl4dUWM3JpAluynDSVVKaTWQVTAgTYmVA==} + engines: {node: '>=20.19'} + + '@tanstack/router-plugin@1.168.20': + resolution: {integrity: sha512-G5S63xDr2AxADtWP+0tQtJsduijT/Mk85hDh3Od4ct8UV0PHr2f/H1CGl72lYWLgcWRMn6bKJoQhz27QFIgLRQ==} + engines: {node: '>=20.19'} + peerDependencies: + '@rsbuild/core': '>=1.0.2 || ^2.0.0' + '@tanstack/react-router': ^1.170.18 + 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' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + + '@tanstack/router-utils@1.162.2': + resolution: {integrity: sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ==} + engines: {node: '>=20.19'} + + '@tanstack/start-client-core@1.170.14': + resolution: {integrity: sha512-yasBgEIFSWysL4EiFIGwp638nCoXXKiTqkc48EP2oty4OyNsZPTC1yfJ82zjq2KGkTAYtIaeMl7otqqRl1n85Q==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-fn-stubs@1.162.0': + resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-plugin-core@1.171.20': + resolution: {integrity: sha512-s2n82ykGXGkDSoJwGZP85vC9Dv5vAN6fya5TCSm/cvUn+r/g30iDR1x+Ptizas3fIvcracSOOvRnma4RJ8Orww==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@rsbuild/core': ^2.0.0 + vite: '>=7.0.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + vite: + optional: true + + '@tanstack/start-server-core@1.169.17': + resolution: {integrity: sha512-u0N+PHJhMHnzfnlXYI9F+A/qweDe3E2X0mfkORPGIEkNQgvS548RA9fjwvixR2en5b848CfpEqUzwFhm/tQ40Q==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-storage-context@1.167.17': + resolution: {integrity: sha512-ntkDyGx0PE0opIlWNAMpkMb8qkjR4uyCUOfC0CiT0STM25+EcwPuwYNfDXXeVObMrTAPgsQ4yOj3xdY0Xr4ptw==} + engines: {node: '>=22.12.0'} + + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + + '@tanstack/virtual-file-routes@1.162.0': + resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==} + engines: {node: '>=20.19'} + '@turbo/darwin-64@2.10.4': resolution: {integrity: sha512-m1MUEI4MJ69r5CwfMYxmHi0H0rrgiYCBOp0tgBZ9x/YVvOb5uu/lRIDyDwdtH054R2yWeQaIigUGu6aCX9f8cA==} cpu: [x64] @@ -2652,6 +2928,19 @@ packages: resolution: {integrity: sha512-VYNCgUc0nOmC4WJmWw9GkrKdfr8Zl4/rxhC5SvgacBgxiW9W/9NRttUoHHXV8xdII3MaRgkZZVX8Ikzc/Jmjag==} engines: {node: '>=14'} + '@vitejs/plugin-react@6.0.3': + resolution: {integrity: sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + '@vitest/expect@4.1.10': resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} @@ -2893,6 +3182,9 @@ packages: aws4fetch@1.0.20: resolution: {integrity: sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==} + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + baseline-browser-mapping@2.10.43: resolution: {integrity: sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==} engines: {node: '>=6.0.0'} @@ -2911,6 +3203,11 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + browserslist@4.28.6: + resolution: {integrity: sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bun-types@1.3.14: resolution: {integrity: sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ==} @@ -2929,6 +3226,9 @@ packages: caniuse-lite@1.0.30001800: resolution: {integrity: sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==} + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + capnweb@0.6.1: resolution: {integrity: sha512-fmhV26QPd1ewf5R74h55oVZnGwIcSaRMzbfLQUy8+zOBjuTmT3KXoT8wxHvnp1m9Ht9BoUUS5ZwNLoVLfQTyBg==} @@ -3021,6 +3321,10 @@ packages: confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + content-type@2.0.0: resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} engines: {node: '>=18'} @@ -3032,12 +3336,46 @@ packages: resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + crossws@0.4.10: + resolution: {integrity: sha512-pz3oubH/dt12KjqsUB0IuXW4nwRDQ583iDsP4555Cpdqx0NoU7pGlWBcayyFI8f/l/idRpgjMEfwuOxSWJYlIA==} + peerDependencies: + srvx: '>=0.11.5' + peerDependenciesMeta: + srvx: + optional: true + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + db0@0.3.4: + resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==} + peerDependencies: + '@electric-sql/pglite': '*' + '@libsql/client': '*' + better-sqlite3: '*' + drizzle-orm: '*' + mysql2: '*' + sqlite3: '*' + peerDependenciesMeta: + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + better-sqlite3: + optional: true + drizzle-orm: + optional: true + mysql2: + optional: true + sqlite3: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -3077,6 +3415,10 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + dotenv@17.4.2: resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} @@ -3093,6 +3435,9 @@ packages: effect@4.0.0-beta.93: resolution: {integrity: sha512-wNS5MKFa3C42uBfIDik2oJ78lhpoYz2hN4oBR0229BeeDCIrkg/FiOvoiPGdCVlWa7MEKxEL5I0f8AILVHSD9A==} + electron-to-chromium@1.5.393: + resolution: {integrity: sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==} + emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -3115,6 +3460,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 + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -3134,6 +3497,10 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} @@ -3193,6 +3560,9 @@ packages: picomatch: optional: true + fetchdts@0.1.7: + resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3211,6 +3581,10 @@ packages: generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-east-asian-width@1.6.0: resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} @@ -3234,6 +3608,35 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + 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@2.0.1-rc.20: + resolution: {integrity: sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + + h3@2.0.1-rc.25: + resolution: {integrity: sha512-uIK++Up28xDt4n0+bSWfVssRivNXpUmMmA6CCiK6j9+utLcBMcFK97Gn9PlSZwAPW9oLy3CjGJ4ag40CY9YYtQ==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.9 + peerDependenciesMeta: + crossws: + optional: true + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3254,6 +3657,9 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + httpxy@0.5.5: + resolution: {integrity: sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -3352,13 +3758,33 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isbot@5.2.1: + resolution: {integrity: sha512-dJ+LpKyClQZ7NG+j3OensC/mAZkGpukE9YUrgPYvAZj2doVL0edfDgywTUh5CXa0o+nW9a1V9e5+CJTX8+SxRw==} + engines: {node: '>=18'} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + js-base64@3.8.0: resolution: {integrity: sha512-65kvbemyZhj+ExQt1PEFyBEjL5vAHysu1lJdW1AwhhChkO8ZBPizYk/m9GVrpbS2Je1hF+UYZ+6KywqtZV8mHw==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -3486,6 +3912,9 @@ packages: long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru.min@1.1.4: resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} @@ -3596,14 +4025,58 @@ packages: sass: optional: true + nf3@0.3.22: + resolution: {integrity: sha512-NOcqlHu22X1rUakd0SrqllP8kb3LWFmSAi1svTxaKxz+yB604xlaOmUfI3oO+RkODvaocKDDy8bgthnZL8hrkw==} + + nitro-nightly@3.0.1-20260717-080150-bfc2f5ef: + resolution: {integrity: sha512-MImiqT2V4NboxjLBF5A6n0jgu9iMXZ2b6GYfYb+TMZ1DFCN/nlDTRyu0rijCKTFqzSzCa1duvVsyc9jsvWYcyw==} + 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.0 + vite: ^7 || ^8 + 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 + node-gyp-build-optional-packages@5.2.2: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + engines: {node: '>=18'} + obug@2.1.3: resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} engines: {node: '>=12.20.0'} + ocache@0.2.0: + resolution: {integrity: sha512-QE+SxXf/A8yR01rEOg2X5KwUe+mARHo1xQXl+iwLMzLIH06S5lBOZhhHQWp7T5etfFa8nOnRhvjGuo9YBCWwig==} + + ofetch@2.0.0-alpha.3: + resolution: {integrity: sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==} + ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} @@ -3889,6 +4362,12 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rou3@0.8.1: + resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==} + + rou3@0.9.1: + resolution: {integrity: sha512-z/sSmzvtwMDDnxsPVhfWMuG6F6mbmhFDXoVqLmMfbpDD9qfV3GDmSQpf0+W296/ZDIpW2wcMmBfpVFzcnOi/nA==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3904,6 +4383,10 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.8.1: resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} engines: {node: '>=10'} @@ -3914,6 +4397,16 @@ packages: engines: {node: '>=10'} hasBin: true + seroval-plugins@1.5.5: + resolution: {integrity: sha512-+BDhqYM6CEn3x09v44dpa9p6974FuUB2dxk+Ctn04k0cO1Zt6QODTXfmEZK0eBaTe/fJBvP4NMGuNJ+R8T+QMg==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.5.5: + resolution: {integrity: sha512-bSjOuPcwPKLSJNhr9+bZxA20nQxVle5J5MNsYRVE6cIg7KpRLXGupymePavu0jrxlPiPsr4xGZSB8yUY2sH2sw==} + engines: {node: '>=10'} + setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -3954,6 +4447,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -3965,6 +4462,11 @@ packages: resolution: {integrity: sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==} engines: {bun: '>=1.0.0', deno: '>=2.0.0', node: '>=12.0.0'} + srvx@0.11.22: + resolution: {integrity: sha512-LqZxxBDMKuMAZzFzJnDCkFOrs9MZQZr0LvHiO/SuSZVdQaXD7xQ5UWTUxheJrQPve1qk9MG2B/yttUvJxw8egQ==} + engines: {node: '>=20.16.0'} + hasBin: true + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -4137,6 +4639,9 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} @@ -4179,6 +4684,124 @@ packages: universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + unplugin@3.3.0: + resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@farmfe/core': '*' + '@rspack/core': '*' + bun-types-no-globals: '*' + esbuild: '*' + rolldown: '*' + rollup: '*' + unloader: '*' + vite: '*' + webpack: '*' + peerDependenciesMeta: + '@farmfe/core': + optional: true + '@rspack/core': + optional: true + bun-types-no-globals: + optional: true + esbuild: + optional: true + rolldown: + optional: true + rollup: + optional: true + unloader: + optional: true + vite: + optional: true + webpack: + 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 + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -4235,6 +4858,14 @@ packages: yaml: optional: true + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest@4.1.10: resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -4298,6 +4929,9 @@ packages: engines: {node: ^20.12||^22.13||>=24.0} hasBin: true + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -4348,10 +4982,17 @@ packages: resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==} engines: {node: '>=16.0.0'} + xmlbuilder2@4.0.3: + resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} + engines: {node: '>=20.0'} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} @@ -4369,6 +5010,9 @@ packages: yuku-parser@0.6.3: resolution: {integrity: sha512-iI6uABvvup9mvv8Mcpz7Tp//gehQlvcSnX4A4/0bf9i6X3RVQDuVUZel8jdpljwlF7WrbKsvD19y55Mc6+sKZw==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -4746,6 +5390,112 @@ snapshots: '@aws/lambda-invoke-store@0.3.0': {} + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.6 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@biomejs/biome@2.5.3': optionalDependencies: '@biomejs/cli-darwin-arm64': 2.5.3 @@ -4844,25 +5594,25 @@ snapshots: '@distilled.cloud/core': 0.27.0(effect@4.0.0-beta.93) effect: 4.0.0-beta.93 - '@distilled.cloud/cloudflare-rolldown-plugin@0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260617.1)': + '@distilled.cloud/cloudflare-rolldown-plugin@0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(workerd@1.20260617.1)': dependencies: '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260617.1) magic-string: 0.30.21 unenv: 2.0.0-rc.24 optionalDependencies: rolldown: 1.0.1 - vite: 8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - workerd - '@distilled.cloud/cloudflare-rolldown-plugin@0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260617.1)': + '@distilled.cloud/cloudflare-rolldown-plugin@0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(workerd@1.20260617.1)': dependencies: '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260617.1) magic-string: 0.30.21 unenv: 2.0.0-rc.24 optionalDependencies: rolldown: 1.0.1 - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - workerd @@ -4876,13 +5626,13 @@ snapshots: '@effect/platform-bun': 4.0.0-beta.93(effect@4.0.0-beta.93) '@effect/platform-node': 4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1) - '@distilled.cloud/cloudflare-vite-plugin@0.11.3(@distilled.cloud/cloudflare-runtime@0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93))(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93)(rolldown@1.0.1)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260617.1)': + '@distilled.cloud/cloudflare-vite-plugin@0.11.3(@distilled.cloud/cloudflare-runtime@0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93))(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93)(rolldown@1.0.1)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(workerd@1.20260617.1)': dependencies: '@distilled.cloud/cloudflare': 0.27.0(effect@4.0.0-beta.93) - '@distilled.cloud/cloudflare-rolldown-plugin': 0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260617.1) + '@distilled.cloud/cloudflare-rolldown-plugin': 0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(workerd@1.20260617.1) '@distilled.cloud/cloudflare-runtime': 0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93) effect: 4.0.0-beta.93 - vite: 8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) optionalDependencies: '@effect/platform-bun': 4.0.0-beta.93(effect@4.0.0-beta.93) '@effect/platform-node': 4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1) @@ -4890,13 +5640,13 @@ snapshots: - rolldown - workerd - '@distilled.cloud/cloudflare-vite-plugin@0.11.3(@distilled.cloud/cloudflare-runtime@0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93))(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93)(rolldown@1.0.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260617.1)': + '@distilled.cloud/cloudflare-vite-plugin@0.11.3(@distilled.cloud/cloudflare-runtime@0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93))(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93)(rolldown@1.0.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(workerd@1.20260617.1)': dependencies: '@distilled.cloud/cloudflare': 0.27.0(effect@4.0.0-beta.93) - '@distilled.cloud/cloudflare-rolldown-plugin': 0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260617.1) + '@distilled.cloud/cloudflare-rolldown-plugin': 0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(workerd@1.20260617.1) '@distilled.cloud/cloudflare-runtime': 0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93) effect: 4.0.0-beta.93 - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) optionalDependencies: '@effect/platform-bun': 4.0.0-beta.93(effect@4.0.0-beta.93) '@effect/platform-node': 4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1) @@ -4928,11 +5678,11 @@ snapshots: '@microsoft/fetch-event-source': 2.0.1 fastq: 1.20.1 - '@durable-streams/server-conformance-tests@0.3.5(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))': + '@durable-streams/server-conformance-tests@0.3.5(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@durable-streams/client': 0.2.6 fast-check: 4.9.0 - vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) transitivePeerDependencies: - '@edge-runtime/vm' - '@opentelemetry/api' @@ -4977,15 +5727,15 @@ snapshots: - utf-8-validate optional: true - '@effect/vitest@4.0.0-beta.92(effect@4.0.0-beta.93)(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))': + '@effect/vitest@4.0.0-beta.92(effect@4.0.0-beta.93)(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))': dependencies: effect: 4.0.0-beta.93 - vitest: 4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) - '@effect/vitest@4.0.0-beta.92(effect@4.0.0-beta.93)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))': + '@effect/vitest@4.0.0-beta.92(effect@4.0.0-beta.93)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))': dependencies: effect: 4.0.0-beta.93 - vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) '@emnapi/core@1.10.0': dependencies: @@ -5197,8 +5947,25 @@ snapshots: '@ioredis/commands@1.10.0': optional: true + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@libsql/client@0.17.4': dependencies: '@libsql/core': 0.17.4 @@ -5408,6 +6175,23 @@ snapshots: '@octokit/request-error': 7.1.0 '@octokit/webhooks-methods': 6.0.0 + '@oozcitak/dom@2.0.2': + dependencies: + '@oozcitak/infra': 2.0.2 + '@oozcitak/url': 3.0.0 + '@oozcitak/util': 10.0.0 + + '@oozcitak/infra@2.0.2': + dependencies: + '@oozcitak/util': 10.0.0 + + '@oozcitak/url@3.0.0': + dependencies: + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + + '@oozcitak/util@10.0.0': {} + '@oxc-project/types@0.130.0': {} '@oxc-project/types@0.139.0': {} @@ -6082,6 +6866,222 @@ snapshots: dependencies: tslib: 2.8.1 + '@tanstack/history@1.162.0': {} + + '@tanstack/react-router@1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/react-store': 0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-core': 1.171.15 + isbot: 5.2.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@tanstack/react-start-client@1.168.16(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/react-router': 1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-core': 1.171.15 + '@tanstack/start-client-core': 1.170.14 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@tanstack/react-start-rsc@0.1.27(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@tanstack/react-router': 1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-core': 1.171.15 + '@tanstack/router-utils': 1.162.2 + '@tanstack/start-client-core': 1.170.14 + '@tanstack/start-fn-stubs': 1.162.0 + '@tanstack/start-plugin-core': 1.171.20(@tanstack/react-router@1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/start-server-core': 1.169.17(crossws@0.4.10(srvx@0.11.22)) + '@tanstack/start-storage-context': 1.167.17 + pathe: 2.0.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + transitivePeerDependencies: + - '@farmfe/core' + - '@rsbuild/core' + - bun-types-no-globals + - crossws + - esbuild + - rolldown + - rollup + - supports-color + - unloader + - vite + - vite-plugin-solid + - webpack + + '@tanstack/react-start-server@1.167.22(crossws@0.4.10(srvx@0.11.22))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/react-router': 1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-core': 1.171.15 + '@tanstack/start-server-core': 1.169.17(crossws@0.4.10(srvx@0.11.22)) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + transitivePeerDependencies: + - crossws + + '@tanstack/react-start@1.168.28(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@tanstack/react-router': 1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-start-client': 1.168.16(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-start-rsc': 0.1.27(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/react-start-server': 1.167.22(crossws@0.4.10(srvx@0.11.22))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/router-utils': 1.162.2 + '@tanstack/start-client-core': 1.170.14 + '@tanstack/start-plugin-core': 1.171.20(@tanstack/react-router@1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/start-server-core': 1.169.17(crossws@0.4.10(srvx@0.11.22)) + pathe: 2.0.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - crossws + - esbuild + - react-server-dom-rspack + - rolldown + - rollup + - supports-color + - unloader + - vite-plugin-solid + - webpack + + '@tanstack/react-store@0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/store': 0.9.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + use-sync-external-store: 1.6.0(react@19.2.7) + + '@tanstack/router-core@1.171.15': + dependencies: + '@tanstack/history': 1.162.0 + cookie-es: 3.1.1 + seroval: 1.5.5 + seroval-plugins: 1.5.5(seroval@1.5.5) + + '@tanstack/router-generator@1.167.19': + dependencies: + '@babel/types': 7.29.7 + '@tanstack/router-core': 1.171.15 + '@tanstack/router-utils': 1.162.2 + '@tanstack/virtual-file-routes': 1.162.0 + jiti: 2.7.0 + magic-string: 0.30.21 + prettier: 3.9.5 + zod: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.168.20(@tanstack/react-router@1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@babel/core': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + '@tanstack/router-core': 1.171.15 + '@tanstack/router-generator': 1.167.19 + '@tanstack/router-utils': 1.162.2 + chokidar: 5.0.0 + unplugin: 3.3.0(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + zod: 4.4.3 + optionalDependencies: + '@tanstack/react-router': 1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - rolldown + - rollup + - supports-color + - unloader + + '@tanstack/router-utils@1.162.2': + dependencies: + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + ansis: 4.3.1 + babel-dead-code-elimination: 1.0.12 + diff: 8.0.4 + pathe: 2.0.3 + tinyglobby: 0.2.17 + transitivePeerDependencies: + - supports-color + + '@tanstack/start-client-core@1.170.14': + dependencies: + '@tanstack/router-core': 1.171.15 + '@tanstack/start-fn-stubs': 1.162.0 + '@tanstack/start-storage-context': 1.167.17 + seroval: 1.5.5 + + '@tanstack/start-fn-stubs@1.162.0': {} + + '@tanstack/start-plugin-core@1.171.20(@tanstack/react-router@1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.7 + '@babel/types': 7.29.7 + '@tanstack/router-core': 1.171.15 + '@tanstack/router-generator': 1.167.19 + '@tanstack/router-plugin': 1.168.20(@tanstack/react-router@1.170.18(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/router-utils': 1.162.2 + '@tanstack/start-server-core': 1.169.17(crossws@0.4.10(srvx@0.11.22)) + exsolve: 1.1.0 + lightningcss: 1.32.0 + pathe: 2.0.3 + picomatch: 4.0.5 + seroval: 1.5.5 + source-map: 0.7.6 + srvx: 0.11.22 + tinyglobby: 0.2.17 + ufo: 1.6.4 + vitefu: 1.1.3(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + xmlbuilder2: 4.0.3 + zod: 4.4.3 + optionalDependencies: + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - '@tanstack/react-router' + - bun-types-no-globals + - crossws + - esbuild + - rolldown + - rollup + - supports-color + - unloader + - vite-plugin-solid + - webpack + + '@tanstack/start-server-core@1.169.17(crossws@0.4.10(srvx@0.11.22))': + dependencies: + '@tanstack/history': 1.162.0 + '@tanstack/router-core': 1.171.15 + '@tanstack/start-client-core': 1.170.14 + '@tanstack/start-storage-context': 1.167.17 + fetchdts: 0.1.7 + h3-v2: h3@2.0.1-rc.20(crossws@0.4.10(srvx@0.11.22)) + seroval: 1.5.5 + transitivePeerDependencies: + - crossws + + '@tanstack/start-storage-context@1.167.17': + dependencies: + '@tanstack/router-core': 1.171.15 + + '@tanstack/store@0.9.3': {} + + '@tanstack/virtual-file-routes@1.162.0': {} + '@turbo/darwin-64@2.10.4': optional: true @@ -6169,6 +7169,11 @@ snapshots: '@vercel/detect-agent@1.2.3': {} + '@vitejs/plugin-react@6.0.3(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) + '@vitest/expect@4.1.10': dependencies: '@standard-schema/spec': 1.1.0 @@ -6178,21 +7183,21 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) - '@vitest/mocker@4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -6309,7 +7314,7 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - alchemy@2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@25.9.5)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1): + alchemy@2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@25.9.5)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1): dependencies: '@alchemy.run/node-utils': 0.0.5 '@aws-sdk/credential-providers': 3.1077.0 @@ -6317,13 +7322,13 @@ snapshots: '@distilled.cloud/aws': 0.27.0(effect@4.0.0-beta.93) '@distilled.cloud/axiom': 0.27.0(effect@4.0.0-beta.93) '@distilled.cloud/cloudflare': 0.27.0(effect@4.0.0-beta.93) - '@distilled.cloud/cloudflare-rolldown-plugin': 0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260617.1) + '@distilled.cloud/cloudflare-rolldown-plugin': 0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(workerd@1.20260617.1) '@distilled.cloud/cloudflare-runtime': 0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93) - '@distilled.cloud/cloudflare-vite-plugin': 0.11.3(@distilled.cloud/cloudflare-runtime@0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93))(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93)(rolldown@1.0.1)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260617.1) + '@distilled.cloud/cloudflare-vite-plugin': 0.11.3(@distilled.cloud/cloudflare-runtime@0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93))(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93)(rolldown@1.0.1)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(workerd@1.20260617.1) '@distilled.cloud/core': 0.27.0(effect@4.0.0-beta.93) '@distilled.cloud/neon': 0.27.0(effect@4.0.0-beta.93) '@distilled.cloud/planetscale': 0.27.0(effect@4.0.0-beta.93) - '@effect/vitest': 4.0.0-beta.92(effect@4.0.0-beta.93)(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))) + '@effect/vitest': 4.0.0-beta.92(effect@4.0.0-beta.93)(vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))) '@libsql/client': 0.17.4 '@octokit/rest': 22.0.1 '@octokit/webhooks': 14.2.0 @@ -6351,7 +7356,7 @@ snapshots: optionalDependencies: '@effect/platform-bun': 4.0.0-beta.93(effect@4.0.0-beta.93) '@effect/platform-node': 4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1) - vite: 8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) ws: 8.21.1 transitivePeerDependencies: - '@types/node' @@ -6363,7 +7368,7 @@ snapshots: - vitest - workerd - alchemy@2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1): + alchemy@2.0.0-beta.59(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(@types/node@26.1.1)(@types/react@19.2.17)(effect@4.0.0-beta.93)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)))(workerd@1.20260617.1)(ws@8.21.1): dependencies: '@alchemy.run/node-utils': 0.0.5 '@aws-sdk/credential-providers': 3.1077.0 @@ -6371,13 +7376,13 @@ snapshots: '@distilled.cloud/aws': 0.27.0(effect@4.0.0-beta.93) '@distilled.cloud/axiom': 0.27.0(effect@4.0.0-beta.93) '@distilled.cloud/cloudflare': 0.27.0(effect@4.0.0-beta.93) - '@distilled.cloud/cloudflare-rolldown-plugin': 0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260617.1) + '@distilled.cloud/cloudflare-rolldown-plugin': 0.11.3(rolldown@1.0.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(workerd@1.20260617.1) '@distilled.cloud/cloudflare-runtime': 0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93) - '@distilled.cloud/cloudflare-vite-plugin': 0.11.3(@distilled.cloud/cloudflare-runtime@0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93))(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93)(rolldown@1.0.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))(workerd@1.20260617.1) + '@distilled.cloud/cloudflare-vite-plugin': 0.11.3(@distilled.cloud/cloudflare-runtime@0.11.3(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93))(@distilled.cloud/cloudflare@0.27.0(effect@4.0.0-beta.93))(@effect/platform-bun@4.0.0-beta.93(effect@4.0.0-beta.93))(@effect/platform-node@4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1))(effect@4.0.0-beta.93)(rolldown@1.0.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))(workerd@1.20260617.1) '@distilled.cloud/core': 0.27.0(effect@4.0.0-beta.93) '@distilled.cloud/neon': 0.27.0(effect@4.0.0-beta.93) '@distilled.cloud/planetscale': 0.27.0(effect@4.0.0-beta.93) - '@effect/vitest': 4.0.0-beta.92(effect@4.0.0-beta.93)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0))) + '@effect/vitest': 4.0.0-beta.92(effect@4.0.0-beta.93)(vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0))) '@libsql/client': 0.17.4 '@octokit/rest': 22.0.1 '@octokit/webhooks': 14.2.0 @@ -6405,7 +7410,7 @@ snapshots: optionalDependencies: '@effect/platform-bun': 4.0.0-beta.93(effect@4.0.0-beta.93) '@effect/platform-node': 4.0.0-beta.92(effect@4.0.0-beta.93)(ioredis@5.11.1) - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) ws: 8.21.1 transitivePeerDependencies: - '@types/node' @@ -6453,6 +7458,15 @@ snapshots: aws4fetch@1.0.20: {} + babel-dead-code-elimination@1.0.12: + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + baseline-browser-mapping@2.10.43: {} before-after-hook@4.0.0: {} @@ -6465,6 +7479,14 @@ snapshots: dependencies: fill-range: 7.1.1 + browserslist@4.28.6: + dependencies: + baseline-browser-mapping: 2.10.43 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.393 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.6) + bun-types@1.3.14: dependencies: '@types/node': 25.9.5 @@ -6488,6 +7510,8 @@ snapshots: caniuse-lite@1.0.30001800: {} + caniuse-lite@1.0.30001806: {} + capnweb@0.6.1: {} ccount@2.0.1: {} @@ -6559,20 +7583,32 @@ snapshots: confbox@0.2.4: {} + consola@3.4.2: {} + content-type@2.0.0: {} convert-source-map@2.0.0: {} convert-to-spaces@2.0.1: {} + cookie-es@3.1.1: {} + core-util-is@1.0.3: {} + crossws@0.4.10(srvx@0.11.22): + optionalDependencies: + srvx: 0.11.22 + csstype@3.2.3: {} + db0@0.3.4(@libsql/client@0.17.4)(mysql2@3.22.5(@types/node@26.1.1)): + optionalDependencies: + '@libsql/client': 0.17.4 + mysql2: 3.22.5(@types/node@26.1.1) + debug@4.4.3: dependencies: ms: 2.1.3 - optional: true defu@6.1.7: {} @@ -6611,6 +7647,8 @@ snapshots: dependencies: dequal: 2.0.3 + diff@8.0.4: {} + dotenv@17.4.2: {} dts-resolver@3.0.0: {} @@ -6628,6 +7666,8 @@ snapshots: uuid: 14.0.1 yaml: 2.9.0 + electron-to-chromium@1.5.393: {} + emoji-regex-xs@1.0.0: {} emoji-regex@10.6.0: {} @@ -6643,6 +7683,13 @@ snapshots: env-paths@3.0.0: {} + env-runner@0.1.16: + dependencies: + crossws: 0.4.10(srvx@0.11.22) + exsolve: 1.1.0 + httpxy: 0.5.5 + srvx: 0.11.22 + environment@1.1.0: {} es-errors@1.3.0: {} @@ -6680,6 +7727,8 @@ snapshots: '@esbuild/win32-ia32': 0.28.1 '@esbuild/win32-x64': 0.28.1 + escalade@3.2.0: {} + escape-string-regexp@2.0.0: {} estree-walker@3.0.3: @@ -6740,6 +7789,8 @@ snapshots: optionalDependencies: picomatch: 4.0.5 + fetchdts@0.1.7: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -6755,6 +7806,8 @@ snapshots: dependencies: is-property: 1.0.2 + gensync@1.0.0-beta.2: {} + get-east-asian-width@1.6.0: {} get-tsconfig@5.0.0-beta.5: @@ -6773,6 +7826,28 @@ snapshots: graceful-fs@4.2.11: {} + h3-rules@0.1.0(h3@2.0.1-rc.25(crossws@0.4.10(srvx@0.11.22)))(ocache@0.2.0): + dependencies: + h3: 2.0.1-rc.25(crossws@0.4.10(srvx@0.11.22)) + rou3: 0.9.1 + ufo: 1.6.4 + optionalDependencies: + ocache: 0.2.0 + + h3@2.0.1-rc.20(crossws@0.4.10(srvx@0.11.22)): + dependencies: + rou3: 0.8.1 + srvx: 0.11.22 + optionalDependencies: + crossws: 0.4.10(srvx@0.11.22) + + h3@2.0.1-rc.25(crossws@0.4.10(srvx@0.11.22)): + dependencies: + rou3: 0.9.1 + srvx: 0.11.22 + optionalDependencies: + crossws: 0.4.10(srvx@0.11.22) + has-flag@4.0.0: {} hasown@2.0.4: @@ -6801,6 +7876,8 @@ snapshots: html-void-elements@3.0.0: {} + httpxy@0.5.5: {} + husky@9.1.7: {} iconv-lite@0.7.2: @@ -6901,10 +7978,22 @@ snapshots: isarray@1.0.0: {} + isbot@5.2.1: {} + jiti@2.6.1: {} + jiti@2.7.0: {} + js-base64@3.8.0: {} + js-tokens@4.0.0: {} + + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + json-schema-traverse@1.0.0: {} json-with-bigint@3.5.8: {} @@ -7029,6 +8118,10 @@ snapshots: long@5.3.2: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + lru.min@1.1.4: {} magic-string@0.30.21: @@ -7091,8 +8184,7 @@ snapshots: minimist@1.2.8: {} - ms@2.1.3: - optional: true + ms@2.1.3: {} msgpackr-extract@3.0.4: dependencies: @@ -7168,13 +8260,78 @@ snapshots: - '@babel/core' - babel-plugin-macros + nf3@0.3.22: {} + + nitro-nightly@3.0.1-20260717-080150-bfc2f5ef(@libsql/client@0.17.4)(aws4fetch@1.0.20)(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.0)(ioredis@5.11.1)(jiti@2.7.0)(mysql2@3.22.5(@types/node@26.1.1))(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)): + dependencies: + consola: 3.4.2 + crossws: 0.4.10(srvx@0.11.22) + db0: 0.3.4(@libsql/client@0.17.4)(mysql2@3.22.5(@types/node@26.1.1)) + env-runner: 0.1.16 + h3: 2.0.1-rc.25(crossws@0.4.10(srvx@0.11.22)) + h3-rules: 0.1.0(h3@2.0.1-rc.25(crossws@0.4.10(srvx@0.11.22)))(ocache@0.2.0) + hookable: 6.1.1 + nf3: 0.3.22 + ocache: 0.2.0 + ofetch: 2.0.0-alpha.3 + ohash: 2.0.11 + rolldown: 1.1.5 + rou3: 0.9.1 + srvx: 0.11.22 + unenv: 2.0.0-rc.24 + unstorage: 2.0.0-alpha.7(aws4fetch@1.0.20)(chokidar@5.0.0)(db0@0.3.4(@libsql/client@0.17.4)(mysql2@3.22.5(@types/node@26.1.1)))(ioredis@5.11.1)(ofetch@2.0.0-alpha.3) + optionalDependencies: + dotenv: 17.4.2 + giget: 3.3.0 + jiti: 2.7.0 + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(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 + node-gyp-build-optional-packages@5.2.2: dependencies: detect-libc: 2.1.2 optional: true + node-releases@2.0.51: {} + obug@2.1.3: {} + ocache@0.2.0: + dependencies: + ohash: 2.0.11 + + ofetch@2.0.0-alpha.3: {} + ohash@2.0.11: {} onetime@5.1.2: @@ -7468,6 +8625,10 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.1.5 '@rolldown/binding-win32-x64-msvc': 1.1.5 + rou3@0.8.1: {} + + rou3@0.9.1: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -7482,10 +8643,18 @@ snapshots: scheduler@0.27.0: {} + semver@6.3.1: {} + semver@7.8.1: {} semver@7.8.5: {} + seroval-plugins@1.5.5(seroval@1.5.5): + dependencies: + seroval: 1.5.5 + + seroval@1.5.5: {} + setimmediate@1.0.5: {} sharp@0.34.5: @@ -7555,12 +8724,16 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.7.6: {} + space-separated-tokens@2.0.2: {} split2@4.2.0: {} sql-escaper@1.3.3: {} + srvx@0.11.22: {} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -7703,6 +8876,8 @@ snapshots: uc.micro@2.1.0: {} + ufo@1.6.4: {} + unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.0.0 @@ -7750,6 +8925,34 @@ snapshots: universal-user-agent@7.0.3: {} + unplugin@3.3.0(esbuild@0.28.1)(rolldown@1.1.5)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)): + dependencies: + '@jridgewell/remapping': 2.3.5 + picomatch: 4.0.5 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + esbuild: 0.28.1 + rolldown: 1.1.5 + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) + + unstorage@2.0.0-alpha.7(aws4fetch@1.0.20)(chokidar@5.0.0)(db0@0.3.4(@libsql/client@0.17.4)(mysql2@3.22.5(@types/node@26.1.1)))(ioredis@5.11.1)(ofetch@2.0.0-alpha.3): + optionalDependencies: + aws4fetch: 1.0.20 + chokidar: 5.0.0 + db0: 0.3.4(@libsql/client@0.17.4)(mysql2@3.22.5(@types/node@26.1.1)) + ioredis: 5.11.1 + ofetch: 2.0.0-alpha.3 + + update-browserslist-db@1.2.3(browserslist@4.28.6): + dependencies: + browserslist: 4.28.6 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-sync-external-store@1.6.0(react@19.2.7): + dependencies: + react: 19.2.7 + util-deprecate@1.0.2: {} uuid@14.0.1: {} @@ -7764,7 +8967,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0): + vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.5 @@ -7775,10 +8978,10 @@ snapshots: '@types/node': 25.9.5 esbuild: 0.28.1 fsevents: 2.3.3 - jiti: 2.6.1 + jiti: 2.7.0 yaml: 2.9.0 - vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0): + vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.5 @@ -7789,13 +8992,17 @@ snapshots: '@types/node': 26.1.1 esbuild: 0.28.1 fsevents: 2.3.3 - jiti: 2.6.1 + jiti: 2.7.0 yaml: 2.9.0 - vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)): + vitefu@1.1.3(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)): + optionalDependencies: + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) + + vitest@4.1.10(@types/node@25.9.5)(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -7812,17 +9019,17 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@25.9.5)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.9.5 transitivePeerDependencies: - msw - vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)): + vitest@4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -7839,7 +9046,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.6.1)(yaml@2.9.0) + vite: 8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.1.1 @@ -7863,6 +9070,8 @@ snapshots: watskeburt@5.0.3: {} + webpack-virtual-modules@0.6.2: {} + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -7898,8 +9107,17 @@ snapshots: xml-naming@0.1.0: {} + xmlbuilder2@4.0.3: + dependencies: + '@oozcitak/dom': 2.0.2 + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + js-yaml: 4.3.0 + xtend@4.0.2: {} + yallist@3.1.1: {} + yaml@2.9.0: {} yoga-layout@3.2.1: {} @@ -7940,4 +9158,6 @@ snapshots: '@yuku-parser/binding-win32-arm64': 0.6.3 '@yuku-parser/binding-win32-x64': 0.6.3 + zod@4.4.3: {} + zwitch@2.0.4: {} diff --git a/skills/prisma-composer/SKILL.md b/skills/prisma-composer/SKILL.md index a0efa02b..a481b2e0 100644 --- a/skills/prisma-composer/SKILL.md +++ b/skills/prisma-composer/SKILL.md @@ -224,6 +224,22 @@ contain no symlinks (the packager rejects them — assembly fails and names the link), and `entry` must be a file inside `dir` (`../` is an error, not an escape). Omit `dir` for the single-file form. +TanStack Start's Nitro `node-server` build uses this directory form. Preserve +the complete output — the server entry imports sibling chunks and serves +client/public assets from the same tree: + +```ts +build: node({ + module: import.meta.url, + dir: '../.output', + entry: 'server/index.mjs', +}) +``` + +Run `vite build` first and register `nodeBuild()` in the deploy config. Never +point the single-file form at `.output/server/index.mjs`; that drops the rest +of Nitro's runnable output. + For Next.js, `next build` with `output: 'standalone'` is the whole build; `nextjs({ module, appDir })` tells the deploy where the app root is. diff --git a/turbo.json b/turbo.json index 492f42ab..be8a2133 100644 --- a/turbo.json +++ b/turbo.json @@ -4,7 +4,7 @@ "tasks": { "build": { "dependsOn": ["^build"], - "outputs": [".next/**", "dist/**"] + "outputs": [".next/**", ".output/**", "dist/**"] }, "dev": { "cache": false, From de3ceadd4900a8a035ca3b4b1eb81855b9195e53 Mon Sep 17 00:00:00 2001 From: Alexey Orlenko's AI Agent Date: Fri, 17 Jul 2026 15:16:36 +0200 Subject: [PATCH 2/2] feat(tanstack-start): add dedicated build adapter Signed-off-by: Alexey Orlenko's AI Agent --- architecture.config.json | 12 ++ docs/guides/building-an-app.md | 22 +- docs/guides/getting-started.md | 20 +- .../tanstack-start/prisma-composer.config.ts | 4 +- examples/tanstack-start/src/service.ts | 9 +- .../tests/tanstack-start.test.ts | 14 +- .../2-authoring/tanstack-start/package.json | 38 ++++ .../src/__tests__/assemble.test.ts | 188 ++++++++++++++++++ .../src/__tests__/no-control-import.test.ts | 54 +++++ .../src/__tests__/tanstack-start.test.ts | 28 +++ .../2-authoring/tanstack-start/src/control.ts | 95 +++++++++ .../2-authoring/tanstack-start/src/index.ts | 33 +++ .../2-authoring/tanstack-start/tsconfig.json | 7 + .../tanstack-start/tsdown.config.ts | 5 + packages/9-public/composer/package.json | 5 +- .../composer/src/tanstack-start-control.ts | 1 + .../9-public/composer/src/tanstack-start.ts | 2 + packages/9-public/composer/tsdown.config.ts | 2 + pnpm-lock.yaml | 28 +++ skills/prisma-composer/SKILL.md | 22 +- tsconfig.depcruise.json | 10 + 21 files changed, 555 insertions(+), 44 deletions(-) create mode 100644 packages/0-framework/2-authoring/tanstack-start/package.json create mode 100644 packages/0-framework/2-authoring/tanstack-start/src/__tests__/assemble.test.ts create mode 100644 packages/0-framework/2-authoring/tanstack-start/src/__tests__/no-control-import.test.ts create mode 100644 packages/0-framework/2-authoring/tanstack-start/src/__tests__/tanstack-start.test.ts create mode 100644 packages/0-framework/2-authoring/tanstack-start/src/control.ts create mode 100644 packages/0-framework/2-authoring/tanstack-start/src/index.ts create mode 100644 packages/0-framework/2-authoring/tanstack-start/tsconfig.json create mode 100644 packages/0-framework/2-authoring/tanstack-start/tsdown.config.ts create mode 100644 packages/9-public/composer/src/tanstack-start-control.ts create mode 100644 packages/9-public/composer/src/tanstack-start.ts diff --git a/architecture.config.json b/architecture.config.json index 5f07ee40..2d5df13f 100644 --- a/architecture.config.json +++ b/architecture.config.json @@ -114,6 +114,18 @@ "layer": "authoring", "plane": "control" }, + { + "glob": "packages/0-framework/2-authoring/tanstack-start/src/index.ts", + "domain": "framework", + "layer": "authoring", + "plane": "shared" + }, + { + "glob": "packages/0-framework/2-authoring/tanstack-start/src/control.ts", + "domain": "framework", + "layer": "authoring", + "plane": "control" + }, { "glob": "packages/0-framework/3-tooling/assemble/src/**", "domain": "framework", diff --git a/docs/guides/building-an-app.md b/docs/guides/building-an-app.md index cd5dfa05..008d80fa 100644 --- a/docs/guides/building-an-app.md +++ b/docs/guides/building-an-app.md @@ -455,24 +455,22 @@ ships. Two things to know: Without `dir` you get the single-file form above, unchanged. -**TanStack Start — a Nitro directory build.** TanStack Start's Nitro -`node-server` build is the directory form: `.output/server/index.mjs` imports -sibling server chunks and serves the client and public assets in the same -`.output` tree. Name both paths explicitly: +**`tanstack-start` — a TanStack Start app.** Point the dedicated adapter at +the app root, the folder where Nitro writes `.output`: ```ts -build: node({ +build: tanstackStart({ module: import.meta.url, - dir: '../.output', - entry: 'server/index.mjs', + appDir: '..', }) ``` -Run `vite build` before deploy and register `nodeBuild()` in -`prisma-composer.config.ts`. Do not use the single-file form for the server -entry: copying only `server/index.mjs` leaves its imported siblings and public -assets behind. Composer does not rebuild or interpret Nitro output; it copies -the named `.output` tree verbatim and boots the named entry. The complete, +Run `vite build` before deploy and register `tanstackStartBuild()` from +`@prisma/composer/tanstack-start/control` in `prisma-composer.config.ts`. The +assembler validates `.output/nitro.json`, requires Nitro's `node-server` +preset, reads the manifest's `serverEntry`, and copies the complete `.output` +tree verbatim. That keeps the entry's sibling chunks and client/public assets +in their emitted layout without hardcoding the server path. The complete, tested shape is in [`examples/tanstack-start`](../../examples/tanstack-start/). diff --git a/docs/guides/getting-started.md b/docs/guides/getting-started.md index 81f66e11..81d7cb55 100644 --- a/docs/guides/getting-started.md +++ b/docs/guides/getting-started.md @@ -350,22 +350,22 @@ your built server file, then make three changes to the server itself: Your build must produce a self-contained entry file — keep your own build if it already does. -**A TanStack Start app.** Keep its Nitro `node-server` build and use the -`node` adapter's directory form. Point `dir` at `.output` and `entry` at -`server/index.mjs` inside it: +**A TanStack Start app.** Keep its Nitro `node-server` build and point the +dedicated adapter at the app root: ```ts -build: node({ +build: tanstackStart({ module: import.meta.url, - dir: '../.output', - entry: 'server/index.mjs', + appDir: '..', }) ``` -Composer copies the complete Nitro output, including server chunks, the -client bundle, and `public/`, then boots the entry you named. Run `vite build` -before deploy and include `nodeBuild()` in the deploy config. See the complete -[`examples/tanstack-start`](../../examples/tanstack-start/) app. +Run `vite build` before deploy and include `tanstackStartBuild()` from +`@prisma/composer/tanstack-start/control` in the deploy config. Composer +validates Nitro's manifest, reads its declared server entry, and copies the +complete output, including server chunks, the client bundle, and `public/`. +See the complete [`examples/tanstack-start`](../../examples/tanstack-start/) +app. **A Next.js app.** Use the `nextjs` build adapter instead of `node`; `next build` with `output: 'standalone'` is the whole build: diff --git a/examples/tanstack-start/prisma-composer.config.ts b/examples/tanstack-start/prisma-composer.config.ts index 7308db8e..5ac4080c 100644 --- a/examples/tanstack-start/prisma-composer.config.ts +++ b/examples/tanstack-start/prisma-composer.config.ts @@ -1,8 +1,8 @@ import { defineConfig } from '@prisma/composer/config'; -import { nodeBuild } from '@prisma/composer/node/control'; +import { tanstackStartBuild } from '@prisma/composer/tanstack-start/control'; import { prismaCloud, prismaState } from '@prisma/composer-prisma-cloud/control'; export default defineConfig({ - extensions: [prismaCloud(), nodeBuild()], + extensions: [prismaCloud(), tanstackStartBuild()], state: () => prismaState(), }); diff --git a/examples/tanstack-start/src/service.ts b/examples/tanstack-start/src/service.ts index b29d3f4a..4cafba4e 100644 --- a/examples/tanstack-start/src/service.ts +++ b/examples/tanstack-start/src/service.ts @@ -1,14 +1,11 @@ -import node from '@prisma/composer/node'; +import tanstackStart from '@prisma/composer/tanstack-start'; import { compute } from '@prisma/composer-prisma-cloud'; export default compute({ name: 'web', deps: {}, - // Nitro's server imports sibling chunks and serves assets from this tree. - // The directory form preserves the runnable exactly as `vite build` emitted it. - build: node({ + build: tanstackStart({ module: import.meta.url, - dir: '../.output', - entry: 'server/index.mjs', + appDir: '..', }), }); diff --git a/examples/tanstack-start/tests/tanstack-start.test.ts b/examples/tanstack-start/tests/tanstack-start.test.ts index 0f41c40d..abc41790 100644 --- a/examples/tanstack-start/tests/tanstack-start.test.ts +++ b/examples/tanstack-start/tests/tanstack-start.test.ts @@ -3,7 +3,7 @@ import * as fs from 'node:fs'; import * as net from 'node:net'; import * as os from 'node:os'; import * as path from 'node:path'; -import { assemble } from '@prisma/composer/node/control'; +import { assembleTanStackStart } from '@prisma/composer/tanstack-start/control'; import webService from '../src/service.ts'; const tmpDirs: string[] = []; @@ -51,7 +51,11 @@ describe('TanStack Start directory build', () => { const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'composer-tanstack-start-')); tmpDirs.push(cwd); - const artifact = await assemble({ build: webService.build, address: 'web', cwd }); + const artifact = await assembleTanStackStart({ + build: webService.build, + address: 'web', + cwd, + }); expect(artifact.entry).toBe('bundle/server/index.mjs'); expect(fs.existsSync(path.join(artifact.dir, 'main.mjs'))).toBe(true); @@ -64,7 +68,11 @@ describe('TanStack Start directory build', () => { test('the built Nitro server renders SSR and serves its public tree', async () => { const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'composer-tanstack-start-')); tmpDirs.push(cwd); - const artifact = await assemble({ build: webService.build, address: 'web', cwd }); + const artifact = await assembleTanStackStart({ + build: webService.build, + address: 'web', + cwd, + }); const port = await freePort(); const child = Bun.spawn([process.execPath, path.join(artifact.dir, artifact.entry)], { diff --git a/packages/0-framework/2-authoring/tanstack-start/package.json b/packages/0-framework/2-authoring/tanstack-start/package.json new file mode 100644 index 00000000..9dab57d8 --- /dev/null +++ b/packages/0-framework/2-authoring/tanstack-start/package.json @@ -0,0 +1,38 @@ +{ + "name": "@internal/tanstack-start", + "version": "0.1.0", + "type": "module", + "exports": { + ".": "./dist/index.mjs", + "./control": "./dist/control.mjs", + "./package.json": "./package.json" + }, + "scripts": { + "typecheck": "tsc --noEmit", + "test": "bun test", + "build": "tsdown", + "clean": "rm -rf dist" + }, + "dependencies": { + "@internal/core": "workspace:0.1.0", + "@internal/node": "workspace:0.1.0" + }, + "devDependencies": { + "@internal/tsdown-config": "workspace:0.1.0", + "@types/bun": "^1.3.13", + "@types/node": "^25.9.3", + "typescript": "^6.0.3", + "tsdown": "^0.22.4" + }, + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/prisma/compose.git", + "directory": "packages/0-framework/2-authoring/tanstack-start" + }, + "engines": { + "node": ">=24" + }, + "private": true, + "types": "./dist/index.d.mts" +} diff --git a/packages/0-framework/2-authoring/tanstack-start/src/__tests__/assemble.test.ts b/packages/0-framework/2-authoring/tanstack-start/src/__tests__/assemble.test.ts new file mode 100644 index 00000000..25dd5633 --- /dev/null +++ b/packages/0-framework/2-authoring/tanstack-start/src/__tests__/assemble.test.ts @@ -0,0 +1,188 @@ +import { afterEach, describe, expect, test } from 'bun:test'; +import * as fs from 'node:fs'; +import * as os from 'node:os'; +import * as path from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { assembleTanStackStart, tanstackStartBuild } from '../control.ts'; +import tanstackStart from '../index.ts'; + +const tmpDirs: string[] = []; + +function makeAppRoot(): string { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'prisma-composer-tanstack-start-')); + tmpDirs.push(root); + fs.mkdirSync(path.join(root, 'src'), { recursive: true }); + return root; +} + +function makeCwd(): string { + const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'prisma-composer-tanstack-start-cwd-')); + tmpDirs.push(cwd); + return cwd; +} + +function moduleUrl(root: string): string { + return pathToFileURL(path.join(root, 'src', 'service.ts')).href; +} + +function writeServiceModule(root: string): void { + fs.writeFileSync( + path.join(root, 'src', 'service.ts'), + 'export default { hello: "wrapper" as const };\n', + ); +} + +function writeNitroBuild( + root: string, + options: { preset?: string; serverEntry?: string } = {}, +): void { + const output = path.join(root, '.output'); + const serverEntry = options.serverEntry ?? 'server/custom-entry.mjs'; + fs.mkdirSync(path.dirname(path.join(output, serverEntry)), { recursive: true }); + fs.writeFileSync(path.join(output, serverEntry), '// Nitro server entry\n'); + fs.mkdirSync(path.join(output, 'server', '_chunks'), { recursive: true }); + fs.writeFileSync(path.join(output, 'server', '_chunks', 'runtime.mjs'), '// sibling chunk\n'); + fs.mkdirSync(path.join(output, 'public'), { recursive: true }); + fs.writeFileSync(path.join(output, 'public', 'composer.txt'), 'public asset\n'); + fs.writeFileSync( + path.join(output, 'nitro.json'), + JSON.stringify({ + preset: options.preset ?? 'node-server', + serverEntry, + publicDir: 'public', + }), + ); + writeServiceModule(root); +} + +afterEach(() => { + while (tmpDirs.length > 0) { + const dir = tmpDirs.pop(); + if (dir !== undefined) fs.rmSync(dir, { recursive: true, force: true }); + } +}); + +describe('assemble()', () => { + test('rejects a non-TanStack Start descriptor', async () => { + const root = makeAppRoot(); + await expect( + assembleTanStackStart({ + address: 'web', + cwd: makeCwd(), + build: { + extension: '@prisma/composer/node', + type: 'node', + module: moduleUrl(root), + entry: 'server.mjs', + }, + }), + ).rejects.toThrow(/expected a "tanstack-start" build adapter/); + }); + + test('rejects a missing build with an actionable Vite command', async () => { + const root = makeAppRoot(); + await expect( + assembleTanStackStart({ + address: 'web', + cwd: makeCwd(), + build: tanstackStart({ module: moduleUrl(root), appDir: '..' }), + }), + ).rejects.toThrow(/no TanStack Start build manifest at .*\.output.* run `vite build`/); + }); + + test('rejects malformed nitro.json', async () => { + const root = makeAppRoot(); + fs.mkdirSync(path.join(root, '.output'), { recursive: true }); + fs.writeFileSync(path.join(root, '.output', 'nitro.json'), '{ not json'); + + await expect( + assembleTanStackStart({ + address: 'web', + cwd: makeCwd(), + build: tanstackStart({ module: moduleUrl(root), appDir: '..' }), + }), + ).rejects.toThrow(/invalid Nitro build manifest/); + }); + + test('rejects a Nitro preset that is not node-server', async () => { + const root = makeAppRoot(); + writeNitroBuild(root, { preset: 'cloudflare-module' }); + + await expect( + assembleTanStackStart({ + address: 'web', + cwd: makeCwd(), + build: tanstackStart({ module: moduleUrl(root), appDir: '..' }), + }), + ).rejects.toThrow(/requires Nitro's "node-server" preset/); + }); + + test('rejects a manifest without a serverEntry', async () => { + const root = makeAppRoot(); + const output = path.join(root, '.output'); + fs.mkdirSync(output, { recursive: true }); + fs.writeFileSync(path.join(output, 'nitro.json'), JSON.stringify({ preset: 'node-server' })); + + await expect( + assembleTanStackStart({ + address: 'web', + cwd: makeCwd(), + build: tanstackStart({ module: moduleUrl(root), appDir: '..' }), + }), + ).rejects.toThrow(/records no serverEntry/); + }); + + test('reads the server entry from Nitro and assembles the complete output tree', async () => { + const root = makeAppRoot(); + const cwd = makeCwd(); + writeNitroBuild(root); + + const result = await assembleTanStackStart({ + address: 'app.web', + cwd, + build: tanstackStart({ module: moduleUrl(root), appDir: '..' }), + }); + + expect(result.dir).toBe(path.join(cwd, '.prisma-composer', 'artifacts', 'app.web')); + expect(result.entry).toBe('bundle/server/custom-entry.mjs'); + expect(fs.existsSync(path.join(result.dir, 'main.mjs'))).toBe(true); + expect(fs.existsSync(path.join(result.dir, 'bundle', 'nitro.json'))).toBe(true); + expect(fs.existsSync(path.join(result.dir, 'bundle', 'server', '_chunks', 'runtime.mjs'))).toBe( + true, + ); + expect(fs.readFileSync(path.join(result.dir, 'bundle', 'public', 'composer.txt'), 'utf8')).toBe( + 'public asset\n', + ); + }, 20_000); + + test('rejects a manifest entry that escapes the Nitro output directory', async () => { + const root = makeAppRoot(); + const output = path.join(root, '.output'); + fs.mkdirSync(output, { recursive: true }); + fs.writeFileSync( + path.join(output, 'nitro.json'), + JSON.stringify({ preset: 'node-server', serverEntry: '../outside.mjs' }), + ); + fs.writeFileSync(path.join(root, 'outside.mjs'), '// outside\n'); + writeServiceModule(root); + + await expect( + assembleTanStackStart({ + address: 'web', + cwd: makeCwd(), + build: tanstackStart({ module: moduleUrl(root), appDir: '..' }), + }), + ).rejects.toThrow(/not inside dir/); + }); +}); + +describe('tanstackStartBuild()', () => { + test('registers the TanStack Start assembler under its descriptor key', () => { + const extension = tanstackStartBuild(); + expect(extension.id).toBe('@prisma/composer/tanstack-start'); + expect(extension.nodes['tanstack-start']).toEqual({ + kind: 'build', + assemble: assembleTanStackStart, + }); + }); +}); diff --git a/packages/0-framework/2-authoring/tanstack-start/src/__tests__/no-control-import.test.ts b/packages/0-framework/2-authoring/tanstack-start/src/__tests__/no-control-import.test.ts new file mode 100644 index 00000000..e927a025 --- /dev/null +++ b/packages/0-framework/2-authoring/tanstack-start/src/__tests__/no-control-import.test.ts @@ -0,0 +1,54 @@ +import { describe, expect, test } from 'bun:test'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; + +/** + * The firewall by file boundary (ADR-0017): control-plane code is loaded only + * through `prisma-composer.config.ts` — nothing reachable from this package's + * authoring entry may import a `/control` entry. + */ + +const srcDir = path.join(import.meta.dir, '..'); + +function importSpecifiers(text: string): string[] { + const pattern = + /(?:import|export)\s+[^'"]*?from\s*["']([^"']+)["']|import\s*\(\s*["']([^"']+)["']\s*\)|import\s*["']([^"']+)["']/g; + const out: string[] = []; + for (const match of text.matchAll(pattern)) { + const spec = match[1] ?? match[2] ?? match[3]; + if (spec !== undefined) out.push(spec); + } + return out; +} + +function reachableImports(entry: string): Map { + const seen = new Map(); + const queue = [entry]; + while (queue.length > 0) { + const file = queue.pop(); + if (file === undefined || seen.has(file)) continue; + const specs = importSpecifiers(fs.readFileSync(file, 'utf8')); + seen.set(file, specs); + for (const spec of specs) { + if (!spec.startsWith('.')) continue; + const resolved = path.resolve(path.dirname(file), spec); + if (fs.existsSync(resolved)) queue.push(resolved); + } + } + return seen; +} + +describe('firewall: the authoring entry never reaches a control entry', () => { + test('no module reachable from src/index.ts imports a /control entry', () => { + const reachable = reachableImports(path.join(srcDir, 'index.ts')); + expect(reachable.size).toBeGreaterThan(0); + + for (const [file, specs] of reachable) { + const offending = specs.filter((spec) => /\/control(\.ts)?$/.test(spec)); + expect({ file: path.relative(srcDir, file), offending }).toEqual({ + file: path.relative(srcDir, file), + offending: [], + }); + } + }); +}); diff --git a/packages/0-framework/2-authoring/tanstack-start/src/__tests__/tanstack-start.test.ts b/packages/0-framework/2-authoring/tanstack-start/src/__tests__/tanstack-start.test.ts new file mode 100644 index 00000000..659e5c81 --- /dev/null +++ b/packages/0-framework/2-authoring/tanstack-start/src/__tests__/tanstack-start.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, test } from 'bun:test'; +import tanstackStart from '../index.ts'; + +describe('tanstackStart({ module, appDir })', () => { + test('returns a plain TanStack Start build descriptor', () => { + expect(tanstackStart({ module: 'file:///app/src/service.ts', appDir: '..' })).toEqual({ + extension: '@prisma/composer/tanstack-start', + type: 'tanstack-start', + module: 'file:///app/src/service.ts', + appDir: '..', + entry: 'server/index.mjs', + }); + }); + + test('carries appDir through unmodified for file-relative resolution at assembly time', () => { + expect( + tanstackStart({ module: 'file:///repo/apps/web/src/service.ts', appDir: '..' }).appDir, + ).toBe('..'); + }); + + test('is pure data — equal input yields equal, independent objects', () => { + const a = tanstackStart({ module: 'file:///app/src/service.ts', appDir: '..' }); + const b = tanstackStart({ module: 'file:///app/src/service.ts', appDir: '..' }); + + expect(a).toEqual(b); + expect(a).not.toBe(b); + }); +}); diff --git a/packages/0-framework/2-authoring/tanstack-start/src/control.ts b/packages/0-framework/2-authoring/tanstack-start/src/control.ts new file mode 100644 index 00000000..778868b1 --- /dev/null +++ b/packages/0-framework/2-authoring/tanstack-start/src/control.ts @@ -0,0 +1,95 @@ +/** + * Deploy-side assembly for a TanStack Start app built by Nitro. + * + * The user owns `vite build` (ADR-0005). Composer reads the resulting + * `.output/nitro.json`, validates that it is a `node-server` runnable, and + * delegates the complete directory copy plus boot-wrapper build to the Node + * directory adapter. The manifest supplies the server entry; no output path is + * guessed and no framework code is rebuilt. + */ +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import type { BuildAdapter } from '@internal/core'; +import type { ExtensionDescriptor } from '@internal/core/config'; +import type { AssembleInput, Bundle } from '@internal/core/deploy'; +import node from '@internal/node'; +import { assemble } from '@internal/node/control'; +import type { TanStackStartBuildAdapter } from './index.ts'; + +function isTanStackStartBuild(descriptor: BuildAdapter): descriptor is TanStackStartBuildAdapter { + return ( + descriptor.type === 'tanstack-start' && + 'appDir' in descriptor && + typeof descriptor.appDir === 'string' + ); +} + +function readNitroBuild(build: TanStackStartBuildAdapter): { + outputDir: string; + serverEntry: string; +} { + const moduleDir = path.dirname(fileURLToPath(build.module)); + const appDir = path.resolve(moduleDir, build.appDir); + const outputDir = path.join(appDir, '.output'); + const manifestPath = path.join(outputDir, 'nitro.json'); + + if (!fs.existsSync(manifestPath)) { + throw new Error( + `no TanStack Start build manifest at ${manifestPath} — run \`vite build\` first.`, + ); + } + + let manifest: unknown; + try { + manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')); + } catch (error) { + const detail = error instanceof Error ? error.message : String(error); + throw new Error(`invalid Nitro build manifest at ${manifestPath}: ${detail}`); + } + if (typeof manifest !== 'object' || manifest === null) { + throw new Error(`invalid Nitro build manifest at ${manifestPath}: expected an object.`); + } + + const preset: unknown = Reflect.get(manifest, 'preset'); + if (preset !== 'node-server') { + throw new Error( + `${manifestPath} records preset ${JSON.stringify(preset)} — TanStack Start on Composer requires Nitro's "node-server" preset.`, + ); + } + + const serverEntry: unknown = Reflect.get(manifest, 'serverEntry'); + if (typeof serverEntry !== 'string' || serverEntry.length === 0) { + throw new Error( + `${manifestPath} records no serverEntry — rebuild the TanStack Start app with Nitro's "node-server" preset.`, + ); + } + + return { outputDir, serverEntry }; +} + +export async function assembleTanStackStart(input: AssembleInput): Promise { + if (!isTanStackStartBuild(input.build)) { + throw new Error( + `@prisma/composer/tanstack-start/control: expected a "tanstack-start" build adapter (with appDir), got "${input.build.type}".`, + ); + } + const { outputDir, serverEntry } = readNitroBuild(input.build); + + return assemble({ + ...input, + build: node({ + module: input.build.module, + dir: outputDir, + entry: serverEntry, + }), + }); +} + +/** The TanStack Start build extension descriptor listed in `prisma-composer.config.ts`. */ +export const tanstackStartBuild = (): ExtensionDescriptor => ({ + id: '@prisma/composer/tanstack-start', + nodes: { + 'tanstack-start': { kind: 'build', assemble: assembleTanStackStart }, + }, +}); diff --git a/packages/0-framework/2-authoring/tanstack-start/src/index.ts b/packages/0-framework/2-authoring/tanstack-start/src/index.ts new file mode 100644 index 00000000..824f5548 --- /dev/null +++ b/packages/0-framework/2-authoring/tanstack-start/src/index.ts @@ -0,0 +1,33 @@ +/** + * Marks a service as a TanStack Start app built by Nitro for deployment. + * + * `tanstackStart({ module, appDir })` names the app root: the directory that + * contains the Vite config and receives Nitro's `.output/`, resolved relative + * to `dirname(module)` like an import specifier (ADR-0004). Build the app with + * Vite first; deploy reads Nitro's manifest, validates its `node-server` + * preset, and ships the complete output tree. + * + * Returns plain data — nothing runs on import. `extension` + `type` are the + * control-plane registry key: deploy tooling routes assembly through the app's + * `prisma-composer.config.ts` to this package's `/control` descriptor + * (ADR-0017). + */ +import type { BuildAdapter } from '@internal/core'; + +/** The TanStack Start build descriptor. The assembler locates `.output` and reads the actual entry from Nitro's manifest. */ +export interface TanStackStartBuildAdapter extends BuildAdapter { + readonly type: 'tanstack-start'; + readonly appDir: string; +} + +const tanstackStart = (opts: { module: string; appDir: string }): TanStackStartBuildAdapter => ({ + extension: '@prisma/composer/tanstack-start', + type: 'tanstack-start', + module: opts.module, + appDir: opts.appDir, + // BuildAdapter carries an entry for every kind. The assembler replaces this + // convention with Nitro's authoritative `serverEntry` from nitro.json. + entry: 'server/index.mjs', +}); + +export default tanstackStart; diff --git a/packages/0-framework/2-authoring/tanstack-start/tsconfig.json b/packages/0-framework/2-authoring/tanstack-start/tsconfig.json new file mode 100644 index 00000000..7d2b986b --- /dev/null +++ b/packages/0-framework/2-authoring/tanstack-start/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "types": ["bun", "node"] + }, + "include": ["src"] +} diff --git a/packages/0-framework/2-authoring/tanstack-start/tsdown.config.ts b/packages/0-framework/2-authoring/tanstack-start/tsdown.config.ts new file mode 100644 index 00000000..44639e10 --- /dev/null +++ b/packages/0-framework/2-authoring/tanstack-start/tsdown.config.ts @@ -0,0 +1,5 @@ +import { defineConfig } from '@internal/tsdown-config'; + +export default defineConfig({ + entry: ['src/index.ts', 'src/control.ts'], +}); diff --git a/packages/9-public/composer/package.json b/packages/9-public/composer/package.json index 758c3e29..f8adfbcc 100644 --- a/packages/9-public/composer/package.json +++ b/packages/9-public/composer/package.json @@ -2,7 +2,7 @@ "name": "@prisma/composer", "version": "0.1.0", "type": "module", - "description": "Prisma Composer — build a Prisma App by composing Modules. Core authoring, deploy pipeline, the prisma-composer CLI, and the rpc/node/nextjs authoring surfaces.", + "description": "Prisma Composer — build a Prisma App by composing Modules. Core authoring, deploy pipeline, the prisma-composer CLI, and the rpc/node/nextjs/tanstack-start authoring surfaces.", "bin": { "prisma-composer": "./dist/bin.mjs" }, @@ -18,6 +18,8 @@ "./node/control": "./dist/node-control.mjs", "./nextjs": "./dist/nextjs.mjs", "./nextjs/control": "./dist/nextjs-control.mjs", + "./tanstack-start": "./dist/tanstack-start.mjs", + "./tanstack-start/control": "./dist/tanstack-start-control.mjs", "./package.json": "./package.json" }, "files": [ @@ -48,6 +50,7 @@ "@internal/nextjs": "workspace:0.1.0", "@internal/node": "workspace:0.1.0", "@internal/rpc": "workspace:0.1.0", + "@internal/tanstack-start": "workspace:0.1.0", "@internal/tsdown-config": "workspace:0.1.0", "@types/node": "^25.9.3", "tsdown": "^0.22.4", diff --git a/packages/9-public/composer/src/tanstack-start-control.ts b/packages/9-public/composer/src/tanstack-start-control.ts new file mode 100644 index 00000000..498c19cd --- /dev/null +++ b/packages/9-public/composer/src/tanstack-start-control.ts @@ -0,0 +1 @@ +export * from '@internal/tanstack-start/control'; diff --git a/packages/9-public/composer/src/tanstack-start.ts b/packages/9-public/composer/src/tanstack-start.ts new file mode 100644 index 00000000..8d84753b --- /dev/null +++ b/packages/9-public/composer/src/tanstack-start.ts @@ -0,0 +1,2 @@ +export * from '@internal/tanstack-start'; +export { default } from '@internal/tanstack-start'; diff --git a/packages/9-public/composer/tsdown.config.ts b/packages/9-public/composer/tsdown.config.ts index 1fd46ddb..53b27fdc 100644 --- a/packages/9-public/composer/tsdown.config.ts +++ b/packages/9-public/composer/tsdown.config.ts @@ -20,6 +20,8 @@ export default defineConfig([ 'node-control': 'src/node-control.ts', nextjs: 'src/nextjs.ts', 'nextjs-control': 'src/nextjs-control.ts', + 'tanstack-start': 'src/tanstack-start.ts', + 'tanstack-start-control': 'src/tanstack-start-control.ts', }, exports: false, clean: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aa03be4b..99d5beea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -585,6 +585,31 @@ importers: specifier: ^4.1.10 version: 4.1.10(@types/node@26.1.1)(vite@8.1.2(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.0)) + packages/0-framework/2-authoring/tanstack-start: + dependencies: + '@internal/core': + specifier: workspace:0.1.0 + version: link:../../1-core/core + '@internal/node': + specifier: workspace:0.1.0 + version: link:../node + devDependencies: + '@internal/tsdown-config': + specifier: workspace:0.1.0 + version: link:../../0-foundation/tsdown-config + '@types/bun': + specifier: ^1.3.13 + version: 1.3.14 + '@types/node': + specifier: ^25.9.3 + version: 25.9.5 + tsdown: + specifier: ^0.22.4 + version: 0.22.4(typescript@6.0.3) + typescript: + specifier: ^6.0.3 + version: 6.0.3 + packages/0-framework/3-tooling/assemble: dependencies: '@internal/core': @@ -922,6 +947,9 @@ importers: '@internal/rpc': specifier: workspace:0.1.0 version: link:../../0-framework/2-authoring/rpc + '@internal/tanstack-start': + specifier: workspace:0.1.0 + version: link:../../0-framework/2-authoring/tanstack-start '@internal/tsdown-config': specifier: workspace:0.1.0 version: link:../../0-framework/0-foundation/tsdown-config diff --git a/skills/prisma-composer/SKILL.md b/skills/prisma-composer/SKILL.md index a481b2e0..7d843d8a 100644 --- a/skills/prisma-composer/SKILL.md +++ b/skills/prisma-composer/SKILL.md @@ -46,7 +46,7 @@ Two packages, and only two, appear in your `package.json`: | Package | Provides | | --- | --- | -| `@prisma/composer` | Core authoring: `module`, `secret`, params, `/rpc`, `/node`, `/nextjs`, `/config`, `/testing`, the `prisma-composer` CLI | +| `@prisma/composer` | Core authoring: `module`, `secret`, params, `/rpc`, `/node`, `/nextjs`, `/tanstack-start`, `/config`, `/testing`, the `prisma-composer` CLI | | `@prisma/composer-prisma-cloud` | The Prisma Cloud target: `compute`, `postgres`, `envSecret`, `envParam`, `/control`, `/testing`, and the shared `/cron`, `/storage`, `/streams`, `/prisma-next` modules | ## Anatomy of a service @@ -224,21 +224,20 @@ contain no symlinks (the packager rejects them — assembly fails and names the link), and `entry` must be a file inside `dir` (`../` is an error, not an escape). Omit `dir` for the single-file form. -TanStack Start's Nitro `node-server` build uses this directory form. Preserve -the complete output — the server entry imports sibling chunks and serves -client/public assets from the same tree: +For TanStack Start, use the dedicated adapter and name the app root where +Nitro writes `.output`: ```ts -build: node({ +build: tanstackStart({ module: import.meta.url, - dir: '../.output', - entry: 'server/index.mjs', + appDir: '..', }) ``` -Run `vite build` first and register `nodeBuild()` in the deploy config. Never -point the single-file form at `.output/server/index.mjs`; that drops the rest -of Nitro's runnable output. +Run `vite build` first and register `tanstackStartBuild()` from +`@prisma/composer/tanstack-start/control` in the deploy config. It validates +`.output/nitro.json`, requires the `node-server` preset, reads `serverEntry`, +and preserves Nitro's complete server/client/public tree. For Next.js, `next build` with `output: 'standalone'` is the whole build; `nextjs({ module, appDir })` tells the deploy where the app root is. @@ -266,6 +265,9 @@ export default defineConfig({ Add `nextjsBuild()` from `@prisma/composer/nextjs/control` to `extensions` when the app contains a Next.js service. +Add `tanstackStartBuild()` from `@prisma/composer/tanstack-start/control` when +the app contains a TanStack Start service. + ## Databases Two kinds of Postgres dependency: diff --git a/tsconfig.depcruise.json b/tsconfig.depcruise.json index 885e887c..a5cc2490 100644 --- a/tsconfig.depcruise.json +++ b/tsconfig.depcruise.json @@ -17,6 +17,12 @@ "@internal/node": ["./packages/0-framework/2-authoring/node/src/index.ts"], "@internal/nextjs/control": ["./packages/0-framework/2-authoring/nextjs/src/control.ts"], "@internal/nextjs": ["./packages/0-framework/2-authoring/nextjs/src/index.ts"], + "@internal/tanstack-start/control": [ + "./packages/0-framework/2-authoring/tanstack-start/src/control.ts" + ], + "@internal/tanstack-start": [ + "./packages/0-framework/2-authoring/tanstack-start/src/index.ts" + ], "@internal/assemble": ["./packages/0-framework/3-tooling/assemble/src/index.ts"], "@internal/cli/bin": ["./packages/0-framework/3-tooling/cli/src/bin.ts"], "@internal/cli": ["./packages/0-framework/3-tooling/cli/src/index.ts"], @@ -57,6 +63,10 @@ "@prisma/composer/node": ["./packages/9-public/composer/src/node.ts"], "@prisma/composer/nextjs/control": ["./packages/9-public/composer/src/nextjs-control.ts"], "@prisma/composer/nextjs": ["./packages/9-public/composer/src/nextjs.ts"], + "@prisma/composer/tanstack-start/control": [ + "./packages/9-public/composer/src/tanstack-start-control.ts" + ], + "@prisma/composer/tanstack-start": ["./packages/9-public/composer/src/tanstack-start.ts"], "@prisma/composer-prisma-cloud/control": [ "./packages/9-public/composer-prisma-cloud/src/control.ts" ],