Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/kit

src/accounts.ts

93 lines · 2.7 KB · TypeScript
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')))
}