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'),
})
}