Skip to content

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

Package listing

@kody/zendesk

src/config.ts

68 lines · 2.2 KB · TypeScript
import { packageStorage } from 'kody:runtime'
import type { ZendeskAuthInput, ZendeskStoredConfig } from './types.ts'
import { optionalString, requireRecord } from './types.ts'
import { missingSubdomainMessage, optionalSubdomain } from './setup.ts'

const CONFIG_KEY = 'config'

function asStoredConfig(value: unknown): ZendeskStoredConfig {
	if (!value || typeof value !== 'object' || Array.isArray(value)) return {}
	const record = value as Record<string, unknown>
	return {
		subdomain: optionalSubdomain(record.subdomain),
		email: optionalString(record.email, 'email'),
	}
}

export async function readStoredConfig(): Promise<ZendeskStoredConfig> {
	try {
		const stored = await packageStorage().get(CONFIG_KEY)
		return asStoredConfig(stored)
	} catch {
		return {}
	}
}

export async function writeStoredConfig(config: ZendeskStoredConfig): Promise<ZendeskStoredConfig> {
	const next: ZendeskStoredConfig = {
		subdomain: config.subdomain,
		email: config.email,
	}
	await packageStorage().set(CONFIG_KEY, next)
	return next
}

export async function resolveSubdomain(input: ZendeskAuthInput = {}): Promise<string> {
	const fromInput = optionalSubdomain(input.subdomain)
	if (fromInput) return fromInput
	const stored = await readStoredConfig()
	if (stored.subdomain) return stored.subdomain
	throw new Error(missingSubdomainMessage(input))
}

export async function resolveEmail(input: ZendeskAuthInput = {}): Promise<string | undefined> {
	const fromInput = optionalString(input.email, 'email')
	if (fromInput) return fromInput
	const stored = await readStoredConfig()
	return stored.email
}

export async function resolveRuntimeConfig(input: ZendeskAuthInput = {}): Promise<{
	subdomain: string
	email?: string
}> {
	const [subdomain, email] = await Promise.all([
		resolveSubdomain(input).catch(() => undefined),
		resolveEmail(input),
	])
	if (!subdomain) throw new Error(missingSubdomainMessage(input))
	return { subdomain, email }
}

export function parseStoredConfigInput(params: Record<string, unknown>): ZendeskStoredConfig {
	const input = requireRecord(params, 'configure')
	return {
		subdomain: optionalSubdomain(input.subdomain),
		email: optionalString(input.email, 'email'),
	}
}