import { patSetupUrl, oauthConnectUrl, DEFAULT_INTEGRATION_NAME, DEFAULT_OAUTH_SCOPES, DEFAULT_PAT_SECRET, AIRTABLE_CALLBACK_URL, AIRTABLE_OAUTH_APP_URL, AIRTABLE_PAT_URL, AIRTABLE_REQUIRED_HOST, AIRTABLE_SCOPES, } from './setup.ts' import { listAirtableIntegrationNames, listUserSecretNames, pickAuthInput, requireAuthMode, resolveIntegrationName, resolveSecretName, type ResolvedAirtableAuth, } from './auth.ts' import type { AirtableAuthInput } from './types.ts' import { requireRecord } from './types.ts' export type AirtableAccountInfo = { integrationName: string secretName: string oauthConnected: boolean patSaved: boolean preferredAuth: ResolvedAirtableAuth['mode'] | null connectUrl: string patUrl: string scopes: typeof AIRTABLE_SCOPES defaultScopes: Array requiredHost: string callbackUrl: string oauthAppUrl: string patDashboardUrl: string } /** * Resolve which Airtable OAuth integration or PAT secret to use. * * - `integration` / `integrationName` wins when set (exact name, e.g. `airtable-work`) * - `account: 'work'` → `airtable-work` * - `account: 'default'` / `'airtable'` / omitted → `airtable` * - PAT secret defaults to `airtablePat`, or `airtablePat-` for * `airtable-` integrations * * @example * import listAirtableAccounts from 'kody:@kody/airtable/accounts' * const accounts = await listAirtableAccounts() */ export async function accounts( params: AirtableAuthInput = {}, ): Promise { const integrationName = resolveIntegrationName(params) const secretName = resolveSecretName(params) const [secrets, integrations] = await Promise.all([ listUserSecretNames(), listAirtableIntegrationNames(), ]) const oauthConnected = integrations.includes(integrationName) const patSaved = secrets.has(secretName) const forced = requireAuthMode(params.auth) let preferredAuth: AirtableAccountInfo['preferredAuth'] = null if (forced === 'oauth' && oauthConnected) preferredAuth = 'oauth' else if (forced === 'pat' && patSaved) preferredAuth = 'pat' else if (oauthConnected) preferredAuth = 'oauth' else if (patSaved) preferredAuth = 'pat' return { integrationName, secretName, oauthConnected, patSaved, preferredAuth, connectUrl: oauthConnectUrl(integrationName), patUrl: patSetupUrl(secretName), scopes: AIRTABLE_SCOPES, defaultScopes: [...DEFAULT_OAUTH_SCOPES], requiredHost: AIRTABLE_REQUIRED_HOST, callbackUrl: AIRTABLE_CALLBACK_URL, oauthAppUrl: AIRTABLE_OAUTH_APP_URL, patDashboardUrl: AIRTABLE_PAT_URL, } } export { DEFAULT_INTEGRATION_NAME, DEFAULT_PAT_SECRET } /** * Resolve which Airtable OAuth integration or PAT secret to use. * @example * import listAirtableAccounts from 'kody:@kody/airtable/accounts' * const info = await listAirtableAccounts({ account: 'work' }) */ export default async function accountsEntrypoint( params: AirtableAuthInput & Record = {}, ) { return accounts(pickAuthInput(requireRecord(params, 'accounts'))) }