Skip to content

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

Package listing

@kody/zendesk

src/configure.ts

58 lines · 2.1 KB · TypeScript
import { parseAuth } from './auth.ts'
import { accounts } from './accounts.ts'
import { readStoredConfig, writeStoredConfig } from './config.ts'
import type { ZendeskAuthInput } from './types.ts'
import { optionalString, requireRecord, requireString } from './types.ts'
import { normalizeSubdomain } from './setup.ts'

export type ConfigureInput = ZendeskAuthInput & {
	/** Zendesk Support subdomain (`acme` or `acme.zendesk.com`). */
	subdomain: string
	/** Agent email used to build the API-token username `{email}/token`. */
	email?: string
}

/**
 * Store this account's Zendesk subdomain (and optional agent email) in
 * packageStorage. Does not contact Zendesk. Fork this package before saving
 * your own subdomain — do not write into the live `@kody/zendesk` listing.
 * @example
 * import configure from 'kody:@kody/zendesk/configure'
 * const setup = await configure({ subdomain: 'acme', email: 'agent@example.com' })
 */
export async function configure(input: ConfigureInput) {
	const subdomain = normalizeSubdomain(requireString(input.subdomain, 'subdomain'))
	const email = optionalString(input.email, 'email')
	const existing = await readStoredConfig()
	const stored = await writeStoredConfig({
		subdomain,
		email: email ?? existing.email,
	})
	const info = await accounts({ ...input, subdomain: stored.subdomain, email: stored.email })
	return {
		stored: true,
		subdomain: stored.subdomain,
		hasEmail: Boolean(stored.email),
		connectUrl: info.connectUrl,
		apiTokenUrl: info.apiTokenUrl,
		apiUsernameUrl: info.apiUsernameUrl,
		requiredHosts: info.requiredHosts,
	}
}

/**
 * Store this account's Zendesk subdomain in packageStorage.
 * @example
 * import configure from 'kody:@kody/zendesk/configure'
 * const setup = await configure({ subdomain: 'acme' })
 */
export default async function configureEntrypoint(
	params: Partial<ConfigureInput> & Record<string, unknown> = {},
) {
	const input = requireRecord(params, 'configure')
	return configure({
		...parseAuth(input),
		subdomain: requireString(input.subdomain, 'subdomain'),
		email: optionalString(input.email, 'email'),
	})
}