import { privateAppSetupUrl, oauthConnectUrl, DEFAULT_INTEGRATION_NAME, DEFAULT_OAUTH_SCOPES, DEFAULT_TOKEN_SECRET, HUBSPOT_CALLBACK_URL, HUBSPOT_OAUTH_APP_URL, HUBSPOT_PRIVATE_APP_URL, HUBSPOT_REQUIRED_HOSTS, HUBSPOT_SCOPES, } from './setup.ts' import { listHubSpotIntegrationNames, listUserSecretNames, requireAuthMode, resolveIntegrationName, resolveSecretName, type ResolvedHubSpotAuth, } from './auth.ts' import type { HubSpotAuthInput } from './types.ts' import { requireRecord } from './types.ts' export type HubSpotAccountResolution = { integrationName: string secretName: string oauthConnected: boolean privateAppSaved: boolean preferredAuth: ResolvedHubSpotAuth['mode'] | null connectUrl: string privateAppUrl: string scopes: typeof HUBSPOT_SCOPES defaultScopes: Array requiredHosts: Array callbackUrl: string oauthAppUrl: string privateAppDashboardUrl: string } /** * Resolve which HubSpot OAuth integration or private-app token to use. * * - `integration` / `integrationName` wins when set (exact name, e.g. `hubspot-work`) * - `account: 'work'` → `hubspot-work` * - `account: 'default'` / `'hubspot'` / omitted → `hubspot` * - Private-app secret defaults to `hubspotPrivateAppToken`, or * `hubspotPrivateAppToken-` for `hubspot-` integrations * * @example * import listHubSpotAccounts from 'kody:@kody/hubspot/accounts' * const accounts = await listHubSpotAccounts() */ export async function accounts( params: HubSpotAuthInput = {}, ): Promise { const integrationName = resolveIntegrationName(params) const secretName = resolveSecretName(params) const [secrets, integrations] = await Promise.all([ listUserSecretNames(), listHubSpotIntegrationNames(), ]) const oauthConnected = integrations.includes(integrationName) const privateAppSaved = secrets.has(secretName) const forced = requireAuthMode(params.auth) let preferredAuth: HubSpotAccountResolution['preferredAuth'] = null if (forced === 'oauth' && oauthConnected) preferredAuth = 'oauth' else if (forced === 'privateApp' && privateAppSaved) preferredAuth = 'privateApp' else if (oauthConnected) preferredAuth = 'oauth' else if (privateAppSaved) preferredAuth = 'privateApp' return { integrationName, secretName, oauthConnected, privateAppSaved, preferredAuth, connectUrl: oauthConnectUrl(integrationName), privateAppUrl: privateAppSetupUrl(secretName), scopes: HUBSPOT_SCOPES, defaultScopes: [...DEFAULT_OAUTH_SCOPES], requiredHosts: [...HUBSPOT_REQUIRED_HOSTS], callbackUrl: HUBSPOT_CALLBACK_URL, oauthAppUrl: HUBSPOT_OAUTH_APP_URL, privateAppDashboardUrl: HUBSPOT_PRIVATE_APP_URL, } } export { DEFAULT_INTEGRATION_NAME, DEFAULT_TOKEN_SECRET } /** * Resolve which HubSpot OAuth integration or private-app token to use. * @example * import listHubSpotAccounts from 'kody:@kody/hubspot/accounts' * const info = await listHubSpotAccounts({ account: 'work' }) */ export default async function accountsEntrypoint( params: HubSpotAuthInput & Record = {}, ) { return accounts(requireRecord(params, 'accounts') as HubSpotAuthInput) }