import { managementAuth } from './setup.ts' import { asLive, managementRequest } from './client.ts' import { clampInt, isRecord, optionalString, type SupabaseAuthInput, } from './types.ts' export type OrganizationSummary = { id: string name: string slug?: string } /** * List Supabase organizations visible to the saved personal access token. * @example * import listOrganizations from 'kody:@kody/supabase/list-organizations' * const { items } = await listOrganizations() */ export async function listOrganizations( input: SupabaseAuthInput & { limit?: number } = {}, ): Promise<{ items: Array; count: number }> { const live = asLive<{ data: unknown }>( await managementRequest({ auth: managementAuth(input), method: 'GET', path: '/v1/organizations', }), ) const rows = Array.isArray(live.data) ? live.data : [] const items = rows .map((row) => { if (!isRecord(row)) return null const id = optionalString(row.id, 'id') const name = optionalString(row.name, 'name') if (!id || !name) return null return { id, name, slug: optionalString(row.slug, 'slug'), } }) .filter((item): item is OrganizationSummary => item !== null) .slice(0, clampInt(input.limit, 1, 200, 50)) return { items, count: items.length } } /** * List Supabase organizations visible to the saved personal access token. * @example * import listOrganizations from 'kody:@kody/supabase/list-organizations' * const result = await listOrganizations() */ export default async function listOrganizationsEntrypoint( params: SupabaseAuthInput & Record = {}, ) { return await listOrganizations({ account: optionalString(params.account, 'account'), secretName: optionalString(params.secretName, 'secretName'), patSecretName: optionalString(params.patSecretName, 'patSecretName'), limit: typeof params.limit === 'number' ? params.limit : undefined, }) }