import {
API_KEY_SETUP_URL,
DEFAULT_API_KEY_SECRET,
DEFAULT_INTEGRATION_NAME,
DEFAULT_OAUTH_SCOPES,
KIT_API_KEY_DASHBOARD_URL,
KIT_CALLBACK_URL,
KIT_OAUTH_APP_URL,
KIT_REQUIRED_HOSTS,
KIT_SCOPES,
OAUTH_CONNECT_URL,
apiKeySetupUrl,
oauthConnectUrl,
} from './setup.ts'
import {
listKitIntegrationNames,
listUserSecretNames,
parseAuthInput,
requireAuthMode,
type ResolvedKitAuth,
} from './auth.ts'
import { resolveIntegrationName, resolveSecretName } from './setup.ts'
import type { KitAuthInput } from './types.ts'
import { requireRecord } from './types.ts'
export type KitAccountResolution = {
integrationName: string
secretName: string
oauthConnected: boolean
apiKeySaved: boolean
preferredAuth: ResolvedKitAuth['mode'] | null
connectUrl: string
apiKeyUrl: string
scopes: typeof KIT_SCOPES
defaultScopes: Array<string>
requiredHosts: Array<string>
callbackUrl: string
oauthAppUrl: string
apiKeyDashboardUrl: string
}
/**
* Resolve which Kit OAuth integration or API key to use.
* @example
* import { accounts } from 'kody:@kody/kit/accounts'
* const info = await accounts({ account: 'work' })
*/
export async function accounts(params: KitAuthInput = {}): Promise<KitAccountResolution> {
const integrationName = resolveIntegrationName(params)
const secretName = resolveSecretName(params)
const [secrets, integrations] = await Promise.all([
listUserSecretNames(),
listKitIntegrationNames(),
])
const oauthConnected = integrations.includes(integrationName)
const apiKeySaved = secrets.has(secretName)
const forced = requireAuthMode(params.auth)
let preferredAuth: KitAccountResolution['preferredAuth'] = null
if (forced === 'oauth' && oauthConnected) preferredAuth = 'oauth'
else if (forced === 'apiKey' && apiKeySaved) preferredAuth = 'apiKey'
else if (apiKeySaved) preferredAuth = 'apiKey'
else if (oauthConnected) preferredAuth = 'oauth'
return {
integrationName,
secretName,
oauthConnected,
apiKeySaved,
preferredAuth,
connectUrl: oauthConnectUrl(integrationName),
apiKeyUrl: apiKeySetupUrl(secretName),
scopes: KIT_SCOPES,
defaultScopes: [...DEFAULT_OAUTH_SCOPES],
requiredHosts: [...KIT_REQUIRED_HOSTS],
callbackUrl: KIT_CALLBACK_URL,
oauthAppUrl: KIT_OAUTH_APP_URL,
apiKeyDashboardUrl: KIT_API_KEY_DASHBOARD_URL,
}
}
export { DEFAULT_INTEGRATION_NAME, DEFAULT_API_KEY_SECRET, OAUTH_CONNECT_URL, API_KEY_SETUP_URL }
/**
* Resolve which Kit OAuth integration or API key to use.
* @example
* import accounts from 'kody:@kody/kit/accounts'
* const info = await accounts()
*/
export default async function accountsEntrypoint(
params: KitAuthInput & Record<string, unknown> = {},
) {
return accounts(parseAuthInput(requireRecord(params, 'accounts')))
}