Unified · Split
| @@ -13,7 +13,6 @@ import { Route as ToolsRouteImport } from './routes/tools' · 12 unmodified lines | ||
| 13 | 13 | import { Route as SecretsRouteImport } from './routes/secrets' |
| 14 | 14 | import { Route as IndexRouteImport } from './routes/index' |
| 15 | 15 | import { Route as SourcesNamespaceRouteImport } from './routes/sources.$namespace' |
| 16 | −import { Route as ApiSplatRouteImport } from './routes/api.$' | |
| 17 | 16 | import { Route as SourcesAddPluginKeyRouteImport } from './routes/sources.add.$pluginKey' |
| 18 | 17 | |
| 19 | 18 | const ToolsRoute = ToolsRouteImport.update({ |
| @@ -36,11 +35,6 @@ const SourcesNamespaceRoute = SourcesNamespaceRouteImport.update({ · 16 unmodified lines | ||
| 36 | 35 | path: '/sources/$namespace', |
| 37 | 36 | getParentRoute: () => rootRouteImport, |
| 38 | 37 | } as any) |
| 39 | −const ApiSplatRoute = ApiSplatRouteImport.update({ | |
| 40 | − id: '/api/$', | |
| 41 | − path: '/api/$', | |
| 42 | − getParentRoute: () => rootRouteImport, | |
| 43 | −} as any) | |
| 44 | 38 | const SourcesAddPluginKeyRoute = SourcesAddPluginKeyRouteImport.update({ |
| 45 | 39 | id: '/sources/add/$pluginKey', |
| 46 | 40 | path: '/sources/add/$pluginKey', |
| @@ -51,7 +45,6 @@ export interface FileRoutesByFullPath { · 4 unmodified lines | ||
| 51 | 45 | '/': typeof IndexRoute |
| 52 | 46 | '/secrets': typeof SecretsRoute |
| 53 | 47 | '/tools': typeof ToolsRoute |
| 54 | − '/api/$': typeof ApiSplatRoute | |
| 55 | 48 | '/sources/$namespace': typeof SourcesNamespaceRoute |
| 56 | 49 | '/sources/add/$pluginKey': typeof SourcesAddPluginKeyRoute |
| 57 | 50 | } |
| @@ -59,7 +52,6 @@ export interface FileRoutesByTo { · 1 unmodified line | ||
| 59 | 52 | '/': typeof IndexRoute |
| 60 | 53 | '/secrets': typeof SecretsRoute |
| 61 | 54 | '/tools': typeof ToolsRoute |
| 62 | − '/api/$': typeof ApiSplatRoute | |
| 63 | 55 | '/sources/$namespace': typeof SourcesNamespaceRoute |
| 64 | 56 | '/sources/add/$pluginKey': typeof SourcesAddPluginKeyRoute |
| 65 | 57 | } |
| @@ -68,7 +60,6 @@ export interface FileRoutesById { · 2 unmodified lines | ||
| 68 | 60 | '/': typeof IndexRoute |
| 69 | 61 | '/secrets': typeof SecretsRoute |
| 70 | 62 | '/tools': typeof ToolsRoute |
| 71 | − '/api/$': typeof ApiSplatRoute | |
| 72 | 63 | '/sources/$namespace': typeof SourcesNamespaceRoute |
| 73 | 64 | '/sources/add/$pluginKey': typeof SourcesAddPluginKeyRoute |
| 74 | 65 | } |
| @@ -78,7 +69,6 @@ export interface FileRouteTypes { · 3 unmodified lines | ||
| 78 | 69 | | '/' |
| 79 | 70 | | '/secrets' |
| 80 | 71 | | '/tools' |
| 81 | − | '/api/$' | |
| 82 | 72 | | '/sources/$namespace' |
| 83 | 73 | | '/sources/add/$pluginKey' |
| 84 | 74 | fileRoutesByTo: FileRoutesByTo |
| @@ -86,7 +76,6 @@ export interface FileRouteTypes { · 1 unmodified line | ||
| 86 | 76 | | '/' |
| 87 | 77 | | '/secrets' |
| 88 | 78 | | '/tools' |
| 89 | − | '/api/$' | |
| 90 | 79 | | '/sources/$namespace' |
| 91 | 80 | | '/sources/add/$pluginKey' |
| 92 | 81 | id: |
| @@ -94,7 +83,6 @@ export interface FileRouteTypes { · 1 unmodified line | ||
| 94 | 83 | | '/' |
| 95 | 84 | | '/secrets' |
| 96 | 85 | | '/tools' |
| 97 | − | '/api/$' | |
| 98 | 86 | | '/sources/$namespace' |
| 99 | 87 | | '/sources/add/$pluginKey' |
| 100 | 88 | fileRoutesById: FileRoutesById |
| @@ -103,7 +91,6 @@ export interface RootRouteChildren { · 2 unmodified lines | ||
| 103 | 91 | IndexRoute: typeof IndexRoute |
| 104 | 92 | SecretsRoute: typeof SecretsRoute |
| 105 | 93 | ToolsRoute: typeof ToolsRoute |
| 106 | − ApiSplatRoute: typeof ApiSplatRoute | |
| 107 | 94 | SourcesNamespaceRoute: typeof SourcesNamespaceRoute |
| 108 | 95 | SourcesAddPluginKeyRoute: typeof SourcesAddPluginKeyRoute |
| 109 | 96 | } |
| @@ -138,13 +125,6 @@ declare module '@tanstack/react-router' { · 28 unmodified lines | ||
| 138 | 125 | preLoaderRoute: typeof SourcesNamespaceRouteImport |
| 139 | 126 | parentRoute: typeof rootRouteImport |
| 140 | 127 | } |
| 141 | − '/api/$': { | |
| 142 | − id: '/api/$' | |
| 143 | − path: '/api/$' | |
| 144 | − fullPath: '/api/$' | |
| 145 | − preLoaderRoute: typeof ApiSplatRouteImport | |
| 146 | − parentRoute: typeof rootRouteImport | |
| 147 | − } | |
| 148 | 128 | '/sources/add/$pluginKey': { |
| 149 | 129 | id: '/sources/add/$pluginKey' |
| 150 | 130 | path: '/sources/add/$pluginKey' |
| @@ -159,7 +139,6 @@ const rootRouteChildren: RootRouteChildren = { · 8 unmodified lines | ||
| 159 | 139 | IndexRoute: IndexRoute, |
| 160 | 140 | SecretsRoute: SecretsRoute, |
| 161 | 141 | ToolsRoute: ToolsRoute, |
| 162 | − ApiSplatRoute: ApiSplatRoute, | |
| 163 | 142 | SourcesNamespaceRoute: SourcesNamespaceRoute, |
| 164 | 143 | SourcesAddPluginKeyRoute: SourcesAddPluginKeyRoute, |
| 165 | 144 | } |
| @@ -168,10 +147,11 @@ export const routeTree = rootRouteImport · 2 unmodified lines | ||
| 168 | 147 | ._addFileTypes<FileRouteTypes>() |
| 169 | 148 | |
| 170 | 149 | import type { getRouter } from './router.tsx' |
| 171 | −import type { createStart } from '@tanstack/react-start' | |
| 150 | +import type { startInstance } from './start.ts' | |
| 172 | 151 | declare module '@tanstack/react-start' { |
| 173 | 152 | interface Register { |
| 174 | 153 | ssr: true |
| 175 | 154 | router: Awaited<ReturnType<typeof getRouter>> |
| 155 | + config: Awaited<ReturnType<typeof startInstance.getOptions>> | |
| 176 | 156 | } |
| 177 | 157 | } |
| @@ -1,18 +0,0 @@ | ||
| 1 | −import { createFileRoute } from "@tanstack/react-router"; | |
| 2 | − | |
| 3 | −const handle = async (request: Request) => { | |
| 4 | − const { handleApiRequest } = await import("../server/api-handler"); | |
| 5 | − return handleApiRequest(request); | |
| 6 | −}; | |
| 7 | − | |
| 8 | −export const Route = createFileRoute("/api/$")({ | |
| 9 | − server: { | |
| 10 | − handlers: { | |
| 11 | − GET: ({ request }) => handle(request), | |
| 12 | − POST: ({ request }) => handle(request), | |
| 13 | − PUT: ({ request }) => handle(request), | |
| 14 | − DELETE: ({ request }) => handle(request), | |
| 15 | − PATCH: ({ request }) => handle(request), | |
| 16 | − }, | |
| 17 | − }, | |
| 18 | −}); | |
| @@ -1,8 +1,8 @@ | ||
| 1 | 1 | import { handleApiRequest as _handleApiRequest } from "../api"; |
| 2 | 2 | |
| 3 | 3 | export const handleApiRequest = (request: Request) => { |
| 4 | − // Strip /api prefix — route catch-all (api.$.ts) matches /api/* | |
| 5 | − // but Effect endpoints are defined without the prefix | |
| 4 | + // Strip /api prefix — Start request middleware forwards /api/* here, | |
| 5 | + // but Effect endpoints are defined without the prefix. | |
| 6 | 6 | const url = new URL(request.url); |
| 7 | 7 | url.pathname = url.pathname.replace(/^\/api/, ""); |
| 8 | 8 | return _handleApiRequest(new Request(url, request)); |
| @@ -0,0 +1,15 @@ | ||
| 1 | +import { createMiddleware, createStart } from "@tanstack/react-start"; | |
| 2 | +import { handleApiRequest } from "./server/api-handler"; | |
| 3 | + | |
| 4 | +const apiRequestMiddleware = createMiddleware({ type: "request" }).server( | |
| 5 | + ({ pathname, request, next }) => { | |
| 6 | + if (pathname === "/api" || pathname.startsWith("/api/")) { | |
| 7 | + return handleApiRequest(request); | |
| 8 | + } | |
| 9 | + return next(); | |
| 10 | + }, | |
| 11 | +); | |
| 12 | + | |
| 13 | +export const startInstance = createStart(() => ({ | |
| 14 | + requestMiddleware: [apiRequestMiddleware], | |
| 15 | +})); | |
| @@ -13,8 +13,6 @@ import { Route as ToolsRouteImport } from './routes/tools' · 12 unmodified lines | ||
| 13 | 13 | import { Route as SecretsRouteImport } from './routes/secrets' |
| 14 | 14 | import { Route as IndexRouteImport } from './routes/index' |
| 15 | 15 | import { Route as SourcesNamespaceRouteImport } from './routes/sources.$namespace' |
| 16 | −import { Route as McpSplatRouteImport } from './routes/mcp.$' | |
| 17 | −import { Route as ApiSplatRouteImport } from './routes/api.$' | |
| 18 | 16 | import { Route as SourcesAddPluginKeyRouteImport } from './routes/sources.add.$pluginKey' |
| 19 | 17 | |
| 20 | 18 | const ToolsRoute = ToolsRouteImport.update({ |
| @@ -37,16 +35,6 @@ const SourcesNamespaceRoute = SourcesNamespaceRouteImport.update({ · 16 unmodified lines | ||
| 37 | 35 | path: '/sources/$namespace', |
| 38 | 36 | getParentRoute: () => rootRouteImport, |
| 39 | 37 | } as any) |
| 40 | −const McpSplatRoute = McpSplatRouteImport.update({ | |
| 41 | − id: '/mcp/$', | |
| 42 | − path: '/mcp/$', | |
| 43 | − getParentRoute: () => rootRouteImport, | |
| 44 | −} as any) | |
| 45 | −const ApiSplatRoute = ApiSplatRouteImport.update({ | |
| 46 | − id: '/api/$', | |
| 47 | − path: '/api/$', | |
| 48 | − getParentRoute: () => rootRouteImport, | |
| 49 | −} as any) | |
| 50 | 38 | const SourcesAddPluginKeyRoute = SourcesAddPluginKeyRouteImport.update({ |
| 51 | 39 | id: '/sources/add/$pluginKey', |
| 52 | 40 | path: '/sources/add/$pluginKey', |
| @@ -57,8 +45,6 @@ export interface FileRoutesByFullPath { · 4 unmodified lines | ||
| 57 | 45 | '/': typeof IndexRoute |
| 58 | 46 | '/secrets': typeof SecretsRoute |
| 59 | 47 | '/tools': typeof ToolsRoute |
| 60 | − '/api/$': typeof ApiSplatRoute | |
| 61 | − '/mcp/$': typeof McpSplatRoute | |
| 62 | 48 | '/sources/$namespace': typeof SourcesNamespaceRoute |
| 63 | 49 | '/sources/add/$pluginKey': typeof SourcesAddPluginKeyRoute |
| 64 | 50 | } |
| @@ -66,8 +52,6 @@ export interface FileRoutesByTo { · 1 unmodified line | ||
| 66 | 52 | '/': typeof IndexRoute |
| 67 | 53 | '/secrets': typeof SecretsRoute |
| 68 | 54 | '/tools': typeof ToolsRoute |
| 69 | − '/api/$': typeof ApiSplatRoute | |
| 70 | − '/mcp/$': typeof McpSplatRoute | |
| 71 | 55 | '/sources/$namespace': typeof SourcesNamespaceRoute |
| 72 | 56 | '/sources/add/$pluginKey': typeof SourcesAddPluginKeyRoute |
| 73 | 57 | } |
| @@ -76,8 +60,6 @@ export interface FileRoutesById { · 2 unmodified lines | ||
| 76 | 60 | '/': typeof IndexRoute |
| 77 | 61 | '/secrets': typeof SecretsRoute |
| 78 | 62 | '/tools': typeof ToolsRoute |
| 79 | − '/api/$': typeof ApiSplatRoute | |
| 80 | − '/mcp/$': typeof McpSplatRoute | |
| 81 | 63 | '/sources/$namespace': typeof SourcesNamespaceRoute |
| 82 | 64 | '/sources/add/$pluginKey': typeof SourcesAddPluginKeyRoute |
| 83 | 65 | } |
| @@ -87,8 +69,6 @@ export interface FileRouteTypes { · 3 unmodified lines | ||
| 87 | 69 | | '/' |
| 88 | 70 | | '/secrets' |
| 89 | 71 | | '/tools' |
| 90 | − | '/api/$' | |
| 91 | − | '/mcp/$' | |
| 92 | 72 | | '/sources/$namespace' |
| 93 | 73 | | '/sources/add/$pluginKey' |
| 94 | 74 | fileRoutesByTo: FileRoutesByTo |
| @@ -96,8 +76,6 @@ export interface FileRouteTypes { · 1 unmodified line | ||
| 96 | 76 | | '/' |
| 97 | 77 | | '/secrets' |
| 98 | 78 | | '/tools' |
| 99 | − | '/api/$' | |
| 100 | − | '/mcp/$' | |
| 101 | 79 | | '/sources/$namespace' |
| 102 | 80 | | '/sources/add/$pluginKey' |
| 103 | 81 | id: |
| @@ -105,8 +83,6 @@ export interface FileRouteTypes { · 1 unmodified line | ||
| 105 | 83 | | '/' |
| 106 | 84 | | '/secrets' |
| 107 | 85 | | '/tools' |
| 108 | − | '/api/$' | |
| 109 | − | '/mcp/$' | |
| 110 | 86 | | '/sources/$namespace' |
| 111 | 87 | | '/sources/add/$pluginKey' |
| 112 | 88 | fileRoutesById: FileRoutesById |
| @@ -115,8 +91,6 @@ export interface RootRouteChildren { · 2 unmodified lines | ||
| 115 | 91 | IndexRoute: typeof IndexRoute |
| 116 | 92 | SecretsRoute: typeof SecretsRoute |
| 117 | 93 | ToolsRoute: typeof ToolsRoute |
| 118 | − ApiSplatRoute: typeof ApiSplatRoute | |
| 119 | − McpSplatRoute: typeof McpSplatRoute | |
| 120 | 94 | SourcesNamespaceRoute: typeof SourcesNamespaceRoute |
| 121 | 95 | SourcesAddPluginKeyRoute: typeof SourcesAddPluginKeyRoute |
| 122 | 96 | } |
| @@ -151,20 +125,6 @@ declare module '@tanstack/react-router' { · 28 unmodified lines | ||
| 151 | 125 | preLoaderRoute: typeof SourcesNamespaceRouteImport |
| 152 | 126 | parentRoute: typeof rootRouteImport |
| 153 | 127 | } |
| 154 | − '/mcp/$': { | |
| 155 | − id: '/mcp/$' | |
| 156 | − path: '/mcp/$' | |
| 157 | − fullPath: '/mcp/$' | |
| 158 | − preLoaderRoute: typeof McpSplatRouteImport | |
| 159 | − parentRoute: typeof rootRouteImport | |
| 160 | − } | |
| 161 | − '/api/$': { | |
| 162 | − id: '/api/$' | |
| 163 | − path: '/api/$' | |
| 164 | − fullPath: '/api/$' | |
| 165 | − preLoaderRoute: typeof ApiSplatRouteImport | |
| 166 | − parentRoute: typeof rootRouteImport | |
| 167 | − } | |
| 168 | 128 | '/sources/add/$pluginKey': { |
| 169 | 129 | id: '/sources/add/$pluginKey' |
| 170 | 130 | path: '/sources/add/$pluginKey' |
| @@ -179,8 +139,6 @@ const rootRouteChildren: RootRouteChildren = { · 8 unmodified lines | ||
| 179 | 139 | IndexRoute: IndexRoute, |
| 180 | 140 | SecretsRoute: SecretsRoute, |
| 181 | 141 | ToolsRoute: ToolsRoute, |
| 182 | − ApiSplatRoute: ApiSplatRoute, | |
| 183 | − McpSplatRoute: McpSplatRoute, | |
| 184 | 142 | SourcesNamespaceRoute: SourcesNamespaceRoute, |
| 185 | 143 | SourcesAddPluginKeyRoute: SourcesAddPluginKeyRoute, |
| 186 | 144 | } |
| @@ -189,10 +147,11 @@ export const routeTree = rootRouteImport · 2 unmodified lines | ||
| 189 | 147 | ._addFileTypes<FileRouteTypes>() |
| 190 | 148 | |
| 191 | 149 | import type { getRouter } from './router.tsx' |
| 192 | −import type { createStart } from '@tanstack/react-start' | |
| 150 | +import type { startInstance } from './start.ts' | |
| 193 | 151 | declare module '@tanstack/react-start' { |
| 194 | 152 | interface Register { |
| 195 | 153 | ssr: true |
| 196 | 154 | router: Awaited<ReturnType<typeof getRouter>> |
| 155 | + config: Awaited<ReturnType<typeof startInstance.getOptions>> | |
| 197 | 156 | } |
| 198 | 157 | } |
| @@ -1,18 +0,0 @@ | ||
| 1 | −import { createFileRoute } from "@tanstack/react-router"; | |
| 2 | − | |
| 3 | −const handle = async (request: Request) => { | |
| 4 | − const { handleApiRequest } = await import("../server/api-handler"); | |
| 5 | − return handleApiRequest(request); | |
| 6 | −}; | |
| 7 | − | |
| 8 | −export const Route = createFileRoute("/api/$")({ | |
| 9 | − server: { | |
| 10 | − handlers: { | |
| 11 | − GET: ({ request }) => handle(request), | |
| 12 | − POST: ({ request }) => handle(request), | |
| 13 | − PUT: ({ request }) => handle(request), | |
| 14 | − DELETE: ({ request }) => handle(request), | |
| 15 | − PATCH: ({ request }) => handle(request), | |
| 16 | − }, | |
| 17 | − }, | |
| 18 | −}); | |
| @@ -1,13 +0,0 @@ | ||
| 1 | −import { createFileRoute } from "@tanstack/react-router"; | |
| 2 | −import { handleMcpRequest } from "../server/api-handler"; | |
| 3 | − | |
| 4 | −export const Route = createFileRoute("/mcp/$")({ | |
| 5 | − server: { | |
| 6 | − handlers: { | |
| 7 | − GET: ({ request }) => handleMcpRequest(request), | |
| 8 | − POST: ({ request }) => handleMcpRequest(request), | |
| 9 | − PUT: ({ request }) => handleMcpRequest(request), | |
| 10 | − DELETE: ({ request }) => handleMcpRequest(request), | |
| 11 | − }, | |
| 12 | − }, | |
| 13 | −}); | |
| @@ -20,8 +20,8 @@ const getHandlers = () => { · 19 unmodified lines | ||
| 20 | 20 | |
| 21 | 21 | export const handleApiRequest = async (request: Request): Promise<Response> => { |
| 22 | 22 | const handlers = await getHandlers(); |
| 23 | − // Strip /api prefix — the route catch-all (api.$.ts) matches /api/* | |
| 24 | − // but the Effect handler endpoints are defined without the prefix | |
| 23 | + // Strip /api prefix — Start request middleware forwards /api/* here, | |
| 24 | + // but the Effect handler endpoints are defined without the prefix. | |
| 25 | 25 | const url = new URL(request.url); |
| 26 | 26 | url.pathname = url.pathname.replace(/^\/api/, ""); |
| 27 | 27 | return handlers.api.handler(new Request(url, request)); |
| @@ -0,0 +1,18 @@ | ||
| 1 | +import { createMiddleware, createStart } from "@tanstack/react-start"; | |
| 2 | +import { handleApiRequest, handleMcpRequest } from "./server/api-handler"; | |
| 3 | + | |
| 4 | +const serverRequestMiddleware = createMiddleware({ type: "request" }).server( | |
| 5 | + ({ pathname, request, next }) => { | |
| 6 | + if (pathname === "/api" || pathname.startsWith("/api/")) { | |
| 7 | + return handleApiRequest(request); | |
| 8 | + } | |
| 9 | + if (pathname === "/mcp" || pathname.startsWith("/mcp/")) { | |
| 10 | + return handleMcpRequest(request); | |
| 11 | + } | |
| 12 | + return next(); | |
| 13 | + }, | |
| 14 | +); | |
| 15 | + | |
| 16 | +export const startInstance = createStart(() => ({ | |
| 17 | + requestMiddleware: [serverRequestMiddleware], | |
| 18 | +})); | |