Skip to content

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

Package listing

@kody/airtable

src/list-tables.ts

49 lines · 1.6 KB · TypeScript
import { pickAuthInput } from './auth.ts'
import { airtableRequest } from './client.ts'
import { mapTable } from './models.ts'
import type { AirtableAuthInput, AirtableTableSummary } from './types.ts'
import { requireRecord, requireString } from './types.ts'

export type ListTablesInput = AirtableAuthInput & {
	/** Base id (`app…`). */
	baseId: string
}

export type ListTablesResult = {
	items: Array<AirtableTableSummary>
}

/**
 * List tables in an Airtable base (schema). Needs `schema.bases:read`.
 * @example
 * import listTables from 'kody:@kody/airtable/list-tables'
 * const { items } = await listTables({ baseId: 'appXXXXXXXXXXXXXX' })
 */
export async function listTables(input: ListTablesInput): Promise<ListTablesResult> {
	const baseId = requireString(input.baseId, 'baseId')
	const result = await airtableRequest<{ tables?: Array<unknown> }>({
		...input,
		operation: 'tables.read',
		path: `/meta/bases/${encodeURIComponent(baseId)}/tables`,
	})
	const body = result.data && typeof result.data === 'object' ? result.data : {}
	return {
		items: (Array.isArray(body.tables) ? body.tables : []).map(mapTable),
	}
}

/**
 * List tables in an Airtable base (schema).
 * @example
 * import listTables from 'kody:@kody/airtable/list-tables'
 * const result = await listTables({ baseId: 'appXXXXXXXXXXXXXX' })
 */
export default async function listTablesEntrypoint(
	params: Partial<ListTablesInput> & Record<string, unknown> = {},
) {
	const input = requireRecord(params, 'list-tables')
	return listTables({
		baseId: requireString(input.baseId, 'baseId'),
		...pickAuthInput(input),
	})
}