From 3a88feebcc1b85db0bdfb5748ab8be4329e29e33 Mon Sep 17 00:00:00 2001 From: Nellie McKesson Date: Mon, 29 Sep 2025 20:00:35 +0200 Subject: [PATCH 1/4] docs: fix broken partials link in CONTRIBUTING guide (#39081) --- apps/docs/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/CONTRIBUTING.md b/apps/docs/CONTRIBUTING.md index 843af5ed2e45d..cfb0c34b6dbf5 100644 --- a/apps/docs/CONTRIBUTING.md +++ b/apps/docs/CONTRIBUTING.md @@ -147,7 +147,7 @@ If you're a library maintainer, follow these steps when updating function parame ## Content reuse -If you copy the same content multiple times across different files, create a **partial** for content reuse instead. Partials are MDX files contained in [`apps/docs/components/MDX`](https://github.com/supabase/supabase/tree/master/apps/docs/components/MDX). They contain reusable snippets that can be inserted in multiple pages. For example, you can create a partial to define a common setup step for a group of tutorials. +If you copy the same content multiple times across different files, create a **partial** for content reuse instead. Partials are MDX files contained in [`apps/docs/content/_partials`](https://github.com/supabase/supabase/tree/master/apps/docs/content/_partials). They contain reusable snippets that can be inserted in multiple pages. For example, you can create a partial to define a common setup step for a group of tutorials. To use a partial, import it into your MDX file. You can also set up a partial to automatically import by including it in the `components` within [`apps/docs/components/index.tsx`](https://github.com/supabase/supabase/blob/master/apps/docs/components/index.tsx). From cd6082be36363b840779e357879e1e98365ceb84 Mon Sep 17 00:00:00 2001 From: matlin Date: Mon, 29 Sep 2025 13:59:14 -0500 Subject: [PATCH 2/4] Ensure CSV chunk uploads handle rate limit 409s (#39075) * Ensure CSV chunk uploads handle rate limit 409s * Let executeWithRetry work with ResponseError object --- .../SidePanelEditor/SidePanelEditor.utils.tsx | 5 ++++- apps/studio/data/table-rows/table-rows-query.ts | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx index 55d4d54cfa1b3..8fcc9fa2a776c 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx @@ -41,6 +41,7 @@ import type { ForeignKey } from './ForeignKeySelector/ForeignKeySelector.types' import type { ColumnField, CreateColumnPayload, UpdateColumnPayload } from './SidePanelEditor.types' import { checkIfRelationChanged } from './TableEditor/ForeignKeysManagement/ForeignKeysManagement.utils' import type { ImportContent } from './TableEditor/TableEditor.types' +import { executeWithRetry } from 'data/table-rows/table-rows-query' const BATCH_SIZE = 1000 const CHUNK_SIZE = 1024 * 1024 * 0.1 // 0.1MB @@ -892,7 +893,9 @@ export const insertRowsViaSpreadsheet = async ( const insertQuery = new Query().from(table.name, table.schema).insert(formattedData).toSql() try { - await executeSql({ projectRef, connectionString, sql: insertQuery }) + await executeWithRetry(() => + executeSql({ projectRef, connectionString, sql: insertQuery }) + ) } catch (error) { console.warn(error) insertError = error diff --git a/apps/studio/data/table-rows/table-rows-query.ts b/apps/studio/data/table-rows/table-rows-query.ts index 3e56d290f6f09..6f66c6be909a9 100644 --- a/apps/studio/data/table-rows/table-rows-query.ts +++ b/apps/studio/data/table-rows/table-rows-query.ts @@ -54,7 +54,8 @@ export async function executeWithRetry( try { return await fn() } catch (error: any) { - if (error?.status === 429 && attempt < maxRetries) { + // Our custom ResponseError's use 'code' instead of 'status' + if ((error?.status ?? error?.code) === 429 && attempt < maxRetries) { // Get retry delay from headers or use exponential backoff (1s, then 2s, then 4s) const retryAfter = error.headers?.get('retry-after') const delayMs = retryAfter ? parseInt(retryAfter) * 1000 : baseDelay * Math.pow(2, attempt) From 0719f4f072fcb88d4be6d370867842119be5f39e Mon Sep 17 00:00:00 2001 From: Charis <26616127+charislam@users.noreply.github.com> Date: Mon, 29 Sep 2025 15:50:11 -0400 Subject: [PATCH 3/4] feat: add feature flagging for homepage text & logo (#39080) --- apps/docs/components/HomePageCover.tsx | 8 +- .../Navigation/NavigationMenu/TopNavBar.tsx | 18 ++- .../custom-content/CustomContent.types.ts | 7 + .../hooks/custom-content/custom-content.json | 7 + .../custom-content/useCustomContent.test.ts | 48 +++++++ .../hooks/custom-content/useCustomContent.ts | 49 +++++++ apps/docs/package.json | 1 + pnpm-lock.yaml | 125 ++++++++++++++---- 8 files changed, 227 insertions(+), 36 deletions(-) create mode 100644 apps/docs/hooks/custom-content/CustomContent.types.ts create mode 100644 apps/docs/hooks/custom-content/custom-content.json create mode 100644 apps/docs/hooks/custom-content/useCustomContent.test.ts create mode 100644 apps/docs/hooks/custom-content/useCustomContent.ts diff --git a/apps/docs/components/HomePageCover.tsx b/apps/docs/components/HomePageCover.tsx index 3cb33e4ed5c9a..5e35276d15308 100644 --- a/apps/docs/components/HomePageCover.tsx +++ b/apps/docs/components/HomePageCover.tsx @@ -2,11 +2,12 @@ import { ChevronRight, Play, Sparkles } from 'lucide-react' import Link from 'next/link' +// End of third-party imports import { isFeatureEnabled, useBreakpoint } from 'common' import { cn, IconBackground } from 'ui' import { IconPanel } from 'ui-patterns/IconPanel' - +import { useCustomContent } from '../hooks/custom-content/useCustomContent' import DocsCoverLogo from './DocsCoverLogo' const { sdkDart: sdkDartEnabled, sdkKotlin: sdkKotlinEnabled } = isFeatureEnabled([ @@ -36,6 +37,7 @@ function AiPrompt({ className }: { className?: string }) { const HomePageCover = (props) => { const isXs = useBreakpoint(639) const iconSize = isXs ? 'sm' : 'lg' + const { homepageHeading } = useCustomContent(['homepage:heading']) const frameworks = [ { @@ -141,7 +143,9 @@ const HomePageCover = (props) => {