Skip to content

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

Package listing

@kody/supabase

src/list-buckets.ts

67 lines · 2.0 KB · TypeScript
import { projectAuth } from './setup.ts'
import { asLive, projectRequest } from './client.ts'
import { isRecord, optionalString, type SupabaseAuthInput } from './types.ts'

export type BucketSummary = {
	id: string
	name: string
	public?: boolean
	createdAt?: string
	updatedAt?: string
}

/**
 * List Storage buckets (service role).
 * @example
 * import listBuckets from 'kody:@kody/supabase/list-buckets'
 * const { items } = await listBuckets({ projectRef: 'abcdefghijklmnop' })
 */
export async function listBuckets(
	input: SupabaseAuthInput,
): Promise<{ items: Array<BucketSummary>; count: number }> {
	const live = asLive<{ data: unknown }>(
		await projectRequest({
			auth: projectAuth(input),
			method: 'GET',
			path: '/storage/v1/bucket',
		}),
	)
	const rows = Array.isArray(live.data) ? live.data : []
	const items = rows
		.map((row) => {
			if (!isRecord(row)) return null
			const id = optionalString(row.id, 'id') ?? optionalString(row.name, 'name')
			const name = optionalString(row.name, 'name') ?? id
			if (!id || !name) return null
			return {
				id,
				name,
				public: row.public === true,
				createdAt: optionalString(row.created_at, 'created_at'),
				updatedAt: optionalString(row.updated_at, 'updated_at'),
			}
		})
		.filter((item): item is BucketSummary => item !== null)
	return { items, count: items.length }
}

/**
 * List Storage buckets (service role).
 * @example
 * import listBuckets from 'kody:@kody/supabase/list-buckets'
 * const result = await listBuckets({ projectRef: 'abcdefghijklmnop' })
 */
export default async function listBucketsEntrypoint(
	params: Partial<SupabaseAuthInput> & Record<string, unknown> = {},
) {
	return await listBuckets({
		account: optionalString(params.account, 'account'),
		secretName: optionalString(params.secretName, 'secretName'),
		serviceRoleSecretName: optionalString(
			params.serviceRoleSecretName,
			'serviceRoleSecretName',
		),
		projectRef: optionalString(params.projectRef, 'projectRef'),
		projectUrl: optionalString(params.projectUrl, 'projectUrl'),
	})
}