Files
supabase/apps/studio/components/interfaces/ConnectSheet/Connect.constants.ts
Miranda Limonczenko 23a5bd4707 fix: update inbound links to the pooling guide (#50187)
## 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 -->
2026-09-09 17:10:55 -07:00

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.',
},
}