Skip to content

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

Package listing

@kody/planetscale

src/accounts.ts

55 lines · 1.6 KB · TypeScript
import {
	apiTokenSetupUrl,
	DEFAULT_API_TOKEN_SECRET,
	DEFAULT_WEBHOOK_SECRET,
	PLANETSCALE_API_HOST,
	PLANETSCALE_TOKEN_DOCS,
	webhookSecretSetupUrl,
} from './setup.ts'
import { listUserSecretNames, resolveSecretName } from './auth.ts'
import type { PlanetscaleAuthInput } from './types.ts'
import { requireRecord } from './types.ts'

export type PlanetscaleAccountInfo = {
	secretName: string
	apiTokenSaved: boolean
	webhookSecretSaved: boolean
	setupUrl: string
	webhookSecretUrl: string
	requiredHost: string
	tokenDocs: string
}

/**
 * Resolve which PlanetScale service-token secret to use.
 * @example
 * import accounts from 'kody:@kody/planetscale/accounts'
 * const info = await accounts()
 */
export async function accounts(params: PlanetscaleAuthInput = {}): Promise<PlanetscaleAccountInfo> {
	const secretName = resolveSecretName(params)
	const secrets = await listUserSecretNames()
	return {
		secretName,
		apiTokenSaved: secrets.has(secretName),
		webhookSecretSaved: secrets.has(DEFAULT_WEBHOOK_SECRET),
		setupUrl: apiTokenSetupUrl(secretName),
		webhookSecretUrl: webhookSecretSetupUrl(),
		requiredHost: PLANETSCALE_API_HOST,
		tokenDocs: PLANETSCALE_TOKEN_DOCS,
	}
}

export { DEFAULT_API_TOKEN_SECRET }

/**
 * Resolve which PlanetScale service-token secret to use.
 * @example
 * import accounts from 'kody:@kody/planetscale/accounts'
 * const info = await accounts({ account: 'work' })
 */
export default async function accountsEntrypoint(
	params: PlanetscaleAuthInput & Record<string, unknown> = {},
) {
	return accounts(requireRecord(params, 'accounts') as PlanetscaleAuthInput)
}