From e4490979183242fca666ea3c46a4d8dd12e0533d Mon Sep 17 00:00:00 2001
From: Alaister Young <10985857+alaister@users.noreply.github.com>
Date: Mon, 11 May 2026 13:59:47 +0800
Subject: [PATCH] feat(studio): land ProjectIntegrationsLayout shell + 4 leaves
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Adds the TanStack shell at routes/project/$ref/integrations.tsx and
re-export leaves for index, $id, $id/$pageId, and $id/$pageId/$childId
(Path A — pages/... files retained per migration plan).
---
apps/studio/TANSTACK_MIGRATION.md | 10 +-
apps/studio/routeTree.gen.ts | 121 ++++++++++++++++++
.../routes/project/$ref/integrations.tsx | 15 +++
.../$id/$pageId/$childId/index.tsx | 11 ++
.../$ref/integrations/$id/$pageId/index.tsx | 11 ++
.../project/$ref/integrations/$id/index.tsx | 11 ++
.../project/$ref/integrations/index.tsx | 11 ++
7 files changed, 185 insertions(+), 5 deletions(-)
create mode 100644 apps/studio/routes/project/$ref/integrations.tsx
create mode 100644 apps/studio/routes/project/$ref/integrations/$id/$pageId/$childId/index.tsx
create mode 100644 apps/studio/routes/project/$ref/integrations/$id/$pageId/index.tsx
create mode 100644 apps/studio/routes/project/$ref/integrations/$id/index.tsx
create mode 100644 apps/studio/routes/project/$ref/integrations/index.tsx
diff --git a/apps/studio/TANSTACK_MIGRATION.md b/apps/studio/TANSTACK_MIGRATION.md
index 6866b0a4ee8..acc552d0921 100644
--- a/apps/studio/TANSTACK_MIGRATION.md
+++ b/apps/studio/TANSTACK_MIGRATION.md
@@ -83,7 +83,7 @@ These are the layout-only TanStack files. Most hold a single product layout comp
- [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.
- [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/integrations.tsx` — ProjectIntegrationsLayout (no staticData; all 4 leaves share identical layout). Layout is `withAuth(({ children }) => {children})`, so the shell just wraps `` once.
- [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.
@@ -291,10 +291,10 @@ These are the layout-only TanStack files. Most hold a single product layout comp
### Project shell — `/integrations/*`
-- [ ] `routes/project/$ref/integrations/index.tsx` ← `pages/project/[ref]/integrations/index.tsx`
-- [ ] `routes/project/$ref/integrations/$id/index.tsx` ← `pages/project/[ref]/integrations/[id]/index.tsx`
-- [ ] `routes/project/$ref/integrations/$id/$pageId/index.tsx` ← `pages/project/[ref]/integrations/[id]/[pageId]/index.tsx`
-- [ ] `routes/project/$ref/integrations/$id/$pageId/$childId/index.tsx` ← `pages/project/[ref]/integrations/[id]/[pageId]/[childId]/index.tsx`
+- [x] `routes/project/$ref/integrations/index.tsx` ← `pages/project/[ref]/integrations/index.tsx`
+- [x] `routes/project/$ref/integrations/$id/index.tsx` ← `pages/project/[ref]/integrations/[id]/index.tsx`
+- [x] `routes/project/$ref/integrations/$id/$pageId/index.tsx` ← `pages/project/[ref]/integrations/[id]/[pageId]/index.tsx`
+- [x] `routes/project/$ref/integrations/$id/$pageId/$childId/index.tsx` ← `pages/project/[ref]/integrations/[id]/[pageId]/[childId]/index.tsx`
### Project shell — `/sql/*`
diff --git a/apps/studio/routeTree.gen.ts b/apps/studio/routeTree.gen.ts
index d811fc6785d..198355f0e14 100644
--- a/apps/studio/routeTree.gen.ts
+++ b/apps/studio/routeTree.gen.ts
@@ -50,6 +50,7 @@ import { Route as ProjectRefSettingsRouteImport } from './routes/project/$ref/se
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'
+import { Route as ProjectRefIntegrationsRouteImport } from './routes/project/$ref/integrations'
import { Route as ProjectRefFunctionsRouteImport } from './routes/project/$ref/functions'
import { Route as ProjectRefEditorRouteImport } from './routes/project/$ref/editor'
import { Route as ProjectRefDatabaseRouteImport } from './routes/project/$ref/database'
@@ -67,6 +68,7 @@ import { Route as AppAccountAuditRouteImport } from './routes/_app/account/audit
import { Route as ProjectRefSqlIndexRouteImport } from './routes/project/$ref/sql/index'
import { Route as ProjectRefObservabilityIndexRouteImport } from './routes/project/$ref/observability/index'
import { Route as ProjectRefLogsIndexRouteImport } from './routes/project/$ref/logs/index'
+import { Route as ProjectRefIntegrationsIndexRouteImport } from './routes/project/$ref/integrations/index'
import { Route as ProjectRefFunctionsIndexRouteImport } from './routes/project/$ref/functions/index'
import { Route as ProjectRefEditorIndexRouteImport } from './routes/project/$ref/editor/index'
import { Route as ProjectRefBranchesIndexRouteImport } from './routes/project/$ref/branches/index'
@@ -180,6 +182,7 @@ import { Route as ProjectRefSettingsWebhooksIndexRouteImport } from './routes/pr
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 ProjectRefIntegrationsIdIndexRouteImport } from './routes/project/$ref/integrations/$id/index'
import { Route as ProjectRefFunctionsFunctionSlugIndexRouteImport } from './routes/project/$ref/functions/$functionSlug/index'
import { Route as ProjectRefDatabaseTriggersIndexRouteImport } from './routes/project/$ref/database/triggers/index'
import { Route as ProjectRefDatabaseTablesIndexRouteImport } from './routes/project/$ref/database/tables/index'
@@ -239,6 +242,7 @@ import { Route as ApiPlatformAuthRefMagiclinkRouteImport } from './routes/api/pl
import { Route as ApiPlatformAuthRefInviteRouteImport } from './routes/api/platform/auth/$ref/invite'
import { Route as AuthPartnersStripeProjectsLoginRouteImport } from './routes/_auth/partners/stripe/projects/login'
import { Route as AppOrgSlugWebhooksEndpointIdRouteImport } from './routes/_app/org/$slug/webhooks/$endpointId'
+import { Route as ProjectRefIntegrationsIdPageIdIndexRouteImport } from './routes/project/$ref/integrations/$id/$pageId/index'
import { Route as ApiV1ProjectsRefFunctionsIndexRouteImport } from './routes/api/v1/projects/$ref/functions/index'
import { Route as ApiPlatformStorageRefBucketsIndexRouteImport } from './routes/api/platform/storage/$ref/buckets/index'
import { Route as ApiPlatformPropsProjectRefIndexRouteImport } from './routes/api/platform/props/project/$ref/index'
@@ -261,6 +265,7 @@ import { Route as ApiPlatformProjectsRefApiGraphqlRouteImport } from './routes/a
import { Route as ApiPlatformProjectsRefApiKeysTemporaryRouteImport } from './routes/api/platform/projects/$ref/api-keys/temporary'
import { Route as ApiPlatformProjectsRefAnalyticsLogDrainsRouteImport } from './routes/api/platform/projects/$ref/analytics/log-drains'
import { Route as ApiPlatformOrganizationsSlugBillingSubscriptionRouteImport } from './routes/api/platform/organizations/$slug/billing/subscription'
+import { Route as ProjectRefIntegrationsIdPageIdChildIdIndexRouteImport } from './routes/project/$ref/integrations/$id/$pageId/$childId/index'
import { Route as ApiV1ProjectsRefFunctionsSlugIndexRouteImport } from './routes/api/v1/projects/$ref/functions/$slug/index'
import { Route as ApiPlatformStorageRefBucketsIdIndexRouteImport } from './routes/api/platform/storage/$ref/buckets/$id/index'
import { Route as ApiPlatformProjectsRefContentFoldersIndexRouteImport } from './routes/api/platform/projects/$ref/content/folders/index'
@@ -485,6 +490,11 @@ const ProjectRefLogsRoute = ProjectRefLogsRouteImport.update({
path: '/logs',
getParentRoute: () => ProjectRefRoute,
} as any)
+const ProjectRefIntegrationsRoute = ProjectRefIntegrationsRouteImport.update({
+ id: '/integrations',
+ path: '/integrations',
+ getParentRoute: () => ProjectRefRoute,
+} as any)
const ProjectRefFunctionsRoute = ProjectRefFunctionsRouteImport.update({
id: '/functions',
path: '/functions',
@@ -572,6 +582,12 @@ const ProjectRefLogsIndexRoute = ProjectRefLogsIndexRouteImport.update({
path: '/',
getParentRoute: () => ProjectRefLogsRoute,
} as any)
+const ProjectRefIntegrationsIndexRoute =
+ ProjectRefIntegrationsIndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => ProjectRefIntegrationsRoute,
+ } as any)
const ProjectRefFunctionsIndexRoute =
ProjectRefFunctionsIndexRouteImport.update({
id: '/',
@@ -1200,6 +1216,12 @@ const ProjectRefLogsExplorerIndexRoute =
path: '/explorer/',
getParentRoute: () => ProjectRefLogsRoute,
} as any)
+const ProjectRefIntegrationsIdIndexRoute =
+ ProjectRefIntegrationsIdIndexRouteImport.update({
+ id: '/$id/',
+ path: '/$id/',
+ getParentRoute: () => ProjectRefIntegrationsRoute,
+ } as any)
const ProjectRefFunctionsFunctionSlugIndexRoute =
ProjectRefFunctionsFunctionSlugIndexRouteImport.update({
id: '/',
@@ -1550,6 +1572,12 @@ const AppOrgSlugWebhooksEndpointIdRoute =
path: '/$slug/webhooks/$endpointId',
getParentRoute: () => AppOrgRoute,
} as any)
+const ProjectRefIntegrationsIdPageIdIndexRoute =
+ ProjectRefIntegrationsIdPageIdIndexRouteImport.update({
+ id: '/$id/$pageId/',
+ path: '/$id/$pageId/',
+ getParentRoute: () => ProjectRefIntegrationsRoute,
+ } as any)
const ApiV1ProjectsRefFunctionsIndexRoute =
ApiV1ProjectsRefFunctionsIndexRouteImport.update({
id: '/api/v1/projects/$ref/functions/',
@@ -1682,6 +1710,12 @@ const ApiPlatformOrganizationsSlugBillingSubscriptionRoute =
path: '/api/platform/organizations/$slug/billing/subscription',
getParentRoute: () => rootRouteImport,
} as any)
+const ProjectRefIntegrationsIdPageIdChildIdIndexRoute =
+ ProjectRefIntegrationsIdPageIdChildIdIndexRouteImport.update({
+ id: '/$id/$pageId/$childId/',
+ path: '/$id/$pageId/$childId/',
+ getParentRoute: () => ProjectRefIntegrationsRoute,
+ } as any)
const ApiV1ProjectsRefFunctionsSlugIndexRoute =
ApiV1ProjectsRefFunctionsSlugIndexRouteImport.update({
id: '/api/v1/projects/$ref/functions/$slug/',
@@ -1830,6 +1864,7 @@ export interface FileRoutesByFullPath {
'/project/$ref/database': typeof ProjectRefDatabaseRouteWithChildren
'/project/$ref/editor': typeof ProjectRefEditorRouteWithChildren
'/project/$ref/functions': typeof ProjectRefFunctionsRouteWithChildren
+ '/project/$ref/integrations': typeof ProjectRefIntegrationsRouteWithChildren
'/project/$ref/logs': typeof ProjectRefLogsRouteWithChildren
'/project/$ref/observability': typeof ProjectRefObservabilityRouteWithChildren
'/project/$ref/realtime': typeof ProjectRefRealtimeRouteWithChildren
@@ -1945,6 +1980,7 @@ export interface FileRoutesByFullPath {
'/project/$ref/branches/': typeof ProjectRefBranchesIndexRoute
'/project/$ref/editor/': typeof ProjectRefEditorIndexRoute
'/project/$ref/functions/': typeof ProjectRefFunctionsIndexRoute
+ '/project/$ref/integrations/': typeof ProjectRefIntegrationsIndexRoute
'/project/$ref/logs/': typeof ProjectRefLogsIndexRoute
'/project/$ref/observability/': typeof ProjectRefObservabilityIndexRoute
'/project/$ref/sql/': typeof ProjectRefSqlIndexRoute
@@ -2007,6 +2043,7 @@ export interface FileRoutesByFullPath {
'/project/$ref/database/tables/': typeof ProjectRefDatabaseTablesIndexRoute
'/project/$ref/database/triggers/': typeof ProjectRefDatabaseTriggersIndexRoute
'/project/$ref/functions/$functionSlug/': typeof ProjectRefFunctionsFunctionSlugIndexRoute
+ '/project/$ref/integrations/$id/': typeof ProjectRefIntegrationsIdIndexRoute
'/project/$ref/logs/explorer/': typeof ProjectRefLogsExplorerIndexRoute
'/project/$ref/settings/api-keys/': typeof ProjectRefSettingsApiKeysIndexRoute
'/project/$ref/settings/jwt/': typeof ProjectRefSettingsJwtIndexRoute
@@ -2036,6 +2073,7 @@ export interface FileRoutesByFullPath {
'/api/platform/props/project/$ref/': typeof ApiPlatformPropsProjectRefIndexRoute
'/api/platform/storage/$ref/buckets/': typeof ApiPlatformStorageRefBucketsIndexRoute
'/api/v1/projects/$ref/functions/': typeof ApiV1ProjectsRefFunctionsIndexRoute
+ '/project/$ref/integrations/$id/$pageId/': typeof ProjectRefIntegrationsIdPageIdIndexRoute
'/api/platform/auth/$ref/users/$id/factors': typeof ApiPlatformAuthRefUsersIdFactorsRoute
'/api/platform/projects/$ref/analytics/endpoints/$name': typeof ApiPlatformProjectsRefAnalyticsEndpointsNameRoute
'/api/platform/projects/$ref/analytics/log-drains/$uuid': typeof ApiPlatformProjectsRefAnalyticsLogDrainsUuidRoute
@@ -2046,6 +2084,7 @@ export interface FileRoutesByFullPath {
'/api/platform/projects/$ref/content/folders/': typeof ApiPlatformProjectsRefContentFoldersIndexRoute
'/api/platform/storage/$ref/buckets/$id/': typeof ApiPlatformStorageRefBucketsIdIndexRoute
'/api/v1/projects/$ref/functions/$slug/': typeof ApiV1ProjectsRefFunctionsSlugIndexRoute
+ '/project/$ref/integrations/$id/$pageId/$childId/': typeof ProjectRefIntegrationsIdPageIdChildIdIndexRoute
'/api/platform/storage/$ref/buckets/$id/objects/download': typeof ApiPlatformStorageRefBucketsIdObjectsDownloadRoute
'/api/platform/storage/$ref/buckets/$id/objects/list': typeof ApiPlatformStorageRefBucketsIdObjectsListRoute
'/api/platform/storage/$ref/buckets/$id/objects/move': typeof ApiPlatformStorageRefBucketsIdObjectsMoveRoute
@@ -2203,6 +2242,7 @@ export interface FileRoutesByTo {
'/project/$ref/branches': typeof ProjectRefBranchesIndexRoute
'/project/$ref/editor': typeof ProjectRefEditorIndexRoute
'/project/$ref/functions': typeof ProjectRefFunctionsIndexRoute
+ '/project/$ref/integrations': typeof ProjectRefIntegrationsIndexRoute
'/project/$ref/logs': typeof ProjectRefLogsIndexRoute
'/project/$ref/observability': typeof ProjectRefObservabilityIndexRoute
'/project/$ref/sql': typeof ProjectRefSqlIndexRoute
@@ -2265,6 +2305,7 @@ export interface FileRoutesByTo {
'/project/$ref/database/tables': typeof ProjectRefDatabaseTablesIndexRoute
'/project/$ref/database/triggers': typeof ProjectRefDatabaseTriggersIndexRoute
'/project/$ref/functions/$functionSlug': typeof ProjectRefFunctionsFunctionSlugIndexRoute
+ '/project/$ref/integrations/$id': typeof ProjectRefIntegrationsIdIndexRoute
'/project/$ref/logs/explorer': typeof ProjectRefLogsExplorerIndexRoute
'/project/$ref/settings/api-keys': typeof ProjectRefSettingsApiKeysIndexRoute
'/project/$ref/settings/jwt': typeof ProjectRefSettingsJwtIndexRoute
@@ -2294,6 +2335,7 @@ export interface FileRoutesByTo {
'/api/platform/props/project/$ref': typeof ApiPlatformPropsProjectRefIndexRoute
'/api/platform/storage/$ref/buckets': typeof ApiPlatformStorageRefBucketsIndexRoute
'/api/v1/projects/$ref/functions': typeof ApiV1ProjectsRefFunctionsIndexRoute
+ '/project/$ref/integrations/$id/$pageId': typeof ProjectRefIntegrationsIdPageIdIndexRoute
'/api/platform/auth/$ref/users/$id/factors': typeof ApiPlatformAuthRefUsersIdFactorsRoute
'/api/platform/projects/$ref/analytics/endpoints/$name': typeof ApiPlatformProjectsRefAnalyticsEndpointsNameRoute
'/api/platform/projects/$ref/analytics/log-drains/$uuid': typeof ApiPlatformProjectsRefAnalyticsLogDrainsUuidRoute
@@ -2304,6 +2346,7 @@ export interface FileRoutesByTo {
'/api/platform/projects/$ref/content/folders': typeof ApiPlatformProjectsRefContentFoldersIndexRoute
'/api/platform/storage/$ref/buckets/$id': typeof ApiPlatformStorageRefBucketsIdIndexRoute
'/api/v1/projects/$ref/functions/$slug': typeof ApiV1ProjectsRefFunctionsSlugIndexRoute
+ '/project/$ref/integrations/$id/$pageId/$childId': typeof ProjectRefIntegrationsIdPageIdChildIdIndexRoute
'/api/platform/storage/$ref/buckets/$id/objects/download': typeof ApiPlatformStorageRefBucketsIdObjectsDownloadRoute
'/api/platform/storage/$ref/buckets/$id/objects/list': typeof ApiPlatformStorageRefBucketsIdObjectsListRoute
'/api/platform/storage/$ref/buckets/$id/objects/move': typeof ApiPlatformStorageRefBucketsIdObjectsMoveRoute
@@ -2360,6 +2403,7 @@ export interface FileRoutesById {
'/project/$ref/database': typeof ProjectRefDatabaseRouteWithChildren
'/project/$ref/editor': typeof ProjectRefEditorRouteWithChildren
'/project/$ref/functions': typeof ProjectRefFunctionsRouteWithChildren
+ '/project/$ref/integrations': typeof ProjectRefIntegrationsRouteWithChildren
'/project/$ref/logs': typeof ProjectRefLogsRouteWithChildren
'/project/$ref/observability': typeof ProjectRefObservabilityRouteWithChildren
'/project/$ref/realtime': typeof ProjectRefRealtimeRouteWithChildren
@@ -2475,6 +2519,7 @@ export interface FileRoutesById {
'/project/$ref/branches/': typeof ProjectRefBranchesIndexRoute
'/project/$ref/editor/': typeof ProjectRefEditorIndexRoute
'/project/$ref/functions/': typeof ProjectRefFunctionsIndexRoute
+ '/project/$ref/integrations/': typeof ProjectRefIntegrationsIndexRoute
'/project/$ref/logs/': typeof ProjectRefLogsIndexRoute
'/project/$ref/observability/': typeof ProjectRefObservabilityIndexRoute
'/project/$ref/sql/': typeof ProjectRefSqlIndexRoute
@@ -2537,6 +2582,7 @@ export interface FileRoutesById {
'/project/$ref/database/tables/': typeof ProjectRefDatabaseTablesIndexRoute
'/project/$ref/database/triggers/': typeof ProjectRefDatabaseTriggersIndexRoute
'/project/$ref/functions/$functionSlug/': typeof ProjectRefFunctionsFunctionSlugIndexRoute
+ '/project/$ref/integrations/$id/': typeof ProjectRefIntegrationsIdIndexRoute
'/project/$ref/logs/explorer/': typeof ProjectRefLogsExplorerIndexRoute
'/project/$ref/settings/api-keys/': typeof ProjectRefSettingsApiKeysIndexRoute
'/project/$ref/settings/jwt/': typeof ProjectRefSettingsJwtIndexRoute
@@ -2566,6 +2612,7 @@ export interface FileRoutesById {
'/api/platform/props/project/$ref/': typeof ApiPlatformPropsProjectRefIndexRoute
'/api/platform/storage/$ref/buckets/': typeof ApiPlatformStorageRefBucketsIndexRoute
'/api/v1/projects/$ref/functions/': typeof ApiV1ProjectsRefFunctionsIndexRoute
+ '/project/$ref/integrations/$id/$pageId/': typeof ProjectRefIntegrationsIdPageIdIndexRoute
'/api/platform/auth/$ref/users/$id/factors': typeof ApiPlatformAuthRefUsersIdFactorsRoute
'/api/platform/projects/$ref/analytics/endpoints/$name': typeof ApiPlatformProjectsRefAnalyticsEndpointsNameRoute
'/api/platform/projects/$ref/analytics/log-drains/$uuid': typeof ApiPlatformProjectsRefAnalyticsLogDrainsUuidRoute
@@ -2576,6 +2623,7 @@ export interface FileRoutesById {
'/api/platform/projects/$ref/content/folders/': typeof ApiPlatformProjectsRefContentFoldersIndexRoute
'/api/platform/storage/$ref/buckets/$id/': typeof ApiPlatformStorageRefBucketsIdIndexRoute
'/api/v1/projects/$ref/functions/$slug/': typeof ApiV1ProjectsRefFunctionsSlugIndexRoute
+ '/project/$ref/integrations/$id/$pageId/$childId/': typeof ProjectRefIntegrationsIdPageIdChildIdIndexRoute
'/api/platform/storage/$ref/buckets/$id/objects/download': typeof ApiPlatformStorageRefBucketsIdObjectsDownloadRoute
'/api/platform/storage/$ref/buckets/$id/objects/list': typeof ApiPlatformStorageRefBucketsIdObjectsListRoute
'/api/platform/storage/$ref/buckets/$id/objects/move': typeof ApiPlatformStorageRefBucketsIdObjectsMoveRoute
@@ -2631,6 +2679,7 @@ export interface FileRouteTypes {
| '/project/$ref/database'
| '/project/$ref/editor'
| '/project/$ref/functions'
+ | '/project/$ref/integrations'
| '/project/$ref/logs'
| '/project/$ref/observability'
| '/project/$ref/realtime'
@@ -2746,6 +2795,7 @@ export interface FileRouteTypes {
| '/project/$ref/branches/'
| '/project/$ref/editor/'
| '/project/$ref/functions/'
+ | '/project/$ref/integrations/'
| '/project/$ref/logs/'
| '/project/$ref/observability/'
| '/project/$ref/sql/'
@@ -2808,6 +2858,7 @@ export interface FileRouteTypes {
| '/project/$ref/database/tables/'
| '/project/$ref/database/triggers/'
| '/project/$ref/functions/$functionSlug/'
+ | '/project/$ref/integrations/$id/'
| '/project/$ref/logs/explorer/'
| '/project/$ref/settings/api-keys/'
| '/project/$ref/settings/jwt/'
@@ -2837,6 +2888,7 @@ export interface FileRouteTypes {
| '/api/platform/props/project/$ref/'
| '/api/platform/storage/$ref/buckets/'
| '/api/v1/projects/$ref/functions/'
+ | '/project/$ref/integrations/$id/$pageId/'
| '/api/platform/auth/$ref/users/$id/factors'
| '/api/platform/projects/$ref/analytics/endpoints/$name'
| '/api/platform/projects/$ref/analytics/log-drains/$uuid'
@@ -2847,6 +2899,7 @@ export interface FileRouteTypes {
| '/api/platform/projects/$ref/content/folders/'
| '/api/platform/storage/$ref/buckets/$id/'
| '/api/v1/projects/$ref/functions/$slug/'
+ | '/project/$ref/integrations/$id/$pageId/$childId/'
| '/api/platform/storage/$ref/buckets/$id/objects/download'
| '/api/platform/storage/$ref/buckets/$id/objects/list'
| '/api/platform/storage/$ref/buckets/$id/objects/move'
@@ -3004,6 +3057,7 @@ export interface FileRouteTypes {
| '/project/$ref/branches'
| '/project/$ref/editor'
| '/project/$ref/functions'
+ | '/project/$ref/integrations'
| '/project/$ref/logs'
| '/project/$ref/observability'
| '/project/$ref/sql'
@@ -3066,6 +3120,7 @@ export interface FileRouteTypes {
| '/project/$ref/database/tables'
| '/project/$ref/database/triggers'
| '/project/$ref/functions/$functionSlug'
+ | '/project/$ref/integrations/$id'
| '/project/$ref/logs/explorer'
| '/project/$ref/settings/api-keys'
| '/project/$ref/settings/jwt'
@@ -3095,6 +3150,7 @@ export interface FileRouteTypes {
| '/api/platform/props/project/$ref'
| '/api/platform/storage/$ref/buckets'
| '/api/v1/projects/$ref/functions'
+ | '/project/$ref/integrations/$id/$pageId'
| '/api/platform/auth/$ref/users/$id/factors'
| '/api/platform/projects/$ref/analytics/endpoints/$name'
| '/api/platform/projects/$ref/analytics/log-drains/$uuid'
@@ -3105,6 +3161,7 @@ export interface FileRouteTypes {
| '/api/platform/projects/$ref/content/folders'
| '/api/platform/storage/$ref/buckets/$id'
| '/api/v1/projects/$ref/functions/$slug'
+ | '/project/$ref/integrations/$id/$pageId/$childId'
| '/api/platform/storage/$ref/buckets/$id/objects/download'
| '/api/platform/storage/$ref/buckets/$id/objects/list'
| '/api/platform/storage/$ref/buckets/$id/objects/move'
@@ -3160,6 +3217,7 @@ export interface FileRouteTypes {
| '/project/$ref/database'
| '/project/$ref/editor'
| '/project/$ref/functions'
+ | '/project/$ref/integrations'
| '/project/$ref/logs'
| '/project/$ref/observability'
| '/project/$ref/realtime'
@@ -3275,6 +3333,7 @@ export interface FileRouteTypes {
| '/project/$ref/branches/'
| '/project/$ref/editor/'
| '/project/$ref/functions/'
+ | '/project/$ref/integrations/'
| '/project/$ref/logs/'
| '/project/$ref/observability/'
| '/project/$ref/sql/'
@@ -3337,6 +3396,7 @@ export interface FileRouteTypes {
| '/project/$ref/database/tables/'
| '/project/$ref/database/triggers/'
| '/project/$ref/functions/$functionSlug/'
+ | '/project/$ref/integrations/$id/'
| '/project/$ref/logs/explorer/'
| '/project/$ref/settings/api-keys/'
| '/project/$ref/settings/jwt/'
@@ -3366,6 +3426,7 @@ export interface FileRouteTypes {
| '/api/platform/props/project/$ref/'
| '/api/platform/storage/$ref/buckets/'
| '/api/v1/projects/$ref/functions/'
+ | '/project/$ref/integrations/$id/$pageId/'
| '/api/platform/auth/$ref/users/$id/factors'
| '/api/platform/projects/$ref/analytics/endpoints/$name'
| '/api/platform/projects/$ref/analytics/log-drains/$uuid'
@@ -3376,6 +3437,7 @@ export interface FileRouteTypes {
| '/api/platform/projects/$ref/content/folders/'
| '/api/platform/storage/$ref/buckets/$id/'
| '/api/v1/projects/$ref/functions/$slug/'
+ | '/project/$ref/integrations/$id/$pageId/$childId/'
| '/api/platform/storage/$ref/buckets/$id/objects/download'
| '/api/platform/storage/$ref/buckets/$id/objects/list'
| '/api/platform/storage/$ref/buckets/$id/objects/move'
@@ -3777,6 +3839,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ProjectRefLogsRouteImport
parentRoute: typeof ProjectRefRoute
}
+ '/project/$ref/integrations': {
+ id: '/project/$ref/integrations'
+ path: '/integrations'
+ fullPath: '/project/$ref/integrations'
+ preLoaderRoute: typeof ProjectRefIntegrationsRouteImport
+ parentRoute: typeof ProjectRefRoute
+ }
'/project/$ref/functions': {
id: '/project/$ref/functions'
path: '/functions'
@@ -3896,6 +3965,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ProjectRefLogsIndexRouteImport
parentRoute: typeof ProjectRefLogsRoute
}
+ '/project/$ref/integrations/': {
+ id: '/project/$ref/integrations/'
+ path: '/'
+ fullPath: '/project/$ref/integrations/'
+ preLoaderRoute: typeof ProjectRefIntegrationsIndexRouteImport
+ parentRoute: typeof ProjectRefIntegrationsRoute
+ }
'/project/$ref/functions/': {
id: '/project/$ref/functions/'
path: '/'
@@ -4687,6 +4763,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ProjectRefLogsExplorerIndexRouteImport
parentRoute: typeof ProjectRefLogsRoute
}
+ '/project/$ref/integrations/$id/': {
+ id: '/project/$ref/integrations/$id/'
+ path: '/$id'
+ fullPath: '/project/$ref/integrations/$id/'
+ preLoaderRoute: typeof ProjectRefIntegrationsIdIndexRouteImport
+ parentRoute: typeof ProjectRefIntegrationsRoute
+ }
'/project/$ref/functions/$functionSlug/': {
id: '/project/$ref/functions/$functionSlug/'
path: '/'
@@ -5100,6 +5183,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof AppOrgSlugWebhooksEndpointIdRouteImport
parentRoute: typeof AppOrgRoute
}
+ '/project/$ref/integrations/$id/$pageId/': {
+ id: '/project/$ref/integrations/$id/$pageId/'
+ path: '/$id/$pageId'
+ fullPath: '/project/$ref/integrations/$id/$pageId/'
+ preLoaderRoute: typeof ProjectRefIntegrationsIdPageIdIndexRouteImport
+ parentRoute: typeof ProjectRefIntegrationsRoute
+ }
'/api/v1/projects/$ref/functions/': {
id: '/api/v1/projects/$ref/functions/'
path: '/api/v1/projects/$ref/functions'
@@ -5254,6 +5344,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ApiPlatformOrganizationsSlugBillingSubscriptionRouteImport
parentRoute: typeof rootRouteImport
}
+ '/project/$ref/integrations/$id/$pageId/$childId/': {
+ id: '/project/$ref/integrations/$id/$pageId/$childId/'
+ path: '/$id/$pageId/$childId'
+ fullPath: '/project/$ref/integrations/$id/$pageId/$childId/'
+ preLoaderRoute: typeof ProjectRefIntegrationsIdPageIdChildIdIndexRouteImport
+ parentRoute: typeof ProjectRefIntegrationsRoute
+ }
'/api/v1/projects/$ref/functions/$slug/': {
id: '/api/v1/projects/$ref/functions/$slug/'
path: '/api/v1/projects/$ref/functions/$slug'
@@ -5705,6 +5802,28 @@ const ProjectRefFunctionsRouteChildren: ProjectRefFunctionsRouteChildren = {
const ProjectRefFunctionsRouteWithChildren =
ProjectRefFunctionsRoute._addFileChildren(ProjectRefFunctionsRouteChildren)
+interface ProjectRefIntegrationsRouteChildren {
+ ProjectRefIntegrationsIndexRoute: typeof ProjectRefIntegrationsIndexRoute
+ ProjectRefIntegrationsIdIndexRoute: typeof ProjectRefIntegrationsIdIndexRoute
+ ProjectRefIntegrationsIdPageIdIndexRoute: typeof ProjectRefIntegrationsIdPageIdIndexRoute
+ ProjectRefIntegrationsIdPageIdChildIdIndexRoute: typeof ProjectRefIntegrationsIdPageIdChildIdIndexRoute
+}
+
+const ProjectRefIntegrationsRouteChildren: ProjectRefIntegrationsRouteChildren =
+ {
+ ProjectRefIntegrationsIndexRoute: ProjectRefIntegrationsIndexRoute,
+ ProjectRefIntegrationsIdIndexRoute: ProjectRefIntegrationsIdIndexRoute,
+ ProjectRefIntegrationsIdPageIdIndexRoute:
+ ProjectRefIntegrationsIdPageIdIndexRoute,
+ ProjectRefIntegrationsIdPageIdChildIdIndexRoute:
+ ProjectRefIntegrationsIdPageIdChildIdIndexRoute,
+ }
+
+const ProjectRefIntegrationsRouteWithChildren =
+ ProjectRefIntegrationsRoute._addFileChildren(
+ ProjectRefIntegrationsRouteChildren,
+ )
+
interface ProjectRefLogsRouteChildren {
ProjectRefLogsAuthLogsRoute: typeof ProjectRefLogsAuthLogsRoute
ProjectRefLogsCronLogsRoute: typeof ProjectRefLogsCronLogsRoute
@@ -5915,6 +6034,7 @@ interface ProjectRefRouteChildren {
ProjectRefDatabaseRoute: typeof ProjectRefDatabaseRouteWithChildren
ProjectRefEditorRoute: typeof ProjectRefEditorRouteWithChildren
ProjectRefFunctionsRoute: typeof ProjectRefFunctionsRouteWithChildren
+ ProjectRefIntegrationsRoute: typeof ProjectRefIntegrationsRouteWithChildren
ProjectRefLogsRoute: typeof ProjectRefLogsRouteWithChildren
ProjectRefObservabilityRoute: typeof ProjectRefObservabilityRouteWithChildren
ProjectRefRealtimeRoute: typeof ProjectRefRealtimeRouteWithChildren
@@ -5931,6 +6051,7 @@ const ProjectRefRouteChildren: ProjectRefRouteChildren = {
ProjectRefDatabaseRoute: ProjectRefDatabaseRouteWithChildren,
ProjectRefEditorRoute: ProjectRefEditorRouteWithChildren,
ProjectRefFunctionsRoute: ProjectRefFunctionsRouteWithChildren,
+ ProjectRefIntegrationsRoute: ProjectRefIntegrationsRouteWithChildren,
ProjectRefLogsRoute: ProjectRefLogsRouteWithChildren,
ProjectRefObservabilityRoute: ProjectRefObservabilityRouteWithChildren,
ProjectRefRealtimeRoute: ProjectRefRealtimeRouteWithChildren,
diff --git a/apps/studio/routes/project/$ref/integrations.tsx b/apps/studio/routes/project/$ref/integrations.tsx
new file mode 100644
index 00000000000..a219f87b212
--- /dev/null
+++ b/apps/studio/routes/project/$ref/integrations.tsx
@@ -0,0 +1,15 @@
+import { createFileRoute, Outlet } from '@tanstack/react-router'
+
+import { ProjectIntegrationsLayout } from '@/components/layouts/ProjectIntegrationsLayout'
+
+export const Route = createFileRoute('/project/$ref/integrations')({
+ component: IntegrationsShell,
+})
+
+function IntegrationsShell() {
+ return (
+
+
+
+ )
+}
diff --git a/apps/studio/routes/project/$ref/integrations/$id/$pageId/$childId/index.tsx b/apps/studio/routes/project/$ref/integrations/$id/$pageId/$childId/index.tsx
new file mode 100644
index 00000000000..b1c355d355f
--- /dev/null
+++ b/apps/studio/routes/project/$ref/integrations/$id/$pageId/$childId/index.tsx
@@ -0,0 +1,11 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import IntegrationPage from '@/pages/project/[ref]/integrations/[id]/[pageId]/[childId]/index'
+
+export const Route = createFileRoute('/project/$ref/integrations/$id/$pageId/$childId/')({
+ component: IntegrationChildIdRoute,
+})
+
+function IntegrationChildIdRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/integrations/$id/$pageId/index.tsx b/apps/studio/routes/project/$ref/integrations/$id/$pageId/index.tsx
new file mode 100644
index 00000000000..ad7c32a2d33
--- /dev/null
+++ b/apps/studio/routes/project/$ref/integrations/$id/$pageId/index.tsx
@@ -0,0 +1,11 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import IntegrationPage from '@/pages/project/[ref]/integrations/[id]/[pageId]/index'
+
+export const Route = createFileRoute('/project/$ref/integrations/$id/$pageId/')({
+ component: IntegrationPageIdRoute,
+})
+
+function IntegrationPageIdRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/integrations/$id/index.tsx b/apps/studio/routes/project/$ref/integrations/$id/index.tsx
new file mode 100644
index 00000000000..5b757d94c21
--- /dev/null
+++ b/apps/studio/routes/project/$ref/integrations/$id/index.tsx
@@ -0,0 +1,11 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import IntegrationPage from '@/pages/project/[ref]/integrations/[id]/index'
+
+export const Route = createFileRoute('/project/$ref/integrations/$id/')({
+ component: IntegrationIdRoute,
+})
+
+function IntegrationIdRoute() {
+ return
+}
diff --git a/apps/studio/routes/project/$ref/integrations/index.tsx b/apps/studio/routes/project/$ref/integrations/index.tsx
new file mode 100644
index 00000000000..aa9a59ee5a4
--- /dev/null
+++ b/apps/studio/routes/project/$ref/integrations/index.tsx
@@ -0,0 +1,11 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+import IntegrationsPage from '@/pages/project/[ref]/integrations/index'
+
+export const Route = createFileRoute('/project/$ref/integrations/')({
+ component: IntegrationsIndexRoute,
+})
+
+function IntegrationsIndexRoute() {
+ return
+}