diff --git a/apps/www/internals/generate-sitemap.mjs b/apps/www/internals/generate-sitemap.mjs index 2e7ece2c0cb..70f76b5b09a 100644 --- a/apps/www/internals/generate-sitemap.mjs +++ b/apps/www/internals/generate-sitemap.mjs @@ -24,8 +24,8 @@ async function generate() { '!pages/*/index.tsx', '!pages/api', '!pages/404.js', - //get the generated partner pages - '.next/server/pages/partners/*.html', + '.next/server/pages/partners/integrations/*.html', + '.next/server/pages/partners/experts/*.html', ]) const blogUrl = 'blog' @@ -39,9 +39,9 @@ async function generate() { .filter((page) => !page.includes('_document.tsx')) .map((page) => { const path = page - //replace the path for the generated partner pages - .replace('.next/server/pages/partners/', '/partners/') + .replace('.next/server/pages', '') .replace('pages', '') + .replace('.html', '') // add a `/` for blog posts .replace('_blog', `/${blogUrl}`) .replace('_case-studies', `/${caseStudiesUrl}`) @@ -49,7 +49,6 @@ async function generate() { .replace('_alternatives', '/alternatives') .replace('.tsx', '') .replace('.mdx', '') - .replace('.html', '') // replace the paths for nested 'index' based routes .replace('/auth/Auth', '/auth') .replace('/database/Database', '/database') diff --git a/apps/www/pages/partners/[slug].tsx b/apps/www/pages/partners/[slug].tsx index 93cb02670c1..2e7ad652ba5 100644 --- a/apps/www/pages/partners/[slug].tsx +++ b/apps/www/pages/partners/[slug].tsx @@ -1,202 +1,12 @@ -import { IconChevronLeft, IconExternalLink } from 'ui' -import { marked } from 'marked' import { GetStaticPaths, GetStaticProps } from 'next' -import { NextSeo } from 'next-seo' -import Image from 'next/image' -import Link from 'next/link' -import { Swiper, SwiperSlide } from 'swiper/react' import 'swiper/swiper.min.css' -import DefaultLayout from '~/components/Layouts/Default' -import SectionContainer from '~/components/Layouts/SectionContainer' import supabase from '~/lib/supabase' import { Partner } from '~/types/partners' import Error404 from '../404' -function PartnerPage({ partner }: { partner: Partner }) { - if (!partner) return - return ( - <> - - - - - - {/* Back button */} - - - - Back - - - - - - - {partner.title} - - - - - - {partner.images.map((image: any, i: number) => { - return ( - - - - - - ) - })} - - - - - - - Overview - - - {partner.video && ( - - - - )} - - - - - - - Details - - - - {partner.type === 'technology' && ( - - Developer - {partner.developer} - - )} - - - Category - - - {partner.category} - - - - - - Website - - {new URL(partner.website).host} - - - - {partner.type === 'technology' && ( - - Documentation - - - Learn - - - - - )} - - - - - - - > - ) +function PartnerPage() { + // Should be redirected to ./experts/:slug or ./integrations/:slug + return } // This function gets called at build time @@ -228,18 +38,27 @@ export const getStaticProps: GetStaticProps = async ({ params }) => { .eq('slug', params!.slug as string) .single() - if (!partner) { + if (!partner || process.env.npm_lifecycle_event === 'build') { return { notFound: true, } } - // Parse markdown - partner.overview = marked.parse(partner.overview) + let redirectUrl: string + switch (partner.type) { + case 'technology': + redirectUrl = `/partners/integrations/${partner.slug}` + break + case 'expert': + redirectUrl = `/partners/experts/${partner.slug}` + break + } return { - props: { partner }, - revalidate: 18000, // In seconds - refresh every 5 hours + redirect: { + permanent: false, + destination: redirectUrl, + }, } } diff --git a/apps/www/pages/partners/experts/[slug].tsx b/apps/www/pages/partners/experts/[slug].tsx new file mode 100644 index 00000000000..6f7d733b2a4 --- /dev/null +++ b/apps/www/pages/partners/experts/[slug].tsx @@ -0,0 +1,242 @@ +import { marked } from 'marked' +import { GetStaticPaths, GetStaticProps } from 'next' +import { NextSeo } from 'next-seo' +import Image from 'next/image' +import Link from 'next/link' +import { Swiper, SwiperSlide } from 'swiper/react' +import 'swiper/swiper.min.css' +import { IconChevronLeft, IconExternalLink } from 'ui' +import DefaultLayout from '~/components/Layouts/Default' +import SectionContainer from '~/components/Layouts/SectionContainer' +import supabase from '~/lib/supabase' +import { Partner } from '~/types/partners' +import Error404 from '../../404' + +function Partner({ partner }: { partner: Partner }) { + if (!partner) return + return ( + <> + + + + + + {/* Back button */} + + + + Back + + + + + + + {partner.title} + + + + + + {partner.images.map((image: any, i: number) => { + return ( + + + + + + ) + })} + + + + + + + Overview + + + {partner.video && ( + + + + )} + + + + + + + Details + + + + {partner.type === 'technology' && ( + + Developer + {partner.developer} + + )} + + + Category + + + {partner.category} + + + + + + Website + + {new URL(partner.website).host} + + + + {partner.type === 'technology' && ( + + Documentation + + + Learn + + + + + )} + + + + + + + > + ) +} + +// This function gets called at build time +export const getStaticPaths: GetStaticPaths = async () => { + const { data: slugs } = await supabase.from('partners').select('slug') + + const paths: { + params: { slug: string } + locale?: string | undefined + }[] = + slugs?.map(({ slug }) => ({ + params: { + slug, + }, + })) ?? [] + + return { + paths, + fallback: 'blocking', + } +} + +// This also gets called at build time +export const getStaticProps: GetStaticProps = async ({ params }) => { + let { data: partner } = await supabase + .from('partners') + .select('*') + .eq('approved', true) + .eq('slug', params!.slug as string) + .single() + + if (!partner) { + return { + notFound: true, + } + } + + // Parse markdown + partner.overview = marked.parse(partner.overview) + + return { + props: { partner }, + revalidate: 18000, // In seconds - refresh every 5 hours + } +} + +export default Partner diff --git a/apps/www/pages/partners/integrations/[slug].tsx b/apps/www/pages/partners/integrations/[slug].tsx new file mode 100644 index 00000000000..2ac95452ff2 --- /dev/null +++ b/apps/www/pages/partners/integrations/[slug].tsx @@ -0,0 +1,242 @@ +import { marked } from 'marked' +import { GetStaticPaths, GetStaticProps } from 'next' +import { NextSeo } from 'next-seo' +import Image from 'next/image' +import Link from 'next/link' +import { Swiper, SwiperSlide } from 'swiper/react' +import 'swiper/swiper.min.css' +import { IconChevronLeft, IconExternalLink } from 'ui' +import DefaultLayout from '~/components/Layouts/Default' +import SectionContainer from '~/components/Layouts/SectionContainer' +import supabase from '~/lib/supabase' +import { Partner } from '~/types/partners' +import Error404 from '../../404' + +function Partner({ partner }: { partner: Partner }) { + if (!partner) return + return ( + <> + + + + + + {/* Back button */} + + + + Back + + + + + + + {partner.title} + + + + + + {partner.images.map((image: any, i: number) => { + return ( + + + + + + ) + })} + + + + + + + Overview + + + {partner.video && ( + + + + )} + + + + + + + Details + + + + {partner.type === 'technology' && ( + + Developer + {partner.developer} + + )} + + + Category + + + {partner.category} + + + + + + Website + + {new URL(partner.website).host} + + + + {partner.type === 'technology' && ( + + Documentation + + + Learn + + + + + )} + + + + + + + > + ) +} + +// This function gets called at build time +export const getStaticPaths: GetStaticPaths = async () => { + const { data: slugs } = await supabase.from('partners').select('slug') + + const paths: { + params: { slug: string } + locale?: string | undefined + }[] = + slugs?.map(({ slug }) => ({ + params: { + slug, + }, + })) ?? [] + + return { + paths, + fallback: 'blocking', + } +} + +// This also gets called at build time +export const getStaticProps: GetStaticProps = async ({ params }) => { + let { data: partner } = await supabase + .from('partners') + .select('*') + .eq('approved', true) + .eq('slug', params!.slug as string) + .single() + + if (!partner) { + return { + notFound: true, + } + } + + // Parse markdown + partner.overview = marked.parse(partner.overview) + + return { + props: { partner }, + revalidate: 18000, // In seconds - refresh every 5 hours + } +} + +export default Partner diff --git a/apps/www/public/sitemap_www.xml b/apps/www/public/sitemap_www.xml index 6f8f41f0145..0f2b2d5c4c1 100644 --- a/apps/www/public/sitemap_www.xml +++ b/apps/www/public/sitemap_www.xml @@ -42,12 +42,6 @@ 0.5 - - https://supabase.com/oss - weekly - 0.5 - - https://supabase.com/support weekly @@ -601,7 +595,7 @@ - https://supabase.com/blog/audit + https://supabase.com/blog/postgres-audit weekly 0.5 @@ -1172,6 +1166,24 @@ 0.5 + + https://supabase.com/blog/flutter-multi-factor-authentication + weekly + 0.5 + + + + https://supabase.com/blog/supabase-beta-update-april-2023 + weekly + 0.5 + + + + https://supabase.com/blog/flutter-hackathon + weekly + 0.5 + + https://supabase.com/customers/epsilon3 weekly @@ -1184,6 +1196,12 @@ 0.5 + + https://supabase.com/customers/mendableai + weekly + 0.5 + + https://supabase.com/customers/mobbin weekly @@ -1215,373 +1233,709 @@ - https://supabase.com/partners/antstack + https://supabase.com/partners/integrations/antstack weekly 0.5 - https://supabase.com/partners/appsmith + https://supabase.com/partners/integrations/appsmith weekly 0.5 - https://supabase.com/partners/arceptive + https://supabase.com/partners/integrations/arceptive weekly 0.5 - https://supabase.com/partners/arengu + https://supabase.com/partners/integrations/arengu weekly 0.5 - https://supabase.com/partners/authsignal + https://supabase.com/partners/integrations/authsignal weekly 0.5 - https://supabase.com/partners/basedash + https://supabase.com/partners/integrations/basedash weekly 0.5 - https://supabase.com/partners/clerk + https://supabase.com/partners/integrations/clerk weekly 0.5 - https://supabase.com/partners/clutch + https://supabase.com/partners/integrations/clutch weekly 0.5 - https://supabase.com/partners/codesandbox + https://supabase.com/partners/integrations/codesandbox weekly 0.5 - https://supabase.com/partners/dashibase + https://supabase.com/partners/integrations/dashibase weekly 0.5 - https://supabase.com/partners/deepnote + https://supabase.com/partners/integrations/deepnote weekly 0.5 - https://supabase.com/partners/dhiwise + https://supabase.com/partners/integrations/dhiwise weekly 0.5 - https://supabase.com/partners/directus + https://supabase.com/partners/integrations/directus weekly 0.5 - https://supabase.com/partners/doppler + https://supabase.com/partners/integrations/doppler weekly 0.5 - https://supabase.com/partners/draftbit + https://supabase.com/partners/integrations/draftbit weekly 0.5 - https://supabase.com/partners/drapcode + https://supabase.com/partners/integrations/drapcode weekly 0.5 - https://supabase.com/partners/enginedigital + https://supabase.com/partners/integrations/enginedigital weekly 0.5 - https://supabase.com/partners/estuary + https://supabase.com/partners/integrations/estuary weekly 0.5 - https://supabase.com/partners/experts + https://supabase.com/partners/integrations/feelantera weekly 0.5 - https://supabase.com/partners/feelantera + https://supabase.com/partners/integrations/fezto weekly 0.5 - https://supabase.com/partners/fezto + https://supabase.com/partners/integrations/flutterflow weekly 0.5 - https://supabase.com/partners/flutterflow + https://supabase.com/partners/integrations/getstream_io weekly 0.5 - https://supabase.com/partners/getstream_io + https://supabase.com/partners/integrations/illa weekly 0.5 - https://supabase.com/partners/illa + https://supabase.com/partners/integrations/internalio weekly 0.5 - https://supabase.com/partners/integrations + https://supabase.com/partners/integrations/jetadmin weekly 0.5 - https://supabase.com/partners/internalio + https://supabase.com/partners/integrations/keyri weekly 0.5 - https://supabase.com/partners/jetadmin + https://supabase.com/partners/integrations/morrow weekly 0.5 - https://supabase.com/partners/keyri + https://supabase.com/partners/integrations/nextauth weekly 0.5 - https://supabase.com/partners/morrow + https://supabase.com/partners/integrations/nuxt weekly 0.5 - https://supabase.com/partners/nextauth + https://supabase.com/partners/integrations/onesignal weekly 0.5 - https://supabase.com/partners/nuxt + https://supabase.com/partners/integrations/ory weekly 0.5 - https://supabase.com/partners/onesignal + https://supabase.com/partners/integrations/passageidentity weekly 0.5 - https://supabase.com/partners/ory + https://supabase.com/partners/integrations/pgmustard weekly 0.5 - https://supabase.com/partners/passageidentity + https://supabase.com/partners/integrations/picket weekly 0.5 - https://supabase.com/partners/pgmustard + https://supabase.com/partners/integrations/plasmic weekly 0.5 - https://supabase.com/partners/picket + https://supabase.com/partners/integrations/polyscale weekly 0.5 - https://supabase.com/partners/plasmic + https://supabase.com/partners/integrations/prisma weekly 0.5 - https://supabase.com/partners/polyscale + https://supabase.com/partners/integrations/quinence weekly 0.5 - https://supabase.com/partners/prisma + https://supabase.com/partners/integrations/readyset weekly 0.5 - https://supabase.com/partners/quinence + https://supabase.com/partners/integrations/replibyte weekly 0.5 - https://supabase.com/partners/readyset + https://supabase.com/partners/integrations/replicache weekly 0.5 - https://supabase.com/partners/replibyte + https://supabase.com/partners/integrations/retool weekly 0.5 - https://supabase.com/partners/replicache + https://supabase.com/partners/integrations/sequin_io weekly 0.5 - https://supabase.com/partners/retool + https://supabase.com/partners/integrations/snaplet weekly 0.5 - https://supabase.com/partners/sequin_io + https://supabase.com/partners/integrations/solid_software weekly 0.5 - https://supabase.com/partners/snaplet + https://supabase.com/partners/integrations/streamlit weekly 0.5 - https://supabase.com/partners/solid_software + https://supabase.com/partners/integrations/stytch weekly 0.5 - https://supabase.com/partners/streamlit + https://supabase.com/partners/integrations/supertokens weekly 0.5 - https://supabase.com/partners/stytch + https://supabase.com/partners/integrations/teta weekly 0.5 - https://supabase.com/partners/supertokens + https://supabase.com/partners/integrations/tinloof weekly 0.5 - https://supabase.com/partners/teta + https://supabase.com/partners/integrations/trevor_io weekly 0.5 - https://supabase.com/partners/tinloof + https://supabase.com/partners/integrations/uncommonpurpose weekly 0.5 - https://supabase.com/partners/trevor_io + https://supabase.com/partners/integrations/vercel weekly 0.5 - https://supabase.com/partners/tribehealthsolutions + https://supabase.com/partners/integrations/voltapp weekly 0.5 - https://supabase.com/partners/uncommonpurpose + https://supabase.com/partners/integrations/voypost weekly 0.5 - https://supabase.com/partners/vercel + https://supabase.com/partners/integrations/weweb weekly 0.5 - https://supabase.com/partners/voltapp + https://supabase.com/partners/integrations/yepcode weekly 0.5 - https://supabase.com/partners/voypost + https://supabase.com/partners/integrations/zapp_run weekly 0.5 - https://supabase.com/partners/weweb + https://supabase.com/partners/integrations/zuplo weekly 0.5 - https://supabase.com/partners/yepcode + https://supabase.com/partners/experts/antstack weekly 0.5 - https://supabase.com/partners/zapp_run + https://supabase.com/partners/experts/appsmith weekly 0.5 - https://supabase.com/partners/zuplo + https://supabase.com/partners/experts/arceptive + weekly + 0.5 + + + + https://supabase.com/partners/experts/arengu + weekly + 0.5 + + + + https://supabase.com/partners/experts/authsignal + weekly + 0.5 + + + + https://supabase.com/partners/experts/basedash + weekly + 0.5 + + + + https://supabase.com/partners/experts/clerk + weekly + 0.5 + + + + https://supabase.com/partners/experts/clutch + weekly + 0.5 + + + + https://supabase.com/partners/experts/codesandbox + weekly + 0.5 + + + + https://supabase.com/partners/experts/dashibase + weekly + 0.5 + + + + https://supabase.com/partners/experts/deepnote + weekly + 0.5 + + + + https://supabase.com/partners/experts/dhiwise + weekly + 0.5 + + + + https://supabase.com/partners/experts/directus + weekly + 0.5 + + + + https://supabase.com/partners/experts/doppler + weekly + 0.5 + + + + https://supabase.com/partners/experts/draftbit + weekly + 0.5 + + + + https://supabase.com/partners/experts/drapcode + weekly + 0.5 + + + + https://supabase.com/partners/experts/enginedigital + weekly + 0.5 + + + + https://supabase.com/partners/experts/estuary + weekly + 0.5 + + + + https://supabase.com/partners/experts/feelantera + weekly + 0.5 + + + + https://supabase.com/partners/experts/fezto + weekly + 0.5 + + + + https://supabase.com/partners/experts/flutterflow + weekly + 0.5 + + + + https://supabase.com/partners/experts/getstream_io + weekly + 0.5 + + + + https://supabase.com/partners/experts/illa + weekly + 0.5 + + + + https://supabase.com/partners/experts/internalio + weekly + 0.5 + + + + https://supabase.com/partners/experts/jetadmin + weekly + 0.5 + + + + https://supabase.com/partners/experts/keyri + weekly + 0.5 + + + + https://supabase.com/partners/experts/morrow + weekly + 0.5 + + + + https://supabase.com/partners/experts/nextauth + weekly + 0.5 + + + + https://supabase.com/partners/experts/nuxt + weekly + 0.5 + + + + https://supabase.com/partners/experts/onesignal + weekly + 0.5 + + + + https://supabase.com/partners/experts/ory + weekly + 0.5 + + + + https://supabase.com/partners/experts/passageidentity + weekly + 0.5 + + + + https://supabase.com/partners/experts/pgmustard + weekly + 0.5 + + + + https://supabase.com/partners/experts/picket + weekly + 0.5 + + + + https://supabase.com/partners/experts/plasmic + weekly + 0.5 + + + + https://supabase.com/partners/experts/polyscale + weekly + 0.5 + + + + https://supabase.com/partners/experts/prisma + weekly + 0.5 + + + + https://supabase.com/partners/experts/quinence + weekly + 0.5 + + + + https://supabase.com/partners/experts/readyset + weekly + 0.5 + + + + https://supabase.com/partners/experts/replibyte + weekly + 0.5 + + + + https://supabase.com/partners/experts/replicache + weekly + 0.5 + + + + https://supabase.com/partners/experts/retool + weekly + 0.5 + + + + https://supabase.com/partners/experts/sequin_io + weekly + 0.5 + + + + https://supabase.com/partners/experts/snaplet + weekly + 0.5 + + + + https://supabase.com/partners/experts/solid_software + weekly + 0.5 + + + + https://supabase.com/partners/experts/streamlit + weekly + 0.5 + + + + https://supabase.com/partners/experts/stytch + weekly + 0.5 + + + + https://supabase.com/partners/experts/supertokens + weekly + 0.5 + + + + https://supabase.com/partners/experts/teta + weekly + 0.5 + + + + https://supabase.com/partners/experts/tinloof + weekly + 0.5 + + + + https://supabase.com/partners/experts/trevor_io + weekly + 0.5 + + + + https://supabase.com/partners/experts/uncommonpurpose + weekly + 0.5 + + + + https://supabase.com/partners/experts/vercel + weekly + 0.5 + + + + https://supabase.com/partners/experts/voltapp + weekly + 0.5 + + + + https://supabase.com/partners/experts/voypost + weekly + 0.5 + + + + https://supabase.com/partners/experts/weweb + weekly + 0.5 + + + + https://supabase.com/partners/experts/yepcode + weekly + 0.5 + + + + https://supabase.com/partners/experts/zapp_run + weekly + 0.5 + + + + https://supabase.com/partners/experts/zuplo weekly 0.5