From e251de17e49bd4fdef6231adfdd9bb8cbd006c44 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Wed, 21 Sep 2022 16:50:21 +0200 Subject: [PATCH 001/207] chore: added new image for architecture --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 446e3316709..465245a61f9 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,8 @@ Supabase is a combination of open source tools. We’re building the features of Supabase is a [hosted platform](https://app.supabase.com). You can sign up and start using Supabase without installing anything. You can also [self-host](https://supabase.com/docs/guides/hosting/overview) and [develop locally](https://supabase.com/docs/guides/local-development). +![Architecture diagram](https://user-images.githubusercontent.com/8291514/191536900-c4c2f455-093a-4bc2-a1ea-5d1674dc1afa.png) + ![Architecture](https://user-images.githubusercontent.com/70828596/187547862-ffa9d058-0c3a-4851-a3e7-92ccfca4b596.png) - [PostgreSQL](https://www.postgresql.org/) is an object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance. From 3153497f600e3ce3149ba2d28482500d98d1d6c7 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Thu, 22 Sep 2022 13:40:22 +0200 Subject: [PATCH 002/207] Update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 465245a61f9..a3948c8e6fa 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ -

- - -

+![main image](https://user-images.githubusercontent.com/8291514/191737114-3b8e4985-7b91-4fc9-92ce-3106915e0a06.png) --- + + # Supabase [Supabase](https://supabase.com) is an open source Firebase alternative. We're building the features of Firebase using enterprise-grade open source tools. @@ -58,7 +57,7 @@ Supabase is a combination of open source tools. We’re building the features of Supabase is a [hosted platform](https://app.supabase.com). You can sign up and start using Supabase without installing anything. You can also [self-host](https://supabase.com/docs/guides/hosting/overview) and [develop locally](https://supabase.com/docs/guides/local-development). -![Architecture diagram](https://user-images.githubusercontent.com/8291514/191536900-c4c2f455-093a-4bc2-a1ea-5d1674dc1afa.png) +![diagram (1)](https://user-images.githubusercontent.com/8291514/191737181-22e6a111-817d-403b-8c3f-489279a2a7da.png) ![Architecture](https://user-images.githubusercontent.com/70828596/187547862-ffa9d058-0c3a-4851-a3e7-92ccfca4b596.png) From 20f94ceb30b38d95a5561a10b06e2452dd790896 Mon Sep 17 00:00:00 2001 From: Rudy Delouya Date: Tue, 10 Jan 2023 16:58:20 +0100 Subject: [PATCH 003/207] Update with-sveltekit.mdx updated main CSS filename --- .../pages/guides/getting-started/tutorials/with-sveltekit.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx index bbac06e6019..fd1cced34fb 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx @@ -56,7 +56,7 @@ import { env } from '$env/dynamic/public' export const supabase = createClient(env.PUBLIC_SUPABASE_URL, env.PUBLIC_SUPABASE_ANON_KEY) ``` -Optionally, update `src/routes/style.css` with the [CSS from the example](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/svelte-user-management/src/app.css). +Optionally, update `src/routes/styles.css` with the [CSS from the example](https://raw.githubusercontent.com/supabase/supabase/master/examples/user-management/svelte-user-management/src/app.css). ### Supabase Auth Helpers From d1fb6207432577fd59266c3f7585839e073f5fc4 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Wed, 11 Jan 2023 17:06:30 -0330 Subject: [PATCH 004/207] Start on pricing page updates --- apps/www/components/PricingTableRow.tsx | 35 ++-- apps/www/pages/pricing/index.tsx | 220 +++++++++++++++--------- apps/www/styles/index.css | 26 +++ 3 files changed, 186 insertions(+), 95 deletions(-) diff --git a/apps/www/components/PricingTableRow.tsx b/apps/www/components/PricingTableRow.tsx index 2a81769258b..e9a29a72236 100644 --- a/apps/www/components/PricingTableRow.tsx +++ b/apps/www/components/PricingTableRow.tsx @@ -1,6 +1,6 @@ import { IconHelpCircle } from 'ui' import ProductIcon from 'components/ProductIcon' -import React from 'react' +import React, { useState } from 'react' import ReactTooltip from 'react-tooltip' export const Check = () => ( @@ -50,7 +50,7 @@ export const PricingTableRowDesktop = (props: any) => { return ( <> {

{category.title}

- - - + + + {category.features.map((feat: any, i: number) => { @@ -85,17 +85,28 @@ export const PricingTableRowDesktop = (props: any) => { )} - {Object.values(feat.tiers).map((tier: any, i) => { + {Object.entries(feat.tiers).map((entry: any, i) => { + const tierName = entry[0] + const tierValue = entry[1] + return ( - - {typeof tier === 'boolean' && tier === true ? ( - - ) : typeof tier === 'boolean' && tier === false ? ( + + {typeof tierValue === 'boolean' && tierValue === true ? ( + + ) : typeof tierValue === 'boolean' && tierValue === false ? (
- +
) : ( - {tier} + + {tierValue} + )} ) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 75e03711b85..dd555d1683b 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -30,11 +30,14 @@ export default function IndexPage() { const tiers = [ { name: 'Free', - costUnit: '/month per project', + nameBadge: '', + costUnit: 'per month per project', href: 'https://app.supabase.com/new/new-project', + priceLabel: 'Starting from', priceMonthly: 0, warning: 'Limit of 2 free projects', description: 'Perfect for passion projects & simple websites.', + preface: 'Get started with...', features: [ 'Up to 500MB database & 1GB file storage', 'Up to 2GB bandwidth', @@ -51,9 +54,12 @@ export default function IndexPage() { }, { name: 'Pro', - costUnit: '/month per project', + nameBadge: '', + costUnit: 'per month per project', href: 'https://app.supabase.com/new/new-project', from: true, + priceLabel: 'Starting from', + warning: '+ any additional usage', priceMonthly: 25, description: 'For production applications with the option to scale.', features: [ @@ -74,6 +80,34 @@ export default function IndexPage() { additional: 'Need more? Turn off your spend cap to Pay As You Grow ', cta: 'Get Started', }, + { + name: 'Team', + nameBadge: 'New', + costUnit: 'per month per org', + href: 'https://app.supabase.com/new/new-project', + from: true, + priceLabel: 'Starting from', + priceMonthly: 25, + description: 'For scaling teams with permissions & access controls', + warning: '+ any additional usage', + features: [ + 'Usage-based pricing', + 'Organization member roles (ABAC)', + 'SOC2', + 'Priority email support & SLAs', + '14 day backups', + '100,000 monthly active users included', + 'Standardized Security Questionnaire', + 'SSO for Supabase Dashboard', + '1 XS compute instance', + '28 day log retention', + ], + scale: '', + shutdown: '', + preface: 'The following features will apply to all projects within the organization:', + additional: '', + cta: 'Get Started', + }, { name: 'Enterprise', href: 'https://forms.supabase.com/enterprise', @@ -163,7 +197,7 @@ export default function IndexPage() { -
+
{/*
*/}
-
+
{tiers.map((tier) => (
-
-
-

{tier.name}

- {tier.warning && ( -
- {tier.warning} + {tier.name === 'Pro' && ( +

Most Popular

+ )} +
+
+
+
+

+ {tier.name} +

+ {tier.nameBadge && ( + + {tier.nameBadge} + + )}
- )} -
-

{tier.description}

-
{tier.description}

+
- {tier.priceMonthly !== undefined ? ( -
-
-
- - {typeof tier.priceMonthly !== 'string' && '$'} - {tier.priceMonthly} - - - {tier.costUnit} - + > + {tier.priceMonthly !== undefined ? ( +
+
+
+

+ {tier.priceLabel} +

+

+ {typeof tier.priceMonthly !== 'string' && '$'} + {tier.priceMonthly} +

+ {tier.costUnit && ( +

{tier.costUnit}

+ )} + + {tier.warning && ( +
+ {tier.warning} +
+ )} +
- {tier.from && ( - - + any additional usage - - )} -
- ) : ( - Contact Us - )} + ) : ( + Contact Us + )} +
-
-
- {tier.preface &&

{tier.preface}

} - {/*

Included with plan:

*/} -
    - {tier.features.map((feature) => ( -
  • - {/*
    */} -
    */} -

    - {feature} -

    -
  • - ))} -
+ > + {tier.preface && ( +

{tier.preface}

+ )} + {/*

Included with plan:

*/} +
    + {tier.features.map((feature) => ( +
  • +
*/} + {feature} + + ))} + -
-
- {tier.additional && ( -

{tier.additional}

- )} - {tier.scale &&

{tier.scale}

} - {tier.shutdown &&

{tier.shutdown}

} +
+
+ {tier.additional && ( +

{tier.additional}

+ )} + {tier.scale &&

{tier.scale}

} + {tier.shutdown && ( +

{tier.shutdown}

+ )} +
+ + +
- - -
diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css index 77922bd7095..32cf38b67af 100644 --- a/apps/www/styles/index.css +++ b/apps/www/styles/index.css @@ -659,3 +659,29 @@ launch week -webkit-mask-image: linear-gradient(rgba(0, 0, 0, 1), transparent); } + +/* Text with a gradient background */ +[class*='gradient-text-'] { + background-clip: text; + -webkit-text-fill-color: transparent; +} +@variants dark { + .gradient-text-brand-100 { + background-image: linear-gradient(45deg, var(--colors-brand8) 0%, var(--colors-brand9) 100%); + } + .gradient-text-brand-500 { + background-image: linear-gradient(45deg, var(--colors-brand8) 0%, var(--colors-brand9) 100%); + } + + .gradient-text-scale-100 { + background-image: -webkit-linear-gradient(45deg, #fff 0%, var(--colors-green4) 100%); + } + + .gradient-text-scale-500 { + background-image: -webkit-linear-gradient( + 45deg, + var(--colors-scale10) 0%, + var(--colors-scale12) 100% + ); + } +} From 0a20312d893939b8fcabf38ddb44cf2291e964dc Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Mon, 16 Jan 2023 16:48:28 -0330 Subject: [PATCH 005/207] Start on addon cards --- .../AuthWidget/AuthWidgetSection.tsx | 2 +- apps/www/components/DarkModeToggle.tsx | 2 +- apps/www/components/Footer/index.tsx | 2 +- apps/www/components/Globe.tsx | 2 +- apps/www/components/Nav/index.tsx | 2 +- apps/www/components/Providers/index.tsx | 44 --- ...icingAddOn.json => PricingAddOnTable.json} | 0 apps/www/data/PricingAddOns.json | 374 ++++++++++++++++++ apps/www/pages/404.tsx | 2 +- apps/www/pages/_app.tsx | 2 +- apps/www/pages/careers/index.tsx | 4 +- apps/www/pages/launch-week/index.tsx | 2 +- .../pages/launch-week/tickets/[username].tsx | 2 +- apps/www/pages/launch-week/tickets/index.tsx | 2 +- apps/www/pages/pricing/index.tsx | 106 ++++- .../pricing/addons-compute-hero-light.svg | 95 +++++ .../images/pricing/addons-compute-hero.svg | 95 +++++ .../images/pricing/compute-upgrade-light.svg | 9 + .../public/images/pricing/compute-upgrade.svg | 9 + .../pricing/custom-domain-upgrade-light.svg | 9 + .../images/pricing/custom-domain-upgrade.svg | 9 + .../images/pricing/support-upgrade-light.svg | 9 + .../public/images/pricing/support-upgrade.svg | 9 + apps/www/styles/index.css | 2 +- 24 files changed, 718 insertions(+), 76 deletions(-) delete mode 100644 apps/www/components/Providers/index.tsx rename apps/www/data/{PricingAddOn.json => PricingAddOnTable.json} (100%) create mode 100644 apps/www/data/PricingAddOns.json create mode 100644 apps/www/public/images/pricing/addons-compute-hero-light.svg create mode 100644 apps/www/public/images/pricing/addons-compute-hero.svg create mode 100644 apps/www/public/images/pricing/compute-upgrade-light.svg create mode 100644 apps/www/public/images/pricing/compute-upgrade.svg create mode 100644 apps/www/public/images/pricing/custom-domain-upgrade-light.svg create mode 100644 apps/www/public/images/pricing/custom-domain-upgrade.svg create mode 100644 apps/www/public/images/pricing/support-upgrade-light.svg create mode 100644 apps/www/public/images/pricing/support-upgrade.svg diff --git a/apps/www/components/AuthWidget/AuthWidgetSection.tsx b/apps/www/components/AuthWidget/AuthWidgetSection.tsx index 047ff5c4ac7..29f47168761 100644 --- a/apps/www/components/AuthWidget/AuthWidgetSection.tsx +++ b/apps/www/components/AuthWidget/AuthWidgetSection.tsx @@ -6,7 +6,7 @@ import { useRouter } from 'next/router' import { ColorSwatchIcon, MenuIcon } from '@heroicons/react/outline' import { Auth, ThemeSupa } from '@supabase/auth-ui-react' -import { useTheme } from '../Providers' +import { useTheme } from 'common/Providers' const supabase = createClient( 'https://rsnibhkhsbfnncjmwnkj.supabase.co', diff --git a/apps/www/components/DarkModeToggle.tsx b/apps/www/components/DarkModeToggle.tsx index c3a1b0f946f..789bdd7a5a4 100644 --- a/apps/www/components/DarkModeToggle.tsx +++ b/apps/www/components/DarkModeToggle.tsx @@ -1,4 +1,4 @@ -import { useTheme } from '~/components/Providers' +import { useTheme } from 'common/Providers' import { IconSun, IconMoon } from 'ui' function DarkModeToggle() { diff --git a/apps/www/components/Footer/index.tsx b/apps/www/components/Footer/index.tsx index e4fb2ee81f5..bcc49c7bcc9 100644 --- a/apps/www/components/Footer/index.tsx +++ b/apps/www/components/Footer/index.tsx @@ -2,7 +2,7 @@ import FooterLinks from 'data/Footer.json' import SectionContainer from '../Layouts/SectionContainer' import DarkModeToggle from '../DarkModeToggle' import Link from 'next/link' -import { useTheme } from '../Providers' +import { useTheme } from 'common/Providers' import { Badge } from 'ui' import Image from 'next/image' import * as supabaseLogoWordmarkDark from 'common/assets/images/supabase-logo-wordmark--dark.png' diff --git a/apps/www/components/Globe.tsx b/apps/www/components/Globe.tsx index 388c6a3d65d..49470073455 100644 --- a/apps/www/components/Globe.tsx +++ b/apps/www/components/Globe.tsx @@ -1,6 +1,6 @@ import createGlobe from 'cobe' import { useEffect, useRef } from 'react' -import { useTheme } from './Providers/index' +import { useTheme } from 'common/Providers' const Globe = () => { const { isDarkMode } = useTheme() diff --git a/apps/www/components/Nav/index.tsx b/apps/www/components/Nav/index.tsx index 93e7402a1ab..54a04a654aa 100644 --- a/apps/www/components/Nav/index.tsx +++ b/apps/www/components/Nav/index.tsx @@ -11,7 +11,7 @@ import Solutions from '~/components/Nav/Product' import Developers from '~/components/Nav/Developers' import Announcement from '~/components/Nav/Announcement' -import { useTheme } from '~/components/Providers' +import { useTheme } from 'common/Providers' import TextLink from '../TextLink' import Image from 'next/image' import * as supabaseLogoWordmarkDark from 'common/assets/images/supabase-logo-wordmark--dark.png' diff --git a/apps/www/components/Providers/index.tsx b/apps/www/components/Providers/index.tsx deleted file mode 100644 index ab023562c17..00000000000 --- a/apps/www/components/Providers/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { createContext, useContext, useEffect, useState } from 'react' - -interface UseThemeProps { - isDarkMode?: boolean - toggleTheme: () => void -} - -interface ThemeProviderProps { - children?: any -} - -export const ThemeContext = createContext({ - isDarkMode: true, - toggleTheme: () => {}, -}) - -export const useTheme = () => useContext(ThemeContext) - -export const ThemeProvider = ({ children }: ThemeProviderProps) => { - const [isDarkMode, setIsDarkMode] = useState(false) - - useEffect(() => { - const key = localStorage.getItem('supabaseDarkMode') - // Default to dark mode if no preference config - setIsDarkMode(!key || key === 'true') - }, []) - - const toggleTheme = () => { - setIsDarkMode(!isDarkMode) - } - - return ( - <> - - {children} - - - ) -} diff --git a/apps/www/data/PricingAddOn.json b/apps/www/data/PricingAddOnTable.json similarity index 100% rename from apps/www/data/PricingAddOn.json rename to apps/www/data/PricingAddOnTable.json diff --git a/apps/www/data/PricingAddOns.json b/apps/www/data/PricingAddOns.json new file mode 100644 index 00000000000..63b69e84725 --- /dev/null +++ b/apps/www/data/PricingAddOns.json @@ -0,0 +1,374 @@ +{ + "optimized_compute": { + "title": "Optimized Compute", + "features": [ + "For projects that need dedicated compute", + "For scaling number of connections", + "Additional CPU & RAM options", + "Additional Disk IO Bandwidth" + ], + "rows": [ + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Free (Included)" }, + { "key": "pricing", "title": "Pricing", "value": "$0" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "memory", "title": "Memory", "value": "1 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "87 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "10" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "50" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Small" }, + { "key": "pricing", "title": "Pricing", "value": "$5" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "memory", "title": "Memory", "value": "2 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "174 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "30" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "75" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Medium" }, + { "key": "pricing", "title": "Pricing", "value": "$50" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "memory", "title": "Memory", "value": "4 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "347 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "50" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "150" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Large" }, + { "key": "pricing", "title": "Pricing", "value": "$100" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "8 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "630 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "100" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "300" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "XL" }, + { "key": "pricing", "title": "Pricing", "value": "$200" }, + { "key": "cpu", "title": "CPU", "value": "4-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "16 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "1,188 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "200" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "600" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "2XL" }, + { "key": "pricing", "title": "Pricing", "value": "$400" }, + { "key": "cpu", "title": "CPU", "value": "8-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "32 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "2,375 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "350" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "1200" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "4XL" }, + { "key": "pricing", "title": "Pricing", "value": "$950" }, + { "key": "cpu", "title": "CPU", "value": "16-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "64 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "4,750 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "420" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "2800" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "8XL" }, + { "key": "pricing", "title": "Pricing", "value": "$1,860" }, + { "key": "cpu", "title": "CPU", "value": "32-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "128 GB" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "9,500 Mbps" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "9,500 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "450" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "5600" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "12XL" }, + { "key": "pricing", "title": "Pricing", "value": "$2,790" }, + { "key": "cpu", "title": "CPU", "value": "48-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "192 GB" }, + { + "key": "maxDiskIO", + "title": "Maximum Disk IO Bandwidth", + "value": "14,250 Mbps" + }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "14,250 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "480" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "8600" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "16XL" }, + { "key": "pricing", "title": "Pricing", "value": "$3,720" }, + { "key": "cpu", "title": "CPU", "value": "64-core ARM (dedicated)" }, + { "key": "memory", "title": "Memory", "value": "256 GB" }, + { + "key": "maxDiskIO", + "title": "Maximum Disk IO Bandwidth", + "value": "19,000 Mbps" + }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "19,000 Mbps" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "500" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "11,600" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Custom (need more?)" }, + { "key": "pricing", "title": "Pricing", "value": "Contact Us" }, + { "key": "cpu", "title": "CPU", "value": "Contact Us" }, + { "key": "memory", "title": "Memory", "value": "Contact Us" }, + { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "Contact Us" }, + { + "key": "baseDiskIO", + "title": "Baseline Disk IO Bandwidth", + "value": "Contact Us" + }, + { + "key": "directConnections", + "title": "Connections: Direct (recommended)", + "value": "Contact Us" + }, + { + "key": "poolerConnections", + "title": "Connections: Pooler (recommended)", + "value": "Contact Us" + } + ] + } + ] + }, + "support": { + "title": "Support", + "features": [ + "Guaranteed Response Times", + "SLAs", + "Designated Support", + "Advanced Support Scope" + ], + "rows": [ + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Standard" }, + { "key": "pricing", "title": "Pricing", "value": "Contact Us" }, + { + "key": "severityLevelUrgent", + "title": "1. Severity Level: Urgent", + "value": "1 business hour (24/7x365)" + }, + { + "key": "severityLevelHigh", + "title": "2. Severity Level: High", + "value": "4 business hours (Monday - Friday)" + }, + { + "key": "severityLevelNormal", + "title": "3. Severity Level: Normal", + "value": "1 business day (Monday - Friday)" + }, + { + "key": "severityLevelLow", + "title": "4. Severity Level: Low", + "value": "2 business days (Monday - Friday)" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Priority" }, + { "key": "pricing", "title": "Pricing", "value": "Contact Us" }, + { + "key": "severityLevelUrgent", + "title": "1. Severity Level: Urgent", + "value": "1 business hour (24/7x365)" + }, + { + "key": "severityLevelHigh", + "title": "2. Severity Level: High", + "value": "2 business hours (Monday - Friday)" + }, + { + "key": "severityLevelNormal", + "title": "3. Severity Level: Normal", + "value": "1 business day (Monday - Friday)" + }, + { + "key": "severityLevelLow", + "title": "4. Severity Level: Low", + "value": "2 business days (Monday - Friday)" + } + ] + }, + { + "columns": [ + { "key": "plan", "title": "Plan", "value": "Priority Plus" }, + { "key": "pricing", "title": "Pricing", "value": "Contact Us" }, + { + "key": "severityLevelUrgent", + "title": "1. Severity Level: Urgent", + "value": "1 business hour (24/7x365)" + }, + { + "key": "severityLevelHigh", + "title": "2. Severity Level: High", + "value": "2 business hours (24/7x365)" + }, + { + "key": "severityLevelNormal", + "title": "3. Severity Level: Normal", + "value": "12 business hours (Monday - Friday)" + }, + { + "key": "severityLevelLow", + "title": "4. Severity Level: Low", + "value": "1 business days (Monday - Friday)" + } + ] + } + ] + } +} diff --git a/apps/www/pages/404.tsx b/apps/www/pages/404.tsx index f0d453140e4..f31fe7d4dd3 100644 --- a/apps/www/pages/404.tsx +++ b/apps/www/pages/404.tsx @@ -5,7 +5,7 @@ import { Button } from 'ui' import DefaultLayout from '../components/Layouts/Default' -import { useTheme } from '~/components/Providers' +import { useTheme } from 'common/Providers' import * as supabaseLogoWordmarkDark from 'common/assets/images/supabase-logo-wordmark--dark.png' import * as supabaseLogoWordmarkLight from 'common/assets/images/supabase-logo-wordmark--light.png' diff --git a/apps/www/pages/_app.tsx b/apps/www/pages/_app.tsx index afe6bd7a1a1..b4fb7a031ce 100644 --- a/apps/www/pages/_app.tsx +++ b/apps/www/pages/_app.tsx @@ -6,7 +6,7 @@ import { useEffect } from 'react' import Meta from '~/components/Favicons' import '../styles/index.css' import { post } from './../lib/fetchWrapper' -import { ThemeProvider } from '~/components/Providers' +import { ThemeProvider } from 'common/Providers' import Head from 'next/head' export default function MyApp({ Component, pageProps }: AppProps) { diff --git a/apps/www/pages/careers/index.tsx b/apps/www/pages/careers/index.tsx index d7d4ec2d29a..55ba72ca594 100644 --- a/apps/www/pages/careers/index.tsx +++ b/apps/www/pages/careers/index.tsx @@ -8,7 +8,7 @@ import { Badge, Button, IconCheck } from 'ui' import Globe from '~/components/Globe' import DefaultLayout from '~/components/Layouts/Default' import SectionContainer from '~/components/Layouts/SectionContainer' -import { useTheme } from '~/components/Providers' +import { useTheme } from 'common/Providers' import career from '~/data/career.json' import Styles from './career.module.css' @@ -321,7 +321,7 @@ const CareerPage: NextPage = ({ jobs, contributors }: any) => {
(
{tier.name === 'Pro' && ( @@ -286,8 +336,6 @@ export default function IndexPage() { flex-1 flex-col - space-y-4 - bg-white px-8 @@ -300,7 +348,7 @@ export default function IndexPage() { {/*

Included with plan:

*/}
    {tier.features.map((feature) => (
  • @@ -315,14 +363,14 @@ export default function IndexPage() { ))}
-
-
+
+
{tier.additional && ( -

{tier.additional}

+

{tier.additional}

)} - {tier.scale &&

{tier.scale}

} + {tier.scale &&

{tier.scale}

} {tier.shutdown && ( -

{tier.shutdown}

+

{tier.shutdown}

)}
@@ -341,13 +389,33 @@ export default function IndexPage() {
-
-

Add-Ons

-

- Level up your Supabase experience with add-ons. -

+
+
+

Easily customizable add-Ons

+

+ Level up your Supabase experience with add-ons. +

+
+
+ {addons.map((addon) => ( +
+ Compute +
+ {addon.icon} + {addon.name} + {addon.price} +
+
+ ))} +
+
+
} diff --git a/apps/www/public/images/pricing/addons-compute-hero-light.svg b/apps/www/public/images/pricing/addons-compute-hero-light.svg new file mode 100644 index 00000000000..37ec0b91dad --- /dev/null +++ b/apps/www/public/images/pricing/addons-compute-hero-light.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-compute-hero.svg b/apps/www/public/images/pricing/addons-compute-hero.svg new file mode 100644 index 00000000000..500a0803480 --- /dev/null +++ b/apps/www/public/images/pricing/addons-compute-hero.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/compute-upgrade-light.svg b/apps/www/public/images/pricing/compute-upgrade-light.svg new file mode 100644 index 00000000000..8f23ffadd2f --- /dev/null +++ b/apps/www/public/images/pricing/compute-upgrade-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/compute-upgrade.svg b/apps/www/public/images/pricing/compute-upgrade.svg new file mode 100644 index 00000000000..c6241aa159e --- /dev/null +++ b/apps/www/public/images/pricing/compute-upgrade.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/custom-domain-upgrade-light.svg b/apps/www/public/images/pricing/custom-domain-upgrade-light.svg new file mode 100644 index 00000000000..6d08ae8eedd --- /dev/null +++ b/apps/www/public/images/pricing/custom-domain-upgrade-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/custom-domain-upgrade.svg b/apps/www/public/images/pricing/custom-domain-upgrade.svg new file mode 100644 index 00000000000..0d608d5d91d --- /dev/null +++ b/apps/www/public/images/pricing/custom-domain-upgrade.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/support-upgrade-light.svg b/apps/www/public/images/pricing/support-upgrade-light.svg new file mode 100644 index 00000000000..e2143d09436 --- /dev/null +++ b/apps/www/public/images/pricing/support-upgrade-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/support-upgrade.svg b/apps/www/public/images/pricing/support-upgrade.svg new file mode 100644 index 00000000000..d981270ce21 --- /dev/null +++ b/apps/www/public/images/pricing/support-upgrade.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css index 32cf38b67af..585cc7cfb1e 100644 --- a/apps/www/styles/index.css +++ b/apps/www/styles/index.css @@ -665,7 +665,7 @@ launch week background-clip: text; -webkit-text-fill-color: transparent; } -@variants dark { +@layer utilities { .gradient-text-brand-100 { background-image: linear-gradient(45deg, var(--colors-brand8) 0%, var(--colors-brand9) 100%); } From e2607446a5f1c076dd4e8eb079eb02acf02da421 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 17 Jan 2023 09:40:13 -0330 Subject: [PATCH 006/207] Add brand icons --- apps/www/pages/pricing/index.tsx | 9 ++++----- apps/www/public/images/icons/brand/api-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/api-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/api-green.svg | 7 +++++++ .../images/icons/brand/api-management-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/api-management-gray.svg | 3 +++ .../public/images/icons/brand/api-management-green.svg | 3 +++ .../www/public/images/icons/brand/auth-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/auth-gray.svg | 6 ++++++ apps/www/public/images/icons/brand/auth-green.svg | 6 ++++++ .../www/public/images/icons/brand/blog-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/blog-gray.svg | 4 ++++ apps/www/public/images/icons/brand/blog-green.svg | 4 ++++ apps/www/public/images/icons/brand/cli-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/cli-gray.svg | 5 +++++ apps/www/public/images/icons/brand/cli-green.svg | 3 +++ .../public/images/icons/brand/columns-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/columns-gray.svg | 5 +++++ apps/www/public/images/icons/brand/columns-green.svg | 5 +++++ .../images/icons/brand/custom-domains-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/custom-domains-gray.svg | 5 +++++ .../public/images/icons/brand/custom-domains-green.svg | 5 +++++ .../icons/brand/database-add-ons-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/database-add-ons-gray.svg | 9 +++++++++ .../public/images/icons/brand/database-add-ons-green.svg | 9 +++++++++ .../public/images/icons/brand/database-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/database-gray.svg | 5 +++++ apps/www/public/images/icons/brand/database-green.svg | 5 +++++ .../images/icons/brand/documentation-gray-negative.svg | 9 +++++++++ .../www/public/images/icons/brand/documentation-gray.svg | 7 +++++++ .../public/images/icons/brand/documentation-green.svg | 7 +++++++ .../images/icons/brand/edge-functions-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/edge-functions-gray.svg | 6 ++++++ .../public/images/icons/brand/edge-functions-green.svg | 6 ++++++ .../images/icons/brand/extensions-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/extensions-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/extensions-green.svg | 7 +++++++ .../images/icons/brand/getting-started-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/getting-started-gray.svg | 3 +++ .../public/images/icons/brand/getting-started-green.svg | 3 +++ .../public/images/icons/brand/glossary-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/glossary-gray.svg | 5 +++++ apps/www/public/images/icons/brand/glossary-green.svg | 5 +++++ .../public/images/icons/brand/guides-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/guides-gray.svg | 5 +++++ apps/www/public/images/icons/brand/guides-green.svg | 5 +++++ .../www/public/images/icons/brand/home-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/home-gray.svg | 5 +++++ apps/www/public/images/icons/brand/home-green.svg | 5 +++++ .../www/public/images/icons/brand/logs-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/logs-gray.svg | 6 ++++++ apps/www/public/images/icons/brand/logs-green.svg | 6 ++++++ .../www/public/images/icons/brand/pitr-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/pitr-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/pitr-green.svg | 7 +++++++ .../public/images/icons/brand/platform-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/platform-gray.svg | 5 +++++ apps/www/public/images/icons/brand/platform-green.svg | 5 +++++ .../public/images/icons/brand/profile-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/profile-gray.svg | 5 +++++ apps/www/public/images/icons/brand/profile-green.svg | 5 +++++ .../images/icons/brand/read-replicas-gray-negative.svg | 9 +++++++++ .../www/public/images/icons/brand/read-replicas-gray.svg | 6 ++++++ .../public/images/icons/brand/read-replicas-green.svg | 6 ++++++ .../public/images/icons/brand/realtime-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/realtime-gray.svg | 6 ++++++ apps/www/public/images/icons/brand/realtime-green.svg | 6 ++++++ .../public/images/icons/brand/reports-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/reports-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/reports-green.svg | 7 +++++++ .../public/images/icons/brand/roles-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/roles-gray.svg | 8 ++++++++ apps/www/public/images/icons/brand/roles-green.svg | 9 +++++++++ .../www/public/images/icons/brand/rows-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/rows-gray.svg | 5 +++++ apps/www/public/images/icons/brand/rows-green.svg | 5 +++++ .../images/icons/brand/self-hosting-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/self-hosting-gray.svg | 9 +++++++++ .../www/public/images/icons/brand/self-hosting-green.svg | 9 +++++++++ .../public/images/icons/brand/settings-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/settings-gray.svg | 4 ++++ apps/www/public/images/icons/brand/settings-green.svg | 4 ++++ .../public/images/icons/brand/storage-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/storage-gray.svg | 5 +++++ apps/www/public/images/icons/brand/storage-green.svg | 5 +++++ .../images/icons/brand/support-add-ons-gray-negative.svg | 9 +++++++++ .../public/images/icons/brand/support-add-ons-gray.svg | 7 +++++++ .../public/images/icons/brand/support-add-ons-green.svg | 7 +++++++ .../public/images/icons/brand/support-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/support-gray.svg | 5 +++++ apps/www/public/images/icons/brand/support-green.svg | 5 +++++ .../images/icons/brand/table-editor-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/table-editor-gray.svg | 6 ++++++ .../www/public/images/icons/brand/table-editor-green.svg | 6 ++++++ .../public/images/icons/brand/tables-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/tables-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/tables-green.svg | 7 +++++++ .../images/icons/brand/tutorials-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/tutorials-gray.svg | 4 ++++ apps/www/public/images/icons/brand/tutorials-green.svg | 4 ++++ .../public/images/icons/brand/wrappers-gray-negative.svg | 9 +++++++++ apps/www/public/images/icons/brand/wrappers-gray.svg | 7 +++++++ apps/www/public/images/icons/brand/wrappers-green.svg | 7 +++++++ 103 files changed, 701 insertions(+), 5 deletions(-) create mode 100644 apps/www/public/images/icons/brand/api-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/api-gray.svg create mode 100644 apps/www/public/images/icons/brand/api-green.svg create mode 100644 apps/www/public/images/icons/brand/api-management-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/api-management-gray.svg create mode 100644 apps/www/public/images/icons/brand/api-management-green.svg create mode 100644 apps/www/public/images/icons/brand/auth-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/auth-gray.svg create mode 100644 apps/www/public/images/icons/brand/auth-green.svg create mode 100644 apps/www/public/images/icons/brand/blog-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/blog-gray.svg create mode 100644 apps/www/public/images/icons/brand/blog-green.svg create mode 100644 apps/www/public/images/icons/brand/cli-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/cli-gray.svg create mode 100644 apps/www/public/images/icons/brand/cli-green.svg create mode 100644 apps/www/public/images/icons/brand/columns-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/columns-gray.svg create mode 100644 apps/www/public/images/icons/brand/columns-green.svg create mode 100644 apps/www/public/images/icons/brand/custom-domains-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/custom-domains-gray.svg create mode 100644 apps/www/public/images/icons/brand/custom-domains-green.svg create mode 100644 apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/database-add-ons-gray.svg create mode 100644 apps/www/public/images/icons/brand/database-add-ons-green.svg create mode 100644 apps/www/public/images/icons/brand/database-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/database-gray.svg create mode 100644 apps/www/public/images/icons/brand/database-green.svg create mode 100644 apps/www/public/images/icons/brand/documentation-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/documentation-gray.svg create mode 100644 apps/www/public/images/icons/brand/documentation-green.svg create mode 100644 apps/www/public/images/icons/brand/edge-functions-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/edge-functions-gray.svg create mode 100644 apps/www/public/images/icons/brand/edge-functions-green.svg create mode 100644 apps/www/public/images/icons/brand/extensions-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/extensions-gray.svg create mode 100644 apps/www/public/images/icons/brand/extensions-green.svg create mode 100644 apps/www/public/images/icons/brand/getting-started-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/getting-started-gray.svg create mode 100644 apps/www/public/images/icons/brand/getting-started-green.svg create mode 100644 apps/www/public/images/icons/brand/glossary-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/glossary-gray.svg create mode 100644 apps/www/public/images/icons/brand/glossary-green.svg create mode 100644 apps/www/public/images/icons/brand/guides-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/guides-gray.svg create mode 100644 apps/www/public/images/icons/brand/guides-green.svg create mode 100644 apps/www/public/images/icons/brand/home-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/home-gray.svg create mode 100644 apps/www/public/images/icons/brand/home-green.svg create mode 100644 apps/www/public/images/icons/brand/logs-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/logs-gray.svg create mode 100644 apps/www/public/images/icons/brand/logs-green.svg create mode 100644 apps/www/public/images/icons/brand/pitr-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/pitr-gray.svg create mode 100644 apps/www/public/images/icons/brand/pitr-green.svg create mode 100644 apps/www/public/images/icons/brand/platform-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/platform-gray.svg create mode 100644 apps/www/public/images/icons/brand/platform-green.svg create mode 100644 apps/www/public/images/icons/brand/profile-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/profile-gray.svg create mode 100644 apps/www/public/images/icons/brand/profile-green.svg create mode 100644 apps/www/public/images/icons/brand/read-replicas-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/read-replicas-gray.svg create mode 100644 apps/www/public/images/icons/brand/read-replicas-green.svg create mode 100644 apps/www/public/images/icons/brand/realtime-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/realtime-gray.svg create mode 100644 apps/www/public/images/icons/brand/realtime-green.svg create mode 100644 apps/www/public/images/icons/brand/reports-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/reports-gray.svg create mode 100644 apps/www/public/images/icons/brand/reports-green.svg create mode 100644 apps/www/public/images/icons/brand/roles-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/roles-gray.svg create mode 100644 apps/www/public/images/icons/brand/roles-green.svg create mode 100644 apps/www/public/images/icons/brand/rows-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/rows-gray.svg create mode 100644 apps/www/public/images/icons/brand/rows-green.svg create mode 100644 apps/www/public/images/icons/brand/self-hosting-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/self-hosting-gray.svg create mode 100644 apps/www/public/images/icons/brand/self-hosting-green.svg create mode 100644 apps/www/public/images/icons/brand/settings-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/settings-gray.svg create mode 100644 apps/www/public/images/icons/brand/settings-green.svg create mode 100644 apps/www/public/images/icons/brand/storage-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/storage-gray.svg create mode 100644 apps/www/public/images/icons/brand/storage-green.svg create mode 100644 apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/support-add-ons-gray.svg create mode 100644 apps/www/public/images/icons/brand/support-add-ons-green.svg create mode 100644 apps/www/public/images/icons/brand/support-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/support-gray.svg create mode 100644 apps/www/public/images/icons/brand/support-green.svg create mode 100644 apps/www/public/images/icons/brand/table-editor-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/table-editor-gray.svg create mode 100644 apps/www/public/images/icons/brand/table-editor-green.svg create mode 100644 apps/www/public/images/icons/brand/tables-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/tables-gray.svg create mode 100644 apps/www/public/images/icons/brand/tables-green.svg create mode 100644 apps/www/public/images/icons/brand/tutorials-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/tutorials-gray.svg create mode 100644 apps/www/public/images/icons/brand/tutorials-green.svg create mode 100644 apps/www/public/images/icons/brand/wrappers-gray-negative.svg create mode 100644 apps/www/public/images/icons/brand/wrappers-gray.svg create mode 100644 apps/www/public/images/icons/brand/wrappers-green.svg diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 8cc41575118..9fe40754704 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -19,7 +19,7 @@ export default function IndexPage() { const router = useRouter() const { basePath } = useRouter() const { isDarkMode } = useTheme() - console.log('isDarkMode', isDarkMode) + const meta_title = 'Pricing & fees | Supabase' const meta_description = 'Explore Supabase fees and pricing information. Find our competitive pricing tiers, with no hidden pricing. We have generous free tiers for those getting started, and Pay As You Go for those scaling up.' @@ -258,7 +258,7 @@ export default function IndexPage() { lg:px-8 " > -
+
{tiers.map((tier) => (
{addons.map((addon) => ( -
+
Compute -
- {addon.icon} +
{addon.name} {addon.price}
diff --git a/apps/www/public/images/icons/brand/api-gray-negative.svg b/apps/www/public/images/icons/brand/api-gray-negative.svg new file mode 100644 index 00000000000..1c8b36abab2 --- /dev/null +++ b/apps/www/public/images/icons/brand/api-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/api-gray.svg b/apps/www/public/images/icons/brand/api-gray.svg new file mode 100644 index 00000000000..af00abfa5c6 --- /dev/null +++ b/apps/www/public/images/icons/brand/api-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/api-green.svg b/apps/www/public/images/icons/brand/api-green.svg new file mode 100644 index 00000000000..14f6f33c4fe --- /dev/null +++ b/apps/www/public/images/icons/brand/api-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/api-management-gray-negative.svg b/apps/www/public/images/icons/brand/api-management-gray-negative.svg new file mode 100644 index 00000000000..9cfe9c931d8 --- /dev/null +++ b/apps/www/public/images/icons/brand/api-management-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/api-management-gray.svg b/apps/www/public/images/icons/brand/api-management-gray.svg new file mode 100644 index 00000000000..ad8169dc421 --- /dev/null +++ b/apps/www/public/images/icons/brand/api-management-gray.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/www/public/images/icons/brand/api-management-green.svg b/apps/www/public/images/icons/brand/api-management-green.svg new file mode 100644 index 00000000000..2724bdb975d --- /dev/null +++ b/apps/www/public/images/icons/brand/api-management-green.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/www/public/images/icons/brand/auth-gray-negative.svg b/apps/www/public/images/icons/brand/auth-gray-negative.svg new file mode 100644 index 00000000000..611ec59b334 --- /dev/null +++ b/apps/www/public/images/icons/brand/auth-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/auth-gray.svg b/apps/www/public/images/icons/brand/auth-gray.svg new file mode 100644 index 00000000000..69a108e951d --- /dev/null +++ b/apps/www/public/images/icons/brand/auth-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/auth-green.svg b/apps/www/public/images/icons/brand/auth-green.svg new file mode 100644 index 00000000000..0875ec0d581 --- /dev/null +++ b/apps/www/public/images/icons/brand/auth-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/blog-gray-negative.svg b/apps/www/public/images/icons/brand/blog-gray-negative.svg new file mode 100644 index 00000000000..77cd8aa368d --- /dev/null +++ b/apps/www/public/images/icons/brand/blog-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/blog-gray.svg b/apps/www/public/images/icons/brand/blog-gray.svg new file mode 100644 index 00000000000..d17a7a75f2f --- /dev/null +++ b/apps/www/public/images/icons/brand/blog-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/blog-green.svg b/apps/www/public/images/icons/brand/blog-green.svg new file mode 100644 index 00000000000..ce9e01c1703 --- /dev/null +++ b/apps/www/public/images/icons/brand/blog-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/cli-gray-negative.svg b/apps/www/public/images/icons/brand/cli-gray-negative.svg new file mode 100644 index 00000000000..eaa2cee6601 --- /dev/null +++ b/apps/www/public/images/icons/brand/cli-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/cli-gray.svg b/apps/www/public/images/icons/brand/cli-gray.svg new file mode 100644 index 00000000000..e44838f4b7a --- /dev/null +++ b/apps/www/public/images/icons/brand/cli-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/cli-green.svg b/apps/www/public/images/icons/brand/cli-green.svg new file mode 100644 index 00000000000..ab3012bccd9 --- /dev/null +++ b/apps/www/public/images/icons/brand/cli-green.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/www/public/images/icons/brand/columns-gray-negative.svg b/apps/www/public/images/icons/brand/columns-gray-negative.svg new file mode 100644 index 00000000000..767fc7c44e9 --- /dev/null +++ b/apps/www/public/images/icons/brand/columns-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/columns-gray.svg b/apps/www/public/images/icons/brand/columns-gray.svg new file mode 100644 index 00000000000..bdf3c770bea --- /dev/null +++ b/apps/www/public/images/icons/brand/columns-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/columns-green.svg b/apps/www/public/images/icons/brand/columns-green.svg new file mode 100644 index 00000000000..e55340280d8 --- /dev/null +++ b/apps/www/public/images/icons/brand/columns-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg b/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg new file mode 100644 index 00000000000..afc7ede37ff --- /dev/null +++ b/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/custom-domains-gray.svg b/apps/www/public/images/icons/brand/custom-domains-gray.svg new file mode 100644 index 00000000000..405ab724659 --- /dev/null +++ b/apps/www/public/images/icons/brand/custom-domains-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/custom-domains-green.svg b/apps/www/public/images/icons/brand/custom-domains-green.svg new file mode 100644 index 00000000000..48f15398d17 --- /dev/null +++ b/apps/www/public/images/icons/brand/custom-domains-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg b/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg new file mode 100644 index 00000000000..55685530c78 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/database-add-ons-gray.svg b/apps/www/public/images/icons/brand/database-add-ons-gray.svg new file mode 100644 index 00000000000..1a434548729 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-add-ons-gray.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/database-add-ons-green.svg b/apps/www/public/images/icons/brand/database-add-ons-green.svg new file mode 100644 index 00000000000..c893942cdc6 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-add-ons-green.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/database-gray-negative.svg b/apps/www/public/images/icons/brand/database-gray-negative.svg new file mode 100644 index 00000000000..5e55c299c24 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/database-gray.svg b/apps/www/public/images/icons/brand/database-gray.svg new file mode 100644 index 00000000000..56bc4ae60b2 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/database-green.svg b/apps/www/public/images/icons/brand/database-green.svg new file mode 100644 index 00000000000..7919de28ca8 --- /dev/null +++ b/apps/www/public/images/icons/brand/database-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/documentation-gray-negative.svg b/apps/www/public/images/icons/brand/documentation-gray-negative.svg new file mode 100644 index 00000000000..9c9549935db --- /dev/null +++ b/apps/www/public/images/icons/brand/documentation-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/documentation-gray.svg b/apps/www/public/images/icons/brand/documentation-gray.svg new file mode 100644 index 00000000000..9e4b7b66c91 --- /dev/null +++ b/apps/www/public/images/icons/brand/documentation-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/documentation-green.svg b/apps/www/public/images/icons/brand/documentation-green.svg new file mode 100644 index 00000000000..877b89de115 --- /dev/null +++ b/apps/www/public/images/icons/brand/documentation-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg b/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg new file mode 100644 index 00000000000..47168849c2b --- /dev/null +++ b/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/edge-functions-gray.svg b/apps/www/public/images/icons/brand/edge-functions-gray.svg new file mode 100644 index 00000000000..65b62e8f89e --- /dev/null +++ b/apps/www/public/images/icons/brand/edge-functions-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/edge-functions-green.svg b/apps/www/public/images/icons/brand/edge-functions-green.svg new file mode 100644 index 00000000000..cfe6bb89751 --- /dev/null +++ b/apps/www/public/images/icons/brand/edge-functions-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/extensions-gray-negative.svg b/apps/www/public/images/icons/brand/extensions-gray-negative.svg new file mode 100644 index 00000000000..6fdd405e034 --- /dev/null +++ b/apps/www/public/images/icons/brand/extensions-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/extensions-gray.svg b/apps/www/public/images/icons/brand/extensions-gray.svg new file mode 100644 index 00000000000..fcd4c774c8b --- /dev/null +++ b/apps/www/public/images/icons/brand/extensions-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/extensions-green.svg b/apps/www/public/images/icons/brand/extensions-green.svg new file mode 100644 index 00000000000..bea58a73a02 --- /dev/null +++ b/apps/www/public/images/icons/brand/extensions-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/getting-started-gray-negative.svg b/apps/www/public/images/icons/brand/getting-started-gray-negative.svg new file mode 100644 index 00000000000..66a75217931 --- /dev/null +++ b/apps/www/public/images/icons/brand/getting-started-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/getting-started-gray.svg b/apps/www/public/images/icons/brand/getting-started-gray.svg new file mode 100644 index 00000000000..b1ef015bec7 --- /dev/null +++ b/apps/www/public/images/icons/brand/getting-started-gray.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/www/public/images/icons/brand/getting-started-green.svg b/apps/www/public/images/icons/brand/getting-started-green.svg new file mode 100644 index 00000000000..f24b5d6f883 --- /dev/null +++ b/apps/www/public/images/icons/brand/getting-started-green.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/www/public/images/icons/brand/glossary-gray-negative.svg b/apps/www/public/images/icons/brand/glossary-gray-negative.svg new file mode 100644 index 00000000000..48846d72ed6 --- /dev/null +++ b/apps/www/public/images/icons/brand/glossary-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/glossary-gray.svg b/apps/www/public/images/icons/brand/glossary-gray.svg new file mode 100644 index 00000000000..9931120ffa6 --- /dev/null +++ b/apps/www/public/images/icons/brand/glossary-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/glossary-green.svg b/apps/www/public/images/icons/brand/glossary-green.svg new file mode 100644 index 00000000000..7ab0359e7b9 --- /dev/null +++ b/apps/www/public/images/icons/brand/glossary-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/guides-gray-negative.svg b/apps/www/public/images/icons/brand/guides-gray-negative.svg new file mode 100644 index 00000000000..619dfc473e5 --- /dev/null +++ b/apps/www/public/images/icons/brand/guides-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/guides-gray.svg b/apps/www/public/images/icons/brand/guides-gray.svg new file mode 100644 index 00000000000..375fe6d5d8b --- /dev/null +++ b/apps/www/public/images/icons/brand/guides-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/guides-green.svg b/apps/www/public/images/icons/brand/guides-green.svg new file mode 100644 index 00000000000..27863e00032 --- /dev/null +++ b/apps/www/public/images/icons/brand/guides-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/home-gray-negative.svg b/apps/www/public/images/icons/brand/home-gray-negative.svg new file mode 100644 index 00000000000..ae023b5375a --- /dev/null +++ b/apps/www/public/images/icons/brand/home-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/home-gray.svg b/apps/www/public/images/icons/brand/home-gray.svg new file mode 100644 index 00000000000..ebfa14f7f23 --- /dev/null +++ b/apps/www/public/images/icons/brand/home-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/home-green.svg b/apps/www/public/images/icons/brand/home-green.svg new file mode 100644 index 00000000000..0a228053177 --- /dev/null +++ b/apps/www/public/images/icons/brand/home-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/logs-gray-negative.svg b/apps/www/public/images/icons/brand/logs-gray-negative.svg new file mode 100644 index 00000000000..234a573c22a --- /dev/null +++ b/apps/www/public/images/icons/brand/logs-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/logs-gray.svg b/apps/www/public/images/icons/brand/logs-gray.svg new file mode 100644 index 00000000000..0e99fe1f216 --- /dev/null +++ b/apps/www/public/images/icons/brand/logs-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/logs-green.svg b/apps/www/public/images/icons/brand/logs-green.svg new file mode 100644 index 00000000000..52da7533ce1 --- /dev/null +++ b/apps/www/public/images/icons/brand/logs-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/pitr-gray-negative.svg b/apps/www/public/images/icons/brand/pitr-gray-negative.svg new file mode 100644 index 00000000000..378964e9333 --- /dev/null +++ b/apps/www/public/images/icons/brand/pitr-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/pitr-gray.svg b/apps/www/public/images/icons/brand/pitr-gray.svg new file mode 100644 index 00000000000..c13962eae4f --- /dev/null +++ b/apps/www/public/images/icons/brand/pitr-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/pitr-green.svg b/apps/www/public/images/icons/brand/pitr-green.svg new file mode 100644 index 00000000000..f6269710023 --- /dev/null +++ b/apps/www/public/images/icons/brand/pitr-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/platform-gray-negative.svg b/apps/www/public/images/icons/brand/platform-gray-negative.svg new file mode 100644 index 00000000000..bdff9e59d70 --- /dev/null +++ b/apps/www/public/images/icons/brand/platform-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/platform-gray.svg b/apps/www/public/images/icons/brand/platform-gray.svg new file mode 100644 index 00000000000..83483f36f32 --- /dev/null +++ b/apps/www/public/images/icons/brand/platform-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/platform-green.svg b/apps/www/public/images/icons/brand/platform-green.svg new file mode 100644 index 00000000000..2c73d35f721 --- /dev/null +++ b/apps/www/public/images/icons/brand/platform-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/profile-gray-negative.svg b/apps/www/public/images/icons/brand/profile-gray-negative.svg new file mode 100644 index 00000000000..2e4fe6c99e7 --- /dev/null +++ b/apps/www/public/images/icons/brand/profile-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/profile-gray.svg b/apps/www/public/images/icons/brand/profile-gray.svg new file mode 100644 index 00000000000..344fa4c16f3 --- /dev/null +++ b/apps/www/public/images/icons/brand/profile-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/profile-green.svg b/apps/www/public/images/icons/brand/profile-green.svg new file mode 100644 index 00000000000..4064771b4f8 --- /dev/null +++ b/apps/www/public/images/icons/brand/profile-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg b/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg new file mode 100644 index 00000000000..ba08dbd69e7 --- /dev/null +++ b/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/read-replicas-gray.svg b/apps/www/public/images/icons/brand/read-replicas-gray.svg new file mode 100644 index 00000000000..abfb88d2213 --- /dev/null +++ b/apps/www/public/images/icons/brand/read-replicas-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/read-replicas-green.svg b/apps/www/public/images/icons/brand/read-replicas-green.svg new file mode 100644 index 00000000000..c033c7189cf --- /dev/null +++ b/apps/www/public/images/icons/brand/read-replicas-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/realtime-gray-negative.svg b/apps/www/public/images/icons/brand/realtime-gray-negative.svg new file mode 100644 index 00000000000..e820eaae08f --- /dev/null +++ b/apps/www/public/images/icons/brand/realtime-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/realtime-gray.svg b/apps/www/public/images/icons/brand/realtime-gray.svg new file mode 100644 index 00000000000..a3bcf43ffdd --- /dev/null +++ b/apps/www/public/images/icons/brand/realtime-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/realtime-green.svg b/apps/www/public/images/icons/brand/realtime-green.svg new file mode 100644 index 00000000000..1d5d535b40d --- /dev/null +++ b/apps/www/public/images/icons/brand/realtime-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/reports-gray-negative.svg b/apps/www/public/images/icons/brand/reports-gray-negative.svg new file mode 100644 index 00000000000..3cea4f0d444 --- /dev/null +++ b/apps/www/public/images/icons/brand/reports-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/reports-gray.svg b/apps/www/public/images/icons/brand/reports-gray.svg new file mode 100644 index 00000000000..4e988b96331 --- /dev/null +++ b/apps/www/public/images/icons/brand/reports-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/reports-green.svg b/apps/www/public/images/icons/brand/reports-green.svg new file mode 100644 index 00000000000..a04dc29b8e9 --- /dev/null +++ b/apps/www/public/images/icons/brand/reports-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/roles-gray-negative.svg b/apps/www/public/images/icons/brand/roles-gray-negative.svg new file mode 100644 index 00000000000..bd12069792c --- /dev/null +++ b/apps/www/public/images/icons/brand/roles-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/roles-gray.svg b/apps/www/public/images/icons/brand/roles-gray.svg new file mode 100644 index 00000000000..7764b8841bb --- /dev/null +++ b/apps/www/public/images/icons/brand/roles-gray.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/www/public/images/icons/brand/roles-green.svg b/apps/www/public/images/icons/brand/roles-green.svg new file mode 100644 index 00000000000..6ab8c3b3c05 --- /dev/null +++ b/apps/www/public/images/icons/brand/roles-green.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/rows-gray-negative.svg b/apps/www/public/images/icons/brand/rows-gray-negative.svg new file mode 100644 index 00000000000..f0640712741 --- /dev/null +++ b/apps/www/public/images/icons/brand/rows-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/rows-gray.svg b/apps/www/public/images/icons/brand/rows-gray.svg new file mode 100644 index 00000000000..f5320ce67bb --- /dev/null +++ b/apps/www/public/images/icons/brand/rows-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/rows-green.svg b/apps/www/public/images/icons/brand/rows-green.svg new file mode 100644 index 00000000000..02b29c41d64 --- /dev/null +++ b/apps/www/public/images/icons/brand/rows-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg b/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg new file mode 100644 index 00000000000..ea74756adce --- /dev/null +++ b/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/self-hosting-gray.svg b/apps/www/public/images/icons/brand/self-hosting-gray.svg new file mode 100644 index 00000000000..7a5e667ced1 --- /dev/null +++ b/apps/www/public/images/icons/brand/self-hosting-gray.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/self-hosting-green.svg b/apps/www/public/images/icons/brand/self-hosting-green.svg new file mode 100644 index 00000000000..9cc2c2ddfb8 --- /dev/null +++ b/apps/www/public/images/icons/brand/self-hosting-green.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/settings-gray-negative.svg b/apps/www/public/images/icons/brand/settings-gray-negative.svg new file mode 100644 index 00000000000..2b64a926831 --- /dev/null +++ b/apps/www/public/images/icons/brand/settings-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/settings-gray.svg b/apps/www/public/images/icons/brand/settings-gray.svg new file mode 100644 index 00000000000..2b62223d7bc --- /dev/null +++ b/apps/www/public/images/icons/brand/settings-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/settings-green.svg b/apps/www/public/images/icons/brand/settings-green.svg new file mode 100644 index 00000000000..2d149540e53 --- /dev/null +++ b/apps/www/public/images/icons/brand/settings-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/storage-gray-negative.svg b/apps/www/public/images/icons/brand/storage-gray-negative.svg new file mode 100644 index 00000000000..837bee9ee6d --- /dev/null +++ b/apps/www/public/images/icons/brand/storage-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/storage-gray.svg b/apps/www/public/images/icons/brand/storage-gray.svg new file mode 100644 index 00000000000..bef6045c255 --- /dev/null +++ b/apps/www/public/images/icons/brand/storage-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/storage-green.svg b/apps/www/public/images/icons/brand/storage-green.svg new file mode 100644 index 00000000000..55b6ca6367f --- /dev/null +++ b/apps/www/public/images/icons/brand/storage-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg b/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg new file mode 100644 index 00000000000..4eaf7940385 --- /dev/null +++ b/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/support-add-ons-gray.svg b/apps/www/public/images/icons/brand/support-add-ons-gray.svg new file mode 100644 index 00000000000..bd8647de63d --- /dev/null +++ b/apps/www/public/images/icons/brand/support-add-ons-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/support-add-ons-green.svg b/apps/www/public/images/icons/brand/support-add-ons-green.svg new file mode 100644 index 00000000000..6ff5e144638 --- /dev/null +++ b/apps/www/public/images/icons/brand/support-add-ons-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/support-gray-negative.svg b/apps/www/public/images/icons/brand/support-gray-negative.svg new file mode 100644 index 00000000000..c2f5ca07036 --- /dev/null +++ b/apps/www/public/images/icons/brand/support-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/support-gray.svg b/apps/www/public/images/icons/brand/support-gray.svg new file mode 100644 index 00000000000..7f0cddd1c45 --- /dev/null +++ b/apps/www/public/images/icons/brand/support-gray.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/support-green.svg b/apps/www/public/images/icons/brand/support-green.svg new file mode 100644 index 00000000000..0e3034f495a --- /dev/null +++ b/apps/www/public/images/icons/brand/support-green.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/www/public/images/icons/brand/table-editor-gray-negative.svg b/apps/www/public/images/icons/brand/table-editor-gray-negative.svg new file mode 100644 index 00000000000..53d8b392821 --- /dev/null +++ b/apps/www/public/images/icons/brand/table-editor-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/table-editor-gray.svg b/apps/www/public/images/icons/brand/table-editor-gray.svg new file mode 100644 index 00000000000..7c79f5d9512 --- /dev/null +++ b/apps/www/public/images/icons/brand/table-editor-gray.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/table-editor-green.svg b/apps/www/public/images/icons/brand/table-editor-green.svg new file mode 100644 index 00000000000..a100b64c80f --- /dev/null +++ b/apps/www/public/images/icons/brand/table-editor-green.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/www/public/images/icons/brand/tables-gray-negative.svg b/apps/www/public/images/icons/brand/tables-gray-negative.svg new file mode 100644 index 00000000000..0156ae2f417 --- /dev/null +++ b/apps/www/public/images/icons/brand/tables-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/tables-gray.svg b/apps/www/public/images/icons/brand/tables-gray.svg new file mode 100644 index 00000000000..3f7f4a54554 --- /dev/null +++ b/apps/www/public/images/icons/brand/tables-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/tables-green.svg b/apps/www/public/images/icons/brand/tables-green.svg new file mode 100644 index 00000000000..509103462b1 --- /dev/null +++ b/apps/www/public/images/icons/brand/tables-green.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/tutorials-gray-negative.svg b/apps/www/public/images/icons/brand/tutorials-gray-negative.svg new file mode 100644 index 00000000000..08a86d1254d --- /dev/null +++ b/apps/www/public/images/icons/brand/tutorials-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/tutorials-gray.svg b/apps/www/public/images/icons/brand/tutorials-gray.svg new file mode 100644 index 00000000000..df4b35c7489 --- /dev/null +++ b/apps/www/public/images/icons/brand/tutorials-gray.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/tutorials-green.svg b/apps/www/public/images/icons/brand/tutorials-green.svg new file mode 100644 index 00000000000..a4787fd42a3 --- /dev/null +++ b/apps/www/public/images/icons/brand/tutorials-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/www/public/images/icons/brand/wrappers-gray-negative.svg b/apps/www/public/images/icons/brand/wrappers-gray-negative.svg new file mode 100644 index 00000000000..b9825cc8b84 --- /dev/null +++ b/apps/www/public/images/icons/brand/wrappers-gray-negative.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/icons/brand/wrappers-gray.svg b/apps/www/public/images/icons/brand/wrappers-gray.svg new file mode 100644 index 00000000000..6b504f78bf5 --- /dev/null +++ b/apps/www/public/images/icons/brand/wrappers-gray.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/apps/www/public/images/icons/brand/wrappers-green.svg b/apps/www/public/images/icons/brand/wrappers-green.svg new file mode 100644 index 00000000000..970028b1b07 --- /dev/null +++ b/apps/www/public/images/icons/brand/wrappers-green.svg @@ -0,0 +1,7 @@ + + + + + + + From 5b634770efd5530fde0c7e838f113c8ea3a28145 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Wed, 18 Jan 2023 08:19:37 -0330 Subject: [PATCH 007/207] Update --- .../Pricing/ComputePricingModal.tsx | 113 ++++++++ .../{ => Pricing}/PricingAddOnTable.tsx | 0 .../{ => Pricing}/PricingTableRow.tsx | 123 ++++---- apps/www/components/ProductIcon.tsx | 11 +- apps/www/data/Pricing.json | 48 ++++ apps/www/data/PricingAddOnTable.json | 62 ++-- apps/www/pages/pricing/index.tsx | 267 ++++++++++-------- .../images/icons/brand/api-gray-negative.svg | 9 - .../public/images/icons/brand/api-gray.svg | 7 - .../public/images/icons/brand/api-green.svg | 7 - .../brand/api-management-gray-negative.svg | 9 - .../icons/brand/api-management-gray.svg | 3 - .../icons/brand/api-management-green.svg | 3 - .../images/icons/brand/auth-gray-negative.svg | 9 - .../public/images/icons/brand/auth-gray.svg | 6 - .../public/images/icons/brand/auth-green.svg | 6 - .../images/icons/brand/blog-gray-negative.svg | 9 - .../public/images/icons/brand/blog-gray.svg | 4 - .../public/images/icons/brand/blog-green.svg | 4 - .../images/icons/brand/cli-gray-negative.svg | 9 - .../public/images/icons/brand/cli-gray.svg | 5 - .../public/images/icons/brand/cli-green.svg | 3 - .../icons/brand/columns-gray-negative.svg | 9 - .../images/icons/brand/columns-gray.svg | 5 - .../images/icons/brand/columns-green.svg | 5 - .../brand/custom-domains-gray-negative.svg | 9 - .../icons/brand/custom-domains-gray.svg | 5 - .../icons/brand/custom-domains-green.svg | 5 - .../brand/database-add-ons-gray-negative.svg | 9 - .../icons/brand/database-add-ons-gray.svg | 9 - .../icons/brand/database-add-ons-green.svg | 9 - .../icons/brand/database-gray-negative.svg | 9 - .../images/icons/brand/database-gray.svg | 5 - .../images/icons/brand/database-green.svg | 5 - .../brand/documentation-gray-negative.svg | 9 - .../images/icons/brand/documentation-gray.svg | 7 - .../icons/brand/documentation-green.svg | 7 - .../brand/edge-functions-gray-negative.svg | 9 - .../icons/brand/edge-functions-gray.svg | 6 - .../icons/brand/edge-functions-green.svg | 6 - .../icons/brand/extensions-gray-negative.svg | 9 - .../images/icons/brand/extensions-gray.svg | 7 - .../images/icons/brand/extensions-green.svg | 7 - .../brand/getting-started-gray-negative.svg | 9 - .../icons/brand/getting-started-gray.svg | 3 - .../icons/brand/getting-started-green.svg | 3 - .../icons/brand/glossary-gray-negative.svg | 9 - .../images/icons/brand/glossary-gray.svg | 5 - .../images/icons/brand/glossary-green.svg | 5 - .../icons/brand/guides-gray-negative.svg | 9 - .../public/images/icons/brand/guides-gray.svg | 5 - .../images/icons/brand/guides-green.svg | 5 - .../images/icons/brand/home-gray-negative.svg | 9 - .../public/images/icons/brand/home-gray.svg | 5 - .../public/images/icons/brand/home-green.svg | 5 - .../images/icons/brand/logs-gray-negative.svg | 9 - .../public/images/icons/brand/logs-gray.svg | 6 - .../public/images/icons/brand/logs-green.svg | 6 - .../images/icons/brand/pitr-gray-negative.svg | 9 - .../public/images/icons/brand/pitr-gray.svg | 7 - .../public/images/icons/brand/pitr-green.svg | 7 - .../icons/brand/platform-gray-negative.svg | 9 - .../images/icons/brand/platform-gray.svg | 5 - .../images/icons/brand/platform-green.svg | 5 - .../icons/brand/profile-gray-negative.svg | 9 - .../images/icons/brand/profile-gray.svg | 5 - .../images/icons/brand/profile-green.svg | 5 - .../brand/read-replicas-gray-negative.svg | 9 - .../images/icons/brand/read-replicas-gray.svg | 6 - .../icons/brand/read-replicas-green.svg | 6 - .../icons/brand/realtime-gray-negative.svg | 9 - .../images/icons/brand/realtime-gray.svg | 6 - .../images/icons/brand/realtime-green.svg | 6 - .../icons/brand/reports-gray-negative.svg | 9 - .../images/icons/brand/reports-gray.svg | 7 - .../images/icons/brand/reports-green.svg | 7 - .../icons/brand/roles-gray-negative.svg | 9 - .../public/images/icons/brand/roles-gray.svg | 8 - .../public/images/icons/brand/roles-green.svg | 9 - .../images/icons/brand/rows-gray-negative.svg | 9 - .../public/images/icons/brand/rows-gray.svg | 5 - .../public/images/icons/brand/rows-green.svg | 5 - .../brand/self-hosting-gray-negative.svg | 9 - .../images/icons/brand/self-hosting-gray.svg | 9 - .../images/icons/brand/self-hosting-green.svg | 9 - .../icons/brand/settings-gray-negative.svg | 9 - .../images/icons/brand/settings-gray.svg | 4 - .../images/icons/brand/settings-green.svg | 4 - .../icons/brand/storage-gray-negative.svg | 9 - .../images/icons/brand/storage-gray.svg | 5 - .../images/icons/brand/storage-green.svg | 5 - .../brand/support-add-ons-gray-negative.svg | 9 - .../icons/brand/support-add-ons-gray.svg | 7 - .../icons/brand/support-add-ons-green.svg | 7 - .../icons/brand/support-gray-negative.svg | 9 - .../images/icons/brand/support-gray.svg | 5 - .../images/icons/brand/support-green.svg | 5 - .../brand/table-editor-gray-negative.svg | 9 - .../images/icons/brand/table-editor-gray.svg | 6 - .../images/icons/brand/table-editor-green.svg | 6 - .../icons/brand/tables-gray-negative.svg | 9 - .../public/images/icons/brand/tables-gray.svg | 7 - .../images/icons/brand/tables-green.svg | 7 - .../icons/brand/tutorials-gray-negative.svg | 9 - .../images/icons/brand/tutorials-gray.svg | 4 - .../images/icons/brand/tutorials-green.svg | 4 - .../icons/brand/wrappers-gray-negative.svg | 9 - .../images/icons/brand/wrappers-gray.svg | 7 - .../images/icons/brand/wrappers-green.svg | 7 - .../addons-custom-domain-hero-light.svg | 158 +++++++++++ .../pricing/addons-custom-domain-hero.svg | 159 +++++++++++ .../images/pricing/addons-pitr-light.svg | 188 ++++++++++++ .../www/public/images/pricing/addons-pitr.svg | 188 ++++++++++++ .../images/pricing/addons-support-light.svg | 136 +++++++++ .../public/images/pricing/addons-support.svg | 136 +++++++++ .../images/pricing/pitr-upgrade-light.svg | 9 + .../public/images/pricing/pitr-upgrade.svg | 7 + 117 files changed, 1396 insertions(+), 906 deletions(-) create mode 100644 apps/www/components/Pricing/ComputePricingModal.tsx rename apps/www/components/{ => Pricing}/PricingAddOnTable.tsx (100%) rename apps/www/components/{ => Pricing}/PricingTableRow.tsx (50%) delete mode 100644 apps/www/public/images/icons/brand/api-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/api-gray.svg delete mode 100644 apps/www/public/images/icons/brand/api-green.svg delete mode 100644 apps/www/public/images/icons/brand/api-management-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/api-management-gray.svg delete mode 100644 apps/www/public/images/icons/brand/api-management-green.svg delete mode 100644 apps/www/public/images/icons/brand/auth-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/auth-gray.svg delete mode 100644 apps/www/public/images/icons/brand/auth-green.svg delete mode 100644 apps/www/public/images/icons/brand/blog-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/blog-gray.svg delete mode 100644 apps/www/public/images/icons/brand/blog-green.svg delete mode 100644 apps/www/public/images/icons/brand/cli-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/cli-gray.svg delete mode 100644 apps/www/public/images/icons/brand/cli-green.svg delete mode 100644 apps/www/public/images/icons/brand/columns-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/columns-gray.svg delete mode 100644 apps/www/public/images/icons/brand/columns-green.svg delete mode 100644 apps/www/public/images/icons/brand/custom-domains-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/custom-domains-gray.svg delete mode 100644 apps/www/public/images/icons/brand/custom-domains-green.svg delete mode 100644 apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/database-add-ons-gray.svg delete mode 100644 apps/www/public/images/icons/brand/database-add-ons-green.svg delete mode 100644 apps/www/public/images/icons/brand/database-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/database-gray.svg delete mode 100644 apps/www/public/images/icons/brand/database-green.svg delete mode 100644 apps/www/public/images/icons/brand/documentation-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/documentation-gray.svg delete mode 100644 apps/www/public/images/icons/brand/documentation-green.svg delete mode 100644 apps/www/public/images/icons/brand/edge-functions-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/edge-functions-gray.svg delete mode 100644 apps/www/public/images/icons/brand/edge-functions-green.svg delete mode 100644 apps/www/public/images/icons/brand/extensions-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/extensions-gray.svg delete mode 100644 apps/www/public/images/icons/brand/extensions-green.svg delete mode 100644 apps/www/public/images/icons/brand/getting-started-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/getting-started-gray.svg delete mode 100644 apps/www/public/images/icons/brand/getting-started-green.svg delete mode 100644 apps/www/public/images/icons/brand/glossary-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/glossary-gray.svg delete mode 100644 apps/www/public/images/icons/brand/glossary-green.svg delete mode 100644 apps/www/public/images/icons/brand/guides-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/guides-gray.svg delete mode 100644 apps/www/public/images/icons/brand/guides-green.svg delete mode 100644 apps/www/public/images/icons/brand/home-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/home-gray.svg delete mode 100644 apps/www/public/images/icons/brand/home-green.svg delete mode 100644 apps/www/public/images/icons/brand/logs-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/logs-gray.svg delete mode 100644 apps/www/public/images/icons/brand/logs-green.svg delete mode 100644 apps/www/public/images/icons/brand/pitr-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/pitr-gray.svg delete mode 100644 apps/www/public/images/icons/brand/pitr-green.svg delete mode 100644 apps/www/public/images/icons/brand/platform-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/platform-gray.svg delete mode 100644 apps/www/public/images/icons/brand/platform-green.svg delete mode 100644 apps/www/public/images/icons/brand/profile-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/profile-gray.svg delete mode 100644 apps/www/public/images/icons/brand/profile-green.svg delete mode 100644 apps/www/public/images/icons/brand/read-replicas-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/read-replicas-gray.svg delete mode 100644 apps/www/public/images/icons/brand/read-replicas-green.svg delete mode 100644 apps/www/public/images/icons/brand/realtime-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/realtime-gray.svg delete mode 100644 apps/www/public/images/icons/brand/realtime-green.svg delete mode 100644 apps/www/public/images/icons/brand/reports-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/reports-gray.svg delete mode 100644 apps/www/public/images/icons/brand/reports-green.svg delete mode 100644 apps/www/public/images/icons/brand/roles-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/roles-gray.svg delete mode 100644 apps/www/public/images/icons/brand/roles-green.svg delete mode 100644 apps/www/public/images/icons/brand/rows-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/rows-gray.svg delete mode 100644 apps/www/public/images/icons/brand/rows-green.svg delete mode 100644 apps/www/public/images/icons/brand/self-hosting-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/self-hosting-gray.svg delete mode 100644 apps/www/public/images/icons/brand/self-hosting-green.svg delete mode 100644 apps/www/public/images/icons/brand/settings-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/settings-gray.svg delete mode 100644 apps/www/public/images/icons/brand/settings-green.svg delete mode 100644 apps/www/public/images/icons/brand/storage-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/storage-gray.svg delete mode 100644 apps/www/public/images/icons/brand/storage-green.svg delete mode 100644 apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/support-add-ons-gray.svg delete mode 100644 apps/www/public/images/icons/brand/support-add-ons-green.svg delete mode 100644 apps/www/public/images/icons/brand/support-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/support-gray.svg delete mode 100644 apps/www/public/images/icons/brand/support-green.svg delete mode 100644 apps/www/public/images/icons/brand/table-editor-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/table-editor-gray.svg delete mode 100644 apps/www/public/images/icons/brand/table-editor-green.svg delete mode 100644 apps/www/public/images/icons/brand/tables-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/tables-gray.svg delete mode 100644 apps/www/public/images/icons/brand/tables-green.svg delete mode 100644 apps/www/public/images/icons/brand/tutorials-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/tutorials-gray.svg delete mode 100644 apps/www/public/images/icons/brand/tutorials-green.svg delete mode 100644 apps/www/public/images/icons/brand/wrappers-gray-negative.svg delete mode 100644 apps/www/public/images/icons/brand/wrappers-gray.svg delete mode 100644 apps/www/public/images/icons/brand/wrappers-green.svg create mode 100644 apps/www/public/images/pricing/addons-custom-domain-hero-light.svg create mode 100644 apps/www/public/images/pricing/addons-custom-domain-hero.svg create mode 100644 apps/www/public/images/pricing/addons-pitr-light.svg create mode 100644 apps/www/public/images/pricing/addons-pitr.svg create mode 100644 apps/www/public/images/pricing/addons-support-light.svg create mode 100644 apps/www/public/images/pricing/addons-support.svg create mode 100644 apps/www/public/images/pricing/pitr-upgrade-light.svg create mode 100644 apps/www/public/images/pricing/pitr-upgrade.svg diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx new file mode 100644 index 00000000000..b56881abb0c --- /dev/null +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -0,0 +1,113 @@ +import React, { Fragment, useMemo } from 'react' + +import { IconCheckCircle, IconXCircle, Modal } from 'ui' +import pricingAddOn from '~/data/PricingAddOnTable.json' + +interface Props { + showComputeModal: boolean + setShowComputeModal: React.Dispatch> +} + +export default function ComputePricingModal({ showComputeModal, setShowComputeModal }: Props) { + const columnNames = useMemo( + () => + pricingAddOn.database.rows.map((row) => + row.columns.map((column) => ({ key: column.key, title: column.title })) + )[0], + [] + ) + + return ( + setVideoVisible(false)} + hideFooter + header={ +
+ Compute pricing + setShowComputeModal(false)} + /> +
+ } + > +
+
+
+

Choose best compute setup for you

+

+ Every project on the Supabase Platform comes with its own dedicated Postgres instance + running inside a virtual machine (VM). The following table describes the base instance + with additional compute add-ons available if you need extra performance when scaling + up Supabase. +

+
+
+ + + + {columnNames.map((column) => ( + + ))} + + + + {pricingAddOn.database.rows.map((row, i) => ( + <> + {i === 0 && ( + + + + )} + + {row.columns.map((column) => ( + + ))} + + + ))} + +
+ {column.title} +
+ Included in Free and Pro tiers +
+ {column.key === 'dedicated' ? ( + + ) : ( + column.value + )} +
+
+ + + + {pricingAddOn.database.rows.map((row, i) => ( + + {row.columns.map((column) => ( + + + + + ))} + + ))} + +
{column.title}{column.value}
+
+
+
+ ) +} diff --git a/apps/www/components/PricingAddOnTable.tsx b/apps/www/components/Pricing/PricingAddOnTable.tsx similarity index 100% rename from apps/www/components/PricingAddOnTable.tsx rename to apps/www/components/Pricing/PricingAddOnTable.tsx diff --git a/apps/www/components/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx similarity index 50% rename from apps/www/components/PricingTableRow.tsx rename to apps/www/components/Pricing/PricingTableRow.tsx index e9a29a72236..f546208082e 100644 --- a/apps/www/components/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -1,11 +1,11 @@ -import { IconHelpCircle } from 'ui' +import { IconHelpCircle, IconInfo, IconX, IconXCircle, Modal } from 'ui' import ProductIcon from 'components/ProductIcon' import React, { useState } from 'react' import ReactTooltip from 'react-tooltip' export const Check = () => ( ( ) const IncludedCheck = (props: any) => ( - <> + Included in {props.tier} - + ) const Minus = (props: any) => ( <> { return ( <>
-
- {props.icon && } -

{category.title}

+
+ {props.icon && } +

{category.title}

- - - + + + + {category.features.map((feat: any, i: number) => { return ( - - - {feat.title} - {feat.tooltip && ( - - - - )} - + <> + + + {feat.title} + {feat.tooltip && !feat.tooltipPosition && ( + + + + )} + - {Object.entries(feat.tiers).map((entry: any, i) => { - const tierName = entry[0] - const tierValue = entry[1] + {Object.entries(feat.tiers).map((entry: any, i) => { + const tierName = entry[0] + const tierValue = entry[1] - return ( - - {typeof tierValue === 'boolean' && tierValue === true ? ( - - ) : typeof tierValue === 'boolean' && tierValue === false ? ( -
- -
- ) : ( - - {tierValue} - - )} - - ) - })} - + return ( + + {typeof tierValue === 'boolean' && tierValue === true ? ( + + ) : typeof tierValue === 'boolean' && tierValue === false ? ( +
+ +
+ ) : ( + + {feat.tooltip && feat.tooltipPosition === tierName && ( + + + + )} + + {tierValue} + + )} + + ) + })} + + {i === category.features.length - 1 && ( +
+ )} + ) })} diff --git a/apps/www/components/ProductIcon.tsx b/apps/www/components/ProductIcon.tsx index d7a24709787..fa2240071a4 100644 --- a/apps/www/components/ProductIcon.tsx +++ b/apps/www/components/ProductIcon.tsx @@ -1,10 +1,17 @@ interface ProductIcon { icon: string + color?: 'black' | 'green' } -function ProductIcon({ icon }: ProductIcon) { +function ProductIcon({ icon, color }: ProductIcon) { return ( -
+
1TB, contact enterprise)", + "team": "text", "enterprise": "Custom" } }, @@ -42,6 +47,7 @@ "tiers": { "free": false, "pro": false, + "team": "text", "enterprise": true } }, @@ -51,6 +57,7 @@ "tiers": { "free": "Paused after 1 week inactivity", "pro": "Never", + "team": "text", "enterprise": "Never" } }, @@ -60,6 +67,7 @@ "tiers": { "free": "Up to 2GB", "pro": "50GB included per month, then $0.09 per GB", + "team": "text", "enterprise": "Unlimited" } } @@ -75,6 +83,7 @@ "tiers": { "free": "Unlimited", "pro": "Unlimited", + "team": "text", "enterprise": "Unlimited" } }, @@ -84,6 +93,7 @@ "tiers": { "free": "Up to 50,000 MAUs", "pro": "100,000 included, then $0.00325 per MAU", + "team": "text", "enterprise": "Unlimited" } }, @@ -92,6 +102,7 @@ "tiers": { "free": true, "pro": true, + "team": true, "enterprise": true } }, @@ -100,6 +111,7 @@ "tiers": { "free": true, "pro": true, + "team": true, "enterprise": true } }, @@ -108,6 +120,7 @@ "tiers": { "free": false, "pro": true, + "team": true, "enterprise": true } }, @@ -116,6 +129,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -124,6 +138,7 @@ "tiers": { "free": "1 hour", "pro": "7 days", + "team": "text", "enterprise": true } }, @@ -132,6 +147,7 @@ "tiers": { "free": true, "pro": true, + "team": true, "enterprise": true } }, @@ -141,6 +157,7 @@ "tiers": { "free": "30 / hour", "pro": "100 / hour", + "team": "text", "enterprise": "Contact Us" } }, @@ -149,6 +166,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": "Contact Us" } } @@ -163,6 +181,7 @@ "tiers": { "free": "Up to 1 GB", "pro": "100 GB included, then $0.021 per GB", + "team": "text", "enterprise": "Unlimited" } }, @@ -172,6 +191,7 @@ "tiers": { "free": "Up to 2 GB", "pro": "200 GB included, then $0.09 per GB", + "team": "text", "enterprise": "Unlimited" } }, @@ -189,6 +209,7 @@ "tiers": { "free": "Up to 50MB", "pro": "Up to 5GB", + "team": "text", "enterprise": "Unlimited" } }, @@ -197,6 +218,7 @@ "tiers": { "free": false, "pro": "Unlimited transformations for 100 origin images, then 5$ per 1000 origin images", + "team": "text", "enterprise": "Unlimited" } } @@ -211,6 +233,7 @@ "tiers": { "free": "500K per month", "pro": "2 Million per month, then $2 per 1 million invocations", + "team": "text", "enterprise": "Unlimited" } }, @@ -219,6 +242,7 @@ "tiers": { "free": "2 mb", "pro": "10 mb", + "team": "text", "enterprise": "Unlimited" } }, @@ -227,6 +251,7 @@ "tiers": { "free": "10", "pro": "100, then $10 per additional 100 functions", + "team": "text", "enterprise": "Unlimited" } } @@ -241,6 +266,7 @@ "tiers": { "free": true, "pro": true, + "team": true, "enterprise": true } }, @@ -249,6 +275,7 @@ "tiers": { "free": "Up to 200", "pro": "Up to 500, then $10 per 1000", + "team": "text", "enterprise": "Unlimited concurrent connections and volume discount" } }, @@ -257,6 +284,7 @@ "tiers": { "free": "2 Million (including database)", "pro": "5 Million", + "team": "text", "enterprise": "Volume discounts on messages" } }, @@ -265,6 +293,7 @@ "tiers": { "free": "250 Kb", "pro": "3 Mb", + "team": "text", "enterprise": "Custom" } } @@ -279,6 +308,7 @@ "tiers": { "free": "Unlimited", "pro": "Unlimited", + "team": "text", "enterprise": "Unlimited" } }, @@ -287,6 +317,7 @@ "tiers": { "free": "Coming soon", "pro": "Coming soon", + "team": "text", "enterprise": true } }, @@ -295,6 +326,7 @@ "tiers": { "free": false, "pro": false, + "team": false, "enterprise": true } } @@ -309,6 +341,7 @@ "tiers": { "free": false, "pro": false, + "team": false, "enterprise": true } }, @@ -317,6 +350,7 @@ "tiers": { "free": "1 day", "pro": "7 days", + "team": "text", "enterprise": "90 days" } }, @@ -325,6 +359,7 @@ "tiers": { "free": false, "pro": false, + "team": "text", "enterprise": "Coming soon" } }, @@ -333,6 +368,7 @@ "tiers": { "free": false, "pro": true, + "team": true, "enterprise": true } }, @@ -341,6 +377,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -349,6 +386,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": "Contact Us" } }, @@ -357,6 +395,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -365,6 +404,7 @@ "tiers": { "free": "Owner, Developer", "pro": "Owner, Developer", + "team": "text", "enterprise": "Additional owner(s), admin, read-only, billing admin, custom" } }, @@ -373,6 +413,7 @@ "tiers": { "free": false, "pro": true, + "team": true, "enterprise": true } }, @@ -382,6 +423,7 @@ "tiers": { "free": false, "pro": "$10 per domain per month per project add on", + "team": "text", "enterprise": "1 included, additional custom domains $10 per custom domain per month. Volume discounts available." } } @@ -396,6 +438,7 @@ "tiers": { "free": true, "pro": true, + "team": true, "enterprise": true } }, @@ -404,6 +447,7 @@ "tiers": { "free": false, "pro": true, + "team": true, "enterprise": true } }, @@ -412,6 +456,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -420,6 +465,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -436,6 +482,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } }, @@ -444,6 +491,7 @@ "tiers": { "free": false, "pro": false, + "team": true, "enterprise": true } } diff --git a/apps/www/data/PricingAddOnTable.json b/apps/www/data/PricingAddOnTable.json index d756fb75d18..e20da275960 100644 --- a/apps/www/data/PricingAddOnTable.json +++ b/apps/www/data/PricingAddOnTable.json @@ -10,11 +10,12 @@ "rows": [ { "columns": [ - { "key": "plan", "title": "Plan", "value": "Free (Included)" }, + { "key": "plan", "title": "Plan", "value": "Starter" }, { "key": "pricing", "title": "Pricing", "value": "$0" }, - { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "1 GB" }, - { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, + { "key": "maxDiskIO", "title": "Disk IO Bandwidth up to", "value": "2,606 Mbps" }, { "key": "baseDiskIO", "title": "Baseline Disk IO Bandwidth", @@ -22,12 +23,12 @@ }, { "key": "directConnections", - "title": "Connections: Direct (recommended)", + "title": "Connections: Direct", "value": "10" }, { "key": "poolerConnections", - "title": "Connections: Pooler (recommended)", + "title": "Connections: Pooler", "value": "50" } ] @@ -36,7 +37,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "Small" }, { "key": "pricing", "title": "Pricing", "value": "$5" }, - { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "2 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, { @@ -60,7 +62,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "Medium" }, { "key": "pricing", "title": "Pricing", "value": "$50" }, - { "key": "cpu", "title": "CPU", "value": "2-core ARM (shared)" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "4 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, { @@ -84,7 +87,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "Large" }, { "key": "pricing", "title": "Pricing", "value": "$100" }, - { "key": "cpu", "title": "CPU", "value": "2-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "2-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "8 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, { @@ -108,7 +112,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "XL" }, { "key": "pricing", "title": "Pricing", "value": "$200" }, - { "key": "cpu", "title": "CPU", "value": "4-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "4-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "16 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, { @@ -132,7 +137,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "2XL" }, { "key": "pricing", "title": "Pricing", "value": "$400" }, - { "key": "cpu", "title": "CPU", "value": "8-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "8-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "32 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, { @@ -156,7 +162,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "4XL" }, { "key": "pricing", "title": "Pricing", "value": "$950" }, - { "key": "cpu", "title": "CPU", "value": "16-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "16-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "64 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, { @@ -180,7 +187,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "8XL" }, { "key": "pricing", "title": "Pricing", "value": "$1,860" }, - { "key": "cpu", "title": "CPU", "value": "32-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "32-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "128 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "9,500 Mbps" }, { @@ -204,7 +212,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "12XL" }, { "key": "pricing", "title": "Pricing", "value": "$2,790" }, - { "key": "cpu", "title": "CPU", "value": "48-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "48-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "192 GB" }, { "key": "maxDiskIO", @@ -232,7 +241,8 @@ "columns": [ { "key": "plan", "title": "Plan", "value": "16XL" }, { "key": "pricing", "title": "Pricing", "value": "$3,720" }, - { "key": "cpu", "title": "CPU", "value": "64-core ARM (dedicated)" }, + { "key": "cpu", "title": "CPU", "value": "64-core ARM" }, + { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "256 GB" }, { "key": "maxDiskIO", @@ -255,30 +265,6 @@ "value": "11,600" } ] - }, - { - "columns": [ - { "key": "plan", "title": "Plan", "value": "Custom (need more?)" }, - { "key": "pricing", "title": "Pricing", "value": "Contact Us" }, - { "key": "cpu", "title": "CPU", "value": "Contact Us" }, - { "key": "memory", "title": "Memory", "value": "Contact Us" }, - { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "Contact Us" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "Contact Us" - }, - { - "key": "directConnections", - "title": "Connections: Direct (recommended)", - "value": "Contact Us" - }, - { - "key": "poolerConnections", - "title": "Connections: Pooler (recommended)", - "value": "Contact Us" - } - ] } ] }, diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 9fe40754704..89c21f0ffec 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -4,21 +4,23 @@ import Solutions from 'data/Solutions.json' import { NextSeo } from 'next-seo' import Link from 'next/link' import { useRouter } from 'next/router' -import React from 'react' +import React, { useState } from 'react' import ReactMarkdown from 'react-markdown' import CTABanner from '~/components/CTABanner' import DefaultLayout from '~/components/Layouts/Default' -import PricingAddOnTable from '~/components/PricingAddOnTable' -import { PricingTableRowDesktop, PricingTableRowMobile } from '~/components/PricingTableRow' +import PricingAddOnTable from '~/components/Pricing/PricingAddOnTable' +import { PricingTableRowDesktop, PricingTableRowMobile } from '~/components/Pricing/PricingTableRow' import pricing from '~/data/Pricing.json' import pricingAddOn from '~/data/PricingAddOnTable.json' import pricingFaq from '~/data/PricingFAQ.json' import { useTheme } from 'common/Providers' +import ComputePricingModal from '~/components/Pricing/ComputePricingModal' export default function IndexPage() { const router = useRouter() const { basePath } = useRouter() const { isDarkMode } = useTheme() + const [showComputeModal, setShowComputeModal] = useState(false) const meta_title = 'Pricing & fees | Supabase' const meta_description = @@ -37,7 +39,7 @@ export default function IndexPage() { costUnit: 'per month per project', href: 'https://app.supabase.com/new/new-project', priceLabel: 'Starting from', - priceMonthly: 0, + priceMonthly: '0', warning: 'Limit of 2 free projects', description: 'Perfect for passion projects & simple websites.', preface: 'Get started with...', @@ -90,7 +92,7 @@ export default function IndexPage() { href: 'https://app.supabase.com/new/new-project', from: true, priceLabel: 'Starting from', - priceMonthly: 25, + priceMonthly: 599, description: 'For scaling teams with permissions & access controls', warning: '+ any additional usage', features: [ @@ -134,7 +136,7 @@ export default function IndexPage() { const addons = [ { name: 'Optimized Compute', - heroImg: 'hero', + heroImg: 'addons-compute-hero', icon: 'compute-upgrade', price: 'Starts from $5', description: 'Increase the captability of your database only for what you need.', @@ -145,7 +147,7 @@ export default function IndexPage() { }, { name: 'Dedicated Support', - heroImg: 'hero', + heroImg: 'addons-support', icon: 'support-upgrade', price: 'Starts from $5', description: @@ -157,7 +159,7 @@ export default function IndexPage() { }, { name: 'Custom Domain', - heroImg: 'hero', + heroImg: 'addons-custom-domain-hero', icon: 'custom-domain-upgrade', price: 'Flat fee $10', description: @@ -169,8 +171,8 @@ export default function IndexPage() { }, { name: 'Point in time recovery', - heroImg: 'hero', - icon: 'icon', + heroImg: 'addons-pitr', + icon: 'pitr-upgrade', price: 'Starts from $5', description: 'Roll back to any specific point in time and ensure that data is not lost.', leftCtaText: 'Documentation', @@ -249,7 +251,7 @@ export default function IndexPage() {
-
+
{/*
*/}
-
+
{tiers.map((tier) => (
-
+

Easily customizable add-Ons

@@ -396,24 +398,73 @@ export default function IndexPage() { Level up your Supabase experience with add-ons.

-
+ +
{addons.map((addon) => ( -
- Compute -
- {addon.name} - {addon.price} +
+
+ +
+
+

{addon.price}

+
+ Compute + {addon.name} +
+

+ {addon.description} +

+
+ + + + + + {addon.name === 'Optimized Compute' ? ( + + ) : ( + '' + )} +
))}
-
+
+
+ + Available for Pro plan + +

Flexible Spend Cap

+

+ Ensure you have the flexibility to scale your business without the restrictions of Pro + usage limits. Turn off the usage cap to let your project scale and only pay for what + you use.{' '} +

+
+
+
right
+
+
- + - - - - - + {tiers.map((tier) => ( + + ))} + + + + {tiers.map((tier) => ( + + ))} + - + + > - - - - - + + + + + ))} + ) } diff --git a/apps/www/public/images/icons/brand/api-gray-negative.svg b/apps/www/public/images/icons/brand/api-gray-negative.svg deleted file mode 100644 index 1c8b36abab2..00000000000 --- a/apps/www/public/images/icons/brand/api-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/api-gray.svg b/apps/www/public/images/icons/brand/api-gray.svg deleted file mode 100644 index af00abfa5c6..00000000000 --- a/apps/www/public/images/icons/brand/api-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/api-green.svg b/apps/www/public/images/icons/brand/api-green.svg deleted file mode 100644 index 14f6f33c4fe..00000000000 --- a/apps/www/public/images/icons/brand/api-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/api-management-gray-negative.svg b/apps/www/public/images/icons/brand/api-management-gray-negative.svg deleted file mode 100644 index 9cfe9c931d8..00000000000 --- a/apps/www/public/images/icons/brand/api-management-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/api-management-gray.svg b/apps/www/public/images/icons/brand/api-management-gray.svg deleted file mode 100644 index ad8169dc421..00000000000 --- a/apps/www/public/images/icons/brand/api-management-gray.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/www/public/images/icons/brand/api-management-green.svg b/apps/www/public/images/icons/brand/api-management-green.svg deleted file mode 100644 index 2724bdb975d..00000000000 --- a/apps/www/public/images/icons/brand/api-management-green.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/www/public/images/icons/brand/auth-gray-negative.svg b/apps/www/public/images/icons/brand/auth-gray-negative.svg deleted file mode 100644 index 611ec59b334..00000000000 --- a/apps/www/public/images/icons/brand/auth-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/auth-gray.svg b/apps/www/public/images/icons/brand/auth-gray.svg deleted file mode 100644 index 69a108e951d..00000000000 --- a/apps/www/public/images/icons/brand/auth-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/auth-green.svg b/apps/www/public/images/icons/brand/auth-green.svg deleted file mode 100644 index 0875ec0d581..00000000000 --- a/apps/www/public/images/icons/brand/auth-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/blog-gray-negative.svg b/apps/www/public/images/icons/brand/blog-gray-negative.svg deleted file mode 100644 index 77cd8aa368d..00000000000 --- a/apps/www/public/images/icons/brand/blog-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/blog-gray.svg b/apps/www/public/images/icons/brand/blog-gray.svg deleted file mode 100644 index d17a7a75f2f..00000000000 --- a/apps/www/public/images/icons/brand/blog-gray.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/blog-green.svg b/apps/www/public/images/icons/brand/blog-green.svg deleted file mode 100644 index ce9e01c1703..00000000000 --- a/apps/www/public/images/icons/brand/blog-green.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/cli-gray-negative.svg b/apps/www/public/images/icons/brand/cli-gray-negative.svg deleted file mode 100644 index eaa2cee6601..00000000000 --- a/apps/www/public/images/icons/brand/cli-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/cli-gray.svg b/apps/www/public/images/icons/brand/cli-gray.svg deleted file mode 100644 index e44838f4b7a..00000000000 --- a/apps/www/public/images/icons/brand/cli-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/cli-green.svg b/apps/www/public/images/icons/brand/cli-green.svg deleted file mode 100644 index ab3012bccd9..00000000000 --- a/apps/www/public/images/icons/brand/cli-green.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/www/public/images/icons/brand/columns-gray-negative.svg b/apps/www/public/images/icons/brand/columns-gray-negative.svg deleted file mode 100644 index 767fc7c44e9..00000000000 --- a/apps/www/public/images/icons/brand/columns-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/columns-gray.svg b/apps/www/public/images/icons/brand/columns-gray.svg deleted file mode 100644 index bdf3c770bea..00000000000 --- a/apps/www/public/images/icons/brand/columns-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/columns-green.svg b/apps/www/public/images/icons/brand/columns-green.svg deleted file mode 100644 index e55340280d8..00000000000 --- a/apps/www/public/images/icons/brand/columns-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg b/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg deleted file mode 100644 index afc7ede37ff..00000000000 --- a/apps/www/public/images/icons/brand/custom-domains-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/custom-domains-gray.svg b/apps/www/public/images/icons/brand/custom-domains-gray.svg deleted file mode 100644 index 405ab724659..00000000000 --- a/apps/www/public/images/icons/brand/custom-domains-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/custom-domains-green.svg b/apps/www/public/images/icons/brand/custom-domains-green.svg deleted file mode 100644 index 48f15398d17..00000000000 --- a/apps/www/public/images/icons/brand/custom-domains-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg b/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg deleted file mode 100644 index 55685530c78..00000000000 --- a/apps/www/public/images/icons/brand/database-add-ons-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/database-add-ons-gray.svg b/apps/www/public/images/icons/brand/database-add-ons-gray.svg deleted file mode 100644 index 1a434548729..00000000000 --- a/apps/www/public/images/icons/brand/database-add-ons-gray.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/database-add-ons-green.svg b/apps/www/public/images/icons/brand/database-add-ons-green.svg deleted file mode 100644 index c893942cdc6..00000000000 --- a/apps/www/public/images/icons/brand/database-add-ons-green.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/database-gray-negative.svg b/apps/www/public/images/icons/brand/database-gray-negative.svg deleted file mode 100644 index 5e55c299c24..00000000000 --- a/apps/www/public/images/icons/brand/database-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/database-gray.svg b/apps/www/public/images/icons/brand/database-gray.svg deleted file mode 100644 index 56bc4ae60b2..00000000000 --- a/apps/www/public/images/icons/brand/database-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/database-green.svg b/apps/www/public/images/icons/brand/database-green.svg deleted file mode 100644 index 7919de28ca8..00000000000 --- a/apps/www/public/images/icons/brand/database-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/documentation-gray-negative.svg b/apps/www/public/images/icons/brand/documentation-gray-negative.svg deleted file mode 100644 index 9c9549935db..00000000000 --- a/apps/www/public/images/icons/brand/documentation-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/documentation-gray.svg b/apps/www/public/images/icons/brand/documentation-gray.svg deleted file mode 100644 index 9e4b7b66c91..00000000000 --- a/apps/www/public/images/icons/brand/documentation-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/documentation-green.svg b/apps/www/public/images/icons/brand/documentation-green.svg deleted file mode 100644 index 877b89de115..00000000000 --- a/apps/www/public/images/icons/brand/documentation-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg b/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg deleted file mode 100644 index 47168849c2b..00000000000 --- a/apps/www/public/images/icons/brand/edge-functions-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/edge-functions-gray.svg b/apps/www/public/images/icons/brand/edge-functions-gray.svg deleted file mode 100644 index 65b62e8f89e..00000000000 --- a/apps/www/public/images/icons/brand/edge-functions-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/edge-functions-green.svg b/apps/www/public/images/icons/brand/edge-functions-green.svg deleted file mode 100644 index cfe6bb89751..00000000000 --- a/apps/www/public/images/icons/brand/edge-functions-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/extensions-gray-negative.svg b/apps/www/public/images/icons/brand/extensions-gray-negative.svg deleted file mode 100644 index 6fdd405e034..00000000000 --- a/apps/www/public/images/icons/brand/extensions-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/extensions-gray.svg b/apps/www/public/images/icons/brand/extensions-gray.svg deleted file mode 100644 index fcd4c774c8b..00000000000 --- a/apps/www/public/images/icons/brand/extensions-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/extensions-green.svg b/apps/www/public/images/icons/brand/extensions-green.svg deleted file mode 100644 index bea58a73a02..00000000000 --- a/apps/www/public/images/icons/brand/extensions-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/getting-started-gray-negative.svg b/apps/www/public/images/icons/brand/getting-started-gray-negative.svg deleted file mode 100644 index 66a75217931..00000000000 --- a/apps/www/public/images/icons/brand/getting-started-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/getting-started-gray.svg b/apps/www/public/images/icons/brand/getting-started-gray.svg deleted file mode 100644 index b1ef015bec7..00000000000 --- a/apps/www/public/images/icons/brand/getting-started-gray.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/www/public/images/icons/brand/getting-started-green.svg b/apps/www/public/images/icons/brand/getting-started-green.svg deleted file mode 100644 index f24b5d6f883..00000000000 --- a/apps/www/public/images/icons/brand/getting-started-green.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/www/public/images/icons/brand/glossary-gray-negative.svg b/apps/www/public/images/icons/brand/glossary-gray-negative.svg deleted file mode 100644 index 48846d72ed6..00000000000 --- a/apps/www/public/images/icons/brand/glossary-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/glossary-gray.svg b/apps/www/public/images/icons/brand/glossary-gray.svg deleted file mode 100644 index 9931120ffa6..00000000000 --- a/apps/www/public/images/icons/brand/glossary-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/glossary-green.svg b/apps/www/public/images/icons/brand/glossary-green.svg deleted file mode 100644 index 7ab0359e7b9..00000000000 --- a/apps/www/public/images/icons/brand/glossary-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/guides-gray-negative.svg b/apps/www/public/images/icons/brand/guides-gray-negative.svg deleted file mode 100644 index 619dfc473e5..00000000000 --- a/apps/www/public/images/icons/brand/guides-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/guides-gray.svg b/apps/www/public/images/icons/brand/guides-gray.svg deleted file mode 100644 index 375fe6d5d8b..00000000000 --- a/apps/www/public/images/icons/brand/guides-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/guides-green.svg b/apps/www/public/images/icons/brand/guides-green.svg deleted file mode 100644 index 27863e00032..00000000000 --- a/apps/www/public/images/icons/brand/guides-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/home-gray-negative.svg b/apps/www/public/images/icons/brand/home-gray-negative.svg deleted file mode 100644 index ae023b5375a..00000000000 --- a/apps/www/public/images/icons/brand/home-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/home-gray.svg b/apps/www/public/images/icons/brand/home-gray.svg deleted file mode 100644 index ebfa14f7f23..00000000000 --- a/apps/www/public/images/icons/brand/home-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/home-green.svg b/apps/www/public/images/icons/brand/home-green.svg deleted file mode 100644 index 0a228053177..00000000000 --- a/apps/www/public/images/icons/brand/home-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/logs-gray-negative.svg b/apps/www/public/images/icons/brand/logs-gray-negative.svg deleted file mode 100644 index 234a573c22a..00000000000 --- a/apps/www/public/images/icons/brand/logs-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/logs-gray.svg b/apps/www/public/images/icons/brand/logs-gray.svg deleted file mode 100644 index 0e99fe1f216..00000000000 --- a/apps/www/public/images/icons/brand/logs-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/logs-green.svg b/apps/www/public/images/icons/brand/logs-green.svg deleted file mode 100644 index 52da7533ce1..00000000000 --- a/apps/www/public/images/icons/brand/logs-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/pitr-gray-negative.svg b/apps/www/public/images/icons/brand/pitr-gray-negative.svg deleted file mode 100644 index 378964e9333..00000000000 --- a/apps/www/public/images/icons/brand/pitr-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/pitr-gray.svg b/apps/www/public/images/icons/brand/pitr-gray.svg deleted file mode 100644 index c13962eae4f..00000000000 --- a/apps/www/public/images/icons/brand/pitr-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/pitr-green.svg b/apps/www/public/images/icons/brand/pitr-green.svg deleted file mode 100644 index f6269710023..00000000000 --- a/apps/www/public/images/icons/brand/pitr-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/platform-gray-negative.svg b/apps/www/public/images/icons/brand/platform-gray-negative.svg deleted file mode 100644 index bdff9e59d70..00000000000 --- a/apps/www/public/images/icons/brand/platform-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/platform-gray.svg b/apps/www/public/images/icons/brand/platform-gray.svg deleted file mode 100644 index 83483f36f32..00000000000 --- a/apps/www/public/images/icons/brand/platform-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/platform-green.svg b/apps/www/public/images/icons/brand/platform-green.svg deleted file mode 100644 index 2c73d35f721..00000000000 --- a/apps/www/public/images/icons/brand/platform-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/profile-gray-negative.svg b/apps/www/public/images/icons/brand/profile-gray-negative.svg deleted file mode 100644 index 2e4fe6c99e7..00000000000 --- a/apps/www/public/images/icons/brand/profile-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/profile-gray.svg b/apps/www/public/images/icons/brand/profile-gray.svg deleted file mode 100644 index 344fa4c16f3..00000000000 --- a/apps/www/public/images/icons/brand/profile-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/profile-green.svg b/apps/www/public/images/icons/brand/profile-green.svg deleted file mode 100644 index 4064771b4f8..00000000000 --- a/apps/www/public/images/icons/brand/profile-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg b/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg deleted file mode 100644 index ba08dbd69e7..00000000000 --- a/apps/www/public/images/icons/brand/read-replicas-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/read-replicas-gray.svg b/apps/www/public/images/icons/brand/read-replicas-gray.svg deleted file mode 100644 index abfb88d2213..00000000000 --- a/apps/www/public/images/icons/brand/read-replicas-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/read-replicas-green.svg b/apps/www/public/images/icons/brand/read-replicas-green.svg deleted file mode 100644 index c033c7189cf..00000000000 --- a/apps/www/public/images/icons/brand/read-replicas-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/realtime-gray-negative.svg b/apps/www/public/images/icons/brand/realtime-gray-negative.svg deleted file mode 100644 index e820eaae08f..00000000000 --- a/apps/www/public/images/icons/brand/realtime-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/realtime-gray.svg b/apps/www/public/images/icons/brand/realtime-gray.svg deleted file mode 100644 index a3bcf43ffdd..00000000000 --- a/apps/www/public/images/icons/brand/realtime-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/realtime-green.svg b/apps/www/public/images/icons/brand/realtime-green.svg deleted file mode 100644 index 1d5d535b40d..00000000000 --- a/apps/www/public/images/icons/brand/realtime-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/reports-gray-negative.svg b/apps/www/public/images/icons/brand/reports-gray-negative.svg deleted file mode 100644 index 3cea4f0d444..00000000000 --- a/apps/www/public/images/icons/brand/reports-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/reports-gray.svg b/apps/www/public/images/icons/brand/reports-gray.svg deleted file mode 100644 index 4e988b96331..00000000000 --- a/apps/www/public/images/icons/brand/reports-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/reports-green.svg b/apps/www/public/images/icons/brand/reports-green.svg deleted file mode 100644 index a04dc29b8e9..00000000000 --- a/apps/www/public/images/icons/brand/reports-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/roles-gray-negative.svg b/apps/www/public/images/icons/brand/roles-gray-negative.svg deleted file mode 100644 index bd12069792c..00000000000 --- a/apps/www/public/images/icons/brand/roles-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/roles-gray.svg b/apps/www/public/images/icons/brand/roles-gray.svg deleted file mode 100644 index 7764b8841bb..00000000000 --- a/apps/www/public/images/icons/brand/roles-gray.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/apps/www/public/images/icons/brand/roles-green.svg b/apps/www/public/images/icons/brand/roles-green.svg deleted file mode 100644 index 6ab8c3b3c05..00000000000 --- a/apps/www/public/images/icons/brand/roles-green.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/rows-gray-negative.svg b/apps/www/public/images/icons/brand/rows-gray-negative.svg deleted file mode 100644 index f0640712741..00000000000 --- a/apps/www/public/images/icons/brand/rows-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/rows-gray.svg b/apps/www/public/images/icons/brand/rows-gray.svg deleted file mode 100644 index f5320ce67bb..00000000000 --- a/apps/www/public/images/icons/brand/rows-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/rows-green.svg b/apps/www/public/images/icons/brand/rows-green.svg deleted file mode 100644 index 02b29c41d64..00000000000 --- a/apps/www/public/images/icons/brand/rows-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg b/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg deleted file mode 100644 index ea74756adce..00000000000 --- a/apps/www/public/images/icons/brand/self-hosting-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/self-hosting-gray.svg b/apps/www/public/images/icons/brand/self-hosting-gray.svg deleted file mode 100644 index 7a5e667ced1..00000000000 --- a/apps/www/public/images/icons/brand/self-hosting-gray.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/self-hosting-green.svg b/apps/www/public/images/icons/brand/self-hosting-green.svg deleted file mode 100644 index 9cc2c2ddfb8..00000000000 --- a/apps/www/public/images/icons/brand/self-hosting-green.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/settings-gray-negative.svg b/apps/www/public/images/icons/brand/settings-gray-negative.svg deleted file mode 100644 index 2b64a926831..00000000000 --- a/apps/www/public/images/icons/brand/settings-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/settings-gray.svg b/apps/www/public/images/icons/brand/settings-gray.svg deleted file mode 100644 index 2b62223d7bc..00000000000 --- a/apps/www/public/images/icons/brand/settings-gray.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/settings-green.svg b/apps/www/public/images/icons/brand/settings-green.svg deleted file mode 100644 index 2d149540e53..00000000000 --- a/apps/www/public/images/icons/brand/settings-green.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/storage-gray-negative.svg b/apps/www/public/images/icons/brand/storage-gray-negative.svg deleted file mode 100644 index 837bee9ee6d..00000000000 --- a/apps/www/public/images/icons/brand/storage-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/storage-gray.svg b/apps/www/public/images/icons/brand/storage-gray.svg deleted file mode 100644 index bef6045c255..00000000000 --- a/apps/www/public/images/icons/brand/storage-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/storage-green.svg b/apps/www/public/images/icons/brand/storage-green.svg deleted file mode 100644 index 55b6ca6367f..00000000000 --- a/apps/www/public/images/icons/brand/storage-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg b/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg deleted file mode 100644 index 4eaf7940385..00000000000 --- a/apps/www/public/images/icons/brand/support-add-ons-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/support-add-ons-gray.svg b/apps/www/public/images/icons/brand/support-add-ons-gray.svg deleted file mode 100644 index bd8647de63d..00000000000 --- a/apps/www/public/images/icons/brand/support-add-ons-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/support-add-ons-green.svg b/apps/www/public/images/icons/brand/support-add-ons-green.svg deleted file mode 100644 index 6ff5e144638..00000000000 --- a/apps/www/public/images/icons/brand/support-add-ons-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/support-gray-negative.svg b/apps/www/public/images/icons/brand/support-gray-negative.svg deleted file mode 100644 index c2f5ca07036..00000000000 --- a/apps/www/public/images/icons/brand/support-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/support-gray.svg b/apps/www/public/images/icons/brand/support-gray.svg deleted file mode 100644 index 7f0cddd1c45..00000000000 --- a/apps/www/public/images/icons/brand/support-gray.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/support-green.svg b/apps/www/public/images/icons/brand/support-green.svg deleted file mode 100644 index 0e3034f495a..00000000000 --- a/apps/www/public/images/icons/brand/support-green.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/apps/www/public/images/icons/brand/table-editor-gray-negative.svg b/apps/www/public/images/icons/brand/table-editor-gray-negative.svg deleted file mode 100644 index 53d8b392821..00000000000 --- a/apps/www/public/images/icons/brand/table-editor-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/table-editor-gray.svg b/apps/www/public/images/icons/brand/table-editor-gray.svg deleted file mode 100644 index 7c79f5d9512..00000000000 --- a/apps/www/public/images/icons/brand/table-editor-gray.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/table-editor-green.svg b/apps/www/public/images/icons/brand/table-editor-green.svg deleted file mode 100644 index a100b64c80f..00000000000 --- a/apps/www/public/images/icons/brand/table-editor-green.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/apps/www/public/images/icons/brand/tables-gray-negative.svg b/apps/www/public/images/icons/brand/tables-gray-negative.svg deleted file mode 100644 index 0156ae2f417..00000000000 --- a/apps/www/public/images/icons/brand/tables-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/tables-gray.svg b/apps/www/public/images/icons/brand/tables-gray.svg deleted file mode 100644 index 3f7f4a54554..00000000000 --- a/apps/www/public/images/icons/brand/tables-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/tables-green.svg b/apps/www/public/images/icons/brand/tables-green.svg deleted file mode 100644 index 509103462b1..00000000000 --- a/apps/www/public/images/icons/brand/tables-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/tutorials-gray-negative.svg b/apps/www/public/images/icons/brand/tutorials-gray-negative.svg deleted file mode 100644 index 08a86d1254d..00000000000 --- a/apps/www/public/images/icons/brand/tutorials-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/tutorials-gray.svg b/apps/www/public/images/icons/brand/tutorials-gray.svg deleted file mode 100644 index df4b35c7489..00000000000 --- a/apps/www/public/images/icons/brand/tutorials-gray.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/tutorials-green.svg b/apps/www/public/images/icons/brand/tutorials-green.svg deleted file mode 100644 index a4787fd42a3..00000000000 --- a/apps/www/public/images/icons/brand/tutorials-green.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/apps/www/public/images/icons/brand/wrappers-gray-negative.svg b/apps/www/public/images/icons/brand/wrappers-gray-negative.svg deleted file mode 100644 index b9825cc8b84..00000000000 --- a/apps/www/public/images/icons/brand/wrappers-gray-negative.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/www/public/images/icons/brand/wrappers-gray.svg b/apps/www/public/images/icons/brand/wrappers-gray.svg deleted file mode 100644 index 6b504f78bf5..00000000000 --- a/apps/www/public/images/icons/brand/wrappers-gray.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/icons/brand/wrappers-green.svg b/apps/www/public/images/icons/brand/wrappers-green.svg deleted file mode 100644 index 970028b1b07..00000000000 --- a/apps/www/public/images/icons/brand/wrappers-green.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/apps/www/public/images/pricing/addons-custom-domain-hero-light.svg b/apps/www/public/images/pricing/addons-custom-domain-hero-light.svg new file mode 100644 index 00000000000..0b6cd42fcad --- /dev/null +++ b/apps/www/public/images/pricing/addons-custom-domain-hero-light.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-custom-domain-hero.svg b/apps/www/public/images/pricing/addons-custom-domain-hero.svg new file mode 100644 index 00000000000..9522f483565 --- /dev/null +++ b/apps/www/public/images/pricing/addons-custom-domain-hero.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-pitr-light.svg b/apps/www/public/images/pricing/addons-pitr-light.svg new file mode 100644 index 00000000000..ec8f6511785 --- /dev/null +++ b/apps/www/public/images/pricing/addons-pitr-light.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-pitr.svg b/apps/www/public/images/pricing/addons-pitr.svg new file mode 100644 index 00000000000..9136cffa38d --- /dev/null +++ b/apps/www/public/images/pricing/addons-pitr.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-support-light.svg b/apps/www/public/images/pricing/addons-support-light.svg new file mode 100644 index 00000000000..040e497a537 --- /dev/null +++ b/apps/www/public/images/pricing/addons-support-light.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/addons-support.svg b/apps/www/public/images/pricing/addons-support.svg new file mode 100644 index 00000000000..628bf43d9df --- /dev/null +++ b/apps/www/public/images/pricing/addons-support.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/public/images/pricing/pitr-upgrade-light.svg b/apps/www/public/images/pricing/pitr-upgrade-light.svg new file mode 100644 index 00000000000..57a36a937f1 --- /dev/null +++ b/apps/www/public/images/pricing/pitr-upgrade-light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/pitr-upgrade.svg b/apps/www/public/images/pricing/pitr-upgrade.svg new file mode 100644 index 00000000000..238a81aaf80 --- /dev/null +++ b/apps/www/public/images/pricing/pitr-upgrade.svg @@ -0,0 +1,7 @@ + + + + + + + From 13f8aa5458094bf16fb66044c53791b809f849a7 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Thu, 19 Jan 2023 16:38:47 -0330 Subject: [PATCH 008/207] Update --- .../Pricing/ComputePricingModal.tsx | 35 ++++-- .../components/Pricing/PricingTableRow.tsx | 17 ++- apps/www/data/Pricing.json | 110 ++++++++++++------ apps/www/data/PricingAddOnTable.json | 60 ++-------- apps/www/pages/pricing/index.tsx | 38 +++--- .../images/pricing/compute-upgrade-green.svg | 9 ++ apps/www/public/images/pricing/spend-cap.svg | 1 + 7 files changed, 141 insertions(+), 129 deletions(-) create mode 100644 apps/www/public/images/pricing/compute-upgrade-green.svg create mode 100644 apps/www/public/images/pricing/spend-cap.svg diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index b56881abb0c..d88a622361a 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -1,14 +1,15 @@ import React, { Fragment, useMemo } from 'react' - +import { useRouter } from 'next/router' +import { useTheme } from 'common/Providers' import { IconCheckCircle, IconXCircle, Modal } from 'ui' import pricingAddOn from '~/data/PricingAddOnTable.json' - interface Props { showComputeModal: boolean setShowComputeModal: React.Dispatch> } export default function ComputePricingModal({ showComputeModal, setShowComputeModal }: Props) { + const { basePath } = useRouter() const columnNames = useMemo( () => pricingAddOn.database.rows.map((row) => @@ -36,13 +37,25 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo
-

Choose best compute setup for you

-

- Every project on the Supabase Platform comes with its own dedicated Postgres instance - running inside a virtual machine (VM). The following table describes the base instance - with additional compute add-ons available if you need extra performance when scaling - up Supabase. -

+
+
+
+ +
+
+
+

Choose best compute setup for you

+

+ Every project on the Supabase Platform comes with its own dedicated Postgres + instance running inside a virtual machine (VM). The following table describes the + base instance with additional compute add-ons available if you need extra + performance when scaling up Supabase. +

+
+
Pricing plan comparison
Feature by - Plans
- Free -
-
- Pro -
-
- Enterprise -
-
+

+ {tier.name} +

+
+
+

{tier.description}

+
+
- Pricing - -
- $0 -

/project/month

+ {tiers.map((tier) => ( +
+
+
+ {tier.priceMonthly && ( + <> + + ${tier.priceMonthly} + +

per project per month

+ + )} -

Perfect for hobby projects and experiments

+ {tier.warning && ( +

+ + {tier.warning} + +

+ )} - - - - - -
-
-
- $25 -

/project/month + usage costs

- -

- Everything you need to scale your project into production -

- - - - - - -
-
-
- Contact Us -

for a quote

- -

- Designated support team, account manager and technical specialist -

- - - - - - -
-
@@ -57,7 +70,7 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo {pricingAddOn.database.rows.map((row, i) => ( - <> + {i === 0 && ( ))} - + ))}
@@ -86,7 +99,7 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo
diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index f546208082e..b8b5a314358 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -1,6 +1,6 @@ import { IconHelpCircle, IconInfo, IconX, IconXCircle, Modal } from 'ui' import ProductIcon from 'components/ProductIcon' -import React, { useState } from 'react' +import React, { Fragment, useState } from 'react' import ReactTooltip from 'react-tooltip' export const Check = () => ( @@ -70,17 +70,17 @@ export const PricingTableRowDesktop = (props: any) => { {category.features.map((feat: any, i: number) => { return ( - <> + {feat.title} - {feat.tooltip && !feat.tooltipPosition && ( + {feat.tooltips?.main && ( @@ -107,15 +107,14 @@ export const PricingTableRowDesktop = (props: any) => {
) : ( - {feat.tooltip && feat.tooltipPosition === tierName && ( + {feat.tooltips?.[tierName] && ( - + )} - {tierValue} )} @@ -126,7 +125,7 @@ export const PricingTableRowDesktop = (props: any) => { {i === category.features.length - 1 && (
)} - + ) })} diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index 860d7421130..4607d7c5dd6 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -5,7 +5,9 @@ "features": [ { "title": "Dedicated Postgres Database", - "tooltip": "A Postgres database with no restrictions? You get it. No pseudo limited users, you are the postgres root user. No caveats.", + "tooltips": { + "main": "A Postgres database with no restrictions? You get it. No pseudo limited users, you are the postgres root user. No caveats." + }, "tiers": { "free": true, "pro": true, @@ -24,20 +26,25 @@ }, { "title": "Database space", + "tooltips": { + "pro": "8 GB included, then $0.125 per GB" + }, "tiers": { - "free": "Up to 500 MB", - "pro": "8 GB included, then $0.125 per GB", + "free": "500 MB", + "pro": "8 GB", "team": "text", "enterprise": "Unlimited" } }, { "title": "Automatic backups", - "tooltip": "Backups are entire copies of your database that can be restored in the future.", - "tooltipPosition": "pro", + "tooltips": { + "main": "Backups are entire copies of your database that can be restored in the future.", + "pro": "7 days of backup (if > 1TB, contact for Enterprise pricing)" + }, "tiers": { "free": false, - "pro": "7 days of backup* (* if > 1TB, contact enterprise)", + "pro": "7 days", "team": "text", "enterprise": "Custom" } @@ -53,9 +60,11 @@ }, { "title": "Pausing", - "tooltip": "Projects that have no activity or API requests will be paused. They can be reactivated via the dashboard", + "tooltips": { + "main": "Projects that have no activity or API requests will be paused. They can be reactivated via the dashboard" + }, "tiers": { - "free": "Paused after 1 week inactivity", + "free": "After 1 inactive week", "pro": "Never", "team": "text", "enterprise": "Never" @@ -63,10 +72,13 @@ }, { "title": "Database egress", - "tooltip": "Good news, only download operations are counted towards the limit", + "tooltips": { + "main": "Good news, only download operations are counted towards the limit", + "pro": "50GB included per month, then $0.09 per GB" + }, "tiers": { - "free": "Up to 2GB", - "pro": "50GB included per month, then $0.09 per GB", + "free": "2GB", + "pro": "50GB", "team": "text", "enterprise": "Unlimited" } @@ -79,7 +91,7 @@ "features": [ { "title": "Total Users", - "tooltip": "The maximum number of users your project can have", + "tooltips": { "main": "The maximum number of users your project can have" }, "tiers": { "free": "Unlimited", "pro": "Unlimited", @@ -89,10 +101,13 @@ }, { "title": "MAUs", - "tooltip": "Monthly Active Users; a user that has made an API request in the last month.", + "tooltips": { + "main": "Monthly Active Users; a user that has made an API request in the last month.", + "pro": "100,000 included, then $0.00325 per MAU" + }, "tiers": { - "free": "Up to 50,000 MAUs", - "pro": "100,000 included, then $0.00325 per MAU", + "free": "50,000", + "pro": "100,000", "team": "text", "enterprise": "Unlimited" } @@ -153,7 +168,7 @@ }, { "title": "Supabase Auth emails", - "tooltip": "Rate limits do not apply to Custom SMTP", + "tooltips": { "main": "Rate limits do not apply to Custom SMTP" }, "tiers": { "free": "30 / hour", "pro": "100 / hour", @@ -175,22 +190,27 @@ "storage": { "title": "Storage", "icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4", + "features": [ { "title": "Storage", + "tooltips": { "pro": "100 GB included, then $0.021 per GB" }, "tiers": { - "free": "Up to 1 GB", - "pro": "100 GB included, then $0.021 per GB", + "free": "1 GB", + "pro": "100 GB", "team": "text", "enterprise": "Unlimited" } }, { "title": "Storage egress", - "tooltip": "Good news, only download operations are counted towards the limit", + "tooltips": { + "main": "Good news, only download operations are counted towards the limit", + "pro": "200 GB included, then $0.09 per GB" + }, "tiers": { - "free": "Up to 2 GB", - "pro": "200 GB included, then $0.09 per GB", + "free": "2 GB", + "pro": "200 GB", "team": "text", "enterprise": "Unlimited" } @@ -205,19 +225,20 @@ }, { "title": "Max file upload size", - "tooltip": "You can change the upload size in the dashboard", + "tooltips": { "main": "You can change the upload size in the dashboard" }, "tiers": { - "free": "Up to 50MB", - "pro": "Up to 5GB", + "free": "50MB", + "pro": "5GB", "team": "text", "enterprise": "Unlimited" } }, { "title": "Asset transformations", + "tooltips": { "pro": "5$ per 1000 origin images after the first 100" }, "tiers": { "free": false, - "pro": "Unlimited transformations for 100 origin images, then 5$ per 1000 origin images", + "pro": "Unlimited for 100 origin images", "team": "text", "enterprise": "Unlimited" } @@ -230,9 +251,12 @@ "features": [ { "title": "Invocations", + "tooltips": { + "pro": "2 Million per month, then $2 per 1 million invocations" + }, "tiers": { - "free": "500K per month", - "pro": "2 Million per month, then $2 per 1 million invocations", + "free": "500K/month", + "pro": "2 Million/month", "team": "text", "enterprise": "Unlimited" } @@ -240,17 +264,20 @@ { "title": "Script size", "tiers": { - "free": "2 mb", - "pro": "10 mb", + "free": "2 MB", + "pro": "10 MB", "team": "text", "enterprise": "Unlimited" } }, { "title": "Number of functions", + "tooltips": { + "pro": "100, then $10 per additional 100 functions" + }, "tiers": { "free": "10", - "pro": "100, then $10 per additional 100 functions", + "pro": "100", "team": "text", "enterprise": "Unlimited" } @@ -272,17 +299,23 @@ }, { "title": "Concurrent Peak Connections", + "tooltips": { + "pro": "Up to 500, then $10 per 1000" + }, "tiers": { - "free": "Up to 200", - "pro": "Up to 500, then $10 per 1000", + "free": "200", + "pro": "500", "team": "text", "enterprise": "Unlimited concurrent connections and volume discount" } }, { "title": "Max Messages Per Month", + "tooltips": { + "free": "2 Million (including database)" + }, "tiers": { - "free": "2 Million (including database)", + "free": "2 Million", "pro": "5 Million", "team": "text", "enterprise": "Volume discounts on messages" @@ -291,8 +324,8 @@ { "title": "Max Message Size", "tiers": { - "free": "250 Kb", - "pro": "3 Mb", + "free": "250 KB", + "pro": "3 MB", "team": "text", "enterprise": "Custom" } @@ -419,12 +452,15 @@ }, { "title": "Custom Domains", - "tooltip": "Contact us to access this feature", + "tooltips": { + "main": "Contact us to access this feature", + "enterprise": "Volume discounts available." + }, "tiers": { "free": false, "pro": "$10 per domain per month per project add on", "team": "text", - "enterprise": "1 included, additional custom domains $10 per custom domain per month. Volume discounts available." + "enterprise": "1 included, additional $10/domain/month" } } ] diff --git a/apps/www/data/PricingAddOnTable.json b/apps/www/data/PricingAddOnTable.json index e20da275960..031f8ecbe74 100644 --- a/apps/www/data/PricingAddOnTable.json +++ b/apps/www/data/PricingAddOnTable.json @@ -16,11 +16,7 @@ { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "1 GB" }, { "key": "maxDiskIO", "title": "Disk IO Bandwidth up to", "value": "2,606 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "87 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct", @@ -41,11 +37,7 @@ { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "2 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "174 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -66,11 +58,7 @@ { "key": "dedicated", "title": "Dedicated", "value": false }, { "key": "memory", "title": "Memory", "value": "4 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "2,606 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "347 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -91,11 +79,7 @@ { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "8 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "630 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -116,11 +100,7 @@ { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "16 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "1,188 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -141,11 +121,7 @@ { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "32 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "2,375 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -166,11 +142,7 @@ { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "64 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "4,750 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "4,750 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -191,11 +163,7 @@ { "key": "dedicated", "title": "Dedicated", "value": true }, { "key": "memory", "title": "Memory", "value": "128 GB" }, { "key": "maxDiskIO", "title": "Maximum Disk IO Bandwidth", "value": "9,500 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "9,500 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -220,11 +188,7 @@ "title": "Maximum Disk IO Bandwidth", "value": "14,250 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "14,250 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", @@ -249,11 +213,7 @@ "title": "Maximum Disk IO Bandwidth", "value": "19,000 Mbps" }, - { - "key": "baseDiskIO", - "title": "Baseline Disk IO Bandwidth", - "value": "19,000 Mbps" - }, + { "key": "directConnections", "title": "Connections: Direct (recommended)", diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 89c21f0ffec..67aa7f80c60 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -145,18 +145,6 @@ export default function IndexPage() { rightCtaText: 'See Pricing breakdown', rightCtaLink: '#open-modal', }, - { - name: 'Dedicated Support', - heroImg: 'addons-support', - icon: 'support-upgrade', - price: 'Starts from $5', - description: - 'Your own team who can help you with your account and any technical issues you might come across.', - leftCtaText: 'Documentation', - leftCtaLink: 'http://.....', - rightCtaText: 'Contact Sales', - rightCtaLink: 'http://', - }, { name: 'Custom Domain', heroImg: 'addons-custom-domain-hero', @@ -263,6 +251,7 @@ export default function IndexPage() {
{tiers.map((tier) => (
-
+
{addons.map((addon) => ( -
+
-
+
Available for Pro plan

Flexible Spend Cap

-

+

Ensure you have the flexibility to scale your business without the restrictions of Pro usage limits. Turn off the usage cap to let your project scale and only pay for what - you use.{' '} + you use.

-
right
+
+ +
-
+ {/*
} pricing={pricingAddOn.database} @@ -475,7 +467,7 @@ export default function IndexPage() { icon={} pricing={pricingAddOn.support} /> -
+
*/}
@@ -660,8 +652,9 @@ export default function IndexPage() { {tiers.map((tier) => (

{tier.name} @@ -684,6 +677,7 @@ export default function IndexPage() {

{tier.description}

{tiers.map((tier) => ( - +
{tier.priceMonthly && ( diff --git a/apps/www/public/images/pricing/compute-upgrade-green.svg b/apps/www/public/images/pricing/compute-upgrade-green.svg new file mode 100644 index 00000000000..4f3520fd0d5 --- /dev/null +++ b/apps/www/public/images/pricing/compute-upgrade-green.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/www/public/images/pricing/spend-cap.svg b/apps/www/public/images/pricing/spend-cap.svg new file mode 100644 index 00000000000..7078422fb38 --- /dev/null +++ b/apps/www/public/images/pricing/spend-cap.svg @@ -0,0 +1 @@ + \ No newline at end of file From 04d215c10440bfc5b437d34b53f17f810dd480cb Mon Sep 17 00:00:00 2001 From: Rodrigo Mansueli Nunes Date: Thu, 19 Jan 2023 17:35:03 -0300 Subject: [PATCH 009/207] update confirmation template to use GoTrue's template --- studio/pages/api/auth/[ref]/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/studio/pages/api/auth/[ref]/config.ts b/studio/pages/api/auth/[ref]/config.ts index d7f62b2de4d..9db70f40ed4 100644 --- a/studio/pages/api/auth/[ref]/config.ts +++ b/studio/pages/api/auth/[ref]/config.ts @@ -114,7 +114,7 @@ const handleGetAll = async (req: NextApiRequest, res: NextApiResponse) => { '

You have been invited

\n\n

You have been invited to create a user on {{ .SiteURL }}. Follow this link to accept the invite:

\n

Accept the invite

', MAILER_TEMPLATES_CONFIRMATION: null, MAILER_TEMPLATES_CONFIRMATION_CONTENT: - '

Confirm your signup

\n\n

Follow this link to confirm your user:

\n

Confirm your mail

', + '

Confirm your email

\n\n

Follow this link to confirm your email:

\n\n

Confirm your email address

\n\n

Alternatively, enter the code: {{ .Token }}

', MAILER_TEMPLATES_RECOVERY: null, MAILER_TEMPLATES_RECOVERY_CONTENT: '

Reset Password

\n\n

Follow this link to reset the password for your user:

\n

Reset Password

', From 55ad72b710c2e367a5cf6dcb1c727eaf63df572a Mon Sep 17 00:00:00 2001 From: Rodrigo Mansueli Nunes Date: Fri, 20 Jan 2023 09:29:07 -0300 Subject: [PATCH 010/207] Removed the token part as suggested. --- studio/pages/api/auth/[ref]/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/studio/pages/api/auth/[ref]/config.ts b/studio/pages/api/auth/[ref]/config.ts index 9db70f40ed4..66545dba0ae 100644 --- a/studio/pages/api/auth/[ref]/config.ts +++ b/studio/pages/api/auth/[ref]/config.ts @@ -114,7 +114,7 @@ const handleGetAll = async (req: NextApiRequest, res: NextApiResponse) => { '

You have been invited

\n\n

You have been invited to create a user on {{ .SiteURL }}. Follow this link to accept the invite:

\n

Accept the invite

', MAILER_TEMPLATES_CONFIRMATION: null, MAILER_TEMPLATES_CONFIRMATION_CONTENT: - '

Confirm your email

\n\n

Follow this link to confirm your email:

\n\n

Confirm your email address

\n\n

Alternatively, enter the code: {{ .Token }}

', + '

Confirm your email

\n\n

Follow this link to confirm your email:

\n\n

Confirm your email address

', MAILER_TEMPLATES_RECOVERY: null, MAILER_TEMPLATES_RECOVERY_CONTENT: '

Reset Password

\n\n

Follow this link to reset the password for your user:

\n

Reset Password

', From 38194ed378bb3af4c9f04986e4b8cdb357208c53 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Fri, 20 Jan 2023 15:49:42 +0100 Subject: [PATCH 011/207] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a3948c8e6fa..d6e64787c67 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ -![main image](https://user-images.githubusercontent.com/8291514/191737114-3b8e4985-7b91-4fc9-92ce-3106915e0a06.png) +

+ + +

--- From 9f75c8e53379d17f21cfdda24c71aa8735d72c8c Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Fri, 20 Jan 2023 15:50:42 +0100 Subject: [PATCH 012/207] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d6e64787c67..a4d6547d45c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- - + +

--- From 3cb9173c048d0b93bb697ca6921060580da5d04c Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Fri, 20 Jan 2023 15:51:07 +0100 Subject: [PATCH 013/207] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a4d6547d45c..25b27da9039 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- - + +

--- From c86e736575f445c8310a4e69fe37f850031b6d1b Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Fri, 20 Jan 2023 15:51:51 +0100 Subject: [PATCH 014/207] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 25b27da9039..1e8e34a634f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- - + +

--- From 53ca3988e57a1c5dfc5ffc73232bb84ff5442311 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Fri, 20 Jan 2023 15:18:20 -0330 Subject: [PATCH 015/207] Update --- .../Pricing/ComputePricingModal.tsx | 5 +- .../components/Pricing/PricingTableRow.tsx | 12 +- apps/www/components/ProductIcon.tsx | 7 +- apps/www/data/Pricing.json | 94 +++--- apps/www/pages/pricing/index.tsx | 152 +++++----- .../images/pricing/compute-upgrade-green.svg | 14 +- .../public/images/pricing/spend-cap-light.svg | 271 ++++++++++++++++++ apps/www/styles/index.css | 2 +- 8 files changed, 416 insertions(+), 141 deletions(-) create mode 100644 apps/www/public/images/pricing/spend-cap-light.svg diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index d88a622361a..2c497a334b2 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -10,6 +10,7 @@ interface Props { export default function ComputePricingModal({ showComputeModal, setShowComputeModal }: Props) { const { basePath } = useRouter() + const { isDarkMode } = useTheme() const columnNames = useMemo( () => pricingAddOn.database.rows.map((row) => @@ -42,7 +43,9 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo
diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index b8b5a314358..925bd2c9454 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -5,7 +5,7 @@ import ReactTooltip from 'react-tooltip' export const Check = () => ( { style={{ borderTop: 'none' }} >
@@ -62,10 +62,10 @@ export const PricingTableRowDesktop = (props: any) => {

{category.title}

- - - - + + + + {category.features.map((feat: any, i: number) => { diff --git a/apps/www/components/ProductIcon.tsx b/apps/www/components/ProductIcon.tsx index fa2240071a4..894c7ea5117 100644 --- a/apps/www/components/ProductIcon.tsx +++ b/apps/www/components/ProductIcon.tsx @@ -9,11 +9,14 @@ function ProductIcon({ icon, color }: ProductIcon) { className={[ 'inline-flex h-8 w-8 items-center justify-center rounded-md', !color || color === 'black' ? 'bg-scale-1200 text-scale-100' : '', - color && color === 'green' ? 'bg-brand-800 text-brand-100' : '', + color && color === 'green' ? 'bg-brand-800 dark:bg-brand-600 text-brand-100' : '', ].join(' ')} > { return (
-

{tier}

+

+ {tier} +

{from && From} - - {showDollarSign && '$'} - {price} - + {showDollarSign ? ( + ${price} + ) : ( + {price} + )} +

{priceDescription}

{description}

@@ -248,12 +252,14 @@ export default function IndexPage() { lg:px-8 " > -
+
{tiers.map((tier) => (
{tier.name === 'Pro' && ( @@ -279,20 +285,22 @@ export default function IndexPage() { )}
-

{tier.description}

-
+ {tier.description} +

+ + {tier.name !== 'Enterprise' && ( +
- {tier.priceMonthly !== undefined ? ( + >
@@ -300,8 +308,7 @@ export default function IndexPage() { {tier.priceLabel}

- {typeof tier.priceMonthly !== 'string' && '$'} - {tier.priceMonthly} + ${tier.priceMonthly}

{tier.costUnit && (

{tier.costUnit}

@@ -315,31 +322,21 @@ export default function IndexPage() {
- ) : ( - Contact Us - )} -
+
+ )}
{tier.preface && ( -

{tier.preface}

+

{tier.preface}

)} {/*

Included with plan:

*/}
    {tier.features.map((feature) => (
  • @@ -388,7 +385,7 @@ export default function IndexPage() {

-
+
{addons.map((addon) => (
@@ -399,7 +396,7 @@ export default function IndexPage() { }.svg`} />
-
+

{addon.price}

{addon.description}

- -
+
Available for Pro plan -

Flexible Spend Cap

+

Cost control with spend caps

- Ensure you have the flexibility to scale your business without the restrictions of Pro - usage limits. Turn off the usage cap to let your project scale and only pay for what - you use. + The Pro tier has a usage quota included and a spend cap turned on by default. If you + need to go beyond the inclusive limits, simply switch off your spend cap to pay for + additional usage.

- +
@@ -637,10 +637,10 @@ export default function IndexPage() {
- + {tiers.map((tier) => (
Pricing plan comparison
Feature by @@ -652,7 +652,7 @@ export default function IndexPage() { {tiers.map((tier) => ( @@ -669,13 +669,13 @@ export default function IndexPage() {
@@ -698,7 +698,7 @@ export default function IndexPage() {
- {tier.priceMonthly && ( + {tier.name !== 'Enterprise' && ( <> ${tier.priceMonthly} diff --git a/apps/www/public/images/pricing/compute-upgrade-green.svg b/apps/www/public/images/pricing/compute-upgrade-green.svg index 4f3520fd0d5..e8b6258fb32 100644 --- a/apps/www/public/images/pricing/compute-upgrade-green.svg +++ b/apps/www/public/images/pricing/compute-upgrade-green.svg @@ -1,9 +1,7 @@ - - - - - - - - + + + + + + diff --git a/apps/www/public/images/pricing/spend-cap-light.svg b/apps/www/public/images/pricing/spend-cap-light.svg new file mode 100644 index 00000000000..dd604f1e5ce --- /dev/null +++ b/apps/www/public/images/pricing/spend-cap-light.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css index 585cc7cfb1e..c76b18851d6 100644 --- a/apps/www/styles/index.css +++ b/apps/www/styles/index.css @@ -674,7 +674,7 @@ launch week } .gradient-text-scale-100 { - background-image: -webkit-linear-gradient(45deg, #fff 0%, var(--colors-green4) 100%); + background-image: -webkit-linear-gradient(45deg, #fff 0%, var(--colors-green12) 100%); } .gradient-text-scale-500 { From 65b78c164e2f844cbdba79899258f5892b70f65e Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Fri, 20 Jan 2023 15:46:19 -0330 Subject: [PATCH 016/207] Update mobile header --- apps/www/pages/pricing/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index b52dfe77ffc..c103257e777 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -536,7 +536,7 @@ export default function IndexPage() { {/* Pro - Mobile */} Date: Fri, 20 Jan 2023 15:51:28 -0330 Subject: [PATCH 017/207] Update pricing.json --- apps/www/data/Pricing.json | 52 +++----------------------------------- 1 file changed, 4 insertions(+), 48 deletions(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index 24d2e3e51da..3de5edaa2d8 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -11,7 +11,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -20,7 +19,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -32,7 +30,6 @@ "tiers": { "free": "500 MB", "pro": "8 GB", - "enterprise": "Unlimited" } }, @@ -45,16 +42,17 @@ "tiers": { "free": false, "pro": "7 days", - "enterprise": "Custom" } }, { "title": "Point in time recovery", + "tooltips": { + "main": "PITR cannot be applied retroactively, projects can only be rolled back to the point from which PITR has been applied." + }, "tiers": { "free": false, - "pro": false, - + "pro": "$100 per 7 day rollback period (if > 28 days, contact enterprise)", "enterprise": true } }, @@ -66,7 +64,6 @@ "tiers": { "free": "After 1 inactive week", "pro": "Never", - "enterprise": "Never" } }, @@ -79,7 +76,6 @@ "tiers": { "free": "2GB", "pro": "50GB", - "enterprise": "Unlimited" } } @@ -95,7 +91,6 @@ "tiers": { "free": "Unlimited", "pro": "Unlimited", - "enterprise": "Unlimited" } }, @@ -108,7 +103,6 @@ "tiers": { "free": "50,000", "pro": "100,000", - "enterprise": "Unlimited" } }, @@ -117,7 +111,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -126,7 +119,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -135,7 +127,6 @@ "tiers": { "free": false, "pro": true, - "enterprise": true } }, @@ -144,7 +135,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -153,7 +143,6 @@ "tiers": { "free": "1 hour", "pro": "7 days", - "enterprise": true } }, @@ -162,7 +151,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -172,7 +160,6 @@ "tiers": { "free": "30 / hour", "pro": "100 / hour", - "enterprise": "Contact Us" } }, @@ -181,7 +168,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": "Contact Us" } } @@ -198,7 +184,6 @@ "tiers": { "free": "1 GB", "pro": "100 GB", - "enterprise": "Unlimited" } }, @@ -211,7 +196,6 @@ "tiers": { "free": "2 GB", "pro": "200 GB", - "enterprise": "Unlimited" } }, @@ -229,7 +213,6 @@ "tiers": { "free": "50MB", "pro": "5GB", - "enterprise": "Unlimited" } }, @@ -239,7 +222,6 @@ "tiers": { "free": false, "pro": "Unlimited for 100 origin images", - "enterprise": "Unlimited" } } @@ -257,7 +239,6 @@ "tiers": { "free": "500K/month", "pro": "2 Million/month", - "enterprise": "Unlimited" } }, @@ -266,7 +247,6 @@ "tiers": { "free": "2 MB", "pro": "10 MB", - "enterprise": "Unlimited" } }, @@ -278,7 +258,6 @@ "tiers": { "free": "10", "pro": "100", - "enterprise": "Unlimited" } } @@ -293,7 +272,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -305,7 +283,6 @@ "tiers": { "free": "200", "pro": "500", - "enterprise": "Unlimited concurrent connections and volume discount" } }, @@ -317,7 +294,6 @@ "tiers": { "free": "2 Million", "pro": "5 Million", - "enterprise": "Volume discounts on messages" } }, @@ -326,7 +302,6 @@ "tiers": { "free": "250 KB", "pro": "3 MB", - "enterprise": "Custom" } } @@ -341,7 +316,6 @@ "tiers": { "free": "Unlimited", "pro": "Unlimited", - "enterprise": "Unlimited" } }, @@ -350,7 +324,6 @@ "tiers": { "free": "Coming soon", "pro": "Coming soon", - "enterprise": true } }, @@ -359,7 +332,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } } @@ -374,7 +346,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -383,7 +354,6 @@ "tiers": { "free": "1 day", "pro": "7 days", - "enterprise": "90 days" } }, @@ -392,7 +362,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": "Coming soon" } }, @@ -401,7 +370,6 @@ "tiers": { "free": false, "pro": true, - "enterprise": true } }, @@ -410,7 +378,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -419,7 +386,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": "Contact Us" } }, @@ -428,7 +394,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -437,7 +402,6 @@ "tiers": { "free": "Owner, Developer", "pro": "Owner, Developer", - "enterprise": "Additional owner(s), admin, read-only, billing admin, custom" } }, @@ -446,7 +410,6 @@ "tiers": { "free": false, "pro": true, - "enterprise": true } }, @@ -459,7 +422,6 @@ "tiers": { "free": false, "pro": "$10 per domain per month per project add on", - "enterprise": "1 included, additional $10/domain/month" } } @@ -474,7 +436,6 @@ "tiers": { "free": true, "pro": true, - "enterprise": true } }, @@ -483,7 +444,6 @@ "tiers": { "free": false, "pro": true, - "enterprise": true } }, @@ -492,7 +452,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -501,7 +460,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -518,7 +476,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } }, @@ -527,7 +484,6 @@ "tiers": { "free": false, "pro": false, - "enterprise": true } } From c2637879a00cdb4be78d332eded2a14c493ef47e Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Mon, 23 Jan 2023 11:36:36 -0330 Subject: [PATCH 018/207] Updates --- .../Pricing/ComputePricingModal.tsx | 2 +- .../components/Pricing/PricingTableRow.tsx | 2 +- apps/www/pages/pricing/index.tsx | 38 +++++++++---------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index 2c497a334b2..18605613266 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -39,7 +39,7 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo
-
+
( { return (
-

+

{tier}

@@ -228,7 +228,7 @@ export default function IndexPage() { }} /> -
+
@@ -258,7 +258,7 @@ export default function IndexPage() { key={`row-${tier.name}`} className={[ tier.name === 'Pro' - ? 'bg-brand-800 dark:bg-brand-900 border px-0.5 -mt-8 rounded-xl' + ? 'bg-brand-1100 dark:bg-brand-900 border px-0.5 -mt-8 rounded-xl' : '', ].join(' ')} > @@ -269,13 +269,16 @@ export default function IndexPage() { key={tier.name} className={[ 'flex flex-col overflow-hidden rounded-xl', - tier.name === 'Pro' ? '' : 'border h-full', + tier.name === 'Pro' ? '' : 'border h-full rounded-xl', ].join(' ')} >
-

+

{tier.name}

{tier.nameBadge && ( @@ -326,18 +329,17 @@ export default function IndexPage() { )}
{tier.preface && (

{tier.preface}

)} {/*

Included with plan:

*/} -
-
+

Easily customizable add-Ons

From acf7e288ef6fd19c30c5bd9e61492adf5225ec32 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 24 Jan 2023 12:00:48 -0330 Subject: [PATCH 025/207] Svg fix --- apps/www/components/Pricing/PricingTableRow.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index 0ef11772df2..90e8979b897 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -7,9 +7,9 @@ export const Check = () => ( ) @@ -32,9 +32,9 @@ const Minus = (props: any) => ( > Not included in {props.tier} @@ -52,9 +52,9 @@ const InfoIcon = () => ( > Info From 258b8380e40478dcbe5c79891268118b44fd7a2c Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 24 Jan 2023 12:56:55 -0330 Subject: [PATCH 026/207] update --- apps/www/components/Pricing/PricingTableRow.tsx | 2 +- apps/www/pages/pricing/index.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index 90e8979b897..799d9113597 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -71,7 +71,7 @@ export const PricingTableRowDesktop = (props: any) => { style={{ borderTop: 'none' }} >
diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index dba00ba6ba3..65845d775a0 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -453,7 +453,7 @@ export default function IndexPage() { Available for Pro plan

Cost control with spend caps

-

+

The Pro tier has a usage quota included and a spend cap turned on by default. If you need to go beyond the inclusive limits, simply switch off your spend cap to pay for additional usage. @@ -711,7 +711,7 @@ export default function IndexPage() { {tier.warning && (

- + {tier.warning}

From 4f6f4469c039e9d362e6609c3edd5f780ed6031b Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 24 Jan 2023 13:11:23 -0330 Subject: [PATCH 027/207] Style updates --- apps/www/pages/pricing/index.tsx | 2 +- apps/www/styles/index.css | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 65845d775a0..4984c6df414 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -258,7 +258,7 @@ export default function IndexPage() { key={`row-${tier.name}`} className={[ tier.name === 'Pro' - ? 'bg-brand-1100 dark:bg-brand-900 border px-0.5 -mt-8 rounded-xl' + ? 'bg-brand-1100 dark:bg-brand-900 border px-0.5 -mt-8 rounded-[14px]' : '', ].join(' ')} > diff --git a/apps/www/styles/index.css b/apps/www/styles/index.css index c76b18851d6..ebebd43fc00 100644 --- a/apps/www/styles/index.css +++ b/apps/www/styles/index.css @@ -665,6 +665,13 @@ launch week background-clip: text; -webkit-text-fill-color: transparent; } + +[class*='gradient-text-']::selection { + background-color: var(--colors-brand9); + background-clip: unset; + -webkit-text-fill-color: white; +} + @layer utilities { .gradient-text-brand-100 { background-image: linear-gradient(45deg, var(--colors-brand8) 0%, var(--colors-brand9) 100%); From 665fbfe5499ca5009afc938a648c3f83dd82d0d2 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Wed, 25 Jan 2023 08:28:11 -0600 Subject: [PATCH 028/207] add blog post for type constraints (domains) --- .gitignore | 3 +- ...postgres-extension-for-json-validation.mdx | 1 + ...15-postgres-foreign-data-wrappers-rust.mdx | 1 + ...25-type-constraints-in-50-lines-of-sql.mdx | 271 ++++++++++++++++++ 4 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 apps/www/_blog/2023-01-25-type-constraints-in-50-lines-of-sql.mdx diff --git a/.gitignore b/.gitignore index f536bae18d7..c67a911193a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ node_modules out .docz tmp +.swp coverage allure-results @@ -119,4 +120,4 @@ typings/ **/supabase/.branches **/supabase/.temp -apps/new-docs/* \ No newline at end of file +apps/new-docs/* diff --git a/apps/www/_blog/2022-08-19-pg-jsonschema-a-postgres-extension-for-json-validation.mdx b/apps/www/_blog/2022-08-19-pg-jsonschema-a-postgres-extension-for-json-validation.mdx index 52f14bd8c01..296165cc10d 100644 --- a/apps/www/_blog/2022-08-19-pg-jsonschema-a-postgres-extension-for-json-validation.mdx +++ b/apps/www/_blog/2022-08-19-pg-jsonschema-a-postgres-extension-for-json-validation.mdx @@ -6,6 +6,7 @@ image: lw5-pg_jsonschema/jsonschema-thumb.jpg thumb: lw5-pg_jsonschema/jsonschema-thumb.jpg tags: - launch-week + - planetpg date: '2022-08-19' toc_depth: 3 --- diff --git a/apps/www/_blog/2022-12-15-postgres-foreign-data-wrappers-rust.mdx b/apps/www/_blog/2022-12-15-postgres-foreign-data-wrappers-rust.mdx index 62147a24dd0..1c1e26f0354 100644 --- a/apps/www/_blog/2022-12-15-postgres-foreign-data-wrappers-rust.mdx +++ b/apps/www/_blog/2022-12-15-postgres-foreign-data-wrappers-rust.mdx @@ -6,6 +6,7 @@ image: launch-week-6/wrappers/wrappers-og.png thumb: launch-week-6/wrappers/wrappers-og.png tags: - launch-week + - planetpg date: '2022-12-15' toc_depth: 3 --- diff --git a/apps/www/_blog/2023-01-25-type-constraints-in-50-lines-of-sql.mdx b/apps/www/_blog/2023-01-25-type-constraints-in-50-lines-of-sql.mdx new file mode 100644 index 00000000000..86a50c7423e --- /dev/null +++ b/apps/www/_blog/2023-01-25-type-constraints-in-50-lines-of-sql.mdx @@ -0,0 +1,271 @@ +--- +title: Type Constraints in 50 lines of SQL +description: Creating validated data types in Postgres +author: oli_rice +image: +thumb: +tags: + - postgres + - planetpg +date: '2023-01-25' +toc_depth: 3 +--- + +PostgreSQL has a rich and extensible type system. Beyond defining custom enums and composite types, we can: + +- apply data validation rules +- override comparison operators like `=` / `+` / `-` +- create custom aggregations +- define casting rules between types + +until our types are indistinguishable from built-ins. In this article we’ll focus on validation and ergonomics, and touch on a few other concepts. + +To illustrate, we’ll create an `semver` data type to represent [Semantic Versioning](https://semver.org) values. We’ll then add validation rules to make invalid states unrepresentable. + +## SemVer + +A (very) loose primer on SemVer: + +SemVer is a specification for representing software versions that communicate information about backwards compatibility. The type is typically represented as a string with 5 components. + + + +The intent of each component is outside the scope of this article but, as an example, incrementing the major version number notifies users that the release includes at least one backwards incompatible change. + +For a concise representation of the full spec, [check out the grammar](https://semver.org/#backusnaur-form-grammar-for-valid-semver-versions). + +## SQL + +For our purposes, we’ll assume that our SemVer type is a major component of the application we’re building that we need to query flexibly and efficiently. + +### Storing Components + +To that end, we’ll store each component of the version as a separate field on a [composite type](https://www.postgresql.org/docs/current/rowtypes.html). + +```sql +create type semver_components as ( + major int, + minor int, + patch int, + pre_release text[], + build_metadata text[] +); +``` + +We can create an instance of this type in SQL by casting a tuple as the `semver_components` type. + +```sql +select + (1, 2, 3, array['beta', '1'], array['meta'])::semver_components +-- returns: (1,2,3,{'beta','1'},{'meta'}) +``` + +Unfortunately, our definition is far too permissive. + +```sql +select + (null, -500, null, array['?'], array[''])::semver_components +-- returns: (,-500,,{'?'},{'' +``` + +Our data type has no problem accepting invalid components. To list a few of the SemVer rules we violated: + +- Major version must not be null +- Minor version must be ≥ 0 +- Patch version must not be null +- Pre-release elements must only include characters [A-z0-9] +- Build metadata elements may not be empty strings + +We need to add some validation to meet our “make invalid states unrepresentable” goal. + +### Validation + +[Domains](https://www.postgresql.org/docs/current/sql-createdomain.html) are the Postgres’s solution for optionally layering constraints over a data type. Domains are to types what check constraints are to tables. If you’re not familiar with check constraints, you can think of them as equivalent to zod/pydantic in javascript/python. + +Let's codify some SemVer rules, layer them on the `semver_components` type, and give the new domain a friendly name. + +```sql +create domain semver + as semver_components + check ( + (value).major is not null and (value).major >= 0 -- major: non-null positive integer + and (value).minor is not null and (value).minor >= 0 -- minor: non-null positive integer + and (value).patch is not null and (value).patch >= 0 -- patch: non-null positive integer + and semver_elements_match_regex((value).pre_release, '^[A-z0-9]{1,255}$') + and semver_elements_match_regex((value).build_metadata, '^[A-z0-9\.]{1,255}$') + ); +``` + +which references a helper function: + +```sql +create or replace function semver_elements_match_regex( + parts text[], + regex text +) +returns bool +language sql +as $$ + -- validates that *parts* nullable array of non-empty strings + -- where each element of *parts* matches *regex* + select + $1 is null + or ( + ( + select + ( + bool_and(pr_arr.elem is not null) + and bool_and(pr_arr.elem ~ $2) + ) + from + unnest($1) pr_arr(elem) + ) + and array_length($1, 1) > 0 + ) +$$; +``` + +Now, if we repeat our positive an negative test cases using the `semver` type (vs `semver_components`) we still accept valid states: + +```sql +-- Success Case +select + (1, 2, 3, array['beta', '1'], array['meta'])::semver, +-- returns: (1,2,3,{'beta','1'},{'meta'}) +``` + +while invalid states are rejected with an error: + +```sql +-- Failure Case +select + (null, -500, null, array['?'], array[''])::semver +-- ERROR: value for domain semver violates check constraint "semver_check" +-- SQL state: 23514 +``` + +### Testing + +Our validation doesn’t have to be called manually. The `semver` domain can be used anywhere you’d use the `semver_components` type and the validations are automatically applied. + +```sql +-- A table with a semver column +create table package_version( + id bigserial primary key, + package_name text not null, + package_semver semver not null -- semver column +); + +-- Insert some valid records +insert into package_version( package_name, package_semver ) +values + ('supabase-js', (2, 2, 3, null, null)), + ('supabase-js', (2, 0, 0, array['rc', '1'], null) +); + +-- Attempt to insert an invalid record (major is null) +insert into package_version( package_name, package_semver ) +values + ('invalid-js', (null, 1, 0, array['asdf'], null)); +-- ERROR: value for domain semver violates check constraint "semver_check" +``` + +Good stuff! + +We’re 37 lines of SQL in and have solved for making invalid states unrepresentable. Now lets think about ergonomics. + +### Displaying + +Now that our data type is well constrained, you might notice that selecting values from a `semver` typed column returns a tuple, rather than the SemVer string we’re used to seeing. + +```sql +select + * +from + package_version +/* +id | package_name | package_semver +------------------------------------- + 1 | supabase-js, | (2,2,3,,) + 1 | supabase-js, | (2,0,0,"{rc,1}",) +*/ +``` + +For example: `(2,0,0,"{rc,1}",)` vs `2.0.0-rc.1` + +We could work around that problem with some [custom casts](https://www.postgresql.org/docs/current/sql-createcast.html), but I’d recommend keeping everything explicit with a function call. + +```sql +create or replace function semver_to_text(semver) + returns text + immutable + language sql +as $$ + select + format('%s.%s.%s', $1.major, $1.minor, $1.patch) + || case + when $1.pre_release is null then '' + else format('-%s', array_to_string($1.pre_release, '.')) + end + || case + when $1.build_metadata is null then '' + else format('+%s', array_to_string($1.build_metadata, '.')) + end +$$; +``` + +Which allows us to query the `package_version` table and retrieve a string representation of the data. + +```sql +select + id, + package_name, + semver_to_text(package_semver) as ver -- cast to as text +from + package_version +/* +id | package_name | ver +------------------------------ + 1 | supabase-js, | 2.2.3 + 1 | supabase-js, | 2.0.0-rc.1 +*/ +``` + +Or, better yet, use a [generated column](https://www.postgresql.org/docs/current/ddl-generated-columns.html) + +```sql +create table package_version( + id bigserial primary key, + package_name text not null, + package_semver semver not null, + semver_text text generated always as (semver_to_text(package_semver)) stored +); +``` + +so the text representation persisted along with the `semver` type and incurs no query/filter penalty. + +### Other Tricks + +Postgres provides all the tools you could want to make your data types/domains work with SQL as seamlessly as builtins. + +For example, you could: + +- add convenience functions to parse a [semver type from text](https://github.com/supabase/dbdev/blob/ca338584203d9b2eb7a4a378f5724674c15b9c25/supabase/migrations/20220117141507_semver.sql#L78) +- [override the equality operator](https://github.com/supabase/dbdev/blob/ca338584203d9b2eb7a4a378f5724674c15b9c25/supabase/migrations/20220117141507_semver.sql#L37-L63) (`=`) to correctly reflect that versions differing only in build metadata are considered equal +- [add a `max` function](https://github.com/supabase/dbdev/blob/ca338584203d9b2eb7a4a378f5724674c15b9c25/supabase/migrations/20220117141507_semver.sql#L122-L140) to efficiently query for the newest version of each package from within the database + +to name a few. + +Aligning the right parts of your business’ logic with the database can dramatically improve throughput, decrease IO, and simplify application code. + +### Conclusion + +I’ll be the first to admit that building out performant and ergonomic custom data types in Postgres involves a lot of ceremony. + +That said, in cases where: + +- the type’s data integrity is critical +- the type is well specified +- the type’s spec does not change (or changes infrequently) + +Teaching Postgres to have first class support for your custom type can be transformative for data integrity and performance. From 02fb0cdc356010634ad17ad0a6505334cc0a85d4 Mon Sep 17 00:00:00 2001 From: Ollie Halliday <22655069+Hallidayo@users.noreply.github.com> Date: Thu, 26 Jan 2023 13:57:19 +0000 Subject: [PATCH 029/207] removed md gap --- packages/ui/src/lib/theme/defaultTheme.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/lib/theme/defaultTheme.ts b/packages/ui/src/lib/theme/defaultTheme.ts index 1265d536a10..8cf91b927ff 100644 --- a/packages/ui/src/lib/theme/defaultTheme.ts +++ b/packages/ui/src/lib/theme/defaultTheme.ts @@ -1112,7 +1112,7 @@ export default { }, }, - responsive: 'md:grid md:grid-cols-12 md:gap-x-4', + responsive: 'md:grid md:grid-cols-12', non_responsive: 'grid grid-cols-12 gap-2', labels_horizontal_layout: 'flex flex-row space-x-2 justify-between col-span-12', From f2f256a33a30123b188a6d5472f3357c6331c094 Mon Sep 17 00:00:00 2001 From: Laurensius Adi Date: Fri, 27 Jan 2023 22:23:43 +0700 Subject: [PATCH 030/207] fix signOut using useSupabaseAuthClient Based on https://github.com/nuxt-modules/supabase/pull/115 --- .../nuxt3-user-management/components/Account.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/user-management/nuxt3-user-management/components/Account.vue b/examples/user-management/nuxt3-user-management/components/Account.vue index 914d5e20f61..ccdd09c046f 100644 --- a/examples/user-management/nuxt3-user-management/components/Account.vue +++ b/examples/user-management/nuxt3-user-management/components/Account.vue @@ -74,10 +74,11 @@ async function updateProfile() { } } +const supabaseAuth = useSupabaseAuthClient() async function signOut() { try { loading.value = true - let { error } = await supabase.auth.signOut() + let { error } = await supabaseAuth.auth.signOut() if (error) throw error } catch (error) { alert(error.message) From 552bde0302ff5e8be175d260b4ef3e1ca74b86b2 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Mon, 30 Jan 2023 13:48:33 -0330 Subject: [PATCH 031/207] Add mobile plan switcher --- apps/www/pages/pricing/index.tsx | 327 +++++++++++---------- packages/ui/src/lib/theme/defaultTheme.ts | 328 +++++++++++----------- 2 files changed, 341 insertions(+), 314 deletions(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 4984c6df414..936a73aacbc 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -1,5 +1,5 @@ import { ServerIcon, SupportIcon } from '@heroicons/react/outline' -import { Accordion, Button, IconCheck } from 'ui' +import { Accordion, Button, IconCheck, Select } from 'ui' import Solutions from 'data/Solutions.json' import { NextSeo } from 'next-seo' import Link from 'next/link' @@ -21,6 +21,7 @@ export default function IndexPage() { const { basePath } = useRouter() const { isDarkMode } = useTheme() const [showComputeModal, setShowComputeModal] = useState(false) + const [activeMobileTier, setActiveMobileTier] = useState('Free') const meta_title = 'Pricing & fees | Supabase' const meta_description = @@ -170,7 +171,7 @@ export default function IndexPage() { }, ] - const MobileHeaders = ({ + const MobileHeader = ({ // title, description, priceDescription, @@ -187,7 +188,7 @@ export default function IndexPage() { from?: boolean }) => { return ( -
+

{tier}

@@ -391,7 +392,7 @@ export default function IndexPage() {

Easily customizable add-Ons

-

+

Level up your Supabase experience with add-ons.

@@ -476,7 +477,7 @@ export default function IndexPage() {

Compare Plans

-

+

Start with a hobby project, collaborate with a team, and scale to millions of users.

@@ -486,153 +487,179 @@ export default function IndexPage() {
{/* Free - Mobile */} +
+
+ + +
+
+ {activeMobileTier === 'Free' && ( + <> + + + + + + + + + + + )} - + {activeMobileTier === 'Pro' && ( + <> + + + + + + + + + + + )} - - - - - - - - - - {/* Pro - Mobile */} - - - - - - - - - - - {/* Enterprise - Mobile */} - - - - - - - - - - + {activeMobileTier === 'Enterprise' && ( + <> + + + + + + + + + + + )}
{/* */} diff --git a/packages/ui/src/lib/theme/defaultTheme.ts b/packages/ui/src/lib/theme/defaultTheme.ts index 1265d536a10..cbab5e23dbd 100644 --- a/packages/ui/src/lib/theme/defaultTheme.ts +++ b/packages/ui/src/lib/theme/defaultTheme.ts @@ -117,9 +117,9 @@ export default { flex flex-row gap-3 items-center - w-full - text-left - cursor-pointer + w-full + text-left + cursor-pointer outline-none focus-visible:ring-1 @@ -143,27 +143,27 @@ export default { group border border-scale-700 - + first:rounded-tl-md first:rounded-tr-md last:rounded-bl-md last:rounded-br-md `, trigger: ` flex flex-row items-center - px-6 py-4 - w-full - text-left - cursor-pointer - - font-medium - text-base - bg-transparent + px-6 py-4 + w-full + text-left + cursor-pointer + + font-medium + text-base + bg-transparent outline-none focus-visible:ring-1 focus-visible:z-50 ring-scale-1100 - + transition-colors hover:bg-scale-200 @@ -252,8 +252,8 @@ export default { alert: { base: ` - relative rounded border py-4 px-6 - flex space-x-4 items-start + relative rounded border py-4 px-6 + flex space-x-4 items-start `, header: 'block text-sm font-normal mb-1', description: `text-xs`, @@ -290,11 +290,11 @@ export default { }, }, close: ` - absolute - right-6 top-4 - p-0 m-0 + absolute + right-6 top-4 + p-0 m-0 text-scale-900 - cursor-pointer transition ease-in-out + cursor-pointer transition ease-in-out bg-transparent border-transparent focus:outline-none opacity-50 hover:opacity-100`, }, @@ -306,15 +306,15 @@ export default { card: { base: ` bg-white dark:bg-scaleDark-700 - - border - ${defaults.border.primary} - flex flex-col + border + ${defaults.border.primary} + + flex flex-col rounded-md shadow-lg overflow-hidden relative `, hoverable: 'transition hover:-translate-y-1 hover:shadow-2xl', - head: `px-8 py-6 flex justify-between + head: `px-8 py-6 flex justify-between border-b ${defaults.border.primary} `, content: 'p-8', @@ -328,20 +328,20 @@ export default { base: `w-full justify-between space-y-4`, underlined: { list: ` - flex items-center border-b + flex items-center border-b ${defaults.border.secondary} `, - base: ` - relative - cursor-pointer - text-scale-900 - flex - items-center + base: ` + relative + cursor-pointer + text-scale-900 + flex + items-center space-x-2 - text-center + text-center transition - focus:outline-none - focus-visible:ring + focus:outline-none + focus-visible:ring focus-visible:ring-scale-700 focus-visible:border-scale-900 `, @@ -355,18 +355,18 @@ export default { }, pills: { list: 'flex space-x-1', - base: ` - relative - cursor-pointer - flex - items-center + base: ` + relative + cursor-pointer + flex + items-center space-x-2 - text-center + text-center transition shadow-sm rounded - focus:outline-none - focus-visible:ring + focus:outline-none + focus-visible:ring focus-visible:ring-scale-700 focus-visible:border-scale-900 `, @@ -378,23 +378,23 @@ export default { active: ` bg-scale-1200 text-scale-200 - border-scale-1200 + border-scale-1200 `, }, 'rounded-pills': { list: 'flex flex-wrap gap-2', - base: ` - relative - cursor-pointer - flex - items-center + base: ` + relative + cursor-pointer + flex + items-center space-x-2 - text-center + text-center transition shadow-sm rounded-full - focus:outline-none - focus-visible:ring + focus:outline-none + focus-visible:ring focus-visible:ring-scale-700 focus-visible:border-scale-900 `, @@ -406,7 +406,7 @@ export default { active: ` bg-scale-1200 text-scale-200 - border-scale-1200 + border-scale-1200 `, }, block: 'w-full flex items-center justify-center', @@ -427,15 +427,15 @@ export default { button: { base: ` - relative - cursor-pointer - inline-flex items-center space-x-2 - text-center + relative + cursor-pointer + inline-flex items-center space-x-2 + text-center font-regular - transition ease-out duration-200 - rounded + transition ease-out duration-200 + rounded ${defaults['focus-visible']} - + `, label: `truncate`, container: 'inline-flex font-medium', @@ -449,7 +449,7 @@ export default { secondary: ` bg-scale-1200 text-scale-100 hover:text-scale-800 - focus-visible:text-scale-600 + focus-visible:text-scale-600 bordershadow-scale-1100 hover:bordershadow-scale-900 @@ -462,7 +462,7 @@ export default { dark:bordershadow-scale-700 hover:dark:bordershadow-scale-800 dark:bg-scale-500 dark:hover:bg-scale-600 focus-visible:outline-brand-600 - + `, alternative: ` text-brand-1100 @@ -473,14 +473,14 @@ export default { focus-visible:outline-brand-600 `, outline: ` - text-scale-1200 - bg-transparent + text-scale-1200 + bg-transparent bordershadow-scale-600 hover:bordershadow-scale-700 dark:bordershadow-scale-800 hover:dark:bordershadow-scale-900 focus-visible:outline-scale-700 `, dashed: ` - text-scale-1200 + text-scale-1200 border border-dashed border-scale-700 hover:border-scale-900 @@ -498,7 +498,7 @@ export default { focus-visible:outline-scale-700 `, text: ` - text-scale-1200 + text-scale-1200 hover:bg-scale-500 shadow-none focus-visible:outline-scale-700 @@ -538,13 +538,13 @@ export default { input: { base: ` - block - box-border - w-full - rounded-md - shadow-sm + block + box-border + w-full + rounded-md + shadow-sm transition-all - text-scale-1200 + text-scale-1200 border focus:shadow-md ${defaults.focus} @@ -559,7 +559,7 @@ export default { `, error: ` bg-red-100 - border border-red-700 + border border-red-700 focus:ring-red-500 placeholder:text-red-600 `, @@ -581,13 +581,13 @@ export default { select: { base: ` - block - box-border - w-full - rounded-md - shadow-sm + block + box-border + w-full + rounded-md + shadow-sm transition-all - text-scale-1200 + text-scale-1200 border focus:shadow-md ${defaults.focus} @@ -605,7 +605,7 @@ export default { `, error: ` bg-red-100 - border border-red-700 + border border-red-700 focus:ring-red-500 placeholder:text-red-600 `, @@ -618,7 +618,7 @@ export default { disabled: 'opacity-50', actions_container: 'absolute inset-y-0 right-0 pl-3 pr-1 mr-5 flex items-center', chevron_container: 'absolute inset-y-0 right-0 flex items-center pr-2 pointer-events-none', - chevron: 'h-5 w-5 text-scale-600', + chevron: 'h-5 w-5 text-scale-800', }, /* @@ -628,12 +628,12 @@ export default { inputNumber: { base: ` block - box-border - w-full - rounded-md - shadow-sm + box-border + w-full + rounded-md + shadow-sm transition-all - text-scale-1200 + text-scale-1200 border focus:shadow-md ${defaults.focus} @@ -651,7 +651,7 @@ export default { `, error: ` bg-red-100 - border border-red-700 + border border-red-700 focus:ring-red-500 placeholder:text-red-600 `, @@ -668,9 +668,9 @@ export default { /* * Checkbox * - * + * * This Checkbox requires a plugin in your config: - + ``` // tailwind.config.js module.exports = { @@ -681,17 +681,17 @@ export default { ], } ``` - * - * + * + * */ checkbox: { base: ` - bg-transparent + bg-transparent ${defaults.focus} focus:ring-scale-400 - text-brand-900 - border-scale-700 + text-brand-900 + border-scale-700 shadow-sm rounded cursor-pointer @@ -727,9 +727,9 @@ export default { /* * Radio * - * + * * This Radio requires a plugin in your config: - + ``` // tailwind.config.js module.exports = { @@ -740,8 +740,8 @@ export default { ], } ``` - * - * + * + * */ radio: { @@ -750,7 +750,7 @@ export default { ${defaults.focus} focus:ring-brand-400 border-scale-700 - + text-brand-900 shadow-sm cursor-pointer @@ -797,7 +797,7 @@ export default { `, active: ` bg-scale-300 dark:bg-scale-600 z-10 - border-scale-900 dark:border-scale-900 + border-scale-900 dark:border-scale-900 border-1 `, radio_offset: 'left-4', @@ -816,7 +816,7 @@ export default { transition rounded-md border - shadow-sm + shadow-sm `, size: { tiny: `px-5 py-3`, @@ -833,7 +833,7 @@ export default { `, active: ` bg-scale-300 dark:bg-scale-600 z-10 - border-scale-900 dark:border-scale-900 + border-scale-900 dark:border-scale-900 border-1 `, radio_offset: 'left-4', @@ -849,9 +849,9 @@ export default { }, group: `flex flex-row gap-3`, base: ` - transition + transition border - rounded-lg + rounded-lg grow items-center flex-wrap @@ -888,10 +888,10 @@ export default { }, group: `flex flex-row gap-3`, base: ` - transition - border border-scale-700 hover:border-scale-900 + transition + border border-scale-700 hover:border-scale-900 shadow-sm - rounded-lg + rounded-lg grow `, size: { @@ -909,7 +909,7 @@ export default { `, active: ` bg-scale-300 dark:bg-scale-600 z-10 - border-scale-900 dark:border-scale-900 + border-scale-900 dark:border-scale-900 border-1 `, radio_offset: 'left-4', @@ -969,21 +969,21 @@ export default { sidepanel: { base: ` bg-scale-100 dark:bg-scale-300 - flex flex-col - fixed - inset-y-0 - max-w-full + flex flex-col + fixed + inset-y-0 + max-w-full h-screen border-l border-overlay-border shadow-xl `, header: ` - space-y-1 py-4 px-4 bg-overlay-bg sm:px-6 + space-y-1 py-4 px-4 bg-overlay-bg sm:px-6 border-b border-overlay-border `, contents: ` - relative - flex-1 + relative + flex-1 overflow-y-auto `, content: ` @@ -1002,12 +1002,12 @@ export default { align: { left: ` left-0 - data-open:animate-panel-slide-left-out + data-open:animate-panel-slide-left-out data-closed:animate-panel-slide-left-in `, right: ` right-0 - data-open:animate-panel-slide-right-out + data-open:animate-panel-slide-right-out data-closed:animate-panel-slide-right-in `, }, @@ -1023,9 +1023,9 @@ export default { dark:bg-scale-100 h-full w-full left-0 - top-0 + top-0 opacity-75 - data-closed:animate-fade-out-overlay-bg + data-closed:animate-fade-out-overlay-bg data-open:animate-fade-in-overlay-bg `, // this is to reset the button @@ -1041,10 +1041,10 @@ export default { toggle: { base: ` - p-0 relative - inline-flex flex-shrink-0 - border-2 border-transparent - rounded-full + p-0 relative + inline-flex flex-shrink-0 + border-2 border-transparent + rounded-full cursor-pointer transition-colors ease-in-out duration-200 ${defaults.focus} @@ -1054,8 +1054,8 @@ export default { hover:bg-scale-700 `, active: ` - bg-brand-900 - hover:bg-brand-900 + bg-brand-900 + hover:bg-brand-900 `, handle_container: { tiny: 'h-4 w-7', @@ -1066,12 +1066,12 @@ export default { }, handle: { base: ` - inline-block h-5 w-5 - rounded-full + inline-block h-5 w-5 + rounded-full bg-scale-100 dark:bg-scale-900 - shadow ring-0 - transition + shadow ring-0 + transition ease-in-out duration-200 `, tiny: 'h-3 w-3', @@ -1159,7 +1159,7 @@ export default { }, error: { base: ` - text-red-900 + text-red-900 transition-all data-show:mt-2 data-show:animate-slide-down-normal @@ -1187,7 +1187,7 @@ export default { trigger: ` flex - border-none + border-none rounded bg-transparent p-0 outline-none @@ -1279,8 +1279,8 @@ export default { popover: { trigger: ` flex - border-none - + border-none + rounded bg-transparent p-0 @@ -1300,7 +1300,7 @@ export default { data-closed:animate-dropdown-content-hide min-w-fit - origin-popover + origin-popover data-open:animate-dropdown-content-show data-closed:animate-dropdown-content-hide `, @@ -1344,7 +1344,7 @@ export default { cursor-pointer flex space-x-3 items-center outline-none - focus-visible:ring-1 ring-scale-1200 focus-visible:z-10 + focus-visible:ring-1 ring-scale-1200 focus-visible:z-10 group `, content: { @@ -1415,7 +1415,7 @@ export default { }, group: { base: ` - flex space-x-3 + flex space-x-3 mb-2 font-normal `, @@ -1438,20 +1438,20 @@ export default { bg-scale-100 dark:bg-scale-300 my-4 border border-scale-300 dark:border-scale-500 - rounded-md - shadow-xl - data-open:animate-overlay-show - data-closed:animate-overlay-hide - + rounded-md + shadow-xl + data-open:animate-overlay-show + data-closed:animate-overlay-hide + `, header: ` bg-scale-200 dark:bg-scale-400 - space-y-1 py-3 px-4 sm:px-5 + space-y-1 py-3 px-4 sm:px-5 border-b border-scale-300 dark:border-scale-500 `, footer: ` flex justify-end gap-2 - py-3 px-5 + py-3 px-5 border-t border-scale-300 dark:border-scale-500 `, size: { @@ -1469,9 +1469,9 @@ export default { dark:bg-scale-100 h-full w-full left-0 - top-0 + top-0 opacity-75 - data-closed:animate-fade-out-overlay-bg + data-closed:animate-fade-out-overlay-bg data-open:animate-fade-in-overlay-bg `, scroll_overlay: ` @@ -1480,7 +1480,7 @@ export default { grid place-items-center overflow-y-auto - data-open:animate-overlay-show data-closed:animate-overlay-hide + data-open:animate-overlay-show data-closed:animate-overlay-hide `, separator: ` w-full @@ -1495,12 +1495,12 @@ export default { listbox: { base: ` - block - box-border - w-full - rounded-md - shadow-sm - text-scale-1200 + block + box-border + w-full + rounded-md + shadow-sm + text-scale-1200 border focus:shadow-md ${defaults.focus} @@ -1524,24 +1524,24 @@ export default { `, error: ` bg-red-100 - border border-red-700 + border border-red-700 focus:ring-red-500 placeholder:text-red-600 `, }, options_container_animate: ` transition - data-open:animate-slide-down + data-open:animate-slide-down data-open:opacity-1 data-closed:animate-slide-up data-closed:opacity-0 `, options_container: ` - bg-scale-100 dark:bg-scale-300 - shadow-lg - border border-solid - border-gray-100 dark:border-gray-600 max-h-60 - rounded-md py-1 text-base + bg-scale-100 dark:bg-scale-300 + shadow-lg + border border-solid + border-gray-100 dark:border-gray-600 max-h-60 + rounded-md py-1 text-base sm:text-sm z-10 overflow-hidden overflow-y-scroll origin-dropdown @@ -1561,7 +1561,7 @@ export default { chevron: 'h-5 w-5 text-scale-600', option: ` w-listbox - transition cursor-pointer select-none relative py-2 pl-3 pr-9 + transition cursor-pointer select-none relative py-2 pl-3 pr-9 text-scale-900 text-sm hover:bg-scale-300 dark:hover:bg-scale-500 @@ -1587,9 +1587,9 @@ export default { inputErrorIcon: { base: ` - flex items-center - right-3 pr-2 pl-2 - inset-y-0 + flex items-center + right-3 pr-2 pl-2 + inset-y-0 pointer-events-none text-red-900 `, @@ -1597,8 +1597,8 @@ export default { inputIconContainer: { base: ` - absolute inset-y-0 - left-0 pl-3 flex + absolute inset-y-0 + left-0 pl-3 flex items-center pointer-events-none text-scale-1100 `, From 8a7a50ae8b873e744bff681de43f1131b1051154 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Mon, 30 Jan 2023 13:58:26 -0330 Subject: [PATCH 032/207] Updates --- apps/www/pages/pricing/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 936a73aacbc..e369db9896a 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -230,7 +230,7 @@ export default function IndexPage() { />
-
+

From 46fae5e677abb9a7ef6cd8f82a6eaaf2d4c7d0e1 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Mon, 30 Jan 2023 17:16:10 -0330 Subject: [PATCH 033/207] Add link to feature req --- apps/docs/public/sitemap.xml | 350 ++++++++++++++++++++----------- apps/www/pages/pricing/index.tsx | 17 +- 2 files changed, 238 insertions(+), 129 deletions(-) diff --git a/apps/docs/public/sitemap.xml b/apps/docs/public/sitemap.xml index 2e86001d252..43126c6257b 100644 --- a/apps/docs/public/sitemap.xml +++ b/apps/docs/public/sitemap.xml @@ -6,12 +6,6 @@ 0.5 - - https://supabase.com/docs/getting-started - weekly - 0.5 - - https://supabase.com/docs/index weekly @@ -30,6 +24,12 @@ 0.5 + + https://supabase.com/docs/guides/cli + weekly + 0.5 + + https://supabase.com/docs/guides/database weekly @@ -90,12 +90,6 @@ 0.5 - - https://supabase.com/docs/guides/tutorials - weekly - 0.5 - - https://supabase.com/docs/handbook/contributing weekly @@ -108,24 +102,12 @@ 0.5 - - https://supabase.com/docs/new/auth - weekly - 0.5 - - https://supabase.com/docs/reference/index weekly 0.5 - - https://supabase.com/docs/tutorials/nextjs - weekly - 0.5 - - https://supabase.com/docs/guides/api/generating-types weekly @@ -204,6 +186,18 @@ 0.5 + + https://supabase.com/docs/guides/cli/local-development + weekly + 0.5 + + + + https://supabase.com/docs/guides/cli/managing-environments + weekly + 0.5 + + https://supabase.com/docs/guides/database/arrays weekly @@ -300,24 +294,54 @@ 0.5 - - https://supabase.com/docs/guides/functions/best-practices - weekly - 0.5 - - https://supabase.com/docs/guides/functions/cicd-workflow weekly 0.5 + + https://supabase.com/docs/guides/functions/cors + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/debugging + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/import-maps + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/local-development + weekly + 0.5 + + https://supabase.com/docs/guides/functions/quickstart weekly 0.5 + + https://supabase.com/docs/guides/functions/schedule-functions + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/secrets + weekly + 0.5 + + https://supabase.com/docs/guides/getting-started/architecture weekly @@ -390,6 +414,12 @@ 0.5 + + https://supabase.com/docs/guides/integrations/illa + weekly + 0.5 + + https://supabase.com/docs/guides/integrations/integrations weekly @@ -414,6 +444,12 @@ 0.5 + + https://supabase.com/docs/guides/integrations/picket + weekly + 0.5 + + https://supabase.com/docs/guides/integrations/plasmic weekly @@ -510,6 +546,12 @@ 0.5 + + https://supabase.com/docs/guides/platform/http-status-codes + weekly + 0.5 + + https://supabase.com/docs/guides/platform/logs weekly @@ -552,6 +594,12 @@ 0.5 + + https://supabase.com/docs/guides/platform/troubleshooting + weekly + 0.5 + + https://supabase.com/docs/guides/realtime/postgres-changes weekly @@ -577,7 +625,7 @@ - https://supabase.com/docs/guides/resources/supabase-cli + https://supabase.com/docs/guides/self-hosting/docker weekly 0.5 @@ -612,12 +660,6 @@ 0.5 - - https://supabase.com/docs/guides/self-hosting/docker - weekly - 0.5 - - https://supabase.com/docs/learn/auth-deep-dive/auth-deep-dive-jwts weekly @@ -648,6 +690,24 @@ 0.5 + + https://supabase.com/docs/guides/auth/phone-login/messagebird + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/phone-login/twilio + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/phone-login/vonage + weekly + 0.5 + + https://supabase.com/docs/guides/auth/auth-helpers/auth-ui weekly @@ -678,24 +738,6 @@ 0.5 - - https://supabase.com/docs/guides/auth/phone-login/messagebird - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/phone-login/twilio - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/phone-login/vonage - weekly - 0.5 - - https://supabase.com/docs/guides/auth/social-login/auth-apple weekly @@ -799,43 +841,97 @@ - https://supabase.com/docs/guides/database/extensions/http + https://supabase.com/docs/guides/functions/examples/cloudflare-turnstile weekly 0.5 - https://supabase.com/docs/guides/database/extensions/pgcron + https://supabase.com/docs/guides/functions/examples/github-actions weekly 0.5 - https://supabase.com/docs/guides/database/extensions/pgnet + https://supabase.com/docs/guides/functions/examples/og-image weekly 0.5 - https://supabase.com/docs/guides/database/extensions/pgtap + https://supabase.com/docs/guides/functions/examples/storage-caching weekly 0.5 - https://supabase.com/docs/guides/database/extensions/plv8 + https://supabase.com/docs/guides/functions/examples/stripe-webhooks weekly 0.5 - https://supabase.com/docs/guides/database/extensions/postgis + https://supabase.com/docs/guides/functions/examples/telegram-bot weekly 0.5 - https://supabase.com/docs/guides/database/extensions/uuid-ossp + https://supabase.com/docs/guides/getting-started/quickstarts/flutter + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/nextjs + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/nuxtjs + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/reactjs + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/solidjs + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/sveltekit + weekly + 0.5 + + + + https://supabase.com/docs/guides/getting-started/quickstarts/vue + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/sso/azure + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/sso/gsuite + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/sso/okta weekly 0.5 @@ -924,66 +1020,6 @@ 0.5 - - https://supabase.com/docs/guides/functions/examples/og-image - weekly - 0.5 - - - - https://supabase.com/docs/guides/getting-started/quickstarts/nextjs - weekly - 0.5 - - - - https://supabase.com/docs/guides/getting-started/quickstarts/nuxtjs - weekly - 0.5 - - - - https://supabase.com/docs/guides/getting-started/quickstarts/reactjs - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/sso/azure - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/sso/gsuite - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/sso/okta - weekly - 0.5 - - - - https://supabase.com/docs/guides/resources/supabase-cli/local-development - weekly - 0.5 - - - - https://supabase.com/docs/guides/resources/supabase-cli/managing-environments - weekly - 0.5 - - - - https://supabase.com/docs/guides/self-hosting/auth/config - weekly - 0.5 - - https://supabase.com/docs/guides/resources/migrating-to-supabase/firebase-auth weekly @@ -1008,6 +1044,54 @@ 0.5 + + https://supabase.com/docs/guides/database/extensions/http + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/pgcron + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/pgnet + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/pgtap + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/plv8 + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/postgis + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/extensions/uuid-ossp + weekly + 0.5 + + + + https://supabase.com/docs/guides/self-hosting/auth/config + weekly + 0.5 + + https://supabase.com/docs/guides/self-hosting/realtime/config weekly @@ -1443,7 +1527,7 @@ - https://supabase.com/docs/reference/javascript/auth-admin-invoke + https://supabase.com/docs/reference/javascript/functions-invoke weekly 0.5 @@ -1677,7 +1761,7 @@ - https://supabase.com/docs/reference/javascript/v1/auth-admin-invoke + https://supabase.com/docs/reference/javascript/v1/functions-invoke weekly 0.5 @@ -2018,6 +2102,12 @@ 0.5 + + https://supabase.com/docs/reference/dart/initializing + weekly + 0.5 + + https://supabase.com/docs/reference/dart/auth-signup weekly @@ -2085,7 +2175,7 @@ - https://supabase.com/docs/reference/dart/auth-admin-invoke + https://supabase.com/docs/reference/dart/functions-invoke weekly 0.5 @@ -2493,7 +2583,7 @@ - https://supabase.com/docs/reference/dart/v0/auth-admin-invoke + https://supabase.com/docs/reference/dart/v0/functions-invoke weekly 0.5 @@ -2895,7 +2985,7 @@ - https://supabase.com/docs/reference/dart/v0/auth-admin-invoke + https://supabase.com/docs/reference/dart/v0/functions-invoke weekly 0.5 @@ -3446,6 +3536,12 @@ 0.5 + + https://supabase.com/docs/reference/cli/supabase-functions-download + weekly + 0.5 + + https://supabase.com/docs/reference/cli/supabase-functions-deploy weekly diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index e369db9896a..4c2c0f14a75 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -83,7 +83,7 @@ export default function IndexPage() { scale: 'Additional fees apply for usage and storage beyond the limits above.', shutdown: '', preface: 'Everything below included in the base plan', - additional: 'Turn off your spend cap to Pay As You Grow ', + additional: '', cta: 'Get Started', }, // { @@ -446,9 +446,22 @@ export default function IndexPage() {

))}
+
+ Got something you'd like to see here? + + + + + +
-
+
Available for Pro plan From 27c29dcadc231ba02d07b3c40aeb05a1d058ca1c Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 31 Jan 2023 10:15:44 -0330 Subject: [PATCH 034/207] Fix prose section --- apps/www/components/Pricing/ComputePricingModal.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index 18605613266..4f1f31e385d 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -35,12 +35,12 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo
} > -
+
-
+
-
+

Choose best compute setup for you

Every project on the Supabase Platform comes with its own dedicated Postgres From 40fc6ecff33698f745deb6d936d7804aab174555 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 31 Jan 2023 15:07:29 -0330 Subject: [PATCH 035/207] New svg --- apps/www/public/images/pricing/compute-upgrade.svg | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/apps/www/public/images/pricing/compute-upgrade.svg b/apps/www/public/images/pricing/compute-upgrade.svg index c6241aa159e..6f27d68fbb7 100644 --- a/apps/www/public/images/pricing/compute-upgrade.svg +++ b/apps/www/public/images/pricing/compute-upgrade.svg @@ -1,9 +1 @@ - - - - - - - - - + \ No newline at end of file From 1a744bdf2080031178f1ffab1ef8c8b2188eda0e Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Thu, 2 Feb 2023 22:41:33 -0330 Subject: [PATCH 036/207] Add filtering to extensions docs --- apps/docs/components/Extensions.js | 35 --- apps/docs/components/Extensions.tsx | 126 +++++++++++ apps/docs/data/extensions.json | 211 ++++++++++++------ .../docs/pages/guides/database/extensions.mdx | 4 - apps/docs/tsconfig.json | 2 +- 5 files changed, 268 insertions(+), 110 deletions(-) delete mode 100644 apps/docs/components/Extensions.js create mode 100644 apps/docs/components/Extensions.tsx diff --git a/apps/docs/components/Extensions.js b/apps/docs/components/Extensions.js deleted file mode 100644 index 47753d6bfde..00000000000 --- a/apps/docs/components/Extensions.js +++ /dev/null @@ -1,35 +0,0 @@ -import React, { useState } from 'react' -import extensions from '../data/extensions.json' - -export default function Extensions() { - const [filter, setFilter] = useState('') - return ( - <> -

- - setFilter(e.target.value)} - /> -
-
- {extensions - .filter((x) => x.name.indexOf(filter) >= 0) - .map((extension) => ( -
-
-

- {extension.name} -

-

- {extension.comment.charAt(0).toUpperCase() + extension.comment.slice(1)} -

-
-
- ))} -
- - ) -} diff --git a/apps/docs/components/Extensions.tsx b/apps/docs/components/Extensions.tsx new file mode 100644 index 00000000000..0175afe77a5 --- /dev/null +++ b/apps/docs/components/Extensions.tsx @@ -0,0 +1,126 @@ +import Link from 'next/link' +import React, { useState } from 'react' +import { IconExternalLink, IconX, Input } from 'ui' +import extensions from '../data/extensions.json' + +type extension = { + name: string + schema: string | null + default_version: string + installed_version: string | null + comment: string + tags: string[] + link?: string +} + +function getUniqueTags(json: extension[]) { + const tags = [] + for (const item of json) { + tags.push(...item.tags) + } + return [...new Set(tags)] +} + +export default function Extensions() { + const [searchTerm, setSearchTerm] = useState('') + const [filters, setFilters] = useState([]) + + const tags = getUniqueTags(extensions) + + function handleChecked(tag) { + if (filters.includes(tag)) { + setFilters(filters.filter((x) => x !== tag)) + } else { + setFilters([...filters, tag]) + } + } + + return ( + <> +
+ + setSearchTerm(e.target.value)} + /> +
+
+
+
+

Filter

+
    + {tags.map((tag) => ( +
  • + +
  • + ))} +
+

+ +

+
+
+ +
+
+ {extensions + .filter((x) => x.name.indexOf(searchTerm) >= 0) + .filter((x) => + filters.length === 0 ? x : x.tags.some((item) => filters.includes(item)) + ) + .map((extension) => ( +
+
+

+ {extension.name} +

+

+ {extension.comment.charAt(0).toUpperCase() + extension.comment.slice(1)} +

+ {extension.link && ( + + + + + + + + )} +
+
+ ))} +
+
+
+ + ) +} diff --git a/apps/docs/data/extensions.json b/apps/docs/data/extensions.json index 164600eb93e..c04f21f0543 100644 --- a/apps/docs/data/extensions.json +++ b/apps/docs/data/extensions.json @@ -4,489 +4,560 @@ "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "Used to parse an address into constituent elements. Generally used to support geocoding address normalization step." + "comment": "Used to parse an address into constituent elements. Generally used to support geocoding address normalization step.", + "tags": [], + "link": "http://supabase.com/docs/guides/extensions/etc/etc/etc" }, { "name": "address_standardizer-3", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "Used to parse an address into constituent elements. Generally used to support geocoding address normalization step." + "comment": "Used to parse an address into constituent elements. Generally used to support geocoding address normalization step.", + "tags": [] }, { "name": "address_standardizer_data_us", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "Address Standardizer US dataset example" + "comment": "Address Standardizer US dataset example", + "tags": [] }, { "name": "address_standardizer_data_us-3", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "Address Standardizer US dataset example" + "comment": "Address Standardizer US dataset example", + "tags": ["addresses"] }, { "name": "adminpack", "schema": null, "default_version": "2.0", "installed_version": null, - "comment": "administrative functions for PostgreSQL" + "comment": "administrative functions for PostgreSQL", + "tags": [] }, { "name": "amcheck", "schema": null, "default_version": "1.2", "installed_version": null, - "comment": "functions for verifying relation integrity" + "comment": "functions for verifying relation integrity", + "tags": [] }, { "name": "autoinc", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "functions for autoincrementing fields" + "comment": "functions for autoincrementing fields", + "tags": [] }, { "name": "bloom", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "bloom access method - signature file based index" + "comment": "bloom access method - signature file based index", + "tags": [] }, { "name": "btree_gin", "schema": null, "default_version": "1.3", "installed_version": null, - "comment": "support for indexing common datatypes in GIN" + "comment": "support for indexing common datatypes in GIN", + "tags": [] }, { "name": "btree_gist", "schema": null, "default_version": "1.5", "installed_version": null, - "comment": "support for indexing common datatypes in GiST" + "comment": "support for indexing common datatypes in GiST", + "tags": [] }, { "name": "citext", "schema": null, "default_version": "1.6", "installed_version": null, - "comment": "data type for case-insensitive character strings" + "comment": "data type for case-insensitive character strings", + "tags": [] }, { "name": "cube", "schema": null, "default_version": "1.4", "installed_version": null, - "comment": "data type for multidimensional cubes" + "comment": "data type for multidimensional cubes", + "tags": [] }, { "name": "dblink", "schema": null, "default_version": "1.2", "installed_version": null, - "comment": "connect to other PostgreSQL databases from within a database" + "comment": "connect to other PostgreSQL databases from within a database", + "tags": [] }, { "name": "dict_int", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "text search dictionary template for integers" + "comment": "text search dictionary template for integers", + "tags": [] }, { "name": "dict_xsyn", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "text search dictionary template for extended synonym processing" + "comment": "text search dictionary template for extended synonym processing", + "tags": [] }, { "name": "earthdistance", "schema": null, "default_version": "1.1", "installed_version": null, - "comment": "calculate great-circle distances on the surface of the Earth" + "comment": "calculate great-circle distances on the surface of the Earth", + "tags": [] }, { "name": "file_fdw", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "foreign-data wrapper for flat file access" + "comment": "foreign-data wrapper for flat file access", + "tags": [] }, { "name": "fuzzystrmatch", "schema": null, "default_version": "1.1", "installed_version": null, - "comment": "determine similarities and distance between strings" + "comment": "determine similarities and distance between strings", + "tags": [] }, { "name": "hstore", "schema": null, "default_version": "1.6", "installed_version": null, - "comment": "data type for storing sets of (key, value) pairs" + "comment": "data type for storing sets of (key, value) pairs", + "tags": [] }, { "name": "http", "schema": "extensions", "default_version": "1.3", "installed_version": "1.3", - "comment": "HTTP client for PostgreSQL, allows web page retrieval inside the database." + "comment": "HTTP client for PostgreSQL, allows web page retrieval inside the database.", + "tags": [] }, { "name": "insert_username", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "functions for tracking who changed a table" + "comment": "functions for tracking who changed a table", + "tags": [] }, { "name": "intagg", "schema": null, "default_version": "1.1", "installed_version": null, - "comment": "integer aggregator and enumerator (obsolete)" + "comment": "integer aggregator and enumerator (obsolete)", + "tags": [] }, { "name": "intarray", "schema": null, "default_version": "1.2", "installed_version": null, - "comment": "functions, operators, and index support for 1-D arrays of integers" + "comment": "functions, operators, and index support for 1-D arrays of integers", + "tags": [] }, { "name": "isn", "schema": null, "default_version": "1.2", "installed_version": null, - "comment": "data types for international product numbering standards" + "comment": "data types for international product numbering standards", + "tags": [] }, { "name": "lo", "schema": null, "default_version": "1.1", "installed_version": null, - "comment": "Large Object maintenance" + "comment": "Large Object maintenance", + "tags": [] }, { "name": "ltree", "schema": null, "default_version": "1.1", "installed_version": null, - "comment": "data type for hierarchical tree-like structures" + "comment": "data type for hierarchical tree-like structures", + "tags": [] }, { "name": "moddatetime", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "functions for tracking last modification time" + "comment": "functions for tracking last modification time", + "tags": [] }, { "name": "pageinspect", "schema": null, "default_version": "1.7", "installed_version": null, - "comment": "inspect the contents of database pages at a low level" + "comment": "inspect the contents of database pages at a low level", + "tags": [] }, { "name": "pg_buffercache", "schema": null, "default_version": "1.3", "installed_version": null, - "comment": "examine the shared buffer cache" + "comment": "examine the shared buffer cache", + "tags": [] }, { "name": "pg_cron", "schema": "extensions", "default_version": "1.3", "installed_version": "1.3", - "comment": "Job scheduler for PostgreSQL" + "comment": "Job scheduler for PostgreSQL", + "tags": [] }, { "name": "pg_freespacemap", "schema": null, "default_version": "1.2", "installed_version": null, - "comment": "examine the free space map (FSM)" + "comment": "examine the free space map (FSM)", + "tags": [] }, { "name": "pg_prewarm", "schema": null, "default_version": "1.2", "installed_version": null, - "comment": "prewarm relation data" + "comment": "prewarm relation data", + "tags": [] }, { "name": "pg_stat_statements", "schema": null, "default_version": "1.7", "installed_version": null, - "comment": "track execution statistics of all SQL statements executed" + "comment": "track execution statistics of all SQL statements executed", + "tags": [] }, { "name": "pg_trgm", "schema": null, "default_version": "1.4", "installed_version": null, - "comment": "text similarity measurement and index searching based on trigrams" + "comment": "text similarity measurement and index searching based on trigrams", + "tags": [] }, { "name": "pg_visibility", "schema": null, "default_version": "1.2", "installed_version": null, - "comment": "examine the visibility map (VM) and page-level visibility info" + "comment": "examine the visibility map (VM) and page-level visibility info", + "tags": [] }, { "name": "pgaudit", "schema": null, "default_version": "1.4", "installed_version": null, - "comment": "provides auditing functionality" + "comment": "provides auditing functionality", + "tags": [] }, { "name": "pgcrypto", "schema": "extensions", "default_version": "1.3", "installed_version": "1.3", - "comment": "cryptographic functions" + "comment": "cryptographic functions", + "tags": [] }, { "name": "pgjwt", "schema": "extensions", "default_version": "0.1.0", "installed_version": "0.1.0", - "comment": "JSON Web Token API for Postgresql" + "comment": "JSON Web Token API for Postgresql", + "tags": [] }, { "name": "pgrowlocks", "schema": null, "default_version": "1.2", "installed_version": null, - "comment": "show row-level locking information" + "comment": "show row-level locking information", + "tags": [] }, { "name": "pgstattuple", "schema": null, "default_version": "1.5", "installed_version": null, - "comment": "show tuple-level statistics" + "comment": "show tuple-level statistics", + "tags": [] }, { "name": "pgtap", "schema": null, "default_version": "1.1.0", "installed_version": null, - "comment": "Unit testing for PostgreSQL" + "comment": "Unit testing for PostgreSQL", + "tags": [] }, { "name": "plcoffee", "schema": null, "default_version": "3.0alpha", "installed_version": null, - "comment": "PL/CoffeeScript (v8) trusted procedural language" + "comment": "PL/CoffeeScript (v8) trusted procedural language", + "tags": [] }, { "name": "pljava", "schema": null, "default_version": "1.6.0", "installed_version": null, - "comment": "PL/Java procedural language (https://tada.github.io/pljava/)" + "comment": "PL/Java procedural language (https://tada.github.io/pljava/)", + "tags": [] }, { "name": "plls", "schema": null, "default_version": "3.0alpha", "installed_version": null, - "comment": "PL/LiveScript (v8) trusted procedural language" + "comment": "PL/LiveScript (v8) trusted procedural language", + "tags": [] }, { "name": "plpgsql", "schema": "pg_catalog", "default_version": "1.0", "installed_version": "1.0", - "comment": "PL/pgSQL procedural language" + "comment": "PL/pgSQL procedural language", + "tags": [] }, { "name": "plpgsql_check", "schema": null, "default_version": "1.11", "installed_version": null, - "comment": "extended check for plpgsql functions" + "comment": "extended check for plpgsql functions", + "tags": [] }, { "name": "plv8", "schema": null, "default_version": "3.0alpha", "installed_version": null, - "comment": "PL/JavaScript (v8) trusted procedural language" + "comment": "PL/JavaScript (v8) trusted procedural language", + "tags": [] }, { "name": "postgis", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "PostGIS geometry and geography spatial types and functions" + "comment": "PostGIS geometry and geography spatial types and functions", + "tags": ["GIS"] }, { "name": "postgis-3", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "PostGIS geometry and geography spatial types and functions" + "comment": "PostGIS geometry and geography spatial types and functions", + "tags": ["GIS"] }, { "name": "postgis_raster", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "PostGIS raster types and functions" + "comment": "PostGIS raster types and functions", + "tags": ["GIS"] }, { "name": "postgis_raster-3", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "PostGIS raster types and functions" + "comment": "PostGIS raster types and functions", + "tags": ["GIS"] }, { "name": "postgis_sfcgal", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "PostGIS SFCGAL functions" + "comment": "PostGIS SFCGAL functions", + "tags": ["GIS"] }, { "name": "postgis_sfcgal-3", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "PostGIS SFCGAL functions" + "comment": "PostGIS SFCGAL functions", + "tags": ["GIS"] }, { "name": "postgis_tiger_geocoder", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "PostGIS tiger geocoder and reverse geocoder" + "comment": "PostGIS tiger geocoder and reverse geocoder", + "tags": ["GIS"] }, { "name": "postgis_tiger_geocoder-3", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "PostGIS tiger geocoder and reverse geocoder" + "comment": "PostGIS tiger geocoder and reverse geocoder", + "tags": ["GIS"] }, { "name": "postgis_topology", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "PostGIS topology spatial types and functions" + "comment": "PostGIS topology spatial types and functions", + "tags": ["GIS"] }, { "name": "postgis_topology-3", "schema": null, "default_version": "3.1.1", "installed_version": null, - "comment": "PostGIS topology spatial types and functions" + "comment": "PostGIS topology spatial types and functions", + "tags": ["GIS"] }, { "name": "postgres_fdw", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "foreign-data wrapper for remote PostgreSQL servers" + "comment": "foreign-data wrapper for remote PostgreSQL servers", + "tags": [] }, { "name": "refint", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "functions for implementing referential integrity (obsolete)" + "comment": "functions for implementing referential integrity (obsolete)", + "tags": [] }, { "name": "seg", "schema": null, "default_version": "1.3", "installed_version": null, - "comment": "data type for representing line segments or floating-point intervals" + "comment": "data type for representing line segments or floating-point intervals", + "tags": [] }, { "name": "sslinfo", "schema": null, "default_version": "1.2", "installed_version": null, - "comment": "information about SSL certificates" + "comment": "information about SSL certificates", + "tags": [] }, { "name": "tablefunc", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "functions that manipulate whole tables, including crosstab" + "comment": "functions that manipulate whole tables, including crosstab", + "tags": [] }, { "name": "tcn", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "Triggered change notifications" + "comment": "Triggered change notifications", + "tags": ["notifications"] }, { "name": "tsm_system_rows", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "TABLESAMPLE method which accepts number of rows as a limit" + "comment": "TABLESAMPLE method which accepts number of rows as a limit", + "tags": [] }, { "name": "tsm_system_time", "schema": null, "default_version": "1.0", "installed_version": null, - "comment": "TABLESAMPLE method which accepts time in milliseconds as a limit" + "comment": "TABLESAMPLE method which accepts time in milliseconds as a limit", + "tags": [] }, { "name": "unaccent", "schema": null, "default_version": "1.1", "installed_version": null, - "comment": "text search dictionary that removes accents" + "comment": "text search dictionary that removes accents", + "tags": [] }, { "name": "uuid-ossp", "schema": "extensions", "default_version": "1.1", "installed_version": "1.1", - "comment": "generate universally unique identifiers (UUIDs)" + "comment": "generate universally unique identifiers (UUIDs)", + "tags": [] }, { "name": "vector", "schema": "extensions", "default_version": "0.4.0", "installed_version": null, - "comment": "vector data type with similarity search" + "comment": "vector data type with similarity search", + "tags": [] }, { "name": "xml2", "schema": null, "default_version": "1.1", "installed_version": null, - "comment": "XPath querying and XSLT" + "comment": "XPath querying and XSLT", + "tags": [] }, { "name": "pg_repack", "schema": "extensions", "default_version": "1.4.8", "installed_version": "1.4.8", - "comment": "optimize physical storage and remove bloat from tables and indexes" + "comment": "optimize physical storage and remove bloat from tables and indexes", + "tags": [] } ] diff --git a/apps/docs/pages/guides/database/extensions.mdx b/apps/docs/pages/guides/database/extensions.mdx index 6ae1fd74546..0002a0e9ab3 100644 --- a/apps/docs/pages/guides/database/extensions.mdx +++ b/apps/docs/pages/guides/database/extensions.mdx @@ -23,10 +23,6 @@ Supabase has pre-installed some of the most useful open source extensions. 2. Click **Extensions** in the sidebar. 3. Enable or disable an extension. - - diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json index ce8de4c02e1..c87a0e51e07 100644 --- a/apps/docs/tsconfig.json +++ b/apps/docs/tsconfig.json @@ -6,7 +6,7 @@ "paths": { "~/*": ["./*"] }, - "target": "es5", + "target": "es2015", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, From 70ec5e1036e66c26112457dea23aefc7068a19e1 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Mon, 6 Feb 2023 10:29:54 -0600 Subject: [PATCH 037/207] postgres extension docs: pg_graphql, wrappers, pg_stat_monitor --- .../NavigationMenu.constants.ts | 17 ++- .../guides/database/extensions/pg_graphql.mdx | 119 ++++++++++++++++++ .../database/extensions/pg_stat_monitor.mdx | 85 +++++++++++++ .../extensions/pg_stat_statements.mdx | 2 +- .../guides/database/extensions/wrappers.mdx | 75 +++++++++++ 5 files changed, 296 insertions(+), 2 deletions(-) create mode 100644 apps/docs/pages/guides/database/extensions/pg_graphql.mdx create mode 100644 apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx create mode 100644 apps/docs/pages/guides/database/extensions/wrappers.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index ba16f51d218..a33c5724c8b 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -409,6 +409,11 @@ export const database = { url: '/guides/database/extensions/pgcron', items: [], }, + { + name: 'pg_graphql: GraphQL support', + url: '/guides/database/extensions/pg_graphql', + items: [], + }, { name: 'pg_jsonschema: JSON Schema Validation', url: '/guides/database/extensions/pg_jsonschema', @@ -420,7 +425,12 @@ export const database = { items: [], }, { - name: 'pg_stat_statements: SQL Planning and Execution Statistics', + name: 'pg_stat_monitor: Extended Query Performance Monitoring', + url: '/guides/database/extensions/pg_stat_monitor', + items: [], + }, + { + name: 'pg_stat_statements: Query Performance Monitoring, url: '/guides/database/extensions/pg_stat_statements', items: [], }, @@ -445,6 +455,11 @@ export const database = { url: '/guides/database/extensions/rum', items: [], }, + { + name: 'wrappers: 3rd Party Integrations', + url: '/guides/database/extensions/rum', + items: [], + }, ], }, { diff --git a/apps/docs/pages/guides/database/extensions/pg_graphql.mdx b/apps/docs/pages/guides/database/extensions/pg_graphql.mdx new file mode 100644 index 00000000000..21be1da6e5b --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pg_graphql.mdx @@ -0,0 +1,119 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pg_graphql', + title: 'pg_graphql: Native GraphQL for PostgreSQL', + description: 'A GraphQL API for PostgreSQL', +} + +[pg_graphql](https://supabase.github.io/pg_graphql/) is PostgreSQL extension for interacting with the database using [GraphQL](https://graphql.org) instead of SQL. + +The extension reflects a GraphQL schema from the existing SQL schema and exposes it through a SQL function, `graphql.resolve(...)`. This enables any programming language that can connect to PostgreSQL to query the database via GraphQL with no additional servers, processes, or libraries. + +The `pg_graphql` resolve method is designed to interop with [PostgREST](https://postgrest.org/en/stable/index.html), the tool that underpins the Supabase API, such that the `graphql.resolve` function can be called via RPC to safely and performantly expose the GraphQL API over HTTP/s. + +For more information about how the SQL schema is reflected into a GraphQL schema, see the [pg_graphql API docs](https://supabase.github.io/pg_graphql/api/). + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pg_graphql" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "pg_graphql" extension +create extension pg_graphql; + +-- Disable the "pg_graphql" extension +drop extension if exists pg_graphql; +``` + +Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". +To disable an extension you can call `drop extension`. + + + + +## Usage + +Given a table + +{/* prettier-ignore */} +```sql +create table "Blog"( + id serial primary key, + name varchar(255) not null, + description varchar(255), +); + +insert into "Blog"(name) +values ('My Blog'); +``` + +The reflected GraphQL schema can be queries immediately as + +{/* prettier-ignore */} +```sql +select + graphql.resolve($$ + { + blogCollection(first: 1) { + edges { + node { + id, + name + } + } + } + } + $$); +``` + +returning the JSON + +{/* prettier-ignore */} +```json +{ + "data": { + "blogCollection": { + "edges": [ + { + "node": { + "id": 1 + "name": "My Blog" + } + } + ] + } + } +} +``` + +Note that pg_graphql fully supports schema introspection so you can connect any IDE or schema inspection tool to see the full set of fields and arguments available in the API. + +## API + +- [`graphql.resolve`](https://supabase.github.io/pg_graphql/sql_interface/): A SQL function for executing GraphQL queries. + + +## Resources + +- Official [`pg_graphql` documentation](https://github.com/supabase/pg_graphql) + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx new file mode 100644 index 00000000000..801f9f7bb92 --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx @@ -0,0 +1,85 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pg_stat_monitor', + title: 'pg_stat_monitor: Query Performance Monitoring', + description: 'Query performance monitoring for PostgreSQL', +} + +[pg_stat_monitor](https://github.com/percona/pg_stat_monitor) is query performance monitoring tool that provides query execution statistics in a SQL view named `pg_stat_monitor`. It tracks a superset of statistics available in [`pg_stat_statements`](https://www.postgresql.org/docs/current/pgstatstatements.html). + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pg_stat_monitor" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "pg_stat_monitor" extension +create extension pg_stat_monitor with schema extensions; + +-- Disable the "pg_stat_monitor" extension +drop extension if exists pg_stat_monitor; +``` + +Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". +To disable an extension you can call `drop extension`. + +It's good practice to create the extension within a separate schema (like `extensions`) to keep your database clean. + + + + +## Views + +{/* prettier-ignore */} +```sql +select * from extensions.pg_stat_monitor; +``` + +The following table shows a subset of available columns: + +| Column Type | Description | +| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| bucket bigint | Data collection unit. The number shows what bucket in a chain a record belongs to | +| bucket_start_time timestampz | The start time of the bucket | +| userid oid (references pg_authid.oid) | OID of user who executed the statement | +| dbid oid (references pg_database.oid) | OID of database in which the statement was executed | +| toplevel bool | True if the query was executed as a top-level statement (always true if pg_stat_statements.track is set to top) | +| client_ip inet | The IP address of a client that ran the query | +| queryid bigint | Hash code to identify identical normalized queries. | +| planid text | An internally generated ID of a query plan | +| query_plan text | The sequence of steps used to execute a query. This parameter is only available when pgsm_enable_query_plan is enabled | +| query text | Text of a representative statement | +| plans bigint | Number of times the statement was planned (if pg_stat_statements.track_planning is enabled, otherwise zero) | +| total_plan_time double precision | Total time spent planning the statement, in milliseconds (if pg_stat_statements.track_planning is enabled, otherwise zero) | +| min_plan_time double precision | Minimum time spent planning the statement, in milliseconds (if pg_stat_statements.track_planning is enabled, otherwise zero) | + +A full list of statistics is available in the [pg_stat_monitor](https://docs.percona.com/pg-stat-monitor/reference.html#postgresql-15) docs. + +## Functions +- [`pg_stat_monitor_reset()`](https://docs.percona.com/pg-stat-monitor/functions.html): Resets the statistics tracked by the `pg_stat_monitor` view and deletes all previous data. +- [`pg_stat_monitor_version()`](https://docs.percona.com/pg-stat-monitor/functions.html): Displays the version of the `pg_stat_monitor` extension. + + +## Resources + +- Official [`pg_stat_monitor` documentation](https://github.com/percona/pg_stat_monitor) + +export const Page = ({ children }) => + +export default Page diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx index 711878d78c0..e699a30eb8e 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx @@ -2,7 +2,7 @@ import Layout from '~/layouts/DefaultGuideLayout' export const meta = { id: 'pg_stat_statements', - title: 'pg_stat_statements: SQL Planning and Execution Statistics', + title: 'pg_stat_statements: Query Performance Monitoring', description: 'Track planning and execution statistics of all SQL statements executed on the database.', } diff --git a/apps/docs/pages/guides/database/extensions/wrappers.mdx b/apps/docs/pages/guides/database/extensions/wrappers.mdx new file mode 100644 index 00000000000..1368d9e1ece --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/wrappers.mdx @@ -0,0 +1,75 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'wrappers', + title: 'wrappers: 3rd Party Integrations', + description: '3rd party integrations for PostgreSQL ', +} + +[supabase/wrappers](https://supabase.github.io/wrappers/) is a PostgreSQL extension that provides integrations with external sources so you can interact with third-party data using SQL. + +For example, the [Stripe wrapper](https://supabase.github.io/wrappers/stripe/) connects to [Stripe's API](https://stripe.com/docs/api) and exposes each endpoint as a SQL table. + +{/* prettier-ignore */} +```sql +select + customer_id + currency +from + stripe.customers; + + customer_id | currency +--------------------+----------- + cus_MJiBtCqOF1Bb3F | usd +(1 row) +``` + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "wrappers" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "wrappers" extension +create extension wrappers with schema extensions; + +-- Disable the "wrappers" extension +drop extension if exists wrappers; +``` + + + + +Instructions for setting up connections to each 3rd party service via SQL are avaiable at the links in the integrations section below. +A web interface for connecting to external data is coming to Supabase Studio in 2023. + +## Integrations + +- [Firebase](https://supabase.github.io/wrappers/firebase/) +- [Stripe](https://supabase.github.io/wrappers/stripe/) +- Airtable - Coming Soon +- BigQuery - Coming Soon +- Clickhouse - Coming Soon + +## Resources + +- Official [`supabase/wrappers` documentation](https://supabase.github.io/wrappers/) + +export const Page = ({ children }) => + +export default Page From 0f99a96f873bd2869fcc858d0f5dcb20e4785778 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Mon, 6 Feb 2023 10:31:43 -0600 Subject: [PATCH 038/207] typo: url --- .../Navigation/NavigationMenu/NavigationMenu.constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index a33c5724c8b..ac78e5d91a7 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -457,7 +457,7 @@ export const database = { }, { name: 'wrappers: 3rd Party Integrations', - url: '/guides/database/extensions/rum', + url: '/guides/database/extensions/wrappers', items: [], }, ], From 3f6ef12f5f1938c0fc8a38206c3123ad147c1100 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 7 Feb 2023 13:40:48 -0330 Subject: [PATCH 039/207] Updates --- apps/www/data/PricingFAQ.json | 4 ++-- apps/www/pages/pricing/index.tsx | 41 +++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/apps/www/data/PricingFAQ.json b/apps/www/data/PricingFAQ.json index f6d897e8541..44fa8c58784 100644 --- a/apps/www/data/PricingFAQ.json +++ b/apps/www/data/PricingFAQ.json @@ -1,7 +1,7 @@ [ { "question": "Can I cap my usage so my bill doesn't run over?", - "answer": "Yes. Spend caps are on by default on the pro tier. You can turn spend caps off for usage beyond the tier limits to pay as you grow." + "answer": "Yes. Spend caps are on by default on the Pro tier. You can turn spend caps off for usage beyond the tier limits to pay as you grow." }, { "question": "I'm worried I could end up with a huge bill at the end of the month.", @@ -9,7 +9,7 @@ }, { "question": "When will I be billed?", - "answer": "Our Pro plan is charged up front, and billed on a monthly basis. Additional usage costs are also billed at the end of the month." + "answer": "Our Pro tier is charged up front, and billed on a monthly basis. Additional usage costs are also billed at the end of the month." }, { "question": "Are you going to change your pricing in the future?", diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 4c2c0f14a75..e3cadbf6723 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -855,17 +855,52 @@ export default function IndexPage() { Can't find the answer to your question, ask someone in the community either on our Discord or GitHub.

-
+
- - From 4e6036e44b75a248b7d4aa505c00ff71980fda12 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 7 Feb 2023 16:07:03 -0330 Subject: [PATCH 040/207] Style nudges --- .../www/components/Pricing/PricingTableRow.tsx | 8 ++++---- apps/www/pages/pricing/index.tsx | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index 799d9113597..fb44f3a0baa 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -1,6 +1,6 @@ -import { IconHelpCircle, IconInfo, IconX, IconXCircle, Modal } from 'ui' +import { IconHelpCircle } from 'ui' import ProductIcon from 'components/ProductIcon' -import React, { Fragment, useState } from 'react' +import React, { Fragment } from 'react' import ReactTooltip from 'react-tooltip' export const Check = () => ( @@ -145,7 +145,7 @@ export const PricingTableRowDesktop = (props: any) => { ) })} - + ) } @@ -200,7 +200,7 @@ export const PricingTableRowMobile = (props: any) => { })}
- + ) } diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index e3cadbf6723..2b106595f57 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -119,7 +119,7 @@ export default function IndexPage() { href: 'https://forms.supabase.com/enterprise', description: 'For large-scale applications managing serious workloads.', features: [ - `Point in time recovery`, + `Point in Time Recovery`, `Designated Support manager & SLAs`, `Enterprise OAuth providers`, `SSO/ SAML`, @@ -140,7 +140,7 @@ export default function IndexPage() { heroImg: 'addons-compute-hero', icon: 'compute-upgrade', price: 'Starts from $5', - description: 'Increase the captability of your database only for what you need.', + description: 'Increase the capability of your database only for what you need.', leftCtaText: 'Documentation', leftCtaLink: 'http://.....', rightCtaText: 'See Pricing breakdown', @@ -159,7 +159,7 @@ export default function IndexPage() { rightCtaLink: 'http://', }, { - name: 'Point in time recovery', + name: 'Point in Time Recovery', heroImg: 'addons-pitr-hero', icon: 'pitr-upgrade', price: 'Starts from $5', @@ -367,7 +367,7 @@ export default function IndexPage() { )}
- @@ -391,7 +391,7 @@ export default function IndexPage() {
-

Easily customizable add-Ons

+

Easily customizable add-ons

Level up your Supabase experience with add-ons.

@@ -762,7 +762,7 @@ export default function IndexPage() { @@ -825,7 +825,7 @@ export default function IndexPage() { - @@ -835,7 +835,7 @@ export default function IndexPage() { - From 91e4317e15ed53cb9e8b1addd0a0c7e240acd840 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Wed, 8 Feb 2023 14:29:27 +0800 Subject: [PATCH 041/207] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 1e8e34a634f..ddf6ccb85b8 100644 --- a/README.md +++ b/README.md @@ -60,8 +60,6 @@ Supabase is a combination of open source tools. We’re building the features of Supabase is a [hosted platform](https://app.supabase.com). You can sign up and start using Supabase without installing anything. You can also [self-host](https://supabase.com/docs/guides/hosting/overview) and [develop locally](https://supabase.com/docs/guides/local-development). -![diagram (1)](https://user-images.githubusercontent.com/8291514/191737181-22e6a111-817d-403b-8c3f-489279a2a7da.png) - ![Architecture](https://user-images.githubusercontent.com/70828596/187547862-ffa9d058-0c3a-4851-a3e7-92ccfca4b596.png) - [PostgreSQL](https://www.postgresql.org/) is an object-relational database system with over 30 years of active development that has earned it a strong reputation for reliability, feature robustness, and performance. From ac95a9902d2f97946807efdb78010fc025d016e9 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Wed, 8 Feb 2023 14:30:00 +0800 Subject: [PATCH 042/207] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index ddf6ccb85b8..5a072442ae4 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,6 @@ --- - - # Supabase [Supabase](https://supabase.com) is an open source Firebase alternative. We're building the features of Firebase using enterprise-grade open source tools. From ec13ef30836d613ba17ea26e5cf0ee9f13b33e80 Mon Sep 17 00:00:00 2001 From: "Jarlem Red J. de Peralta" Date: Wed, 8 Feb 2023 21:30:20 +0800 Subject: [PATCH 043/207] Rename all occurences of `invalid` to `fail` - `invalid` seems to be an invalid exported member of `@sveltejs/kit` - The most similar and appropriate method to use is [fail] - It may seem that `invalid` was the former name of `fail` method - but was renamed after `SvelteKit`'s recent official major release. - However I am not sure of that. [fail]: https://kit.svelte.dev/docs/modules#sveltejs-kit-fail --- apps/docs/pages/guides/auth/auth-helpers/sveltekit.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/docs/pages/guides/auth/auth-helpers/sveltekit.mdx b/apps/docs/pages/guides/auth/auth-helpers/sveltekit.mdx index bcdcef28fc2..7598037b2d8 100644 --- a/apps/docs/pages/guides/auth/auth-helpers/sveltekit.mdx +++ b/apps/docs/pages/guides/auth/auth-helpers/sveltekit.mdx @@ -257,7 +257,7 @@ Wrap an Action to check that the user has a valid session. If they're not logged ```ts title=src/routes/posts/+page.server.ts import type { Actions } from './$types' import { getSupabase } from '@supabase/auth-helpers-sveltekit' -import { error, invalid } from '@sveltejs/kit' +import { error, fail } from '@sveltejs/kit' export const actions: Actions = { createPost: async (event) => { @@ -276,7 +276,7 @@ export const actions: Actions = { .insert({ content }) if (createPostError) { - return invalid(500, { + return fail(500, { supabaseErrorMessage: createPostError.message, }) } @@ -293,7 +293,7 @@ If you try to submit a form with the action `?/createPost` without a valid sessi ```ts import type { Actions } from './$types' -import { invalid, redirect } from '@sveltejs/kit' +import { fail, redirect } from '@sveltejs/kit' import { getSupabase } from '@supabase/auth-helpers-sveltekit' import { AuthApiError } from '@supabase/supabase-js' @@ -313,14 +313,14 @@ export const actions: Actions = { if (error) { if (error instanceof AuthApiError && error.status === 400) { - return invalid(400, { + return fail(400, { error: 'Invalid credentials.', values: { email, }, }) } - return invalid(500, { + return fail(500, { error: 'Server error. Try again later.', values: { email, From 4b7ff902ed73f53d6db7926c6a542509a0cdd34c Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Wed, 8 Feb 2023 15:39:02 -0600 Subject: [PATCH 044/207] postgres extension docs: pgrouting --- .../NavigationMenu.constants.ts | 5 + .../guides/database/extensions/pgrouting.mdx | 162 ++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 apps/docs/pages/guides/database/extensions/pgrouting.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index ac78e5d91a7..f1f9fc7c0cc 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -404,6 +404,11 @@ export const database = { url: '/guides/database/extensions/pgroonga', items: [], }, + { + name: 'pgRouting: Geospatial Routing', + url: '/guides/database/extensions/pgrouting', + items: [], + }, { name: 'pg_cron: Job Scheduling', url: '/guides/database/extensions/pgcron', diff --git a/apps/docs/pages/guides/database/extensions/pgrouting.mdx b/apps/docs/pages/guides/database/extensions/pgrouting.mdx new file mode 100644 index 00000000000..45b55737f80 --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pgrouting.mdx @@ -0,0 +1,162 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pgrouting', + title: 'pgrouting: Geospatial Routing', + description: 'Extends PostGIS with Geospatial Routing', +} + +[pgRouting](http://pgrouting.org) is PostgreSQL and [PostGIS](http://postgis.net) extension adding geospatial routing functionality. + +The core functionality of pgRouting is a set of path finding algorithms including: + +- All Pairs Shortest Path, Johnson’s Algorithm +- All Pairs Shortest Path, Floyd-Warshall Algorithm +- Shortest Path A* +- Bi-directional Dijkstra Shortest Path +- Bi-directional A* Shortest Path +- Shortest Path Dijkstra +- Driving Distance +- K-Shortest Path, Multiple Alternative Paths +- K-Dijkstra, One to Many Shortest Path +- Traveling Sales Person +- Turn Restriction Shortest Path (TRSP) + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pgrouting" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "pgRouting" extension +create extension pgrouting cascade; + +-- Disable the "pgRouting" extension +drop extension if exists pgRouting; +``` + +Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". +To disable an extension you can call `drop extension`. + + + + +## Example Usage + +As an example, we'll solve the [traveling salesman probelem](https://en.wikipedia.org/wiki/Travelling_salesman_problem) using the pgRouting's `pgr_TSPeuclidean` function from some PostGIS coodinates. + +A summary of the traveling salesman problem is, given a set of city coordinates, solve for a path that goes through each city and minimizes the total distance traveled. + +First we populate a table with some X, Y coordiantes +{/* prettier-ignore */} +```sql +create table wi29 ( + id bigint, + x float, + y float, + geom geometry +); + +insert into wi29 (id, x, y) +values + (1,20833.3333,17100.0000), + (2,20900.0000,17066.6667), + (3,21300.0000,13016.6667), + (4,21600.0000,14150.0000), + (5,21600.0000,14966.6667), + (6,21600.0000,16500.0000), + (7,22183.3333,13133.3333), + (8,22583.3333,14300.0000), + (9,22683.3333,12716.6667), + (10,23616.6667,15866.6667), + (11,23700.0000,15933.3333), + (12,23883.3333,14533.3333), + (13,24166.6667,13250.0000), + (14,25149.1667,12365.8333), + (15,26133.3333,14500.0000), + (16,26150.0000,10550.0000), + (17,26283.3333,12766.6667), + (18,26433.3333,13433.3333), + (19,26550.0000,13850.0000), + (20,26733.3333,11683.3333), + (21,27026.1111,13051.9444), + (22,27096.1111,13415.8333), + (23,27153.6111,13203.3333), + (24,27166.6667,9833.3333), + (25,27233.3333,10450.0000), + (26,27233.3333,11783.3333), + (27,27266.6667,10383.3333), + (28,27433.3333,12400.0000), + (29,27462.5000,12992.2222); +``` + +Next we use the `pgr_TSPeuclidean` function to find the best path. + +{/* prettier-ignore */} +```sql +select + * +from + pgr_TSPeuclidean($$select * from wi29$$) +``` + +{/* prettier-ignore */} +```sql + seq | node | cost | agg_cost +-----+------+------------------+------------------ + 1 | 1 | 0 | 0 + 2 | 2 | 74.535614157127 | 74.535614157127 + 3 | 6 | 900.617093380362 | 975.152707537489 + 4 | 10 | 2113.77757765045 | 3088.93028518793 + 5 | 11 | 106.718669615254 | 3195.64895480319 + 6 | 12 | 1411.95293791574 | 4607.60189271893 + 7 | 13 | 1314.23824873744 | 5921.84014145637 + 8 | 14 | 1321.76283931305 | 7243.60298076942 + 9 | 17 | 1202.91366735569 | 8446.5166481251 + 10 | 18 | 683.333268292684 | 9129.84991641779 + 11 | 15 | 1108.05137466134 | 10237.9012910791 + 12 | 19 | 772.082339448903 | 11009.983630528 + 13 | 22 | 697.666150054665 | 11707.6497805827 + 14 | 23 | 220.141999627513 | 11927.7917802102 + 15 | 21 | 197.926372783442 | 12125.7181529937 + 16 | 29 | 440.456596290771 | 12566.1747492844 + 17 | 28 | 592.939989005405 | 13159.1147382898 + 18 | 26 | 648.288376333318 | 13807.4031146231 + 19 | 20 | 509.901951359278 | 14317.3050659824 + 20 | 25 | 1330.83095428717 | 15648.1360202696 + 21 | 27 | 74.535658878487 | 15722.6716791481 + 22 | 24 | 559.016994374947 | 16281.688673523 + 23 | 16 | 1243.87392358622 | 17525.5625971092 + 24 | 9 | 4088.0585364911 | 21613.6211336004 + 25 | 7 | 650.85409697993 | 22264.4752305803 + 26 | 3 | 891.004385199336 | 23155.4796157796 + 27 | 4 | 1172.36699411442 | 24327.846609894 + 28 | 8 | 994.708187806297 | 25322.5547977003 + 29 | 5 | 1188.01888359478 | 26510.5736812951 + 30 | 1 | 2266.91173136004 | 28777.4854126552 +``` + +Given a table + +## Resources + +- Official [`pgRouting` documentation](https://docs.pgrouting.org/latest/en/index.html) + +export const Page = ({ children }) => + +export default Page From dfdc0b9eda93b960485030dff3f311af195c3916 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Wed, 8 Feb 2023 22:36:44 -0330 Subject: [PATCH 045/207] Add is_platform check for running clippy locally --- apps/docs/.env.example | 1 - apps/docs/components/Clippy/Clippy.tsx | 3 ++- .../NavigationMenu/TopNavBarRef.tsx | 21 +++++++++++-------- apps/docs/lib/constants.ts | 1 + apps/docs/pages/_app.tsx | 20 +++++++++++++++--- 5 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 apps/docs/lib/constants.ts diff --git a/apps/docs/.env.example b/apps/docs/.env.example index 074fa5ced44..bbf747a73ef 100644 --- a/apps/docs/.env.example +++ b/apps/docs/.env.example @@ -1,5 +1,4 @@ # PUBLIC -NEXT_PUBLIC_NEW_DOCS=true NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321 NEXT_PUBLIC_SUPABASE_ANON_KEY= diff --git a/apps/docs/components/Clippy/Clippy.tsx b/apps/docs/components/Clippy/Clippy.tsx index 8a49e2a9306..10858f23fc7 100644 --- a/apps/docs/components/Clippy/Clippy.tsx +++ b/apps/docs/components/Clippy/Clippy.tsx @@ -2,6 +2,7 @@ import { useTheme } from 'common/Providers' import Image from 'next/image' import { FC } from 'react' import { createPortal } from 'react-dom' +import { IS_PLATFORM } from '~/lib/constants' import clippyImageDark from '../../public/img/clippy-dark.png' import clippyImage from '../../public/img/clippy.png' import ClippyBubble from './ClippyBubble' @@ -24,7 +25,7 @@ const Clippy: FC = () => { */}
)} - {isOpen && createPortal(, document.body)} + {isOpen && IS_PLATFORM && createPortal(, document.body)} ) } diff --git a/apps/docs/components/Navigation/NavigationMenu/TopNavBarRef.tsx b/apps/docs/components/Navigation/NavigationMenu/TopNavBarRef.tsx index 2fd9b545aa8..8d412d0fae1 100644 --- a/apps/docs/components/Navigation/NavigationMenu/TopNavBarRef.tsx +++ b/apps/docs/components/Navigation/NavigationMenu/TopNavBarRef.tsx @@ -11,6 +11,7 @@ import clippyImage from '../../../public/img/clippy.png' import { getPageType } from '~/lib/helpers' import { useClippy } from '~/components/Clippy/ClippyProvider' +import { IS_PLATFORM } from '~/lib/constants' const TopNavBarRef: FC = () => { const { isDarkMode, toggleTheme } = useTheme() @@ -118,15 +119,17 @@ const TopNavBarRef: FC = () => {
-
- Clippy -
+ {IS_PLATFORM && ( +
+ Clippy +
+ )}
diff --git a/apps/www/components/Blog/BlogListItem.tsx b/apps/www/components/Blog/BlogListItem.tsx index bc77f543bf7..c08b5006db7 100644 --- a/apps/www/components/Blog/BlogListItem.tsx +++ b/apps/www/components/Blog/BlogListItem.tsx @@ -58,6 +58,7 @@ const BlogListItem = ({ post }: Props) => { {`${author.author} -
+
{x.alt}
diff --git a/apps/www/pages/blog/[slug].tsx b/apps/www/pages/blog/[slug].tsx index f5762169a36..1d612ab7b95 100644 --- a/apps/www/pages/blog/[slug].tsx +++ b/apps/www/pages/blog/[slug].tsx @@ -209,6 +209,7 @@ function BlogPostPage(props: any) { {`${author.author} {props.blog.title} diff --git a/apps/www/pages/brand-assets.tsx b/apps/www/pages/brand-assets.tsx index e29ca0ee249..72eb3c161c5 100644 --- a/apps/www/pages/brand-assets.tsx +++ b/apps/www/pages/brand-assets.tsx @@ -49,7 +49,12 @@ const Index = () => {
- + Supabase logo Preview
diff --git a/apps/www/pages/launch-week/index.tsx b/apps/www/pages/launch-week/index.tsx index 113e177a1b0..d6b8ce5e077 100644 --- a/apps/www/pages/launch-week/index.tsx +++ b/apps/www/pages/launch-week/index.tsx @@ -1,5 +1,4 @@ // @ts-nocheck - import { NextSeo } from 'next-seo' import _days from '~/components/LaunchWeek/lw6_days.json' @@ -19,6 +18,7 @@ import { WeekDayProps } from '~/components/LaunchWeek/types' import styles from './launchWeek.module.css' import Image from 'next/image' +import Link from 'next/link' const days = _days as WeekDayProps[] const constellation = [ @@ -122,33 +122,51 @@ export default function launchweek() { const SectionButtons = ({ blog, docs, video }) => { return (
- -
- Blog post -
- -
-
-
- {docs && ( - + +
- Docs + Blog post
- + blog post icon
+ + {docs && ( + + +
+ Docs +
+ docs icon +
+
+
+ )} {video && ( - - ) @@ -181,12 +199,11 @@ export default function launchweek() { >
- Launch Week logo

Dec 12 – 16 at 6 AM PT | 9 AM ET

@@ -228,9 +245,10 @@ export default function launchweek() { Ant & Copple + />
Who we hire at Supabase @@ -238,22 +256,34 @@ export default function launchweek() {
- - @@ -263,9 +293,10 @@ export default function launchweek() {
Outro icon + />
Wrap Up @@ -273,14 +304,20 @@ export default function launchweek() {
@@ -433,6 +470,7 @@ export default function launchweek() { ? '/images/launchweek/mfa-dark.png' : '/images/launchweek/mfa-light.png' } + alt="MFA" layout="fill" objectFit="cover" quality={100} @@ -446,6 +484,7 @@ export default function launchweek() { ? '/images/launchweek/mfa-dark-hover.png' : '/images/launchweek/mfa-light-hover.png' } + alt="MFA" layout="fill" objectFit="cover" quality={100} @@ -492,6 +531,7 @@ export default function launchweek() { ? '/images/launchweek/wrappers-visual.svg' : '/images/launchweek/wrappers-visual-light.svg' } + alt="Wrappers" layout="fill" objectFit="cover" quality={100} @@ -508,6 +548,7 @@ export default function launchweek() { ? '/images/launchweek/wrappers-visual-hover.svg' : '/images/launchweek/wrappers-visual-hover-light.svg' } + alt="Wrappers" layout="fill" objectFit="cover" quality={100} @@ -559,6 +600,7 @@ export default function launchweek() { ? '/images/launchweek/vault-visual.svg' : '/images/launchweek/vault-visual-light.svg' } + alt="Vault" layout="fill" objectFit="cover" quality={100} @@ -575,6 +617,7 @@ export default function launchweek() { ? '/images/launchweek/vault-visual-hover.svg' : '/images/launchweek/vault-visual-hover-light.svg' } + alt="Vault" layout="fill" objectFit="cover" quality={100} @@ -601,6 +644,7 @@ export default function launchweek() { ? '/images/launchweek/TCE-visual.svg' : '/images/launchweek/TCE-visual-light.svg' } + alt="TCE" layout="fill" objectFit="cover" quality={100} @@ -617,6 +661,7 @@ export default function launchweek() { ? '/images/launchweek/TCE-visual-hover.svg' : '/images/launchweek/TCE-visual-hover-light.svg' } + alt="TCE" layout="fill" objectFit="cover" quality={100} @@ -648,6 +693,7 @@ export default function launchweek() { ? '/images/launchweek/community-visual.svg' : '/images/launchweek/community-visual-light.svg' } + alt="Community" layout="fill" objectFit="cover" quality={100} @@ -664,6 +710,7 @@ export default function launchweek() { ? '/images/launchweek/community-visual-hover.svg' : '/images/launchweek/community-visual-light-hover.svg' } + alt="Community" layout="fill" objectFit="cover" quality={100} @@ -675,68 +722,64 @@ export default function launchweek() {
- -
- Blog post - - - - @@ -755,6 +798,7 @@ export default function launchweek() { ? '/images/launchweek/PgGraphql-visual.svg' : '/images/launchweek/PgGraphql-visual-light.svg' } + alt="PgGraphql" layout="fill" objectFit="cover" quality={100} @@ -771,6 +815,7 @@ export default function launchweek() { ? '/images/launchweek/PgGraphql-visual-hover.svg' : '/images/launchweek/PgGraphql-visual-hover-light.svg' } + alt="PgGraphql" layout="fill" objectFit="cover" quality={100} @@ -800,6 +845,7 @@ export default function launchweek() { ? '/images/launchweek/custom-domains-visual.svg' : '/images/launchweek/custom-domains-visual-light.svg' } + alt="Custom Domains" layout="fill" objectFit="cover" quality={100} @@ -816,6 +862,7 @@ export default function launchweek() { ? '/images/launchweek/custom-domains-visual-hover.svg' : '/images/launchweek/custom-domains-visual-hover-light.svg' } + alt="Custom Domains" layout="fill" objectFit="cover" quality={100} @@ -845,6 +892,7 @@ export default function launchweek() { ? '/images/launchweek/PITR-visual.svg' : '/images/launchweek/PITR-visual-light.svg' } + alt="PITR" layout="fill" objectFit="cover" quality={100} @@ -861,6 +909,7 @@ export default function launchweek() { ? '/images/launchweek/PITR-visual-hover.svg' : '/images/launchweek/PITR-visual-hover-light.svg' } + alt="PITR" layout="fill" objectFit="cover" quality={100} @@ -890,6 +939,7 @@ export default function launchweek() { ? '/images/launchweek/pg_crdt-visual.svg' : '/images/launchweek/pg_crdt-visual-light.svg' } + alt="pg_crdt" layout="fill" objectFit="cover" quality={100} @@ -906,6 +956,7 @@ export default function launchweek() { ? '/images/launchweek/pg_crdt-visual-hover.svg' : '/images/launchweek/pg_crdt-visual-hover-light.svg' } + alt="pg_crdt" layout="fill" objectFit="cover" quality={100} @@ -935,6 +986,7 @@ export default function launchweek() { ? '/images/launchweek/postgres-visual.svg' : '/images/launchweek/postgres-visual-light.svg' } + alt="postgres" layout="fill" objectFit="cover" quality={100} @@ -951,6 +1003,7 @@ export default function launchweek() { ? '/images/launchweek/postgres-visual-hover.svg' : '/images/launchweek/postgres-visual-hover-light.svg' } + alt="postgres" layout="fill" objectFit="cover" quality={100} @@ -980,6 +1033,7 @@ export default function launchweek() { ? '/images/launchweek/PostgREST11-visual.svg' : '/images/launchweek/PostgREST11-visual-light.svg' } + alt="PostgREST11" layout="fill" objectFit="cover" quality={100} @@ -996,6 +1050,7 @@ export default function launchweek() { ? '/images/launchweek/PostgREST11-visual-hover.svg' : '/images/launchweek/PostgREST11-visual-hover-light.svg' } + alt="PostgREST11" layout="fill" objectFit="cover" quality={100} @@ -1039,14 +1094,11 @@ export default function launchweek() { The traditional parallel Hackathon is back! Build a new open source project with Supabase and you can win $1500 in GitHub sponsorships and a coveted Supabase Darkmode Keyboard! For more info check the{' '} - - blog post - + + + blog post + + .

@@ -1074,27 +1126,27 @@ export default function launchweek() { or if you just want to chill and watch people build, come and join us!

- - Join our Discord - + + + Join our Discord{' '} + + +

Submission

Submit your project through{' '} - - madewithsupabase.com - + + + madewithsupabase.com + + . All submissions must be open source and publically available. Submissions close Monday 19th Dec 00:01 AM PT.

@@ -1106,75 +1158,73 @@ export default function launchweek() { 'flex basis-1/3 flex-col px-5' )} > - -
- -

Supabase Cache Helpers

-

Previous Best Overall Project Winner

-
-
- -
- -

Super UI

-

Previous Best Overall Project Runner Up

-
-
- -
- -

Quid Faciam Hodie?

-

Winner Best Flutter Project

-
-
- -
- -

That Hot Dog Game

-

Previous Winner: Most Fun/Interesting

-
-
- -
- -

RepoWatch

-

Previous Winner Best Realtime Project

-
-
+ + +
+ link icon +

Supabase Cache Helpers

+

Previous Best Overall Project Winner

+
+
+ + + +
+ link icon +

Super UI

+

+ Previous Best Overall Project Runner Up +

+
+
+ + + +
+ link icon +

Quid Faciam Hodie?

+

Winner Best Flutter Project

+
+
+ + + +
+ link icon +

That Hot Dog Game

+

Previous Winner: Most Fun/Interesting

+
+
+ + + +
+ link icon +

RepoWatch

+

Previous Winner Best Realtime Project

+
+
+
@@ -1202,12 +1252,15 @@ export default function launchweek() { >
- - - + + + {`${creator.first_name} + +
) @@ -1227,12 +1280,14 @@ export default function launchweek() {

We worked with more than 30 content creators from around the world to drop a mountain of content simultaneously! - -

- + + +
+ See all the content + +
+
+

{activeCreator !== null && (
diff --git a/apps/www/pages/partners/[slug].tsx b/apps/www/pages/partners/[slug].tsx index dc498cae9fc..7ce29906765 100644 --- a/apps/www/pages/partners/[slug].tsx +++ b/apps/www/pages/partners/[slug].tsx @@ -115,12 +115,12 @@ function Partner({ partner }: { partner: Partner }) { {partner.video && (
+
+ +
## Important Notes diff --git a/apps/www/_blog/2020-06-01-supabase-alpha-may-2020.mdx b/apps/www/_blog/2020-06-01-supabase-alpha-may-2020.mdx index afacbae0458..fc9d49b9ba6 100644 --- a/apps/www/_blog/2020-06-01-supabase-alpha-may-2020.mdx +++ b/apps/www/_blog/2020-06-01-supabase-alpha-may-2020.mdx @@ -14,15 +14,15 @@ video: https://www.youtube.com/v/e4qXmcEFaUs It has been a monster month at [Supabase](/) and we're back with a video update. It's a longer video this month because we have a couple of housekeeping items. - +
+ +
## Housekeeping diff --git a/apps/www/_blog/2020-07-01-supabase-alpha-june-2020.mdx b/apps/www/_blog/2020-07-01-supabase-alpha-june-2020.mdx index f84f144d0ea..4baf3f31a58 100644 --- a/apps/www/_blog/2020-07-01-supabase-alpha-june-2020.mdx +++ b/apps/www/_blog/2020-07-01-supabase-alpha-june-2020.mdx @@ -17,66 +17,66 @@ We're now 4 months into building [Supabase](/), which means another major update Watch a full demo: - +
+ +
### View relational data We're sometimes asked how we will make Postgres as simple as Firebase, since Postgres is a relational database. This month we're making our first steps to prove that relational databases can be even easier to use than document stores. We're releasing an excel-like editing interface which can drill down into your relational data. - +
+ +
### Manage JSON data Postgres is an amazing database, giving the flexibility of a document store with the power of a RDBMS. If you use `JSON` data in Postgres, then we want to make that easy too. Supabase detects when your column is `JSON` or `JSONB`, and provides an easy way to edit and view your data. More improvements coming soon for this feature! - +
+ +
### Choose your region If you noticed a bit of latency on Supabase, it's because your projects were previously set up in Singapore. It was always our intention that you'd be able to choose your database region, and this month we've delivered it. In the next releases we'll even allow you to go multi-region, instantly replicating your database close to your customers. - +
+ +
### Backups A guiding principle at Supabase is zero lock-in. So this month we are exposing your daily database backups on the dashboard, giving you a simple way to migrate off Supabase. We have a lot more to build in this space (`WAL-G!`), so watch this space. - +
+ +
### Kaizen diff --git a/apps/www/_blog/2020-08-02-supabase-alpha-july-2020.mdx b/apps/www/_blog/2020-08-02-supabase-alpha-july-2020.mdx index 6d5847735c1..e93c38d00f3 100644 --- a/apps/www/_blog/2020-08-02-supabase-alpha-july-2020.mdx +++ b/apps/www/_blog/2020-08-02-supabase-alpha-july-2020.mdx @@ -17,14 +17,14 @@ After 5 months of building, we're releasing one of our most anticipated features Watch a full demo: - +
+ +
### Auth diff --git a/apps/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx b/apps/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx index e20bf8a6a58..1a63a1a4bb9 100644 --- a/apps/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx +++ b/apps/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx @@ -17,14 +17,14 @@ We're 6 months into building our hosted database platform and we've made some ma Watch a full demo: - +
+ +
### Easily create tables diff --git a/apps/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx b/apps/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx index f30c537eb23..43a2b4bc41a 100644 --- a/apps/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx +++ b/apps/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx @@ -18,14 +18,14 @@ We're now 7 months into building Supabase. This update is a big one! Watch a full demo: - +
+ +
### Third-party logins diff --git a/apps/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx b/apps/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx index 9e4cc3dc193..158b81d22d5 100644 --- a/apps/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx +++ b/apps/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx @@ -19,15 +19,15 @@ We're now 8 months into building Supabase. We're focused on performance, stabili Watch a full demo: - +
+ +
### Supabase.js 1.0 diff --git a/apps/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx b/apps/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx index 7910f61bc42..a4bb7858a82 100644 --- a/apps/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx +++ b/apps/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx @@ -19,15 +19,15 @@ We've been building for 9 months now, and we're getting even closer to Beta. Watch a full demo: - +
+ +
### Add users diff --git a/apps/www/_blog/2020-12-02-case-study-monitoro.mdx b/apps/www/_blog/2020-12-02-case-study-monitoro.mdx index 4bfceaf4e42..0c628e8c394 100644 --- a/apps/www/_blog/2020-12-02-case-study-monitoro.mdx +++ b/apps/www/_blog/2020-12-02-case-study-monitoro.mdx @@ -46,12 +46,12 @@ Thanks to Supabase, Monitoro could deliver the features required needed faster t Learn more about Monitoro: - +
+ +
diff --git a/apps/www/_blog/2021-01-02-supabase-beta-december-2020.mdx b/apps/www/_blog/2021-01-02-supabase-beta-december-2020.mdx index 91bcdeb34ee..223849745f9 100644 --- a/apps/www/_blog/2021-01-02-supabase-beta-december-2020.mdx +++ b/apps/www/_blog/2021-01-02-supabase-beta-december-2020.mdx @@ -20,15 +20,15 @@ After 10 hectic months of building, Supabase is now in Beta. Watch a full demo: - +
+ +
### Supabase is now in Beta diff --git a/apps/www/_blog/2021-02-02-supabase-beta-january-2021.mdx b/apps/www/_blog/2021-02-02-supabase-beta-january-2021.mdx index 10e86ed878e..976c96f08b6 100644 --- a/apps/www/_blog/2021-02-02-supabase-beta-january-2021.mdx +++ b/apps/www/_blog/2021-02-02-supabase-beta-january-2021.mdx @@ -20,15 +20,15 @@ New year, new features. We've been busy at Supabase during January and our commu Watch a full demo: - +
+ +
### Count functionality diff --git a/apps/www/_blog/2021-03-02-supabase-beta-february-2021.mdx b/apps/www/_blog/2021-03-02-supabase-beta-february-2021.mdx index 2a14b71e615..2fe5da5efef 100644 --- a/apps/www/_blog/2021-03-02-supabase-beta-february-2021.mdx +++ b/apps/www/_blog/2021-03-02-supabase-beta-february-2021.mdx @@ -19,15 +19,15 @@ Supabase is an open source Firebase alternative. We've now been building for one Watch a full demo: - +
+ +
### Dashboard Sidebars diff --git a/apps/www/_blog/2021-03-11-using-supabase-replit.mdx b/apps/www/_blog/2021-03-11-using-supabase-replit.mdx index e0856ab9753..ead6386295d 100644 --- a/apps/www/_blog/2021-03-11-using-supabase-replit.mdx +++ b/apps/www/_blog/2021-03-11-using-supabase-replit.mdx @@ -22,15 +22,15 @@ They support a ton of different languages and execution environments and even re As a Replit user, if you want to access larger amounts of data direct from your repl, or if you fancy accessing some super-powerful query tools, at some point you may want to start interacting with a relational database. Supabase is a good fit here; just like Replit, you don't need to worry about servers, and hosting, you can just click a few buttons and get a fully featured relational database which you can start communicating with directly from javacript, using supabase-js. - +
+ +
Here's how to start a Supabase + Node.js repl: diff --git a/apps/www/_blog/2021-04-06-supabase-beta-march-2021.mdx b/apps/www/_blog/2021-04-06-supabase-beta-march-2021.mdx index ba28fa69618..b12b9071c0b 100644 --- a/apps/www/_blog/2021-04-06-supabase-beta-march-2021.mdx +++ b/apps/www/_blog/2021-04-06-supabase-beta-march-2021.mdx @@ -19,15 +19,15 @@ Launch week, Storage, Supabase CLI, Connection Pooling, Supabase UI, and Pricing Watch a full demo: - +
+ +
## Supabase Storage diff --git a/apps/www/_blog/2021-05-03-supabase-beta-april-2021.mdx b/apps/www/_blog/2021-05-03-supabase-beta-april-2021.mdx index fb40d53ea65..96bde96182e 100644 --- a/apps/www/_blog/2021-05-03-supabase-beta-april-2021.mdx +++ b/apps/www/_blog/2021-05-03-supabase-beta-april-2021.mdx @@ -20,15 +20,15 @@ Check out what we were working on below, as well as some incredible Community co Watch a full demo: - +
+ +
## Light Mode @@ -124,15 +124,15 @@ $$ language plv8; Fireship reviewed Supabase last week, and despite being a (self-proclaimed) Firebase fan-boy, the review was very impartial. - +
+ +
## Community diff --git a/apps/www/_blog/2021-06-02-supabase-beta-may-2021.mdx b/apps/www/_blog/2021-06-02-supabase-beta-may-2021.mdx index 6469fa46f1d..7106971fe2f 100644 --- a/apps/www/_blog/2021-06-02-supabase-beta-may-2021.mdx +++ b/apps/www/_blog/2021-06-02-supabase-beta-may-2021.mdx @@ -19,15 +19,15 @@ Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries. Lots of great stuff Watch a full demo: - +
+ +
## Apple logins are now available @@ -88,15 +88,15 @@ We started a weekly 1-hour live stream where we build in public. - [Build in Public 001](https://www.youtube.com/watch?v=p561ogKZ63o): Building a "Next.js + Supabase" Tutorial - [Build in Public 002](https://twitter.com/p_phiri/status/1397815806990372865?s=20): `maybeSingle()` and "React + Supabase" Tutorial - +
+ +
## Community diff --git a/apps/www/_blog/2021-07-02-supabase-beta-june-2021.mdx b/apps/www/_blog/2021-07-02-supabase-beta-june-2021.mdx index d42f3c7bbb6..eb4413eab73 100644 --- a/apps/www/_blog/2021-07-02-supabase-beta-june-2021.mdx +++ b/apps/www/_blog/2021-07-02-supabase-beta-june-2021.mdx @@ -20,15 +20,15 @@ Supabase is gearing up for another Launch Week on July the 26th. Until then, her Watch a full demo of this month's releases - +
+ +
## Vercel integration @@ -113,15 +113,15 @@ We run a weekly 1-hour live stream where we build in public. - [Build in Public 006](https://youtu.be/LHYrqBb4q9I): Supabase Studio - [Build in Public 007](https://youtu.be/R4gJhX_JFTo): Supabase Studio - API Docs - +
+ +
## Community diff --git a/apps/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx b/apps/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx index 72e22de1d6a..10728c41e42 100644 --- a/apps/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx +++ b/apps/www/_blog/2021-07-28-supabase-auth-passwordless-sms-login.mdx @@ -55,15 +55,15 @@ Simply plug your Twilio credentials into your Auth Settings in the Supabase Dash Check out the [documentation](/docs/guides/auth/phone-login/twilio) to get started with Mobile OTPs, or watch the [Youtube guide](https://youtu.be/akScoPO01bc). - +
+ +
### Multi-Factor Auth coming soon diff --git a/apps/www/_blog/2021-08-12-supabase-beta-july-2021.mdx b/apps/www/_blog/2021-08-12-supabase-beta-july-2021.mdx index c38bb4d977c..244b30497a8 100644 --- a/apps/www/_blog/2021-08-12-supabase-beta-july-2021.mdx +++ b/apps/www/_blog/2021-08-12-supabase-beta-july-2021.mdx @@ -20,15 +20,15 @@ July ended with our second "Launch Week", where we shipped something every day f Watch a full demo of this month's releases. - +
+ +
## Launch Week II: The SQL diff --git a/apps/www/_blog/2021-09-10-supabase-beta-august-2021.mdx b/apps/www/_blog/2021-09-10-supabase-beta-august-2021.mdx index 1bc892b92a2..545489aebc5 100644 --- a/apps/www/_blog/2021-09-10-supabase-beta-august-2021.mdx +++ b/apps/www/_blog/2021-09-10-supabase-beta-august-2021.mdx @@ -20,15 +20,15 @@ We've raised $30M and shipped a bunch of features. Let's dive into what's been h Watch a recap of this month's release. - +
+ +
## We raised $30 million @@ -90,15 +90,15 @@ We now provide a handy copy utility for various database connection strings beca RLS can be a bit foreign for developers getting started with Postgres. This video by [@\_dijonmusters](https://twitter.com/_dijonmusters) demystifies it. If you find the video a useful medium for learning, consider [subscribing to our channel](https://www.youtube.com/c/supabase). - +
+ +
## Community diff --git a/apps/www/_blog/2021-10-04-supabase-beta-sept-2021.mdx b/apps/www/_blog/2021-10-04-supabase-beta-sept-2021.mdx index 587aa3d2207..893881ea4c7 100644 --- a/apps/www/_blog/2021-10-04-supabase-beta-sept-2021.mdx +++ b/apps/www/_blog/2021-10-04-supabase-beta-sept-2021.mdx @@ -67,15 +67,15 @@ We've revamped the Auth docs - The docs are now broken down into [Authentication Low Code demo, Using Supabase with [Clutch.io](http://clutch.io/) - [@\_dijonmusters](https://twitter.com/_dijonmusters) ran a [session at General Assembly](https://www.youtube.com/watch?t=642&v=5fsKMTeBKKY) showing how to use these two tools together to create apps using a low code approach. - +
+ +
## Community diff --git a/apps/www/_blog/2021-11-05-supabase-beta-october-2021.mdx b/apps/www/_blog/2021-11-05-supabase-beta-october-2021.mdx index ca0dc8ca935..b6e75148a87 100644 --- a/apps/www/_blog/2021-11-05-supabase-beta-october-2021.mdx +++ b/apps/www/_blog/2021-11-05-supabase-beta-october-2021.mdx @@ -20,15 +20,15 @@ We released three new Auth providers, multi-schema support, and we're gearing up Watch a recap of this month's release. - +
+ +
## Slack, Spotify, and MessageBird logins @@ -63,43 +63,43 @@ We have a TON of new guides, with videos too. Learn about PostgreSQL Functions. [Docs](https://supabase.com/docs/guides/database/functions). - +
+ +
### Auth Overview Learn about all the exciting features of Auth within Supabase. [Docs](https://supabase.com/docs/guides/auth). - +
+ +
### API Features Learn more about the power of PostgREST for RESTful APIs. [Docs](https://supabase.com/docs/guides/database/api#restful-api). - +
+ +
### And more @@ -118,29 +118,29 @@ There was a lot of activity this month. Supabase attended the Jamstack conf. Watch us catch up with Matt, the cofounder of Netlify (minute 8). - +
+ +
### Supabase at Next.js conf And [Jon](https://twitter.com/_dijonmusters) made a guest appearance at this year's amazing [Next.js Conf](https://nextjs.org/conf). - +
+ +
### Community Highlights diff --git a/apps/www/_blog/2021-11-29-community-day-lw3.mdx b/apps/www/_blog/2021-11-29-community-day-lw3.mdx index 3bebaafceac..eda838497c6 100644 --- a/apps/www/_blog/2021-11-29-community-day-lw3.mdx +++ b/apps/www/_blog/2021-11-29-community-day-lw3.mdx @@ -27,15 +27,15 @@ Supabase provides a whole bunch of features that are made up of a [collection of As a user of our hosted offering you don't really need to know all this, but we love showcasing the amazing open-source tools that we work with, and so we've invited [Vik Gamov](https://twitter.com/gAmUssA) to give you a little intro to [Kong](https://github.com/Kong/kong): - +
+ +
## PostgreSQL 14 updates @@ -118,15 +118,15 @@ Anytime we scroll through [madewithsupabase.com](https://www.madewithsupabase.co So we reached out to some of our users, requesting a short video to learn more and we were overwhelmed with your gracious submissions. We've started a user stories playlist and we are so excited to see many more of these stories in the future. 💚 - +
+ +
And with that, we officially declare Launch Week as open 🥳 Check back [here](/blog) every day this week to see what new things we are shipping. We can't wait to share them with you 🚀 diff --git a/apps/www/_blog/2021-12-01-realtime-row-level-security-in-postgresql.mdx b/apps/www/_blog/2021-12-01-realtime-row-level-security-in-postgresql.mdx index b8a3c3e6e40..cf849781aa6 100644 --- a/apps/www/_blog/2021-12-01-realtime-row-level-security-in-postgresql.mdx +++ b/apps/www/_blog/2021-12-01-realtime-row-level-security-in-postgresql.mdx @@ -22,15 +22,15 @@ Today, we're announcing security improvements to Realtime, where database change ## Demo - +
+ +
## Overview diff --git a/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx b/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx index 4e3a9e61dea..41b88a7a033 100644 --- a/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx +++ b/apps/www/_blog/2021-12-02-supabase-acquires-logflare.mdx @@ -106,15 +106,15 @@ In just the past 10 days, we've been working on a few of the new Dashboard featu Over the next few weeks, we plan to release these features (once we have a chance to polish them up), and you'll be able to query your logs with your favorite language - SQL 😀. - +
+ +
## Open source diff --git a/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx b/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx index 11cafb38ef9..39b36792c28 100644 --- a/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx +++ b/apps/www/_blog/2022-01-20-supabase-beta-december-2021.mdx @@ -38,43 +38,43 @@ Enable it from the Database > Extensions tab in the [Supabase Dashboard](https:/ Jon Meyers walks you through how to write more complex queries and logic in your database, and invoke it via the API. - +
+ +
### Call any API using PostgreSQL functions We recently added the ability to call any external HTTP endpoint from your postgres functions. Jon shows you how! - +
+ +
### Create PostgreSQL Functions with Supabase Triggers allow you to execute SQL in response to any table changes. Learn how to write PostgreSQL triggers with Jon! - +
+ +
### Hiring @@ -90,15 +90,15 @@ There was a lot of activity this month. Let Jason and Jon show you how to build an app with Next.js and Supabase on top of Netlify! - +
+ +
### Divjoy integration diff --git a/apps/www/_blog/2022-02-22-supabase-beta-january-2022.mdx b/apps/www/_blog/2022-02-22-supabase-beta-january-2022.mdx index 81c0e8d98b1..a8b72dc03bc 100644 --- a/apps/www/_blog/2022-02-22-supabase-beta-january-2022.mdx +++ b/apps/www/_blog/2022-02-22-supabase-beta-january-2022.mdx @@ -109,15 +109,15 @@ There's no stopping [Jon Meyers](https://jonmeyers.io/videos)! He’s back with You'll learn how to listen to _any_ database change, then send those changes [in a payload](https://supabase.com/blog/supabase-functions-updates#hook-payload) via HTTP request. - +
+ +
## Set your own support ticket priority @@ -141,43 +141,43 @@ Are you maintaining multiple environments? Snaplet helps you copy a production d Check out the [Supabase clone environments](https://docs.snaplet.dev/tutorials/supabase-clone-environments) tutorial on the Snaplet docs. - +
+ +
### Supabase + Retool Retool has put together a brilliant 10 minute admin panel setup using Supabase with Retool. - +
+ +
### Learn with Jason Jason Lengstorf caught up with our very own [Jon Meyers](https://jonmeyers.io/) on his awesome show, [Learn with Jason](https://www.youtube.com/watch?v=8vqY1KT4TLU), to talk about building an app [with Supabase and NextJS](https://supabase.com/docs/guides/with-nextjs). - +
+ +
### New article highlights diff --git a/apps/www/_blog/2022-03-25-supabase-launch-week-four.mdx b/apps/www/_blog/2022-03-25-supabase-launch-week-four.mdx index 8edfcd91dde..e0c8dbfed49 100644 --- a/apps/www/_blog/2022-03-25-supabase-launch-week-four.mdx +++ b/apps/www/_blog/2022-03-25-supabase-launch-week-four.mdx @@ -35,15 +35,15 @@ to keep updated by following the hashtag [#SupaLaunchWeek](https://twitter.com/h Watch us as we kick off Launch Week, shipping this blog post. - +
+ +
## Monday: Community Day diff --git a/apps/www/_blog/2022-03-28-community-day-lw4.mdx b/apps/www/_blog/2022-03-28-community-day-lw4.mdx index 4600e2b03bb..d0245acace2 100644 --- a/apps/www/_blog/2022-03-28-community-day-lw4.mdx +++ b/apps/www/_blog/2022-03-28-community-day-lw4.mdx @@ -157,15 +157,15 @@ As always, all of this is open-source. Feedback, feature requests, and contribut For our community day open source spotlight feature, we’re delighted to have [Bashbunni](https://twitter.com/bash_bunni) give us an overview of what’s possible with Charm: - +
+ +
## New courses and learning materials diff --git a/apps/www/_blog/2022-03-31-supabase-edge-functions.mdx b/apps/www/_blog/2022-03-31-supabase-edge-functions.mdx index 03eb07a82b7..55d19fb6f92 100644 --- a/apps/www/_blog/2022-03-31-supabase-edge-functions.mdx +++ b/apps/www/_blog/2022-03-31-supabase-edge-functions.mdx @@ -108,15 +108,15 @@ To round off the end-to-end experience, `supabase-js` now works in Deno, making ## Quickstart - +
+ +
Can't wait to get started? Develop, test, and deploy your first Supabase Edge Function in less than 7 minutes with our [Quickstart Video Tutorial](https://youtu.be/rzglqRdZUQE)! Check the [Edge Functions Docs](https://supabase.com/docs/guides/functions) for the steps. diff --git a/apps/www/_blog/2022-04-01-supabase-realtime-with-multiplayer-features.mdx b/apps/www/_blog/2022-04-01-supabase-realtime-with-multiplayer-features.mdx index 584e9d26dc8..f03ab864253 100644 --- a/apps/www/_blog/2022-04-01-supabase-realtime-with-multiplayer-features.mdx +++ b/apps/www/_blog/2022-04-01-supabase-realtime-with-multiplayer-features.mdx @@ -16,15 +16,15 @@ Today is the 1st of April, or April Fool's Day, but I like to think of today as Here's the next version of Realtime, with multiplayer features. - +
+ +
We've made quite a few iterations on Realtime in the past. The first major version of Realtime listened to a single database by streaming changes from PostgreSQL's Write-Ahead Log and sending them to clients via WebSockets. The second major version introduced better security via WALRUS (Write Ahead Log Realtime Unified Security) which adheres to a database's RLS policies to determine authorized clients. However, this version continues to be single tenant as it can only poll one database at a time. diff --git a/apps/www/_blog/2022-04-20-partner-gallery-works-with-supabase.mdx b/apps/www/_blog/2022-04-20-partner-gallery-works-with-supabase.mdx index aaf5e4d21b0..b4a0503a236 100644 --- a/apps/www/_blog/2022-04-20-partner-gallery-works-with-supabase.mdx +++ b/apps/www/_blog/2022-04-20-partner-gallery-works-with-supabase.mdx @@ -23,15 +23,15 @@ As with anything at Supabase, the Partner Gallery is built on top of the [Supaba # Partner showcase - new integrations and expert services - +
+ +
## Expert services @@ -43,15 +43,15 @@ Please join us in welcoming our first two experts! ### Morrow - +
+ +
Morrow is an app development agency headquartered in Bristol, UK. Their mission is to consult, build and support cutting-edge innovation. @@ -77,15 +77,15 @@ We’re starting off with a selection across auth, developer tools, and low-code ### Clerk - +
+ +
Clerk authenticates users, manages session tokens, and provides user management functionality that can be used in combination with the authorization logic available in Supabase through PostgreSQL Row Level Security (RLS) policies. @@ -99,15 +99,15 @@ Stytch provides an all-in-one platform for passwordless auth. Stytch makes it ea ### Prisma - +
+ +
Prisma is an open source next-generation ORM. It consists of the following parts: @@ -117,15 +117,15 @@ Prisma is an open source next-generation ORM. It consists of the following parts ### Snaplet - +
+ +
Snaplet is a developer tool that copies a Postgres database, transforming personal information, so that you can safely code against actual data. This functionality makes it possible to easily achieve environment parity in Supabase. @@ -137,15 +137,15 @@ Vercel enables developers to build and publish wonderful things. They build prod ### pgMustard - +
+ +
pgMustard speeds up your journey from knowing which query is a problem to working out what can be done about it. @@ -157,29 +157,29 @@ Even if you know how, Postgres includes so much useful information, it is easy t ### Clutch - +
+ +
What can I achieve with Clutch & Supabase? Anything you can think of where a database would be necessary for your project. Examples include building a blog, real-time chat app, booking platform, and todo list, Supabase, and Clutch provides all the necessary tools to build your projects quickly and efficiently. ### Appsmith - +
+ +
Appsmith is an open-source framework for building internal tools. It lets you drag-and-drop UI components to build pages, connect to any API, database or GraphQL source and write logic with JavaScript objects. @@ -191,28 +191,28 @@ Draftbit is a "pro-code" low-code mobile app building platform. Draftbit exports ### Plasmic - +
+ +
By connecting Supabase with Plasmic, a visual builder for the web, you can build data-backed applications without code. While many users leverage Plasmic to quickly launch and iterate on landing pages, Plasmic can be used as a general-purpose visual builder for React, which can be used to design and implement fully featured read-write applications. ### Teta - +
+ +
Teta is an online cooperative app builder. It allows designers and developers to collaborate in real-time on the design and development of mobile applications, through a convenient visual interface that allows the export of Flutter code. diff --git a/apps/www/_blog/2022-07-13-supabase-auth-helpers-with-sveltekit-support.mdx b/apps/www/_blog/2022-07-13-supabase-auth-helpers-with-sveltekit-support.mdx index 8fcd5b9ff1d..95162e6418e 100644 --- a/apps/www/_blog/2022-07-13-supabase-auth-helpers-with-sveltekit-support.mdx +++ b/apps/www/_blog/2022-07-13-supabase-auth-helpers-with-sveltekit-support.mdx @@ -46,15 +46,15 @@ Having good documentation is great, especially when there are [examples](https:/ Remix Auth Helpers are in the works. You can follow the development of this on our [GitHub repo](https://github.com/supabase-community/auth-helpers), or subscribe to our Supabase YouTube channel as we build it live on air. - +
+ +
## Contribute diff --git a/apps/www/_blog/2022-08-10-launch-week-5-hackathon.mdx b/apps/www/_blog/2022-08-10-launch-week-5-hackathon.mdx index dd12a99bee8..8146287897b 100644 --- a/apps/www/_blog/2022-08-10-launch-week-5-hackathon.mdx +++ b/apps/www/_blog/2022-08-10-launch-week-5-hackathon.mdx @@ -24,15 +24,15 @@ There's a $1500 GitHub sponsorship and [gold Supabase caps](https://store.supaba You can access the supabase-js pre-release, including the new interface by running `npm install @supabase/supabase-js@rc`. - +
+ +
## Key Facts diff --git a/apps/www/_blog/2022-08-12-supabase-series-b.mdx b/apps/www/_blog/2022-08-12-supabase-series-b.mdx index 0e6c33cc749..5a38458ec7a 100644 --- a/apps/www/_blog/2022-08-12-supabase-series-b.mdx +++ b/apps/www/_blog/2022-08-12-supabase-series-b.mdx @@ -113,15 +113,15 @@ pgsodium: [2.0](https://www.postgresql.org/about/news/pgsodium-200-modern-crypto and [3.0](https://github.com/michelp/pgsodium/releases/tag/v3.0.0) to support [Transparent Column Encryption](https://github.com/michelp/pgsodium#transparent-column-encryption). - +
+ +
diff --git a/apps/www/_blog/2022-08-15-supabase-cli-v1-and-admin-api-beta.mdx b/apps/www/_blog/2022-08-15-supabase-cli-v1-and-admin-api-beta.mdx index 5bc9888e6ee..f316a907770 100644 --- a/apps/www/_blog/2022-08-15-supabase-cli-v1-and-admin-api-beta.mdx +++ b/apps/www/_blog/2022-08-15-supabase-cli-v1-and-admin-api-beta.mdx @@ -17,16 +17,16 @@ In addition, we are releasing a Management API (in beta). The Management API is (Note: The Management API was previously called the Admin API.) - +
+ +
Watch the CLI team announcing the new features. diff --git a/apps/www/_blog/2022-08-16-supabase-js-v2.mdx b/apps/www/_blog/2022-08-16-supabase-js-v2.mdx index 5ca0414db64..6708ecaaf54 100644 --- a/apps/www/_blog/2022-08-16-supabase-js-v2.mdx +++ b/apps/www/_blog/2022-08-16-supabase-js-v2.mdx @@ -316,16 +316,16 @@ We'll continuing merging security fixes to v1, with maintenance patches for the ## Announcement video and discussion - +
+ +
## supabase-js v2 resources diff --git a/apps/www/_blog/2022-08-17-supabase-soc2.mdx b/apps/www/_blog/2022-08-17-supabase-soc2.mdx index 7febf307779..c3f4fa8ff6a 100644 --- a/apps/www/_blog/2022-08-17-supabase-soc2.mdx +++ b/apps/www/_blog/2022-08-17-supabase-soc2.mdx @@ -92,16 +92,16 @@ Getting the Type 1 certification is just the start, and we will be working on ge ## Announcement video and discussion - +
+ +
## More Launch Week 5 diff --git a/apps/www/_blog/2022-08-18-supabase-realtime-multiplayer-general-availability.mdx b/apps/www/_blog/2022-08-18-supabase-realtime-multiplayer-general-availability.mdx index a30b10b8d00..78da8824758 100644 --- a/apps/www/_blog/2022-08-18-supabase-realtime-multiplayer-general-availability.mdx +++ b/apps/www/_blog/2022-08-18-supabase-realtime-multiplayer-general-availability.mdx @@ -224,16 +224,16 @@ We also want to thank [José Valim](https://twitter.com/josevalim), and everyone ## Announcement video and discussion - +
+ +
## More Launch Week 5 diff --git a/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx b/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx index dda88680ffd..9f22394c4a7 100644 --- a/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx +++ b/apps/www/_blog/2022-08-19-launch-week-5-community-day.mdx @@ -46,16 +46,16 @@ _Our limited edition swag is approved by professional swag testers like Peanut!_ ### Launch Week Landing Page & Golden Tickets - +
+ +
We now have a shiny new [Launch Week page](https://supabase.com/launch-week), your one-stop shop for all things Launch Week, where you can find each day's feature as well as highlights from the past Launch Weeks. @@ -69,16 +69,16 @@ We've added a Golden Ticket mechanic, distributing some special edition launch w ### pg_jsonschema - +
+ +
For our Open Source Spotlight we're hearing from [Dmitry Dygalo](https://twitter.com/Stranger6667) from [schemathesis.io](https://schemathesis.io/) who works on a multitude of open-source projects. He's the author and maintainer of [jsonschema-rs](https://github.com/Stranger6667/jsonschema-rs), @@ -122,16 +122,16 @@ All that in only 28 mins — or 14 mins on 2x speed! ### Realtime Trello Board with Angular by Simon Grimm - +
+ +
[Simon Grimm](https://twitter.com/schlimmson) from [ionicacademy.com](http://ionicacademy.com/) & [devdactic.com](http://devdactic.com/) is releasing a new course for all the Angular fans out there! @@ -146,16 +146,16 @@ Since releasing our [Partners](/partners) page last Launch Week, we've had a lot ### CodeSandbox Projects Beta - +
+ +
The new [CodeSandbox Projects Beta](https://projects.codesandbox.io/) let's you run your projects and turn them into a link you can share with anyone. Developers visiting your link can not only see your running code, they can click “fork” and get an exact copy of that environment so they can easily contribute back to your masterpiece. CodeSandbox integrates directly with GitHub, so you get a unique development environment for every PR you and your contributors open! @@ -163,31 +163,31 @@ You can do all of this from a web browser, from [within VSCode](https://marketpl ### Dashibase - +
+ +
[Dashibase](https://dashibase.com/) is a no-code internal tools builder with a Notion-like UI. With the latest update, you can easily build CRUD dashboards on top of your Supabase projects, set read/write access on your data sources, and share your dashboards with your team. Stop building dashboards from scratch. ### Replicache - +
+ +
Replicache is a JavaScript framework for building high performance, collaborative, offline-first web apps. @@ -197,16 +197,16 @@ Replicache works with Supabase for storage, and Supabase Realtime for its [poke ### [Zapp.run](http://Zapp.run) by Invertase - +
+ +
Zapp is a free online sandbox environment for building Flutter applications in the browser. With Zapp, you can enjoy building Flutter apps as though in your favorite IDE, especially if you are a VSCode user; you should feel at home. @@ -214,16 +214,16 @@ You can install any pub packages and start developing, of course including Supab ### Feelantera - +
+ +
Feelantera is a creative digital agency based in Indonesia. They craft web applications with cutting-edge technology, and are one of our new [Supabase Experts](https://supabase.com/partners/experts). They [recently open-sourced](https://twitter.com/feelantera/status/1556909234478059521) their Supabase Edge Functions powered URL shortener on [GitHub](https://github.com/feelantera/fltr-link). @@ -233,16 +233,16 @@ Are you also experienced in building with Supabase and interested in helping oth ### Snappify - +
+ +
snappify is a powerful design tool that helps you to explain and share your code snippets in many beautiful ways. @@ -260,16 +260,16 @@ To explore the infrastructure backing the project, check out the repository [her ## Hackathon - +
+ +
We hope all of these awesome projects and stories gave you plenty of inspiration and you're ready to build in a weekend and scale to millions, as our [hackathon is still running until Sunday](https://supabase.com/blog/launch-week-5-hackathon) night PT! diff --git a/apps/www/_blog/2022-08-24-building-a-realtime-trello-board-with-supabase-and-angular.mdx b/apps/www/_blog/2022-08-24-building-a-realtime-trello-board-with-supabase-and-angular.mdx index c0e20a82629..92ccd3f4ee0 100644 --- a/apps/www/_blog/2022-08-24-building-a-realtime-trello-board-with-supabase-and-angular.mdx +++ b/apps/www/_blog/2022-08-24-building-a-realtime-trello-board-with-supabase-and-angular.mdx @@ -27,15 +27,16 @@ Along our jurney we will: - implement **magic link sign in** and user authentication with Angular - make use of **the realtime capabilities**! - Watch the video version of the tutorial. +
+ +
+Watch the video version of the tutorial. Since there are quite some code snippets we need I've put together the [full source code on Github](https://github.com/saimon24/supabase-trello-angular) so you can easily run the project yourself! diff --git a/apps/www/_blog/2022-12-14-mfa-auth-via-rls.mdx b/apps/www/_blog/2022-12-14-mfa-auth-via-rls.mdx index 70e89a15e82..eff5501b53a 100644 --- a/apps/www/_blog/2022-12-14-mfa-auth-via-rls.mdx +++ b/apps/www/_blog/2022-12-14-mfa-auth-via-rls.mdx @@ -17,8 +17,10 @@ Today, we’re releasing Multi Factor Authentication for everyone. Additionally, in preparation for releasing SAML, we're "dogfooding" the feature with the introduction of Single Sign On (SSO) on our dashboard. Contact us at [growth@supabase.com](mailto:growth@supabase.com) if you want to [enable this on your Enterprise plan](https://supabase.com/docs/guides/platform/sso). - +
+ +
## What is MFA? diff --git a/apps/www/_blog/2022-12-15-postgres-foreign-data-wrappers-rust.mdx b/apps/www/_blog/2022-12-15-postgres-foreign-data-wrappers-rust.mdx index 28beba1875d..c89eec50d6d 100644 --- a/apps/www/_blog/2022-12-15-postgres-foreign-data-wrappers-rust.mdx +++ b/apps/www/_blog/2022-12-15-postgres-foreign-data-wrappers-rust.mdx @@ -245,15 +245,15 @@ If you're interested in getting involved or building your own Wrapper, don't hes - View the documentation: [supabase.github.io/wrappers](https://supabase.github.io/wrappers/) - Supabase Launch Week: [supabase.com/launch-week](https://supabase.com/launch-week) - +
+ +
## More Launch Week 6 diff --git a/apps/www/_blog/2022-12-16-launch-week-6-community-day.mdx b/apps/www/_blog/2022-12-16-launch-week-6-community-day.mdx index 78facd9830a..ed8855ba1e2 100644 --- a/apps/www/_blog/2022-12-16-launch-week-6-community-day.mdx +++ b/apps/www/_blog/2022-12-16-launch-week-6-community-day.mdx @@ -20,16 +20,16 @@ While we've been working hard on new features, the community has been developing ### FlutterFlow - +
+ +
[FlutterFlow](https://flutterflow.io/) is a low-code builder for developing native mobile applications using Flutter. You can use the simple drag-and-drop interface to build your app faster than traditional development. @@ -41,16 +41,16 @@ Watch John from the FlutterFlow team demonstrate how you can [get started with F ### OneSignal - +
+ +
[OneSignal](https://onesignal.com/) is a messaging platform allowing you to deliver push notifications, in-app messages, SMS, and emails to your users. @@ -62,16 +62,16 @@ In the video above, William from OneSignal will show you how you can easily inte ### NextAuth - +
+ +
[NextAuth.js](https://next-auth.js.org/) is an open source authentication solution for [Next.js](https://nextjs.org/). It allows you to bring your own Database so that you own your user data. diff --git a/apps/www/_blog/2022-12-16-launch-week-6-wrap-up.mdx b/apps/www/_blog/2022-12-16-launch-week-6-wrap-up.mdx index a2a6c96a94d..0e42f6dcdf8 100644 --- a/apps/www/_blog/2022-12-16-launch-week-6-wrap-up.mdx +++ b/apps/www/_blog/2022-12-16-launch-week-6-wrap-up.mdx @@ -157,15 +157,15 @@ We've released a new multilingual Full Text Search extension, PGroonga. It's fas ## Flutterflow for Flutter App Development - +
+ +

@@ -178,15 +178,15 @@ We partnered with the team at [Flutterflow](https://flutterflow.io/) to bring yo ## OneSignal for Push Notifications - +
+ +

diff --git a/apps/www/_blog/2022-12-16-vault-now-in-beta.mdx b/apps/www/_blog/2022-12-16-vault-now-in-beta.mdx index 2b02cda5cb3..aafb2bfa88f 100644 --- a/apps/www/_blog/2022-12-16-vault-now-in-beta.mdx +++ b/apps/www/_blog/2022-12-16-vault-now-in-beta.mdx @@ -58,15 +58,15 @@ Decrypted data can be accessed by a special view that is automatically created w ## Deep Dive on How The Vault works - +
+ +
As we mentioned, the Vault uses pgsodium's Transparent Column Encryption (TCE) to store secrets in an authenticated encrypted form. There are some details around that you may be curious about, what does authenticated mean, and where are encryption keys store? This section explains those details. diff --git a/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx b/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx index 6c1b29a9e70..73ed8c608c0 100644 --- a/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx +++ b/apps/www/_blog/2023-02-07-chatgpt-supabase-docs.mdx @@ -55,13 +55,13 @@ It's built with Supabase/Postgres, and consists of several key parts: All the changes we made are in [this](https://github.com/supabase/supabase/pull/12056) Pull Request. Greg is here to explain every step in full detail:
- +
You can find a full write up in our previous blog post: [Storing OpenAI embeddings in Postgres with pgvector](https://supabase.com/blog/openai-embeddings-postgres-vector). @@ -90,13 +90,13 @@ A few weeks ago I received an email, drawing our attention to a [Pull Request](h After we merged the PR, I reached out to see if Greg was interested in helping with some documentation or a blog post to help the community to use pgvector. On the call, Greg surprised me with an initial prototype where he had ingested the Supabase docs for a ChatGPT-like experience. I was suitably impressed and suggested that we could explore ways to work together to build it into the Supabase docs. He wasted no time:
- +
### A friendly collaboration From 2142cf4517cf1dde825779d698da4778d126956a Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 14 Feb 2023 14:20:20 -0330 Subject: [PATCH 083/207] Updates --- apps/www/pages/pricing/index.tsx | 56 ++++++++++++++++---------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 1f326d09148..393eadced5d 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -128,6 +128,8 @@ export default function IndexPage() { `On-premise support`, `24×7×365 premium enterprise support`, ], + priceLabel: 'Custom quotas', + priceMonthly: 'Exclusive pricing', scale: '', shutdown: '', cta: 'Contact Us', @@ -268,7 +270,7 @@ export default function IndexPage() { key={tier.name} className={[ 'flex flex-col overflow-hidden', - tier.name === 'Pro' ? '' : 'border h-full hallo rounded-xl', + tier.name === 'Pro' ? '' : 'border h-full rounded-xl', ].join(' ')} >

{tier.name} @@ -295,9 +297,8 @@ export default function IndexPage() { {tier.description}

- {tier.name !== 'Enterprise' && ( -
-
-
-
-

- {tier.priceLabel} -

-

- ${tier.priceMonthly} -

- {tier.costUnit && ( -

{tier.costUnit}

- )} + > +
+
+
+

+ {tier.priceLabel} +

+

+ {tier.name !== 'Enterprise' && '$'} {tier.priceMonthly} +

+ {tier.costUnit && ( +

{tier.costUnit}

+ )} - {tier.warning && ( -

- - {tier.warning} - -

- )} -
+ {tier.warning && ( +

+ + {tier.warning} + +

+ )}
- )} +
-

+

{tier.name}

Date: Tue, 14 Feb 2023 14:28:32 -0330 Subject: [PATCH 084/207] Fix border radius --- apps/www/pages/pricing/index.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 393eadced5d..9234232e91b 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -270,11 +270,11 @@ export default function IndexPage() { key={tier.name} className={[ 'flex flex-col overflow-hidden', - tier.name === 'Pro' ? '' : 'border h-full rounded-xl', + tier.name === 'Pro' ? '' : 'border h-full rounded-[4px]', ].join(' ')} >
@@ -337,7 +337,7 @@ export default function IndexPage() {
{addons.map((addon) => ( -
+
Date: Tue, 14 Feb 2023 14:29:04 -0330 Subject: [PATCH 085/207] Radius nudge --- apps/www/pages/pricing/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 9234232e91b..d780e03b0e9 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -401,7 +401,7 @@ export default function IndexPage() {
{addons.map((addon) => ( -
+
Date: Tue, 14 Feb 2023 18:16:03 +0000 Subject: [PATCH 086/207] Flutter content internal linking --- .../_blog/2023-02-14-flutter-real-time-multiplayer-game.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/www/_blog/2023-02-14-flutter-real-time-multiplayer-game.mdx b/apps/www/_blog/2023-02-14-flutter-real-time-multiplayer-game.mdx index ba825c1f435..63f04aa78fc 100644 --- a/apps/www/_blog/2023-02-14-flutter-real-time-multiplayer-game.mdx +++ b/apps/www/_blog/2023-02-14-flutter-real-time-multiplayer-game.mdx @@ -834,6 +834,7 @@ We learned how to create an interactive shooting game. We took advantage of Flut ## More Flutter Resources - [Complete code of this article](https://github.com/supabase/supabase/tree/master/examples/realtime/examples/flutter-multiplayer-shooting-game) -- [Flame Engine website](https://flame-engine.org/) +- [Flutter Tutorial: building a Flutter chat app](https://supabase.com/blog/flutter-tutorial-building-a-chat-app) +- [Flutter Authentication and Authorization with RLS](https://supabase.com/blog/flutter-authentication-and-authorization-with-rls) - [Generate Flame template using Very Good CLI](https://verygood.ventures/blog/generate-a-game-with-our-new-template) - [Supabase Flutter SDK docs](https://supabase.com/docs/reference/dart/start) From aa4ffdc54c58d45d6a22031c0fe59f459c04290e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ramiro=20Nu=C3=B1ez=20Dosio?= Date: Tue, 14 Feb 2023 18:18:12 +0000 Subject: [PATCH 087/207] Add link to new Flutter post. --- .../_blog/2022-06-30-flutter-tutorial-building-a-chat-app.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/www/_blog/2022-06-30-flutter-tutorial-building-a-chat-app.mdx b/apps/www/_blog/2022-06-30-flutter-tutorial-building-a-chat-app.mdx index 8285a717828..cbe86871d1b 100644 --- a/apps/www/_blog/2022-06-30-flutter-tutorial-building-a-chat-app.mdx +++ b/apps/www/_blog/2022-06-30-flutter-tutorial-building-a-chat-app.mdx @@ -890,5 +890,6 @@ If you have any questions please reach out via [Twitter](https://twitter.com/dsh - [Part 2: Flutter Authentication and Authorization with RLS](https://supabase.com/blog/flutter-authentication-and-authorization-with-rls) - [Flutter Supabase Quick Starter Guide](https://supabase.com/docs/guides/with-flutter) - [supabase-flutter v1.0 released](https://supabase.com/blog/supabase-flutter-sdk-v1-released) +- [How to build a real-time multiplayer game with Flutter Flame](https://supabase.com/blog/flutter-real-time-multiplayer-game) - [Open source map based Flutter app with CI/CD and scalable statemanagement example](https://github.com/dshukertjr/spot) - [Build a Flutter app with Very Good CLI and Supabase](https://verygood.ventures/blog/flutter-app-very-good-cli-supabase) From 6e47302d0127275af994c833bec447f8e045ce3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ramiro=20Nu=C3=B1ez=20Dosio?= Date: Tue, 14 Feb 2023 18:18:42 +0000 Subject: [PATCH 088/207] Add link to new Flutter post. --- .../2022-08-02-supabase-flutter-sdk-1-developer-preview.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/www/_blog/2022-08-02-supabase-flutter-sdk-1-developer-preview.mdx b/apps/www/_blog/2022-08-02-supabase-flutter-sdk-1-developer-preview.mdx index 39f8595377c..cdabad21e70 100644 --- a/apps/www/_blog/2022-08-02-supabase-flutter-sdk-1-developer-preview.mdx +++ b/apps/www/_blog/2022-08-02-supabase-flutter-sdk-1-developer-preview.mdx @@ -160,4 +160,5 @@ If you have any feedbacks, please let us know in the issues of the [supabase-flu - [supabase-flutter 1.0 developer preview](https://pub.dev/packages/supabase_flutter) - [Flutter Tutorial: building a Flutter chat app](https://supabase.com/blog/flutter-tutorial-building-a-chat-app) - [Flutter Tutorial - Part 2: Authentication and Authorization with RLS](https://supabase.com/blog/flutter-authentication-and-authorization-with-rls) +- [How to build a real-time multiplayer game with Flutter Flame](https://supabase.com/blog/flutter-real-time-multiplayer-game) - [Build a Flutter app with Very Good CLI and Supabase](https://verygood.ventures/blog/flutter-app-very-good-cli-supabase) From 5afe3ba082d0f0a9263d3a3537c135f48a372a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ramiro=20Nu=C3=B1ez=20Dosio?= Date: Tue, 14 Feb 2023 18:19:19 +0000 Subject: [PATCH 089/207] Add link to new Flutter post. --- ...2-11-22-flutter-authentication-and-authorization-with-rls.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/www/_blog/2022-11-22-flutter-authentication-and-authorization-with-rls.mdx b/apps/www/_blog/2022-11-22-flutter-authentication-and-authorization-with-rls.mdx index e6ecfbe4cd2..fde39a288d0 100644 --- a/apps/www/_blog/2022-11-22-flutter-authentication-and-authorization-with-rls.mdx +++ b/apps/www/_blog/2022-11-22-flutter-authentication-and-authorization-with-rls.mdx @@ -1357,6 +1357,7 @@ We can for example update this to a list of users that are online at the same ti - [Complete set of code of this chat app](https://github.com/supabase-community/flutter-chat/tree/with_auth) - [supabase-flutter docs](https://supabase.com/docs/reference/dart) +- [How to build a real-time multiplayer game with Flutter Flame](https://supabase.com/blog/flutter-real-time-multiplayer-game) - [Flutter Supabase Quick Starter Guide](https://supabase.com/docs/guides/with-flutter) - [supabase-flutter v1.0 released](https://supabase.com/blog/supabase-flutter-sdk-v1-released) - [Build a Flutter app with Very Good CLI and Supabase](https://verygood.ventures/blog/flutter-app-very-good-cli-supabase) From 844e37b582b44a44cfaf2a4468871eca85d5ff0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ramiro=20Nu=C3=B1ez=20Dosio?= Date: Tue, 14 Feb 2023 18:20:24 +0000 Subject: [PATCH 090/207] Add link to new Flutter post. --- apps/www/_blog/2022-10-21-supabase-flutter-sdk-v1-released.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/www/_blog/2022-10-21-supabase-flutter-sdk-v1-released.mdx b/apps/www/_blog/2022-10-21-supabase-flutter-sdk-v1-released.mdx index 92aed5cbb3b..8709747976a 100644 --- a/apps/www/_blog/2022-10-21-supabase-flutter-sdk-v1-released.mdx +++ b/apps/www/_blog/2022-10-21-supabase-flutter-sdk-v1-released.mdx @@ -100,4 +100,5 @@ It required massive support from the community to bring the supabase-flutter to - [v0 to v1 migration guide](https://supabase.com/docs/reference/dart/v0/upgrade-guide) - [Flutter Tutorial: building a Flutter chat app](https://supabase.com/blog/flutter-tutorial-building-a-chat-app) - [Flutter Tutorial - Part 2: Authentication and Authorization with RLS](https://supabase.com/blog/flutter-authentication-and-authorization-with-rls) +- [How to build a real-time multiplayer game with Flutter Flame](https://supabase.com/blog/flutter-real-time-multiplayer-game) - [Build a Flutter app with Very Good CLI and Supabase](https://verygood.ventures/blog/flutter-app-very-good-cli-supabase) From 358f99f106a0138210e4f0fb93dde6eeb78f0a93 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 14 Feb 2023 15:35:51 -0330 Subject: [PATCH 091/207] Copy to enterprise grid --- apps/www/pages/pricing/index.tsx | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index d780e03b0e9..7b6ada1ee13 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -82,7 +82,7 @@ export default function IndexPage() { ], scale: 'Additional fees apply for usage and storage beyond the limits above.', shutdown: '', - preface: 'Everything below included in the base plan', + preface: 'Everything in the Free plan, plus', additional: '', cta: 'Get Started', }, @@ -127,9 +127,13 @@ export default function IndexPage() { `Custom contracts & invoicing`, `On-premise support`, `24×7×365 premium enterprise support`, + `Custom Security questionnaires`, + `Private Slack channel`, + `Uptime SLA`, ], priceLabel: 'Custom quotas', priceMonthly: 'Exclusive pricing', + preface: 'The following features will apply to all projects within the organization', scale: '', shutdown: '', cta: 'Contact Us', @@ -308,6 +312,7 @@ export default function IndexPage() { dark:border-scale-500 pt-4 pb-8 + min-h-[175px] " >
@@ -316,8 +321,13 @@ export default function IndexPage() {

{tier.priceLabel}

-

- {tier.name !== 'Enterprise' && '$'} {tier.priceMonthly} +

+ {tier.name !== 'Enterprise' && '$'} + {tier.priceMonthly}

{tier.costUnit && (

{tier.costUnit}

@@ -338,7 +348,6 @@ export default function IndexPage() {
From bd0618372588d1c4a03473c344419d030f75111c Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 14 Feb 2023 16:53:14 -0330 Subject: [PATCH 092/207] Move icons to own file --- .../Pricing/ComputePricingModal.tsx | 16 ++--- apps/www/components/Pricing/PricingIcons.tsx | 57 +++++++++++++++ .../components/Pricing/PricingTableRow.tsx | 69 ++----------------- apps/www/pages/pricing/index.tsx | 3 - 4 files changed, 70 insertions(+), 75 deletions(-) create mode 100644 apps/www/components/Pricing/PricingIcons.tsx diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index e7753983ce4..f3e7dde3782 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -3,6 +3,7 @@ import { useRouter } from 'next/router' import { useTheme } from 'common/Providers' import { IconCheckCircle, IconXCircle, Modal } from 'ui' import pricingAddOn from '~/data/PricingAddOnTable.json' +import { IconPricingIncludedCheck, IconPricingMinus } from './PricingIcons' interface Props { showComputeModal: boolean setShowComputeModal: React.Dispatch> @@ -89,16 +90,13 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo ].join(' ')} > {row.columns.map((column) => ( - + {column.key === 'dedicated' ? ( - + column.value ? ( + + ) : ( + + ) ) : ( column.value )} diff --git a/apps/www/components/Pricing/PricingIcons.tsx b/apps/www/components/Pricing/PricingIcons.tsx new file mode 100644 index 00000000000..5dd4c804921 --- /dev/null +++ b/apps/www/components/Pricing/PricingIcons.tsx @@ -0,0 +1,57 @@ +export const Check = () => ( + + + +) + +export const IconPricingIncludedCheck = (props: any) => ( + + + Included in {props.tier} + +) + +export const IconPricingMinus = (props: any) => ( + <> + + + + Not included in {props.tier} + +) + +export const IconPricingInfo = () => ( + <> + + + + Info + +) diff --git a/apps/www/components/Pricing/PricingTableRow.tsx b/apps/www/components/Pricing/PricingTableRow.tsx index fb44f3a0baa..3aaacc55236 100644 --- a/apps/www/components/Pricing/PricingTableRow.tsx +++ b/apps/www/components/Pricing/PricingTableRow.tsx @@ -2,64 +2,7 @@ import { IconHelpCircle } from 'ui' import ProductIcon from 'components/ProductIcon' import React, { Fragment } from 'react' import ReactTooltip from 'react-tooltip' - -export const Check = () => ( - - - -) - -const IncludedCheck = (props: any) => ( - - - Included in {props.tier} - -) - -const Minus = (props: any) => ( - <> - - - - Not included in {props.tier} - -) - -const InfoIcon = () => ( - <> - - - - Info - -) +import { IconPricingIncludedCheck, IconPricingInfo, IconPricingMinus } from './PricingIcons' export const PricingTableRowDesktop = (props: any) => { const category = props.category @@ -117,10 +60,10 @@ export const PricingTableRowDesktop = (props: any) => { ].join(' ')} > {typeof tierValue === 'boolean' && tierValue === true ? ( - + ) : typeof tierValue === 'boolean' && tierValue === false ? (
- +
) : ( @@ -129,7 +72,7 @@ export const PricingTableRowDesktop = (props: any) => { className="shrink-0 hover:text-scale-300 cursor-pointer transition-colors" data-tip={feat.tooltips[tierName]} > - + )} {tierValue} @@ -185,11 +128,11 @@ export const PricingTableRowMobile = (props: any) => { {typeof feat.tiers[tier] === 'boolean' && feat.tiers[tier] === true ? (
- +
) : typeof feat.tiers[tier] === 'boolean' && feat.tiers[tier] === false ? (
- +
) : ( {feat.tiers[tier]} diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 7b6ada1ee13..7aa8120534a 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -1,4 +1,3 @@ -import { ServerIcon, SupportIcon } from '@heroicons/react/outline' import { Accordion, Button, IconCheck, Select } from 'ui' import Solutions from 'data/Solutions.json' import { NextSeo } from 'next-seo' @@ -8,10 +7,8 @@ import React, { useState } from 'react' import ReactMarkdown from 'react-markdown' import CTABanner from '~/components/CTABanner' import DefaultLayout from '~/components/Layouts/Default' -import PricingAddOnTable from '~/components/Pricing/PricingAddOnTable' import { PricingTableRowDesktop, PricingTableRowMobile } from '~/components/Pricing/PricingTableRow' import pricing from '~/data/Pricing.json' -import pricingAddOn from '~/data/PricingAddOnTable.json' import pricingFaq from '~/data/PricingFAQ.json' import { useTheme } from 'common/Providers' import ComputePricingModal from '~/components/Pricing/ComputePricingModal' From c4dc73bd793f3fefa90af1c4efa8e9a2f4fe4e6d Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 14 Feb 2023 17:00:16 -0330 Subject: [PATCH 093/207] Nudges --- apps/www/data/Pricing.json | 2 +- apps/www/pages/pricing/index.tsx | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index a428ab90a62..962f096bd81 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -293,6 +293,7 @@ "title": "Messages Per Month", "tooltips": { "main": "Billing is based on the total sum of Realtime messages throughout your billing period.", + "pro": "Then $2.50 per million", "free": "2 Million (including database)" }, "tiers": { @@ -420,7 +421,6 @@ { "title": "Custom Domains", "tooltips": { - "main": "Contact us to access this feature", "enterprise": "Volume discounts available." }, "tiers": { diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 7aa8120534a..a7304d51223 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -116,7 +116,6 @@ export default function IndexPage() { href: 'https://forms.supabase.com/enterprise', description: 'For large-scale applications managing serious workloads.', features: [ - `Point in Time Recovery`, `Designated Support manager & SLAs`, `Enterprise OAuth providers`, `SSO/ SAML`, @@ -145,7 +144,7 @@ export default function IndexPage() { price: 'Starts from $5', description: 'Increase the capability of your database only for what you need.', leftCtaText: 'Documentation', - leftCtaLink: 'http://.....', + leftCtaLink: 'https://supabase.com/docs/guides/platform/compute-add-ons', rightCtaText: 'See Pricing breakdown', rightCtaLink: '#open-modal', }, @@ -157,7 +156,7 @@ export default function IndexPage() { description: 'Use your own domain for your Supabase project to present a more polished product to your users.', leftCtaText: 'Documentation', - leftCtaLink: 'http://.....', + leftCtaLink: 'https://supabase.com/docs/guides/platform/custom-domains', rightCtaText: 'See more', rightCtaLink: 'http://', }, @@ -168,7 +167,7 @@ export default function IndexPage() { price: 'Starts from $5', description: 'Roll back to any specific point in time and ensure that data is not lost.', leftCtaText: 'Documentation', - leftCtaLink: 'http://.....', + leftCtaLink: 'https://supabase.com/docs/guides/platform/backups', rightCtaText: 'See Pricing breakdown', rightCtaLink: 'http://', }, From 93635eb5d0b2157b51607977115cffe29e390218 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 14 Feb 2023 17:03:32 -0330 Subject: [PATCH 094/207] Add missing icon --- apps/www/components/Pricing/PricingAddOnTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/components/Pricing/PricingAddOnTable.tsx b/apps/www/components/Pricing/PricingAddOnTable.tsx index dbd7ccf7562..41b9f96698b 100644 --- a/apps/www/components/Pricing/PricingAddOnTable.tsx +++ b/apps/www/components/Pricing/PricingAddOnTable.tsx @@ -1,7 +1,7 @@ import { Collapsible, IconChevronUp } from 'ui' import classNames from 'classnames' import { Fragment, useMemo, useState } from 'react' -import { Check } from './PricingTableRow' +import { Check } from './PricingIcons' interface PricingAddOnTableProps { pricing: { From bef8469f080773dcd9c8aab09dba244d7f810f77 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 14 Feb 2023 17:14:33 -0330 Subject: [PATCH 095/207] Fix line break --- apps/www/pages/pricing/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index a7304d51223..57c5672024a 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -631,8 +631,8 @@ export default function IndexPage() { <> Date: Tue, 14 Feb 2023 17:16:11 -0330 Subject: [PATCH 096/207] Font weight --- apps/www/pages/pricing/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 57c5672024a..552d75b07db 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -281,7 +281,7 @@ export default function IndexPage() {

{tier.name} From 89b6edf5aeaceb357121b2ceff8cc67302181c12 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 14 Feb 2023 17:23:49 -0330 Subject: [PATCH 097/207] Add disk io back --- .../Pricing/ComputePricingModal.tsx | 2 + apps/www/data/PricingAddOnTable.json | 60 +++++++++++++++---- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index f3e7dde3782..7d0244336ce 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -4,6 +4,7 @@ import { useTheme } from 'common/Providers' import { IconCheckCircle, IconXCircle, Modal } from 'ui' import pricingAddOn from '~/data/PricingAddOnTable.json' import { IconPricingIncludedCheck, IconPricingMinus } from './PricingIcons' + interface Props { showComputeModal: boolean setShowComputeModal: React.Dispatch> @@ -19,6 +20,7 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo )[0], [] ) + console.log('pricingAddOn:', pricingAddOn) return ( Date: Tue, 14 Feb 2023 17:27:26 -0330 Subject: [PATCH 098/207] Nudges --- apps/www/data/Pricing.json | 2 +- apps/www/pages/pricing/index.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index 962f096bd81..f785267f201 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -217,7 +217,7 @@ "title": "Asset transformations", "tooltips": { "main": "Distinct count of all images that were transformed in the billing period, ignoring any transformations.", - "pro": "5$ per 1000 origin images after the first 100" + "pro": "$5 per 1000 origin images after the first 100" }, "tiers": { "free": false, diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 552d75b07db..11117536fe0 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -399,7 +399,7 @@ export default function IndexPage() {

Easily customizable add-ons

-

+

Level up your Supabase experience with add-ons.

@@ -497,7 +497,7 @@ export default function IndexPage() {

Compare Plans

-

+

Start with a hobby project, collaborate with a team, and scale to millions of users.

@@ -772,7 +772,7 @@ export default function IndexPage() { type={tier.name === 'Enterprise' ? 'default' : 'primary'} block > - Get Started + {tier.cta} From 29a03e9e53309d7329fec0e2d33e66e336d2ab5e Mon Sep 17 00:00:00 2001 From: 0xflotus <0xflotus@gmail.com> Date: Tue, 14 Feb 2023 23:09:43 +0100 Subject: [PATCH 099/207] fix: small errors in blog post --- .../_blog/2023-02-14-flutter-real-time-multiplayer-game.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/www/_blog/2023-02-14-flutter-real-time-multiplayer-game.mdx b/apps/www/_blog/2023-02-14-flutter-real-time-multiplayer-game.mdx index ba825c1f435..321263554ba 100644 --- a/apps/www/_blog/2023-02-14-flutter-real-time-multiplayer-game.mdx +++ b/apps/www/_blog/2023-02-14-flutter-real-time-multiplayer-game.mdx @@ -204,7 +204,7 @@ class _LobbyDialogState extends State<_LobbyDialog> { ### Creating the FlameGame -Now the fun part starts! We will start out by creating our game class. We create a `MyGame` class that extends the [FlameGame](https://docs.flame-engine.org/1.6.0/flame/game.html) class. `FlameGame` takes care of collision detection and pan-detection, and it will also be the parent of all the components that we will add to the game. The game contains 2 components, `Player` and `Bullet`. `MyGame ` is a class that wrapps around all components of the game and can control the child components. +Now the fun part starts! We will start out by creating our game class. We create a `MyGame` class that extends the [FlameGame](https://docs.flame-engine.org/1.6.0/flame/game.html) class. `FlameGame` takes care of collision detection and pan-detection, and it will also be the parent of all the components that we will add to the game. The game contains 2 components, `Player` and `Bullet`. `MyGame ` is a class that wraps around all components of the game and can control the child components. ![Structure of the shooting game](/images/blog/flutter-realtime-game/game-structure.png) @@ -588,7 +588,7 @@ runApp(const MyApp()); final supabase = Supabase.instance.client; ``` -`RealtimeClientOptions` here is a parameter to override how many events per second each client will send to Supabase. The default is 10, but we want to ovreide to 40 to provide a more in-synced experience. +`RealtimeClientOptions` here is a parameter to override how many events per second each client will send to Supabase. The default is 10, but we want to override to 40 to provide a more in-synced experience. With this, we are ready to get into adding the real-time features now. From e485c45af5cbd1ded19366e7ca6e38c4ccc3ac0f Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Tue, 14 Feb 2023 16:15:33 -0600 Subject: [PATCH 100/207] postgres extension docs: pg-safeupdate --- .../NavigationMenu.constants.ts | 5 ++ .../database/extensions/pg-safeupdate.mdx | 63 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index ad7b5d85303..6b7b7cb1568 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -459,6 +459,11 @@ export const database = { url: '/guides/database/extensions/postgis', items: [], }, + { + name: 'pg-safeupdate: Required Where Clauses', + url: '/guides/database/extensions/pg-safeupdate', + items: [], + }, { name: 'pgTAP: Unit Testing', url: '/guides/database/extensions/pgtap', items: [] }, { name: 'plpgsql_check: PL/pgSQL Linter', diff --git a/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx b/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx new file mode 100644 index 00000000000..bbbde62a1f9 --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx @@ -0,0 +1,63 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pg-safeupdate', + title: 'pg-safeupdate: Required Where Clauses', + description: 'Requires a where clause for update and delete', +} + +[pg-safeupdate](https://github.com/eradman/pg-safeupdate) is PostgreSQL extension is designed to prevent users from accidentally updating or deleting too many records in a single statement by requiring a "where" clause in all update and delete statements. + +The `pg-safeupdate` extension is a useful tool for protecting data integrity and preventing accidental data loss. Without it, a user could accidentally execute an update or delete statement that affects all records in a table. With pg-safeupdate, users are required to be more deliberate in their update and delete statements, which reduces the risk of significant error. + +## Usage + +### Enable the extension + +pg-safeupdate can be enabled on a per connection basis: + +{/* prettier-ignore */} +```sql +load 'safeupdate'; +``` + +or for all connections + +{/* prettier-ignore */} +```sql +alter database some_db set session_preload_libraries = 'safeupdate'; +``` + +## Usage + +Let's take a look at an example to see how pg-safeupdate works. Suppose we have a table called "employees" with the following columns: id, name, department, and salary. We want to update the salary for a specific employee with the ID of 12345. Here is what the query would look like without pg-safeupdate: + +{/* prettier-ignore */} +```sql +load 'safeupdate'; + +update employees set date_of_birth = '1987-01-28'; +``` + +This query updates the `date_of_birth` for all employees to 1987-01-28, which is likely not what we intended. With `pg-safeupdate` enabled, we receive an error message prompting us to add a "where" clause to the query: + +{/* prettier-ignore */} +```sql +ERROR: UPDATE requires a WHERE clause +``` + +We would then update our query to include a "where" clause specifying the employee with the ID of 12345: + +{/* prettier-ignore */} +```sql +update employees set date_of_birth = '1987-01-28' where id = 12345; +``` +This query updates the `date_of_birth` for only the employee with the id of 12345 and succeeds. + +## Resources + +- Official [pg-safeupdate documentation](https://github.com/eradman/pg-safeupdate) + +export const Page = ({ children }) => + +export default Page \ No newline at end of file From 1a0901e4c3962bbe7ae3e70968768f8fa5d7033e Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Tue, 14 Feb 2023 16:41:24 -0600 Subject: [PATCH 101/207] postgres extension docs: timescaledb --- .../NavigationMenu.constants.ts | 5 + .../database/extensions/timescaledb.mdx | 101 ++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 apps/docs/pages/guides/database/extensions/timescaledb.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 6b7b7cb1568..056fa99732e 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -470,6 +470,11 @@ export const database = { url: '/guides/database/extensions/plpgsql_check', items: [], }, + { + name: 'timescaledb: Time-series data', + url: '/guides/database/extensions/timescaledb', + items: [], + }, { name: 'uuid-ossp: Unique Identifiers', url: '/guides/database/extensions/uuid-ossp', diff --git a/apps/docs/pages/guides/database/extensions/timescaledb.mdx b/apps/docs/pages/guides/database/extensions/timescaledb.mdx new file mode 100644 index 00000000000..2ce81cfb74d --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/timescaledb.mdx @@ -0,0 +1,101 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'timescaledb', + title: 'timescaledb: Time-Series data', + description: 'Scalable time-series data storage and analysis', +} + +[timescaledb](https://docs.timescale.com/timescaledb/latest/) is a PostgreSQL extension designed for improved handling of time-series data. It provides a scalable, high-performance solution for storing and querying time-series data on top of a standard PostgreSQL database. + +`timescaledb` uses a time-series-aware storage model and indexing techniques to improve performance of PostgreSQL in working with time-series data. The extension divides data into chunks based on time intervals, allowing it to scale efficiently, especially for large data sets. The data is then compressed, optimized for write-heavy workloads, and partitioned for parallel processing. `timescaledb` also includes a set of functions, operators, and indexes that work with time-series data to reduce query times, and make data easier to work with. + +## Usage + +### Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "timescaledb" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "timescaledb" extension +create extension timescaledb; + +-- Disable the "timescaledb" extension +drop extension if exists timescaledb; +``` + + + + +## Usage + +To demonstrate how `timescaledb` works, let's consider a simple example where we have a table that stores temperature data from different sensors. We will create a table named "temperatures" and store data for two sensors. + +First we create a hypertable, which is a virtual table that is partitioned into chunks based on time intervals. The hypertable acts as a proxy for the actual table and makes it easy to query and manage time-series data. + +{/* prettier-ignore */} +```sql +create table temperatures ( + time timestamp not null, + sensor_id int not null, + temperature double precision not null +); + +select create_hypertable('temperatures', 'time'); +``` + +Next we can populate some values + +{/* prettier-ignore */} +```sql +insert into temperatures (time, sensor_id, temperature) +values + ('2023-02-14 09:00:00', 1, 23.5), + ('2023-02-14 09:00:00', 2, 21.2), + ('2023-02-14 09:05:00', 1, 24.5), + ('2023-02-14 09:05:00', 2, 22.3), + ('2023-02-14 09:10:00', 1, 25.1), + ('2023-02-14 09:10:00', 2, 23.9), + ('2023-02-14 09:15:00', 1, 24.9), + ('2023-02-14 09:15:00', 2, 22.7), + ('2023-02-14 09:20:00', 1, 24.7), + ('2023-02-14 09:20:00', 2, 23.5); +``` + +And finally we can query the table using `timescaledb`'s `time_bucket` function to divide the time-series into intervals of the specified size (in this case, 1 hour) averaging the `temperature` reading within each group. + +{/* prettier-ignore */} +```sql +select + time_bucket('1 hour', time) AS hour, + avg(temperature) AS average_temperature +from + temperatures +where + sensor_id = 1 + and time > NOW() - interval '1 hour' +group by + hour; +``` + +## Resources + +- Official [`timescaledb` documentation](https://docs.timescale.com/timescaledb/latest/) + +export const Page = ({ children }) => + +export default Page From f57b111fb53ec878de576f77d4f5e3517a104b7c Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Tue, 14 Feb 2023 17:25:03 -0600 Subject: [PATCH 102/207] postgres extension docs: pgsodium --- .../NavigationMenu.constants.ts | 5 ++ .../guides/database/extensions/pgsodium.mdx | 49 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 apps/docs/pages/guides/database/extensions/pgsodium.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 056fa99732e..0ee61f6aeab 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -464,6 +464,11 @@ export const database = { url: '/guides/database/extensions/pg-safeupdate', items: [], }, + { + name: 'pgsodium: Encryption Features', + url: '/guides/database/extensions/pgsodium', + items: [], + }, { name: 'pgTAP: Unit Testing', url: '/guides/database/extensions/pgtap', items: [] }, { name: 'plpgsql_check: PL/pgSQL Linter', diff --git a/apps/docs/pages/guides/database/extensions/pgsodium.mdx b/apps/docs/pages/guides/database/extensions/pgsodium.mdx new file mode 100644 index 00000000000..1f8f13d772a --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pgsodium.mdx @@ -0,0 +1,49 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pgsodium', + title: 'pgsodium: Encryption Features', + description: 'Encryption library for PostgreSQL', +} + +[pgsodium](https://github.com/michelp/pgsodium) is a PostgreSQL extension which provides SQL access to libsodium's high-level cryptographic algorithms. It also enables some Postgres specific features including: +- [Server Key Management](https://github.com/michelp/pgsodium#server-key-management) +- [Transparent Column Encryption](https://github.com/michelp/pgsodium#transparent-column-encryption) + +## Enable the extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pgsodium" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "pgsodium" extension +create extension pgsodium; + +-- Disable the "pgsodium" extension +drop extension if exists pgsodium; +``` + + + + + +## Resources + +- Official [`pgsodium` documentation](https://github.com/michelp/pgsodium) + +export const Page = ({ children }) => + +export default Page From 6be2543b564665e11c811bb6617a7d09b915b181 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Tue, 14 Feb 2023 17:25:34 -0600 Subject: [PATCH 103/207] header error --- apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx b/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx index bbbde62a1f9..fd5bb5b60dd 100644 --- a/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx +++ b/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx @@ -10,9 +10,7 @@ export const meta = { The `pg-safeupdate` extension is a useful tool for protecting data integrity and preventing accidental data loss. Without it, a user could accidentally execute an update or delete statement that affects all records in a table. With pg-safeupdate, users are required to be more deliberate in their update and delete statements, which reduces the risk of significant error. -## Usage - -### Enable the extension +## Enable the extension pg-safeupdate can be enabled on a per connection basis: From ca34b4600f6b33ac16221dae95f20c7fee230dd3 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Tue, 14 Feb 2023 17:27:47 -0600 Subject: [PATCH 104/207] postgres extension docs: pg_hashids --- .../NavigationMenu.constants.ts | 5 ++ .../guides/database/extensions/pg_hashids.mdx | 81 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 apps/docs/pages/guides/database/extensions/pg_hashids.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 0ee61f6aeab..b22dcc92699 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -429,6 +429,11 @@ export const database = { url: '/guides/database/extensions/pg_graphql', items: [], }, + { + name: 'pg_hashids: Short UIDs', + url: '/guides/database/extensions/pg_hashids', + items: [], + }, { name: 'pg_jsonschema: JSON Schema Validation', url: '/guides/database/extensions/pg_jsonschema', diff --git a/apps/docs/pages/guides/database/extensions/pg_hashids.mdx b/apps/docs/pages/guides/database/extensions/pg_hashids.mdx new file mode 100644 index 00000000000..7cab60f041c --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pg_hashids.mdx @@ -0,0 +1,81 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pg_hashids', + title: 'pg_hashids: Short UIDs', + description: 'Generate Short UIDs from Numbers', +} + +[pg_hashids] provides a simple and secure way to generate short, unique, non-sequential ids from numbers. The hashes are intended to be small, easy-to-remember identifiers that can be used to obfuscate data (optionally) with a password, alphabet, and salt. For example, you may wish to hide data like user IDs, order numbers, or tracking codes in favor of `pg_hashid`'s unique identifers. + +### Enable the Extension + + + + +1. Go to the [Database](https://app.supabase.com/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pg_hashids" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Enable the "pg_hashids" extension +create extension pg_hashids with schema extensions; + +-- Disable the "pg_hashids" extension +drop extension if exists pg_hashids; +``` + +Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". +To disable an extension you can call `drop extension`. + +It's good practice to create the extension within a separate schema (like `extensions`) to keep your database clean. + + + + +## Usage + +Suppose we have a table that stores order information, and we want to give customers a unique identifer without exposing the sequential `id` column. To do this, we can use `pg_hashid`'s `id_encode` function. + +```sql +create table orders ( + id serial primary key, + description text, + price_cents bigint +); + +insert into orders (description, price_cents) +values ('a book', 9095); + +select + id, + id_encode(id) as short_id, + description, + price_cents +from + orders; + + id | short_id | description | price_cents +----+----------+-------------+------------- + 1 | jR | a book | 9095 +(1 row) +``` + +To reverse the `short_id` back into an `id`, there is an equivalent function named `id_decode`. + +## Resources + +- Official [pg_hashids documention](https://github.com/iCyberon/pg_hashids) + +export const Page = ({ children }) => + +export default Page \ No newline at end of file From a4ef0f299704525a58792713d2009ee32c884151 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 14 Feb 2023 21:08:37 -0330 Subject: [PATCH 105/207] Tooltips --- apps/www/data/Pricing.json | 8 ++++---- apps/www/pages/pricing/index.tsx | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/www/data/Pricing.json b/apps/www/data/Pricing.json index f785267f201..395c309cb9f 100644 --- a/apps/www/data/Pricing.json +++ b/apps/www/data/Pricing.json @@ -50,7 +50,7 @@ "title": "Point in time recovery", "tooltips": { "main": "PITR cannot be applied retroactively, projects can only be rolled back to the point from which PITR has been applied.", - "pro": "If > 28 day rollback period, contact enterprise" + "pro": "$100 per 7 days. If > 28 day rollback period, contact enterprise" }, "tiers": { "free": false, @@ -217,7 +217,7 @@ "title": "Asset transformations", "tooltips": { "main": "Distinct count of all images that were transformed in the billing period, ignoring any transformations.", - "pro": "$5 per 1000 origin images after the first 100" + "pro": "Unlimited for 100 origin images. $5 per 1000 origin images after the first 100" }, "tiers": { "free": false, @@ -293,8 +293,8 @@ "title": "Messages Per Month", "tooltips": { "main": "Billing is based on the total sum of Realtime messages throughout your billing period.", - "pro": "Then $2.50 per million", - "free": "2 Million (including database)" + "free": "2 Million (including database)", + "pro": "5 Million, then $2.50 per million" }, "tiers": { "free": "2 Million", diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx index 11117536fe0..e407fcbf8d4 100644 --- a/apps/www/pages/pricing/index.tsx +++ b/apps/www/pages/pricing/index.tsx @@ -40,7 +40,7 @@ export default function IndexPage() { priceMonthly: 0, warning: 'Limit of 2 free projects', description: 'Perfect for passion projects & simple websites.', - preface: 'Get started with...', + preface: 'Get started with:', features: [ 'Up to 500MB database & 1GB file storage', 'Up to 2GB bandwidth', @@ -79,7 +79,7 @@ export default function IndexPage() { ], scale: 'Additional fees apply for usage and storage beyond the limits above.', shutdown: '', - preface: 'Everything in the Free plan, plus', + preface: 'Everything in the Free plan, plus:', additional: '', cta: 'Get Started', }, @@ -129,7 +129,7 @@ export default function IndexPage() { ], priceLabel: 'Custom quotas', priceMonthly: 'Exclusive pricing', - preface: 'The following features will apply to all projects within the organization', + preface: 'These apply to all projects within the organization:', scale: '', shutdown: '', cta: 'Contact Us', From 4f5f623da3ce2127b645d2e45df3f747882909a7 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 14 Feb 2023 21:17:46 -0330 Subject: [PATCH 106/207] Pricing for enterprise --- .../Pricing/ComputePricingModal.tsx | 1 - apps/www/pages/pricing/index.tsx | 21 +++++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/apps/www/components/Pricing/ComputePricingModal.tsx b/apps/www/components/Pricing/ComputePricingModal.tsx index 7d0244336ce..526590addf1 100644 --- a/apps/www/components/Pricing/ComputePricingModal.tsx +++ b/apps/www/components/Pricing/ComputePricingModal.tsx @@ -20,7 +20,6 @@ export default function ComputePricingModal({ showComputeModal, setShowComputeMo )[0], [] ) - console.log('pricingAddOn:', pricingAddOn) return (
- {tier.name !== 'Enterprise' && ( - <> - - ${tier.priceMonthly} - -

per project per month

- - )} + <> + + {tier.name !== 'Enterprise' && '$'} + {tier.priceMonthly} + +

per project per month

+ {tier.warning && (

@@ -765,7 +768,7 @@ export default function IndexPage() { )}

- + -
+
*/}
- -

- Reject non-SSL connections to your database -

- {!sslEnforcementConfiguration?.appliedSuccessfully && ( - - Please try updating again, or contact{' '} - - - support - - {' '} - if this error persists - - )} -

- } - > - Enforce SSL on incoming connections - - } - > - -
- {(isLoading || isSubmitting) && ( - - )} - -
-
- + {hasAccessToSSLEnforcement && ( + +

+ Reject non-SSL connections to your database +

+ {!sslEnforcementConfiguration?.appliedSuccessfully && ( + + Please try updating again, or contact{' '} + + + support + + {' '} + if this error persists + + )} +
+ } + > + Enforce SSL on incoming connections + + } + > + +
+ {(isLoading || isSubmitting) && ( + + )} + +
+
+ + )}
From c36d02ae39804ca817eaf8e728aecd08fce6a7da Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 15 Feb 2023 15:54:49 +0800 Subject: [PATCH 110/207] Fix support form unable to send performance issues for non free projects --- studio/components/interfaces/Support/SupportForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/studio/components/interfaces/Support/SupportForm.tsx b/studio/components/interfaces/Support/SupportForm.tsx index fdeb7cfd58d..24ec9a1f014 100644 --- a/studio/components/interfaces/Support/SupportForm.tsx +++ b/studio/components/interfaces/Support/SupportForm.tsx @@ -376,7 +376,7 @@ const SupportForm: FC = ({ setSentCategory }) => { {!isDisabled ? ( <> - {['Performance'].includes(values.category) ? ( + {['Performance'].includes(values.category) && isFreeProject ? ( Date: Wed, 15 Feb 2023 06:10:15 -0600 Subject: [PATCH 111/207] postgres extension docs: pg_plan_filter --- .../NavigationMenu.constants.ts | 5 + .../database/extensions/pg-safeupdate.mdx | 4 +- .../database/extensions/pg_plan_filter.mdx | 97 +++++++++++++++++++ 3 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 apps/docs/pages/guides/database/extensions/pg_plan_filter.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index b22dcc92699..a02c1ec8b4d 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -444,6 +444,11 @@ export const database = { url: '/guides/database/extensions/pgnet', items: [], }, + { + name: 'pg_plan_filter: Restrict Total Cost', + url: '/guides/database/extensions/pg_plan_filter', + items: [], + }, { name: 'pg_stat_monitor: Extended Query Performance Monitoring', url: '/guides/database/extensions/pg_stat_monitor', diff --git a/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx b/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx index fd5bb5b60dd..dfa37f4bae9 100644 --- a/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx +++ b/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx @@ -12,14 +12,14 @@ The `pg-safeupdate` extension is a useful tool for protecting data integrity and ## Enable the extension -pg-safeupdate can be enabled on a per connection basis: +`pg-safeupdate` can be enabled on a per connection basis: {/* prettier-ignore */} ```sql load 'safeupdate'; ``` -or for all connections +or for all connections: {/* prettier-ignore */} ```sql diff --git a/apps/docs/pages/guides/database/extensions/pg_plan_filter.mdx b/apps/docs/pages/guides/database/extensions/pg_plan_filter.mdx new file mode 100644 index 00000000000..9c05b3a8058 --- /dev/null +++ b/apps/docs/pages/guides/database/extensions/pg_plan_filter.mdx @@ -0,0 +1,97 @@ +import Layout from '~/layouts/DefaultGuideLayout' + +export const meta = { + id: 'pg_plan_filter', + title: 'pg_plan_filter: Restrict Total Cost', + description: 'Block queries over a total cost limit', +} + +[pg_plan_filter](https://github.com/pgexperts/pg_plan_filter) is PostgreSQL extension to block execution of statements where query planner's estimate of the total cost exceeds a threshold. This is intended to give database administrators a way to restrict the contribution an individual query has on database load. + +## Enable the extension + +`pg_plan_filter` can be enabled on a per connection basis: + +{/* prettier-ignore */} +```sql +load 'plan_filter'; +``` + +or for all connections: + +{/* prettier-ignore */} +```sql +alter database some_db set session_preload_libraries = 'plan_filter'; +``` + +## API + +`plan_filter.statement_cost_limit`: restricts the maximum total cost for executed statements +`plan_filter.limit_select_only`: restricts to `select` statements + +Note that `limit_select_only = true` is not the same as read-only because `select` statements may modfiy data e.g. through a function call. + +## Example + +To demonstrate total cost filtering, we'll compare how `plan_filter.statement_cost_limit` treats queries that are under and over its cost limit. First, we set up a table with some data: + +{/* prettier-ignore */} +```sql +create table book( + id int primary key +); +-- CREATE TABLE + +insert into book(id) select * from generate_series(1, 10000); +-- INSERT 0 10000 +``` + +Next, we can review the explain plans for a single record select, and a whole table select. + +{/* prettier-ignore */} +```sql +explain select * from book where id =1; + QUERY PLAN +--------------------------------------------------------------------------- + Index Only Scan using book_pkey on book (cost=0.28..2.49 rows=1 width=4) + Index Cond: (id = 1) +(2 rows) + +explain select * from book; + QUERY PLAN +--------------------------------------------------------- + Seq Scan on book (cost=0.00..135.00 rows=10000 width=4) +(1 row) +``` + +Now we can choose a `statement_cost_filter` between the total cost for the single select (2.49) and the whole table select (135.0) so one statement will succeed and one will fail. + +{/* prettier-ignore */} +```sql +load 'plan_filter'; +set plan_filter.statement_cost_limit = 50; -- between 2.49 and 135.0 + +select * from book where id = 1; + id +---- + 1 +(1 row) +-- SUCCESS +``` + +{/* prettier-ignore */} +```sql +select * from book; + +ERROR: plan cost limit exceeded +HINT: The plan for your query shows that it would probably have an excessive run time. This may be due to a logic error in the SQL, or it maybe just a very costly query. Rewrite your query or increase the configuration parameter "plan_filter.statement_cost_limit". +-- FAILURE +``` + +## Resources + +- Official [pg_plan_filter documentation](https://github.com/pgexperts/pg_plan_filter) + +export const Page = ({ children }) => + +export default Page From 4962096df511abcd543871c866d16e9c2e1432cc Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Wed, 15 Feb 2023 06:20:17 -0600 Subject: [PATCH 112/207] pg_stat_monitor feature list --- .../pages/guides/database/extensions/pg_stat_monitor.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx index aa4e3b5d4bf..bb70e9ebe41 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx @@ -6,7 +6,10 @@ export const meta = { description: 'Query performance monitoring for PostgreSQL', } -[pg_stat_monitor](https://github.com/percona/pg_stat_monitor) is query performance monitoring tool that provides query execution statistics in a SQL view named `pg_stat_monitor`. It tracks a superset of statistics available in [`pg_stat_statements`](https://www.postgresql.org/docs/current/pgstatstatements.html). +[pg_stat_monitor](https://github.com/percona/pg_stat_monitor) is query performance monitoring tool that provides query execution statistics in a SQL view named `pg_stat_monitor`. It tracks a superset of statistics available in [`pg_stat_statements`](https://www.postgresql.org/docs/current/pgstatstatements.html). Some of the most useful features are: +- **Time Interval Grouping**: configurable time buckets to track query usage over time +- **Capture Parameters**: optionally track parameters passed into queries instead of generic placeholders `$1` +- **Query Plan**: store query plans used for execution ## Usage From 02d6b1263ae3bb6ca8f1f721a603a4ad32664d10 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Wed, 15 Feb 2023 09:40:11 -0330 Subject: [PATCH 113/207] Fix z-index issue in modal --- packages/ui/src/lib/theme/defaultTheme.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ui/src/lib/theme/defaultTheme.ts b/packages/ui/src/lib/theme/defaultTheme.ts index cbab5e23dbd..45cc15cc173 100644 --- a/packages/ui/src/lib/theme/defaultTheme.ts +++ b/packages/ui/src/lib/theme/defaultTheme.ts @@ -1481,6 +1481,7 @@ export default { place-items-center overflow-y-auto data-open:animate-overlay-show data-closed:animate-overlay-hide + z-50 `, separator: ` w-full From 9243b276ab30680a2ed31b164409032adfb8c84a Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Wed, 15 Feb 2023 08:17:56 -0600 Subject: [PATCH 114/207] minor edits after proof reading --- .../docs/pages/guides/database/extensions/http.mdx | 2 +- .../pages/guides/database/extensions/hypopg.mdx | 7 ++++--- .../guides/database/extensions/pg-safeupdate.mdx | 13 ++++++------- .../guides/database/extensions/pg_graphql.mdx | 11 +++++------ .../guides/database/extensions/pg_hashids.mdx | 8 ++++---- .../guides/database/extensions/pg_jsonschema.mdx | 14 ++++++-------- .../guides/database/extensions/pg_plan_filter.mdx | 2 +- .../guides/database/extensions/pg_stat_monitor.mdx | 9 ++++----- .../database/extensions/pg_stat_statements.mdx | 9 ++++----- .../pages/guides/database/extensions/pgaudit.mdx | 4 +--- .../pages/guides/database/extensions/pgjwt.mdx | 5 ++--- .../pages/guides/database/extensions/pgnet.mdx | 3 +-- .../pages/guides/database/extensions/pgroonga.mdx | 7 ++----- .../pages/guides/database/extensions/pgrouting.mdx | 7 +++---- .../pages/guides/database/extensions/pgtap.mdx | 14 ++++++-------- .../guides/database/extensions/plpgsql_check.mdx | 12 +++++------- .../docs/pages/guides/database/extensions/plv8.mdx | 5 ++--- .../pages/guides/database/extensions/postgis.mdx | 4 +--- .../guides/database/extensions/timescaledb.mdx | 5 ++--- .../pages/guides/database/extensions/uuid-ossp.mdx | 12 +++++------- .../pages/guides/database/extensions/wrappers.mdx | 2 +- 21 files changed, 66 insertions(+), 89 deletions(-) diff --git a/apps/docs/pages/guides/database/extensions/http.mdx b/apps/docs/pages/guides/database/extensions/http.mdx index 11ac8e55d41..7f686ed8e7b 100644 --- a/apps/docs/pages/guides/database/extensions/http.mdx +++ b/apps/docs/pages/guides/database/extensions/http.mdx @@ -63,7 +63,7 @@ drop extension if exists http; Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". To disable an extension, call `drop extension`. -It's good practice to create the extension within a separate schema (like `extensions`) to keep your database clean. +It's good practice to create the extension within a separate schema (like `extensions`) to keep the `public` schema clean. diff --git a/apps/docs/pages/guides/database/extensions/hypopg.mdx b/apps/docs/pages/guides/database/extensions/hypopg.mdx index c493f9f89cd..069d530333e 100644 --- a/apps/docs/pages/guides/database/extensions/hypopg.mdx +++ b/apps/docs/pages/guides/database/extensions/hypopg.mdx @@ -7,7 +7,8 @@ export const meta = { } `HypoPG` is PostgreSQL extension for creating hypothetical/virtual indexes. HypoPG allows users to rapidly create hypothetical/virtual indexes that have no resource cost (CPU, disk, memory) that are visible to the PostgreSQL query planner. -That allows users to quickly search for an index to improve a slow query without waiting for them to build. + +The motivation for HypoPG is to allow users to quickly search for an index to improve a slow query without consuming server resources or waiting for them to build. ## Usage @@ -40,14 +41,14 @@ drop extension if exists hypopg; Even though the SQL code is `create extension`, this is the equivalent of "enabling the extension". To disable an extension you can call `drop extension`. -It's good practice to create the extension within a separate schema (like `extensions`) to keep your database clean. +It's good practice to create the extension within a separate schema (like `extensions`) to keep the `public` schema clean. ### Speeding up a query -Given the following table and a simple query to select from the table by id: +Given the following table and a simple query to select from the table by `id`: {/* prettier-ignore */} ```sql diff --git a/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx b/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx index dfa37f4bae9..05ecd7781bd 100644 --- a/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx +++ b/apps/docs/pages/guides/database/extensions/pg-safeupdate.mdx @@ -6,9 +6,9 @@ export const meta = { description: 'Requires a where clause for update and delete', } -[pg-safeupdate](https://github.com/eradman/pg-safeupdate) is PostgreSQL extension is designed to prevent users from accidentally updating or deleting too many records in a single statement by requiring a "where" clause in all update and delete statements. +[pg-safeupdate](https://github.com/eradman/pg-safeupdate) is a PostgreSQL extension designed to prevent users from accidentally updating or deleting too many records in a single statement by requiring a "where" clause in all update and delete statements. -The `pg-safeupdate` extension is a useful tool for protecting data integrity and preventing accidental data loss. Without it, a user could accidentally execute an update or delete statement that affects all records in a table. With pg-safeupdate, users are required to be more deliberate in their update and delete statements, which reduces the risk of significant error. +The `pg-safeupdate` extension is a useful tool for protecting data integrity and preventing accidental data loss. Without it, a user could accidentally execute an update or delete statement that affects all records in a table. With `pg-safeupdate`, users are required to be more deliberate in their update and delete statements, which reduces the risk of significant error. ## Enable the extension @@ -28,7 +28,7 @@ alter database some_db set session_preload_libraries = 'safeupdate'; ## Usage -Let's take a look at an example to see how pg-safeupdate works. Suppose we have a table called "employees" with the following columns: id, name, department, and salary. We want to update the salary for a specific employee with the ID of 12345. Here is what the query would look like without pg-safeupdate: +Let's take a look at an example to see how pg-safeupdate works. Suppose we have a table called `employees` with the following columns: `id`, `name`, `department`, and `date_of_birth`. We want to update the `date_of_birth` for a specific employee with the `id` of 12345. Here is what the query would look like if we forgot to add a "where" clause: {/* prettier-ignore */} ```sql @@ -37,20 +37,19 @@ load 'safeupdate'; update employees set date_of_birth = '1987-01-28'; ``` -This query updates the `date_of_birth` for all employees to 1987-01-28, which is likely not what we intended. With `pg-safeupdate` enabled, we receive an error message prompting us to add a "where" clause to the query: +This query updates the `date_of_birth` for all employees to 1987-01-28, which is not what we intended. With `pg-safeupdate` enabled, we receive an error message prompting us to add a "where" clause to the query: {/* prettier-ignore */} ```sql ERROR: UPDATE requires a WHERE clause ``` -We would then update our query to include a "where" clause specifying the employee with the ID of 12345: +We would then update our query to include a "where" clause specifying the employee with the `id` of 12345: {/* prettier-ignore */} ```sql update employees set date_of_birth = '1987-01-28' where id = 12345; ``` -This query updates the `date_of_birth` for only the employee with the id of 12345 and succeeds. ## Resources @@ -58,4 +57,4 @@ This query updates the `date_of_birth` for only the employee with the id of 1234 export const Page = ({ children }) => -export default Page \ No newline at end of file +export default Page diff --git a/apps/docs/pages/guides/database/extensions/pg_graphql.mdx b/apps/docs/pages/guides/database/extensions/pg_graphql.mdx index d8b6c3d3397..fefd01ccae4 100644 --- a/apps/docs/pages/guides/database/extensions/pg_graphql.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_graphql.mdx @@ -2,21 +2,20 @@ import Layout from '~/layouts/DefaultGuideLayout' export const meta = { id: 'pg_graphql', - title: 'pg_graphql: Native GraphQL for PostgreSQL', - description: 'A GraphQL API for PostgreSQL', + title: 'pg_graphql: GraphQL for PostgreSQL', + description: 'A GraphQL Interface for PostgreSQL', } [pg_graphql](https://supabase.github.io/pg_graphql/) is PostgreSQL extension for interacting with the database using [GraphQL](https://graphql.org) instead of SQL. The extension reflects a GraphQL schema from the existing SQL schema and exposes it through a SQL function, `graphql.resolve(...)`. This enables any programming language that can connect to PostgreSQL to query the database via GraphQL with no additional servers, processes, or libraries. -The `pg_graphql` resolve method is designed to interop with [PostgREST](https://postgrest.org/en/stable/index.html), the tool that underpins the Supabase API, such that the `graphql.resolve` function can be called via RPC to safely and performantly expose the GraphQL API over HTTP/s. +The `pg_graphql` resolve method is designed to interop with [PostgREST](https://postgrest.org/en/stable/index.html), the tool that underpins the Supabase API, such that the `graphql.resolve` function can be called via RPC to safely and performantly expose the GraphQL API over HTTP/S. For more information about how the SQL schema is reflected into a GraphQL schema, see the [pg_graphql API docs](https://supabase.github.io/pg_graphql/api/). -## Usage -### Enable the extension +## Enable the extension @@ -78,4 +78,4 @@ To reverse the `short_id` back into an `id`, there is an equivalent function nam export const Page = ({ children }) => -export default Page \ No newline at end of file +export default Page diff --git a/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx b/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx index ade2adf5271..4cf54f21a19 100644 --- a/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_jsonschema.mdx @@ -6,11 +6,9 @@ export const meta = { description: 'Validate json/jsonb with JSON Schema in PostgreSQL.', } -[JSON Schema](https://json-schema.org) is a language for annotating and validating JSON documents. [`pg_jsonschema`](https://github.com/supabase/pg_jsonschema) is a PostgreSQL extension that adds the ability to validate PostgreSQL's built-in `json` and `jsonb` data types against a JSON Schema document. +[JSON Schema](https://json-schema.org) is a language for annotating and validating JSON documents. [`pg_jsonschema`](https://github.com/supabase/pg_jsonschema) is a PostgreSQL extension that adds the ability to validate PostgreSQL's built-in `json` and `jsonb` data types against JSON Schema documents. -## Usage - -### Enable the extension +## Enable the extension @@ -49,9 +47,9 @@ It's good practice to create the extension within a separate schema (like `exten - [`json_matches_schema(schema json, instance json)`](https://github.com/supabase/pg_jsonschema#api): Checks if a `json` _instance_ conforms to a JSON Schema _schema_. - [`jsonb_matches_schema(schema json, instance jsonb)`](https://github.com/supabase/pg_jsonschema#api): Checks if a `jsonb` _instance_ conforms to a JSON Schema _schema_. -### Validating a document +## Usage -Since `pg_jsonschema` exposes its utilities as functions, we can test it with a simple select statement: +Since `pg_jsonschema` exposes its utilities as functions, we can execute them with a select statement: {/* prettier-ignore */} ```sql @@ -62,7 +60,7 @@ select ); ``` -`pg_jsonschema` is generally used in tandem with a [check constraint](https://www.postgresql.org/docs/current/ddl-constraints.html) as a way to constrain the contents of a json/b field to match a JSON Schema. +`pg_jsonschema` is generally used in tandem with a [check constraint](https://www.postgresql.org/docs/current/ddl-constraints.html) as a way to constrain the contents of a json/b column to match a JSON Schema. {/* prettier-ignore */} ```sql diff --git a/apps/docs/pages/guides/database/extensions/pg_plan_filter.mdx b/apps/docs/pages/guides/database/extensions/pg_plan_filter.mdx index 9c05b3a8058..ab46d931ffe 100644 --- a/apps/docs/pages/guides/database/extensions/pg_plan_filter.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_plan_filter.mdx @@ -64,7 +64,7 @@ explain select * from book; (1 row) ``` -Now we can choose a `statement_cost_filter` between the total cost for the single select (2.49) and the whole table select (135.0) so one statement will succeed and one will fail. +Now we can choose a `statement_cost_filter` value between the total cost for the single select (2.49) and the whole table select (135.0) so one statement will succeed and one will fail. {/* prettier-ignore */} ```sql diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx index bb70e9ebe41..d1a8da6ffb7 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx @@ -8,12 +8,11 @@ export const meta = { [pg_stat_monitor](https://github.com/percona/pg_stat_monitor) is query performance monitoring tool that provides query execution statistics in a SQL view named `pg_stat_monitor`. It tracks a superset of statistics available in [`pg_stat_statements`](https://www.postgresql.org/docs/current/pgstatstatements.html). Some of the most useful features are: - **Time Interval Grouping**: configurable time buckets to track query usage over time -- **Capture Parameters**: optionally track parameters passed into queries instead of generic placeholders `$1` +- **Capture Parameters**: optionally track parameters passed into queries instead of generic placeholders e.g. `$1` - **Query Plan**: store query plans used for execution -## Usage -### Enable the extension +## Enable the extension @@ -72,7 +71,7 @@ The following table shows a subset of available columns: | total_plan_time double precision | Total time spent planning the statement, in milliseconds (if pg_stat_statements.track_planning is enabled, otherwise zero) | | min_plan_time double precision | Minimum time spent planning the statement, in milliseconds (if pg_stat_statements.track_planning is enabled, otherwise zero) | -A full list of statistics is available in the [pg_stat_monitor](https://docs.percona.com/pg-stat-monitor/reference.html#postgresql-15) docs. +A full list of statistics is available in the [pg_stat_monitor docs](https://docs.percona.com/pg-stat-monitor/reference.html#postgresql-15). ## Functions - [`pg_stat_monitor_reset()`](https://docs.percona.com/pg-stat-monitor/functions.html): Resets the statistics tracked by the `pg_stat_monitor` view and deletes all previous data. diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx index d97ce19eb7f..846cd2e5f04 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx @@ -22,9 +22,8 @@ export const meta = { A full list of statistics is available in the [pg_stat_statements docs](https://www.postgresql.org/docs/current/pgstatstatements.html). -## Usage -### Enable the extension +## Enable the extension -### Inspecting activity +## Inspecting activity A common use for `pg_stat_statements` is to track down expensive or slow queries. The `pg_stat_statements` view contains a row for each executed query with statistics inlined. For example, you can leverage the statistics to identify frequently executed and slow queries against a given table. @@ -82,7 +81,7 @@ order by calls desc ``` -From the results, an informed decision about which queries to optimize, index, or adjust can be made. +From the results, we can make an informed decision about which queries to optimize or index. ## Resources diff --git a/apps/docs/pages/guides/database/extensions/pgaudit.mdx b/apps/docs/pages/guides/database/extensions/pgaudit.mdx index 6019bbb992b..7dde02b6312 100644 --- a/apps/docs/pages/guides/database/extensions/pgaudit.mdx +++ b/apps/docs/pages/guides/database/extensions/pgaudit.mdx @@ -10,9 +10,7 @@ export const meta = { PGAudit grants fine grain control over which statements and objects are emitted to logs. -## Usage - -### Enable the extension +## Enable the extension diff --git a/apps/docs/pages/guides/database/extensions/pgnet.mdx b/apps/docs/pages/guides/database/extensions/pgnet.mdx index 18c51a8dd2a..3246fb4f5df 100644 --- a/apps/docs/pages/guides/database/extensions/pgnet.mdx +++ b/apps/docs/pages/guides/database/extensions/pgnet.mdx @@ -16,9 +16,8 @@ The pg_net API is in alpha. Functions signatures may change. It differs from the `http` extension in that it is asynchronous by default. This makes it useful in blocking functions (like triggers). -## Usage -### Enable the extension +## Enable the extension -### Creating a full text search index +## Creating a full text search index Given a table with a `text` column: diff --git a/apps/docs/pages/guides/database/extensions/pgrouting.mdx b/apps/docs/pages/guides/database/extensions/pgrouting.mdx index 45b55737f80..3c94f81adc5 100644 --- a/apps/docs/pages/guides/database/extensions/pgrouting.mdx +++ b/apps/docs/pages/guides/database/extensions/pgrouting.mdx @@ -8,7 +8,7 @@ export const meta = { [pgRouting](http://pgrouting.org) is PostgreSQL and [PostGIS](http://postgis.net) extension adding geospatial routing functionality. -The core functionality of pgRouting is a set of path finding algorithms including: +The core functionality of `pgRouting` is a set of path finding algorithms including: - All Pairs Shortest Path, Johnson’s Algorithm - All Pairs Shortest Path, Floyd-Warshall Algorithm @@ -22,9 +22,8 @@ The core functionality of pgRouting is a set of path finding algorithms includin - Traveling Sales Person - Turn Restriction Shortest Path (TRSP) -## Usage -### Enable the extension +## Enable the extension -## Example Usage +## Example As an example, we'll solve the [traveling salesman probelem](https://en.wikipedia.org/wiki/Travelling_salesman_problem) using the pgRouting's `pgr_TSPeuclidean` function from some PostGIS coodinates. diff --git a/apps/docs/pages/guides/database/extensions/pgtap.mdx b/apps/docs/pages/guides/database/extensions/pgtap.mdx index fc642b522ab..219eedd11ee 100644 --- a/apps/docs/pages/guides/database/extensions/pgtap.mdx +++ b/apps/docs/pages/guides/database/extensions/pgtap.mdx @@ -15,9 +15,7 @@ Let's cover some basic concepts: - Unit tests: allow you to test small parts of a system (like a database table!). - TAP: stands for [Test Anything Protocol](http://testanything.org/). It is an framework which aims to simplify the error reporting during testing. -## Usage - -### Enable the extension +## Enable the extension -### Testing tables +## Testing tables ```sql begin; @@ -68,7 +66,7 @@ API: - [`has_index()`](https://pgtap.org/documentation.html#has_index): Checks for the existence of a named index associated with the named table. - [`has_relation()`](https://pgtap.org/documentation.html#has_relation): Tests whether or not a relation exists in the database. -### Testing columns +## Testing columns ```sql begin; @@ -86,7 +84,7 @@ API: - [`has_column()`](https://pgtap.org/documentation.html#has_column): Tests whether or not a column exists in a given table, view, materialized view or composite type. - [`col_is_pk()`](https://pgtap.org/documentation.html#col_is_pk): Tests whether the specified column or columns in a table is/are the primary key for that table. -### Testing RLS Policies +## Testing RLS Policies ```sql begin; @@ -133,7 +131,7 @@ API: - [`results_eq()`](https://pgtap.org/documentation.html#results_eq) - [`results_ne()`](https://pgtap.org/documentation.html#results_ne) -### Testing Functions +## Testing Functions ```sql begin; diff --git a/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx b/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx index 8a9fb7bfde4..a064f463df6 100644 --- a/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx +++ b/apps/docs/pages/guides/database/extensions/plpgsql_check.mdx @@ -6,11 +6,9 @@ export const meta = { description: 'Lint PL/pgSQL code', } -plpg_sqlcheck is a PostgreSQL extension that lints plpgsql for syntax, semantic and other related issues. The tool helps developers to identify and correct errors before executing the code. plpgsql_sqlcheck is most useful for developers who are working with large or complex SQL codebases, as it can help identify and resolve issues early in the development cycle. +[plpgsql_check](https://github.com/okbob/plpgsql_check) is a PostgreSQL extension that lints plpgsql for syntax, semantic and other related issues. The tool helps developers to identify and correct errors before executing the code. plpgsql_check is most useful for developers who are working with large or complex SQL codebases, as it can help identify and resolve issues early in the development cycle. -## Usage - -### Enable the extension +## Enable the extension -### Create `plv8` functions +## Create `plv8` functions Functions written in `plv8` are written just like any other PostgreSQL functions, only with the `language` identifier set to `plv8`. diff --git a/apps/docs/pages/guides/database/extensions/postgis.mdx b/apps/docs/pages/guides/database/extensions/postgis.mdx index 6f241b0774e..9e9a65098ad 100644 --- a/apps/docs/pages/guides/database/extensions/postgis.mdx +++ b/apps/docs/pages/guides/database/extensions/postgis.mdx @@ -14,9 +14,7 @@ While you may be able to store simple lat/long geographic coordinates as a set o The additional data types that PostGIS provides include [Point](https://postgis.net/docs/using_postgis_dbmanagement.html#Point), [Polygon](https://postgis.net/docs/using_postgis_dbmanagement.html#Polygon), [Linestring](https://postgis.net/docs/using_postgis_dbmanagement.html#LineString), and many more to represent different types of geographical data. In this guide, we will mainly focus on how to interact with `Point` type, which represents a single set of latitude and longitude. If you are interested in digging deeper, you can learn more about different data types on the [data management section of PostGIS docs](https://postgis.net/docs/using_postgis_dbmanagement.html). -## Usage - -### Enable the extension +## Enable the extension You can get started with PostGIS by enabling the PostGIS extension in your Supabase dashboard. diff --git a/apps/docs/pages/guides/database/extensions/timescaledb.mdx b/apps/docs/pages/guides/database/extensions/timescaledb.mdx index 2ce81cfb74d..e00228b0288 100644 --- a/apps/docs/pages/guides/database/extensions/timescaledb.mdx +++ b/apps/docs/pages/guides/database/extensions/timescaledb.mdx @@ -10,9 +10,8 @@ export const meta = { `timescaledb` uses a time-series-aware storage model and indexing techniques to improve performance of PostgreSQL in working with time-series data. The extension divides data into chunks based on time intervals, allowing it to scale efficiently, especially for large data sets. The data is then compressed, optimized for write-heavy workloads, and partitioned for parallel processing. `timescaledb` also includes a set of functions, operators, and indexes that work with time-series data to reduce query times, and make data easier to work with. -## Usage -### Enable the extension +## Enable the extension -### The `uuid` type +## The `uuid` type Once the extension is enabled, you now have access to a `uuid` type. -### `uuid_generate_v1()` +## `uuid_generate_v1()` Creates a UUID value based on the combination of computer’s MAC address, current timestamp, and a random value. @@ -67,7 +65,7 @@ Creates a UUID value based on the combination of computer’s MAC address, curre applications. -### `uuid_generate_v4()` +## `uuid_generate_v4()` Creates UUID values based solely on random numbers. You can also use Postgres's built-in [`gen_random_uuid()`](https://www.postgresql.org/docs/current/functions-uuid.html) function to generate a UUIDv4. diff --git a/apps/docs/pages/guides/database/extensions/wrappers.mdx b/apps/docs/pages/guides/database/extensions/wrappers.mdx index 2673d17f037..943b1dd6391 100644 --- a/apps/docs/pages/guides/database/extensions/wrappers.mdx +++ b/apps/docs/pages/guides/database/extensions/wrappers.mdx @@ -46,7 +46,7 @@ from {/* prettier-ignore */} ```sql -- Enable the "wrappers" extension -create extension wrappers with schema extensions; +create extension wrappers; -- Disable the "wrappers" extension drop extension if exists wrappers; From 5a6a754928f937fc2556ffab5cf6c3c34381981e Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Wed, 15 Feb 2023 08:23:59 -0600 Subject: [PATCH 115/207] ref supabase query performance doc --- apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx | 1 + .../docs/pages/guides/database/extensions/pg_stat_statements.mdx | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx index d1a8da6ffb7..a162847f5c8 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_monitor.mdx @@ -11,6 +11,7 @@ export const meta = { - **Capture Parameters**: optionally track parameters passed into queries instead of generic placeholders e.g. `$1` - **Query Plan**: store query plans used for execution +For more information on query optimization, check out the [query performance guide](/docs/guides/platform/performance#examining-query-performance). ## Enable the extension diff --git a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx index 846cd2e5f04..cb64a901b0c 100644 --- a/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx +++ b/apps/docs/pages/guides/database/extensions/pg_stat_statements.mdx @@ -22,6 +22,7 @@ export const meta = { A full list of statistics is available in the [pg_stat_statements docs](https://www.postgresql.org/docs/current/pgstatstatements.html). +For more information on query optimization, check out the [query performance guide](/docs/guides/platform/performance#examining-query-performance). ## Enable the extension From e2226301cce2c41d33da777b1c9e02901fda12cc Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Wed, 15 Feb 2023 08:43:46 -0600 Subject: [PATCH 116/207] formatting tweaks and typos --- .../Navigation/NavigationMenu/NavigationMenu.constants.ts | 4 ++-- apps/docs/pages/guides/database/extensions/hypopg.mdx | 3 +-- apps/docs/pages/guides/database/extensions/pgroonga.mdx | 2 +- apps/docs/pages/guides/database/extensions/pgrouting.mdx | 2 -- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index 50ca4409530..7385afd2d3d 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -410,7 +410,7 @@ export const database = { items: [], }, { - name: 'PGRoonga: Multilingual Full Text Search', + name: 'PGroonga: Multilingual Full Text Search', url: '/guides/database/extensions/pgroonga', items: [], }, @@ -425,7 +425,7 @@ export const database = { items: [], }, { - name: 'pg_graphql: GraphQL support', + name: 'pg_graphql: GraphQL Support', url: '/guides/database/extensions/pg_graphql', items: [], }, diff --git a/apps/docs/pages/guides/database/extensions/hypopg.mdx b/apps/docs/pages/guides/database/extensions/hypopg.mdx index 069d530333e..14c9c15050b 100644 --- a/apps/docs/pages/guides/database/extensions/hypopg.mdx +++ b/apps/docs/pages/guides/database/extensions/hypopg.mdx @@ -10,9 +10,8 @@ export const meta = { The motivation for HypoPG is to allow users to quickly search for an index to improve a slow query without consuming server resources or waiting for them to build. -## Usage -### Enable the extension +## Enable the extension Date: Wed, 15 Feb 2023 08:53:15 -0600 Subject: [PATCH 117/207] make review dog happy --- apps/docs/pages/guides/database/extensions/hypopg.mdx | 1 - .../pages/guides/database/extensions/pg-safeupdate.mdx | 2 +- apps/docs/pages/guides/database/extensions/pg_graphql.mdx | 1 - .../pages/guides/database/extensions/pg_stat_monitor.mdx | 3 ++- apps/docs/pages/guides/database/extensions/pgaudit.mdx | 1 - apps/docs/pages/guides/database/extensions/pgjwt.mdx | 8 +++----- apps/docs/pages/guides/database/extensions/pgrouting.mdx | 8 ++++---- apps/docs/pages/guides/database/extensions/pgsodium.mdx | 2 +- .../docs/pages/guides/database/extensions/timescaledb.mdx | 1 - 9 files changed, 11 insertions(+), 16 deletions(-) diff --git a/apps/docs/pages/guides/database/extensions/hypopg.mdx b/apps/docs/pages/guides/database/extensions/hypopg.mdx index 14c9c15050b..18688e276e4 100644 --- a/apps/docs/pages/guides/database/extensions/hypopg.mdx +++ b/apps/docs/pages/guides/database/extensions/hypopg.mdx @@ -10,7 +10,6 @@ export const meta = { The motivation for HypoPG is to allow users to quickly search for an index to improve a slow query without consuming server resources or waiting for them to build. - ## Enable the extension - ## Settings The `pgaudit.log` setting controls which statements to log. Available values include: diff --git a/apps/docs/pages/guides/database/extensions/pgjwt.mdx b/apps/docs/pages/guides/database/extensions/pgjwt.mdx index 548925f8ad8..77c8bcc8dea 100644 --- a/apps/docs/pages/guides/database/extensions/pgjwt.mdx +++ b/apps/docs/pages/guides/database/extensions/pgjwt.mdx @@ -8,7 +8,6 @@ export const meta = { The [pgjwt](https://github.com/michelp/pgjwt) (PostgreSQL JSON Web Token) extension allows you to create and parse [JSON Web Tokens (JWTs)](https://en.wikipedia.org/wiki/JSON_Web_Token) within a PostgreSQL database. JWTs are commonly used for authentication and authorization in web applications and services. - ## Enable the extension - ## Resources - Official [`pgsodium` documentation](https://github.com/michelp/pgsodium) diff --git a/apps/docs/pages/guides/database/extensions/timescaledb.mdx b/apps/docs/pages/guides/database/extensions/timescaledb.mdx index e00228b0288..265e8662ad4 100644 --- a/apps/docs/pages/guides/database/extensions/timescaledb.mdx +++ b/apps/docs/pages/guides/database/extensions/timescaledb.mdx @@ -10,7 +10,6 @@ export const meta = { `timescaledb` uses a time-series-aware storage model and indexing techniques to improve performance of PostgreSQL in working with time-series data. The extension divides data into chunks based on time intervals, allowing it to scale efficiently, especially for large data sets. The data is then compressed, optimized for write-heavy workloads, and partitioned for parallel processing. `timescaledb` also includes a set of functions, operators, and indexes that work with time-series data to reduce query times, and make data easier to work with. - ## Enable the extension Date: Wed, 15 Feb 2023 16:02:11 +0100 Subject: [PATCH 118/207] Update apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx --- .../pages/learn/auth-deep-dive/auth-policies.mdx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx b/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx index 17e81a174b2..05c159230f1 100644 --- a/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx +++ b/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx @@ -156,15 +156,14 @@ create policy "Only Blizzard staff can update leaderboard" Supabase comes with two built-in helper functions: `auth.uid()` and `auth.jwt()`. To create your own functions, navigate to the SQL editor and create a a new query. -``` -create or replace function useragent() returns text as $$ + +```sql +create or replace function user_agent() +returns text +language sql +as $$ select nullif(current_setting('request.headers', true)::json->>'user-agent', '')::text; -$$ language sql; -``` -You can access request headers, cookies and JWT claims by reading GUC variables set by PostgREST per request. They are named `request.headers`, `request.cookies` and `request.jwt.claims`. - - -Read more about the http-context here: [https://postgrest.org/en/v10.0/api.html#http-context](https://postgrest.org/en/v10.0/api.html#http-context) +$$; See the full PostgreSQL policy docs here: [https://www.postgresql.org/docs/12/sql-createpolicy.html](https://www.postgresql.org/docs/12/sql-createpolicy.html) From e66b8249766789f612ad8356e244ae8763041329 Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:02:31 +0100 Subject: [PATCH 119/207] Update apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx --- apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx b/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx index 05c159230f1..5417534e0c1 100644 --- a/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx +++ b/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx @@ -170,7 +170,6 @@ See the full PostgreSQL policy docs here: [https://www.postgresql.org/docs/12/sq You can get as creative as you like with these policies. - ### Resources - JWT debugger: https://jwt.io​ From 6473a81be1570a1d9859c263b0d47f2e4af15c4a Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:02:46 +0100 Subject: [PATCH 120/207] Update apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx --- apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx b/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx index 5417534e0c1..e19af2d7c41 100644 --- a/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx +++ b/apps/docs/pages/learn/auth-deep-dive/auth-policies.mdx @@ -169,7 +169,6 @@ See the full PostgreSQL policy docs here: [https://www.postgresql.org/docs/12/sq You can get as creative as you like with these policies. - ### Resources - JWT debugger: https://jwt.io​ From ad91ee8d5901aa1c260e98bd46f6c350dddb3707 Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:04:33 +0100 Subject: [PATCH 121/207] Update apps/docs/pages/guides/database/tables.mdx --- apps/docs/pages/guides/database/tables.mdx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/docs/pages/guides/database/tables.mdx b/apps/docs/pages/guides/database/tables.mdx index 535da8bcb9d..c3eec681172 100644 --- a/apps/docs/pages/guides/database/tables.mdx +++ b/apps/docs/pages/guides/database/tables.mdx @@ -243,14 +243,6 @@ You would [connect](../../guides/database/connecting-to-postgres#direct-connecti ```bash psql -h DATABASE_URL -p 5432 -d postgres -U postgres \ -c "\COPY movies FROM './movies.csv';" -``` -Additionally use the `DELIMITER`, `HEADER` and `FORMAT` options as defined in the PostgreSQL [COPY](https://www.postgresql.org/docs/current/sql-copy.html) docs. -```bash -psql -h DATABASE_URL -p 5432 -d postgres -U postgres \ - -c "\COPY movies FROM './movies.csv' WITH DELIMITER ',' CSV HEADER" -``` - -Tip: If you get a `FATAL: password authentication failed for user "postgres"` error, reset the password in your Database settings and try again. ## Joining tables with Foreign Keys From e6d984eaaae7f2e4ad6034fd7f4e6bb4e1b0808f Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:19:46 +0100 Subject: [PATCH 122/207] Revert "Update apps/docs/pages/guides/database/tables.mdx" This reverts commit ad91ee8d5901aa1c260e98bd46f6c350dddb3707. --- apps/docs/pages/guides/database/tables.mdx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/docs/pages/guides/database/tables.mdx b/apps/docs/pages/guides/database/tables.mdx index c3eec681172..535da8bcb9d 100644 --- a/apps/docs/pages/guides/database/tables.mdx +++ b/apps/docs/pages/guides/database/tables.mdx @@ -243,6 +243,14 @@ You would [connect](../../guides/database/connecting-to-postgres#direct-connecti ```bash psql -h DATABASE_URL -p 5432 -d postgres -U postgres \ -c "\COPY movies FROM './movies.csv';" +``` +Additionally use the `DELIMITER`, `HEADER` and `FORMAT` options as defined in the PostgreSQL [COPY](https://www.postgresql.org/docs/current/sql-copy.html) docs. +```bash +psql -h DATABASE_URL -p 5432 -d postgres -U postgres \ + -c "\COPY movies FROM './movies.csv' WITH DELIMITER ',' CSV HEADER" +``` + +Tip: If you get a `FATAL: password authentication failed for user "postgres"` error, reset the password in your Database settings and try again. ## Joining tables with Foreign Keys From 7fcd3feea08bc9d58c8eaef4f04fae4f306f1803 Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:23:07 +0100 Subject: [PATCH 123/207] Update apps/docs/pages/guides/database/tables.mdx --- apps/docs/pages/guides/database/tables.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/docs/pages/guides/database/tables.mdx b/apps/docs/pages/guides/database/tables.mdx index 535da8bcb9d..4f022775427 100644 --- a/apps/docs/pages/guides/database/tables.mdx +++ b/apps/docs/pages/guides/database/tables.mdx @@ -245,6 +245,7 @@ psql -h DATABASE_URL -p 5432 -d postgres -U postgres \ -c "\COPY movies FROM './movies.csv';" ``` Additionally use the `DELIMITER`, `HEADER` and `FORMAT` options as defined in the PostgreSQL [COPY](https://www.postgresql.org/docs/current/sql-copy.html) docs. + ```bash psql -h DATABASE_URL -p 5432 -d postgres -U postgres \ -c "\COPY movies FROM './movies.csv' WITH DELIMITER ',' CSV HEADER" From 17c92914ed503a4338cae90ae5a2fb7596e53e6d Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:23:30 +0100 Subject: [PATCH 124/207] Update apps/docs/pages/guides/database/tables.mdx --- apps/docs/pages/guides/database/tables.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/docs/pages/guides/database/tables.mdx b/apps/docs/pages/guides/database/tables.mdx index 4f022775427..85d295fffc1 100644 --- a/apps/docs/pages/guides/database/tables.mdx +++ b/apps/docs/pages/guides/database/tables.mdx @@ -244,6 +244,7 @@ You would [connect](../../guides/database/connecting-to-postgres#direct-connecti psql -h DATABASE_URL -p 5432 -d postgres -U postgres \ -c "\COPY movies FROM './movies.csv';" ``` + Additionally use the `DELIMITER`, `HEADER` and `FORMAT` options as defined in the PostgreSQL [COPY](https://www.postgresql.org/docs/current/sql-copy.html) docs. ```bash From 04d0f7f2851dfbbedf4e663fcdf450a6d7a02c8c Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:23:48 +0100 Subject: [PATCH 125/207] Update apps/docs/pages/guides/database/tables.mdx --- apps/docs/pages/guides/database/tables.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/pages/guides/database/tables.mdx b/apps/docs/pages/guides/database/tables.mdx index 85d295fffc1..9ed2619b47d 100644 --- a/apps/docs/pages/guides/database/tables.mdx +++ b/apps/docs/pages/guides/database/tables.mdx @@ -252,7 +252,7 @@ psql -h DATABASE_URL -p 5432 -d postgres -U postgres \ -c "\COPY movies FROM './movies.csv' WITH DELIMITER ',' CSV HEADER" ``` -Tip: If you get a `FATAL: password authentication failed for user "postgres"` error, reset the password in your Database settings and try again. +If you receive an error `FATAL: password authentication failed for user "postgres"`, reset your database password in the Database Settings and try again. ## Joining tables with Foreign Keys From 872ba091127662decb2e86fa5cf64883c17121c1 Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Wed, 15 Feb 2023 12:00:03 -0330 Subject: [PATCH 126/207] Add secret fetching --- apps/docs/components/Clippy/Clippy.tsx | 26 ++++---- apps/docs/components/Clippy/ClippyModal.tsx | 35 +++++----- apps/docs/internals/getSecrets.js | 35 ++++++++++ apps/docs/layouts/SiteLayout.tsx | 3 +- apps/docs/package.json | 1 + package-lock.json | 73 ++++++--------------- package.json | 1 + 7 files changed, 92 insertions(+), 82 deletions(-) create mode 100644 apps/docs/internals/getSecrets.js diff --git a/apps/docs/components/Clippy/Clippy.tsx b/apps/docs/components/Clippy/Clippy.tsx index 10858f23fc7..ce22accbe09 100644 --- a/apps/docs/components/Clippy/Clippy.tsx +++ b/apps/docs/components/Clippy/Clippy.tsx @@ -13,21 +13,25 @@ const Clippy: FC = () => { const { isDarkMode } = useTheme() const { isOpen, open, close } = useClippy() - return ( - <> - {!isOpen && ( -
- {/* <> + if (!IS_PLATFORM) { + return null + } else { + return ( + <> + {!isOpen && ( +
+ {/* <>
- Clippy + Clippy
*/} -
- )} - {isOpen && IS_PLATFORM && createPortal(, document.body)} - - ) +
+ )} + {isOpen && createPortal(, document.body)} + + ) + } } export default Clippy diff --git a/apps/docs/components/Clippy/ClippyModal.tsx b/apps/docs/components/Clippy/ClippyModal.tsx index 3bbbd7c69de..fdfa1e440d2 100644 --- a/apps/docs/components/Clippy/ClippyModal.tsx +++ b/apps/docs/components/Clippy/ClippyModal.tsx @@ -19,6 +19,7 @@ import { Modal, } from 'ui' import components from '~/components' +import { IS_PLATFORM } from '~/lib/constants' type Props = { onClose?: () => void @@ -35,9 +36,8 @@ const questions = [ function getEdgeFunctionUrl() { const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL.replace(/\/$/, '') - const isPlatform = supabaseUrl.match(/(supabase\.co)|(supabase\.in)/) - if (isPlatform) { + if (IS_PLATFORM) { const [schemeAndProjectId, domain, tld] = supabaseUrl.split('.') return `${schemeAndProjectId}.functions.${domain}.${tld}` } else { @@ -45,7 +45,7 @@ function getEdgeFunctionUrl() { } } -const edgeFunctionUrl = getEdgeFunctionUrl() +const edgeFunctionUrl = IS_PLATFORM ? getEdgeFunctionUrl() : undefined const ClippyModal: FC = ({ onClose }) => { const { isDarkMode } = useTheme() @@ -165,19 +165,22 @@ const ClippyModal: FC = ({ onClose }) => {

Not sure where to start?

    - {questions.map((question) => ( -
  • - -
  • - ))} + {questions.map((question) => { + const key = question.replace(/\s+/g, '_') + return ( +
  • + +
  • + ) + })}
diff --git a/apps/docs/internals/getSecrets.js b/apps/docs/internals/getSecrets.js new file mode 100644 index 00000000000..4782a3f1ed5 --- /dev/null +++ b/apps/docs/internals/getSecrets.js @@ -0,0 +1,35 @@ +// for internal supabase use only +const fs = require('fs/promises') +const AWS = require('aws-sdk') + +const secretName = 'local/docs' +const region = 'ap-southeast-2' + +const getSecrets = async (name, region) => { + try { + AWS.config.update({ region }) + const secretsmanager = new AWS.SecretsManager() + + const data = await secretsmanager + .getSecretValue({ + SecretId: name, + }) + .promise() + + if (!data.SecretString) { + throw new Error('Secrets not found') + } + return JSON.parse(data.SecretString) + } catch (err) { + console.log('Error getting secrets', err) + } +} + +// gets secrets from secrets manager and writes it to .env.local file +getSecrets(secretName, region).then(async (secrets) => { + let secretContent = '' + for (const [secretKey, secretValue] of Object.entries(secrets)) { + secretContent += `${secretKey}="${secretValue}"\n` + } + await fs.writeFile('.env.local', secretContent.trim()) +}) diff --git a/apps/docs/layouts/SiteLayout.tsx b/apps/docs/layouts/SiteLayout.tsx index d1f37b40d1b..54f19ce5350 100644 --- a/apps/docs/layouts/SiteLayout.tsx +++ b/apps/docs/layouts/SiteLayout.tsx @@ -10,6 +10,7 @@ import { memo, useEffect } from 'react' import Clippy from '~/components/Clippy/Clippy' import Footer from '~/components/Navigation/Footer' import { menuState, useMenuLevelId, useMenuMobileOpen } from '~/hooks/useMenuState' +import { IS_PLATFORM } from '~/lib/constants' const levelsData = { home: { @@ -340,7 +341,7 @@ const SiteLayout = ({ children }) => {
- + {IS_PLATFORM && }
diff --git a/apps/docs/package.json b/apps/docs/package.json index a8c42541d9e..717e8d05d28 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -4,6 +4,7 @@ "private": true, "scripts": { "dev": "next dev --port 3001", + "dev:secrets:pull": "AWS_PROFILE=supabase-dev node internals/getSecrets.js", "build": "npm run generate:all && next build", "start": "next start", "lint": "next lint", diff --git a/package-lock.json b/package-lock.json index 78869d57003..a6edd4e1b58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "dependencies": { "@code-hike/mdx": "^0.7.4", "@mdx-js/react": "^2.1.1", + "aws-sdk": "^2.1315.0", "mdx-mermaid": "^1.3.2", "mermaid": "^9.2.2", "mini-svg-data-uri": "^1.4.4" @@ -12171,7 +12172,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -12216,10 +12216,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1275.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1275.0.tgz", - "integrity": "sha512-GP7oS0BTh012pAMnNSVVQQrhfubeLH2moLUQQiuk9cPrqQYeP74BU3nnALM30CoFNzX+DwLanOeFU+KMfUGLHg==", - "dev": true, + "version": "2.1315.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1315.0.tgz", + "integrity": "sha512-fDlK3iqA0bpXW6azVBAB8RTKhJ5YUjfe6sqKQF1lKT2cYT5qU4rtH5qUlMixlWkb8oKeSMA2voW3wZZtSpBFKQ==", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -12240,7 +12239,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "dev": true, "engines": { "node": ">=0.4.x" } @@ -12248,20 +12246,17 @@ "node_modules/aws-sdk/node_modules/ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "node_modules/aws-sdk/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" }, "node_modules/aws-sdk/node_modules/url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", - "dev": true, "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -12271,7 +12266,6 @@ "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -12284,7 +12278,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -18831,7 +18824,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -19494,7 +19486,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -20851,7 +20842,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -21079,7 +21069,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -21306,7 +21295,6 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -23319,7 +23307,6 @@ "version": "0.16.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", - "dev": true, "engines": { "node": ">= 0.6.0" } @@ -33770,8 +33757,7 @@ "node_modules/sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", - "dev": true + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" }, "node_modules/saxes": { "version": "5.0.1", @@ -38229,7 +38215,6 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -38377,7 +38362,6 @@ "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~9.0.1" @@ -38387,7 +38371,6 @@ "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", - "dev": true, "engines": { "node": ">=4.0" } @@ -46181,7 +46164,7 @@ "@sinclair/typebox": "^0.25.1", "pg": "^8.7.1", "pg-format": "^1.0.4", - "pgsql-parser": "^13.3.0", + "pgsql-parser": "13.4.0", "postgres-array": "^3.0.1", "prettier": "^2.6.0", "prettier-plugin-sql": "^0.12.1" @@ -47977,8 +47960,7 @@ "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "awesome-debounce-promise": { "version": "2.1.0", @@ -48005,10 +47987,9 @@ } }, "aws-sdk": { - "version": "2.1275.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1275.0.tgz", - "integrity": "sha512-GP7oS0BTh012pAMnNSVVQQrhfubeLH2moLUQQiuk9cPrqQYeP74BU3nnALM30CoFNzX+DwLanOeFU+KMfUGLHg==", - "dev": true, + "version": "2.1315.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1315.0.tgz", + "integrity": "sha512-fDlK3iqA0bpXW6azVBAB8RTKhJ5YUjfe6sqKQF1lKT2cYT5qU4rtH5qUlMixlWkb8oKeSMA2voW3wZZtSpBFKQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -48025,26 +48006,22 @@ "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", - "dev": true + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", - "dev": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -48054,7 +48031,6 @@ "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -48066,8 +48042,7 @@ "uuid": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", - "dev": true + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==" } } }, @@ -53704,7 +53679,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "requires": { "is-callable": "^1.1.3" } @@ -54172,7 +54146,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "requires": { "get-intrinsic": "^1.1.3" } @@ -55170,7 +55143,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -55327,7 +55299,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -55474,7 +55445,6 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -57131,8 +57101,7 @@ "jmespath": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", - "dev": true + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" }, "join-component": { "version": "1.1.0", @@ -64799,8 +64768,7 @@ "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", - "dev": true + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" }, "saxes": { "version": "5.0.1", @@ -68874,7 +68842,6 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -69154,7 +69121,6 @@ "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "~9.0.1" @@ -69163,8 +69129,7 @@ "xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", - "dev": true + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" }, "xmlchars": { "version": "2.2.0", diff --git a/package.json b/package.json index 27c148a2ab9..9d5a7d60242 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "dependencies": { "@code-hike/mdx": "^0.7.4", "@mdx-js/react": "^2.1.1", + "aws-sdk": "^2.1315.0", "mdx-mermaid": "^1.3.2", "mermaid": "^9.2.2", "mini-svg-data-uri": "^1.4.4" From fd7e4bf8eb33fb01d37e82f8b99089e3f12b179c Mon Sep 17 00:00:00 2001 From: Brandon Scott Date: Wed, 15 Feb 2023 10:32:29 -0500 Subject: [PATCH 127/207] docs: fix typos in developer contributing doc --- DEVELOPERS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DEVELOPERS.md b/DEVELOPERS.md index 0281b1b0bd7..1845aa29ca5 100644 --- a/DEVELOPERS.md +++ b/DEVELOPERS.md @@ -57,7 +57,7 @@ To contribute code to [Supabase](https://supabase.com), you must fork the [Supab [Supabase](https://supabase.com) uses [Turborepo](https://turborepo.org/docs) to manage and run this monorepo. -1. Install the dependences in the root of the repo. +1. Install the dependencies in the root of the repo. ```sh npm install # install dependencies @@ -113,7 +113,7 @@ Following the changes to the [Supabase docs](https://supabase.com/blog/new-supab - Inside of `apps/docs` create a `.env.local` file with the following: `NEXT_PUBLIC_NEW_DOCS=true` -Now when you run a local devlopment docs server you will see the new docs site. +Now when you run a local development docs server you will see the new docs site. --- From 6432786c76981a231d838a4e62b50312f632ea1d Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Wed, 15 Feb 2023 14:38:33 -0330 Subject: [PATCH 128/207] Add links to extensions --- apps/docs/components/Extensions.tsx | 6 ++++-- apps/docs/data/extensions.json | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/apps/docs/components/Extensions.tsx b/apps/docs/components/Extensions.tsx index 0175afe77a5..7391e2d5456 100644 --- a/apps/docs/components/Extensions.tsx +++ b/apps/docs/components/Extensions.tsx @@ -16,7 +16,9 @@ type extension = { function getUniqueTags(json: extension[]) { const tags = [] for (const item of json) { - tags.push(...item.tags) + if (item.tags) { + tags.push(...item.tags) + } } return [...new Set(tags)] } @@ -51,7 +53,7 @@ export default function Extensions() {

Filter