mirror of
https://github.com/supabase/supabase.git
synced 2026-10-05 17:35:10 +03:00
## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Bug fix. Link string changes only, no content changes. ## What is the current behavior? Nine inbound links in `apps/www` and `apps/studio` point at anchors on the connecting to Postgres guide that don't exist. All nine are already broken on production today: `#connection-pooler`, `#connection-pool`, `#how-connection-pooling-works`, `#serverside-poolers`, and `#connecting-with-drizzle` are all missing from the live page. #49869 moves the pooling content to a child page, so these links need current destinations either way. ## What is the new behavior? Point each link at the page that holds the content now. - **Studio, 3 links.** The Connect sheet's Drizzle link goes to the Drizzle guide. The connection pooling and pooling modes links go to `pooling-and-limits#how-connection-pooling-works`. - **www, 6 links.** Three blog posts, the Heroku comparison page, and the Dedicated poolers feature entry go to `pooling-and-limits`. The feature entry uses `#shared-pooler`. ## Additional context Split out of #49869. These paths belong to `@supabase/marketing` and `@supabase/Dashboard` in CODEOWNERS, and pulling both teams into a docs-only restructure for nine link strings isn't a good trade. Merge after #49928. The destinations don't exist on production until the docs pages land. ## Manual testing 1. Open [Supavisor: Scaling Postgres to 1 Million Connections](https://zone-www-dot-com-git-fix-pooler-docs-links-supabase.vercel.app/blog/supavisor-1-million). The "connection pooling" link in the opening paragraph resolves to `connecting-to-postgres/pooling-and-limits#how-connection-pooling-works`. 2. Open [Dedicated poolers](https://zone-www-dot-com-git-fix-pooler-docs-links-supabase.vercel.app/features/dedicated-poolers). The docs link resolves to `pooling-and-limits#shared-pooler`. 3. Open [Supabase vs Heroku Postgres](https://zone-www-dot-com-git-fix-pooler-docs-links-supabase.vercel.app/alternatives/supabase-vs-heroku-postgres). Both connection pooling links resolve to `pooling-and-limits#how-connection-pooling-works`. 4. Open [Connection pooling and limits](https://docs-git-docs-connecting-to-postgres-technical-supabase.vercel.app/docs/guides/database/connecting-to-postgres/pooling-and-limits) on the #49928 docs preview. The `how-connection-pooling-works` and `shared-pooler` headings both render with those IDs. 5. Open the Connect dialog on any project. Under Drizzle, the docs link opens the Drizzle guide. 6. Open Database settings, then Connection pooling. The pooler link opens Connection pooling and limits. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Updated connection pooling links across Studio, product pages, blogs, and comparison content to point to the relevant pooling guidance. * Refined links for Drizzle ORM, dedicated poolers, direct connections, and shared poolers. * Improved navigation to specific documentation sections explaining connection pooling modes and behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
416 lines
9.5 KiB
TypeScript
416 lines
9.5 KiB
TypeScript
import { type CodeBlockLang } from 'ui-patterns/CodeBlock'
|
|
|
|
import { DOCS_URL } from '@/lib/constants'
|
|
|
|
export type DatabaseConnectionType =
|
|
| 'uri'
|
|
| 'psql'
|
|
| 'golang'
|
|
| 'jdbc'
|
|
| 'dotnet'
|
|
| 'nodejs'
|
|
| 'php'
|
|
| 'python'
|
|
| 'sqlalchemy'
|
|
|
|
export const DATABASE_CONNECTION_TYPES: {
|
|
id: DatabaseConnectionType
|
|
label: string
|
|
contentType: 'input' | 'code'
|
|
lang: CodeBlockLang
|
|
fileTitle: string | undefined
|
|
}[] = [
|
|
{ id: 'uri', label: 'URI', contentType: 'input', lang: 'bash', fileTitle: undefined },
|
|
{ id: 'psql', label: 'PSQL', contentType: 'code', lang: 'bash', fileTitle: undefined },
|
|
{ id: 'golang', label: 'Golang', contentType: 'code', lang: 'go', fileTitle: '.env' },
|
|
{ id: 'jdbc', label: 'JDBC', contentType: 'input', lang: 'bash', fileTitle: undefined },
|
|
{
|
|
id: 'dotnet',
|
|
label: '.NET',
|
|
contentType: 'code',
|
|
lang: 'csharp',
|
|
fileTitle: 'appsettings.json',
|
|
},
|
|
{ id: 'nodejs', label: 'Node.js', contentType: 'code', lang: 'js', fileTitle: '.env' },
|
|
{ id: 'php', label: 'PHP', contentType: 'code', lang: 'php', fileTitle: '.env' },
|
|
{ id: 'python', label: 'Python', contentType: 'code', lang: 'python', fileTitle: '.env' },
|
|
{ id: 'sqlalchemy', label: 'SQLAlchemy', contentType: 'code', lang: 'python', fileTitle: '.env' },
|
|
]
|
|
|
|
export const CONNECTION_PARAMETERS = {
|
|
host: {
|
|
key: 'host',
|
|
description: 'The hostname of your database',
|
|
},
|
|
port: {
|
|
key: 'port',
|
|
description: 'Port number for the connection',
|
|
},
|
|
database: {
|
|
key: 'database',
|
|
description: 'Default database name',
|
|
},
|
|
user: {
|
|
key: 'user',
|
|
description: 'Database user',
|
|
},
|
|
pool_mode: {
|
|
key: 'pool_mode',
|
|
description: 'Connection pooling behavior',
|
|
},
|
|
} as const
|
|
|
|
export type ConnectionType = {
|
|
key: string
|
|
icon: string
|
|
label: string
|
|
guideLink?: string
|
|
children: ConnectionType[]
|
|
files?: {
|
|
name: string
|
|
content: string
|
|
}[]
|
|
}
|
|
|
|
export const FRAMEWORKS: ConnectionType[] = [
|
|
{
|
|
key: 'nextjs',
|
|
label: 'Next.js',
|
|
icon: 'nextjs',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/quickstarts/nextjs`,
|
|
children: [
|
|
{
|
|
key: 'app',
|
|
label: 'App Router',
|
|
icon: '',
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'supabase-js',
|
|
icon: 'supabase',
|
|
children: [],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'pages',
|
|
label: 'Pages Router',
|
|
icon: '',
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'remix',
|
|
label: 'React Router',
|
|
icon: 'remix',
|
|
guideLink: `${DOCS_URL}/guides/auth/server-side/creating-a-client?framework=remix&environment=remix-loader`,
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'react',
|
|
label: 'React',
|
|
icon: 'react',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/quickstarts/reactjs`,
|
|
children: [
|
|
{
|
|
key: 'vite',
|
|
label: 'Vite',
|
|
icon: 'vite',
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'create-react-app',
|
|
label: 'Create React App',
|
|
icon: 'react',
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'supabase-js',
|
|
icon: 'supabase',
|
|
children: [],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'nuxt',
|
|
label: 'Nuxt',
|
|
icon: 'nuxt',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/quickstarts/nuxtjs`,
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'vuejs',
|
|
label: 'Vue.JS',
|
|
icon: 'vuejs',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/quickstarts/vue`,
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
key: 'sveltekit',
|
|
label: 'SvelteKit',
|
|
icon: 'sveltekit',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/quickstarts/sveltekit`,
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'solidjs',
|
|
label: 'Solid.js',
|
|
icon: 'solidjs',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/quickstarts/solidjs`,
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'astro',
|
|
label: 'Astro',
|
|
icon: 'astro',
|
|
guideLink: 'https://docs.astro.build/en/guides/backend/supabase/',
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'refine',
|
|
label: 'Refine',
|
|
icon: 'refine',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/quickstarts/refine`,
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'tanstack',
|
|
label: 'TanStack Start',
|
|
icon: 'tanstack',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/quickstarts/tanstack`,
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'flask',
|
|
label: 'Flask (Python)',
|
|
icon: 'python',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/quickstarts/flask`,
|
|
children: [
|
|
{
|
|
key: 'supabasepy',
|
|
label: 'supabase-py',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
]
|
|
|
|
export const MOBILES: ConnectionType[] = [
|
|
{
|
|
key: 'exporeactnative',
|
|
label: 'Expo React Native',
|
|
icon: 'expo',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/quickstarts/expo-react-native`,
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'flutter',
|
|
label: 'Flutter',
|
|
icon: 'flutter',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/tutorials/with-flutter`,
|
|
children: [
|
|
{
|
|
key: 'supabaseflutter',
|
|
label: 'supabase-flutter',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'ionicreact',
|
|
label: 'Ionic React',
|
|
icon: 'react',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/tutorials/with-ionic-react`,
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'swift',
|
|
label: 'Swift',
|
|
icon: 'swift',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/tutorials/with-swift`,
|
|
children: [
|
|
{
|
|
key: 'supabaseswift',
|
|
label: 'supabase-swift',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'androidkotlin',
|
|
label: 'Android Kotlin',
|
|
icon: 'kotlin',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/tutorials/with-kotlin`,
|
|
children: [
|
|
{
|
|
key: 'supabasekt',
|
|
label: 'supabase-kt',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
key: 'ionicangular',
|
|
label: 'Ionic Angular',
|
|
icon: 'ionic-angular',
|
|
guideLink: `${DOCS_URL}/guides/getting-started/tutorials/with-ionic-angular`,
|
|
children: [
|
|
{
|
|
key: 'supabasejs',
|
|
label: 'Supabase-js',
|
|
children: [],
|
|
icon: 'supabase',
|
|
},
|
|
],
|
|
},
|
|
]
|
|
|
|
export const ORMS: ConnectionType[] = [
|
|
{
|
|
key: 'prisma',
|
|
label: 'Prisma',
|
|
icon: 'prisma',
|
|
guideLink: 'https://supabase.com/partners/integrations/prisma',
|
|
children: [],
|
|
},
|
|
{
|
|
key: 'drizzle',
|
|
label: 'Drizzle',
|
|
icon: 'drizzle',
|
|
guideLink: `${DOCS_URL}/guides/database/drizzle`,
|
|
children: [],
|
|
},
|
|
]
|
|
|
|
export const CONNECTION_TYPES = [
|
|
{ key: 'direct', label: 'Connection String', obj: [] },
|
|
{ key: 'frameworks', label: 'App Frameworks', obj: FRAMEWORKS },
|
|
{ key: 'mobiles', label: 'Mobile Frameworks', obj: MOBILES },
|
|
{ key: 'orms', label: 'ORMs', obj: ORMS },
|
|
{ key: 'mcp', label: 'MCP', obj: [] },
|
|
]
|
|
|
|
export const PGBOUNCER_ENABLED_BUT_NO_IPV4_ADDON_TEXT =
|
|
'Purchase IPv4 add-on or use Shared Pooler if on a IPv4 network'
|
|
export const IPV4_ADDON_TEXT = 'Connections are IPv4 proxied with IPv4 add-on'
|
|
|
|
export const CONNECTION_SOURCE_LOAD_BALANCER = 'load-balancer'
|
|
|
|
export type ConnectionStringMethod = 'direct' | 'transaction' | 'session'
|
|
|
|
export const connectionStringMethodOptions: Record<
|
|
ConnectionStringMethod,
|
|
{ value: string; label: string; description: string }
|
|
> = {
|
|
direct: {
|
|
value: 'direct',
|
|
label: 'Direct connection',
|
|
description:
|
|
'Ideal for applications with persistent and long-lived connections such as those running on virtual machines or long-standing containers.',
|
|
},
|
|
transaction: {
|
|
value: 'transaction',
|
|
label: 'Transaction pooler',
|
|
description:
|
|
'Ideal for stateless applications like serverless functions where each interaction with Postgres is brief and isolated.',
|
|
},
|
|
session: {
|
|
value: 'session',
|
|
label: 'Session pooler',
|
|
description:
|
|
'Only recommended as an alternative to direct connection when connecting via an IPv4 network.',
|
|
},
|
|
}
|