From d85ffe50af167df4a2da9c523b4671c954c8cd12 Mon Sep 17 00:00:00 2001
From: Alaister Young <10985857+alaister@users.noreply.github.com>
Date: Mon, 11 May 2026 13:55:47 +0800
Subject: [PATCH] feat(studio): land SettingsLayout shell + 15 leaves
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
routes/project/$ref/settings.tsx: SettingsLayout shell with
`settingsLayoutTitle` + `skipSettingsLayout` opt-out (scans whole
match chain).
Sub-shells:
- routes/project/$ref/settings/api-keys.tsx: ApiKeysLayout wrapping
for both api-keys leaves (index + legacy), which both nest under
ApiKeysLayout in their Next getLayout.
15 Path-A re-exports:
- 8 flat: general, api (skipSettingsLayout — redirect-only page),
addons, compute-and-disk, dashboard, infrastructure, integrations,
log-drains.
- 2 api-keys: index ('API Keys'), legacy ('API Keys (Legacy)') under
the sub-shell.
- 2 jwt: index ('JWT Keys', wraps in JWTKeysLayout inline since
jwt/legacy doesn't share it), legacy ('JWT Keys (Legacy)').
- 2 webhooks: index, \$endpointId (both 'Webhooks').
- 1 billing/usage.
All carry settingsLayoutTitle in staticData matching the per-page
title in Next's getLayout.
---
apps/studio/TANSTACK_MIGRATION.md | 32 +-
apps/studio/routeTree.gen.ts | 392 ++++++++++++++++++
apps/studio/routes/project/$ref/settings.tsx | 34 ++
.../routes/project/$ref/settings/addons.tsx | 12 +
.../routes/project/$ref/settings/api-keys.tsx | 21 +
.../project/$ref/settings/api-keys/index.tsx | 12 +
.../project/$ref/settings/api-keys/legacy.tsx | 12 +
.../routes/project/$ref/settings/api.tsx | 14 +
.../project/$ref/settings/billing/usage.tsx | 12 +
.../$ref/settings/compute-and-disk.tsx | 12 +
.../project/$ref/settings/dashboard.tsx | 12 +
.../routes/project/$ref/settings/general.tsx | 12 +
.../project/$ref/settings/infrastructure.tsx | 12 +
.../project/$ref/settings/integrations.tsx | 12 +
.../project/$ref/settings/jwt/index.tsx | 20 +
.../project/$ref/settings/jwt/legacy.tsx | 12 +
.../project/$ref/settings/log-drains.tsx | 12 +
.../$ref/settings/webhooks/$endpointId.tsx | 12 +
.../project/$ref/settings/webhooks/index.tsx | 12 +
19 files changed, 653 insertions(+), 16 deletions(-)
create mode 100644 apps/studio/routes/project/$ref/settings.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/addons.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/api-keys.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/api-keys/index.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/api-keys/legacy.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/api.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/billing/usage.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/compute-and-disk.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/dashboard.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/general.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/infrastructure.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/integrations.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/jwt/index.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/jwt/legacy.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/log-drains.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/webhooks/$endpointId.tsx
create mode 100644 apps/studio/routes/project/$ref/settings/webhooks/index.tsx
diff --git a/apps/studio/TANSTACK_MIGRATION.md b/apps/studio/TANSTACK_MIGRATION.md
index 59e11ed4766..6866b0a4ee8 100644
--- a/apps/studio/TANSTACK_MIGRATION.md
+++ b/apps/studio/TANSTACK_MIGRATION.md
@@ -82,7 +82,7 @@ These are the layout-only TanStack files. Most hold a single product layout comp
- [x] `routes/project/$ref/observability.tsx` — ObservabilityLayout (reads `observabilityLayoutTitle` from leaf staticData)
- [x] `routes/project/$ref/advisors.tsx` — AdvisorsLayout (reads `advisorsLayoutTitle` from leaf staticData). Honours `skipAdvisorsLayout: true` opt-out for the rules sub-shell, which provides its own AdvisorsLayout-less-DefaultLayout wrap. Scans whole match chain (same pattern as functions.tsx).
- [x] `routes/project/$ref/advisors/rules.tsx` — sub-shell that inlines the inner body of `AdvisorRulesLayout` (AdvisorsLayout + PageLayout with title/tabs/feature-preview badge), minus the outer DefaultLayout (already provided by the parent project shell). Sets `skipAdvisorsLayout: true` on its own staticData. **Delta vs plan:** the existing `AdvisorRulesLayout` component wraps in DefaultLayout + AdvisorsLayout internally, so reusing it as-is would double-wrap both. Inlined the inner part; the Next-side component is untouched.
-- [ ] `routes/project/$ref/settings.tsx` — SettingsLayout
+- [x] `routes/project/$ref/settings.tsx` — SettingsLayout (reads `settingsLayoutTitle` from leaf staticData). Honours `skipSettingsLayout: true` for `settings/api` (redirect-only page). Adds a sub-shell at `routes/project/$ref/settings/api-keys.tsx` providing `ApiKeysLayout` for both api-keys leaves; `jwt/index` wraps in `JWTKeysLayout` inline since `jwt/legacy` doesn't share it.
- [ ] `routes/project/$ref/integrations.tsx` — ProjectIntegrationsLayout
- [x] `routes/project/$ref/sql.tsx` — EditorBaseLayout + SQLEditorLayout. Twin of editor.tsx; all four leaves share identical layout props so the shell hardcodes them (no `staticData` overrides). EditorBaseLayout wraps in ProjectLayoutWithAuth; SQLEditorLayout adds its own `withAuth` HOC but no extra ProjectLayout — same shape as the table editor (auth check runs twice but no double render).
- [x] `routes/project/$ref/editor.tsx` — EditorBaseLayout + TableEditorLayout. All three leaves share identical layout props so the shell hardcodes them (no `staticData` overrides). EditorBaseLayout wraps in `ProjectLayoutWithAuth` internally; TableEditorLayout's happy path is just a fragment + side-effect (banner) and only wraps in `ProjectLayoutWithAuth` on its no-permission branch — same as Next, no double-wrap in normal use.
@@ -273,21 +273,21 @@ These are the layout-only TanStack files. Most hold a single product layout comp
### Project shell — `/settings/*`
-- [ ] `routes/project/$ref/settings/general.tsx` ← `pages/project/[ref]/settings/general.tsx`
-- [ ] `routes/project/$ref/settings/addons.tsx` ← `pages/project/[ref]/settings/addons.tsx`
-- [ ] `routes/project/$ref/settings/api.tsx` ← `pages/project/[ref]/settings/api.tsx`
-- [ ] `routes/project/$ref/settings/compute-and-disk.tsx` ← `pages/project/[ref]/settings/compute-and-disk.tsx`
-- [ ] `routes/project/$ref/settings/dashboard.tsx` ← `pages/project/[ref]/settings/dashboard.tsx`
-- [ ] `routes/project/$ref/settings/infrastructure.tsx` ← `pages/project/[ref]/settings/infrastructure.tsx`
-- [ ] `routes/project/$ref/settings/integrations.tsx` ← `pages/project/[ref]/settings/integrations.tsx`
-- [ ] `routes/project/$ref/settings/log-drains.tsx` ← `pages/project/[ref]/settings/log-drains.tsx`
-- [ ] `routes/project/$ref/settings/api-keys/index.tsx` ← `pages/project/[ref]/settings/api-keys/index.tsx`
-- [ ] `routes/project/$ref/settings/api-keys/legacy.tsx` ← `pages/project/[ref]/settings/api-keys/legacy.tsx`
-- [ ] `routes/project/$ref/settings/billing/usage.tsx` ← `pages/project/[ref]/settings/billing/usage.tsx`
-- [ ] `routes/project/$ref/settings/jwt/index.tsx` ← `pages/project/[ref]/settings/jwt/index.tsx`
-- [ ] `routes/project/$ref/settings/jwt/legacy.tsx` ← `pages/project/[ref]/settings/jwt/legacy.tsx`
-- [ ] `routes/project/$ref/settings/webhooks/index.tsx` ← `pages/project/[ref]/settings/webhooks/index.tsx`
-- [ ] `routes/project/$ref/settings/webhooks/$endpointId.tsx` ← `pages/project/[ref]/settings/webhooks/[endpointId].tsx`
+- [x] A `routes/project/$ref/settings/general.tsx` ← `pages/project/[ref]/settings/general.tsx`
+- [x] A `routes/project/$ref/settings/addons.tsx` ← `pages/project/[ref]/settings/addons.tsx`
+- [x] A `routes/project/$ref/settings/api.tsx` ← `pages/project/[ref]/settings/api.tsx` (sets `skipSettingsLayout: true` — page is a useEffect redirect)
+- [x] A `routes/project/$ref/settings/compute-and-disk.tsx` ← `pages/project/[ref]/settings/compute-and-disk.tsx`
+- [x] A `routes/project/$ref/settings/dashboard.tsx` ← `pages/project/[ref]/settings/dashboard.tsx`
+- [x] A `routes/project/$ref/settings/infrastructure.tsx` ← `pages/project/[ref]/settings/infrastructure.tsx`
+- [x] A `routes/project/$ref/settings/integrations.tsx` ← `pages/project/[ref]/settings/integrations.tsx`
+- [x] A `routes/project/$ref/settings/log-drains.tsx` ← `pages/project/[ref]/settings/log-drains.tsx`
+- [x] A `routes/project/$ref/settings/api-keys/index.tsx` ← `pages/project/[ref]/settings/api-keys/index.tsx` (under `api-keys.tsx` sub-shell with ApiKeysLayout)
+- [x] A `routes/project/$ref/settings/api-keys/legacy.tsx` ← `pages/project/[ref]/settings/api-keys/legacy.tsx` (under `api-keys.tsx` sub-shell)
+- [x] A `routes/project/$ref/settings/billing/usage.tsx` ← `pages/project/[ref]/settings/billing/usage.tsx`
+- [x] A `routes/project/$ref/settings/jwt/index.tsx` ← `pages/project/[ref]/settings/jwt/index.tsx` (wraps in JWTKeysLayout inline)
+- [x] A `routes/project/$ref/settings/jwt/legacy.tsx` ← `pages/project/[ref]/settings/jwt/legacy.tsx`
+- [x] A `routes/project/$ref/settings/webhooks/index.tsx` ← `pages/project/[ref]/settings/webhooks/index.tsx`
+- [x] A `routes/project/$ref/settings/webhooks/$endpointId.tsx` ← `pages/project/[ref]/settings/webhooks/[endpointId].tsx`
### Project shell — `/integrations/*`
diff --git a/apps/studio/routeTree.gen.ts b/apps/studio/routeTree.gen.ts
index 2680622b2b5..d811fc6785d 100644
--- a/apps/studio/routeTree.gen.ts
+++ b/apps/studio/routeTree.gen.ts
@@ -46,6 +46,7 @@ import { Route as ApiConnectIndexRouteImport } from './routes/api/connect/index'
import { Route as AppOrgIndexRouteImport } from './routes/_app/org/index'
import { Route as ProjectRefStorageRouteImport } from './routes/project/$ref/storage'
import { Route as ProjectRefSqlRouteImport } from './routes/project/$ref/sql'
+import { Route as ProjectRefSettingsRouteImport } from './routes/project/$ref/settings'
import { Route as ProjectRefRealtimeRouteImport } from './routes/project/$ref/realtime'
import { Route as ProjectRefObservabilityRouteImport } from './routes/project/$ref/observability'
import { Route as ProjectRefLogsRouteImport } from './routes/project/$ref/logs'
@@ -78,6 +79,15 @@ import { Route as ProjectRefStorageS3RouteImport } from './routes/project/$ref/s
import { Route as ProjectRefSqlTemplatesRouteImport } from './routes/project/$ref/sql/templates'
import { Route as ProjectRefSqlQuickstartsRouteImport } from './routes/project/$ref/sql/quickstarts'
import { Route as ProjectRefSqlIdRouteImport } from './routes/project/$ref/sql/$id'
+import { Route as ProjectRefSettingsLogDrainsRouteImport } from './routes/project/$ref/settings/log-drains'
+import { Route as ProjectRefSettingsIntegrationsRouteImport } from './routes/project/$ref/settings/integrations'
+import { Route as ProjectRefSettingsInfrastructureRouteImport } from './routes/project/$ref/settings/infrastructure'
+import { Route as ProjectRefSettingsGeneralRouteImport } from './routes/project/$ref/settings/general'
+import { Route as ProjectRefSettingsDashboardRouteImport } from './routes/project/$ref/settings/dashboard'
+import { Route as ProjectRefSettingsComputeAndDiskRouteImport } from './routes/project/$ref/settings/compute-and-disk'
+import { Route as ProjectRefSettingsApiKeysRouteImport } from './routes/project/$ref/settings/api-keys'
+import { Route as ProjectRefSettingsApiRouteImport } from './routes/project/$ref/settings/api'
+import { Route as ProjectRefSettingsAddonsRouteImport } from './routes/project/$ref/settings/addons'
import { Route as ProjectRefRealtimeSettingsRouteImport } from './routes/project/$ref/realtime/settings'
import { Route as ProjectRefRealtimePoliciesRouteImport } from './routes/project/$ref/realtime/policies'
import { Route as ProjectRefRealtimeInspectorRouteImport } from './routes/project/$ref/realtime/inspector'
@@ -166,6 +176,9 @@ import { Route as AppAccountTokensScopedRouteImport } from './routes/_app/accoun
import { Route as ProjectRefStorageVectorsIndexRouteImport } from './routes/project/$ref/storage/vectors/index'
import { Route as ProjectRefStorageFilesIndexRouteImport } from './routes/project/$ref/storage/files/index'
import { Route as ProjectRefStorageAnalyticsIndexRouteImport } from './routes/project/$ref/storage/analytics/index'
+import { Route as ProjectRefSettingsWebhooksIndexRouteImport } from './routes/project/$ref/settings/webhooks/index'
+import { Route as ProjectRefSettingsJwtIndexRouteImport } from './routes/project/$ref/settings/jwt/index'
+import { Route as ProjectRefSettingsApiKeysIndexRouteImport } from './routes/project/$ref/settings/api-keys/index'
import { Route as ProjectRefLogsExplorerIndexRouteImport } from './routes/project/$ref/logs/explorer/index'
import { Route as ProjectRefFunctionsFunctionSlugIndexRouteImport } from './routes/project/$ref/functions/$functionSlug/index'
import { Route as ProjectRefDatabaseTriggersIndexRouteImport } from './routes/project/$ref/database/triggers/index'
@@ -178,6 +191,10 @@ import { Route as AppOrgSlugWebhooksIndexRouteImport } from './routes/_app/org/$
import { Route as AppOrgSlugPrivateAppsIndexRouteImport } from './routes/_app/org/$slug/private-apps/index'
import { Route as ProjectRefStorageFilesSettingsRouteImport } from './routes/project/$ref/storage/files/settings'
import { Route as ProjectRefStorageFilesPoliciesRouteImport } from './routes/project/$ref/storage/files/policies'
+import { Route as ProjectRefSettingsWebhooksEndpointIdRouteImport } from './routes/project/$ref/settings/webhooks/$endpointId'
+import { Route as ProjectRefSettingsJwtLegacyRouteImport } from './routes/project/$ref/settings/jwt/legacy'
+import { Route as ProjectRefSettingsBillingUsageRouteImport } from './routes/project/$ref/settings/billing/usage'
+import { Route as ProjectRefSettingsApiKeysLegacyRouteImport } from './routes/project/$ref/settings/api-keys/legacy'
import { Route as ProjectRefLogsExplorerTemplatesRouteImport } from './routes/project/$ref/logs/explorer/templates'
import { Route as ProjectRefLogsExplorerSavedRouteImport } from './routes/project/$ref/logs/explorer/saved'
import { Route as ProjectRefLogsExplorerRecentRouteImport } from './routes/project/$ref/logs/explorer/recent'
@@ -448,6 +465,11 @@ const ProjectRefSqlRoute = ProjectRefSqlRouteImport.update({
path: '/sql',
getParentRoute: () => ProjectRefRoute,
} as any)
+const ProjectRefSettingsRoute = ProjectRefSettingsRouteImport.update({
+ id: '/settings',
+ path: '/settings',
+ getParentRoute: () => ProjectRefRoute,
+} as any)
const ProjectRefRealtimeRoute = ProjectRefRealtimeRouteImport.update({
id: '/realtime',
path: '/realtime',
@@ -614,6 +636,59 @@ const ProjectRefSqlIdRoute = ProjectRefSqlIdRouteImport.update({
path: '/$id',
getParentRoute: () => ProjectRefSqlRoute,
} as any)
+const ProjectRefSettingsLogDrainsRoute =
+ ProjectRefSettingsLogDrainsRouteImport.update({
+ id: '/log-drains',
+ path: '/log-drains',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsIntegrationsRoute =
+ ProjectRefSettingsIntegrationsRouteImport.update({
+ id: '/integrations',
+ path: '/integrations',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsInfrastructureRoute =
+ ProjectRefSettingsInfrastructureRouteImport.update({
+ id: '/infrastructure',
+ path: '/infrastructure',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsGeneralRoute =
+ ProjectRefSettingsGeneralRouteImport.update({
+ id: '/general',
+ path: '/general',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsDashboardRoute =
+ ProjectRefSettingsDashboardRouteImport.update({
+ id: '/dashboard',
+ path: '/dashboard',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsComputeAndDiskRoute =
+ ProjectRefSettingsComputeAndDiskRouteImport.update({
+ id: '/compute-and-disk',
+ path: '/compute-and-disk',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsApiKeysRoute =
+ ProjectRefSettingsApiKeysRouteImport.update({
+ id: '/api-keys',
+ path: '/api-keys',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsApiRoute = ProjectRefSettingsApiRouteImport.update({
+ id: '/api',
+ path: '/api',
+ getParentRoute: () => ProjectRefSettingsRoute,
+} as any)
+const ProjectRefSettingsAddonsRoute =
+ ProjectRefSettingsAddonsRouteImport.update({
+ id: '/addons',
+ path: '/addons',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
const ProjectRefRealtimeSettingsRoute =
ProjectRefRealtimeSettingsRouteImport.update({
id: '/settings',
@@ -1101,6 +1176,24 @@ const ProjectRefStorageAnalyticsIndexRoute =
path: '/analytics/',
getParentRoute: () => ProjectRefStorageRoute,
} as any)
+const ProjectRefSettingsWebhooksIndexRoute =
+ ProjectRefSettingsWebhooksIndexRouteImport.update({
+ id: '/webhooks/',
+ path: '/webhooks/',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsJwtIndexRoute =
+ ProjectRefSettingsJwtIndexRouteImport.update({
+ id: '/jwt/',
+ path: '/jwt/',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsApiKeysIndexRoute =
+ ProjectRefSettingsApiKeysIndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => ProjectRefSettingsApiKeysRoute,
+ } as any)
const ProjectRefLogsExplorerIndexRoute =
ProjectRefLogsExplorerIndexRouteImport.update({
id: '/explorer/',
@@ -1172,6 +1265,30 @@ const ProjectRefStorageFilesPoliciesRoute =
path: '/files/policies',
getParentRoute: () => ProjectRefStorageRoute,
} as any)
+const ProjectRefSettingsWebhooksEndpointIdRoute =
+ ProjectRefSettingsWebhooksEndpointIdRouteImport.update({
+ id: '/webhooks/$endpointId',
+ path: '/webhooks/$endpointId',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsJwtLegacyRoute =
+ ProjectRefSettingsJwtLegacyRouteImport.update({
+ id: '/jwt/legacy',
+ path: '/jwt/legacy',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsBillingUsageRoute =
+ ProjectRefSettingsBillingUsageRouteImport.update({
+ id: '/billing/usage',
+ path: '/billing/usage',
+ getParentRoute: () => ProjectRefSettingsRoute,
+ } as any)
+const ProjectRefSettingsApiKeysLegacyRoute =
+ ProjectRefSettingsApiKeysLegacyRouteImport.update({
+ id: '/legacy',
+ path: '/legacy',
+ getParentRoute: () => ProjectRefSettingsApiKeysRoute,
+ } as any)
const ProjectRefLogsExplorerTemplatesRoute =
ProjectRefLogsExplorerTemplatesRouteImport.update({
id: '/explorer/templates',
@@ -1716,6 +1833,7 @@ export interface FileRoutesByFullPath {
'/project/$ref/logs': typeof ProjectRefLogsRouteWithChildren
'/project/$ref/observability': typeof ProjectRefObservabilityRouteWithChildren
'/project/$ref/realtime': typeof ProjectRefRealtimeRouteWithChildren
+ '/project/$ref/settings': typeof ProjectRefSettingsRouteWithChildren
'/project/$ref/sql': typeof ProjectRefSqlRouteWithChildren
'/project/$ref/storage': typeof ProjectRefStorageRouteWithChildren
'/org/': typeof AppOrgIndexRoute
@@ -1806,6 +1924,15 @@ export interface FileRoutesByFullPath {
'/project/$ref/realtime/inspector': typeof ProjectRefRealtimeInspectorRoute
'/project/$ref/realtime/policies': typeof ProjectRefRealtimePoliciesRoute
'/project/$ref/realtime/settings': typeof ProjectRefRealtimeSettingsRoute
+ '/project/$ref/settings/addons': typeof ProjectRefSettingsAddonsRoute
+ '/project/$ref/settings/api': typeof ProjectRefSettingsApiRoute
+ '/project/$ref/settings/api-keys': typeof ProjectRefSettingsApiKeysRouteWithChildren
+ '/project/$ref/settings/compute-and-disk': typeof ProjectRefSettingsComputeAndDiskRoute
+ '/project/$ref/settings/dashboard': typeof ProjectRefSettingsDashboardRoute
+ '/project/$ref/settings/general': typeof ProjectRefSettingsGeneralRoute
+ '/project/$ref/settings/infrastructure': typeof ProjectRefSettingsInfrastructureRoute
+ '/project/$ref/settings/integrations': typeof ProjectRefSettingsIntegrationsRoute
+ '/project/$ref/settings/log-drains': typeof ProjectRefSettingsLogDrainsRoute
'/project/$ref/sql/$id': typeof ProjectRefSqlIdRoute
'/project/$ref/sql/quickstarts': typeof ProjectRefSqlQuickstartsRoute
'/project/$ref/sql/templates': typeof ProjectRefSqlTemplatesRoute
@@ -1865,6 +1992,10 @@ export interface FileRoutesByFullPath {
'/project/$ref/logs/explorer/recent': typeof ProjectRefLogsExplorerRecentRoute
'/project/$ref/logs/explorer/saved': typeof ProjectRefLogsExplorerSavedRoute
'/project/$ref/logs/explorer/templates': typeof ProjectRefLogsExplorerTemplatesRoute
+ '/project/$ref/settings/api-keys/legacy': typeof ProjectRefSettingsApiKeysLegacyRoute
+ '/project/$ref/settings/billing/usage': typeof ProjectRefSettingsBillingUsageRoute
+ '/project/$ref/settings/jwt/legacy': typeof ProjectRefSettingsJwtLegacyRoute
+ '/project/$ref/settings/webhooks/$endpointId': typeof ProjectRefSettingsWebhooksEndpointIdRoute
'/project/$ref/storage/files/policies': typeof ProjectRefStorageFilesPoliciesRoute
'/project/$ref/storage/files/settings': typeof ProjectRefStorageFilesSettingsRoute
'/org/$slug/private-apps/': typeof AppOrgSlugPrivateAppsIndexRoute
@@ -1877,6 +2008,9 @@ export interface FileRoutesByFullPath {
'/project/$ref/database/triggers/': typeof ProjectRefDatabaseTriggersIndexRoute
'/project/$ref/functions/$functionSlug/': typeof ProjectRefFunctionsFunctionSlugIndexRoute
'/project/$ref/logs/explorer/': typeof ProjectRefLogsExplorerIndexRoute
+ '/project/$ref/settings/api-keys/': typeof ProjectRefSettingsApiKeysIndexRoute
+ '/project/$ref/settings/jwt/': typeof ProjectRefSettingsJwtIndexRoute
+ '/project/$ref/settings/webhooks/': typeof ProjectRefSettingsWebhooksIndexRoute
'/project/$ref/storage/analytics/': typeof ProjectRefStorageAnalyticsIndexRoute
'/project/$ref/storage/files/': typeof ProjectRefStorageFilesIndexRoute
'/project/$ref/storage/vectors/': typeof ProjectRefStorageVectorsIndexRoute
@@ -1961,6 +2095,7 @@ export interface FileRoutesByTo {
'/project/$ref/auth': typeof ProjectRefAuthRouteWithChildren
'/project/$ref/database': typeof ProjectRefDatabaseRouteWithChildren
'/project/$ref/realtime': typeof ProjectRefRealtimeRouteWithChildren
+ '/project/$ref/settings': typeof ProjectRefSettingsRouteWithChildren
'/project/$ref/storage': typeof ProjectRefStorageRouteWithChildren
'/org': typeof AppOrgIndexRoute
'/api/connect': typeof ApiConnectIndexRoute
@@ -2048,6 +2183,14 @@ export interface FileRoutesByTo {
'/project/$ref/realtime/inspector': typeof ProjectRefRealtimeInspectorRoute
'/project/$ref/realtime/policies': typeof ProjectRefRealtimePoliciesRoute
'/project/$ref/realtime/settings': typeof ProjectRefRealtimeSettingsRoute
+ '/project/$ref/settings/addons': typeof ProjectRefSettingsAddonsRoute
+ '/project/$ref/settings/api': typeof ProjectRefSettingsApiRoute
+ '/project/$ref/settings/compute-and-disk': typeof ProjectRefSettingsComputeAndDiskRoute
+ '/project/$ref/settings/dashboard': typeof ProjectRefSettingsDashboardRoute
+ '/project/$ref/settings/general': typeof ProjectRefSettingsGeneralRoute
+ '/project/$ref/settings/infrastructure': typeof ProjectRefSettingsInfrastructureRoute
+ '/project/$ref/settings/integrations': typeof ProjectRefSettingsIntegrationsRoute
+ '/project/$ref/settings/log-drains': typeof ProjectRefSettingsLogDrainsRoute
'/project/$ref/sql/$id': typeof ProjectRefSqlIdRoute
'/project/$ref/sql/quickstarts': typeof ProjectRefSqlQuickstartsRoute
'/project/$ref/sql/templates': typeof ProjectRefSqlTemplatesRoute
@@ -2107,6 +2250,10 @@ export interface FileRoutesByTo {
'/project/$ref/logs/explorer/recent': typeof ProjectRefLogsExplorerRecentRoute
'/project/$ref/logs/explorer/saved': typeof ProjectRefLogsExplorerSavedRoute
'/project/$ref/logs/explorer/templates': typeof ProjectRefLogsExplorerTemplatesRoute
+ '/project/$ref/settings/api-keys/legacy': typeof ProjectRefSettingsApiKeysLegacyRoute
+ '/project/$ref/settings/billing/usage': typeof ProjectRefSettingsBillingUsageRoute
+ '/project/$ref/settings/jwt/legacy': typeof ProjectRefSettingsJwtLegacyRoute
+ '/project/$ref/settings/webhooks/$endpointId': typeof ProjectRefSettingsWebhooksEndpointIdRoute
'/project/$ref/storage/files/policies': typeof ProjectRefStorageFilesPoliciesRoute
'/project/$ref/storage/files/settings': typeof ProjectRefStorageFilesSettingsRoute
'/org/$slug/private-apps': typeof AppOrgSlugPrivateAppsIndexRoute
@@ -2119,6 +2266,9 @@ export interface FileRoutesByTo {
'/project/$ref/database/triggers': typeof ProjectRefDatabaseTriggersIndexRoute
'/project/$ref/functions/$functionSlug': typeof ProjectRefFunctionsFunctionSlugIndexRoute
'/project/$ref/logs/explorer': typeof ProjectRefLogsExplorerIndexRoute
+ '/project/$ref/settings/api-keys': typeof ProjectRefSettingsApiKeysIndexRoute
+ '/project/$ref/settings/jwt': typeof ProjectRefSettingsJwtIndexRoute
+ '/project/$ref/settings/webhooks': typeof ProjectRefSettingsWebhooksIndexRoute
'/project/$ref/storage/analytics': typeof ProjectRefStorageAnalyticsIndexRoute
'/project/$ref/storage/files': typeof ProjectRefStorageFilesIndexRoute
'/project/$ref/storage/vectors': typeof ProjectRefStorageVectorsIndexRoute
@@ -2213,6 +2363,7 @@ export interface FileRoutesById {
'/project/$ref/logs': typeof ProjectRefLogsRouteWithChildren
'/project/$ref/observability': typeof ProjectRefObservabilityRouteWithChildren
'/project/$ref/realtime': typeof ProjectRefRealtimeRouteWithChildren
+ '/project/$ref/settings': typeof ProjectRefSettingsRouteWithChildren
'/project/$ref/sql': typeof ProjectRefSqlRouteWithChildren
'/project/$ref/storage': typeof ProjectRefStorageRouteWithChildren
'/_app/org/': typeof AppOrgIndexRoute
@@ -2303,6 +2454,15 @@ export interface FileRoutesById {
'/project/$ref/realtime/inspector': typeof ProjectRefRealtimeInspectorRoute
'/project/$ref/realtime/policies': typeof ProjectRefRealtimePoliciesRoute
'/project/$ref/realtime/settings': typeof ProjectRefRealtimeSettingsRoute
+ '/project/$ref/settings/addons': typeof ProjectRefSettingsAddonsRoute
+ '/project/$ref/settings/api': typeof ProjectRefSettingsApiRoute
+ '/project/$ref/settings/api-keys': typeof ProjectRefSettingsApiKeysRouteWithChildren
+ '/project/$ref/settings/compute-and-disk': typeof ProjectRefSettingsComputeAndDiskRoute
+ '/project/$ref/settings/dashboard': typeof ProjectRefSettingsDashboardRoute
+ '/project/$ref/settings/general': typeof ProjectRefSettingsGeneralRoute
+ '/project/$ref/settings/infrastructure': typeof ProjectRefSettingsInfrastructureRoute
+ '/project/$ref/settings/integrations': typeof ProjectRefSettingsIntegrationsRoute
+ '/project/$ref/settings/log-drains': typeof ProjectRefSettingsLogDrainsRoute
'/project/$ref/sql/$id': typeof ProjectRefSqlIdRoute
'/project/$ref/sql/quickstarts': typeof ProjectRefSqlQuickstartsRoute
'/project/$ref/sql/templates': typeof ProjectRefSqlTemplatesRoute
@@ -2362,6 +2522,10 @@ export interface FileRoutesById {
'/project/$ref/logs/explorer/recent': typeof ProjectRefLogsExplorerRecentRoute
'/project/$ref/logs/explorer/saved': typeof ProjectRefLogsExplorerSavedRoute
'/project/$ref/logs/explorer/templates': typeof ProjectRefLogsExplorerTemplatesRoute
+ '/project/$ref/settings/api-keys/legacy': typeof ProjectRefSettingsApiKeysLegacyRoute
+ '/project/$ref/settings/billing/usage': typeof ProjectRefSettingsBillingUsageRoute
+ '/project/$ref/settings/jwt/legacy': typeof ProjectRefSettingsJwtLegacyRoute
+ '/project/$ref/settings/webhooks/$endpointId': typeof ProjectRefSettingsWebhooksEndpointIdRoute
'/project/$ref/storage/files/policies': typeof ProjectRefStorageFilesPoliciesRoute
'/project/$ref/storage/files/settings': typeof ProjectRefStorageFilesSettingsRoute
'/_app/org/$slug/private-apps/': typeof AppOrgSlugPrivateAppsIndexRoute
@@ -2374,6 +2538,9 @@ export interface FileRoutesById {
'/project/$ref/database/triggers/': typeof ProjectRefDatabaseTriggersIndexRoute
'/project/$ref/functions/$functionSlug/': typeof ProjectRefFunctionsFunctionSlugIndexRoute
'/project/$ref/logs/explorer/': typeof ProjectRefLogsExplorerIndexRoute
+ '/project/$ref/settings/api-keys/': typeof ProjectRefSettingsApiKeysIndexRoute
+ '/project/$ref/settings/jwt/': typeof ProjectRefSettingsJwtIndexRoute
+ '/project/$ref/settings/webhooks/': typeof ProjectRefSettingsWebhooksIndexRoute
'/project/$ref/storage/analytics/': typeof ProjectRefStorageAnalyticsIndexRoute
'/project/$ref/storage/files/': typeof ProjectRefStorageFilesIndexRoute
'/project/$ref/storage/vectors/': typeof ProjectRefStorageVectorsIndexRoute
@@ -2467,6 +2634,7 @@ export interface FileRouteTypes {
| '/project/$ref/logs'
| '/project/$ref/observability'
| '/project/$ref/realtime'
+ | '/project/$ref/settings'
| '/project/$ref/sql'
| '/project/$ref/storage'
| '/org/'
@@ -2557,6 +2725,15 @@ export interface FileRouteTypes {
| '/project/$ref/realtime/inspector'
| '/project/$ref/realtime/policies'
| '/project/$ref/realtime/settings'
+ | '/project/$ref/settings/addons'
+ | '/project/$ref/settings/api'
+ | '/project/$ref/settings/api-keys'
+ | '/project/$ref/settings/compute-and-disk'
+ | '/project/$ref/settings/dashboard'
+ | '/project/$ref/settings/general'
+ | '/project/$ref/settings/infrastructure'
+ | '/project/$ref/settings/integrations'
+ | '/project/$ref/settings/log-drains'
| '/project/$ref/sql/$id'
| '/project/$ref/sql/quickstarts'
| '/project/$ref/sql/templates'
@@ -2616,6 +2793,10 @@ export interface FileRouteTypes {
| '/project/$ref/logs/explorer/recent'
| '/project/$ref/logs/explorer/saved'
| '/project/$ref/logs/explorer/templates'
+ | '/project/$ref/settings/api-keys/legacy'
+ | '/project/$ref/settings/billing/usage'
+ | '/project/$ref/settings/jwt/legacy'
+ | '/project/$ref/settings/webhooks/$endpointId'
| '/project/$ref/storage/files/policies'
| '/project/$ref/storage/files/settings'
| '/org/$slug/private-apps/'
@@ -2628,6 +2809,9 @@ export interface FileRouteTypes {
| '/project/$ref/database/triggers/'
| '/project/$ref/functions/$functionSlug/'
| '/project/$ref/logs/explorer/'
+ | '/project/$ref/settings/api-keys/'
+ | '/project/$ref/settings/jwt/'
+ | '/project/$ref/settings/webhooks/'
| '/project/$ref/storage/analytics/'
| '/project/$ref/storage/files/'
| '/project/$ref/storage/vectors/'
@@ -2712,6 +2896,7 @@ export interface FileRouteTypes {
| '/project/$ref/auth'
| '/project/$ref/database'
| '/project/$ref/realtime'
+ | '/project/$ref/settings'
| '/project/$ref/storage'
| '/org'
| '/api/connect'
@@ -2799,6 +2984,14 @@ export interface FileRouteTypes {
| '/project/$ref/realtime/inspector'
| '/project/$ref/realtime/policies'
| '/project/$ref/realtime/settings'
+ | '/project/$ref/settings/addons'
+ | '/project/$ref/settings/api'
+ | '/project/$ref/settings/compute-and-disk'
+ | '/project/$ref/settings/dashboard'
+ | '/project/$ref/settings/general'
+ | '/project/$ref/settings/infrastructure'
+ | '/project/$ref/settings/integrations'
+ | '/project/$ref/settings/log-drains'
| '/project/$ref/sql/$id'
| '/project/$ref/sql/quickstarts'
| '/project/$ref/sql/templates'
@@ -2858,6 +3051,10 @@ export interface FileRouteTypes {
| '/project/$ref/logs/explorer/recent'
| '/project/$ref/logs/explorer/saved'
| '/project/$ref/logs/explorer/templates'
+ | '/project/$ref/settings/api-keys/legacy'
+ | '/project/$ref/settings/billing/usage'
+ | '/project/$ref/settings/jwt/legacy'
+ | '/project/$ref/settings/webhooks/$endpointId'
| '/project/$ref/storage/files/policies'
| '/project/$ref/storage/files/settings'
| '/org/$slug/private-apps'
@@ -2870,6 +3067,9 @@ export interface FileRouteTypes {
| '/project/$ref/database/triggers'
| '/project/$ref/functions/$functionSlug'
| '/project/$ref/logs/explorer'
+ | '/project/$ref/settings/api-keys'
+ | '/project/$ref/settings/jwt'
+ | '/project/$ref/settings/webhooks'
| '/project/$ref/storage/analytics'
| '/project/$ref/storage/files'
| '/project/$ref/storage/vectors'
@@ -2963,6 +3163,7 @@ export interface FileRouteTypes {
| '/project/$ref/logs'
| '/project/$ref/observability'
| '/project/$ref/realtime'
+ | '/project/$ref/settings'
| '/project/$ref/sql'
| '/project/$ref/storage'
| '/_app/org/'
@@ -3053,6 +3254,15 @@ export interface FileRouteTypes {
| '/project/$ref/realtime/inspector'
| '/project/$ref/realtime/policies'
| '/project/$ref/realtime/settings'
+ | '/project/$ref/settings/addons'
+ | '/project/$ref/settings/api'
+ | '/project/$ref/settings/api-keys'
+ | '/project/$ref/settings/compute-and-disk'
+ | '/project/$ref/settings/dashboard'
+ | '/project/$ref/settings/general'
+ | '/project/$ref/settings/infrastructure'
+ | '/project/$ref/settings/integrations'
+ | '/project/$ref/settings/log-drains'
| '/project/$ref/sql/$id'
| '/project/$ref/sql/quickstarts'
| '/project/$ref/sql/templates'
@@ -3112,6 +3322,10 @@ export interface FileRouteTypes {
| '/project/$ref/logs/explorer/recent'
| '/project/$ref/logs/explorer/saved'
| '/project/$ref/logs/explorer/templates'
+ | '/project/$ref/settings/api-keys/legacy'
+ | '/project/$ref/settings/billing/usage'
+ | '/project/$ref/settings/jwt/legacy'
+ | '/project/$ref/settings/webhooks/$endpointId'
| '/project/$ref/storage/files/policies'
| '/project/$ref/storage/files/settings'
| '/_app/org/$slug/private-apps/'
@@ -3124,6 +3338,9 @@ export interface FileRouteTypes {
| '/project/$ref/database/triggers/'
| '/project/$ref/functions/$functionSlug/'
| '/project/$ref/logs/explorer/'
+ | '/project/$ref/settings/api-keys/'
+ | '/project/$ref/settings/jwt/'
+ | '/project/$ref/settings/webhooks/'
| '/project/$ref/storage/analytics/'
| '/project/$ref/storage/files/'
| '/project/$ref/storage/vectors/'
@@ -3532,6 +3749,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ProjectRefSqlRouteImport
parentRoute: typeof ProjectRefRoute
}
+ '/project/$ref/settings': {
+ id: '/project/$ref/settings'
+ path: '/settings'
+ fullPath: '/project/$ref/settings'
+ preLoaderRoute: typeof ProjectRefSettingsRouteImport
+ parentRoute: typeof ProjectRefRoute
+ }
'/project/$ref/realtime': {
id: '/project/$ref/realtime'
path: '/realtime'
@@ -3756,6 +3980,69 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ProjectRefSqlIdRouteImport
parentRoute: typeof ProjectRefSqlRoute
}
+ '/project/$ref/settings/log-drains': {
+ id: '/project/$ref/settings/log-drains'
+ path: '/log-drains'
+ fullPath: '/project/$ref/settings/log-drains'
+ preLoaderRoute: typeof ProjectRefSettingsLogDrainsRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/integrations': {
+ id: '/project/$ref/settings/integrations'
+ path: '/integrations'
+ fullPath: '/project/$ref/settings/integrations'
+ preLoaderRoute: typeof ProjectRefSettingsIntegrationsRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/infrastructure': {
+ id: '/project/$ref/settings/infrastructure'
+ path: '/infrastructure'
+ fullPath: '/project/$ref/settings/infrastructure'
+ preLoaderRoute: typeof ProjectRefSettingsInfrastructureRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/general': {
+ id: '/project/$ref/settings/general'
+ path: '/general'
+ fullPath: '/project/$ref/settings/general'
+ preLoaderRoute: typeof ProjectRefSettingsGeneralRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/dashboard': {
+ id: '/project/$ref/settings/dashboard'
+ path: '/dashboard'
+ fullPath: '/project/$ref/settings/dashboard'
+ preLoaderRoute: typeof ProjectRefSettingsDashboardRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/compute-and-disk': {
+ id: '/project/$ref/settings/compute-and-disk'
+ path: '/compute-and-disk'
+ fullPath: '/project/$ref/settings/compute-and-disk'
+ preLoaderRoute: typeof ProjectRefSettingsComputeAndDiskRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/api-keys': {
+ id: '/project/$ref/settings/api-keys'
+ path: '/api-keys'
+ fullPath: '/project/$ref/settings/api-keys'
+ preLoaderRoute: typeof ProjectRefSettingsApiKeysRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/api': {
+ id: '/project/$ref/settings/api'
+ path: '/api'
+ fullPath: '/project/$ref/settings/api'
+ preLoaderRoute: typeof ProjectRefSettingsApiRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/addons': {
+ id: '/project/$ref/settings/addons'
+ path: '/addons'
+ fullPath: '/project/$ref/settings/addons'
+ preLoaderRoute: typeof ProjectRefSettingsAddonsRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
'/project/$ref/realtime/settings': {
id: '/project/$ref/realtime/settings'
path: '/settings'
@@ -4372,6 +4659,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ProjectRefStorageAnalyticsIndexRouteImport
parentRoute: typeof ProjectRefStorageRoute
}
+ '/project/$ref/settings/webhooks/': {
+ id: '/project/$ref/settings/webhooks/'
+ path: '/webhooks'
+ fullPath: '/project/$ref/settings/webhooks/'
+ preLoaderRoute: typeof ProjectRefSettingsWebhooksIndexRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/jwt/': {
+ id: '/project/$ref/settings/jwt/'
+ path: '/jwt'
+ fullPath: '/project/$ref/settings/jwt/'
+ preLoaderRoute: typeof ProjectRefSettingsJwtIndexRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/api-keys/': {
+ id: '/project/$ref/settings/api-keys/'
+ path: '/'
+ fullPath: '/project/$ref/settings/api-keys/'
+ preLoaderRoute: typeof ProjectRefSettingsApiKeysIndexRouteImport
+ parentRoute: typeof ProjectRefSettingsApiKeysRoute
+ }
'/project/$ref/logs/explorer/': {
id: '/project/$ref/logs/explorer/'
path: '/explorer'
@@ -4456,6 +4764,34 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ProjectRefStorageFilesPoliciesRouteImport
parentRoute: typeof ProjectRefStorageRoute
}
+ '/project/$ref/settings/webhooks/$endpointId': {
+ id: '/project/$ref/settings/webhooks/$endpointId'
+ path: '/webhooks/$endpointId'
+ fullPath: '/project/$ref/settings/webhooks/$endpointId'
+ preLoaderRoute: typeof ProjectRefSettingsWebhooksEndpointIdRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/jwt/legacy': {
+ id: '/project/$ref/settings/jwt/legacy'
+ path: '/jwt/legacy'
+ fullPath: '/project/$ref/settings/jwt/legacy'
+ preLoaderRoute: typeof ProjectRefSettingsJwtLegacyRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/billing/usage': {
+ id: '/project/$ref/settings/billing/usage'
+ path: '/billing/usage'
+ fullPath: '/project/$ref/settings/billing/usage'
+ preLoaderRoute: typeof ProjectRefSettingsBillingUsageRouteImport
+ parentRoute: typeof ProjectRefSettingsRoute
+ }
+ '/project/$ref/settings/api-keys/legacy': {
+ id: '/project/$ref/settings/api-keys/legacy'
+ path: '/legacy'
+ fullPath: '/project/$ref/settings/api-keys/legacy'
+ preLoaderRoute: typeof ProjectRefSettingsApiKeysLegacyRouteImport
+ parentRoute: typeof ProjectRefSettingsApiKeysRoute
+ }
'/project/$ref/logs/explorer/templates': {
id: '/project/$ref/logs/explorer/templates'
path: '/explorer/templates'
@@ -5470,6 +5806,60 @@ const ProjectRefRealtimeRouteChildren: ProjectRefRealtimeRouteChildren = {
const ProjectRefRealtimeRouteWithChildren =
ProjectRefRealtimeRoute._addFileChildren(ProjectRefRealtimeRouteChildren)
+interface ProjectRefSettingsApiKeysRouteChildren {
+ ProjectRefSettingsApiKeysLegacyRoute: typeof ProjectRefSettingsApiKeysLegacyRoute
+ ProjectRefSettingsApiKeysIndexRoute: typeof ProjectRefSettingsApiKeysIndexRoute
+}
+
+const ProjectRefSettingsApiKeysRouteChildren: ProjectRefSettingsApiKeysRouteChildren =
+ {
+ ProjectRefSettingsApiKeysLegacyRoute: ProjectRefSettingsApiKeysLegacyRoute,
+ ProjectRefSettingsApiKeysIndexRoute: ProjectRefSettingsApiKeysIndexRoute,
+ }
+
+const ProjectRefSettingsApiKeysRouteWithChildren =
+ ProjectRefSettingsApiKeysRoute._addFileChildren(
+ ProjectRefSettingsApiKeysRouteChildren,
+ )
+
+interface ProjectRefSettingsRouteChildren {
+ ProjectRefSettingsAddonsRoute: typeof ProjectRefSettingsAddonsRoute
+ ProjectRefSettingsApiRoute: typeof ProjectRefSettingsApiRoute
+ ProjectRefSettingsApiKeysRoute: typeof ProjectRefSettingsApiKeysRouteWithChildren
+ ProjectRefSettingsComputeAndDiskRoute: typeof ProjectRefSettingsComputeAndDiskRoute
+ ProjectRefSettingsDashboardRoute: typeof ProjectRefSettingsDashboardRoute
+ ProjectRefSettingsGeneralRoute: typeof ProjectRefSettingsGeneralRoute
+ ProjectRefSettingsInfrastructureRoute: typeof ProjectRefSettingsInfrastructureRoute
+ ProjectRefSettingsIntegrationsRoute: typeof ProjectRefSettingsIntegrationsRoute
+ ProjectRefSettingsLogDrainsRoute: typeof ProjectRefSettingsLogDrainsRoute
+ ProjectRefSettingsBillingUsageRoute: typeof ProjectRefSettingsBillingUsageRoute
+ ProjectRefSettingsJwtLegacyRoute: typeof ProjectRefSettingsJwtLegacyRoute
+ ProjectRefSettingsWebhooksEndpointIdRoute: typeof ProjectRefSettingsWebhooksEndpointIdRoute
+ ProjectRefSettingsJwtIndexRoute: typeof ProjectRefSettingsJwtIndexRoute
+ ProjectRefSettingsWebhooksIndexRoute: typeof ProjectRefSettingsWebhooksIndexRoute
+}
+
+const ProjectRefSettingsRouteChildren: ProjectRefSettingsRouteChildren = {
+ ProjectRefSettingsAddonsRoute: ProjectRefSettingsAddonsRoute,
+ ProjectRefSettingsApiRoute: ProjectRefSettingsApiRoute,
+ ProjectRefSettingsApiKeysRoute: ProjectRefSettingsApiKeysRouteWithChildren,
+ ProjectRefSettingsComputeAndDiskRoute: ProjectRefSettingsComputeAndDiskRoute,
+ ProjectRefSettingsDashboardRoute: ProjectRefSettingsDashboardRoute,
+ ProjectRefSettingsGeneralRoute: ProjectRefSettingsGeneralRoute,
+ ProjectRefSettingsInfrastructureRoute: ProjectRefSettingsInfrastructureRoute,
+ ProjectRefSettingsIntegrationsRoute: ProjectRefSettingsIntegrationsRoute,
+ ProjectRefSettingsLogDrainsRoute: ProjectRefSettingsLogDrainsRoute,
+ ProjectRefSettingsBillingUsageRoute: ProjectRefSettingsBillingUsageRoute,
+ ProjectRefSettingsJwtLegacyRoute: ProjectRefSettingsJwtLegacyRoute,
+ ProjectRefSettingsWebhooksEndpointIdRoute:
+ ProjectRefSettingsWebhooksEndpointIdRoute,
+ ProjectRefSettingsJwtIndexRoute: ProjectRefSettingsJwtIndexRoute,
+ ProjectRefSettingsWebhooksIndexRoute: ProjectRefSettingsWebhooksIndexRoute,
+}
+
+const ProjectRefSettingsRouteWithChildren =
+ ProjectRefSettingsRoute._addFileChildren(ProjectRefSettingsRouteChildren)
+
interface ProjectRefSqlRouteChildren {
ProjectRefSqlIdRoute: typeof ProjectRefSqlIdRoute
ProjectRefSqlQuickstartsRoute: typeof ProjectRefSqlQuickstartsRoute
@@ -5528,6 +5918,7 @@ interface ProjectRefRouteChildren {
ProjectRefLogsRoute: typeof ProjectRefLogsRouteWithChildren
ProjectRefObservabilityRoute: typeof ProjectRefObservabilityRouteWithChildren
ProjectRefRealtimeRoute: typeof ProjectRefRealtimeRouteWithChildren
+ ProjectRefSettingsRoute: typeof ProjectRefSettingsRouteWithChildren
ProjectRefSqlRoute: typeof ProjectRefSqlRouteWithChildren
ProjectRefStorageRoute: typeof ProjectRefStorageRouteWithChildren
ProjectRefIndexRoute: typeof ProjectRefIndexRoute
@@ -5543,6 +5934,7 @@ const ProjectRefRouteChildren: ProjectRefRouteChildren = {
ProjectRefLogsRoute: ProjectRefLogsRouteWithChildren,
ProjectRefObservabilityRoute: ProjectRefObservabilityRouteWithChildren,
ProjectRefRealtimeRoute: ProjectRefRealtimeRouteWithChildren,
+ ProjectRefSettingsRoute: ProjectRefSettingsRouteWithChildren,
ProjectRefSqlRoute: ProjectRefSqlRouteWithChildren,
ProjectRefStorageRoute: ProjectRefStorageRouteWithChildren,
ProjectRefIndexRoute: ProjectRefIndexRoute,
diff --git a/apps/studio/routes/project/$ref/settings.tsx b/apps/studio/routes/project/$ref/settings.tsx
new file mode 100644
index 00000000000..d00687734f6
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings.tsx
@@ -0,0 +1,34 @@
+import { createFileRoute, Outlet, useMatches } from '@tanstack/react-router'
+
+import SettingsLayout from '@/components/layouts/ProjectSettingsLayout/SettingsLayout'
+
+export const Route = createFileRoute('/project/$ref/settings')({
+ component: SettingsShell,
+})
+
+type SettingsStaticData = {
+ settingsLayoutTitle?: string
+ // settings/api is a redirect-only page; skip the SettingsLayout wrap
+ // so we don't render the sidebar around a `return null`.
+ skipSettingsLayout?: boolean
+}
+
+function SettingsShell() {
+ const skip = useMatches({
+ select: (matches) =>
+ matches.some((m) => (m.staticData as SettingsStaticData | undefined)?.skipSettingsLayout),
+ })
+ const title = useMatches({
+ select: (matches) =>
+ (matches[matches.length - 1]?.staticData as SettingsStaticData | undefined)
+ ?.settingsLayoutTitle ?? '',
+ })
+
+ if (skip) return
+
+ return (
+
+
+
+ )
+}
diff --git a/apps/studio/routes/project/$ref/settings/addons.tsx b/apps/studio/routes/project/$ref/settings/addons.tsx
new file mode 100644
index 00000000000..e16c27cec56
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/addons.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ProjectAddons from '@/pages/project/[ref]/settings/addons'
+
+export const Route = createFileRoute('/project/$ref/settings/addons')({
+ component: SettingsAddonsRoute,
+ staticData: { settingsLayoutTitle: 'Add-ons' },
+})
+
+function SettingsAddonsRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/api-keys.tsx b/apps/studio/routes/project/$ref/settings/api-keys.tsx
new file mode 100644
index 00000000000..f53f9a8dbea
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/api-keys.tsx
@@ -0,0 +1,21 @@
+import { createFileRoute, Outlet } from '@tanstack/react-router'
+
+import ApiKeysLayout from '@/components/layouts/APIKeys/APIKeysLayout'
+
+export const Route = createFileRoute('/project/$ref/settings/api-keys')({
+ component: ApiKeysShell,
+})
+
+// Sub-shell mirroring the existing pages-router pattern: both
+// api-keys/index and api-keys/legacy wrap their content in
+// {page}.
+// The parent settings.tsx shell handles SettingsLayout (title via the
+// leaf's `settingsLayoutTitle` staticData); this sub-shell adds the
+// ApiKeysLayout tab strip both leaves share.
+function ApiKeysShell() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/studio/routes/project/$ref/settings/api-keys/index.tsx b/apps/studio/routes/project/$ref/settings/api-keys/index.tsx
new file mode 100644
index 00000000000..280ee9b677d
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/api-keys/index.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ApiKeysNewPage from '@/pages/project/[ref]/settings/api-keys/index'
+
+export const Route = createFileRoute('/project/$ref/settings/api-keys/')({
+ component: SettingsApiKeysIndexRoute,
+ staticData: { settingsLayoutTitle: 'API Keys' },
+})
+
+function SettingsApiKeysIndexRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/api-keys/legacy.tsx b/apps/studio/routes/project/$ref/settings/api-keys/legacy.tsx
new file mode 100644
index 00000000000..606bfddc2a2
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/api-keys/legacy.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ApiKeysLegacyPage from '@/pages/project/[ref]/settings/api-keys/legacy'
+
+export const Route = createFileRoute('/project/$ref/settings/api-keys/legacy')({
+ component: SettingsApiKeysLegacyRoute,
+ staticData: { settingsLayoutTitle: 'API Keys (Legacy)' },
+})
+
+function SettingsApiKeysLegacyRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/api.tsx b/apps/studio/routes/project/$ref/settings/api.tsx
new file mode 100644
index 00000000000..8bea4978655
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/api.tsx
@@ -0,0 +1,14 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ApiSettings from '@/pages/project/[ref]/settings/api'
+
+export const Route = createFileRoute('/project/$ref/settings/api')({
+ component: SettingsApiRoute,
+ // Page is a useEffect redirect that returns null; SettingsLayout
+ // (the sidebar shell) shouldn't render around it.
+ staticData: { skipSettingsLayout: true },
+})
+
+function SettingsApiRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/billing/usage.tsx b/apps/studio/routes/project/$ref/settings/billing/usage.tsx
new file mode 100644
index 00000000000..a8dfc2c6ea9
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/billing/usage.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ProjectBillingUsage from '@/pages/project/[ref]/settings/billing/usage'
+
+export const Route = createFileRoute('/project/$ref/settings/billing/usage')({
+ component: SettingsBillingUsageRoute,
+ staticData: { settingsLayoutTitle: 'Usage' },
+})
+
+function SettingsBillingUsageRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/compute-and-disk.tsx b/apps/studio/routes/project/$ref/settings/compute-and-disk.tsx
new file mode 100644
index 00000000000..d52452e83d8
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/compute-and-disk.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ComputeAndDiskPage from '@/pages/project/[ref]/settings/compute-and-disk'
+
+export const Route = createFileRoute('/project/$ref/settings/compute-and-disk')({
+ component: SettingsComputeAndDiskRoute,
+ staticData: { settingsLayoutTitle: 'Compute and Disk' },
+})
+
+function SettingsComputeAndDiskRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/dashboard.tsx b/apps/studio/routes/project/$ref/settings/dashboard.tsx
new file mode 100644
index 00000000000..871fcefb970
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/dashboard.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import Preferences from '@/pages/project/[ref]/settings/dashboard'
+
+export const Route = createFileRoute('/project/$ref/settings/dashboard')({
+ component: SettingsDashboardRoute,
+ staticData: { settingsLayoutTitle: 'General' },
+})
+
+function SettingsDashboardRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/general.tsx b/apps/studio/routes/project/$ref/settings/general.tsx
new file mode 100644
index 00000000000..4584179b5e8
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/general.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ProjectSettings from '@/pages/project/[ref]/settings/general'
+
+export const Route = createFileRoute('/project/$ref/settings/general')({
+ component: SettingsGeneralRoute,
+ staticData: { settingsLayoutTitle: 'General' },
+})
+
+function SettingsGeneralRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/infrastructure.tsx b/apps/studio/routes/project/$ref/settings/infrastructure.tsx
new file mode 100644
index 00000000000..5c968a103fd
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/infrastructure.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ProjectInfrastructure from '@/pages/project/[ref]/settings/infrastructure'
+
+export const Route = createFileRoute('/project/$ref/settings/infrastructure')({
+ component: SettingsInfrastructureRoute,
+ staticData: { settingsLayoutTitle: 'Infrastructure' },
+})
+
+function SettingsInfrastructureRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/integrations.tsx b/apps/studio/routes/project/$ref/settings/integrations.tsx
new file mode 100644
index 00000000000..2412c1186a1
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/integrations.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ProjectSettingsIntegrations from '@/pages/project/[ref]/settings/integrations'
+
+export const Route = createFileRoute('/project/$ref/settings/integrations')({
+ component: SettingsIntegrationsRoute,
+ staticData: { settingsLayoutTitle: 'Integrations' },
+})
+
+function SettingsIntegrationsRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/jwt/index.tsx b/apps/studio/routes/project/$ref/settings/jwt/index.tsx
new file mode 100644
index 00000000000..3d4e801fcbe
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/jwt/index.tsx
@@ -0,0 +1,20 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import JWTKeysLayout from '@/components/layouts/JWTKeys/JWTKeysLayout'
+import JWTSigningKeysPage from '@/pages/project/[ref]/settings/jwt/index'
+
+export const Route = createFileRoute('/project/$ref/settings/jwt/')({
+ component: SettingsJwtIndexRoute,
+ staticData: { settingsLayoutTitle: 'JWT Keys' },
+})
+
+// Inline the JWTKeysLayout wrap here rather than via a `settings/jwt.tsx`
+// sub-shell — jwt/legacy doesn't use JWTKeysLayout, so a shared
+// sub-shell would wrap legacy in the wrong layout.
+function SettingsJwtIndexRoute() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/studio/routes/project/$ref/settings/jwt/legacy.tsx b/apps/studio/routes/project/$ref/settings/jwt/legacy.tsx
new file mode 100644
index 00000000000..cc41915d61f
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/jwt/legacy.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import JWTKeysLegacyPage from '@/pages/project/[ref]/settings/jwt/legacy'
+
+export const Route = createFileRoute('/project/$ref/settings/jwt/legacy')({
+ component: SettingsJwtLegacyRoute,
+ staticData: { settingsLayoutTitle: 'JWT Keys (Legacy)' },
+})
+
+function SettingsJwtLegacyRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/log-drains.tsx b/apps/studio/routes/project/$ref/settings/log-drains.tsx
new file mode 100644
index 00000000000..3a31bdcdbd0
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/log-drains.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import LogDrainsSettings from '@/pages/project/[ref]/settings/log-drains'
+
+export const Route = createFileRoute('/project/$ref/settings/log-drains')({
+ component: SettingsLogDrainsRoute,
+ staticData: { settingsLayoutTitle: 'Log Drains' },
+})
+
+function SettingsLogDrainsRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/webhooks/$endpointId.tsx b/apps/studio/routes/project/$ref/settings/webhooks/$endpointId.tsx
new file mode 100644
index 00000000000..fcfd9b474a1
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/webhooks/$endpointId.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ProjectWebhookEndpointSettings from '@/pages/project/[ref]/settings/webhooks/[endpointId]'
+
+export const Route = createFileRoute('/project/$ref/settings/webhooks/$endpointId')({
+ component: SettingsWebhooksEndpointRoute,
+ staticData: { settingsLayoutTitle: 'Webhooks' },
+})
+
+function SettingsWebhooksEndpointRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/settings/webhooks/index.tsx b/apps/studio/routes/project/$ref/settings/webhooks/index.tsx
new file mode 100644
index 00000000000..1db6586c63e
--- /dev/null
+++ b/apps/studio/routes/project/$ref/settings/webhooks/index.tsx
@@ -0,0 +1,12 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import ProjectWebhooksSettings from '@/pages/project/[ref]/settings/webhooks/index'
+
+export const Route = createFileRoute('/project/$ref/settings/webhooks/')({
+ component: SettingsWebhooksIndexRoute,
+ staticData: { settingsLayoutTitle: 'Webhooks' },
+})
+
+function SettingsWebhooksIndexRoute() {
+ return
+}