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<string>
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-<purpose>` for
* `airtable-<purpose>` integrations
*
* @example
* import listAirtableAccounts from 'kody:@kody/airtable/accounts'
* const accounts = await listAirtableAccounts()
*/
export async function accounts(
params: AirtableAuthInput = {},
): Promise<AirtableAccountInfo> {
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<string, unknown> = {},
) {
return accounts(pickAuthInput(requireRecord(params, 'accounts')))
}