From 11585d36517c240731b37e013c712e3bd04082ba Mon Sep 17 00:00:00 2001 From: Bilal Godil Date: Mon, 2 Mar 2026 09:49:00 -0800 Subject: [PATCH 1/4] hosted components --- apps/dev-launchpad/public/index.html | 8 + apps/hosted-components/.env.development | 1 + apps/hosted-components/.eslintrc.cjs | 4 + apps/hosted-components/package.json | 36 + apps/hosted-components/src/client.tsx | 12 + apps/hosted-components/src/routeTree.gen.ts | 86 ++ apps/hosted-components/src/router.tsx | 12 + apps/hosted-components/src/routes/__root.tsx | 137 +++ .../src/routes/handler/$.tsx | 10 + apps/hosted-components/src/routes/index.tsx | 31 + apps/hosted-components/tsconfig.json | 19 + apps/hosted-components/vite.config.ts | 26 + pnpm-lock.yaml | 829 +++++++++++++++++- 13 files changed, 1172 insertions(+), 39 deletions(-) create mode 100644 apps/hosted-components/.env.development create mode 100644 apps/hosted-components/.eslintrc.cjs create mode 100644 apps/hosted-components/package.json create mode 100644 apps/hosted-components/src/client.tsx create mode 100644 apps/hosted-components/src/routeTree.gen.ts create mode 100644 apps/hosted-components/src/router.tsx create mode 100644 apps/hosted-components/src/routes/__root.tsx create mode 100644 apps/hosted-components/src/routes/handler/$.tsx create mode 100644 apps/hosted-components/src/routes/index.tsx create mode 100644 apps/hosted-components/tsconfig.json create mode 100644 apps/hosted-components/vite.config.ts diff --git a/apps/dev-launchpad/public/index.html b/apps/dev-launchpad/public/index.html index b9eab64e06..828ddfec1b 100644 --- a/apps/dev-launchpad/public/index.html +++ b/apps/dev-launchpad/public/index.html @@ -182,6 +182,14 @@

Background services

img: "https://www.svgrepo.com/show/448400/docs.svg", importance: 2, }, + { + name: "Hosted Components", + portSuffix: "09", + description: [ + "Src: ./apps/hosted-components", + ], + importance: 2, + }, { name: "Inbucket", portSuffix: "05", diff --git a/apps/hosted-components/.env.development b/apps/hosted-components/.env.development new file mode 100644 index 0000000000..6e379fd025 --- /dev/null +++ b/apps/hosted-components/.env.development @@ -0,0 +1 @@ +VITE_STACK_API_URL=http://localhost:8102 diff --git a/apps/hosted-components/.eslintrc.cjs b/apps/hosted-components/.eslintrc.cjs new file mode 100644 index 0000000000..1a4ae3fdbe --- /dev/null +++ b/apps/hosted-components/.eslintrc.cjs @@ -0,0 +1,4 @@ +module.exports = { + extends: ["../../configs/eslint/defaults.js"], + ignorePatterns: ["/*", "!/src"], +}; diff --git a/apps/hosted-components/package.json b/apps/hosted-components/package.json new file mode 100644 index 0000000000..901feeb8c9 --- /dev/null +++ b/apps/hosted-components/package.json @@ -0,0 +1,36 @@ +{ + "name": "@stackframe/hosted-components", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite dev --port ${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}09", + "build": "vite build", + "start": "node .output/server/index.mjs", + "lint": "eslint --ext .ts,.tsx .", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@stackframe/react": "workspace:*", + "@stackframe/stack-shared": "workspace:*", + "@tanstack/react-router": "^1.121.3", + "@tanstack/react-start": "^1.121.3", + "@tanstack/react-start-client": "^1.121.3", + "@tanstack/react-start-server": "^1.121.3", + "@tanstack/start-client-core": "^1.121.3", + "@tanstack/start-server-core": "^1.121.3", + "@tanstack/start-plugin-core": "^1.121.3", + "react": "^19.0.1", + "react-dom": "^19.0.1" + }, + "devDependencies": { + "@types/node": "^22.13.0", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^5.0.0", + "typescript": "5.9.3", + "vite": "^7.0.0", + "vite-tsconfig-paths": "^4.3.2" + }, + "packageManager": "pnpm@10.23.0" +} diff --git a/apps/hosted-components/src/client.tsx b/apps/hosted-components/src/client.tsx new file mode 100644 index 0000000000..e7a2191d3b --- /dev/null +++ b/apps/hosted-components/src/client.tsx @@ -0,0 +1,12 @@ +import { StartClient } from '@tanstack/react-start/client'; +import { StrictMode, startTransition } from 'react'; +import { hydrateRoot } from 'react-dom/client'; + +startTransition(() => { + hydrateRoot( + document, + + + , + ); +}); diff --git a/apps/hosted-components/src/routeTree.gen.ts b/apps/hosted-components/src/routeTree.gen.ts new file mode 100644 index 0000000000..d7923e9fd8 --- /dev/null +++ b/apps/hosted-components/src/routeTree.gen.ts @@ -0,0 +1,86 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as IndexRouteImport } from './routes/index' +import { Route as HandlerSplatRouteImport } from './routes/handler/$' + +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) +const HandlerSplatRoute = HandlerSplatRouteImport.update({ + id: '/handler/$', + path: '/handler/$', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/handler/$': typeof HandlerSplatRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/handler/$': typeof HandlerSplatRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/handler/$': typeof HandlerSplatRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/handler/$' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/handler/$' + id: '__root__' | '/' | '/handler/$' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + HandlerSplatRoute: typeof HandlerSplatRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + '/handler/$': { + id: '/handler/$' + path: '/handler/$' + fullPath: '/handler/$' + preLoaderRoute: typeof HandlerSplatRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + HandlerSplatRoute: HandlerSplatRoute, +} +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/apps/hosted-components/src/router.tsx b/apps/hosted-components/src/router.tsx new file mode 100644 index 0000000000..8748354451 --- /dev/null +++ b/apps/hosted-components/src/router.tsx @@ -0,0 +1,12 @@ +import { createRouter } from '@tanstack/react-router'; +import { routeTree } from './routeTree.gen'; + +export function getRouter() { + const router = createRouter({ + routeTree, + scrollRestoration: true, + }); + + return router; +} + diff --git a/apps/hosted-components/src/routes/__root.tsx b/apps/hosted-components/src/routes/__root.tsx new file mode 100644 index 0000000000..75454b20f1 --- /dev/null +++ b/apps/hosted-components/src/routes/__root.tsx @@ -0,0 +1,137 @@ +/// +import { + HeadContent, + Outlet, + Scripts, + createRootRoute, + useNavigate +} from '@tanstack/react-router'; +import { Component, useEffect, useMemo, useState } from 'react'; +import type { ErrorInfo, ReactNode } from 'react'; +import { StackClientApp, StackProvider, StackTheme } from '@stackframe/react'; + + +export function getProjectId(): string | null { + // Extract from subdomain: .built-with-stack-auth.com + // Also works with .localhost for local dev + const hostname = window.location.hostname; + const parts = hostname.split('.'); + if (parts.length >= 2) { + return parts[0]; + } + + return null; +} + +function FullPageError({ title, message }: { title: string, message: string }) { + return ( +
+
+

{title}

+

{message}

+
+
+ ); +} + +class ErrorBoundary extends Component<{ children: ReactNode }, { error: Error | null }> { + constructor(props: { children: ReactNode }) { + super(props); + this.state = { error: null }; + } + + static getDerivedStateFromError(error: Error) { + return { error }; + } + + componentDidCatch(error: Error, errorInfo: ErrorInfo) { + console.error('Hosted components error:', error, errorInfo); + } + + render() { + if (this.state.error) { + return ; + } + + return this.props.children; + } +} + +export const Route = createRootRoute({ + head: () => ({ + meta: [ + { charSet: 'utf-8' }, + { name: 'viewport', content: 'width=device-width, initial-scale=1' }, + ], + }), + shellComponent: RootDocument, + component: RootComponent, +}); + +function RootDocument({ children }: { children: ReactNode }) { + return ( + + + + + + + + + {children} + + + + ); +} + +function RootComponent() { + const [projectId, setProjectId] = useState(undefined); + + useEffect(() => { + setProjectId(getProjectId()); + }, []); + + const isValidProjectId = projectId ? (projectId === "internal" || /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(projectId)) : false; + + const stackApp = useMemo(() => { + if (!projectId || !isValidProjectId) return null; + return new StackClientApp({ + projectId, + tokenStore: "cookie", + baseUrl: import.meta.env.VITE_STACK_API_URL || undefined, + urls: { + handler: "/handler", + signIn: "/handler/sign-in", + signUp: "/handler/sign-up", + afterSignIn: "/", + afterSignUp: "/", + afterSignOut: "/handler/sign-in", + }, + redirectMethod: { useNavigate: useNavigate as any } + }); + }, [projectId]); + + if (projectId === undefined) { + return <>; + } + + if (!projectId) { + return .localhost:8105.`} />; + } + + if (!isValidProjectId) { + return ; + } + + return ( + + + + + + + + ); +} + diff --git a/apps/hosted-components/src/routes/handler/$.tsx b/apps/hosted-components/src/routes/handler/$.tsx new file mode 100644 index 0000000000..ecca531af7 --- /dev/null +++ b/apps/hosted-components/src/routes/handler/$.tsx @@ -0,0 +1,10 @@ +import { createFileRoute } from '@tanstack/react-router'; +import { StackHandler } from '@stackframe/react'; + +export const Route = createFileRoute('/handler/$')({ + component: HandlerPage, +}); + +function HandlerPage() { + return ; +} diff --git a/apps/hosted-components/src/routes/index.tsx b/apps/hosted-components/src/routes/index.tsx new file mode 100644 index 0000000000..0ce0219892 --- /dev/null +++ b/apps/hosted-components/src/routes/index.tsx @@ -0,0 +1,31 @@ +import { createFileRoute } from '@tanstack/react-router'; +import { UserButton, useUser } from "@stackframe/react"; + +export const Route = createFileRoute('/')({ + component: HandlerPage, + pendingComponent: () => ( +
+
+ +
+ ), +}); + +function HandlerPage() { + const user = useUser({ or: "redirect" }); + const name = user.displayName || user.primaryEmail || "User"; + + return ( +
+
+ +
+

+ Welcome, {name} +

+

+ You are signed in. +

+
+ ); +} diff --git a/apps/hosted-components/tsconfig.json b/apps/hosted-components/tsconfig.json new file mode 100644 index 0000000000..8388f78d6a --- /dev/null +++ b/apps/hosted-components/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "target": "ES2021", + "lib": ["DOM", "DOM.Iterable", "ES2021"], + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "skipLibCheck": true, + "isolatedModules": true, + "noEmit": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "paths": { + "~/*": ["./src/*"] + } + }, + "include": ["src", "vite.config.ts"] +} diff --git a/apps/hosted-components/vite.config.ts b/apps/hosted-components/vite.config.ts new file mode 100644 index 0000000000..730d539fa7 --- /dev/null +++ b/apps/hosted-components/vite.config.ts @@ -0,0 +1,26 @@ +import { defineConfig } from 'vite' +import tsConfigPaths from 'vite-tsconfig-paths' +import { tanstackStart } from '@tanstack/react-start/plugin/vite' +import viteReact from '@vitejs/plugin-react' + +export default defineConfig({ + server: { + port: 8105, + }, + resolve: { + dedupe: ['react', 'react-dom'], + }, + optimizeDeps: { + exclude: ['@stackframe/react', '@stackframe/stack-shared'], + }, + plugins: [ + tsConfigPaths(), + tanstackStart({ + spa: { + enabled: true, + }, + }), + // react's vite plugin must come after start's vite plugin + viteReact(), + ], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d3c0b7eb68..b0dfc0eb07 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -465,7 +465,7 @@ importers: version: 2.0.2(react@19.2.3) '@sentry/nextjs': specifier: ^10.11.0 - version: 10.11.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(webpack@5.92.0(esbuild@0.24.2)) + version: 10.11.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(webpack@5.92.0(esbuild@0.24.2)) '@stackframe/stack': specifier: workspace:* version: link:../../packages/stack @@ -492,10 +492,10 @@ importers: version: 3.13.18(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@vercel/analytics': specifier: ^1.2.2 - version: 1.3.1(next@16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) + version: 1.3.1(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) '@vercel/speed-insights': specifier: ^1.0.12 - version: 1.0.12(next@16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) + version: 1.0.12(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3) ai: specifier: ^6.0.0 version: 6.0.81(zod@4.1.12) @@ -525,7 +525,7 @@ importers: version: 1.4.0 geist: specifier: ^1 - version: 1.3.0(next@16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) + version: 1.3.0(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) input-otp: specifier: ^1.4.1 version: 1.4.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -537,7 +537,7 @@ importers: version: 4.17.21 next: specifier: 16.1.5 - version: 16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) posthog-js: specifier: ^1.336.1 version: 1.336.1 @@ -582,7 +582,7 @@ importers: version: 1.32.0(encoding@0.1.13) svix-react: specifier: ^1.13.0 - version: 1.13.0(@babel/core@7.28.5)(prop-types@15.8.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svix@1.32.0(encoding@0.1.13)) + version: 1.13.0(@babel/core@7.29.0)(prop-types@15.8.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svix@1.32.0(encoding@0.1.13)) tailwind-merge: specifier: ^2.3.0 version: 2.3.0 @@ -688,6 +688,64 @@ importers: specifier: ^8.16.3 version: 8.16.3 + apps/hosted-components: + dependencies: + '@stackframe/react': + specifier: workspace:* + version: link:../../packages/react + '@stackframe/stack-shared': + specifier: workspace:* + version: link:../../packages/stack-shared + '@tanstack/react-router': + specifier: ^1.121.3 + version: 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start': + specifier: ^1.121.3 + version: 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) + '@tanstack/react-start-client': + specifier: ^1.121.3 + version: 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-server': + specifier: ^1.121.3 + version: 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/start-client-core': + specifier: ^1.121.3 + version: 1.163.2 + '@tanstack/start-plugin-core': + specifier: ^1.121.3 + version: 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) + '@tanstack/start-server-core': + specifier: ^1.121.3 + version: 1.163.2 + react: + specifier: ^19.0.1 + version: 19.2.3 + react-dom: + specifier: ^19.0.1 + version: 19.2.3(react@19.2.3) + devDependencies: + '@types/node': + specifier: ^22.13.0 + version: 22.19.0 + '@types/react': + specifier: ^18.2.0 + version: 18.3.12 + '@types/react-dom': + specifier: ^18.2.0 + version: 18.3.1 + '@vitejs/plugin-react': + specifier: ^5.0.0 + version: 5.1.4(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) + typescript: + specifier: 5.9.3 + version: 5.9.3 + vite: + specifier: ^7.0.0 + version: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + vite-tsconfig-paths: + specifier: ^4.3.2 + version: 4.3.2(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) + apps/mock-oauth-server: dependencies: '@types/express': @@ -2634,6 +2692,10 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.2': resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} engines: {node: '>=6.9.0'} @@ -2642,6 +2704,10 @@ packages: resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} @@ -2650,10 +2716,18 @@ packages: resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.28.5': resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + '@babel/generator@8.0.0-rc.1': resolution: {integrity: sha512-3ypWOOiC4AYHKr8vYRVtWtWmyvcoItHtVqF8paFax+ydpmUdPsJpLBkBBs5ItmhdrwC3a0ZSqqFAdzls4ODP3w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2670,6 +2744,10 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.25.0': resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} engines: {node: '>=6.9.0'} @@ -2696,6 +2774,10 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.26.0': resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} @@ -2708,6 +2790,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.24.7': resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} @@ -2762,6 +2850,10 @@ packages: resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.25.6': resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} @@ -2772,6 +2864,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@8.0.0-rc.1': resolution: {integrity: sha512-6HyyU5l1yK/7h9Ki52i5h6mDAx4qJdiLQO4FdCyJNoB/gy3T3GGJdhQzzbZgvgZCugYBvwtQiWRt94QKedHnkA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2784,12 +2881,24 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-private-property-in-object@7.14.5': resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.25.9': resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} @@ -2834,6 +2943,10 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.6': resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} @@ -2842,10 +2955,18 @@ packages: resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + '@babel/types@8.0.0-rc.1': resolution: {integrity: sha512-ubmJ6TShyaD69VE9DQrlXcdkvJbmwWPB8qYj0H2kaJi29O7vJT9ajSdBd2W8CG34pwL9pYA74fi7RHC1qbLoVQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4921,6 +5042,22 @@ packages: '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@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'} + '@openrouter/ai-sdk-provider@0.7.5': resolution: {integrity: sha512-zm8vBhQ+GhxN03Y41xviB0nDa20uN77QnMXsIwDeJPqsul8+KycrYFxY4ulXpumeKxjKyOhfyA7a7CJpcYq2ng==} engines: {node: '>=18'} @@ -7367,6 +7504,9 @@ packages: cpu: [x64] os: [win32] + '@rolldown/pluginutils@1.0.0-beta.40': + resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -8354,6 +8494,10 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + '@tanstack/history@1.161.4': + resolution: {integrity: sha512-Kp/WSt411ZWYvgXy6uiv5RmhHrz9cAml05AQPrtdAp7eUqvIDbMGPnML25OKbzR3RJ1q4wgENxDTvlGPa9+Mww==} + engines: {node: '>=20.19'} + '@tanstack/query-core@5.90.7': resolution: {integrity: sha512-6PN65csiuTNfBMXqQUxQhCNdtm1rV+9kC9YwWAIKcaxAauq3Wu7p18j3gQY3YIBJU70jT/wzCCZ2uqto/vQgiQ==} @@ -8362,6 +8506,41 @@ packages: peerDependencies: react: ^18 || ^19 + '@tanstack/react-router@1.163.2': + resolution: {integrity: sha512-1LosUlpL2mRMWxUZXmkEg5+Br5P5j9TrLngqRgHVbZoFkjnbcj1x9fQN2OVLrBv9Npw97NRsHeJljnAH/c7oSw==} + 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.163.2': + resolution: {integrity: sha512-JBlJflRK9lIkuOySEdwrAAyhbIc3DCrUsLUT59+oX7DntBsFnfWLEhXNtZ58PcSR7G6fprGLF4ASW6VAMmA87g==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + + '@tanstack/react-start-server@1.163.2': + resolution: {integrity: sha512-Qjg4hZf10GlgH+Mod/yrStHvYOb2XkDjzdMUJ+KX63XlZBT/+0mhg90NgqXAIfa1D3g45caCFrGg4Xd+imYpig==} + 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.163.2': + resolution: {integrity: sha512-Y/dxoxH1+YLeRECvMlcHaCgL6YdKXO5D5P5ZInjGAha/GJ0v3KNwS5u+45UZfmQRZXqmilsgaeLEMVV5AvgBnw==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: '>=7.0.0' + + '@tanstack/react-store@0.9.1': + resolution: {integrity: sha512-YzJLnRvy5lIEFTLWBAZmcOjK3+2AepnBv/sr6NZmiqJvq7zTQggyK99Gw8fqYdMdHPQWXjz0epFKJXC+9V2xDA==} + 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/react-table@8.20.5': resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==} engines: {node: '>=12'} @@ -8382,6 +8561,64 @@ packages: 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.163.2': + resolution: {integrity: sha512-mD0Pav6kcpS317XSJN+wCZaxLLngDhlwgzPNca56dWCp8YKPEvhhj/Zdl+LdRlJQ2VJ5BOy7FbOV1hErc9Nj5Q==} + engines: {node: '>=20.19'} + + '@tanstack/router-generator@1.163.2': + resolution: {integrity: sha512-6LjU3+8iKEgt8iOaYCmCnQCs0jsOhc7z8fa1yAYlj3s82uYWv3g5CB9mwv8wZXblXBQWOl+hW4PI6WNjP/CK9w==} + engines: {node: '>=20.19'} + + '@tanstack/router-plugin@1.163.2': + resolution: {integrity: sha512-SrVILMz/c15RYWxIMG+bf/glLbP/O9DUxOg0E7bo9pooBxGPvgWSlEzHNjhVekLhK5l7fiuQZzKsfksVeIEqDA==} + engines: {node: '>=20.19'} + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.163.2 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' + vite-plugin-solid: ^2.11.10 + 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.161.4': + resolution: {integrity: sha512-r8TpjyIZoqrXXaf2DDyjd44gjGBoyE+/oEaaH68yLI9ySPO1gUWmQENZ1MZnmBnpUGN24NOZxdjDLc8npK0SAw==} + engines: {node: '>=20.19'} + + '@tanstack/start-client-core@1.163.2': + resolution: {integrity: sha512-PiOnvd83rqOsyWcN3CxJqoqr41pxM2wAHfchMITKz7rlsX+4J8CWMpHM3yNnLrKRqUnqX3Td9VUV4ueU+4ZCNA==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-fn-stubs@1.161.4': + resolution: {integrity: sha512-b8s6iSQ+ny0P4lGK0n3DKaL6EI7SECG0/89svDeYieVw2+MaFOJVcQo3rU3BUvmuOcIkgkE5IhdzkmzPXH6yfA==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-plugin-core@1.163.2': + resolution: {integrity: sha512-y+ransqRMyvTCLd4xU7feo57YsFT8oX++gKfh8pjNgzZTmkbySKBGv8UmO2mvwaNMkZmPwABYOPz60zd3Ls5DQ==} + engines: {node: '>=22.12.0'} + peerDependencies: + vite: '>=7.0.0' + + '@tanstack/start-server-core@1.163.2': + resolution: {integrity: sha512-2BJzeIuBuHSSQL119vx4MlXktorwOiRqCUaeQOi84LQMbcM78vVl1vWwgU/e/Hjzwz44dwcs5KHaFgfPeRNduA==} + engines: {node: '>=22.12.0'} + + '@tanstack/start-storage-context@1.163.2': + resolution: {integrity: sha512-zBCn0XqrcS0SDjmRjnnxVMLNCpOx6tveCzKvsoI3xwnJ4iIEMyo2HAS4i3qw+EbAaBam2g5skN9OLd46VEY4uw==} + engines: {node: '>=22.12.0'} + + '@tanstack/store@0.9.1': + resolution: {integrity: sha512-+qcNkOy0N1qSGsP7omVCW0SDrXtaDcycPqBDE726yryiA5eTDFpjBReaYjghVJwNf1pcPMyzIwTGlYjCSQR0Fg==} + '@tanstack/table-core@8.20.5': resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} engines: {node: '>=12'} @@ -8393,6 +8630,10 @@ packages: '@tanstack/virtual-core@3.13.18': resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} + '@tanstack/virtual-file-routes@1.161.4': + resolution: {integrity: sha512-42WoRePf8v690qG8yGRe/YOh+oHni9vUaUUfoqlS91U2scd3a5rkLtVsc6b7z60w3RogH0I00vdrC5AaeiZ18w==} + engines: {node: '>=20.19'} + '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} @@ -9047,6 +9288,12 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + '@vitejs/plugin-react@5.1.4': + resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/expect@1.6.0': resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} @@ -9376,6 +9623,10 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -9442,6 +9693,9 @@ packages: b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -10029,6 +10283,9 @@ packages: react: optional: true + cookie-es@2.0.0: + resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -10502,6 +10759,10 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} @@ -11654,6 +11915,16 @@ packages: resolution: {integrity: sha512-LQhmMl1dRQQjMXPzJc7MpZ/CqPOWWuAvVEoVJM9n/s7vHypj+c3Pd5rLQCkAsOgAoAYKbNCsYFE++LF7MvSfCQ==} engines: {node: '>=4', npm: '>=3', yarn: '>=1.3.0'} + h3@2.0.1-rc.14: + resolution: {integrity: sha512-163qbGmTr/9rqQRNuqMqtgXnOUAkE4KTdauiC9y0E5iG1I65kte9NyfWvZw5RTDMt6eY+DtyoNzrQ9wA2BfvGQ==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} @@ -12194,6 +12465,10 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isbot@5.1.35: + resolution: {integrity: sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -12271,6 +12546,10 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsdom@24.1.3: resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==} engines: {node: '>=18'} @@ -14093,6 +14372,10 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -14246,6 +14529,10 @@ packages: resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} @@ -14509,6 +14796,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rou3@0.7.12: + resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==} + roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} @@ -14641,6 +14931,16 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + seroval-plugins@1.5.0: + resolution: {integrity: sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.5.0: + resolution: {integrity: sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw==} + engines: {node: '>=10'} + serve-handler@6.1.6: resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} @@ -14817,6 +15117,11 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} + srvx@0.11.8: + resolution: {integrity: sha512-2n9t0YnAXPJjinytvxccNgs7rOA5gmE7Wowt/8Dy2dx2fDC6sBhfBpbrCvjYKALlVukPS/Uq3QwkolKNa7P/2Q==} + engines: {node: '>=20.16.0'} + hasBin: true + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -15175,6 +15480,9 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -15505,6 +15813,10 @@ packages: unplugin@1.0.1: resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + unrun@0.2.27: resolution: {integrity: sha512-Mmur1UJpIbfxasLOhPRvox/QS4xBiDii71hMP7smfRthGcwFL2OAmYRgduLANOAU4LUkvVamuP+02U+c90jlrw==} engines: {node: '>=20.19.0'} @@ -15841,6 +16153,14 @@ packages: yaml: optional: true + vitefu@1.1.2: + resolution: {integrity: sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + vitest@1.6.0: resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -15926,6 +16246,9 @@ packages: webpack-virtual-modules@0.5.0: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webpack@5.92.0: resolution: {integrity: sha512-Bsw2X39MYIgxouNATyVpCNVWBCuUwDgWtN78g6lSdPJRLaQ/PUVm/oXcaRAyY/sMFoKFQrsPeqvTizWtq7QPCA==} engines: {node: '>=10.13.0'} @@ -16064,6 +16387,10 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} + xmlbuilder2@4.0.3: + resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==} + engines: {node: '>=20.0'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -16310,7 +16637,7 @@ snapshots: dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 - js-yaml: 4.1.0 + js-yaml: 4.1.1 '@assistant-ui/react-ai-sdk@0.10.14(@assistant-ui/react@0.10.24(@types/react-dom@18.3.1)(@types/react@18.3.12)(immer@9.0.21)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3)))(@types/react-dom@18.3.1)(@types/react@18.3.12)(immer@9.0.21)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3))': dependencies: @@ -17182,10 +17509,18 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.26.2': {} '@babel/compat-data@7.28.0': {} + '@babel/compat-data@7.29.0': {} + '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 @@ -17226,6 +17561,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@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.28.5': dependencies: '@babel/parser': 7.28.5 @@ -17234,6 +17589,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + '@babel/generator@8.0.0-rc.1': dependencies: '@babel/parser': 8.0.0-rc.1 @@ -17263,13 +17626,21 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.28.5)': + '@babel/helper-compilation-targets@7.28.6': dependencies: - '@babel/core': 7.28.5 + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.27.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.28.5) + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.29.0) '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 '@babel/traverse': 7.28.5 semver: 6.3.1 @@ -17306,6 +17677,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -17324,6 +17702,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.24.7': dependencies: '@babel/types': 7.28.5 @@ -17332,9 +17719,9 @@ snapshots: '@babel/helper-plugin-utils@7.28.6': {} - '@babel/helper-replace-supers@7.25.0(@babel/core@7.28.5)': + '@babel/helper-replace-supers@7.25.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 '@babel/traverse': 7.28.5 @@ -17370,6 +17757,11 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.5 + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + '@babel/parser@7.25.6': dependencies: '@babel/types': 7.28.5 @@ -17378,21 +17770,35 @@ snapshots: dependencies: '@babel/types': 7.28.5 + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + '@babel/parser@8.0.0-rc.1': dependencies: '@babel/types': 8.0.0-rc.1 - '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.28.5)': + '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.28.5) + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5)': + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.28.6 @@ -17405,7 +17811,12 @@ snapshots: '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': dependencies: @@ -17415,7 +17826,12 @@ snapshots: '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 '@babel/runtime@7.24.7': dependencies: @@ -17439,6 +17855,12 @@ snapshots: '@babel/parser': 7.28.5 '@babel/types': 7.28.5 + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@babel/traverse@7.25.6': dependencies: '@babel/code-frame': 7.27.1 @@ -17463,11 +17885,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@8.0.0-rc.1': dependencies: '@babel/helper-string-parser': 8.0.0-rc.2 @@ -18541,7 +18980,7 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -19105,6 +19544,23 @@ snapshots: '@one-ini/wasm@0.1.1': {} + '@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': {} + '@openrouter/ai-sdk-provider@0.7.5(ai@4.3.17(react@18.3.1)(zod@3.25.76))(zod@3.25.76)': dependencies: '@ai-sdk/provider': 1.1.3 @@ -22987,6 +23443,8 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.0-rc.3': optional: true + '@rolldown/pluginutils@1.0.0-beta.40': {} + '@rolldown/pluginutils@1.0.0-rc.3': {} '@rollup/plugin-commonjs@28.0.1(rollup@4.50.1)': @@ -23366,7 +23824,7 @@ snapshots: - supports-color - webpack - '@sentry/nextjs@10.11.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(webpack@5.92.0(esbuild@0.24.2))': + '@sentry/nextjs@10.11.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(webpack@5.92.0(esbuild@0.24.2))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.37.0 @@ -23380,7 +23838,7 @@ snapshots: '@sentry/vercel-edge': 10.11.0 '@sentry/webpack-plugin': 4.3.0(encoding@0.1.13)(webpack@5.92.0(esbuild@0.24.2)) chalk: 3.0.0 - next: 16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) resolve: 1.22.8 rollup: 4.50.1 stacktrace-parser: 0.1.11 @@ -24118,6 +24576,8 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.18(tsx@4.21.0)(yaml@2.8.0) + '@tanstack/history@1.161.4': {} + '@tanstack/query-core@5.90.7': {} '@tanstack/react-query@5.90.7(react@18.3.1)': @@ -24125,6 +24585,66 @@ snapshots: '@tanstack/query-core': 5.90.7 react: 18.3.1 + '@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/history': 1.161.4 + '@tanstack/react-store': 0.9.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.163.2 + isbot: 5.1.35 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/react-start-client@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/react-router': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.163.2 + '@tanstack/start-client-core': 1.163.2 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/react-start-server@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/history': 1.161.4 + '@tanstack/react-router': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.163.2 + '@tanstack/start-client-core': 1.163.2 + '@tanstack/start-server-core': 1.163.2 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - crossws + + '@tanstack/react-start@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))': + dependencies: + '@tanstack/react-router': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-client': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-server': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-utils': 1.161.4 + '@tanstack/start-client-core': 1.163.2 + '@tanstack/start-plugin-core': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) + '@tanstack/start-server-core': 1.163.2 + pathe: 2.0.3 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + transitivePeerDependencies: + - '@rsbuild/core' + - crossws + - supports-color + - vite-plugin-solid + - webpack + + '@tanstack/react-store@0.9.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/store': 0.9.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + use-sync-external-store: 1.6.0(react@19.2.3) + '@tanstack/react-table@8.20.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/table-core': 8.20.5 @@ -24155,12 +24675,134 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) + '@tanstack/router-core@1.163.2': + dependencies: + '@tanstack/history': 1.161.4 + '@tanstack/store': 0.9.1 + cookie-es: 2.0.0 + seroval: 1.5.0 + seroval-plugins: 1.5.0(seroval@1.5.0) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/router-generator@1.163.2': + dependencies: + '@tanstack/router-core': 1.163.2 + '@tanstack/router-utils': 1.161.4 + '@tanstack/virtual-file-routes': 1.161.4 + prettier: 3.5.3 + recast: 0.23.11 + source-map: 0.7.6 + tsx: 4.21.0 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.28.5) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@tanstack/router-core': 1.163.2 + '@tanstack/router-generator': 1.163.2 + '@tanstack/router-utils': 1.161.4 + '@tanstack/virtual-file-routes': 1.161.4 + chokidar: 3.6.0 + unplugin: 2.3.11 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + webpack: 5.92.0(esbuild@0.24.2) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.161.4': + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + ansis: 4.2.0 + babel-dead-code-elimination: 1.0.12 + diff: 8.0.3 + pathe: 2.0.3 + tinyglobby: 0.2.15 + transitivePeerDependencies: + - supports-color + + '@tanstack/start-client-core@1.163.2': + dependencies: + '@tanstack/router-core': 1.163.2 + '@tanstack/start-fn-stubs': 1.161.4 + '@tanstack/start-storage-context': 1.163.2 + seroval: 1.5.0 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/start-fn-stubs@1.161.4': {} + + '@tanstack/start-plugin-core@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.5 + '@babel/types': 7.28.5 + '@rolldown/pluginutils': 1.0.0-beta.40 + '@tanstack/router-core': 1.163.2 + '@tanstack/router-generator': 1.163.2 + '@tanstack/router-plugin': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) + '@tanstack/router-utils': 1.161.4 + '@tanstack/start-client-core': 1.163.2 + '@tanstack/start-server-core': 1.163.2 + cheerio: 1.0.0 + exsolve: 1.0.8 + pathe: 2.0.3 + picomatch: 4.0.3 + source-map: 0.7.6 + srvx: 0.11.8 + tinyglobby: 0.2.15 + ufo: 1.5.4 + vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + vitefu: 1.1.2(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) + xmlbuilder2: 4.0.3 + zod: 3.25.76 + transitivePeerDependencies: + - '@rsbuild/core' + - '@tanstack/react-router' + - crossws + - supports-color + - vite-plugin-solid + - webpack + + '@tanstack/start-server-core@1.163.2': + dependencies: + '@tanstack/history': 1.161.4 + '@tanstack/router-core': 1.163.2 + '@tanstack/start-client-core': 1.163.2 + '@tanstack/start-storage-context': 1.163.2 + h3-v2: h3@2.0.1-rc.14 + seroval: 1.5.0 + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - crossws + + '@tanstack/start-storage-context@1.163.2': + dependencies: + '@tanstack/router-core': 1.163.2 + + '@tanstack/store@0.9.1': {} + '@tanstack/table-core@8.20.5': {} '@tanstack/table-core@8.21.3': {} '@tanstack/virtual-core@3.13.18': {} + '@tanstack/virtual-file-routes@1.161.4': {} + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.27.1 @@ -24672,7 +25314,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 20.17.6 + '@types/node': 22.19.0 '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': dependencies: @@ -24906,11 +25548,11 @@ snapshots: jose: 5.6.3 neverthrow: 7.2.0 - '@vercel/analytics@1.3.1(next@16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)': + '@vercel/analytics@1.3.1(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)': dependencies: server-only: 0.0.1 optionalDependencies: - next: 16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 '@vercel/functions@2.0.0(@aws-sdk/credential-provider-web-identity@3.876.0)': @@ -24948,9 +25590,9 @@ snapshots: xdg-app-paths: 5.1.0 zod: 3.24.4 - '@vercel/speed-insights@1.0.12(next@16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)': + '@vercel/speed-insights@1.0.12(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)': optionalDependencies: - next: 16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 '@vitejs/plugin-react@4.3.3(vite@7.3.1(@types/node@20.17.6)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.19.3)(yaml@2.6.0))': @@ -24986,6 +25628,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.3 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + '@vitest/expect@1.6.0': dependencies: '@vitest/spy': 1.6.0 @@ -25392,6 +26046,10 @@ snapshots: ast-types-flow@0.0.8: {} + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + astring@1.9.0: {} async-mutex@0.5.0: @@ -25488,6 +26146,15 @@ snapshots: b4a@1.6.6: {} + babel-dead-code-elimination@1.0.12: + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.28.4 @@ -26143,6 +26810,8 @@ snapshots: optionalDependencies: react: 19.2.3 + cookie-es@2.0.0: {} + cookie-signature@1.0.6: {} cookie-signature@1.2.2: {} @@ -26589,6 +27258,8 @@ snapshots: diff-sequences@29.6.3: {} + diff@8.0.3: {} + dijkstrajs@1.0.3: {} dir-glob@3.0.1: @@ -28296,9 +28967,9 @@ snapshots: - encoding - supports-color - geist@1.3.0(next@16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)): + geist@1.3.0(next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)): dependencies: - next: 16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) generate-function@2.3.1: dependencies: @@ -28524,6 +29195,11 @@ snapshots: h3-js@4.1.0: {} + h3@2.0.1-rc.14: + dependencies: + rou3: 0.7.12 + srvx: 0.11.8 + hachure-fill@0.5.2: {} handlebars@4.7.8: @@ -28812,9 +29488,9 @@ snapshots: ieee754@1.2.1: {} - iframe-resizer-react@1.1.1(@babel/core@7.28.5)(prop-types@15.8.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + iframe-resizer-react@1.1.1(@babel/core@7.29.0)(prop-types@15.8.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.28.5) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.29.0) iframe-resizer: 4.4.5 prop-types: 15.8.1 react: 19.2.3 @@ -29115,6 +29791,8 @@ snapshots: isarray@2.0.5: {} + isbot@5.1.35: {} + isexe@2.0.0: {} iterator.prototype@1.1.3: @@ -29151,7 +29829,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.17.6 + '@types/node': 22.19.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -29198,6 +29876,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsdom@24.1.3: dependencies: cssstyle: 4.1.0 @@ -30503,7 +31185,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@16.1.5(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@16.1.5(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 16.1.5 '@swc/helpers': 0.5.15 @@ -30512,7 +31194,7 @@ snapshots: postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.3) + styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.3) optionalDependencies: '@next/swc-darwin-arm64': 16.1.5 '@next/swc-darwin-x64': 16.1.5 @@ -31524,6 +32206,8 @@ snapshots: react-refresh@0.14.2: {} + react-refresh@0.18.0: {} + react-remove-scroll-bar@2.3.8(@types/react@18.3.12)(react@18.3.1): dependencies: react: 18.3.1 @@ -31761,6 +32445,14 @@ snapshots: readdirp@4.0.2: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 @@ -32175,6 +32867,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 + rou3@0.7.12: {} + roughjs@4.6.6: dependencies: hachure-fill: 0.5.2 @@ -32336,6 +33030,12 @@ snapshots: dependencies: randombytes: 2.1.0 + seroval-plugins@1.5.0(seroval@1.5.0): + dependencies: + seroval: 1.5.0 + + seroval@1.5.0: {} + serve-handler@6.1.6: dependencies: bytes: 3.0.0 @@ -32568,6 +33268,8 @@ snapshots: sqlstring@2.3.3: {} + srvx@0.11.8: {} + stackback@0.0.2: {} stacktrace-parser@0.1.11: @@ -32776,12 +33478,12 @@ snapshots: optionalDependencies: '@babel/core': 7.28.5 - styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.3): + styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.3): dependencies: client-only: 0.0.1 react: 19.2.3 optionalDependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 stylis@4.2.0: {} @@ -32818,9 +33520,9 @@ snapshots: transitivePeerDependencies: - encoding - svix-react@1.13.0(@babel/core@7.28.5)(prop-types@15.8.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svix@1.32.0(encoding@0.1.13)): + svix-react@1.13.0(@babel/core@7.29.0)(prop-types@15.8.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(svix@1.32.0(encoding@0.1.13)): dependencies: - iframe-resizer-react: 1.1.1(@babel/core@7.28.5)(prop-types@15.8.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + iframe-resizer-react: 1.1.1(@babel/core@7.29.0)(prop-types@15.8.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) svix: 1.32.0(encoding@0.1.13) @@ -33096,6 +33798,8 @@ snapshots: tiny-invariant@1.3.3: {} + tiny-warning@1.0.3: {} + tinybench@2.9.0: {} tinycolor2@1.6.0: {} @@ -33423,6 +34127,13 @@ snapshots: webpack-sources: 3.3.3 webpack-virtual-modules: 0.5.0 + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + unrun@0.2.27: dependencies: rolldown: 1.0.0-rc.3 @@ -33548,7 +34259,6 @@ snapshots: use-sync-external-store@1.6.0(react@19.2.3): dependencies: react: 19.2.3 - optional: true util-deprecate@1.0.2: {} @@ -33681,6 +34391,17 @@ snapshots: - supports-color - typescript + vite-tsconfig-paths@4.3.2(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)): + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.9.3) + optionalDependencies: + vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + - typescript + vite@5.4.14(@types/node@20.17.6)(lightningcss@1.30.1)(terser@5.44.0): dependencies: esbuild: 0.21.5 @@ -33759,6 +34480,27 @@ snapshots: tsx: 4.19.3 yaml: 2.6.0 + vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0): + dependencies: + esbuild: 0.27.1 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.19.0 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + terser: 5.44.0 + tsx: 4.21.0 + yaml: 2.8.0 + + vitefu@1.1.2(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)): + optionalDependencies: + vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + vitest@1.6.0(@types/node@20.17.6)(jsdom@24.1.3)(lightningcss@1.30.1)(terser@5.44.0): dependencies: '@vitest/expect': 1.6.0 @@ -33855,6 +34597,8 @@ snapshots: webpack-virtual-modules@0.5.0: {} + webpack-virtual-modules@0.6.2: {} + webpack@5.92.0(esbuild@0.24.2): dependencies: '@types/eslint-scope': 3.7.7 @@ -34015,6 +34759,13 @@ snapshots: xml-name-validator@5.0.0: {} + xmlbuilder2@4.0.3: + dependencies: + '@oozcitak/dom': 2.0.2 + '@oozcitak/infra': 2.0.2 + '@oozcitak/util': 10.0.0 + js-yaml: 4.1.1 + xmlchars@2.2.0: {} xtend@4.0.2: {} From 201bb2496b84e7157c806186394ac1cd4053bdde Mon Sep 17 00:00:00 2001 From: Bilal Godil Date: Mon, 2 Mar 2026 10:11:18 -0800 Subject: [PATCH 2/4] fix test --- apps/hosted-components/package.json | 3 ++- apps/hosted-components/vite.config.ts | 2 +- vitest.workspace.ts | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/hosted-components/package.json b/apps/hosted-components/package.json index 901feeb8c9..a36f286a4e 100644 --- a/apps/hosted-components/package.json +++ b/apps/hosted-components/package.json @@ -8,7 +8,8 @@ "build": "vite build", "start": "node .output/server/index.mjs", "lint": "eslint --ext .ts,.tsx .", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "clean": "rimraf .output && rimraf node_modules" }, "dependencies": { "@stackframe/react": "workspace:*", diff --git a/apps/hosted-components/vite.config.ts b/apps/hosted-components/vite.config.ts index 730d539fa7..80ba6617be 100644 --- a/apps/hosted-components/vite.config.ts +++ b/apps/hosted-components/vite.config.ts @@ -5,7 +5,7 @@ import viteReact from '@vitejs/plugin-react' export default defineConfig({ server: { - port: 8105, + port: Number((process.env.NEXT_PUBLIC_STACK_PORT_PREFIX || "81") + "09"), }, resolve: { dedupe: ['react', 'react-dom'], diff --git a/vitest.workspace.ts b/vitest.workspace.ts index 1a10cc4e23..5e1dec68cd 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -3,6 +3,7 @@ import { defineWorkspace } from 'vitest/config'; export default defineWorkspace([ 'packages/*', 'apps/*', + '!apps/hosted-components', 'docs', 'examples/*', ]); From a813ca750a4e8859ebb1e5bd0a13b3d7988a6b55 Mon Sep 17 00:00:00 2001 From: Konstantin Wohlwend Date: Mon, 9 Mar 2026 20:19:01 -0700 Subject: [PATCH 3/4] Add SSR monkey patch --- apps/hosted-components/.env.development | 2 +- apps/hosted-components/package.json | 8 +- apps/hosted-components/src/routes/__root.tsx | 6 +- apps/hosted-components/src/routes/index.tsx | 2 +- apps/hosted-components/vite.config.ts | 10 +-- .../stack-shared/src/utils/monkey-patch.tsx | 29 +++++++ packages/stack-shared/src/utils/react.tsx | 10 ++- pnpm-lock.yaml | 85 ++++++++++--------- 8 files changed, 94 insertions(+), 58 deletions(-) create mode 100644 packages/stack-shared/src/utils/monkey-patch.tsx diff --git a/apps/hosted-components/.env.development b/apps/hosted-components/.env.development index 6e379fd025..866c463717 100644 --- a/apps/hosted-components/.env.development +++ b/apps/hosted-components/.env.development @@ -1 +1 @@ -VITE_STACK_API_URL=http://localhost:8102 +VITE_STACK_API_URL=http://localhost:9102 diff --git a/apps/hosted-components/package.json b/apps/hosted-components/package.json index a36f286a4e..de57b212ca 100644 --- a/apps/hosted-components/package.json +++ b/apps/hosted-components/package.json @@ -21,13 +21,13 @@ "@tanstack/start-client-core": "^1.121.3", "@tanstack/start-server-core": "^1.121.3", "@tanstack/start-plugin-core": "^1.121.3", - "react": "^19.0.1", - "react-dom": "^19.0.1" + "react": "19.2.1", + "react-dom": "19.2.1" }, "devDependencies": { "@types/node": "^22.13.0", - "@types/react": "^19.0.8", - "@types/react-dom": "^19.0.3", + "@types/react": "19.2.1", + "@types/react-dom": "19.2.1", "@vitejs/plugin-react": "^5.0.0", "typescript": "5.9.3", "vite": "^7.0.0", diff --git a/apps/hosted-components/src/routes/__root.tsx b/apps/hosted-components/src/routes/__root.tsx index 75454b20f1..24a20f9d1e 100644 --- a/apps/hosted-components/src/routes/__root.tsx +++ b/apps/hosted-components/src/routes/__root.tsx @@ -1,4 +1,5 @@ /// +import { StackClientApp, StackProvider, StackTheme } from '@stackframe/react'; import { HeadContent, Outlet, @@ -6,9 +7,8 @@ import { createRootRoute, useNavigate } from '@tanstack/react-router'; -import { Component, useEffect, useMemo, useState } from 'react'; import type { ErrorInfo, ReactNode } from 'react'; -import { StackClientApp, StackProvider, StackTheme } from '@stackframe/react'; +import { Component, useEffect, useMemo, useState } from 'react'; export function getProjectId(): string | null { @@ -86,7 +86,7 @@ function RootDocument({ children }: { children: ReactNode }) { } function RootComponent() { - const [projectId, setProjectId] = useState(undefined); + const [projectId, setProjectId] = useState("internal"); useEffect(() => { setProjectId(getProjectId()); diff --git a/apps/hosted-components/src/routes/index.tsx b/apps/hosted-components/src/routes/index.tsx index 0ce0219892..bc5920af93 100644 --- a/apps/hosted-components/src/routes/index.tsx +++ b/apps/hosted-components/src/routes/index.tsx @@ -1,5 +1,5 @@ -import { createFileRoute } from '@tanstack/react-router'; import { UserButton, useUser } from "@stackframe/react"; +import { createFileRoute } from '@tanstack/react-router'; export const Route = createFileRoute('/')({ component: HandlerPage, diff --git a/apps/hosted-components/vite.config.ts b/apps/hosted-components/vite.config.ts index 80ba6617be..2180f4ca3e 100644 --- a/apps/hosted-components/vite.config.ts +++ b/apps/hosted-components/vite.config.ts @@ -1,7 +1,7 @@ -import { defineConfig } from 'vite' -import tsConfigPaths from 'vite-tsconfig-paths' import { tanstackStart } from '@tanstack/react-start/plugin/vite' import viteReact from '@vitejs/plugin-react' +import { defineConfig } from 'vite' +import tsConfigPaths from 'vite-tsconfig-paths' export default defineConfig({ server: { @@ -15,11 +15,7 @@ export default defineConfig({ }, plugins: [ tsConfigPaths(), - tanstackStart({ - spa: { - enabled: true, - }, - }), + tanstackStart(), // react's vite plugin must come after start's vite plugin viteReact(), ], diff --git a/packages/stack-shared/src/utils/monkey-patch.tsx b/packages/stack-shared/src/utils/monkey-patch.tsx new file mode 100644 index 0000000000..098aa8d029 --- /dev/null +++ b/packages/stack-shared/src/utils/monkey-patch.tsx @@ -0,0 +1,29 @@ +import { createGlobal } from "./globals"; + +export const NO_SUSPENSE_BOUNDARY_ERROR_SENTINEL = "__stack-no-suspense-boundary-error__"; + +export function isNoSuspenseBoundaryError(value: unknown): boolean { + return ( + typeof value === "object" + && value !== null + && (value as Record).__noSuspenseBoundarySentinel === NO_SUSPENSE_BOUNDARY_ERROR_SENTINEL + ); +} + +export function ensureMonkeyPatch() { + createGlobal("__console-error-monkey-patch__", () => { + const originalConsoleError = console.error; + console.error = function (...args: unknown[]) { + // React's default error handlers will log all errors to the console, even those that we intentionally use to suppress SSR. + // Next.js among others override the default error handler and will not log SSR errors to the console. + // However, vanilla React and other frameworks like TanStack Start use the default error handler. + // Hence, we suppress the error here if it is a NoSuspenseBoundaryError. + // It's very cursed, but it's really our best option. Talk to @konsti if you want to know more. + if (args.length === 1 && isNoSuspenseBoundaryError(args[0])) { + return; + } + return originalConsoleError.apply(this, args); + }; + return true; + }); +} diff --git a/packages/stack-shared/src/utils/react.tsx b/packages/stack-shared/src/utils/react.tsx index 0694f46105..f0a521f7ea 100644 --- a/packages/stack-shared/src/utils/react.tsx +++ b/packages/stack-shared/src/utils/react.tsx @@ -2,6 +2,7 @@ import React, { SetStateAction } from "react"; import { isBrowserLike } from "./env"; import { neverResolve, runAsynchronously } from "./promises"; import { AsyncResult } from "./results"; +import { ensureMonkeyPatch, NO_SUSPENSE_BOUNDARY_ERROR_SENTINEL } from "./monkey-patch"; import { deindent } from "./strings"; export function componentWrapper< @@ -233,14 +234,17 @@ export function shouldRethrowRenderingError(error: unknown): boolean { export class NoSuspenseBoundaryError extends Error { digest: string; reason: string; + __noSuspenseBoundarySentinel = NO_SUSPENSE_BOUNDARY_ERROR_SENTINEL; constructor(options: { caller?: string }) { + ensureMonkeyPatch(); + super(deindent` - Suspense boundary not found! Read the error message below carefully on how to fix it. + Suspense boundary not found! Read the error message below carefully (or paste it into your AI agent). ${options.caller ?? "This code path"} attempted to display a loading indicator, but didn't find a Suspense boundary above it. Please read the error message below carefully. - The fix depends on which of the 4 scenarios caused it: + There are several potential causes: 1. [Next.js] You are missing a loading.tsx file in your app directory. Fix it by adding a loading.tsx file in your app directory. @@ -260,6 +264,8 @@ export class NoSuspenseBoundaryError extends Error { 4. You caught this error with try-catch or a custom error boundary. Fix this by rethrowing the error or not catching it in the first place. + 5. Your version of Stack Auth is too old. Upgrade to the latest version to see if that fixes the issue. + See: https://nextjs.org/docs/messages/missing-suspense-with-csr-bailout More information on SSR and Suspense boundaries: https://react.dev/reference/react/Suspense#providing-a-fallback-for-server-errors-and-client-only-content diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f7ad96e51..4c3689f42f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -698,31 +698,31 @@ importers: version: link:../../packages/stack-shared '@tanstack/react-router': specifier: ^1.121.3 - version: 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/react-start': specifier: ^1.121.3 - version: 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) + version: 1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) '@tanstack/react-start-client': specifier: ^1.121.3 - version: 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/react-start-server': specifier: ^1.121.3 - version: 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/start-client-core': specifier: ^1.121.3 version: 1.163.2 '@tanstack/start-plugin-core': specifier: ^1.121.3 - version: 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) + version: 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) '@tanstack/start-server-core': specifier: ^1.121.3 version: 1.163.2 react: - specifier: ^19.0.1 - version: 19.2.3 + specifier: 19.2.1 + version: 19.2.1 react-dom: - specifier: ^19.0.1 - version: 19.2.3(react@19.2.3) + specifier: 19.2.1 + version: 19.2.1(react@19.2.1) devDependencies: '@types/node': specifier: ^22.13.0 @@ -24620,51 +24620,51 @@ snapshots: '@tanstack/query-core': 5.90.7 react: 18.3.1 - '@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-router@1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/history': 1.161.4 - '@tanstack/react-store': 0.9.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-store': 0.9.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/router-core': 1.163.2 isbot: 5.1.35 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-client@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-start-client@1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: - '@tanstack/react-router': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-router': 1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/router-core': 1.163.2 '@tanstack/start-client-core': 1.163.2 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-server@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-start-server@1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/history': 1.161.4 - '@tanstack/react-router': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-router': 1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/router-core': 1.163.2 '@tanstack/start-client-core': 1.163.2 '@tanstack/start-server-core': 1.163.2 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))': + '@tanstack/react-start@1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))': dependencies: - '@tanstack/react-router': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-client': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-server': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-router': 1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-client': 1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-server': 1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/router-utils': 1.161.4 '@tanstack/start-client-core': 1.163.2 - '@tanstack/start-plugin-core': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) + '@tanstack/start-plugin-core': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) '@tanstack/start-server-core': 1.163.2 pathe: 2.0.3 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) transitivePeerDependencies: - '@rsbuild/core' @@ -24673,12 +24673,12 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-store@0.9.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-store@0.9.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/store': 0.9.1 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - use-sync-external-store: 1.6.0(react@19.2.3) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + use-sync-external-store: 1.6.0(react@19.2.1) '@tanstack/react-table@8.20.5(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: @@ -24733,7 +24733,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))': + '@tanstack/router-plugin@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.5) @@ -24749,7 +24749,7 @@ snapshots: unplugin: 2.3.11 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-router': 1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) webpack: 5.92.0(esbuild@0.24.2) transitivePeerDependencies: @@ -24780,7 +24780,7 @@ snapshots: '@tanstack/start-fn-stubs@1.161.4': {} - '@tanstack/start-plugin-core@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))': + '@tanstack/start-plugin-core@1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.5 @@ -24788,7 +24788,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.163.2 '@tanstack/router-generator': 1.163.2 - '@tanstack/router-plugin': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) + '@tanstack/router-plugin': 1.163.2(@tanstack/react-router@1.163.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2)) '@tanstack/router-utils': 1.161.4 '@tanstack/start-client-core': 1.163.2 '@tanstack/start-server-core': 1.163.2 @@ -27894,7 +27894,7 @@ snapshots: eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.2(eslint@8.57.1) eslint-plugin-react-hooks: 5.1.0(eslint@8.57.1) @@ -27918,7 +27918,7 @@ snapshots: debug: 4.4.3 enhanced-resolve: 5.17.0 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.13.6 @@ -27968,7 +27968,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -28028,7 +28028,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -34292,9 +34292,14 @@ snapshots: dependencies: react: 19.2.3 + use-sync-external-store@1.6.0(react@19.2.1): + dependencies: + react: 19.2.1 + use-sync-external-store@1.6.0(react@19.2.3): dependencies: react: 19.2.3 + optional: true util-deprecate@1.0.2: {} From 3072d970724a24a3b5ae2bb37bc580a3992276c5 Mon Sep 17 00:00:00 2001 From: Bilal Godil Date: Tue, 10 Mar 2026 10:45:29 -0700 Subject: [PATCH 4/4] hosted component fixes --- apps/hosted-components/.env.development | 2 +- apps/hosted-components/src/routes/__root.tsx | 2 +- .../src/routes/handler/$.tsx | 4 ++ apps/hosted-components/vite.config.ts | 70 ++++++++++++++++++- 4 files changed, 75 insertions(+), 3 deletions(-) diff --git a/apps/hosted-components/.env.development b/apps/hosted-components/.env.development index 866c463717..546412669a 100644 --- a/apps/hosted-components/.env.development +++ b/apps/hosted-components/.env.development @@ -1 +1 @@ -VITE_STACK_API_URL=http://localhost:9102 +VITE_STACK_API_URL=http://localhost:${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}02 diff --git a/apps/hosted-components/src/routes/__root.tsx b/apps/hosted-components/src/routes/__root.tsx index 24a20f9d1e..c22240562f 100644 --- a/apps/hosted-components/src/routes/__root.tsx +++ b/apps/hosted-components/src/routes/__root.tsx @@ -117,7 +117,7 @@ function RootComponent() { } if (!projectId) { - return .localhost:8105.`} />; + return .${window.location.host}.`} />; } if (!isValidProjectId) { diff --git a/apps/hosted-components/src/routes/handler/$.tsx b/apps/hosted-components/src/routes/handler/$.tsx index ecca531af7..87df4aa166 100644 --- a/apps/hosted-components/src/routes/handler/$.tsx +++ b/apps/hosted-components/src/routes/handler/$.tsx @@ -1,10 +1,14 @@ import { createFileRoute } from '@tanstack/react-router'; import { StackHandler } from '@stackframe/react'; +import { useState, useEffect } from 'react'; export const Route = createFileRoute('/handler/$')({ component: HandlerPage, }); function HandlerPage() { + const [isMounted, setIsMounted] = useState(false); + useEffect(() => setIsMounted(true), []); + if (!isMounted) return null; return ; } diff --git a/apps/hosted-components/vite.config.ts b/apps/hosted-components/vite.config.ts index 2180f4ca3e..cd92fb9822 100644 --- a/apps/hosted-components/vite.config.ts +++ b/apps/hosted-components/vite.config.ts @@ -1,8 +1,74 @@ +import fs from 'node:fs' +import path from 'node:path' import { tanstackStart } from '@tanstack/react-start/plugin/vite' import viteReact from '@vitejs/plugin-react' -import { defineConfig } from 'vite' +import { defineConfig, type Plugin } from 'vite' import tsConfigPaths from 'vite-tsconfig-paths' +/** + * Makes Vite watch specific packages inside node_modules for changes. + * By default Vite/chokidar ignores all of node_modules. This plugin uses + * the `config()` hook to inject negation patterns before chokidar is + * initialized, which is the only reliable way to un-ignore specific packages. + * See: https://github.com/vitejs/vite/issues/8619 + */ +function watchNodeModules(modules: string[]): Plugin { + return { + name: 'watch-node-modules', + config() { + return { + server: { + watch: { + ignored: modules.map((m) => `!**/node_modules/${m}/**`), + }, + }, + } + }, + } +} + +/** + * Waits for workspace package dist directories to exist before letting + * Vite resolve them. Fixes the race condition where `pnpm dev` starts + * hosted-components before dependency packages have finished their + * initial build (eg. after `rimraf dist` in their dev script). + */ +function waitForWorkspacePackages(packages: string[]): Plugin { + const packageDistEntries = packages.map((pkg) => ({ + name: pkg, + entry: path.resolve(__dirname, 'node_modules', pkg, 'dist', 'esm', 'index.js'), + })) + + async function waitForFile(filePath: string, timeoutMs = 60_000): Promise { + if (fs.existsSync(filePath)) return + const start = Date.now() + return new Promise((resolve, reject) => { + const interval = setInterval(() => { + if (fs.existsSync(filePath)) { + clearInterval(interval) + resolve() + } else if (Date.now() - start > timeoutMs) { + clearInterval(interval) + reject(new Error(`Timed out waiting for ${filePath} to exist`)) + } + }, 500) + }) + } + + return { + name: 'wait-for-workspace-packages', + enforce: 'pre', + async buildStart() { + const missing = packageDistEntries.filter((p) => !fs.existsSync(p.entry)) + if (missing.length > 0) { + console.log(`Waiting for workspace packages to build: ${missing.map((p) => p.name).join(', ')}`) + await Promise.all(missing.map((p) => waitForFile(p.entry))) + console.log('All workspace packages are ready.') + } + }, + } +} + export default defineConfig({ server: { port: Number((process.env.NEXT_PUBLIC_STACK_PORT_PREFIX || "81") + "09"), @@ -14,6 +80,8 @@ export default defineConfig({ exclude: ['@stackframe/react', '@stackframe/stack-shared'], }, plugins: [ + waitForWorkspacePackages(['@stackframe/react', '@stackframe/stack-shared']), + watchNodeModules(['@stackframe/react', '@stackframe/stack-shared']), tsConfigPaths(), tanstackStart(), // react's vite plugin must come after start's vite plugin