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 +}