import { patSetupUrl, oauthConnectUrl, DEFAULT_INTEGRATION_NAME, DEFAULT_OAUTH_SCOPES, DEFAULT_PAT_SECRET, ASANA_CALLBACK_URL, ASANA_OAUTH_APP_URL, ASANA_PAT_URL, ASANA_REQUIRED_HOST, ASANA_SCOPES, } from './setup.ts' import { listAsanaIntegrationNames, listUserSecretNames, requireAuthMode, resolveIntegrationName, resolveSecretName, type ResolvedAsanaAuth, } from './auth.ts' import type { AsanaAuthInput } from './types.ts' import { requireRecord } from './types.ts' export type AsanaAccountInfo = { integrationName: string secretName: string oauthConnected: boolean patSaved: boolean preferredAuth: ResolvedAsanaAuth['mode'] | null connectUrl: string patUrl: string scopes: typeof ASANA_SCOPES defaultScopes: Array requiredHost: string callbackUrl: string oauthAppUrl: string patDashboardUrl: string } /** * Resolve which Asana OAuth integration or PAT secret to use. * * - `integration` / `integrationName` wins when set (exact name, e.g. `asana-work`) * - `account: 'work'` → `asana-work` * - `account: 'default'` / `'asana'` / omitted → `asana` * - PAT secret defaults to `asanaPat`, or `asanaPat-` for * `asana-` integrations * * @example * import listAsanaAccounts from 'kody:@kody/asana/accounts' * const accounts = await listAsanaAccounts() */ export async function accounts( params: AsanaAuthInput = {}, ): Promise { const integrationName = resolveIntegrationName(params) const secretName = resolveSecretName(params) const [secrets, integrations] = await Promise.all([ listUserSecretNames(), listAsanaIntegrationNames(), ]) const oauthConnected = integrations.includes(integrationName) const patSaved = secrets.has(secretName) const forced = requireAuthMode(params.auth) let preferredAuth: AsanaAccountInfo['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: ASANA_SCOPES, defaultScopes: [...DEFAULT_OAUTH_SCOPES], requiredHost: ASANA_REQUIRED_HOST, callbackUrl: ASANA_CALLBACK_URL, oauthAppUrl: ASANA_OAUTH_APP_URL, patDashboardUrl: ASANA_PAT_URL, } } export { DEFAULT_INTEGRATION_NAME, DEFAULT_PAT_SECRET } /** * Resolve which Asana OAuth integration or PAT secret to use. * @example * import listAsanaAccounts from 'kody:@kody/asana/accounts' * const info = await listAsanaAccounts({ account: 'work' }) */ export default async function accountsEntrypoint( params: AsanaAuthInput & Record = {}, ) { return accounts(requireRecord(params, 'accounts') as AsanaAuthInput) }