diff --git a/apps/studio/components/interfaces/Workers/WorkerDetail/WorkerOverviewTab.tsx b/apps/studio/components/interfaces/Workers/WorkerDetail/WorkerOverviewTab.tsx
index 39ee28eb509..035bf74a74c 100644
--- a/apps/studio/components/interfaces/Workers/WorkerDetail/WorkerOverviewTab.tsx
+++ b/apps/studio/components/interfaces/Workers/WorkerDetail/WorkerOverviewTab.tsx
@@ -18,7 +18,7 @@ import { LISTENING_PORT, WORKERS_REGION_LABEL } from '../Workers.constants'
import type { Worker } from '../Workers.types'
import { formatSize, getRuntimeMeta } from '../Workers.utils'
import { buildWorkerCliCommands } from '../workerSnippets'
-import { WorkerSnippetTabs } from '../WorkerSnippetTabs'
+import { WORKER_CALL_TABS, WorkerSnippetTabs } from '../WorkerSnippetTabs'
import { CLI_NAME } from '@/lib/constants/workers'
interface WorkerOverviewTabProps {
@@ -215,9 +215,7 @@ export const WorkerOverviewTab = ({ worker }: WorkerOverviewTabProps) => {
How to call
-
- Call the worker over its gateway URL. Pass your project API key as a bearer token.
-
+ Call the worker over its gateway URL.
@@ -229,7 +227,7 @@ export const WorkerOverviewTab = ({ worker }: WorkerOverviewTabProps) => {
access: worker.access,
instances: worker.declaredInstances,
}}
- tabs={['cli', 'js', 'python']}
+ tabs={WORKER_CALL_TABS}
/>
diff --git a/apps/studio/components/interfaces/Workers/WorkerSnippetTabs.tsx b/apps/studio/components/interfaces/Workers/WorkerSnippetTabs.tsx
index 08f181338de..d97a36255e4 100644
--- a/apps/studio/components/interfaces/Workers/WorkerSnippetTabs.tsx
+++ b/apps/studio/components/interfaces/Workers/WorkerSnippetTabs.tsx
@@ -7,12 +7,19 @@ import { buildWorkerSnippets, type WorkerSnippetInput } from './workerSnippets'
import CopyButton from '@/components/ui/CopyButton'
import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query'
-export type WorkerSnippetTab = 'ai' | 'config' | 'cli' | 'js' | 'python'
+export type WorkerSnippetTab = 'ai' | 'config' | 'cli' | 'curl' | 'js' | 'python'
+
+export const WORKER_CALL_TABS = [
+ 'curl',
+ 'js',
+ 'python',
+] as const satisfies readonly WorkerSnippetTab[]
const TAB_LABEL: Record = {
ai: 'AI Prompt',
config: 'config.toml',
cli: 'CLI',
+ curl: 'cURL',
js: 'JavaScript',
python: 'Python',
}
@@ -21,13 +28,14 @@ const TAB_ICON: Record = {
ai: Sparkles,
config: FileCode,
cli: Terminal,
+ curl: Terminal,
js: FileCode,
python: FileCode,
}
interface WorkerSnippetTabsProps {
input: Omit
- tabs?: [WorkerSnippetTab, ...WorkerSnippetTab[]]
+ tabs?: readonly [WorkerSnippetTab, ...WorkerSnippetTab[]]
className?: string
}
@@ -45,6 +53,7 @@ export const WorkerSnippetTabs = ({ input, tabs = ['cli'], className }: WorkerSn
ai: snippets.aiPrompt,
config: snippets.configToml,
cli: snippets.cli,
+ curl: snippets.curl,
js: snippets.javascript,
python: snippets.python,
}
diff --git a/apps/studio/components/interfaces/Workers/workerSnippets.test.ts b/apps/studio/components/interfaces/Workers/workerSnippets.test.ts
index 7070d5f014d..77f434a1437 100644
--- a/apps/studio/components/interfaces/Workers/workerSnippets.test.ts
+++ b/apps/studio/components/interfaces/Workers/workerSnippets.test.ts
@@ -11,16 +11,21 @@ const input = (overrides: Partial[0]> = {
describe('buildWorkerSnippets', () => {
it('points the invoke examples at the worker URL', () => {
- const { javascript, python } = buildWorkerSnippets(input({ name: 'embed' }))
+ const { curl, javascript, python } = buildWorkerSnippets(input({ name: 'embed' }))
const url = 'https://abcdefgh.supabase.co/workers/v1/embed'
+ expect(curl).toContain(`'${url}'`)
expect(javascript).toContain(`'${url}'`)
expect(python).toContain(`"${url}"`)
})
it('leaves a placeholder invoke URL until the project settings resolve', () => {
- const { javascript } = buildWorkerSnippets(input({ endpoint: undefined }))
- expect(javascript).toContain('[YOUR WORKER URL]')
+ const { curl } = buildWorkerSnippets(input({ endpoint: undefined }))
+ expect(curl).toContain('[YOUR WORKER URL]')
+ })
+
+ it('does not require authorization for the CLI invoke example', () => {
+ expect(buildWorkerSnippets(input()).curl).not.toContain('Authorization')
})
it('asks for the anon key to invoke a public worker and the service role key for a private one', () => {
diff --git a/apps/studio/components/interfaces/Workers/workerSnippets.ts b/apps/studio/components/interfaces/Workers/workerSnippets.ts
index de89c173050..7cc337d332c 100644
--- a/apps/studio/components/interfaces/Workers/workerSnippets.ts
+++ b/apps/studio/components/interfaces/Workers/workerSnippets.ts
@@ -17,6 +17,7 @@ export interface WorkerSnippets {
aiPrompt: string
configToml: string
cli: string
+ curl: string
javascript: string
python: string
}
@@ -46,6 +47,12 @@ export function buildWorkerSnippets(input: WorkerSnippetInput): WorkerSnippets {
...(input.access === 'private' ? [`# note: the CLI can only deploy public workers today`] : []),
].join('\n')
+ const curl = [
+ `curl --request POST '${url}' \\`,
+ ` --header 'Content-Type: application/json' \\`,
+ ` --data '{"name":"world"}'`,
+ ].join('\n')
+
const configBlock = [
`[${CLI_NAME}.${name}]`,
`runtime = "${runtime}"`,
@@ -102,7 +109,7 @@ export function buildWorkerSnippets(input: WorkerSnippetInput): WorkerSnippets {
`print(res.json())`,
].join('\n')
- return { aiPrompt, configToml, cli, javascript, python }
+ return { aiPrompt, configToml, cli, curl, javascript, python }
}
export interface WorkerCliCommand {