Skip to content

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

Package listing

@kody/airtable

src/list-bases.ts

52 lines · 1.5 KB · TypeScript
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),
	})
}