import { useParams } from 'common' import { Code, Github, Play, Server, Terminal } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { parseAsString, useQueryState } from 'nuqs' import { useMemo } from 'react' import { AiIconAnimation, Button, Card, CardContent, CardHeader, CardTitle, cn, Dialog, DialogContent, DialogDescription, DialogHeader, DialogSection, DialogTitle, DialogTrigger, Separator, } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' import { EDGE_FUNCTION_TEMPLATES } from './Functions.templates' import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { ScaffoldSectionTitle } from '@/components/layouts/Scaffold' import { DocsButton } from '@/components/ui/DocsButton' import { ResourceItem } from '@/components/ui/Resource/ResourceItem' import { ResourceList } from '@/components/ui/Resource/ResourceList' import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { DOCS_URL } from '@/lib/constants' import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export const FunctionsEmptyState = () => { const { ref } = useParams() const router = useRouter() const aiSnap = useAiAssistantStateSnapshot() const { openSidebar } = useSidebarManagerSnapshot() const { mutate: sendEvent } = useSendEventMutation() const { data: org } = useSelectedOrganizationQuery() const [, setCreateMethod] = useQueryState('create', parseAsString) const showStripeExample = useIsFeatureEnabled('edge_functions:show_stripe_example') const templates = useMemo(() => { if (showStripeExample) { return EDGE_FUNCTION_TEMPLATES } // Filter out Stripe template return EDGE_FUNCTION_TEMPLATES.filter((template) => template.value !== 'stripe-webhook') }, [showStripeExample]) return ( <> Deploy your first edge function {/* Editor Option */}

Via Editor

Create and edit functions directly in the browser. Download to local at any time.

{/* AI Assistant Option */}

AI Assistant

Let our AI assistant help you create functions. Perfect for kickstarting a function.

{/* CLI Option */}

Via CLI

Create and deploy functions using the Supabase CLI. Ideal for local development and version control.

Start with a template {templates.map((template) => ( } onClick={() => { sendEvent({ action: 'edge_function_template_clicked', properties: { templateName: template.name, origin: 'functions_page' }, groups: { project: ref ?? 'Unknown', organization: org?.slug ?? 'Unknown' }, }) }} >

{template.name}

{template.description}

))}
) } export const FunctionsInstructionsLocal = () => { const showStripeExample = useIsFeatureEnabled('edge_functions:show_stripe_example') const templates = useMemo(() => { if (showStripeExample) { return EDGE_FUNCTION_TEMPLATES } // Filter out Stripe template return EDGE_FUNCTION_TEMPLATES.filter((template) => template.value !== 'stripe-webhook') }, [showStripeExample]) return ( <>
Developing Edge Functions locally

Create an Edge Function

Create a new edge function called hello-world in your project via the Supabase CLI.

code]:m-0 2xl:min-h-28' )} value="supabase functions new hello-world" />

Run Edge Functions locally

You can run your Edge Function locally using supabase functions serve.

code]:m-0 2xl:min-h-28' )} value={` supabase start # start the supabase stack supabase functions serve # start the Functions watcher`.trim()} />

Invoke Edge Functions locally

While serving your local Edge Functions, you can invoke it using cURL or one of the client libraries.

code]:m-0 2xl:min-h-28' )} value={` curl --request POST 'http://localhost:54321/functions/v1/hello-world' \\ --header 'Authorization: Bearer SUPABASE_ANON_KEY' \\ --header 'Content-Type: application/json' \\ --data '{ "name":"Functions" }'`.trim()} />
Self-hosting Edge Functions

Self-hosting Edge Functions

Supabase Edge Runtime consists of a web server based on the Deno runtime, capable of running Javascript, Typescript, and WASM services. You may self-host edge functions on providers like Fly.io, Digital Ocean, or AWS.

Explore our templates {templates.map((template) => ( } >

{template.name}

{template.description}

{template.name} {template.description} code]:m-0 max-h-[420px]' )} value={template.content} />
))}
) } export const FunctionsSecretsEmptyStateLocal = () => { return ( <> Local development & CLI

Local secrets and environment variables can be loaded in either of the following two ways

  • Through an .env file placed at supabase/functions/.env, which is automatically loaded on supabase start
  • Through the --env-file option for supabase functions serve , for example: supabase functions serve --env-file ./path/to/.env-file
Self-Hosted Supabase

Change settings in .env file and docker-compose.yml at functions service

Secrets can also be loaded at runtime by injecting them into main/index.ts file

) }