mirror of
https://github.com/supabase/supabase.git
synced 2026-06-27 19:14:37 -04:00
9eab4f8fbf
**Stack 1/6** of the TanStack Start migration (#46424), split into reviewable, independently-mergeable PRs. > [!IMPORTANT] > **Next stays the default and only active framework after this PR.** This wires up the Vite/TanStack-Start build pipeline behind the `STUDIO_FRAMEWORK` flag, but there are no TanStack routes yet — so the TanStack build isn't functional or tested until later PRs in the stack. Nothing about the Next build, dev, or deploy changes behaviourally here. ## What's in this PR - **Dispatch:** `dev`/`build`/`start` now go through `scripts/dispatch.js`, which runs the Next variant unless `STUDIO_FRAMEWORK=tanstack`. The original commands are preserved as `dev:next`/`build:next`/`start:next`. - **Build pipeline:** `vite.config.ts`, `serve.js`, `smoke-server.mjs`, vite/tanstack deps, `turbo.jsonc`. - **`tsconfig.json`:** `jsx: react-jsx`, `moduleResolution: Bundler`, `target: ES2022`. Because `include` is `**/*.ts(x)`, this re-typechecks the whole app, so the companion adaptations below land with it. - **Shared adaptations (companions to the tsconfig change):** `BufferSource` casts, `packages/ui` unused-`React` import removals, etc. - **Routing/middleware plumbing:** `next.config.ts` + `redirects.shared.ts` (redirect rules now shared with `vercel.ts`), `proxy.ts`/`start.ts` middleware + `hosted-api-allowlist.ts`. ## Verification Run locally off `master`: frozen install ✓, `studio` typecheck ✓, **Next build ✓** (compiles + generates all routes), lint ratchet ✓ ("some rules improved"), prettier ✓. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a hosted API endpoint allowlist to return 404 for non-supported `/api/*` routes. * Introduced a TanStack route-migration checklist and expanded TanStack Start routing support. * **Improvements** * Enhanced deployment refresh/detection by tightening cookie handling for “latest deployment” updates. * Centralized redirect/maintenance-mode rules for consistent platform vs self-hosted behavior. * Improved production serving with a dedicated static + proxy server and a post-build smoke test. * **Dependencies** * Updated TanStack-related packages and React Table/query tooling versions. * **Documentation / Chores** * Updated formatting and tooling config; added shared build environment parsing utilities. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Alaister Young <10985857+alaister@users.noreply.github.com> Co-authored-by: Ivan Vasilov <vasilov.ivan@gmail.com>
36 lines
1.5 KiB
TypeScript
36 lines
1.5 KiB
TypeScript
import { createMiddleware, createStart } from '@tanstack/react-start'
|
|
|
|
import { BASE_PATH, IS_PLATFORM } from '@/lib/constants'
|
|
import { isHostedSupportedApiPath } from '@/lib/hosted-api-allowlist'
|
|
|
|
// Self-hosted-only API routes must 404 in platform (hosted) mode. Under the
|
|
// Next pages router this lives in middleware (proxy.ts), but TanStack Start
|
|
// has no middleware runtime, so the guard is migrated here as a global
|
|
// request middleware sharing the same allowlist (lib/hosted-api-allowlist.ts).
|
|
// On Vercel our `/api/*` (and `/_serverFn/*`) requests are rewritten to the
|
|
// api/server.js function which runs the Start handler, so createStartHandler
|
|
// runs this server-side for every API request — even though pages are served
|
|
// as a static SPA shell. The guard therefore covers all API routes from a
|
|
// single place.
|
|
|
|
const platformApiGuard = createMiddleware({ type: 'request' }).server(({ request, next }) => {
|
|
const { pathname } = new URL(request.url)
|
|
// Path relative to the configured basePath — mirrors Next's basePath-
|
|
// relative middleware matcher.
|
|
const relativePath =
|
|
BASE_PATH && pathname.startsWith(BASE_PATH) ? pathname.slice(BASE_PATH.length) : pathname
|
|
|
|
if (IS_PLATFORM && relativePath.startsWith('/api/') && !isHostedSupportedApiPath(relativePath)) {
|
|
return Response.json(
|
|
{ success: false, message: 'Endpoint not supported on hosted' },
|
|
{ status: 404 }
|
|
)
|
|
}
|
|
|
|
return next()
|
|
})
|
|
|
|
export const startInstance = createStart(() => ({
|
|
requestMiddleware: [platformApiGuard],
|
|
}))
|