From 366072ea1c3b25fd5677ca1140415b3cc552eaa8 Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Wed, 29 Apr 2026 21:36:18 -0700 Subject: [PATCH 01/11] Add TanStack Start SDK integration --- .claude/CLAUDE-KNOWLEDGE.md | 3 + .gitignore | 2 + packages/tanstack-start/package.json | 115 ++ packages/template/package-template.json | 18 + packages/template/package.json | 12 +- .../components-page/stack-handler-client.tsx | 2 +- packages/template/src/lib/cookie.ts | 64 + .../apps/implementations/client-app-impl.ts | 12 +- pnpm-lock.yaml | 1093 +++++++++++++---- scripts/generate-sdks.ts | 8 + scripts/utils.ts | 3 +- turbo.json | 1 + 12 files changed, 1120 insertions(+), 213 deletions(-) create mode 100644 packages/tanstack-start/package.json diff --git a/.claude/CLAUDE-KNOWLEDGE.md b/.claude/CLAUDE-KNOWLEDGE.md index 17a34543b9..3617859374 100644 --- a/.claude/CLAUDE-KNOWLEDGE.md +++ b/.claude/CLAUDE-KNOWLEDGE.md @@ -361,3 +361,6 @@ A: Invalid `tools` entries are rejected by `requestBodySchema` in `apps/backend/ ## Q: Why did the internal metrics E2E snapshots need to change in April 2026? A: The `/api/v1/internal/metrics` response now intentionally includes `analytics_overview.daily_anonymous_visitors_fallback`, `analytics_overview.anonymous_visitors_fallback`, and `active_users_by_country`. Those additions are reflected in `packages/stack-shared/src/interface/admin-metrics.ts` and the backend route, so the E2E snapshots must include them instead of treating them as regressions. + +## Q: How should a TanStack Start SDK package be added without dragging Dashboard V2 logic into the same PR? +A: Keep the integration PR scoped to generated package registration (`packages/tanstack-start/package.json`, `.gitignore`, `scripts/generate-sdks.ts`, `scripts/utils.ts`), template/package dependency metadata, and SDK runtime changes needed by TanStack Start (`cookie.ts`, token-store handling, handler SSR guard). Leave dashboard routes, hooks, app wiring, and admin API types in the dashboard PR. diff --git a/.gitignore b/.gitignore index 8fa5c69404..42217cf108 100644 --- a/.gitignore +++ b/.gitignore @@ -140,10 +140,12 @@ packages/js/* packages/react/* packages/next/* packages/stack/* +packages/tanstack-start/* !packages/js/package.json !packages/react/package.json !packages/next/package.json !packages/stack/package.json +!packages/tanstack-start/package.json # claude code .claude/scheduled_tasks.lock diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json new file mode 100644 index 0000000000..b20afb31e2 --- /dev/null +++ b/packages/tanstack-start/package.json @@ -0,0 +1,115 @@ +{ + "//": "THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template (FOR package.json FILES, PLEASE EDIT package-template.json)", + "name": "@stackframe/tanstack-start", + "version": "2.8.86", + "repository": "https://github.com/stack-auth/stack-auth", + "sideEffects": false, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/esm/index.js", + "require": "./dist/index.js" + }, + "./convex.config": { + "types": "./dist/integrations/convex/component/convex.config.d.ts", + "import": "./dist/esm/integrations/convex/component/convex.config.js", + "require": "./dist/integrations/convex/component/convex.config.js" + }, + "./convex-auth.config": { + "types": "./dist/integrations/convex.d.ts", + "import": "./dist/esm/integrations/convex.js", + "require": "./dist/integrations/convex.js" + } + }, + "homepage": "https://stack-auth.com", + "scripts": { + "typecheck": "tsc --noEmit", + "clean": "rimraf dist && rimraf node_modules", + "lint": "eslint --ext .tsx,.ts .", + "build": "rimraf dist && pnpm run css && tsdown", + "dev": "rimraf dist && concurrently -n \"build,codegen\" -k \"tsdown --watch\" \"pnpm run codegen:watch\"", + "codegen": "pnpm run css", + "codegen:watch": "pnpm run css:watch", + "css": "pnpm run css-tw && pnpm run css-sc", + "css:watch": "concurrently -n \"tw,sc\" -k \"pnpm run css-tw:watch\" \"pnpm run css-sc:watch\"", + "css-tw:watch": "tailwindcss -i ./src/global.css -o ./src/generated/tailwind.css --watch", + "css-tw": "tailwindcss -i ./src/global.css -o ./src/generated/tailwind.css", + "css-sc": "tsx ./scripts/process-css.ts ./src/generated/tailwind.css ./src/generated/global-css.ts", + "css-sc:watch": "chokidar --silent './src/generated/tailwind.css' -c 'pnpm run css-sc' --throttle 2000" + }, + "files": [ + "README.md", + "dist", + "CHANGELOG.md", + "LICENSE" + ], + "dependencies": { + "@ai-sdk/react": "^3.0.72", + "ai": "^6.0.0", + "@hookform/resolvers": "^5.2.2", + "@stripe/react-stripe-js": "^3.8.1", + "@stripe/stripe-js": "^7.7.0", + "@simplewebauthn/browser": "^13.2.2", + "@stackframe/stack-shared": "workspace:*", + "@stackframe/stack-ui": "workspace:*", + "@tanstack/react-table": "^8.21.3", + "browser-image-compression": "^2.0.2", + "color": "^5.0.3", + "cookie": "^1.1.1", + "jose": "^6.1.3", + "js-cookie": "^3.0.5", + "lucide-react": "^0.378.0", + "oauth4webapi": "^3.8.3", + "@oslojs/otp": "^1.1.0", + "qrcode": "^1.5.4", + "react-easy-crop": "^5.5.6", + "react-hook-form": "^7.70.0", + "tailwindcss-animate": "^1.0.7", + "rrweb": "^1.1.3", + "tsx": "^4.21.0", + "yup": "^1.7.1" + }, + "peerDependencies": { + "@types/react": ">=18.3.0", + "@tanstack/react-router": ">=1.100.0", + "@tanstack/react-start": ">=1.100.0", + "react": ">=18.3.0" + }, + "peerDependenciesMeta": { + "@tanstack/react-router": { + "optional": true + }, + "@tanstack/react-start": { + "optional": true + }, + "@types/react": { + "optional": true + } + }, + "devDependencies": { + "@quetzallabs/i18n": "^0.1.19", + "@types/color": "^3.0.6", + "@types/cookie": "^0.6.0", + "@types/js-cookie": "^3.0.6", + "@types/qrcode": "^1.5.5", + "@types/react-avatar-editor": "^13.0.3", + "autoprefixer": "^10.4.17", + "chokidar-cli": "^3.0.0", + "esbuild": "^0.20.2", + "i18next": "^23.14.0", + "i18next-parser": "^9.0.2", + "@tanstack/react-router": "^1.167.4", + "@tanstack/react-start": "^1.166.15", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "react-dom": "^19.0.0", + "rimraf": "^6.1.2", + "tailwindcss": "^3.4.4", + "tsdown": "^0.20.3", + "convex": "^1.27.0" + } +} \ No newline at end of file diff --git a/packages/template/package-template.json b/packages/template/package-template.json index 5dce4e8da5..92afc910d6 100644 --- a/packages/template/package-template.json +++ b/packages/template/package-template.json @@ -5,6 +5,8 @@ "name": "@stackframe/js", "//": "ELSE_IF_PLATFORM next", "name": "@stackframe/stack", + "//": "ELSE_IF_PLATFORM tanstack-start", + "name": "@stackframe/tanstack-start", "//": "ELSE_IF_PLATFORM react", "name": "@stackframe/react", "//": "END_PLATFORM", @@ -131,6 +133,10 @@ "react-dom": ">=18.3.0", "next": ">=14.1 || >=15.0.0-canary.0 || >=15.0.0-rc.0", "//": "END_PLATFORM", + "//": "IF_PLATFORM tanstack-start", + "@tanstack/react-router": ">=1.100.0", + "@tanstack/react-start": ">=1.100.0", + "//": "END_PLATFORM", "react": ">=18.3.0" }, "//": "END_PLATFORM", @@ -141,6 +147,14 @@ "optional": true }, "//": "END_PLATFORM", + "//": "IF_PLATFORM tanstack-start", + "@tanstack/react-router": { + "optional": true + }, + "@tanstack/react-start": { + "optional": true + }, + "//": "END_PLATFORM", "@types/react": { "optional": true } @@ -160,6 +174,10 @@ "i18next-parser": "^9.0.2", "//": "NEXT_LINE_PLATFORM next", "next": "^14.2.35", + "//": "NEXT_LINE_PLATFORM template tanstack-start", + "@tanstack/react-router": "^1.167.4", + "//": "NEXT_LINE_PLATFORM template tanstack-start", + "@tanstack/react-start": "^1.166.15", "postcss": "^8.4.38", "postcss-nested": "^6.0.1", "react": "^19.0.0", diff --git a/packages/template/package.json b/packages/template/package.json index 6a3d6cd643..ab7bad4dc2 100644 --- a/packages/template/package.json +++ b/packages/template/package.json @@ -94,12 +94,20 @@ "@types/react-dom": ">=18.3.0", "react-dom": ">=18.3.0", "next": ">=14.1 || >=15.0.0-canary.0 || >=15.0.0-rc.0", + "@tanstack/react-router": ">=1.100.0", + "@tanstack/react-start": ">=1.100.0", "react": ">=18.3.0" }, "peerDependenciesMeta": { "@types/react-dom": { "optional": true }, + "@tanstack/react-router": { + "optional": true + }, + "@tanstack/react-start": { + "optional": true + }, "@types/react": { "optional": true } @@ -117,6 +125,8 @@ "i18next": "^23.14.0", "i18next-parser": "^9.0.2", "next": "^14.2.35", + "@tanstack/react-router": "^1.167.4", + "@tanstack/react-start": "^1.166.15", "postcss": "^8.4.38", "postcss-nested": "^6.0.1", "react": "^19.0.0", @@ -127,4 +137,4 @@ "tsdown": "^0.20.3", "convex": "^1.27.0" } -} \ No newline at end of file +} diff --git a/packages/template/src/components-page/stack-handler-client.tsx b/packages/template/src/components-page/stack-handler-client.tsx index 55cfe9fe06..efe95f8dd2 100644 --- a/packages/template/src/components-page/stack-handler-client.tsx +++ b/packages/template/src/components-page/stack-handler-client.tsx @@ -237,7 +237,7 @@ export function StackHandlerClient(props: BaseHandlerProps & Partial const navigateRef = useRef(navigate); navigateRef.current = navigate; const currentLocation = props.location ?? window.location.pathname; - const searchParamsSource = new URLSearchParams(window.location.search); + const searchParamsSource = new URLSearchParams(typeof window === "undefined" ? "" : window.location.search); const redirectTargets: (string | undefined)[] = []; END_PLATFORM */ diff --git a/packages/template/src/lib/cookie.ts b/packages/template/src/lib/cookie.ts index 5d7b7a779c..aa07b4812b 100644 --- a/packages/template/src/lib/cookie.ts +++ b/packages/template/src/lib/cookie.ts @@ -1,4 +1,5 @@ import { cookies as rscCookies, headers as rscHeaders } from '@stackframe/stack-sc/force-react-server'; // THIS_LINE_PLATFORM next +import { getCookie as tssGetCookie, getCookies as tssGetCookies, setCookie as tssSetCookie, deleteCookie as tssDeleteCookie, getRequestHeader as tssGetRequestHeader } from '@tanstack/react-start/server'; // THIS_LINE_PLATFORM tanstack-start import { isBrowserLike } from '@stackframe/stack-shared/dist/utils/env'; import { StackAssertionError } from '@stackframe/stack-shared/dist/utils/errors'; import Cookies from "js-cookie"; @@ -104,12 +105,73 @@ export async function createCookieHelper(): Promise { await rscCookies(), await rscHeaders(), ); + // ELSE_IF_PLATFORM tanstack-start + return createTanStackStartCookieHelper(); // ELSE_PLATFORM return await createPlaceholderCookieHelper(); // END_PLATFORM } } +export function createCookieHelperSync(): CookieHelper { + if (isBrowserLike()) { + return createBrowserCookieHelper(); + } + // IF_PLATFORM tanstack-start + return createTanStackStartCookieHelper(); + // ELSE_PLATFORM + function throwError(): never { + throw new StackAssertionError("Synchronous server cookie helpers are not available on this platform"); + } + return { + get: throwError, + getAll: throwError, + set: throwError, + setOrDelete: throwError, + delete: throwError, + }; + // END_PLATFORM +} + +// IF_PLATFORM tanstack-start +function determineSecureFromTanStackStartContext(): boolean { + return tssGetRequestHeader("x-forwarded-proto") === "https" + || (tssGetCookie("stack-is-https") !== undefined); +} + +function requiresSecureAttribute(name: string): boolean { + return name.startsWith("__Host-"); +} + +function createTanStackStartCookieHelper(): CookieHelper { + const helper: CookieHelper = { + get: (name: string) => tssGetCookie(name) ?? null, + getAll: () => tssGetCookies(), + set: (name: string, value: string, options: SetCookieOptions) => { + tssSetCookie(name, value, { + secure: options.secure ?? (requiresSecureAttribute(name) || determineSecureFromTanStackStartContext()), + maxAge: options.maxAge === "session" ? undefined : options.maxAge, + domain: options.domain, + sameSite: "lax", + path: "/", + }); + }, + setOrDelete: (name, value, options) => { + if (value === null) helper.delete(name, options); + else helper.set(name, value, options); + }, + delete: (name: string, options: DeleteCookieOptions) => { + tssDeleteCookie(name, { + secure: requiresSecureAttribute(name), + domain: options.domain, + path: "/", + }); + }, + }; + return helper; +} +// END_PLATFORM + export function createBrowserCookieHelper(): CookieHelper { return { get: getCookieClient, @@ -232,6 +294,8 @@ export async function isSecure(): Promise { } // IF_PLATFORM next return determineSecureFromServerContext(await rscCookies(), await rscHeaders()); + // ELSE_IF_PLATFORM tanstack-start + return determineSecureFromTanStackStartContext(); // END_PLATFORM return false; } diff --git a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts index 1097699f15..e1fcec6f9b 100644 --- a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts +++ b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts @@ -42,7 +42,7 @@ import React, { useCallback, useMemo } from "react"; // THIS_LINE_PLATFORM react import type * as yup from "yup"; import { constructRedirectUrl } from "../../../../utils/url"; import { getNewOAuthProviderOrScopeUrl, callOAuthCallback } from "../../../auth"; -import { CookieHelper, createBrowserCookieHelper, createCookieHelper, createPlaceholderCookieHelper, deleteCookie, deleteCookieClient, isSecure as isSecureCookieContext, saveVerifierAndState, setOrDeleteCookie, setOrDeleteCookieClient } from "../../../cookie"; +import { CookieHelper, createBrowserCookieHelper, createCookieHelper, createCookieHelperSync, createPlaceholderCookieHelper, deleteCookie, deleteCookieClient, isSecure as isSecureCookieContext, saveVerifierAndState, setOrDeleteCookie, setOrDeleteCookieClient } from "../../../cookie"; import { envVars } from "../../../env"; import { ApiKey, ApiKeyCreationOptions, ApiKeyUpdateOptions, apiKeyCreationOptionsToCrud } from "../../api-keys"; import { ConvexCtx, GetCurrentPartialUserOptions, GetCurrentUserOptions, HandlerUrlOptions, HandlerUrls, OAuthScopesOnSignIn, RedirectMethod, RedirectToOptions, RequestLike, ResolvedHandlerUrls, TokenStoreInit, stackAppInternalsSymbol } from "../../common"; @@ -930,6 +930,11 @@ export class _StackClientAppImplIncomplete { + // IF_PLATFORM tanstack-start + if (!isBrowserLike()) { + return this._getOrCreateTokenStore(createCookieHelperSync(), overrideTokenStoreInit); + } + // END_PLATFORM suspendIfSsr(); const cookieHelper = createBrowserCookieHelper(); const tokenStore = this._getOrCreateTokenStore(cookieHelper, overrideTokenStoreInit); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 482352d2f2..710b10b72f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -749,7 +749,7 @@ importers: version: 1.166.6(crossws@0.4.4(srvx@0.8.16)) nitro: specifier: ^3.0.0 - version: 3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.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))(xml2js@0.6.2) + version: 3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(rolldown@1.0.0-rc.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))(xml2js@0.6.2) react: specifier: 19.2.1 version: 19.2.1 @@ -1020,7 +1020,7 @@ importers: devDependencies: mint: specifier: ^4.2.487 - version: 4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + version: 4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) examples/cjs-test: dependencies: @@ -1568,10 +1568,10 @@ importers: version: link:../../packages/stack '@supabase/ssr': specifier: latest - version: 0.10.0(@supabase/supabase-js@2.102.1) + version: 0.10.2(@supabase/supabase-js@2.104.0) '@supabase/supabase-js': specifier: latest - version: 2.102.1 + version: 2.104.0 jose: specifier: ^5.2.2 version: 5.6.3 @@ -2396,6 +2396,151 @@ importers: specifier: ^6.1.2 version: 6.1.2 + packages/tanstack-start: + dependencies: + '@ai-sdk/react': + specifier: ^3.0.72 + version: 3.0.143(react@19.2.3)(zod@4.3.6) + '@hookform/resolvers': + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.70.0(react@19.2.3)) + '@oslojs/otp': + specifier: ^1.1.0 + version: 1.1.0 + '@simplewebauthn/browser': + specifier: ^13.2.2 + version: 13.2.2 + '@stackframe/stack-shared': + specifier: workspace:* + version: link:../stack-shared + '@stackframe/stack-ui': + specifier: workspace:* + version: link:../stack-ui + '@stripe/react-stripe-js': + specifier: ^3.8.1 + version: 3.8.1(@stripe/stripe-js@7.7.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@stripe/stripe-js': + specifier: ^7.7.0 + version: 7.7.0 + '@tanstack/react-table': + specifier: ^8.21.3 + version: 8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@types/react': + specifier: ^18.2.0 + version: 18.3.12 + ai: + specifier: ^6.0.0 + version: 6.0.141(zod@4.3.6) + browser-image-compression: + specifier: ^2.0.2 + version: 2.0.2 + color: + specifier: ^5.0.3 + version: 5.0.3 + cookie: + specifier: ^1.1.1 + version: 1.1.1 + jose: + specifier: ^6.1.3 + version: 6.1.3 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + lucide-react: + specifier: ^0.378.0 + version: 0.378.0(react@19.2.3) + oauth4webapi: + specifier: ^3.8.3 + version: 3.8.5 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + react-easy-crop: + specifier: ^5.5.6 + version: 5.5.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react-hook-form: + specifier: ^7.70.0 + version: 7.70.0(react@19.2.3) + rrweb: + specifier: ^1.1.3 + version: 1.1.3 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.8.0)) + tsx: + specifier: ^4.21.0 + version: 4.21.0 + yup: + specifier: ^1.7.1 + version: 1.7.1 + devDependencies: + '@quetzallabs/i18n': + specifier: ^0.1.19 + version: 0.1.19(next@16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) + '@tanstack/react-router': + specifier: ^1.167.4 + version: 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start': + specifier: ^1.166.15 + version: 1.167.42(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@types/color': + specifier: ^3.0.6 + version: 3.0.6 + '@types/cookie': + specifier: ^0.6.0 + version: 0.6.0 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + '@types/qrcode': + specifier: ^1.5.5 + version: 1.5.5 + '@types/react-avatar-editor': + specifier: ^13.0.3 + version: 13.0.3 + '@types/react-dom': + specifier: ^18.2.0 + version: 18.3.1 + autoprefixer: + specifier: ^10.4.17 + version: 10.4.21(postcss@8.5.6) + chokidar-cli: + specifier: ^3.0.0 + version: 3.0.0 + convex: + specifier: ^1.27.0 + version: 1.27.0(react@19.2.3) + esbuild: + specifier: ^0.20.2 + version: 0.20.2 + i18next: + specifier: ^23.14.0 + version: 23.14.0 + i18next-parser: + specifier: ^9.0.2 + version: 9.0.2 + postcss: + specifier: ^8.4.38 + version: 8.5.6 + postcss-nested: + specifier: ^6.0.1 + version: 6.2.0(postcss@8.5.6) + react: + specifier: ^19.0.0 + version: 19.2.3 + react-dom: + specifier: ^19.0.0 + version: 19.2.3(react@19.2.3) + rimraf: + specifier: ^6.1.2 + version: 6.1.2 + tailwindcss: + specifier: ^3.4.4 + version: 3.4.18(tsx@4.21.0)(yaml@2.8.0) + tsdown: + specifier: ^0.20.3 + version: 0.20.3(typescript@5.9.3) + packages/template: dependencies: '@ai-sdk/react': @@ -2480,6 +2625,12 @@ importers: '@quetzallabs/i18n': specifier: ^0.1.19 version: 0.1.19(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + '@tanstack/react-router': + specifier: ^1.167.4 + version: 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start': + specifier: ^1.166.15 + version: 1.167.42(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(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.20.2)) '@types/color': specifier: ^3.0.6 version: 3.0.6 @@ -9891,36 +10042,36 @@ packages: resolution: {integrity: sha512-SXuhqhuR5FXaYgKTXzZJeqtVA6JKb9IZWaGeEUxHHiOcFy2p51wccO72bYpXwoK4D5pzQOIYLTuAc7etxyMmwg==} engines: {node: '>=12.16'} - '@supabase/auth-js@2.102.1': - resolution: {integrity: sha512-2uH2WB0H98TOGDtaFWhxIcR42Dro/VB7VDZanz/4bVJsqioIue1m3TUqu3xciDm2W9r+1LXQvYNsYbQfWmD+uQ==} + '@supabase/auth-js@2.104.0': + resolution: {integrity: sha512-Vs0ndL+s5an7rOmXtS/nbYnGXL8m+KXlCSrPIcw9bR96ma6qyLYILnE6syuM+rpDnf+Tg4PVNxNB2+oDwoy6mA==} engines: {node: '>=20.0.0'} - '@supabase/functions-js@2.102.1': - resolution: {integrity: sha512-UcrcKTPnAIo+Yp9Jjq9XXwFbsmgRYY637mwka9ZjmTIWcX/xr1pote4OVvaGQycVY1KTiQgjMvpC0Q0yJhRq3w==} + '@supabase/functions-js@2.104.0': + resolution: {integrity: sha512-O8EyEz/RT1kfWhyJNpVc/VbLeBsohHGBVif/CI83zoMB+Iul/t/NIekH1/7RsH6kuO+b2D4wJhfiaW8Qr47sRg==} engines: {node: '>=20.0.0'} '@supabase/phoenix@0.4.0': resolution: {integrity: sha512-RHSx8bHS02xwfHdAbX5Lpbo6PXbgyf7lTaXTlwtFDPwOIw64NnVRwFAXGojHhjtVYI+PEPNSWwkL90f4agN3bw==} - '@supabase/postgrest-js@2.102.1': - resolution: {integrity: sha512-InLvXKAYf8BIqiv9jWOYudWB3rU8A9uMbcip5BQ5sLLNPrbO1Ekkr79OvlhZBgMNSppxVyC7wPPGzLxMcTZhlA==} + '@supabase/postgrest-js@2.104.0': + resolution: {integrity: sha512-ynylEq6wduQEycj6pL3P+/yIfDQ+CTnBC5I6p+PzcAO2ybj9coAITVtMfboi+g/dacgMslN5MH73rXsRMB29+Q==} engines: {node: '>=20.0.0'} - '@supabase/realtime-js@2.102.1': - resolution: {integrity: sha512-h2fCumib/v6u7XMwSPgxnpfimjX4xCEayUHrxWLC7UurfQjUZJ0pmJDgm6yj80DnUerxuulRghwm5zXYysFG/Q==} + '@supabase/realtime-js@2.104.0': + resolution: {integrity: sha512-9fUVDoTVAhn7a79+AmEx+asUlRtf2yBrji7TQckcKn/WK4hvAA9Lia9er+lnhuz3WNiF1x6kkA4x7bRCJrU+KA==} engines: {node: '>=20.0.0'} - '@supabase/ssr@0.10.0': - resolution: {integrity: sha512-36jIu+DuKzg5EgA3fnH+zHvwASvpKcL4zPgmHoZaULroS5Q4mzeHcM69zJ0sXUHddO5IcHjQNZJ9Vyhl/DdbRw==} + '@supabase/ssr@0.10.2': + resolution: {integrity: sha512-JFbchN63CXLFHJRNT7udec4/RoD9PmXkSGko3QSO6vUuqGBtSzdmxR7FPfQNr7SuFd65I7Xv46q66ALjEN1cgQ==} peerDependencies: - '@supabase/supabase-js': ^2.100.1 + '@supabase/supabase-js': ^2.102.1 - '@supabase/storage-js@2.102.1': - resolution: {integrity: sha512-eCL9T4Xpe40nmKlkUJ7Zq/hk34db1xPiT0WL3Iv5MbJqHuCAe5TxhV8Rjqd6DNZrzjtfYObZtYl9jKJaHrivqw==} + '@supabase/storage-js@2.104.0': + resolution: {integrity: sha512-s2NHtuAWb9nldJ/fS62WnJE6edvCWn31rrO+FJKlAohs99qdVgtLegUReTU2H9WnZiQlVqaBtu386wt6/6lrRw==} engines: {node: '>=20.0.0'} - '@supabase/supabase-js@2.102.1': - resolution: {integrity: sha512-bChxPVeLDnYN9M2d/u4fXsvylwSQG5grAl+HN8f+ZD9a9PuVU+Ru+xGmEsk+b9Iz3rJC9ZQnQUJYQ28fApdWYA==} + '@supabase/supabase-js@2.104.0': + resolution: {integrity: sha512-hILwhIjCB53G31jlHUe73NDEmrXudcjcYlVRuvNfEhzf0gyFQaFf7j6rd1UGmYZkFMOg//DFE8Iy9ZbNEgosVw==} engines: {node: '>=20.0.0'} '@sveltejs/sv-utils@0.0.3': @@ -10040,6 +10191,10 @@ packages: resolution: {integrity: sha512-Kp/WSt411ZWYvgXy6uiv5RmhHrz9cAml05AQPrtdAp7eUqvIDbMGPnML25OKbzR3RJ1q4wgENxDTvlGPa9+Mww==} engines: {node: '>=20.19'} + '@tanstack/history@1.161.6': + resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==} + engines: {node: '>=20.19'} + '@tanstack/query-core@5.90.7': resolution: {integrity: sha512-6PN65csiuTNfBMXqQUxQhCNdtm1rV+9kC9YwWAIKcaxAauq3Wu7p18j3gQY3YIBJU70jT/wzCCZ2uqto/vQgiQ==} @@ -10055,6 +10210,20 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' + '@tanstack/react-router@1.168.23': + resolution: {integrity: sha512-+GblieDnutG6oipJJPNtRJjrWF8QTZEG/l0532+BngFkVK48oHNOcvIkSoAFYftK1egAwM7KBxXsb0Ou+X6/MQ==} + 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.166.40': + resolution: {integrity: sha512-ynjRe8YjaPfcQNEaQ3nE2/zIZNCdyVGew0pHK5lCorqEy3z/YuiKlj5ZXPmel7XGw0XoKsDIH2eXnUtTbIwpjg==} + engines: {node: '>=22.12.0'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + '@tanstack/react-start-client@1.166.6': resolution: {integrity: sha512-RG+aFN/JdJXArcTBbsJUCrCMzxqMA1YDkdm50Qg2P7H2e3T7Tmqf7mzopXP0b8oMCxbdvjY0leer4t4/KndnjQ==} engines: {node: '>=22.12.0'} @@ -10062,6 +10231,24 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' + '@tanstack/react-start-rsc@0.0.21': + resolution: {integrity: sha512-Q7T8HIGgCIrbMkdep5bmh/uPRK/3OZQ11FODZoMOvyrgTho/MA4kuUFSREvz2LdlXYrz3WxhSSLJnAtpPKJn5w==} + engines: {node: '>=22.12.0'} + peerDependencies: + '@vitejs/plugin-rsc': '>=0.5.20' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + peerDependenciesMeta: + '@vitejs/plugin-rsc': + optional: true + + '@tanstack/react-start-server@1.166.41': + resolution: {integrity: sha512-Z0kyOeraz5nHE7DYh4brYetYoXvh3wjNNI3fJZ0+OzGODfNUgZtEQg/f1g1f1kj64irgWIuWTVPi3rOwiPSzYw==} + 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.166.6': resolution: {integrity: sha512-L1aUZW1Q6NU08/MDbQTUJw9yIKr5l3Kg8XWZvB2bpFahN3N+yy2KJehWRMZHTUfnIcV2IjGk3FMEwbLiI20DtA==} engines: {node: '>=22.12.0'} @@ -10077,12 +10264,31 @@ packages: react-dom: '>=18.0.0 || >=19.0.0' vite: '>=7.0.0' + '@tanstack/react-start@1.167.42': + resolution: {integrity: sha512-zobCIyeChagJg/dwWOWYofseucV618++DOIT/HB6tfnKKKnCw15vO9jhkGD5c+SBUNLyG4km+Y4ynvTIkaseVg==} + engines: {node: '>=22.12.0'} + hasBin: true + peerDependencies: + '@vitejs/plugin-rsc': '*' + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + vite: '>=7.0.0' + peerDependenciesMeta: + '@vitejs/plugin-rsc': + optional: true + '@tanstack/react-store@0.9.2': resolution: {integrity: sha512-Vt5usJE5sHG/cMechQfmwvwne6ktGCELe89Lmvoxe3LKRoFrhPa8OCKWs0NliG8HTJElEIj7PLtaBQIcux5pAQ==} 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-store@0.9.3': + resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@tanstack/react-table@8.20.5': resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==} engines: {node: '>=12'} @@ -10107,6 +10313,15 @@ packages: resolution: {integrity: sha512-SwVPMQxjoY4jwiNgD9u5kDFp/iSaf3wgf1t93xRCC6qDHmv/xLaawhvwEPNIJaPepWuSYRpywpJWH9hGlBqVbw==} engines: {node: '>=20.19'} + '@tanstack/router-core@1.168.15': + resolution: {integrity: sha512-Wr0424NDtD8fT/uALobMZ9DdcfsTyXtW5IPR++7zvW8/7RaIOeaqXpVDId8ywaGtqPWLWOfaUg2zUtYtukoXYA==} + engines: {node: '>=20.19'} + hasBin: true + + '@tanstack/router-generator@1.166.32': + resolution: {integrity: sha512-VuusKwEXcgKq+myq1JQfZogY8scTXIIeFls50dJ/UXgCXWp5n14iFreYNlg41wURcak2oA3M+t2TVfD0xUUD6g==} + engines: {node: '>=20.19'} + '@tanstack/router-generator@1.166.6': resolution: {integrity: sha512-D7Z6oLP2IfflXUzOOxIgeCD8v3/SXU//cgBon0pbF13HkKdf9Zlt97kQqcaOkbnruJJ6i5xtUIsoAQbMmj+EsQ==} engines: {node: '>=20.19'} @@ -10132,28 +10347,78 @@ packages: webpack: optional: true + '@tanstack/router-plugin@1.167.22': + resolution: {integrity: sha512-wYPzIvBK8bcmXVUpZfSgGBXOrfBAdF4odKevz6rejio5rEd947NtKDF5R7eYdwlAOmRqYpLJnJ1QHkc5t8bY4w==} + engines: {node: '>=20.19'} + hasBin: true + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.168.21 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' + vite-plugin-solid: ^2.11.10 || ^3.0.0-0 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + '@tanstack/router-utils@1.161.4': resolution: {integrity: sha512-r8TpjyIZoqrXXaf2DDyjd44gjGBoyE+/oEaaH68yLI9ySPO1gUWmQENZ1MZnmBnpUGN24NOZxdjDLc8npK0SAw==} engines: {node: '>=20.19'} + '@tanstack/router-utils@1.161.6': + resolution: {integrity: sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw==} + engines: {node: '>=20.19'} + '@tanstack/start-client-core@1.166.6': resolution: {integrity: sha512-fnSkRaL6pI3RRdWSeJFg5Vg88Cn9GuuOvmOBP0IgWTNHqywjFm/b1dPGemphD5cmJLhMPAkqGwbK4oPzzdnB9A==} engines: {node: '>=22.12.0'} + '@tanstack/start-client-core@1.167.17': + resolution: {integrity: sha512-3ZnpQ0LPnhrm/GX+HT7XfRxTcqnmBE1KJd7LtaJNuN13NH0C4ZOWchKLPEed2/gluhgsT6UgWm+Ec0kEFtxSaw==} + engines: {node: '>=22.12.0'} + hasBin: true + '@tanstack/start-fn-stubs@1.161.4': resolution: {integrity: sha512-b8s6iSQ+ny0P4lGK0n3DKaL6EI7SECG0/89svDeYieVw2+MaFOJVcQo3rU3BUvmuOcIkgkE5IhdzkmzPXH6yfA==} engines: {node: '>=22.12.0'} + '@tanstack/start-fn-stubs@1.161.6': + resolution: {integrity: sha512-Y6QSlGiLga8cHfvxGGaonXIlt2bIUTVdH6AMjmpMp7+ANNCp+N96GQbjjhLye3JkaxDfP68x5iZA8NK4imgRig==} + engines: {node: '>=22.12.0'} + '@tanstack/start-plugin-core@1.166.6': resolution: {integrity: sha512-/VlfJYOnVyzGlyEATCFxhgPC2AF5pt5MEO+cjvguu9q9+hE/zceSY33Y9gmg7keybVGOz+cmRrSbUaBPMQ+aNw==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' + '@tanstack/start-plugin-core@1.167.35': + resolution: {integrity: sha512-Ww511KfsXd7TbPYzjiUDCMUI5VbO0chmrTgFi1oOUT0jmk5U0Xh9WVIun1cvRmaq+KBZwvWGvmeIn0UwO3mHEA==} + engines: {node: '>=22.12.0'} + peerDependencies: + vite: '>=7.0.0' + '@tanstack/start-server-core@1.166.6': resolution: {integrity: sha512-nekpa3zFx1SFBURwVbqNunJlLcxvx8vu+Mbnv/nYw4JLfeBmhNNGMZjxmB2K5PRBwIzcKRpLIwgtzyWWzaHKPw==} engines: {node: '>=22.12.0'} + '@tanstack/start-server-core@1.167.19': + resolution: {integrity: sha512-wzOdfzLsK91CnjoywnEjXSlVlaRVK99HJhyVijNU1TECBI2JEKvW9S6d14YfS4gD4fFH4V86tFYhkcLPe6nzWg==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@tanstack/start-storage-context@1.166.29': + resolution: {integrity: sha512-KrJYudc1nbnTY43jdN+hQFMYkhz7+3T+hkgBoGnIP1OspSe6vGQaYGDB4EUXYnkLfyQp+iUuKubgS8hSKeJ0ng==} + engines: {node: '>=22.12.0'} + '@tanstack/start-storage-context@1.166.6': resolution: {integrity: sha512-FLu+bHWS0VFz/KTOPEQnhDxzxToca4giVoUZ3DYfYcQNky+FrIeKYvlwurFNVuLkSCY1Jqr1O2xVnD9dEqBAag==} engines: {node: '>=22.12.0'} @@ -10161,6 +10426,9 @@ packages: '@tanstack/store@0.9.2': resolution: {integrity: sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA==} + '@tanstack/store@0.9.3': + resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} + '@tanstack/table-core@8.20.5': resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} engines: {node: '>=12'} @@ -10176,6 +10444,11 @@ packages: resolution: {integrity: sha512-42WoRePf8v690qG8yGRe/YOh+oHni9vUaUUfoqlS91U2scd3a5rkLtVsc6b7z60w3RogH0I00vdrC5AaeiZ18w==} engines: {node: '>=20.19'} + '@tanstack/virtual-file-routes@1.161.7': + resolution: {integrity: sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ==} + engines: {node: '>=20.19'} + hasBin: true + '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} @@ -12023,6 +12296,9 @@ packages: cookie-es@2.0.0: resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie-es@3.1.1: + resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -13936,6 +14212,16 @@ packages: crossws: optional: true + h3@2.0.1-rc.20: + resolution: {integrity: sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg==} + engines: {node: '>=20.11.1'} + hasBin: true + peerDependencies: + crossws: ^0.4.1 + peerDependenciesMeta: + crossws: + optional: true + hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} @@ -15138,6 +15424,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@0.30.8: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} @@ -17791,6 +18080,11 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} + srvx@0.11.15: + resolution: {integrity: sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==} + engines: {node: '>=20.16.0'} + hasBin: true + srvx@0.11.9: resolution: {integrity: sha512-97wWJS6F0KTKAhDlHVmBzMvlBOp5FiNp3XrLoodIgYJpXxgG5tE9rX4Pg7s46n2shI4wtEsMATTS1+rI3/ubzA==} engines: {node: '>=20.16.0'} @@ -18849,6 +19143,7 @@ packages: uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@11.1.0: @@ -18857,6 +19152,7 @@ packages: uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uzip@0.20201231.0: @@ -19630,6 +19926,16 @@ snapshots: transitivePeerDependencies: - zod + '@ai-sdk/react@3.0.143(react@19.2.3)(zod@4.3.6)': + dependencies: + '@ai-sdk/provider-utils': 4.0.21(zod@4.3.6) + ai: 6.0.141(zod@4.3.6) + react: 19.2.3 + swr: 2.3.4(react@19.2.3) + throttleit: 2.1.0 + transitivePeerDependencies: + - zod + '@ai-sdk/react@3.0.83(react@18.3.1)(zod@3.25.76)': dependencies: '@ai-sdk/provider-utils': 4.0.14(zod@3.25.76) @@ -20847,7 +21153,7 @@ snapshots: '@babel/helper-annotate-as-pure@7.24.7': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@babel/helper-compilation-targets@7.25.9': dependencies: @@ -20881,7 +21187,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.24.7 '@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 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -20890,8 +21196,8 @@ snapshots: '@babel/helper-member-expression-to-functions@7.24.8': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -20952,7 +21258,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.24.7': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@babel/helper-plugin-utils@7.27.1': {} @@ -20963,14 +21269,14 @@ snapshots: '@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 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.24.7': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -21032,6 +21338,11 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': + dependencies: + '@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.29.0)': dependencies: '@babel/core': 7.29.0 @@ -21042,6 +21353,11 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -22369,6 +22685,11 @@ snapshots: '@standard-schema/utils': 0.3.0 react-hook-form: 7.70.0(react@19.2.1) + '@hookform/resolvers@5.2.2(react-hook-form@7.70.0(react@19.2.3))': + dependencies: + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.70.0(react@19.2.3) + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -22676,16 +22997,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/checkbox@4.3.2(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/confirm@5.1.21(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22693,13 +23004,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/confirm@5.1.21(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/core@10.3.2(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -22713,19 +23017,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/core@10.3.2(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - cli-width: 4.1.0 - mute-stream: 2.0.0 - signal-exit: 4.1.0 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/editor@4.2.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22734,14 +23025,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/editor@4.2.23(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/external-editor': 1.0.3(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/expand@4.0.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22750,14 +23033,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/expand@4.0.23(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/external-editor@1.0.3(@types/node@20.17.6)': dependencies: chardet: 2.1.1 @@ -22765,13 +23040,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/external-editor@1.0.3(@types/node@24.9.2)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.0 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/figures@1.0.15': {} '@inquirer/figures@1.0.3': {} @@ -22783,13 +23051,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/input@4.3.1(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/number@3.0.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22797,13 +23058,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/number@3.0.23(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/password@4.0.23(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -22812,14 +23066,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/password@4.0.23(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/prompts@7.10.1(@types/node@20.17.6)': dependencies: '@inquirer/checkbox': 4.3.2(@types/node@20.17.6) @@ -22835,35 +23081,20 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/prompts@7.10.1(@types/node@24.9.2)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@24.9.2) - '@inquirer/confirm': 5.1.21(@types/node@24.9.2) - '@inquirer/editor': 4.2.23(@types/node@24.9.2) - '@inquirer/expand': 4.0.23(@types/node@24.9.2) - '@inquirer/input': 4.3.1(@types/node@24.9.2) - '@inquirer/number': 3.0.23(@types/node@24.9.2) - '@inquirer/password': 4.0.23(@types/node@24.9.2) - '@inquirer/rawlist': 4.1.11(@types/node@24.9.2) - '@inquirer/search': 3.2.2(@types/node@24.9.2) - '@inquirer/select': 4.4.2(@types/node@24.9.2) - optionalDependencies: - '@types/node': 24.9.2 - - '@inquirer/prompts@7.9.0(@types/node@24.9.2)': + '@inquirer/prompts@7.9.0(@types/node@20.17.6)': dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@24.9.2) - '@inquirer/confirm': 5.1.21(@types/node@24.9.2) - '@inquirer/editor': 4.2.23(@types/node@24.9.2) - '@inquirer/expand': 4.0.23(@types/node@24.9.2) - '@inquirer/input': 4.3.1(@types/node@24.9.2) - '@inquirer/number': 3.0.23(@types/node@24.9.2) - '@inquirer/password': 4.0.23(@types/node@24.9.2) - '@inquirer/rawlist': 4.1.11(@types/node@24.9.2) - '@inquirer/search': 3.2.2(@types/node@24.9.2) - '@inquirer/select': 4.4.2(@types/node@24.9.2) + '@inquirer/checkbox': 4.3.2(@types/node@20.17.6) + '@inquirer/confirm': 5.1.21(@types/node@20.17.6) + '@inquirer/editor': 4.2.23(@types/node@20.17.6) + '@inquirer/expand': 4.0.23(@types/node@20.17.6) + '@inquirer/input': 4.3.1(@types/node@20.17.6) + '@inquirer/number': 3.0.23(@types/node@20.17.6) + '@inquirer/password': 4.0.23(@types/node@20.17.6) + '@inquirer/rawlist': 4.1.11(@types/node@20.17.6) + '@inquirer/search': 3.2.2(@types/node@20.17.6) + '@inquirer/select': 4.4.2(@types/node@20.17.6) optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 20.17.6 '@inquirer/rawlist@4.1.11(@types/node@20.17.6)': dependencies: @@ -22873,14 +23104,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/rawlist@4.1.11(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/search@3.2.2(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -22890,15 +23113,6 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/search@3.2.2(@types/node@24.9.2)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/select@4.4.2(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -22909,24 +23123,10 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/select@4.4.2(@types/node@24.9.2)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.9.2) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 24.9.2 - '@inquirer/type@3.0.10(@types/node@20.17.6)': optionalDependencies: '@types/node': 20.17.6 - '@inquirer/type@3.0.10(@types/node@24.9.2)': - optionalDependencies: - '@types/node': 24.9.2 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -23064,9 +23264,9 @@ snapshots: dependencies: langium: 3.3.1 - '@mintlify/cli@4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + '@mintlify/cli@4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': dependencies: - '@inquirer/prompts': 7.9.0(@types/node@24.9.2) + '@inquirer/prompts': 7.9.0(@types/node@20.17.6) '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) '@mintlify/link-rot': 3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) '@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) @@ -23079,7 +23279,7 @@ snapshots: front-matter: 4.0.2 fs-extra: 11.2.0 ink: 6.3.0(@types/react@18.3.12)(react@19.2.3) - inquirer: 12.3.0(@types/node@24.9.2) + inquirer: 12.3.0(@types/node@20.17.6) js-yaml: 4.1.0 mdast-util-mdx-jsx: 3.2.0 open: 8.4.2 @@ -25215,6 +25415,23 @@ snapshots: - next - supports-color + '@quetzallabs/i18n@0.1.19(next@16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': + dependencies: + '@babel/parser': 7.25.6 + '@babel/traverse': 7.25.6 + axios: 1.7.4 + dotenv: 10.0.0 + i18next: 21.10.0 + i18next-parser: 9.0.2 + next-intl: 3.19.1(next@16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@18.3.1) + path: 0.12.7 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - debug + - next + - supports-color + '@radix-ui/number@1.1.0': {} '@radix-ui/number@1.1.1': {} @@ -29473,21 +29690,21 @@ snapshots: '@stripe/stripe-js@7.7.0': {} - '@supabase/auth-js@2.102.1': + '@supabase/auth-js@2.104.0': dependencies: tslib: 2.8.1 - '@supabase/functions-js@2.102.1': + '@supabase/functions-js@2.104.0': dependencies: tslib: 2.8.1 '@supabase/phoenix@0.4.0': {} - '@supabase/postgrest-js@2.102.1': + '@supabase/postgrest-js@2.104.0': dependencies: tslib: 2.8.1 - '@supabase/realtime-js@2.102.1': + '@supabase/realtime-js@2.104.0': dependencies: '@supabase/phoenix': 0.4.0 '@types/ws': 8.18.1 @@ -29497,23 +29714,23 @@ snapshots: - bufferutil - utf-8-validate - '@supabase/ssr@0.10.0(@supabase/supabase-js@2.102.1)': + '@supabase/ssr@0.10.2(@supabase/supabase-js@2.104.0)': dependencies: - '@supabase/supabase-js': 2.102.1 + '@supabase/supabase-js': 2.104.0 cookie: 1.0.2 - '@supabase/storage-js@2.102.1': + '@supabase/storage-js@2.104.0': dependencies: iceberg-js: 0.8.1 tslib: 2.8.1 - '@supabase/supabase-js@2.102.1': + '@supabase/supabase-js@2.104.0': dependencies: - '@supabase/auth-js': 2.102.1 - '@supabase/functions-js': 2.102.1 - '@supabase/postgrest-js': 2.102.1 - '@supabase/realtime-js': 2.102.1 - '@supabase/storage-js': 2.102.1 + '@supabase/auth-js': 2.104.0 + '@supabase/functions-js': 2.104.0 + '@supabase/postgrest-js': 2.104.0 + '@supabase/realtime-js': 2.104.0 + '@supabase/storage-js': 2.104.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -29614,6 +29831,8 @@ snapshots: '@tanstack/history@1.161.4': {} + '@tanstack/history@1.161.6': {} + '@tanstack/query-core@5.90.7': {} '@tanstack/react-query@5.90.7(react@18.3.1)': @@ -29638,6 +29857,40 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 + '@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/react-store': 0.9.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/router-core': 1.168.15 + isbot: 5.1.35 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + + '@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/react-store': 0.9.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.168.15 + isbot: 5.1.35 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@tanstack/react-start-client@1.166.40(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/router-core': 1.168.15 + '@tanstack/start-client-core': 1.167.17 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + + '@tanstack/react-start-client@1.166.40(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/react-router': 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.168.15 + '@tanstack/start-client-core': 1.167.17 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + '@tanstack/react-start-client@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/react-router': 1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -29648,6 +29901,74 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 + '@tanstack/react-start-rsc@0.0.21(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + dependencies: + '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-server': 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/router-core': 1.168.15 + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-fn-stubs': 1.161.6 + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + '@tanstack/start-storage-context': 1.166.29 + pathe: 2.0.3 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + transitivePeerDependencies: + - '@rsbuild/core' + - crossws + - supports-color + - vite + - vite-plugin-solid + - webpack + + '@tanstack/react-start-rsc@0.0.21(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + dependencies: + '@tanstack/react-router': 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-server': 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.168.15 + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-fn-stubs': 1.161.6 + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + '@tanstack/start-storage-context': 1.166.29 + pathe: 2.0.3 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - '@rsbuild/core' + - crossws + - supports-color + - vite + - vite-plugin-solid + - webpack + + '@tanstack/react-start-server@1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/router-core': 1.168.15 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + transitivePeerDependencies: + - crossws + + '@tanstack/react-start-server@1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/react-router': 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.168.15 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + transitivePeerDependencies: + - crossws + '@tanstack/react-start-server@1.166.6(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/history': 1.161.4 @@ -29680,6 +30001,48 @@ snapshots: - vite-plugin-solid - webpack + '@tanstack/react-start@1.167.42(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + dependencies: + '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-client': 1.166.40(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-rsc': 0.0.21(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/react-start-server': 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + pathe: 2.0.3 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + vite: 7.3.1(@types/node@24.9.2)(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-start@1.167.42(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + dependencies: + '@tanstack/react-router': 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-client': 1.166.40(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-rsc': 0.0.21(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/react-start-server': 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + pathe: 2.0.3 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + vite: 7.3.1(@types/node@24.9.2)(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.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/store': 0.9.2 @@ -29687,6 +30050,20 @@ snapshots: react-dom: 19.2.1(react@19.2.1) use-sync-external-store: 1.6.0(react@19.2.1) + '@tanstack/react-store@0.9.3(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@tanstack/store': 0.9.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-store@0.9.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/store': 0.9.3 + 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 @@ -29711,6 +30088,12 @@ snapshots: react: 19.2.1 react-dom: 19.2.3(react@19.2.1) + '@tanstack/react-table@8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/table-core': 8.21.3 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + '@tanstack/react-virtual@3.13.18(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@tanstack/virtual-core': 3.13.18 @@ -29727,6 +30110,26 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 + '@tanstack/router-core@1.168.15': + dependencies: + '@tanstack/history': 1.161.6 + cookie-es: 3.1.1 + seroval: 1.5.1 + seroval-plugins: 1.5.1(seroval@1.5.1) + + '@tanstack/router-generator@1.166.32': + dependencies: + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + magic-string: 0.30.21 + prettier: 3.5.3 + tsx: 4.21.0 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + '@tanstack/router-generator@1.166.6': dependencies: '@tanstack/router-core': 1.166.6 @@ -29762,6 +30165,50 @@ snapshots: transitivePeerDependencies: - supports-color + '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-generator': 1.166.32 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + chokidar: 3.6.0 + unplugin: 2.3.11 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + vite: 7.3.1(@types/node@24.9.2)(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.20.2) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-generator': 1.166.32 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + chokidar: 3.6.0 + unplugin: 2.3.11 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + vite: 7.3.1(@types/node@24.9.2)(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.20.2) + transitivePeerDependencies: + - supports-color + '@tanstack/router-utils@1.161.4': dependencies: '@babel/core': 7.28.5 @@ -29776,6 +30223,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@tanstack/router-utils@1.161.6': + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + 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.166.6': dependencies: '@tanstack/router-core': 1.166.6 @@ -29785,8 +30246,17 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 + '@tanstack/start-client-core@1.167.17': + dependencies: + '@tanstack/router-core': 1.168.15 + '@tanstack/start-fn-stubs': 1.161.6 + '@tanstack/start-storage-context': 1.166.29 + seroval: 1.5.1 + '@tanstack/start-fn-stubs@1.161.4': {} + '@tanstack/start-fn-stubs@1.161.6': {} + '@tanstack/start-plugin-core@1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.8.16))(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 @@ -29819,6 +30289,72 @@ snapshots: - vite-plugin-solid - webpack + '@tanstack/start-plugin-core@1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/types': 7.29.0 + '@rolldown/pluginutils': 1.0.0-beta.40 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-generator': 1.166.32 + '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + cheerio: 1.0.0 + exsolve: 1.0.8 + pathe: 2.0.3 + picomatch: 4.0.3 + seroval: 1.5.1 + source-map: 0.7.6 + srvx: 0.11.9 + tinyglobby: 0.2.15 + ufo: 1.6.3 + vite: 7.3.1(@types/node@24.9.2)(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@24.9.2)(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-plugin-core@1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/types': 7.29.0 + '@rolldown/pluginutils': 1.0.0-beta.40 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-generator': 1.166.32 + '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + cheerio: 1.0.0 + exsolve: 1.0.8 + pathe: 2.0.3 + picomatch: 4.0.3 + seroval: 1.5.1 + source-map: 0.7.6 + srvx: 0.11.9 + tinyglobby: 0.2.15 + ufo: 1.6.3 + vite: 7.3.1(@types/node@24.9.2)(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@24.9.2)(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.166.6(crossws@0.4.4(srvx@0.8.16))': dependencies: '@tanstack/history': 1.161.4 @@ -29831,12 +30367,29 @@ snapshots: transitivePeerDependencies: - crossws + '@tanstack/start-server-core@1.167.19(crossws@0.4.4(srvx@0.11.15))': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/router-core': 1.168.15 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-storage-context': 1.166.29 + h3-v2: h3@2.0.1-rc.20(crossws@0.4.4(srvx@0.11.15)) + seroval: 1.5.1 + transitivePeerDependencies: + - crossws + + '@tanstack/start-storage-context@1.166.29': + dependencies: + '@tanstack/router-core': 1.168.15 + '@tanstack/start-storage-context@1.166.6': dependencies: '@tanstack/router-core': 1.166.6 '@tanstack/store@0.9.2': {} + '@tanstack/store@0.9.3': {} + '@tanstack/table-core@8.20.5': {} '@tanstack/table-core@8.21.3': {} @@ -29845,6 +30398,8 @@ snapshots: '@tanstack/virtual-file-routes@1.161.4': {} + '@tanstack/virtual-file-routes@1.161.7': {} + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.27.1 @@ -30247,6 +30802,7 @@ snapshots: '@types/node@24.9.2': dependencies: undici-types: 7.16.0 + optional: true '@types/nodemailer@6.4.15': dependencies: @@ -30636,13 +31192,6 @@ snapshots: optionalDependencies: '@aws-sdk/credential-provider-web-identity': 3.972.27 - '@vercel/mcp-adapter@1.0.0(@modelcontextprotocol/sdk@1.17.2)(next@15.5.10(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': - dependencies: - '@modelcontextprotocol/sdk': 1.17.2 - mcp-handler: 1.0.1(@modelcontextprotocol/sdk@1.17.2)(next@15.5.10(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) - optionalDependencies: - next: 15.5.10(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@vercel/mcp-adapter@1.0.0(@modelcontextprotocol/sdk@1.17.2)(next@16.1.7(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': dependencies: '@modelcontextprotocol/sdk': 1.17.2 @@ -32078,6 +32627,8 @@ snapshots: cookie-es@2.0.0: {} + cookie-es@3.1.1: {} + cookie-signature@1.0.6: {} cookie-signature@1.2.2: {} @@ -32159,6 +32710,11 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crossws@0.4.4(srvx@0.11.15): + optionalDependencies: + srvx: 0.11.15 + optional: true + crossws@0.4.4(srvx@0.8.16): optionalDependencies: srvx: 0.8.16 @@ -33331,7 +33887,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-import-resolver-typescript@3.6.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@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) @@ -33355,7 +33911,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(@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-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-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.3 get-tsconfig: 4.8.1 @@ -33373,7 +33929,7 @@ snapshots: debug: 4.4.3 enhanced-resolve: 5.17.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.3(@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-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.3)(eslint@8.57.1) fast-glob: 3.3.3 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -33405,7 +33961,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(@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-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): dependencies: debug: 3.2.7 optionalDependencies: @@ -33416,7 +33972,7 @@ snapshots: transitivePeerDependencies: - 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.3(@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-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.3)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -33465,7 +34021,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(@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-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) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -33494,7 +34050,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.3(@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-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.3)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -34859,6 +35415,13 @@ snapshots: optionalDependencies: crossws: 0.4.4(srvx@0.8.16) + h3@2.0.1-rc.20(crossws@0.4.4(srvx@0.11.15)): + dependencies: + rou3: 0.8.1 + srvx: 0.11.15 + optionalDependencies: + crossws: 0.4.4(srvx@0.11.15) + hachure-fill@0.5.2: {} handlebars@4.7.8: @@ -35400,12 +35963,12 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - inquirer@12.3.0(@types/node@24.9.2): + inquirer@12.3.0(@types/node@20.17.6): dependencies: - '@inquirer/core': 10.3.2(@types/node@24.9.2) - '@inquirer/prompts': 7.10.1(@types/node@24.9.2) - '@inquirer/type': 3.0.10(@types/node@24.9.2) - '@types/node': 24.9.2 + '@inquirer/core': 10.3.2(@types/node@20.17.6) + '@inquirer/prompts': 7.10.1(@types/node@20.17.6) + '@inquirer/type': 3.0.10(@types/node@20.17.6) + '@types/node': 20.17.6 ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 @@ -36190,6 +36753,10 @@ snapshots: dependencies: react: 19.2.1 + lucide-react@0.378.0(react@19.2.3): + dependencies: + react: 19.2.3 + lucide-react@0.462.0(react@18.3.1): dependencies: react: 18.3.1 @@ -36212,6 +36779,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.8: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -36229,15 +36800,6 @@ snapshots: math-intrinsics@1.1.0: {} - mcp-handler@1.0.1(@modelcontextprotocol/sdk@1.17.2)(next@15.5.10(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): - dependencies: - '@modelcontextprotocol/sdk': 1.17.2 - chalk: 5.6.2 - commander: 11.1.0 - redis: 4.7.1 - optionalDependencies: - next: 15.5.10(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - mcp-handler@1.0.1(@modelcontextprotocol/sdk@1.17.2)(next@16.1.7(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)): dependencies: '@modelcontextprotocol/sdk': 1.17.2 @@ -36897,9 +37459,9 @@ snapshots: dependencies: minipass: 7.1.2 - mint@4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0): + mint@4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0): dependencies: - '@mintlify/cli': 4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/cli': 4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) transitivePeerDependencies: - '@radix-ui/react-popover' - '@types/node' @@ -37036,6 +37598,14 @@ snapshots: react: 18.3.1 use-intl: 3.19.1(react@18.3.1) + next-intl@3.19.1(next@16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@18.3.1): + dependencies: + '@formatjs/intl-localematcher': 0.5.4 + negotiator: 0.6.4 + next: 16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 18.3.1 + use-intl: 3.19.1(react@18.3.1) + next-mdx-remote-client@1.1.7(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(unified@11.0.5): dependencies: '@babel/code-frame': 7.29.0 @@ -37353,6 +37923,31 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@16.2.2(@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.2.2 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.10.16 + caniuse-lite: 1.0.30001751 + 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.29.0)(react@19.2.3) + optionalDependencies: + '@next/swc-darwin-arm64': 16.2.2 + '@next/swc-darwin-x64': 16.2.2 + '@next/swc-linux-arm64-gnu': 16.2.2 + '@next/swc-linux-arm64-musl': 16.2.2 + '@next/swc-linux-x64-gnu': 16.2.2 + '@next/swc-linux-x64-musl': 16.2.2 + '@next/swc-win32-arm64-msvc': 16.2.2 + '@next/swc-win32-x64-msvc': 16.2.2 + '@opentelemetry/api': 1.9.0 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nf3@0.1.12: {} nice-try@1.0.5: {} @@ -37367,7 +37962,7 @@ snapshots: jsonpath-plus: 10.4.0 lodash.topath: 4.5.2 - nitro@3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.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))(xml2js@0.6.2): + nitro@3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(rolldown@1.0.0-rc.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))(xml2js@0.6.2): dependencies: consola: 3.4.2 cookie-es: 2.0.0 @@ -37387,6 +37982,7 @@ snapshots: unenv: 2.0.0-rc.21 unstorage: 2.0.0-alpha.3(chokidar@4.0.3)(db0@0.3.4(@electric-sql/pglite@0.3.2)(mysql2@3.15.3))(lru-cache@11.2.2)(ofetch@1.5.1) optionalDependencies: + rolldown: 1.0.0-rc.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) xml2js: 0.6.2 transitivePeerDependencies: @@ -37813,7 +38409,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -38507,6 +39103,13 @@ snapshots: react-dom: 19.2.1(react@19.2.1) tslib: 2.8.1 + react-easy-crop@5.5.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + normalize-wheel: 1.0.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tslib: 2.8.1 + react-globe.gl@2.28.2(react@19.2.3): dependencies: globe.gl: 2.34.2 @@ -38530,6 +39133,10 @@ snapshots: dependencies: react: 19.2.1 + react-hook-form@7.70.0(react@19.2.3): + dependencies: + react: 19.2.3 + react-icons@5.2.1(react@18.3.1): dependencies: react: 18.3.1 @@ -40058,6 +40665,8 @@ snapshots: sqlstring@2.3.3: {} + srvx@0.11.15: {} + srvx@0.11.9: {} srvx@0.8.16: {} @@ -40621,6 +41230,18 @@ snapshots: term-size@2.2.1: {} + terser-webpack-plugin@5.3.14(esbuild@0.20.2)(webpack@5.92.0(esbuild@0.20.2)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.0 + webpack: 5.92.0(esbuild@0.20.2) + optionalDependencies: + esbuild: 0.20.2 + optional: true + terser-webpack-plugin@5.3.14(esbuild@0.24.2)(webpack@5.92.0(esbuild@0.24.2)): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -41062,7 +41683,8 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: {} + undici-types@7.16.0: + optional: true undici@6.19.8: {} @@ -41573,10 +42195,31 @@ snapshots: tsx: 4.21.0 yaml: 2.8.0 + vite@7.3.1(@types/node@24.9.2)(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': 24.9.2 + 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) + vitefu@1.1.2(vite@7.3.1(@types/node@24.9.2)(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@24.9.2)(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 @@ -41679,6 +42322,38 @@ snapshots: webpack-virtual-modules@0.6.2: {} + webpack@5.92.0(esbuild@0.20.2): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + browserslist: 4.27.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(esbuild@0.20.2)(webpack@5.92.0(esbuild@0.20.2)) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + optional: true + webpack@5.92.0(esbuild@0.24.2): dependencies: '@types/eslint-scope': 3.7.7 diff --git a/scripts/generate-sdks.ts b/scripts/generate-sdks.ts index ad6eed7ec6..b2c73a8378 100644 --- a/scripts/generate-sdks.ts +++ b/scripts/generate-sdks.ts @@ -191,6 +191,14 @@ withGeneratorLock(async () => { return baseEditFn({ relativePath, content, platforms: PLATFORMS["react"] }); }, }); + + generateFromTemplate({ + src: srcDir, + dest: path.resolve(baseDir, "tanstack-start"), + editFn: (relativePath, content) => { + return baseEditFn({ relativePath, content, platforms: PLATFORMS["tanstack-start"] }); + }, + }); }).catch((error) => { console.error(error); process.exit(1); diff --git a/scripts/utils.ts b/scripts/utils.ts index 3e33e5428b..72e05c995a 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -9,7 +9,8 @@ export const PLATFORMS = { "next": ['next', 'react-like', 'js-like'], "js": ['js', 'js-like'], "react": ['react', 'react-like', 'js-like'], - "template": ['template', 'react-like', 'next', 'js', 'js-like', 'python-like'], + "tanstack-start": ['tanstack-start', 'react', 'react-like', 'js-like'], + "template": ['template', 'react-like', 'next', 'js', 'js-like', 'python-like', 'tanstack-start'], "python": ['python', 'python-like'], } diff --git a/turbo.json b/turbo.json index 6e882d284d..5a392d98cc 100644 --- a/turbo.json +++ b/turbo.json @@ -4,6 +4,7 @@ "STACK_*", "CRON_SECRET", "NEXT_PUBLIC_*", + "VITE_*", "NEXT_PUBLIC_SENTRY_*", "SENTRY_*", "VERCEL_GIT_COMMIT_SHA", From 8d7f159863c6e2183682a149bd62549b85da2075 Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Thu, 30 Apr 2026 11:07:10 -0700 Subject: [PATCH 02/11] Enhance TanStack Start integration and documentation - Updated package.json scripts to include the new TanStack Start demo. - Added a new logo for TanStack Start in the dashboard. - Enhanced sidebar navigation to support external links for documentation. - Introduced new environment keys for Vite integration. - Created comprehensive setup instructions for TanStack Start in the documentation. - Added example project for TanStack Start to showcase integration with Stack Auth. This commit improves the developer experience by providing clear guidance and resources for integrating Stack Auth with TanStack Start applications. --- apps/dashboard/public/tanstack-start-logo.png | Bin 0 -> 14533 bytes .../[projectId]/(overview)/setup-page.tsx | 193 +++++- .../[projectId]/apps/[appId]/page-client.tsx | 16 +- .../projects/[projectId]/sidebar-layout.tsx | 8 +- apps/dashboard/src/components/app-square.tsx | 5 +- .../src/components/app-store-entry.tsx | 5 +- apps/dashboard/src/components/env-keys.tsx | 24 + apps/dashboard/src/lib/apps-frontend.tsx | 43 +- apps/dev-launchpad/public/index.html | 10 + docs-mintlify/docs.json | 1 + .../guides/getting-started/setup.mdx | 88 ++- .../integrations/tanstack-start/overview.mdx | 166 ++++++ examples/tanstack-start-demo/.env.development | 3 + examples/tanstack-start-demo/.eslintrc.cjs | 4 + examples/tanstack-start-demo/.gitignore | 4 + examples/tanstack-start-demo/package.json | 45 ++ .../tanstack-start-demo/postcss.config.js | 6 + examples/tanstack-start-demo/src/client.tsx | 12 + .../src/components/header.tsx | 23 + .../tanstack-start-demo/src/routeTree.gen.ts | 104 ++++ examples/tanstack-start-demo/src/router.tsx | 9 + .../tanstack-start-demo/src/routes/__root.tsx | 58 ++ .../src/routes/handler/$.tsx | 12 + .../tanstack-start-demo/src/routes/index.tsx | 76 +++ .../src/routes/protected.tsx | 23 + examples/tanstack-start-demo/src/stack.ts | 29 + examples/tanstack-start-demo/src/styles.css | 22 + .../tanstack-start-demo/tailwind.config.js | 12 + examples/tanstack-start-demo/tsconfig.json | 22 + examples/tanstack-start-demo/vite.config.ts | 175 ++++++ package.json | 4 +- packages/js/package.json | 2 +- packages/react/package.json | 2 +- packages/stack-shared/src/apps/apps-config.ts | 6 + packages/stack/package.json | 2 +- packages/tanstack-start/package.json | 32 +- packages/template/package-template.json | 8 - packages/template/package.json | 6 - .../components-page/stack-handler-client.tsx | 2 +- packages/template/src/lib/cookie.ts | 55 +- .../stack-app/apps/implementations/common.ts | 14 + .../template/src/providers/stack-provider.tsx | 33 +- pnpm-lock.yaml | 564 ++++++++++++------ scripts/generate-sdks.ts | 4 +- 44 files changed, 1695 insertions(+), 237 deletions(-) create mode 100644 apps/dashboard/public/tanstack-start-logo.png create mode 100644 docs-mintlify/guides/integrations/tanstack-start/overview.mdx create mode 100644 examples/tanstack-start-demo/.env.development create mode 100644 examples/tanstack-start-demo/.eslintrc.cjs create mode 100644 examples/tanstack-start-demo/.gitignore create mode 100644 examples/tanstack-start-demo/package.json create mode 100644 examples/tanstack-start-demo/postcss.config.js create mode 100644 examples/tanstack-start-demo/src/client.tsx create mode 100644 examples/tanstack-start-demo/src/components/header.tsx create mode 100644 examples/tanstack-start-demo/src/routeTree.gen.ts create mode 100644 examples/tanstack-start-demo/src/router.tsx create mode 100644 examples/tanstack-start-demo/src/routes/__root.tsx create mode 100644 examples/tanstack-start-demo/src/routes/handler/$.tsx create mode 100644 examples/tanstack-start-demo/src/routes/index.tsx create mode 100644 examples/tanstack-start-demo/src/routes/protected.tsx create mode 100644 examples/tanstack-start-demo/src/stack.ts create mode 100644 examples/tanstack-start-demo/src/styles.css create mode 100644 examples/tanstack-start-demo/tailwind.config.js create mode 100644 examples/tanstack-start-demo/tsconfig.json create mode 100644 examples/tanstack-start-demo/vite.config.ts diff --git a/apps/dashboard/public/tanstack-start-logo.png b/apps/dashboard/public/tanstack-start-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..41443b6c22812a4844de2f05aeb8ede073039c9a GIT binary patch literal 14533 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 deindent` +type SetupFramework = keyof typeof INSTALL_COMMAND_BY_FRAMEWORK; + +const TANSTACK_START_SETUP_PROMPT = deindent` + Please set up Stack Auth in my TanStack Start app. + + 1. Install the alpha TanStack Start package: + + npm install @stackframe/tanstack-start + + 2. Configure the app with these environment variables: + + VITE_STACK_PROJECT_ID= + STACK_SECRET_SERVER_KEY= + + 3. Create a StackClientApp using @stackframe/tanstack-start with: + - projectId: import.meta.env.VITE_STACK_PROJECT_ID + - tokenStore: "cookie" + - redirectMethod: "window" + + 4. Wrap the TanStack Start root route with StackProvider and StackTheme. + + 5. Add a /handler/$ route using StackHandler. The handler route must set ssr: false and pass location={pathname} from useLocation(). + + Use only the environment variables listed above. + + After it finishes, verify that the Stack Auth MCP server is registered in your AI client config — name: \`stack-auth\`, transport: \`http\`, URL: \`https://mcp.stack-auth.com/\`. If it is not registered, please add it manually so you have live access to Stack Auth docs and APIs. +`; + +const buildInstallPrompt = (framework: SetupFramework) => { + if (framework === "tanstackStart") { + return TANSTACK_START_SETUP_PROMPT; + } + + const command = INSTALL_COMMAND_BY_FRAMEWORK[framework]; + return deindent` Please run the following command in my project's terminal: ${command} After it finishes, verify that the Stack Auth MCP server is registered in your AI client config — name: \`stack-auth\`, transport: \`http\`, URL: \`https://mcp.stack-auth.com/\`. The command above should handle this automatically; if for any reason it didn't, please add the MCP server manually so you have live access to Stack Auth docs and APIs. `; +}; export default function SetupPage(props: { toMetrics: () => void }) { const adminApp = useAdminApp(); - const [selectedFramework, setSelectedFramework] = useState<'nextjs' | 'react' | 'javascript' | 'python'>('nextjs'); + const [selectedFramework, setSelectedFramework] = useState<'nextjs' | 'tanstackStart' | 'react' | 'javascript' | 'python'>('nextjs'); const [keys, setKeys] = useState<{ projectId: string, publishableClientKey?: string, secretServerKey: string } | null>(null); const projectConfig = adminApp.useProject().useConfig(); const requirePublishableClientKey = projectConfig.project.requirePublishableClientKey; @@ -220,6 +256,142 @@ export default function SetupPage(props: { toMetrics: () => void }) { } ]; + const tanstackStartSteps = [ + { + step: 2, + title: "Install Stack Auth", + content: <> + + In a new or existing TanStack Start project, install the alpha Stack Auth package: + + + npm install @stackframe/tanstack-start + + } + title="Terminal" + icon="terminal" + /> + + }, + { + step: 3, + title: "Create Keys", + content: <> + + Put these keys in your TanStack Start environment file. + + + + }, + { + step: 4, + title: "Create stack/client.ts file", + content: <> + + Create a new file called src/stack/client.ts and initialize Stack Auth with cookie storage. + + + + }, + { + step: 5, + title: "Update the root route", + content: <> + + Wrap your TanStack Start root route with StackProvider and StackTheme. + + + + + + + ); + } + + function RootDocument({ children }: { children: React.ReactNode }) { + return ( + + + + + + {children} + + + + ); + } + `} + title="src/routes/__root.tsx" + icon="code" + /> + + }, + { + step: 6, + title: "Add the handler route", + content: <> + + Create a splat route for Stack Auth's built-in auth pages. + + ; + } + `} + title="src/routes/handler/$.tsx" + icon="code" + /> + + If you start your TanStack Start app and navigate to http://localhost:3000/handler/sign-up, you will see the sign-up page. + + + }, + ]; + const javascriptSteps = [ { step: 2, @@ -480,7 +652,7 @@ export default function SetupPage(props: { toMetrics: () => void }) { Copy prompt @@ -500,6 +672,11 @@ export default function SetupPage(props: { toMetrics: () => void }) { name: 'Next.js', reverseIfDark: true, imgSrc: '/next-logo.svg', + }, { + id: 'tanstackStart', + name: 'TanStack Start', + reverseIfDark: false, + imgSrc: '/tanstack-start-logo.png', }, { id: 'react', name: 'React', @@ -538,6 +715,7 @@ export default function SetupPage(props: { toMetrics: () => void }) { , }, ...(selectedFramework === 'nextjs' ? nextJsSteps : []), + ...(selectedFramework === 'tanstackStart' ? tanstackStartSteps : []), ...(selectedFramework === 'react' ? reactSteps : []), ...(selectedFramework === 'javascript' ? javascriptSteps : []), ...(selectedFramework === 'python' ? pythonSteps : []), @@ -638,7 +816,7 @@ function GlobeIllustrationInner() { function StackAuthKeys(props: { keys: { projectId: string, publishableClientKey?: string, secretServerKey: string } | null, onGenerateKeys: () => Promise, - type: 'next' | 'raw', + type: 'next' | 'vite' | 'raw', }) { return (
@@ -650,6 +828,11 @@ function StackAuthKeys(props: { publishableClientKey={props.keys.publishableClientKey} secretServerKey={props.keys.secretServerKey} /> + ) : props.type === 'vite' ? ( + ) : ( { - router.push(subAppDestinationPath ?? appPath); + if (documentationHref != null) { + window.location.href = documentationHref; + } else { + router.push(subAppDestinationPath ?? appDestination); + } }; const handleDisable = async () => { diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/sidebar-layout.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/sidebar-layout.tsx index 6c395bd636..a7098614a7 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/sidebar-layout.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/sidebar-layout.tsx @@ -58,9 +58,11 @@ type AppSection = { items: { name: string, href: string, + external?: boolean, match: (fullUrl: URL) => boolean, }[], firstItemHref?: string, + firstItemExternal?: boolean, }; type BottomItem = { @@ -209,6 +211,7 @@ function NavItem({ if (isCollapsed) { // For sections, navigate to the first item when collapsed const collapsedHref = isSection && item.firstItemHref ? item.firstItemHref : href; + const collapsedTarget = isSection && item.firstItemExternal ? "_blank" : undefined; return (
@@ -226,7 +229,7 @@ function NavItem({ : "hover:bg-white/40 dark:hover:bg-background/60 text-muted-foreground hover:text-foreground" )} > - + @@ -351,6 +354,7 @@ function NavSubItem({ return ( ({ name: navItem.displayName, href: getItemPath(projectId, navigableFrontend, navItem), + external: navItem.external, match: (fullUrl: URL) => testItemPath(projectId, navigableFrontend, navItem, fullUrl), })); return { @@ -413,6 +418,7 @@ function AppNavItem({ href: getAppPath(projectId, appFrontend), icon: appFrontend.icon, firstItemHref: items[0]?.href, + firstItemExternal: items[0]?.external, }; }, [app.displayName, appId, appFrontend, projectId]); diff --git a/apps/dashboard/src/components/app-square.tsx b/apps/dashboard/src/components/app-square.tsx index 09537c2b72..5758d1ef0a 100644 --- a/apps/dashboard/src/components/app-square.tsx +++ b/apps/dashboard/src/components/app-square.tsx @@ -1,7 +1,7 @@ import { useAdminApp, useProjectId } from "@/app/(main)/(protected)/projects/[projectId]/use-admin-app"; import { useRouter } from "@/components/router"; import { Button, cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui"; -import { ALL_APPS_FRONTEND, AppFrontend, getAppPath, isSubApp } from "@/lib/apps-frontend"; +import { ALL_APPS_FRONTEND, AppFrontend, getAppPath, getDocumentationHref, isSubApp } from "@/lib/apps-frontend"; import { isAppEnabled } from "@/lib/apps-utils"; import { useUpdateConfig } from "@/lib/config-update"; import { CheckIcon, DotsThreeVerticalIcon } from "@phosphor-icons/react"; @@ -220,6 +220,7 @@ export function AppListItem({ const isEnabled = isAppEnabled(config.apps.installed, appId); const appPath = getAppPath(project.id, appFrontend); + const appDestinationPath = getDocumentationHref(appFrontend) ?? appPath; const appDetailsPath = `/projects/${project.id}/apps/${appId}`; const router = useRouter(); const parentAppId = isSubApp(appFrontend) ? appFrontend.parentAppId : null; @@ -249,7 +250,7 @@ export function AppListItem({ return ( (null); @@ -154,7 +155,7 @@ export function AppStoreEntry({ className="px-8 bg-blue-600 hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 text-white font-medium shadow-lg shadow-blue-500/20" > - Open App + {isDocumentationBackedApp ? "Open Docs" : "Open App"} {onDisable && ( + +
+
+ + ); + } + + return ( +
+
+
+ +
+

Signed in as

+

{user.displayName ?? user.primaryEmail ?? user.id}

+ {user.isRestricted && ( + + Restricted + + )} +
+
+ +
+
+
User ID
+
{user.id}
+
+ {user.primaryEmail && ( +
+
Email
+
{user.primaryEmail}
+
+ )} +
+
Restricted
+
{user.isRestricted ? `Yes${user.restrictedReason ? ` (${user.restrictedReason.type})` : ""}` : "No"}
+
+
+ +
+ +
+
+
+ ); +} diff --git a/examples/tanstack-start-demo/src/routes/protected.tsx b/examples/tanstack-start-demo/src/routes/protected.tsx new file mode 100644 index 0000000000..9cceb955eb --- /dev/null +++ b/examples/tanstack-start-demo/src/routes/protected.tsx @@ -0,0 +1,23 @@ +import { useUser } from "@stackframe/tanstack-start"; +import { createFileRoute } from "@tanstack/react-router"; + +export const Route = createFileRoute("/protected")({ + ssr: false, + component: ProtectedPage, +}); + +function ProtectedPage() { + const user = useUser({ or: "redirect" }); + + return ( +
+
+

Protected route

+

You can see this because you are signed in.

+

+ TanStack Start rendered this route with Stack Auth session state for {user.displayName ?? user.primaryEmail ?? user.id}. +

+
+
+ ); +} diff --git a/examples/tanstack-start-demo/src/stack.ts b/examples/tanstack-start-demo/src/stack.ts new file mode 100644 index 0000000000..a6b315a362 --- /dev/null +++ b/examples/tanstack-start-demo/src/stack.ts @@ -0,0 +1,29 @@ +import { StackClientApp } from "@stackframe/tanstack-start"; + +function getPortPrefix(): string { + return import.meta.env.NEXT_PUBLIC_STACK_PORT_PREFIX ?? "81"; +} + +function replaceStackPortPrefix(value: string): string { + return value.replace(/\$\{NEXT_PUBLIC_STACK_PORT_PREFIX:-81\}/g, getPortPrefix()); +} + +function getStackApiUrl(): string { + const configured = import.meta.env.VITE_STACK_API_URL as string | undefined; + return configured ? replaceStackPortPrefix(configured) : `http://localhost:${getPortPrefix()}02`; +} + +export function createStackApp() { + return new StackClientApp({ + projectId: import.meta.env.VITE_STACK_PROJECT_ID ?? "internal", + publishableClientKey: import.meta.env.VITE_STACK_PUBLISHABLE_CLIENT_KEY ?? "this-publishable-client-key-is-for-local-development-only", + baseUrl: getStackApiUrl(), + tokenStore: "cookie", + redirectMethod: "window", + urls: { + afterSignIn: "/protected", + afterSignUp: "/protected", + afterSignOut: "/", + }, + }); +} diff --git a/examples/tanstack-start-demo/src/styles.css b/examples/tanstack-start-demo/src/styles.css new file mode 100644 index 0000000000..1dfe7e7bf3 --- /dev/null +++ b/examples/tanstack-start-demo/src/styles.css @@ -0,0 +1,22 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + color-scheme: light; + background: rgb(244 244 245); +} + +html:has(head > [data-stack-theme="dark"]) { + color-scheme: dark; + background: rgb(9 9 11); +} + +body { + margin: 0; +} + +button, +a { + -webkit-tap-highlight-color: transparent; +} diff --git a/examples/tanstack-start-demo/tailwind.config.js b/examples/tanstack-start-demo/tailwind.config.js new file mode 100644 index 0000000000..4c91f98879 --- /dev/null +++ b/examples/tanstack-start-demo/tailwind.config.js @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: ["selector", 'html:has(head > [data-stack-theme="dark"])'], + content: [ + "./src/**/*.{js,ts,jsx,tsx}", + "../../packages/stack-ui/src/**/*.{ts,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/examples/tanstack-start-demo/tsconfig.json b/examples/tanstack-start-demo/tsconfig.json new file mode 100644 index 0000000000..9e06d75329 --- /dev/null +++ b/examples/tanstack-start-demo/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "target": "ES2022", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "skipLibCheck": true, + "isolatedModules": true, + "noEmit": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@stackframe/tanstack-start": ["../../packages/tanstack-start/src/index.ts"], + "@stackframe/tanstack-start/*": ["../../packages/tanstack-start/src/*"], + "~/*": ["./src/*"] + } + }, + "include": ["src", "vite.config.ts"] +} diff --git a/examples/tanstack-start-demo/vite.config.ts b/examples/tanstack-start-demo/vite.config.ts new file mode 100644 index 0000000000..375be86e8c --- /dev/null +++ b/examples/tanstack-start-demo/vite.config.ts @@ -0,0 +1,175 @@ +import fs, { readFileSync } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { tanstackStart } from "@tanstack/react-start/plugin/vite"; +import viteReact from "@vitejs/plugin-react"; +import { defineConfig, type Plugin } from "vite"; +import { nitro } from "nitro/vite"; +import tsConfigPaths from "vite-tsconfig-paths"; + +const tanstackStartPackagePath = fileURLToPath( + new URL("../../packages/tanstack-start/package.json", import.meta.url), +); +const tanstackStartSourcePath = fileURLToPath( + new URL("../../packages/tanstack-start/src/index.ts", import.meta.url), +); +const tanstackStartSourceRoot = fileURLToPath( + new URL("../../packages/tanstack-start/src/", import.meta.url), +); +const stackAuthRootPath = fileURLToPath(new URL("../..", import.meta.url)); +const tanstackStartPackageJson = JSON.parse( + readFileSync(tanstackStartPackagePath, "utf-8"), +) as { name: string, version: string }; + +function stackSdkSourceTransforms(): Plugin { + const packageVersionLabel = `js ${tanstackStartPackageJson.name}@${tanstackStartPackageJson.version}`; + + return { + name: "stack-sdk-source-transforms", + enforce: "pre", + transform(code, id) { + if (!id.startsWith(tanstackStartSourceRoot)) { + return null; + } + + const transformedCode = code + .replace(/STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION_SENTINEL/g, packageVersionLabel) + .replace(/import\.meta\.vitest/g, "undefined"); + + if (transformedCode === code) { + return null; + } + + return { + code: transformedCode, + map: null, + }; + }, + }; +} + +function tanStackStartServerBrowserStub(): Plugin { + const virtualModuleId = "\0tanstack-start-server-browser-stub"; + + return { + name: "tanstack-start-server-browser-stub", + enforce: "pre", + resolveId(source, _importer, options) { + if (source === "@tanstack/react-start/server" && !options.ssr) { + return virtualModuleId; + } + + return null; + }, + load(id) { + if (id !== virtualModuleId) { + return null; + } + + return ` + const throwServerOnly = () => { + throw new Error("@tanstack/react-start/server was called from the browser bundle"); + }; + + export const getCookie = throwServerOnly; + export const getCookies = throwServerOnly; + export const setCookie = throwServerOnly; + export const deleteCookie = throwServerOnly; + export const getRequestHeader = throwServerOnly; + `; + }, + }; +} + +function watchNodeModules(modules: string[]): Plugin { + return { + name: "watch-node-modules", + config() { + return { + server: { + watch: { + ignored: modules.map((moduleName) => `!**/node_modules/${moduleName}/**`), + }, + }, + }; + }, + }; +} + +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 = performance.now(); + return await new Promise((resolve, reject) => { + const interval = setInterval(() => { + if (fs.existsSync(filePath)) { + clearInterval(interval); + resolve(); + } else if (performance.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((pkg) => !fs.existsSync(pkg.entry)); + if (missing.length === 0) return; + console.log(`Waiting for workspace packages to build: ${missing.map((pkg) => pkg.name).join(", ")}`); + await Promise.all(missing.map((pkg) => waitForFile(pkg.entry))); + console.log("All workspace packages are ready."); + }, + }; +} + +export default defineConfig({ + server: { + port: Number(`${process.env.NEXT_PUBLIC_STACK_PORT_PREFIX || "81"}42`), + fs: { + allow: [stackAuthRootPath], + }, + }, + build: { + rollupOptions: { + output: { + manualChunks(id) { + if (id.startsWith(tanstackStartSourceRoot)) { + return "stack-auth-sdk"; + } + return undefined; + }, + }, + }, + }, + resolve: { + dedupe: ["react", "react-dom"], + alias: { + "@stackframe/tanstack-start": tanstackStartSourcePath, + }, + }, + ssr: { + noExternal: [/^@stackframe\//, /^@radix-ui\//], + }, + optimizeDeps: { + include: ["@stackframe/stack-shared", "@stackframe/stack-shared/config"], + }, + plugins: [ + stackSdkSourceTransforms(), + tanStackStartServerBrowserStub(), + waitForWorkspacePackages(["@stackframe/tanstack-start", "@stackframe/stack-shared", "@stackframe/stack-ui"]), + watchNodeModules(["@stackframe/tanstack-start", "@stackframe/stack-shared", "@stackframe/stack-ui"]), + tsConfigPaths(), + tanstackStart(), + nitro(), + viteReact(), + ], +}); diff --git a/package.json b/package.json index 7828d0154a..4c78a7246f 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,8 @@ "db:migrate": "pnpm pre && pnpm run --filter=@stackframe/backend db:migrate", "fern": "pnpm pre && pnpm run --filter=@stackframe/docs fern", "dev:full": "pnpm pre && concurrently -k \"pnpm run generate-sdks:watch\" \"turbo run dev --concurrency 99999\"", - "dev": "pnpm pre && concurrently -k \"pnpm run generate-sdks:watch\" \"pnpm run generate-openapi-docs:watch\" \"turbo run dev --concurrency 99999 --filter=./apps/* --filter=@stackframe/docs-mintlify --filter=@stackframe/stack-docs --filter=./packages/* --filter=./examples/demo \"", - "dev:tui": "pnpm pre && (trap 'kill 0' EXIT; pnpm run generate-sdks:watch & pnpm run generate-openapi-docs:watch & turbo run dev --ui tui --concurrency 99999 --filter=./apps/* --filter=@stackframe/stack-docs --filter=./packages/* --filter=./examples/demo)", + "dev": "pnpm pre && concurrently -k \"pnpm run generate-sdks:watch\" \"pnpm run generate-openapi-docs:watch\" \"turbo run dev --concurrency 99999 --filter=./apps/* --filter=@stackframe/docs-mintlify --filter=@stackframe/stack-docs --filter=./packages/* --filter=./examples/demo --filter=./examples/tanstack-start-demo \"", + "dev:tui": "pnpm pre && (trap 'kill 0' EXIT; pnpm run generate-sdks:watch & pnpm run generate-openapi-docs:watch & turbo run dev --ui tui --concurrency 99999 --filter=./apps/* --filter=@stackframe/stack-docs --filter=./packages/* --filter=./examples/demo --filter=./examples/tanstack-start-demo)", "dev:inspect": "pnpm pre && STACK_BACKEND_DEV_EXTRA_ARGS=\"--inspect\" pnpm run dev", "dev:profile": "pnpm pre && STACK_BACKEND_DEV_EXTRA_ARGS=\"--experimental-cpu-prof\" pnpm run dev", "dev:basic": "pnpm pre && concurrently -k \"pnpm run generate-sdks:watch\" \"turbo run dev --concurrency 99999 --filter=@stackframe/backend --filter=@stackframe/dashboard --filter=@stackframe/mock-oauth-server\"", diff --git a/packages/js/package.json b/packages/js/package.json index 5b1d261a50..47e8e347c3 100644 --- a/packages/js/package.json +++ b/packages/js/package.json @@ -85,4 +85,4 @@ "tsdown": "^0.20.3", "convex": "^1.27.0" } -} \ No newline at end of file +} diff --git a/packages/react/package.json b/packages/react/package.json index 530b22741f..297a38644f 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -114,4 +114,4 @@ "tsdown": "^0.20.3", "convex": "^1.27.0" } -} \ No newline at end of file +} diff --git a/packages/stack-shared/src/apps/apps-config.ts b/packages/stack-shared/src/apps/apps-config.ts index 92a5cb9726..63db82190e 100644 --- a/packages/stack-shared/src/apps/apps-config.ts +++ b/packages/stack-shared/src/apps/apps-config.ts @@ -150,6 +150,12 @@ export const ALL_APPS = { tags: ["integration", "developers"], stage: "stable", }, + "tanstack-start": { + displayName: "TanStack Start", + subtitle: "Use Stack Auth in TanStack Start apps", + tags: ["integration", "developers"], + stage: "alpha", + }, "analytics": { displayName: "Analytics", subtitle: "View and explore analytics data", diff --git a/packages/stack/package.json b/packages/stack/package.json index 08984b2971..848d10e3c3 100644 --- a/packages/stack/package.json +++ b/packages/stack/package.json @@ -122,4 +122,4 @@ "tsdown": "^0.20.3", "convex": "^1.27.0" } -} \ No newline at end of file +} diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json index b20afb31e2..bba1c2332a 100644 --- a/packages/tanstack-start/package.json +++ b/packages/tanstack-start/package.json @@ -9,18 +9,30 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "import": "./dist/esm/index.js", - "require": "./dist/index.js" + "import": { + "default": "./dist/esm/index.js" + }, + "require": { + "default": "./dist/index.js" + } }, "./convex.config": { "types": "./dist/integrations/convex/component/convex.config.d.ts", - "import": "./dist/esm/integrations/convex/component/convex.config.js", - "require": "./dist/integrations/convex/component/convex.config.js" + "import": { + "default": "./dist/esm/integrations/convex/component/convex.config.js" + }, + "require": { + "default": "./dist/integrations/convex/component/convex.config.js" + } }, "./convex-auth.config": { "types": "./dist/integrations/convex.d.ts", - "import": "./dist/esm/integrations/convex.js", - "require": "./dist/integrations/convex.js" + "import": { + "default": "./dist/esm/integrations/convex.js" + }, + "require": { + "default": "./dist/integrations/convex.js" + } } }, "homepage": "https://stack-auth.com", @@ -78,12 +90,6 @@ "react": ">=18.3.0" }, "peerDependenciesMeta": { - "@tanstack/react-router": { - "optional": true - }, - "@tanstack/react-start": { - "optional": true - }, "@types/react": { "optional": true } @@ -112,4 +118,4 @@ "tsdown": "^0.20.3", "convex": "^1.27.0" } -} \ No newline at end of file +} diff --git a/packages/template/package-template.json b/packages/template/package-template.json index 92afc910d6..09b29378c5 100644 --- a/packages/template/package-template.json +++ b/packages/template/package-template.json @@ -147,14 +147,6 @@ "optional": true }, "//": "END_PLATFORM", - "//": "IF_PLATFORM tanstack-start", - "@tanstack/react-router": { - "optional": true - }, - "@tanstack/react-start": { - "optional": true - }, - "//": "END_PLATFORM", "@types/react": { "optional": true } diff --git a/packages/template/package.json b/packages/template/package.json index ab7bad4dc2..5d4720aa59 100644 --- a/packages/template/package.json +++ b/packages/template/package.json @@ -102,12 +102,6 @@ "@types/react-dom": { "optional": true }, - "@tanstack/react-router": { - "optional": true - }, - "@tanstack/react-start": { - "optional": true - }, "@types/react": { "optional": true } diff --git a/packages/template/src/components-page/stack-handler-client.tsx b/packages/template/src/components-page/stack-handler-client.tsx index efe95f8dd2..dcb929f96a 100644 --- a/packages/template/src/components-page/stack-handler-client.tsx +++ b/packages/template/src/components-page/stack-handler-client.tsx @@ -236,7 +236,7 @@ export function StackHandlerClient(props: BaseHandlerProps & Partial const navigate = stackApp.useNavigate(); const navigateRef = useRef(navigate); navigateRef.current = navigate; - const currentLocation = props.location ?? window.location.pathname; + const currentLocation = props.location ?? (typeof window === "undefined" ? new URL(stackApp.urls.handler, placeholderOrigin).pathname : window.location.pathname); const searchParamsSource = new URLSearchParams(typeof window === "undefined" ? "" : window.location.search); const redirectTargets: (string | undefined)[] = []; END_PLATFORM */ diff --git a/packages/template/src/lib/cookie.ts b/packages/template/src/lib/cookie.ts index aa07b4812b..7b6a43e6ad 100644 --- a/packages/template/src/lib/cookie.ts +++ b/packages/template/src/lib/cookie.ts @@ -96,6 +96,16 @@ export async function createPlaceholderCookieHelper(): Promise { }; } +function requiresSecureAttribute(name: string): boolean { + return name.startsWith("__Host-"); +} + +function validateCookieOptions(name: string, options: DeleteCookieOptions | SetCookieOptions) { + if (requiresSecureAttribute(name) && options.domain !== undefined) { + throw new StackAssertionError("__Host- cookies must not specify a Domain attribute"); + } +} + export async function createCookieHelper(): Promise { if (isBrowserLike()) { return createBrowserCookieHelper(); @@ -139,17 +149,30 @@ function determineSecureFromTanStackStartContext(): boolean { || (tssGetCookie("stack-is-https") !== undefined); } -function requiresSecureAttribute(name: string): boolean { - return name.startsWith("__Host-"); +function refreshTanStackStartIsHttpsCookie() { + tssSetCookie("stack-is-https", "true", { + secure: true, + maxAge: 60 * 60 * 24 * 365, + sameSite: "lax", + path: "/", + }); } function createTanStackStartCookieHelper(): CookieHelper { const helper: CookieHelper = { - get: (name: string) => tssGetCookie(name) ?? null, - getAll: () => tssGetCookies(), + get: (name: string) => { + const all = helper.getAll(); + return all[name] ?? null; + }, + getAll: () => { + // set a helper cookie, see comment in `NextCookieHelper.set` below + refreshTanStackStartIsHttpsCookie(); + return tssGetCookies(); + }, set: (name: string, value: string, options: SetCookieOptions) => { + validateCookieOptions(name, options); tssSetCookie(name, value, { - secure: options.secure ?? (requiresSecureAttribute(name) || determineSecureFromTanStackStartContext()), + secure: requiresSecureAttribute(name) || (options.secure ?? determineSecureFromTanStackStartContext()), maxAge: options.maxAge === "session" ? undefined : options.maxAge, domain: options.domain, sameSite: "lax", @@ -161,8 +184,10 @@ function createTanStackStartCookieHelper(): CookieHelper { else helper.set(name, value, options); }, delete: (name: string, options: DeleteCookieOptions) => { + validateCookieOptions(name, options); + const secure = requiresSecureAttribute(name) || determineSecureFromTanStackStartContext(); tssDeleteCookie(name, { - secure: requiresSecureAttribute(name), + secure, domain: options.domain, path: "/", }); @@ -228,6 +253,7 @@ function createNextCookieHelper( }, {} as Record); }, set: (name: string, value: string, options: SetCookieOptions) => { + validateCookieOptions(name, options); // Whenever the client is on HTTPS, we want to set the Secure flag on the cookie. // // This is not easy to find out on a Next.js server, so see the algorithm at the top of this file. @@ -239,10 +265,11 @@ function createNextCookieHelper( try { rscCookiesAwaited.set(name, value, { - secure: isSecureCookie, + secure: requiresSecureAttribute(name) || isSecureCookie, maxAge: options.maxAge === "session" ? undefined : options.maxAge, domain: options.domain, sameSite: "lax", + path: "/", }); } catch (e) { handleCookieError(e, options); @@ -257,10 +284,11 @@ function createNextCookieHelper( }, delete(name: string, options: DeleteCookieOptions) { try { + validateCookieOptions(name, options); if (options.domain !== undefined) { - rscCookiesAwaited.delete({ name, domain: options.domain }); + rscCookiesAwaited.delete({ name, domain: options.domain, path: "/" }); } else { - rscCookiesAwaited.delete(name); + rscCookiesAwaited.delete({ name, path: "/" }); } } catch (e) { handleCookieError(e, options); @@ -363,12 +391,14 @@ function _internalShouldSetPartitionedClient() { } function setCookieClientInternal(name: string, value: string, options: SetCookieOptions) { - const secure = options.secure ?? determineSecureFromClientContext(); + validateCookieOptions(name, options); + const secure = requiresSecureAttribute(name) || (options.secure ?? determineSecureFromClientContext()); const partitioned = shouldSetPartitionedClient(); Cookies.set(name, value, { expires: options.maxAge === "session" ? undefined : new Date(Date.now() + (options.maxAge) * 1000), domain: options.domain, secure, + path: "/", sameSite: "Lax", ...(partitioned ? { partitioned, @@ -378,11 +408,12 @@ function setCookieClientInternal(name: string, value: string, options: SetCookie } function deleteCookieClientInternal(name: string, options: DeleteCookieOptions) { + validateCookieOptions(name, options); for (const partitioned of [true, false]) { if (options.domain !== undefined) { - Cookies.remove(name, { domain: options.domain, secure: determineSecureFromClientContext(), partitioned }); + Cookies.remove(name, { domain: options.domain, secure: determineSecureFromClientContext(), partitioned, path: "/" }); } - Cookies.remove(name, { secure: determineSecureFromClientContext(), partitioned }); + Cookies.remove(name, { secure: requiresSecureAttribute(name) || determineSecureFromClientContext(), partitioned, path: "/" }); } } diff --git a/packages/template/src/lib/stack-app/apps/implementations/common.ts b/packages/template/src/lib/stack-app/apps/implementations/common.ts index 960264e586..dd7fe01ddc 100644 --- a/packages/template/src/lib/stack-app/apps/implementations/common.ts +++ b/packages/template/src/lib/stack-app/apps/implementations/common.ts @@ -184,7 +184,17 @@ export function createEmptyTokenStore() { const cachePromiseByHookId = new Map>>(); export function useAsyncCache(cache: AsyncCache>, dependencies: D, caller: string): T { // we explicitly don't want to run this hook in SSR + // IF_PLATFORM tanstack-start + if (!isBrowserLike()) { + const result = use(cache.getOrWait(dependencies, "read-write")); + if (result.status === "error") { + throw result.error; + } + return result.data; + } + // ELSE_PLATFORM suspendIfSsr(caller); + // END_PLATFORM // on the dashboard, we do some perf monitoring for pre-fetching which should hook right in here const asyncCacheHooks: any[] = getGlobal("use-async-cache-execution-hooks") ?? []; @@ -220,7 +230,11 @@ export function useAsyncCache(cache: AsyncCache const promise = React.useSyncExternalStore( subscribe, getSnapshot, + // IF_PLATFORM tanstack-start + getSnapshot, + // ELSE_PLATFORM () => throwErr(new Error("getServerSnapshot should never be called in useAsyncCache because we restrict to CSR earlier")) + // END_PLATFORM ); const result = use(promise); diff --git a/packages/template/src/providers/stack-provider.tsx b/packages/template/src/providers/stack-provider.tsx index cb985cd318..38f60c7699 100644 --- a/packages/template/src/providers/stack-provider.tsx +++ b/packages/template/src/providers/stack-provider.tsx @@ -31,6 +31,35 @@ function NextStackProvider({ ); } +// ELSE_IF_PLATFORM tanstack-start +function TanStackStartStackProvider({ + children, + app, + lang, + translationOverrides, +}: { + lang?: React.ComponentProps['lang'], + /** + * A mapping of English translations to translated equivalents. + * + * These will take priority over the translations from the language specified in the `lang` property. Note that the + * keys are case-sensitive. + */ + translationOverrides?: Record, + children: React.ReactNode, + // list all three types of apps even though server and admin are subclasses of client so it's clear that you can pass any + app: StackClientApp, +}) { + return ( + + + + {children} + + + + ); +} // ELSE_PLATFORM function ReactStackProvider({ children, @@ -63,6 +92,8 @@ function ReactStackProvider({ // IF_PLATFORM next export default NextStackProvider; -/* ELSE_PLATFORM +/* ELSE_IF_PLATFORM tanstack-start +export default TanStackStartStackProvider; +ELSE_PLATFORM export default ReactStackProvider; END_PLATFORM */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 710b10b72f..370cd838cb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,7 +71,7 @@ importers: version: 14.2.17(eslint@8.57.1)(typescript@5.9.3) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + version: 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-node: specifier: ^11.1.0 version: 11.1.0(eslint@8.57.1) @@ -1020,7 +1020,7 @@ importers: devDependencies: mint: specifier: ^4.2.487 - version: 4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + version: 4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) examples/cjs-test: dependencies: @@ -1598,6 +1598,82 @@ importers: specifier: 5.9.3 version: 5.9.3 + examples/tanstack-start-demo: + dependencies: + '@stackframe/stack-shared': + specifier: workspace:* + version: link:../../packages/stack-shared + '@stackframe/stack-ui': + specifier: workspace:* + version: link:../../packages/stack-ui + '@stackframe/tanstack-start': + specifier: workspace:* + version: link:../../packages/tanstack-start + '@tanstack/react-router': + specifier: ^1.168.23 + version: 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start': + specifier: ^1.167.42 + version: 1.167.42(crossws@0.4.4(srvx@0.11.15))(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.166.40 + version: 1.166.40(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-server': + specifier: ^1.166.41 + version: 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/start-client-core': + specifier: ^1.167.17 + version: 1.167.17 + '@tanstack/start-plugin-core': + specifier: ^1.167.35 + version: 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(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.167.19 + version: 1.167.19(crossws@0.4.4(srvx@0.11.15)) + nitro: + specifier: ^3.0.0 + version: 3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(rolldown@1.0.0-rc.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))(xml2js@0.6.2) + react: + specifier: 19.2.1 + version: 19.2.1 + react-dom: + specifier: 19.2.1 + version: 19.2.1(react@19.2.1) + 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)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.21(postcss@8.5.6) + postcss: + specifier: ^8.4.47 + version: 8.5.6 + rimraf: + specifier: ^5.0.10 + version: 5.0.10 + tailwindcss: + specifier: ^3.4.14 + version: 3.4.18(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)) + packages/dashboard-ui-components: dependencies: '@dnd-kit/core': @@ -2476,13 +2552,13 @@ importers: devDependencies: '@quetzallabs/i18n': specifier: ^0.1.19 - version: 0.1.19(next@16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) + version: 0.1.19(next@16.2.2(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)) '@tanstack/react-router': specifier: ^1.167.4 version: 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-start': specifier: ^1.166.15 - version: 1.167.42(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + version: 1.167.42(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) '@types/color': specifier: ^3.0.6 version: 3.0.6 @@ -2630,7 +2706,7 @@ importers: version: 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/react-start': specifier: ^1.166.15 - version: 1.167.42(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + version: 1.167.42(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) '@types/color': specifier: ^3.0.6 version: 3.0.6 @@ -21203,22 +21279,22 @@ snapshots: '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -21295,7 +21371,7 @@ snapshots: '@babel/helpers@7.26.0': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@babel/helpers@7.28.4': dependencies: @@ -21309,7 +21385,7 @@ snapshots: '@babel/parser@7.25.6': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@babel/parser@7.28.5': dependencies: @@ -21400,9 +21476,9 @@ snapshots: '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@babel/template@7.27.2': dependencies: @@ -21418,11 +21494,11 @@ snapshots: '@babel/traverse@7.25.6': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: @@ -22997,6 +23073,16 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/checkbox@4.3.2(@types/node@24.9.2)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.9.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/confirm@5.1.21(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -23004,6 +23090,13 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/confirm@5.1.21(@types/node@24.9.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/type': 3.0.10(@types/node@24.9.2) + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/core@10.3.2(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -23017,6 +23110,19 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/core@10.3.2(@types/node@24.9.2)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.9.2) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/editor@4.2.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -23025,6 +23131,14 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/editor@4.2.23(@types/node@24.9.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/external-editor': 1.0.3(@types/node@24.9.2) + '@inquirer/type': 3.0.10(@types/node@24.9.2) + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/expand@4.0.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -23033,6 +23147,14 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/expand@4.0.23(@types/node@24.9.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/type': 3.0.10(@types/node@24.9.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/external-editor@1.0.3(@types/node@20.17.6)': dependencies: chardet: 2.1.1 @@ -23040,6 +23162,13 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/external-editor@1.0.3(@types/node@24.9.2)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/figures@1.0.15': {} '@inquirer/figures@1.0.3': {} @@ -23051,6 +23180,13 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/input@4.3.1(@types/node@24.9.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/type': 3.0.10(@types/node@24.9.2) + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/number@3.0.23(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -23058,6 +23194,13 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/number@3.0.23(@types/node@24.9.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/type': 3.0.10(@types/node@24.9.2) + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/password@4.0.23(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -23066,6 +23209,14 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/password@4.0.23(@types/node@24.9.2)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/type': 3.0.10(@types/node@24.9.2) + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/prompts@7.10.1(@types/node@20.17.6)': dependencies: '@inquirer/checkbox': 4.3.2(@types/node@20.17.6) @@ -23081,20 +23232,35 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 - '@inquirer/prompts@7.9.0(@types/node@20.17.6)': + '@inquirer/prompts@7.10.1(@types/node@24.9.2)': dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@20.17.6) - '@inquirer/confirm': 5.1.21(@types/node@20.17.6) - '@inquirer/editor': 4.2.23(@types/node@20.17.6) - '@inquirer/expand': 4.0.23(@types/node@20.17.6) - '@inquirer/input': 4.3.1(@types/node@20.17.6) - '@inquirer/number': 3.0.23(@types/node@20.17.6) - '@inquirer/password': 4.0.23(@types/node@20.17.6) - '@inquirer/rawlist': 4.1.11(@types/node@20.17.6) - '@inquirer/search': 3.2.2(@types/node@20.17.6) - '@inquirer/select': 4.4.2(@types/node@20.17.6) + '@inquirer/checkbox': 4.3.2(@types/node@24.9.2) + '@inquirer/confirm': 5.1.21(@types/node@24.9.2) + '@inquirer/editor': 4.2.23(@types/node@24.9.2) + '@inquirer/expand': 4.0.23(@types/node@24.9.2) + '@inquirer/input': 4.3.1(@types/node@24.9.2) + '@inquirer/number': 3.0.23(@types/node@24.9.2) + '@inquirer/password': 4.0.23(@types/node@24.9.2) + '@inquirer/rawlist': 4.1.11(@types/node@24.9.2) + '@inquirer/search': 3.2.2(@types/node@24.9.2) + '@inquirer/select': 4.4.2(@types/node@24.9.2) optionalDependencies: - '@types/node': 20.17.6 + '@types/node': 24.9.2 + + '@inquirer/prompts@7.9.0(@types/node@24.9.2)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@24.9.2) + '@inquirer/confirm': 5.1.21(@types/node@24.9.2) + '@inquirer/editor': 4.2.23(@types/node@24.9.2) + '@inquirer/expand': 4.0.23(@types/node@24.9.2) + '@inquirer/input': 4.3.1(@types/node@24.9.2) + '@inquirer/number': 3.0.23(@types/node@24.9.2) + '@inquirer/password': 4.0.23(@types/node@24.9.2) + '@inquirer/rawlist': 4.1.11(@types/node@24.9.2) + '@inquirer/search': 3.2.2(@types/node@24.9.2) + '@inquirer/select': 4.4.2(@types/node@24.9.2) + optionalDependencies: + '@types/node': 24.9.2 '@inquirer/rawlist@4.1.11(@types/node@20.17.6)': dependencies: @@ -23104,6 +23270,14 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/rawlist@4.1.11(@types/node@24.9.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/type': 3.0.10(@types/node@24.9.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/search@3.2.2(@types/node@20.17.6)': dependencies: '@inquirer/core': 10.3.2(@types/node@20.17.6) @@ -23113,6 +23287,15 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/search@3.2.2(@types/node@24.9.2)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.9.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/select@4.4.2(@types/node@20.17.6)': dependencies: '@inquirer/ansi': 1.0.2 @@ -23123,10 +23306,24 @@ snapshots: optionalDependencies: '@types/node': 20.17.6 + '@inquirer/select@4.4.2(@types/node@24.9.2)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.9.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.9.2 + '@inquirer/type@3.0.10(@types/node@20.17.6)': optionalDependencies: '@types/node': 20.17.6 + '@inquirer/type@3.0.10(@types/node@24.9.2)': + optionalDependencies: + '@types/node': 24.9.2 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -23264,9 +23461,9 @@ snapshots: dependencies: langium: 3.3.1 - '@mintlify/cli@4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': + '@mintlify/cli@4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0)': dependencies: - '@inquirer/prompts': 7.9.0(@types/node@20.17.6) + '@inquirer/prompts': 7.9.0(@types/node@24.9.2) '@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) '@mintlify/link-rot': 3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) '@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) @@ -23279,7 +23476,7 @@ snapshots: front-matter: 4.0.2 fs-extra: 11.2.0 ink: 6.3.0(@types/react@18.3.12)(react@19.2.3) - inquirer: 12.3.0(@types/node@20.17.6) + inquirer: 12.3.0(@types/node@24.9.2) js-yaml: 4.1.0 mdast-util-mdx-jsx: 3.2.0 open: 8.4.2 @@ -25415,7 +25612,7 @@ snapshots: - next - supports-color - '@quetzallabs/i18n@0.1.19(next@16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': + '@quetzallabs/i18n@0.1.19(next@16.2.2(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))': dependencies: '@babel/parser': 7.25.6 '@babel/traverse': 7.25.6 @@ -25423,7 +25620,7 @@ snapshots: dotenv: 10.0.0 i18next: 21.10.0 i18next-parser: 9.0.2 - next-intl: 3.19.1(next@16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@18.3.1) + next-intl: 3.19.1(next@16.2.2(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@18.3.1) path: 0.12.7 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -28393,7 +28590,7 @@ snapshots: '@sentry/bundler-plugin-core@4.3.0(encoding@0.1.13)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.29.0 '@sentry/babel-plugin-component-annotate': 4.3.0 '@sentry/cli': 2.53.0(encoding@0.1.13) dotenv: 16.6.1 @@ -29901,7 +30098,7 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-rsc@0.0.21(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + '@tanstack/react-start-rsc@0.0.21(crossws@0.4.4(srvx@0.11.15))(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.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/react-start-server': 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -29909,7 +30106,29 @@ snapshots: '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 '@tanstack/start-fn-stubs': 1.161.6 - '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(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.167.19(crossws@0.4.4(srvx@0.11.15)) + '@tanstack/start-storage-context': 1.166.29 + pathe: 2.0.3 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + transitivePeerDependencies: + - '@rsbuild/core' + - crossws + - supports-color + - vite + - vite-plugin-solid + - webpack + + '@tanstack/react-start-rsc@0.0.21(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))': + dependencies: + '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-server': 1.166.41(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/router-core': 1.168.15 + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-fn-stubs': 1.161.6 + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) '@tanstack/start-storage-context': 1.166.29 pathe: 2.0.3 @@ -29923,15 +30142,15 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start-rsc@0.0.21(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + '@tanstack/react-start-rsc@0.0.21(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))': dependencies: '@tanstack/react-router': 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-server': 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-server': 1.166.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/router-core': 1.168.15 '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 '@tanstack/start-fn-stubs': 1.161.6 - '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) '@tanstack/start-storage-context': 1.166.29 pathe: 2.0.3 @@ -29957,7 +30176,19 @@ snapshots: transitivePeerDependencies: - crossws - '@tanstack/react-start-server@1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-start-server@1.166.41(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/router-core': 1.168.15 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + transitivePeerDependencies: + - crossws + + '@tanstack/react-start-server@1.166.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@tanstack/history': 1.161.6 '@tanstack/react-router': 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -30001,15 +30232,36 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start@1.167.42(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + '@tanstack/react-start@1.167.42(crossws@0.4.4(srvx@0.11.15))(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.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/react-start-client': 1.166.40(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@tanstack/react-start-rsc': 0.0.21(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/react-start-rsc': 0.0.21(crossws@0.4.4(srvx@0.11.15))(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-server': 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 - '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(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.167.19(crossws@0.4.4(srvx@0.11.15)) + pathe: 2.0.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' + - crossws + - supports-color + - vite-plugin-solid + - webpack + + '@tanstack/react-start@1.167.42(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))': + dependencies: + '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-client': 1.166.40(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-rsc': 0.0.21(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) + '@tanstack/react-start-server': 1.166.41(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) pathe: 2.0.3 react: 19.2.1 @@ -30022,15 +30274,15 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start@1.167.42(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + '@tanstack/react-start@1.167.42(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))': dependencies: '@tanstack/react-router': 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-start-client': 1.166.40(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-rsc': 0.0.21(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(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.20.2)) - '@tanstack/react-start-server': 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-rsc': 0.0.21(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) + '@tanstack/react-start-server': 1.166.41(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 - '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) pathe: 2.0.3 react: 19.2.3 @@ -30165,7 +30417,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.23(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.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-generator': 1.166.32 + '@tanstack/router-utils': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 + chokidar: 3.6.0 + unplugin: 2.3.11 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.168.23(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: + - supports-color + + '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@24.9.2)(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-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -30183,11 +30457,10 @@ snapshots: optionalDependencies: '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) vite: 7.3.1(@types/node@24.9.2)(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.20.2) transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@24.9.2)(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-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -30205,7 +30478,6 @@ snapshots: optionalDependencies: '@tanstack/react-router': 1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3) vite: 7.3.1(@types/node@24.9.2)(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.20.2) transitivePeerDependencies: - supports-color @@ -30289,7 +30561,7 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-plugin-core@1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + '@tanstack/start-plugin-core@1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(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.29.0 @@ -30297,7 +30569,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.168.15 '@tanstack/router-generator': 1.166.32 - '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.23(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.6 '@tanstack/start-client-core': 1.167.17 '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) @@ -30307,7 +30579,40 @@ snapshots: picomatch: 4.0.3 seroval: 1.5.1 source-map: 0.7.6 - srvx: 0.11.9 + srvx: 0.11.15 + tinyglobby: 0.2.15 + ufo: 1.6.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) + 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-plugin-core@1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/core': 7.29.0 + '@babel/types': 7.29.0 + '@rolldown/pluginutils': 1.0.0-beta.40 + '@tanstack/router-core': 1.168.15 + '@tanstack/router-generator': 1.166.32 + '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) + '@tanstack/router-utils': 1.161.6 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + cheerio: 1.0.0 + exsolve: 1.0.8 + pathe: 2.0.3 + picomatch: 4.0.3 + seroval: 1.5.1 + source-map: 0.7.6 + srvx: 0.11.15 tinyglobby: 0.2.15 ufo: 1.6.3 vite: 7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) @@ -30322,7 +30627,7 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-plugin-core@1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.4(srvx@0.11.15))(vite@7.3.1(@types/node@24.9.2)(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.20.2))': + '@tanstack/start-plugin-core@1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -30330,7 +30635,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.168.15 '@tanstack/router-generator': 1.166.32 - '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@24.9.2)(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.20.2)) + '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) @@ -30340,7 +30645,7 @@ snapshots: picomatch: 4.0.3 seroval: 1.5.1 source-map: 0.7.6 - srvx: 0.11.9 + srvx: 0.11.15 tinyglobby: 0.2.15 ufo: 1.6.3 vite: 7.3.1(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) @@ -30802,7 +31107,6 @@ snapshots: '@types/node@24.9.2': dependencies: undici-types: 7.16.0 - optional: true '@types/nodemailer@6.4.15': dependencies: @@ -31845,7 +32149,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/parser': 7.28.5 '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -33887,7 +34191,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) @@ -33911,7 +34215,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.3 get-tsconfig: 4.8.1 @@ -33954,14 +34258,14 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - 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) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - 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: @@ -33994,16 +34298,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.56.1(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - eslint-plugin-es@3.0.1(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -34021,7 +34315,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 @@ -34097,35 +34391,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.15.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - string.prototype.trimend: 1.0.8 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.56.1(eslint@8.57.1)(typescript@5.9.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): dependencies: aria-query: 5.3.2 @@ -35402,7 +35667,7 @@ snapshots: h3@2.0.1-rc.16(crossws@0.4.4(srvx@0.8.16)): dependencies: rou3: 0.8.1 - srvx: 0.11.9 + srvx: 0.11.15 optionalDependencies: crossws: 0.4.4(srvx@0.8.16) @@ -35963,12 +36228,12 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - inquirer@12.3.0(@types/node@20.17.6): + inquirer@12.3.0(@types/node@24.9.2): dependencies: - '@inquirer/core': 10.3.2(@types/node@20.17.6) - '@inquirer/prompts': 7.10.1(@types/node@20.17.6) - '@inquirer/type': 3.0.10(@types/node@20.17.6) - '@types/node': 20.17.6 + '@inquirer/core': 10.3.2(@types/node@24.9.2) + '@inquirer/prompts': 7.10.1(@types/node@24.9.2) + '@inquirer/type': 3.0.10(@types/node@24.9.2) + '@types/node': 24.9.2 ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 @@ -37459,9 +37724,9 @@ snapshots: dependencies: minipass: 7.1.2 - mint@4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0): + mint@4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0): dependencies: - '@mintlify/cli': 4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) + '@mintlify/cli': 4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@24.9.2)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@5.9.3)(yaml@2.6.0) transitivePeerDependencies: - '@radix-ui/react-popover' - '@types/node' @@ -37498,14 +37763,14 @@ snapshots: acorn: 8.15.0 pathe: 1.1.2 pkg-types: 1.2.1 - ufo: 1.5.4 + ufo: 1.6.3 mlly@1.7.4: dependencies: acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.5.4 + ufo: 1.6.3 module-details-from-path@1.0.3: {} @@ -37598,11 +37863,11 @@ snapshots: react: 18.3.1 use-intl: 3.19.1(react@18.3.1) - next-intl@3.19.1(next@16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@18.3.1): + next-intl@3.19.1(next@16.2.2(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@18.3.1): dependencies: '@formatjs/intl-localematcher': 0.5.4 negotiator: 0.6.4 - next: 16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.2.2(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 18.3.1 use-intl: 3.19.1(react@18.3.1) @@ -37898,16 +38163,16 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@16.2.2(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + next@16.2.2(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 16.2.2 '@swc/helpers': 0.5.15 baseline-browser-mapping: 2.10.16 caniuse-lite: 1.0.30001751 postcss: 8.4.31 - react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) - styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.2.3) optionalDependencies: '@next/swc-darwin-arm64': 16.2.2 '@next/swc-darwin-x64': 16.2.2 @@ -37923,16 +38188,16 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@16.2.2(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@16.2.2(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@next/env': 16.2.2 '@swc/helpers': 0.5.15 baseline-browser-mapping: 2.10.16 caniuse-lite: 1.0.30001751 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.29.0)(react@19.2.3) + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.1) optionalDependencies: '@next/swc-darwin-arm64': 16.2.2 '@next/swc-darwin-x64': 16.2.2 @@ -41230,18 +41495,6 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.14(esbuild@0.20.2)(webpack@5.92.0(esbuild@0.20.2)): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.44.0 - webpack: 5.92.0(esbuild@0.20.2) - optionalDependencies: - esbuild: 0.20.2 - optional: true - terser-webpack-plugin@5.3.14(esbuild@0.24.2)(webpack@5.92.0(esbuild@0.24.2)): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -41683,8 +41936,7 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: - optional: true + undici-types@7.16.0: {} undici@6.19.8: {} @@ -42080,7 +42332,7 @@ snapshots: vite-tsconfig-paths@4.3.2(typescript@5.9.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)): dependencies: - debug: 4.4.0 + debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.9.3) optionalDependencies: @@ -42091,7 +42343,7 @@ snapshots: 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 + debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.9.3) optionalDependencies: @@ -42322,38 +42574,6 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.92.0(esbuild@0.20.2): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) - browserslist: 4.27.0 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(esbuild@0.20.2)(webpack@5.92.0(esbuild@0.20.2)) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - optional: true - webpack@5.92.0(esbuild@0.24.2): dependencies: '@types/eslint-scope': 3.7.7 diff --git a/scripts/generate-sdks.ts b/scripts/generate-sdks.ts index b2c73a8378..a09b418339 100644 --- a/scripts/generate-sdks.ts +++ b/scripts/generate-sdks.ts @@ -54,7 +54,7 @@ function generateFromTemplate(options: { // If the resulting file is package.json, add a comment field to the JSON. if (path.basename(relativePath) === "package.json") { const jsonObj = JSON.parse(newContent); - newContent = JSON.stringify({ "//": COMMENT_LINE, ...jsonObj }, null, 2); + newContent = JSON.stringify({ "//": COMMENT_LINE, ...jsonObj }, null, 2) + "\n"; } return newContent; @@ -109,7 +109,7 @@ function processPackageJson(path: string, content: string) { } catch (error) { throw new Error(`Failed to parse package.json at ${path}`, { cause: error }); } - return JSON.stringify({ "//": `${COMMENT_LINE} (FOR package.json FILES, PLEASE EDIT package-template.json)`, ...jsonObj }, null, 2); + return JSON.stringify({ "//": `${COMMENT_LINE} (FOR package.json FILES, PLEASE EDIT package-template.json)`, ...jsonObj }, null, 2) + "\n"; } function baseEditFn(options: { From 6720855a4224129fc3542e4a46152478277e3c77 Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Thu, 30 Apr 2026 11:28:11 -0700 Subject: [PATCH 03/11] Update TanStack Start integration in app-card and styles - Added a new icon for TanStack Start in the app-card component. - Updated APP_URL_OVERRIDES to include a link for TanStack Start documentation. - Modified styles.css to enable stylelint for SCSS at-rules. These changes enhance the integration of TanStack Start within the application, improving both functionality and documentation accessibility. --- docs/src/components/mdx/app-card.tsx | 5 +++-- examples/tanstack-start-demo/src/styles.css | 2 ++ .../src/lib/stack-app/apps/implementations/common.ts | 4 ---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/src/components/mdx/app-card.tsx b/docs/src/components/mdx/app-card.tsx index a175a79f7d..49278d9606 100644 --- a/docs/src/components/mdx/app-card.tsx +++ b/docs/src/components/mdx/app-card.tsx @@ -2,7 +2,7 @@ import { ALL_APPS, AppId } from "@stackframe/stack-shared/dist/apps/apps-config"; import { AppIcon, appSquarePaddingExpression, appSquareWidthExpression } from "@stackframe/stack-shared/dist/apps/apps-ui"; -import { BarChart3, ClipboardList, CreditCard, KeyRound, Mail, Mails, Rocket, ShieldCheck, ShieldEllipsis, Sparkles, Triangle, Tv, UserCog, Users, Vault, Webhook } from "lucide-react"; +import { BarChart3, ClipboardList, Code, CreditCard, KeyRound, Mail, Mails, Rocket, ShieldCheck, ShieldEllipsis, Sparkles, Triangle, Tv, UserCog, Users, Vault, Webhook } from "lucide-react"; import Link from "next/link"; import { cn } from "../../lib/cn"; @@ -10,6 +10,7 @@ import { cn } from "../../lib/cn"; const APP_URL_OVERRIDES: Partial> = { teams: '/docs/apps/orgs-and-teams', rbac: '/docs/apps/permissions', + "tanstack-start": '/docs/guides/integrations/tanstack-start/overview', }; // Icon mapping for docs (no Next.js Image dependencies) @@ -38,6 +39,7 @@ const APP_ICONS: Record )), vercel: Triangle, + "tanstack-start": Code, onboarding: ClipboardList, analytics: BarChart3, }; @@ -121,4 +123,3 @@ export function AppGrid({ appIds, className }: { ); } - diff --git a/examples/tanstack-start-demo/src/styles.css b/examples/tanstack-start-demo/src/styles.css index 1dfe7e7bf3..06b4c37556 100644 --- a/examples/tanstack-start-demo/src/styles.css +++ b/examples/tanstack-start-demo/src/styles.css @@ -1,6 +1,8 @@ +/* stylelint-disable scss/at-rule-no-unknown */ @tailwind base; @tailwind components; @tailwind utilities; +/* stylelint-enable scss/at-rule-no-unknown */ :root { color-scheme: light; diff --git a/packages/template/src/lib/stack-app/apps/implementations/common.ts b/packages/template/src/lib/stack-app/apps/implementations/common.ts index dd7fe01ddc..fb1845b2d5 100644 --- a/packages/template/src/lib/stack-app/apps/implementations/common.ts +++ b/packages/template/src/lib/stack-app/apps/implementations/common.ts @@ -230,11 +230,7 @@ export function useAsyncCache(cache: AsyncCache const promise = React.useSyncExternalStore( subscribe, getSnapshot, - // IF_PLATFORM tanstack-start getSnapshot, - // ELSE_PLATFORM - () => throwErr(new Error("getServerSnapshot should never be called in useAsyncCache because we restrict to CSR earlier")) - // END_PLATFORM ); const result = use(promise); From f39722d8eed3294c3fe96dc5dc57551b3f6def2e Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Thu, 30 Apr 2026 12:28:01 -0700 Subject: [PATCH 04/11] Refactor cookie handling for TanStack Start integration - Removed the deprecated tanStackStartServerBrowserStub function from the Vite configuration. - Updated cookie management in the cookie.ts file to support dynamic imports for TanStack Start server APIs. - Enhanced createCookieHelper to conditionally use TanStack Start's cookie methods based on the SSR environment. - Adjusted createTanStackStartCookieHelper to accept the server API as a parameter for better modularity. These changes streamline the integration of TanStack Start, improving cookie management and ensuring compatibility with server-side rendering. --- examples/tanstack-start-demo/vite.config.ts | 34 ---------- packages/template/src/lib/cookie.ts | 63 +++++++++++++------ .../apps/implementations/client-app-impl.ts | 4 +- 3 files changed, 46 insertions(+), 55 deletions(-) diff --git a/examples/tanstack-start-demo/vite.config.ts b/examples/tanstack-start-demo/vite.config.ts index 375be86e8c..fdfc2d2c9d 100644 --- a/examples/tanstack-start-demo/vite.config.ts +++ b/examples/tanstack-start-demo/vite.config.ts @@ -48,39 +48,6 @@ function stackSdkSourceTransforms(): Plugin { }; } -function tanStackStartServerBrowserStub(): Plugin { - const virtualModuleId = "\0tanstack-start-server-browser-stub"; - - return { - name: "tanstack-start-server-browser-stub", - enforce: "pre", - resolveId(source, _importer, options) { - if (source === "@tanstack/react-start/server" && !options.ssr) { - return virtualModuleId; - } - - return null; - }, - load(id) { - if (id !== virtualModuleId) { - return null; - } - - return ` - const throwServerOnly = () => { - throw new Error("@tanstack/react-start/server was called from the browser bundle"); - }; - - export const getCookie = throwServerOnly; - export const getCookies = throwServerOnly; - export const setCookie = throwServerOnly; - export const deleteCookie = throwServerOnly; - export const getRequestHeader = throwServerOnly; - `; - }, - }; -} - function watchNodeModules(modules: string[]): Plugin { return { name: "watch-node-modules", @@ -164,7 +131,6 @@ export default defineConfig({ }, plugins: [ stackSdkSourceTransforms(), - tanStackStartServerBrowserStub(), waitForWorkspacePackages(["@stackframe/tanstack-start", "@stackframe/stack-shared", "@stackframe/stack-ui"]), watchNodeModules(["@stackframe/tanstack-start", "@stackframe/stack-shared", "@stackframe/stack-ui"]), tsConfigPaths(), diff --git a/packages/template/src/lib/cookie.ts b/packages/template/src/lib/cookie.ts index 7b6a43e6ad..13a2b64c5e 100644 --- a/packages/template/src/lib/cookie.ts +++ b/packages/template/src/lib/cookie.ts @@ -1,5 +1,4 @@ import { cookies as rscCookies, headers as rscHeaders } from '@stackframe/stack-sc/force-react-server'; // THIS_LINE_PLATFORM next -import { getCookie as tssGetCookie, getCookies as tssGetCookies, setCookie as tssSetCookie, deleteCookie as tssDeleteCookie, getRequestHeader as tssGetRequestHeader } from '@tanstack/react-start/server'; // THIS_LINE_PLATFORM tanstack-start import { isBrowserLike } from '@stackframe/stack-shared/dist/utils/env'; import { StackAssertionError } from '@stackframe/stack-shared/dist/utils/errors'; import Cookies from "js-cookie"; @@ -68,6 +67,28 @@ import { calculatePKCECodeChallenge, generateRandomCodeVerifier, generateRandomS type SetCookieOptions = { maxAge: number | "session", noOpIfServerComponent?: boolean, domain?: string, secure?: boolean }; type DeleteCookieOptions = { noOpIfServerComponent?: boolean, domain?: string }; +// IF_PLATFORM tanstack-start +type TanStackStartServerCookieApi = typeof import("@tanstack/react-start/server"); +const tanStackStartServerCookieApiImportPath = "@tanstack/react-start/server"; +let tanStackStartServerCookieApiPromise: Promise | null = null; +let tanStackStartCookieHelperPromise: Promise | null = null; + +declare global { + interface ImportMetaEnv { + SSR: boolean, + } + + interface ImportMeta { + readonly env: ImportMetaEnv, + } +} + +async function getTanStackStartServerCookieApi(): Promise { + tanStackStartServerCookieApiPromise ??= import(tanStackStartServerCookieApiImportPath); + return await tanStackStartServerCookieApiPromise; +} +// END_PLATFORM + function ensureClient() { if (!isBrowserLike()) { throw new Error("cookieClient functions can only be called in a browser environment, yet window is undefined"); @@ -116,7 +137,13 @@ export async function createCookieHelper(): Promise { await rscHeaders(), ); // ELSE_IF_PLATFORM tanstack-start - return createTanStackStartCookieHelper(); + if (import.meta.env.SSR) { + const cookieHelperPromise = tanStackStartCookieHelperPromise + ?? getTanStackStartServerCookieApi().then((api) => createTanStackStartCookieHelper(api)); + tanStackStartCookieHelperPromise = cookieHelperPromise; + return await cookieHelperPromise; + } + return await createPlaceholderCookieHelper(); // ELSE_PLATFORM return await createPlaceholderCookieHelper(); // END_PLATFORM @@ -127,9 +154,6 @@ export function createCookieHelperSync(): CookieHelper { if (isBrowserLike()) { return createBrowserCookieHelper(); } - // IF_PLATFORM tanstack-start - return createTanStackStartCookieHelper(); - // ELSE_PLATFORM function throwError(): never { throw new StackAssertionError("Synchronous server cookie helpers are not available on this platform"); } @@ -140,17 +164,16 @@ export function createCookieHelperSync(): CookieHelper { setOrDelete: throwError, delete: throwError, }; - // END_PLATFORM } // IF_PLATFORM tanstack-start -function determineSecureFromTanStackStartContext(): boolean { - return tssGetRequestHeader("x-forwarded-proto") === "https" - || (tssGetCookie("stack-is-https") !== undefined); +function determineSecureFromTanStackStartContext(api: TanStackStartServerCookieApi): boolean { + return api.getRequestHeader("x-forwarded-proto") === "https" + || (api.getCookie("stack-is-https") !== undefined); } -function refreshTanStackStartIsHttpsCookie() { - tssSetCookie("stack-is-https", "true", { +function refreshTanStackStartIsHttpsCookie(api: TanStackStartServerCookieApi) { + api.setCookie("stack-is-https", "true", { secure: true, maxAge: 60 * 60 * 24 * 365, sameSite: "lax", @@ -158,7 +181,7 @@ function refreshTanStackStartIsHttpsCookie() { }); } -function createTanStackStartCookieHelper(): CookieHelper { +function createTanStackStartCookieHelper(api: TanStackStartServerCookieApi): CookieHelper { const helper: CookieHelper = { get: (name: string) => { const all = helper.getAll(); @@ -166,13 +189,13 @@ function createTanStackStartCookieHelper(): CookieHelper { }, getAll: () => { // set a helper cookie, see comment in `NextCookieHelper.set` below - refreshTanStackStartIsHttpsCookie(); - return tssGetCookies(); + refreshTanStackStartIsHttpsCookie(api); + return api.getCookies(); }, set: (name: string, value: string, options: SetCookieOptions) => { validateCookieOptions(name, options); - tssSetCookie(name, value, { - secure: requiresSecureAttribute(name) || (options.secure ?? determineSecureFromTanStackStartContext()), + api.setCookie(name, value, { + secure: requiresSecureAttribute(name) || (options.secure ?? determineSecureFromTanStackStartContext(api)), maxAge: options.maxAge === "session" ? undefined : options.maxAge, domain: options.domain, sameSite: "lax", @@ -185,8 +208,8 @@ function createTanStackStartCookieHelper(): CookieHelper { }, delete: (name: string, options: DeleteCookieOptions) => { validateCookieOptions(name, options); - const secure = requiresSecureAttribute(name) || determineSecureFromTanStackStartContext(); - tssDeleteCookie(name, { + const secure = requiresSecureAttribute(name) || determineSecureFromTanStackStartContext(api); + api.deleteCookie(name, { secure, domain: options.domain, path: "/", @@ -323,7 +346,9 @@ export async function isSecure(): Promise { // IF_PLATFORM next return determineSecureFromServerContext(await rscCookies(), await rscHeaders()); // ELSE_IF_PLATFORM tanstack-start - return determineSecureFromTanStackStartContext(); + if (import.meta.env.SSR) { + return determineSecureFromTanStackStartContext(await getTanStackStartServerCookieApi()); + } // END_PLATFORM return false; } diff --git a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts index e1fcec6f9b..fe2d14771e 100644 --- a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts +++ b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts @@ -42,7 +42,7 @@ import React, { useCallback, useMemo } from "react"; // THIS_LINE_PLATFORM react import type * as yup from "yup"; import { constructRedirectUrl } from "../../../../utils/url"; import { getNewOAuthProviderOrScopeUrl, callOAuthCallback } from "../../../auth"; -import { CookieHelper, createBrowserCookieHelper, createCookieHelper, createCookieHelperSync, createPlaceholderCookieHelper, deleteCookie, deleteCookieClient, isSecure as isSecureCookieContext, saveVerifierAndState, setOrDeleteCookie, setOrDeleteCookieClient } from "../../../cookie"; +import { CookieHelper, createBrowserCookieHelper, createCookieHelper, createPlaceholderCookieHelper, deleteCookie, deleteCookieClient, isSecure as isSecureCookieContext, saveVerifierAndState, setOrDeleteCookie, setOrDeleteCookieClient } from "../../../cookie"; import { envVars } from "../../../env"; import { ApiKey, ApiKeyCreationOptions, ApiKeyUpdateOptions, apiKeyCreationOptionsToCrud } from "../../api-keys"; import { ConvexCtx, GetCurrentPartialUserOptions, GetCurrentUserOptions, HandlerUrlOptions, HandlerUrls, OAuthScopesOnSignIn, RedirectMethod, RedirectToOptions, RequestLike, ResolvedHandlerUrls, TokenStoreInit, stackAppInternalsSymbol } from "../../common"; @@ -1031,7 +1031,7 @@ export class _StackClientAppImplIncomplete { // IF_PLATFORM tanstack-start if (!isBrowserLike()) { - return this._getOrCreateTokenStore(createCookieHelperSync(), overrideTokenStoreInit); + return this._getOrCreateTokenStore(use(createCookieHelper()), overrideTokenStoreInit); } // END_PLATFORM suspendIfSsr(); From 7f342cd445cebf57d69fd49cf53c0f10d72d5f85 Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Thu, 30 Apr 2026 12:53:10 -0700 Subject: [PATCH 05/11] Refactor Vite configuration for TanStack Start integration - Updated the Vite configuration to use a function for dynamic settings based on the mode. - Enhanced plugin management to conditionally include workspace packages and other plugins based on the test mode. - Maintained existing server, build, and resolve settings while improving code readability and maintainability. These changes streamline the Vite setup for TanStack Start, ensuring better adaptability for different environments. --- examples/tanstack-start-demo/vite.config.ts | 78 ++++++++++++--------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/examples/tanstack-start-demo/vite.config.ts b/examples/tanstack-start-demo/vite.config.ts index fdfc2d2c9d..42d3d4ae79 100644 --- a/examples/tanstack-start-demo/vite.config.ts +++ b/examples/tanstack-start-demo/vite.config.ts @@ -98,44 +98,52 @@ function waitForWorkspacePackages(packages: string[]): Plugin { }; } -export default defineConfig({ - server: { - port: Number(`${process.env.NEXT_PUBLIC_STACK_PORT_PREFIX || "81"}42`), - fs: { - allow: [stackAuthRootPath], +export default defineConfig(({ mode }) => { + const isVitest = mode === "test" || process.env.VITEST === "true"; + + return { + server: { + port: Number(`${process.env.NEXT_PUBLIC_STACK_PORT_PREFIX || "81"}42`), + fs: { + allow: [stackAuthRootPath], + }, }, - }, - build: { - rollupOptions: { - output: { - manualChunks(id) { - if (id.startsWith(tanstackStartSourceRoot)) { - return "stack-auth-sdk"; - } - return undefined; + build: { + rollupOptions: { + output: { + manualChunks(id) { + if (id.startsWith(tanstackStartSourceRoot)) { + return "stack-auth-sdk"; + } + return undefined; + }, }, }, }, - }, - resolve: { - dedupe: ["react", "react-dom"], - alias: { - "@stackframe/tanstack-start": tanstackStartSourcePath, + resolve: { + dedupe: ["react", "react-dom"], + alias: { + "@stackframe/tanstack-start": tanstackStartSourcePath, + }, + }, + ssr: { + noExternal: [/^@stackframe\//, /^@radix-ui\//], }, - }, - ssr: { - noExternal: [/^@stackframe\//, /^@radix-ui\//], - }, - optimizeDeps: { - include: ["@stackframe/stack-shared", "@stackframe/stack-shared/config"], - }, - plugins: [ - stackSdkSourceTransforms(), - waitForWorkspacePackages(["@stackframe/tanstack-start", "@stackframe/stack-shared", "@stackframe/stack-ui"]), - watchNodeModules(["@stackframe/tanstack-start", "@stackframe/stack-shared", "@stackframe/stack-ui"]), - tsConfigPaths(), - tanstackStart(), - nitro(), - viteReact(), - ], + optimizeDeps: { + include: ["@stackframe/stack-shared", "@stackframe/stack-shared/config"], + }, + plugins: [ + stackSdkSourceTransforms(), + ...(isVitest ? [] : [ + waitForWorkspacePackages(["@stackframe/tanstack-start", "@stackframe/stack-shared", "@stackframe/stack-ui"]), + watchNodeModules(["@stackframe/tanstack-start", "@stackframe/stack-shared", "@stackframe/stack-ui"]), + ]), + tsConfigPaths(), + ...(isVitest ? [] : [ + tanstackStart(), + nitro(), + ]), + viteReact(), + ], + }; }); From 376937aa2c31dfcd6bd75bbe52f9aa93c9f64971 Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Thu, 30 Apr 2026 13:06:26 -0700 Subject: [PATCH 06/11] Enhance TanStack Start integration and improve user experience - Updated the default not found component in the TanStack Start demo to provide a user-friendly 404 page. - Refactored the Header component to use a client-mounted UserButton for better rendering performance. - Improved cookie handling in the template library to support dynamic imports for TanStack Start server APIs. - Added a new function to retrieve the server request host, enhancing compatibility with different platforms. These changes improve the overall integration of TanStack Start, enhance user experience, and ensure better performance across the application. --- .claude/CLAUDE-KNOWLEDGE.md | 3 --- .../src/components/header.tsx | 12 ++++++++++- examples/tanstack-start-demo/src/router.tsx | 9 +++++++++ packages/template/src/lib/cookie.ts | 5 +++-- .../apps/implementations/client-app-impl.ts | 20 +++++++++++++------ 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/.claude/CLAUDE-KNOWLEDGE.md b/.claude/CLAUDE-KNOWLEDGE.md index 3617859374..17a34543b9 100644 --- a/.claude/CLAUDE-KNOWLEDGE.md +++ b/.claude/CLAUDE-KNOWLEDGE.md @@ -361,6 +361,3 @@ A: Invalid `tools` entries are rejected by `requestBodySchema` in `apps/backend/ ## Q: Why did the internal metrics E2E snapshots need to change in April 2026? A: The `/api/v1/internal/metrics` response now intentionally includes `analytics_overview.daily_anonymous_visitors_fallback`, `analytics_overview.anonymous_visitors_fallback`, and `active_users_by_country`. Those additions are reflected in `packages/stack-shared/src/interface/admin-metrics.ts` and the backend route, so the E2E snapshots must include them instead of treating them as regressions. - -## Q: How should a TanStack Start SDK package be added without dragging Dashboard V2 logic into the same PR? -A: Keep the integration PR scoped to generated package registration (`packages/tanstack-start/package.json`, `.gitignore`, `scripts/generate-sdks.ts`, `scripts/utils.ts`), template/package dependency metadata, and SDK runtime changes needed by TanStack Start (`cookie.ts`, token-store handling, handler SSR guard). Leave dashboard routes, hooks, app wiring, and admin API types in the dashboard PR. diff --git a/examples/tanstack-start-demo/src/components/header.tsx b/examples/tanstack-start-demo/src/components/header.tsx index 377754bc37..b8e292cba4 100644 --- a/examples/tanstack-start-demo/src/components/header.tsx +++ b/examples/tanstack-start-demo/src/components/header.tsx @@ -1,5 +1,6 @@ import { Link } from "@tanstack/react-router"; import { UserButton } from "@stackframe/tanstack-start"; +import { useEffect, useState } from "react"; export function Header() { return ( @@ -14,10 +15,19 @@ export function Header() { Protected - +
); } + +function ClientMountedUserButton() { + const [isMounted, setIsMounted] = useState(false); + useEffect(() => { + setIsMounted(true); + }, []); + + return isMounted ? :
; +} diff --git a/examples/tanstack-start-demo/src/router.tsx b/examples/tanstack-start-demo/src/router.tsx index 327204f6f8..9edcb7fb20 100644 --- a/examples/tanstack-start-demo/src/router.tsx +++ b/examples/tanstack-start-demo/src/router.tsx @@ -5,5 +5,14 @@ export function getRouter() { return createRouter({ routeTree, scrollRestoration: true, + defaultNotFoundComponent: () => ( +
+
+

404

+

Page not found

+

This route is not part of the TanStack Start demo.

+
+
+ ), }); } diff --git a/packages/template/src/lib/cookie.ts b/packages/template/src/lib/cookie.ts index 13a2b64c5e..5a7a1d4bd1 100644 --- a/packages/template/src/lib/cookie.ts +++ b/packages/template/src/lib/cookie.ts @@ -69,22 +69,23 @@ type DeleteCookieOptions = { noOpIfServerComponent?: boolean, domain?: string }; // IF_PLATFORM tanstack-start type TanStackStartServerCookieApi = typeof import("@tanstack/react-start/server"); -const tanStackStartServerCookieApiImportPath = "@tanstack/react-start/server"; let tanStackStartServerCookieApiPromise: Promise | null = null; let tanStackStartCookieHelperPromise: Promise | null = null; declare global { + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface ImportMetaEnv { SSR: boolean, } + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface ImportMeta { readonly env: ImportMetaEnv, } } async function getTanStackStartServerCookieApi(): Promise { - tanStackStartServerCookieApiPromise ??= import(tanStackStartServerCookieApiImportPath); + tanStackStartServerCookieApiPromise ??= import(/* @vite-ignore */ "@tanstack/react-start/server"); return await tanStackStartServerCookieApiPromise; } // END_PLATFORM diff --git a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts index fe2d14771e..65fafff5f2 100644 --- a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts +++ b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts @@ -84,6 +84,17 @@ const prefetchedCrossDomainHandoffTtlMs = 55 * 60 * 1000; const allClientApps = new Map]>(); +async function getServerRequestHost(): Promise { + // IF_PLATFORM next + return (await sc.headers?.())?.get("host") ?? null; + // ELSE_IF_PLATFORM tanstack-start + const api = await import(/* @vite-ignore */ "@tanstack/react-start/server"); + return api.getRequestHeader("host") ?? null; + // ELSE_PLATFORM + return null; + // END_PLATFORM +} + type StackClientAppImplConstructorOptionsResolved = StackClientAppConstructorOptions & { inheritsFrom?: undefined }; export class _StackClientAppImplIncomplete implements StackClientApp { @@ -821,12 +832,9 @@ export class _StackClientAppImplIncomplete { // IF_PLATFORM tanstack-start if (!isBrowserLike()) { - return this._getOrCreateTokenStore(use(createCookieHelper()), overrideTokenStoreInit); + return this._getOrCreateTokenStore(use(createCookieHelper()), overrideTokenStoreInit); } // END_PLATFORM suspendIfSsr(); From a79dea2485eec16fc3f0ace76a8b4b4993c7fbc4 Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Thu, 30 Apr 2026 13:42:50 -0700 Subject: [PATCH 07/11] Update TanStack Start integration and enhance server context handling - Refactored package.json and tsconfig.json in the TanStack Start demo to streamline dependencies and improve path resolution. - Updated Vite configuration to remove unnecessary imports and enhance clarity. - Introduced new server context files to manage cookies and request headers more effectively. - Enhanced cookie management in the template library to support dynamic imports for TanStack Start server APIs. - Improved the overall structure and organization of the TanStack Start integration, ensuring better compatibility and performance. These changes enhance the integration of TanStack Start, improve server context handling, and streamline the development experience. --- examples/tanstack-start-demo/package.json | 7 +- examples/tanstack-start-demo/tsconfig.json | 2 - examples/tanstack-start-demo/vite.config.ts | 57 +---- packages/tanstack-start/package.json | 11 + packages/template/package-template.json | 13 ++ packages/template/package.json | 11 + packages/template/src/lib/cookie.ts | 43 +++- .../apps/implementations/client-app-impl.ts | 14 +- .../tanstack-start-server-context.combined.ts | 8 + .../src/tanstack-start-server-context.d.ts | 9 + .../tanstack-start-server-context.default.ts | 5 + .../tanstack-start-server-context.server.ts | 7 + pnpm-lock.yaml | 220 ++++++++++++++---- scripts/generate-sdks.ts | 15 +- 14 files changed, 304 insertions(+), 118 deletions(-) create mode 100644 packages/template/src/tanstack-start-server-context.combined.ts create mode 100644 packages/template/src/tanstack-start-server-context.d.ts create mode 100644 packages/template/src/tanstack-start-server-context.default.ts create mode 100644 packages/template/src/tanstack-start-server-context.server.ts diff --git a/examples/tanstack-start-demo/package.json b/examples/tanstack-start-demo/package.json index 548807f995..6f49e33574 100644 --- a/examples/tanstack-start-demo/package.json +++ b/examples/tanstack-start-demo/package.json @@ -14,16 +14,11 @@ "lint": "eslint --ext .ts,.tsx ." }, "dependencies": { - "@stackframe/tanstack-start": "workspace:*", "@stackframe/stack-shared": "workspace:*", "@stackframe/stack-ui": "workspace:*", + "@stackframe/tanstack-start": "workspace:*", "@tanstack/react-router": "^1.168.23", "@tanstack/react-start": "^1.167.42", - "@tanstack/react-start-client": "^1.166.40", - "@tanstack/react-start-server": "^1.166.41", - "@tanstack/start-client-core": "^1.167.17", - "@tanstack/start-plugin-core": "^1.167.35", - "@tanstack/start-server-core": "^1.167.19", "nitro": "^3.0.0", "react": "19.2.1", "react-dom": "19.2.1" diff --git a/examples/tanstack-start-demo/tsconfig.json b/examples/tanstack-start-demo/tsconfig.json index 9e06d75329..8578865f20 100644 --- a/examples/tanstack-start-demo/tsconfig.json +++ b/examples/tanstack-start-demo/tsconfig.json @@ -13,8 +13,6 @@ "esModuleInterop": true, "baseUrl": ".", "paths": { - "@stackframe/tanstack-start": ["../../packages/tanstack-start/src/index.ts"], - "@stackframe/tanstack-start/*": ["../../packages/tanstack-start/src/*"], "~/*": ["./src/*"] } }, diff --git a/examples/tanstack-start-demo/vite.config.ts b/examples/tanstack-start-demo/vite.config.ts index 42d3d4ae79..983d83e343 100644 --- a/examples/tanstack-start-demo/vite.config.ts +++ b/examples/tanstack-start-demo/vite.config.ts @@ -1,4 +1,4 @@ -import fs, { readFileSync } from "node:fs"; +import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { tanstackStart } from "@tanstack/react-start/plugin/vite"; @@ -7,46 +7,7 @@ import { defineConfig, type Plugin } from "vite"; import { nitro } from "nitro/vite"; import tsConfigPaths from "vite-tsconfig-paths"; -const tanstackStartPackagePath = fileURLToPath( - new URL("../../packages/tanstack-start/package.json", import.meta.url), -); -const tanstackStartSourcePath = fileURLToPath( - new URL("../../packages/tanstack-start/src/index.ts", import.meta.url), -); -const tanstackStartSourceRoot = fileURLToPath( - new URL("../../packages/tanstack-start/src/", import.meta.url), -); const stackAuthRootPath = fileURLToPath(new URL("../..", import.meta.url)); -const tanstackStartPackageJson = JSON.parse( - readFileSync(tanstackStartPackagePath, "utf-8"), -) as { name: string, version: string }; - -function stackSdkSourceTransforms(): Plugin { - const packageVersionLabel = `js ${tanstackStartPackageJson.name}@${tanstackStartPackageJson.version}`; - - return { - name: "stack-sdk-source-transforms", - enforce: "pre", - transform(code, id) { - if (!id.startsWith(tanstackStartSourceRoot)) { - return null; - } - - const transformedCode = code - .replace(/STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION_SENTINEL/g, packageVersionLabel) - .replace(/import\.meta\.vitest/g, "undefined"); - - if (transformedCode === code) { - return null; - } - - return { - code: transformedCode, - map: null, - }; - }, - }; -} function watchNodeModules(modules: string[]): Plugin { return { @@ -108,23 +69,8 @@ export default defineConfig(({ mode }) => { allow: [stackAuthRootPath], }, }, - build: { - rollupOptions: { - output: { - manualChunks(id) { - if (id.startsWith(tanstackStartSourceRoot)) { - return "stack-auth-sdk"; - } - return undefined; - }, - }, - }, - }, resolve: { dedupe: ["react", "react-dom"], - alias: { - "@stackframe/tanstack-start": tanstackStartSourcePath, - }, }, ssr: { noExternal: [/^@stackframe\//, /^@radix-ui\//], @@ -133,7 +79,6 @@ export default defineConfig(({ mode }) => { include: ["@stackframe/stack-shared", "@stackframe/stack-shared/config"], }, plugins: [ - stackSdkSourceTransforms(), ...(isVitest ? [] : [ waitForWorkspacePackages(["@stackframe/tanstack-start", "@stackframe/stack-shared", "@stackframe/stack-ui"]), watchNodeModules(["@stackframe/tanstack-start", "@stackframe/stack-shared", "@stackframe/stack-ui"]), diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json index bba1c2332a..e91ef43cfe 100644 --- a/packages/tanstack-start/package.json +++ b/packages/tanstack-start/package.json @@ -16,6 +16,17 @@ "default": "./dist/index.js" } }, + "./tanstack-start-server-context": { + "types": "./dist/tanstack-start-server-context.combined.d.ts", + "import": { + "browser": "./dist/esm/tanstack-start-server-context.default.js", + "default": "./dist/esm/tanstack-start-server-context.server.js" + }, + "require": { + "browser": "./dist/tanstack-start-server-context.default.js", + "default": "./dist/tanstack-start-server-context.server.js" + } + }, "./convex.config": { "types": "./dist/integrations/convex/component/convex.config.d.ts", "import": { diff --git a/packages/template/package-template.json b/packages/template/package-template.json index 09b29378c5..8a815e7819 100644 --- a/packages/template/package-template.json +++ b/packages/template/package-template.json @@ -28,6 +28,19 @@ "default": "./dist/index.js" } }, + "//": "IF_PLATFORM tanstack-start", + "./tanstack-start-server-context": { + "types": "./dist/tanstack-start-server-context.combined.d.ts", + "import": { + "browser": "./dist/esm/tanstack-start-server-context.default.js", + "default": "./dist/esm/tanstack-start-server-context.server.js" + }, + "require": { + "browser": "./dist/tanstack-start-server-context.default.js", + "default": "./dist/tanstack-start-server-context.server.js" + } + }, + "//": "END_PLATFORM", "./convex.config": { "types": "./dist/integrations/convex/component/convex.config.d.ts", "import": { diff --git a/packages/template/package.json b/packages/template/package.json index 5d4720aa59..e170352e95 100644 --- a/packages/template/package.json +++ b/packages/template/package.json @@ -17,6 +17,17 @@ "default": "./dist/index.js" } }, + "./tanstack-start-server-context": { + "types": "./dist/tanstack-start-server-context.combined.d.ts", + "import": { + "browser": "./dist/esm/tanstack-start-server-context.default.js", + "default": "./dist/esm/tanstack-start-server-context.server.js" + }, + "require": { + "browser": "./dist/tanstack-start-server-context.default.js", + "default": "./dist/tanstack-start-server-context.server.js" + } + }, "./convex.config": { "types": "./dist/integrations/convex/component/convex.config.d.ts", "import": { diff --git a/packages/template/src/lib/cookie.ts b/packages/template/src/lib/cookie.ts index 5a7a1d4bd1..7171731de3 100644 --- a/packages/template/src/lib/cookie.ts +++ b/packages/template/src/lib/cookie.ts @@ -1,6 +1,7 @@ import { cookies as rscCookies, headers as rscHeaders } from '@stackframe/stack-sc/force-react-server'; // THIS_LINE_PLATFORM next import { isBrowserLike } from '@stackframe/stack-shared/dist/utils/env'; import { StackAssertionError } from '@stackframe/stack-shared/dist/utils/errors'; +import * as tanstackStartServerContext from "@stackframe/tanstack-start/tanstack-start-server-context"; // THIS_LINE_PLATFORM tanstack-start import Cookies from "js-cookie"; import { calculatePKCECodeChallenge, generateRandomCodeVerifier, generateRandomState } from "oauth4webapi"; @@ -68,10 +69,34 @@ type SetCookieOptions = { maxAge: number | "session", noOpIfServerComponent?: bo type DeleteCookieOptions = { noOpIfServerComponent?: boolean, domain?: string }; // IF_PLATFORM tanstack-start -type TanStackStartServerCookieApi = typeof import("@tanstack/react-start/server"); -let tanStackStartServerCookieApiPromise: Promise | null = null; let tanStackStartCookieHelperPromise: Promise | null = null; +function getTanStackStartServerContext() { + const { + deleteCookie, + getCookie, + getCookies, + getRequestHeader, + setCookie, + } = tanstackStartServerContext; + if ( + deleteCookie == null + || getCookie == null + || getCookies == null + || getRequestHeader == null + || setCookie == null + ) { + throw new StackAssertionError("TanStack Start server context is only available during server rendering"); + } + return { + deleteCookie, + getCookie, + getCookies, + getRequestHeader, + setCookie, + }; +} + declare global { // eslint-disable-next-line @typescript-eslint/consistent-type-definitions interface ImportMetaEnv { @@ -84,10 +109,6 @@ declare global { } } -async function getTanStackStartServerCookieApi(): Promise { - tanStackStartServerCookieApiPromise ??= import(/* @vite-ignore */ "@tanstack/react-start/server"); - return await tanStackStartServerCookieApiPromise; -} // END_PLATFORM function ensureClient() { @@ -140,7 +161,7 @@ export async function createCookieHelper(): Promise { // ELSE_IF_PLATFORM tanstack-start if (import.meta.env.SSR) { const cookieHelperPromise = tanStackStartCookieHelperPromise - ?? getTanStackStartServerCookieApi().then((api) => createTanStackStartCookieHelper(api)); + ?? Promise.resolve(createTanStackStartCookieHelper(getTanStackStartServerContext())); tanStackStartCookieHelperPromise = cookieHelperPromise; return await cookieHelperPromise; } @@ -168,12 +189,12 @@ export function createCookieHelperSync(): CookieHelper { } // IF_PLATFORM tanstack-start -function determineSecureFromTanStackStartContext(api: TanStackStartServerCookieApi): boolean { +function determineSecureFromTanStackStartContext(api: ReturnType): boolean { return api.getRequestHeader("x-forwarded-proto") === "https" || (api.getCookie("stack-is-https") !== undefined); } -function refreshTanStackStartIsHttpsCookie(api: TanStackStartServerCookieApi) { +function refreshTanStackStartIsHttpsCookie(api: ReturnType) { api.setCookie("stack-is-https", "true", { secure: true, maxAge: 60 * 60 * 24 * 365, @@ -182,7 +203,7 @@ function refreshTanStackStartIsHttpsCookie(api: TanStackStartServerCookieApi) { }); } -function createTanStackStartCookieHelper(api: TanStackStartServerCookieApi): CookieHelper { +function createTanStackStartCookieHelper(api: ReturnType): CookieHelper { const helper: CookieHelper = { get: (name: string) => { const all = helper.getAll(); @@ -348,7 +369,7 @@ export async function isSecure(): Promise { return determineSecureFromServerContext(await rscCookies(), await rscHeaders()); // ELSE_IF_PLATFORM tanstack-start if (import.meta.env.SSR) { - return determineSecureFromTanStackStartContext(await getTanStackStartServerCookieApi()); + return determineSecureFromTanStackStartContext(getTanStackStartServerContext()); } // END_PLATFORM return false; diff --git a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts index 65fafff5f2..579935991a 100644 --- a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts +++ b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts @@ -36,6 +36,7 @@ import { BotChallengeExecutionFailedError, BotChallengeUserCancelledError, withB import type { TurnstileAction } from "@stackframe/stack-shared/dist/utils/turnstile"; import { isRelative } from "@stackframe/stack-shared/dist/utils/urls"; import { generateUuid } from "@stackframe/stack-shared/dist/utils/uuids"; +import * as tanstackStartServerContext from "@stackframe/tanstack-start/tanstack-start-server-context"; // THIS_LINE_PLATFORM tanstack-start import * as cookie from "cookie"; import * as NextNavigationUnscrambled from "next/navigation"; // import the entire module to get around some static compiler warnings emitted by Next.js in some cases | THIS_LINE_PLATFORM next import React, { useCallback, useMemo } from "react"; // THIS_LINE_PLATFORM react-like @@ -84,12 +85,21 @@ const prefetchedCrossDomainHandoffTtlMs = 55 * 60 * 1000; const allClientApps = new Map]>(); +// IF_PLATFORM tanstack-start +function getTanStackStartRequestHeader(name: string): string | null { + const { getRequestHeader } = tanstackStartServerContext; + if (getRequestHeader == null) { + throw new StackAssertionError("TanStack Start request headers are only available during server rendering"); + } + return getRequestHeader(name) ?? null; +} +// END_PLATFORM + async function getServerRequestHost(): Promise { // IF_PLATFORM next return (await sc.headers?.())?.get("host") ?? null; // ELSE_IF_PLATFORM tanstack-start - const api = await import(/* @vite-ignore */ "@tanstack/react-start/server"); - return api.getRequestHeader("host") ?? null; + return getTanStackStartRequestHeader("host"); // ELSE_PLATFORM return null; // END_PLATFORM diff --git a/packages/template/src/tanstack-start-server-context.combined.ts b/packages/template/src/tanstack-start-server-context.combined.ts new file mode 100644 index 0000000000..1dfffe7aa3 --- /dev/null +++ b/packages/template/src/tanstack-start-server-context.combined.ts @@ -0,0 +1,8 @@ +import * as browserContext from "./tanstack-start-server-context.default"; +import * as serverContext from "./tanstack-start-server-context.server"; + +export declare const getCookie: typeof serverContext.getCookie | typeof browserContext.getCookie; +export declare const getCookies: typeof serverContext.getCookies | typeof browserContext.getCookies; +export declare const setCookie: typeof serverContext.setCookie | typeof browserContext.setCookie; +export declare const deleteCookie: typeof serverContext.deleteCookie | typeof browserContext.deleteCookie; +export declare const getRequestHeader: typeof serverContext.getRequestHeader | typeof browserContext.getRequestHeader; diff --git a/packages/template/src/tanstack-start-server-context.d.ts b/packages/template/src/tanstack-start-server-context.d.ts new file mode 100644 index 0000000000..e183d95ef6 --- /dev/null +++ b/packages/template/src/tanstack-start-server-context.d.ts @@ -0,0 +1,9 @@ +declare module "@stackframe/tanstack-start/tanstack-start-server-context" { + type TanStackStartServerContext = typeof import("@tanstack/react-start/server"); + + export const deleteCookie: TanStackStartServerContext["deleteCookie"] | undefined; + export const getCookie: TanStackStartServerContext["getCookie"] | undefined; + export const getCookies: TanStackStartServerContext["getCookies"] | undefined; + export const getRequestHeader: TanStackStartServerContext["getRequestHeader"] | undefined; + export const setCookie: TanStackStartServerContext["setCookie"] | undefined; +} diff --git a/packages/template/src/tanstack-start-server-context.default.ts b/packages/template/src/tanstack-start-server-context.default.ts new file mode 100644 index 0000000000..87afea609e --- /dev/null +++ b/packages/template/src/tanstack-start-server-context.default.ts @@ -0,0 +1,5 @@ +export const getCookie = undefined; +export const getCookies = undefined; +export const setCookie = undefined; +export const deleteCookie = undefined; +export const getRequestHeader = undefined; diff --git a/packages/template/src/tanstack-start-server-context.server.ts b/packages/template/src/tanstack-start-server-context.server.ts new file mode 100644 index 0000000000..9ca5b20179 --- /dev/null +++ b/packages/template/src/tanstack-start-server-context.server.ts @@ -0,0 +1,7 @@ +export { + deleteCookie, + getCookie, + getCookies, + getRequestHeader, + setCookie, +} from "@tanstack/react-start/server"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 370cd838cb..dc088df11b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1614,25 +1614,10 @@ importers: version: 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/react-start': specifier: ^1.167.42 - version: 1.167.42(crossws@0.4.4(srvx@0.11.15))(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.166.40 - version: 1.166.40(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@tanstack/react-start-server': - specifier: ^1.166.41 - version: 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@tanstack/start-client-core': - specifier: ^1.167.17 - version: 1.167.17 - '@tanstack/start-plugin-core': - specifier: ^1.167.35 - version: 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(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.167.19 - version: 1.167.19(crossws@0.4.4(srvx@0.11.15)) + version: 1.167.42(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0) nitro: specifier: ^3.0.0 - version: 3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(rolldown@1.0.0-rc.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))(xml2js@0.6.2) + version: 3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(xml2js@0.6.2) react: specifier: 19.2.1 version: 19.2.1 @@ -1651,7 +1636,7 @@ importers: 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)) + version: 5.1.4(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) autoprefixer: specifier: ^10.4.20 version: 10.4.21(postcss@8.5.6) @@ -1669,10 +1654,10 @@ importers: 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) + version: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(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)) + version: 4.3.2(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)) packages/dashboard-ui-components: dependencies: @@ -30098,16 +30083,16 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-rsc@0.0.21(crossws@0.4.4(srvx@0.11.15))(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-rsc@0.0.21(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0)': dependencies: '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@tanstack/react-start-server': 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-server': 1.166.41(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/router-core': 1.168.15 '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 '@tanstack/start-fn-stubs': 1.161.6 - '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(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.167.19(crossws@0.4.4(srvx@0.11.15)) + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.8.16))(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0) + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.8.16)) '@tanstack/start-storage-context': 1.166.29 pathe: 2.0.3 react: 19.2.1 @@ -30164,13 +30149,13 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start-server@1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + '@tanstack/react-start-server@1.166.41(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@tanstack/history': 1.161.6 '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/router-core': 1.168.15 '@tanstack/start-client-core': 1.167.17 - '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.8.16)) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) transitivePeerDependencies: @@ -30232,20 +30217,20 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start@1.167.42(crossws@0.4.4(srvx@0.11.15))(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@1.167.42(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0)': dependencies: '@tanstack/react-router': 1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/react-start-client': 1.166.40(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@tanstack/react-start-rsc': 0.0.21(crossws@0.4.4(srvx@0.11.15))(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-server': 1.166.41(crossws@0.4.4(srvx@0.11.15))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@tanstack/react-start-rsc': 0.0.21(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0) + '@tanstack/react-start-server': 1.166.41(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 - '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(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.167.19(crossws@0.4.4(srvx@0.11.15)) + '@tanstack/start-plugin-core': 1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.8.16))(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0) + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.8.16)) pathe: 2.0.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) + vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -30417,7 +30402,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.167.22(@tanstack/react-router@1.168.23(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-plugin@1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0)': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -30434,8 +30419,8 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.168.23(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) + vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + webpack: 5.92.0 transitivePeerDependencies: - supports-color @@ -30561,7 +30546,7 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-plugin-core@1.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.11.15))(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.167.35(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.8.16))(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0)': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.29.0 @@ -30569,10 +30554,10 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.40 '@tanstack/router-core': 1.168.15 '@tanstack/router-generator': 1.166.32 - '@tanstack/router-plugin': 1.167.22(@tanstack/react-router@1.168.23(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-plugin': 1.167.22(@tanstack/react-router@1.168.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0) '@tanstack/router-utils': 1.161.6 '@tanstack/start-client-core': 1.167.17 - '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.11.15)) + '@tanstack/start-server-core': 1.167.19(crossws@0.4.4(srvx@0.8.16)) cheerio: 1.0.0 exsolve: 1.0.8 pathe: 2.0.3 @@ -30582,8 +30567,8 @@ snapshots: srvx: 0.11.15 tinyglobby: 0.2.15 ufo: 1.6.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) - 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)) + vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(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@1.21.7)(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: @@ -30683,6 +30668,17 @@ snapshots: transitivePeerDependencies: - crossws + '@tanstack/start-server-core@1.167.19(crossws@0.4.4(srvx@0.8.16))': + dependencies: + '@tanstack/history': 1.161.6 + '@tanstack/router-core': 1.168.15 + '@tanstack/start-client-core': 1.167.17 + '@tanstack/start-storage-context': 1.166.29 + h3-v2: h3@2.0.1-rc.20(crossws@0.4.4(srvx@0.8.16)) + seroval: 1.5.1 + transitivePeerDependencies: + - crossws + '@tanstack/start-storage-context@1.166.29': dependencies: '@tanstack/router-core': 1.168.15 @@ -31565,6 +31561,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(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@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + 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 @@ -35687,6 +35695,13 @@ snapshots: optionalDependencies: crossws: 0.4.4(srvx@0.11.15) + h3@2.0.1-rc.20(crossws@0.4.4(srvx@0.8.16)): + dependencies: + rou3: 0.8.1 + srvx: 0.11.15 + optionalDependencies: + crossws: 0.4.4(srvx@0.8.16) + hachure-fill@0.5.2: {} handlebars@4.7.8: @@ -38279,6 +38294,57 @@ snapshots: - sqlite3 - uploadthing + nitro@3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(xml2js@0.6.2): + dependencies: + consola: 3.4.2 + cookie-es: 2.0.0 + crossws: 0.4.4(srvx@0.8.16) + db0: 0.3.4(@electric-sql/pglite@0.3.2)(mysql2@3.15.3) + esbuild: 0.25.11 + fetchdts: 0.1.7 + h3: 2.0.1-rc.2(crossws@0.4.4(srvx@0.8.16)) + jiti: 2.6.1 + nf3: 0.1.12 + ofetch: 1.5.1 + ohash: 2.0.11 + rendu: 0.0.6 + rollup: 4.57.1 + srvx: 0.8.16 + undici: 7.18.2 + unenv: 2.0.0-rc.21 + unstorage: 2.0.0-alpha.3(chokidar@4.0.3)(db0@0.3.4(@electric-sql/pglite@0.3.2)(mysql2@3.15.3))(lru-cache@11.2.2)(ofetch@1.5.1) + optionalDependencies: + vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + xml2js: 0.6.2 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - chokidar + - drizzle-orm + - idb-keyval + - ioredis + - lru-cache + - mongodb + - mysql2 + - sqlite3 + - uploadthing + nlcst-to-string@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -41506,6 +41572,16 @@ snapshots: optionalDependencies: esbuild: 0.24.2 + terser-webpack-plugin@5.3.14(webpack@5.92.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.0 + webpack: 5.92.0 + optional: true + terser@5.44.0: dependencies: '@jridgewell/source-map': 0.3.11 @@ -42341,6 +42417,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@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)): + dependencies: + debug: 4.4.3 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.9.3) + optionalDependencies: + vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0) + transitivePeerDependencies: + - 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.3 @@ -42430,6 +42517,23 @@ snapshots: tsx: 4.19.3 yaml: 2.6.0 + vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(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: 1.21.7 + lightningcss: 1.30.1 + terser: 5.44.0 + tsx: 4.21.0 + yaml: 2.8.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 @@ -42464,6 +42568,10 @@ snapshots: tsx: 4.21.0 yaml: 2.8.0 + vitefu@1.1.2(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(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@1.21.7)(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) @@ -42574,6 +42682,38 @@ snapshots: webpack-virtual-modules@0.6.2: {} + webpack@5.92.0: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + browserslist: 4.27.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(webpack@5.92.0) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + optional: true + webpack@5.92.0(esbuild@0.24.2): dependencies: '@types/eslint-scope': 3.7.7 diff --git a/scripts/generate-sdks.ts b/scripts/generate-sdks.ts index a09b418339..864ccbcb70 100644 --- a/scripts/generate-sdks.ts +++ b/scripts/generate-sdks.ts @@ -131,6 +131,14 @@ function baseEditFn(options: { withGeneratorLock(async () => { const baseDir = path.resolve(__dirname, "..", "packages"); const srcDir = path.resolve(baseDir, "template"); + const tanstackStartOnlyTemplateFiles = new Set([ + "src/tanstack-start-server-context.combined.ts", + "src/tanstack-start-server-context.default.ts", + "src/tanstack-start-server-context.server.ts", + ]); + const templateOnlyFiles = new Set([ + "src/tanstack-start-server-context.d.ts", + ]); // Copy package-template.json to package.json in the template, // applying macros and adding a comment field. @@ -168,7 +176,9 @@ withGeneratorLock(async () => { "src/global.d.ts", ]; - if (ignores.some((ignorePath) => relativePath.startsWith(ignorePath)) || relativePath.endsWith(".tsx")) { + if (tanstackStartOnlyTemplateFiles.has(relativePath) || templateOnlyFiles.has(relativePath)) { + return false; + } else if (ignores.some((ignorePath) => relativePath.startsWith(ignorePath)) || relativePath.endsWith(".tsx")) { return false; } else { return true; @@ -182,6 +192,7 @@ withGeneratorLock(async () => { editFn: (relativePath, content) => { return baseEditFn({ relativePath, content, platforms: PLATFORMS["next"] }); }, + filterFn: (relativePath) => !tanstackStartOnlyTemplateFiles.has(relativePath), }); generateFromTemplate({ @@ -190,6 +201,7 @@ withGeneratorLock(async () => { editFn: (relativePath, content) => { return baseEditFn({ relativePath, content, platforms: PLATFORMS["react"] }); }, + filterFn: (relativePath) => !tanstackStartOnlyTemplateFiles.has(relativePath), }); generateFromTemplate({ @@ -198,6 +210,7 @@ withGeneratorLock(async () => { editFn: (relativePath, content) => { return baseEditFn({ relativePath, content, platforms: PLATFORMS["tanstack-start"] }); }, + filterFn: (relativePath) => !templateOnlyFiles.has(relativePath), }); }).catch((error) => { console.error(error); From 248dcd3d2e547a05a083af0acc7effeab711be84 Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Thu, 30 Apr 2026 15:45:01 -0700 Subject: [PATCH 08/11] Enhance Vite configuration for TanStack Start integration - Updated vitest.config.ts to include a new alias for the TanStack Start server context, improving path resolution. - Introduced a stub for the TanStack Start server context to streamline server context handling. These changes enhance the integration of TanStack Start by improving the Vite configuration and server context management. --- packages/template/vitest.config.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/template/vitest.config.ts b/packages/template/vitest.config.ts index e4c46fedeb..890a9e5c0d 100644 --- a/packages/template/vitest.config.ts +++ b/packages/template/vitest.config.ts @@ -1,7 +1,16 @@ +import { fileURLToPath } from 'node:url' // THIS_LINE_PLATFORM template import { defineConfig, mergeConfig } from 'vitest/config' import sharedConfig from '../../vitest.shared' +const tanstackStartServerContextStub = fileURLToPath(new URL('./src/tanstack-start-server-context.default.ts', import.meta.url)) // THIS_LINE_PLATFORM template + export default mergeConfig( sharedConfig, - defineConfig({}), + defineConfig({ + resolve: { + alias: { + "@stackframe/tanstack-start/tanstack-start-server-context": tanstackStartServerContextStub, // THIS_LINE_PLATFORM template + }, + }, + }), ) From df68c760ae9dce5245909bfc277f20a9ff23b800 Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Thu, 30 Apr 2026 16:07:24 -0700 Subject: [PATCH 09/11] Fix TanStack Start SSR redirects --- .../apps/implementations/client-app-impl.ts | 32 +++++++++++++++++-- packages/template/src/lib/stack-app/common.ts | 1 + 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts index 579935991a..1dd12c1e8a 100644 --- a/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts +++ b/packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts @@ -37,6 +37,7 @@ import type { TurnstileAction } from "@stackframe/stack-shared/dist/utils/turnst import { isRelative } from "@stackframe/stack-shared/dist/utils/urls"; import { generateUuid } from "@stackframe/stack-shared/dist/utils/uuids"; import * as tanstackStartServerContext from "@stackframe/tanstack-start/tanstack-start-server-context"; // THIS_LINE_PLATFORM tanstack-start +import * as TanStackRouter from "@tanstack/react-router"; // THIS_LINE_PLATFORM tanstack-start import * as cookie from "cookie"; import * as NextNavigationUnscrambled from "next/navigation"; // import the entire module to get around some static compiler warnings emitted by Next.js in some cases | THIS_LINE_PLATFORM next import React, { useCallback, useMemo } from "react"; // THIS_LINE_PLATFORM react-like @@ -561,6 +562,7 @@ export class _StackClientAppImplIncomplete router.push(to); // END_PLATFORM + // IF_PLATFORM tanstack-start + } else if (this._redirectMethod === "tanstack-start") { + return (to: string) => window.location.assign(to); + // END_PLATFORM } else { return (to: string) => { }; } @@ -2525,6 +2535,20 @@ export class _StackClientAppImplIncomplete (to: string) => void, From 8b7ce66f9773e2e8a2ee267a0b8a3808cf0909a1 Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Tue, 5 May 2026 17:19:58 -0700 Subject: [PATCH 10/11] Update TanStack Start demo port configuration - Changed the port suffix from "42" to "43" in index.html, package.json, and vite.config.ts to ensure consistent port usage across the TanStack Start demo. These changes improve the setup for the TanStack Start integration by standardizing the port configuration. --- apps/dev-launchpad/public/index.html | 2 +- examples/tanstack-start-demo/package.json | 2 +- examples/tanstack-start-demo/vite.config.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/dev-launchpad/public/index.html b/apps/dev-launchpad/public/index.html index 310a1a215c..5462b9398e 100644 --- a/apps/dev-launchpad/public/index.html +++ b/apps/dev-launchpad/public/index.html @@ -175,7 +175,7 @@

Background services

}, { name: "TanStack Start demo", - portSuffix: "42", + portSuffix: "43", description: [ "Src: ./examples/tanstack-start-demo", "Alpha SDK integration demo", diff --git a/examples/tanstack-start-demo/package.json b/examples/tanstack-start-demo/package.json index 6f49e33574..3f735963db 100644 --- a/examples/tanstack-start-demo/package.json +++ b/examples/tanstack-start-demo/package.json @@ -8,7 +8,7 @@ "scripts": { "typecheck": "tsc --noEmit", "clean": "rimraf .output && rimraf node_modules", - "dev": "vite dev --port ${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}42", + "dev": "vite dev --port ${NEXT_PUBLIC_STACK_PORT_PREFIX:-81}43", "build": "vite build", "start": "node .output/server/index.mjs", "lint": "eslint --ext .ts,.tsx ." diff --git a/examples/tanstack-start-demo/vite.config.ts b/examples/tanstack-start-demo/vite.config.ts index 983d83e343..39c84c2450 100644 --- a/examples/tanstack-start-demo/vite.config.ts +++ b/examples/tanstack-start-demo/vite.config.ts @@ -64,7 +64,7 @@ export default defineConfig(({ mode }) => { return { server: { - port: Number(`${process.env.NEXT_PUBLIC_STACK_PORT_PREFIX || "81"}42`), + port: Number(`${process.env.NEXT_PUBLIC_STACK_PORT_PREFIX || "81"}43`), fs: { allow: [stackAuthRootPath], }, From 571eb841b22ec445176f527456a36875c5658502 Mon Sep 17 00:00:00 2001 From: mantrakp04 Date: Wed, 6 May 2026 11:20:26 -0700 Subject: [PATCH 11/11] Update TanStack Start package version to 2.8.87 in package.json --- packages/tanstack-start/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json index e91ef43cfe..4f4fe0b76a 100644 --- a/packages/tanstack-start/package.json +++ b/packages/tanstack-start/package.json @@ -1,7 +1,7 @@ { "//": "THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template (FOR package.json FILES, PLEASE EDIT package-template.json)", "name": "@stackframe/tanstack-start", - "version": "2.8.86", + "version": "2.8.87", "repository": "https://github.com/stack-auth/stack-auth", "sideEffects": false, "main": "./dist/index.js",