mirror of
https://github.com/supabase/supabase.git
synced 2026-09-22 13:37:53 +08:00
1755580dcf
## What kind of change does this PR introduce? Feature and information architecture change. Builds on #50246. ## What is the current behaviour? Warehouse setup, progress, errors, table selection, and connection details all live in the transient Connect sheet. Closing the sheet hides the current replication state, and the integration is absent from the Integrations page. ## What is the new behaviour? Warehouse now has a persistent Overview page at `/project/{ref}/integrations/warehouse/overview`: - Before setup, the existing schema and table picker enables Warehouse. - During setup, the page shows the current phase and per-table backfill state where available. - Setup and status failures remain visible on the page with retry actions where possible. - Once complete, the page shows Status, Tables, then Connect. - The Connect sheet becomes read-only. Before Warehouse is ready, it links directly to the Overview page for setup, progress, or recovery. | Before | After | | --- | --- | | <img width="1200" height="907" alt="Chives Pantry Supabase" src="https://github.com/user-attachments/assets/82dc7fb0-3859-499e-96ab-56f70a5c7325" /> | <img width="1200" height="907" alt="Chives Pantry Supabase" src="https://github.com/user-attachments/assets/7428e301-27f8-48fe-91e0-6880b132920d" /> | | <img width="1200" height="907" alt="Chives Pantry Supabase" src="https://github.com/user-attachments/assets/82dc7fb0-3859-499e-96ab-56f70a5c7325" /> | <img width="1200" height="907" alt="54709" src="https://github.com/user-attachments/assets/0c589e5b-e13c-4554-a6ee-6730d0e95c07" /> | | <img width="1200" height="907" alt="ETL BigTable ETL Team Supabase" src="https://github.com/user-attachments/assets/18ec9f6c-3724-453f-bbbb-c7149758246e" /> | <img width="1200" height="907" alt="Regular AWS Teamer Supabase" src="https://github.com/user-attachments/assets/3819c9fe-e56d-4cec-988d-5e724f8d990a" /> | ## To test Use a project whose organisation is included in the Warehouse allow-list. 1. Open `/project/{ref}/integrations`, filter by **Data platform**, and open Warehouse. 2. Before setup, confirm the existing schema and table picker appears and starts with no tables selected. 3. Start setup and confirm the Status section polls through setup and table backfill phases. 4. Confirm setup failures remain visible and expose Retry when the API returns affected tables. 5. After setup, confirm the section order is Status, Tables, Connect. 6. Confirm existing replicated tables are selected and locked, while additional tables can be added. 7. Open `/project/{ref}?showConnect=true&connectTab=warehouse` and confirm it links to the Overview page before setup, during setup, and after a setup failure. 8. Once setup is complete, confirm the Connect sheet shows the FlightSQL and DuckDB connection controls from #50246. 9. Repeat the Overview checks with **One-Click Integrations** turned off. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added Supabase Warehouse to the integrations catalog, with overview documentation and availability-aware display. * Added Warehouse setup and management flows, including schema and table selection, replication progress, status details, connection options, and retry actions. * Added DuckDB and FlightSQL engine selection with Connect sheet URL and preference synchronization. * Added table replication status, lag, timestamps, and size information. * **Bug Fixes** * Warehouse setup status requests no longer retry automatically after failures. * Improved recovery messaging and retry behavior for setup and connection errors. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
65 lines
4.0 KiB
TypeScript
65 lines
4.0 KiB
TypeScript
/**
|
|
* Registry of integration overview markdown, keyed by integration id
|
|
* (= directory name under `static-data/integrations/`).
|
|
*
|
|
* The import specifiers must stay as string literals: both bundlers can only
|
|
* code-split and apply their md-as-string loaders (raw-loader rule in
|
|
* next.config.ts, `mdRawLoader` plugin in vite.config.ts) to imports they can
|
|
* statically analyze. A template-literal specifier like
|
|
* ``import(`@/static-data/integrations/${id}/overview.md`)`` happens to work
|
|
* under webpack/turbopack (context modules) but is left untouched by
|
|
* Vite/Rolldown and throws `TypeError: Failed to resolve module specifier`
|
|
* at runtime in the TanStack build.
|
|
*
|
|
* `overviews.test.ts` asserts this map stays in sync with the files on disk —
|
|
* when adding a new `overview.md`, add its entry here.
|
|
*/
|
|
const INTEGRATION_OVERVIEWS = {
|
|
airtable_wrapper: () => import('@/static-data/integrations/airtable_wrapper/overview.md'),
|
|
auth0_wrapper: () => import('@/static-data/integrations/auth0_wrapper/overview.md'),
|
|
bigquery_wrapper: () => import('@/static-data/integrations/bigquery_wrapper/overview.md'),
|
|
cal_wrapper: () => import('@/static-data/integrations/cal_wrapper/overview.md'),
|
|
calendly_wrapper: () => import('@/static-data/integrations/calendly_wrapper/overview.md'),
|
|
cfd1_wrapper: () => import('@/static-data/integrations/cfd1_wrapper/overview.md'),
|
|
clerk_wrapper: () => import('@/static-data/integrations/clerk_wrapper/overview.md'),
|
|
clickhouse_wrapper: () => import('@/static-data/integrations/clickhouse_wrapper/overview.md'),
|
|
cognito_wrapper: () => import('@/static-data/integrations/cognito_wrapper/overview.md'),
|
|
cron: () => import('@/static-data/integrations/cron/overview.md'),
|
|
data_api: () => import('@/static-data/integrations/data_api/overview.md'),
|
|
firebase_wrapper: () => import('@/static-data/integrations/firebase_wrapper/overview.md'),
|
|
graphiql: () => import('@/static-data/integrations/graphiql/overview.md'),
|
|
hubspot_wrapper: () => import('@/static-data/integrations/hubspot_wrapper/overview.md'),
|
|
iceberg_wrapper: () => import('@/static-data/integrations/iceberg_wrapper/overview.md'),
|
|
logflare_wrapper: () => import('@/static-data/integrations/logflare_wrapper/overview.md'),
|
|
mssql_wrapper: () => import('@/static-data/integrations/mssql_wrapper/overview.md'),
|
|
notion_wrapper: () => import('@/static-data/integrations/notion_wrapper/overview.md'),
|
|
orb_wrapper: () => import('@/static-data/integrations/orb_wrapper/overview.md'),
|
|
paddle_wrapper: () => import('@/static-data/integrations/paddle_wrapper/overview.md'),
|
|
queues: () => import('@/static-data/integrations/queues/overview.md'),
|
|
redis_wrapper: () => import('@/static-data/integrations/redis_wrapper/overview.md'),
|
|
s3_vectors_wrapper: () => import('@/static-data/integrations/s3_vectors_wrapper/overview.md'),
|
|
s3_wrapper: () => import('@/static-data/integrations/s3_wrapper/overview.md'),
|
|
slack_wrapper: () => import('@/static-data/integrations/slack_wrapper/overview.md'),
|
|
snowflake_wrapper: () => import('@/static-data/integrations/snowflake_wrapper/overview.md'),
|
|
stripe_sync_engine: () => import('@/static-data/integrations/stripe_sync_engine/overview.md'),
|
|
stripe_wrapper: () => import('@/static-data/integrations/stripe_wrapper/overview.md'),
|
|
vault: () => import('@/static-data/integrations/vault/overview.md'),
|
|
warehouse: () => import('@/static-data/integrations/warehouse/overview.md'),
|
|
webhooks: () => import('@/static-data/integrations/webhooks/overview.md'),
|
|
} satisfies Record<string, () => Promise<{ default: string }>>
|
|
|
|
export const INTEGRATION_OVERVIEW_IDS = Object.keys(
|
|
INTEGRATION_OVERVIEWS
|
|
) as (keyof typeof INTEGRATION_OVERVIEWS)[]
|
|
|
|
/**
|
|
* Loads the overview markdown for an integration. Resolves to `null` when the
|
|
* integration has no bundled overview (e.g. marketplace apps).
|
|
*/
|
|
export async function loadIntegrationOverview(integrationId: string): Promise<string | null> {
|
|
const load = INTEGRATION_OVERVIEWS[integrationId as keyof typeof INTEGRATION_OVERVIEWS]
|
|
if (!load) return null
|
|
const mod = await load()
|
|
return String(mod.default)
|
|
}
|