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; 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 & Record = {}, ) { 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'), }) }