import { patSetupUrl, oauthConnectUrl, DEFAULT_INTEGRATION_NAME, DEFAULT_OAUTH_SCOPES, DEFAULT_PAT_SECRET, FIGMA_CALLBACK_URL, FIGMA_OAUTH_APP_URL, FIGMA_PAT_URL, FIGMA_REQUIRED_HOST, FIGMA_SCOPES, } from './setup.ts' import { listFigmaIntegrationNames, listUserSecretNames, requireAuthMode, resolveIntegrationName, resolveSecretName, type ResolvedFigmaAuth, } from './auth.ts' import type { FigmaAuthInput } from './types.ts' import { requireRecord } from './types.ts' export type FigmaAccountInfo = { integrationName: string secretName: string oauthConnected: boolean patSaved: boolean preferredAuth: ResolvedFigmaAuth['mode'] | null connectUrl: string patUrl: string scopes: typeof FIGMA_SCOPES defaultScopes: Array requiredHost: string callbackUrl: string oauthAppUrl: string patDashboardUrl: string } /** * Resolve which Figma OAuth integration or token secret to use. * * - `integration` / `integrationName` wins when set (exact name, e.g. `figma-work`) * - `account: 'work'` → `figma-work` * - `account: 'default'` / `'figma'` / omitted → `figma` * - Token secret defaults to `figmaPat`, or `figmaPat-` for * `figma-` integrations * * @example * import listFigmaAccounts from 'kody:@kody/figma/accounts' * const accounts = await listFigmaAccounts() */ export async function accounts( params: FigmaAuthInput = {}, ): Promise { const integrationName = resolveIntegrationName(params) const secretName = resolveSecretName(params) const [secrets, integrations] = await Promise.all([ listUserSecretNames(), listFigmaIntegrationNames(), ]) const oauthConnected = integrations.includes(integrationName) const patSaved = secrets.has(secretName) const forced = requireAuthMode(params.auth) let preferredAuth: FigmaAccountInfo['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: FIGMA_SCOPES, defaultScopes: [...DEFAULT_OAUTH_SCOPES], requiredHost: FIGMA_REQUIRED_HOST, callbackUrl: FIGMA_CALLBACK_URL, oauthAppUrl: FIGMA_OAUTH_APP_URL, patDashboardUrl: FIGMA_PAT_URL, } } export { DEFAULT_INTEGRATION_NAME, DEFAULT_PAT_SECRET } /** * Resolve which Figma OAuth integration or token secret to use. * @example * import listFigmaAccounts from 'kody:@kody/figma/accounts' * const info = await listFigmaAccounts({ account: 'work' }) */ export default async function accountsEntrypoint( params: FigmaAuthInput & Record = {}, ) { return accounts(requireRecord(params, 'accounts') as FigmaAuthInput) }