Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/supabase

src/get-project.ts

58 lines · 1.9 KB · TypeScript
import { managementAuth } from './setup.ts'
import { asLive, managementRequest } from './client.ts'
import {
	isRecord,
	optionalString,
	requireString,
	type SupabaseAuthInput,
} from './types.ts'
import type { ProjectSummary } from './list-projects.ts'

/**
 * Get one Supabase project by ref.
 * @example
 * import getProject from 'kody:@kody/supabase/get-project'
 * const project = await getProject({ ref: 'abcdefghijklmnop' })
 */
export async function getProject(
	input: SupabaseAuthInput & { ref: string },
): Promise<ProjectSummary> {
	const ref = requireString(input.ref, 'ref')
	const live = asLive<{ data: unknown }>(
		await managementRequest({
			auth: managementAuth(input),
			method: 'GET',
			path: `/v1/projects/${encodeURIComponent(ref)}`,
		}),
	)
	if (!isRecord(live.data)) {
		throw new Error(`Project ${ref} response was not an object.`)
	}
	return {
		id: optionalString(live.data.id, 'id') ?? ref,
		ref: optionalString(live.data.ref, 'ref') ?? ref,
		name: optionalString(live.data.name, 'name') ?? ref,
		region: optionalString(live.data.region, 'region'),
		status: optionalString(live.data.status, 'status'),
		organizationId: optionalString(live.data.organization_id, 'organization_id'),
		organizationSlug: optionalString(live.data.organization_slug, 'organization_slug'),
		createdAt: optionalString(live.data.created_at, 'created_at'),
	}
}

/**
 * Get one Supabase project by ref.
 * @example
 * import getProject from 'kody:@kody/supabase/get-project'
 * const project = await getProject({ ref: 'abcdefghijklmnop' })
 */
export default async function getProjectEntrypoint(
	params: Partial<SupabaseAuthInput> & Record<string, unknown> = {},
) {
	return await getProject({
		account: optionalString(params.account, 'account'),
		secretName: optionalString(params.secretName, 'secretName'),
		patSecretName: optionalString(params.patSecretName, 'patSecretName'),
		ref: requireString(params.ref ?? params.projectRef, 'ref'),
	})
}