import { pickAuthInput } from './auth.ts'
import { airtableRequest } from './client.ts'
import { mapBase } from './models.ts'
import type { AirtableAuthInput, AirtableBaseSummary, AirtablePageInfo } from './types.ts'
import { compactRecord, optionalString, requireRecord } from './types.ts'
export type ListBasesInput = AirtableAuthInput & {
offset?: string
}
export type ListBasesResult = {
items: Array<AirtableBaseSummary>
pageInfo: AirtablePageInfo
}
/**
* List Airtable bases the token can access. Needs `schema.bases:read`.
* @example
* import listBases from 'kody:@kody/airtable/list-bases'
* const { items } = await listBases()
*/
export async function listBases(input: ListBasesInput = {}): Promise<ListBasesResult> {
const result = await airtableRequest<{ bases?: Array<unknown> }>({
...input,
operation: 'bases.read',
path: '/meta/bases',
query: compactRecord({
offset: optionalString(input.offset, 'offset'),
}),
})
const body = result.data && typeof result.data === 'object' ? result.data : {}
return {
items: (Array.isArray(body.bases) ? body.bases : []).map(mapBase),
pageInfo: result.pageInfo,
}
}
/**
* List Airtable bases the token can access.
* @example
* import listBases from 'kody:@kody/airtable/list-bases'
* const result = await listBases()
*/
export default async function listBasesEntrypoint(
params: ListBasesInput & Record<string, unknown> = {},
) {
const input = requireRecord(params, 'list-bases')
return listBases({
offset: optionalString(input.offset, 'offset'),
...pickAuthInput(input),
})
}