Skip to content

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

Package listing

@kody/origin

src/settings.ts

74 lines · 2.3 KB · TypeScript
import {
	APP_ID_VALUE,
	INSTALLATION_ID_VALUE,
	migrateOriginIdsFromValues,
	readNamedSetting,
	resolveOriginAccount,
	writeNamedSetting,
} from './token.ts'
import { type OriginAccountInput, type OriginMutationInput } from './types.ts'

export { migrateOriginIdsFromValues }

export async function readOriginSettings(input: OriginAccountInput = {}) {
	const resolved = resolveOriginAccount(input)
	const [appId, installationId] = await Promise.all([
		readNamedSetting(resolved.appIdKey),
		readNamedSetting(resolved.installationIdKey),
	])
	return {
		account: resolved.account,
		secretName: resolved.secretName,
		appId: appId || null,
		installationId: installationId || null,
		appIdKey: resolved.appIdKey,
		installationIdKey: resolved.installationIdKey,
	}
}

/**
 * Read or update Origin App ids for one account namespace.
 *
 * Pass `appId` and/or `installationId` with `dryRun: true` to preview, or
 * `confirm: true` to persist them in this package's storage (no republish).
 */
export default async function originSettings(
	input: OriginAccountInput &
		OriginMutationInput & { appId?: string; installationId?: string } = {},
) {
	const resolved = resolveOriginAccount(input)
	const wouldUpdate: Array<string> = []
	if (typeof input.appId === 'string' && input.appId.trim()) {
		wouldUpdate.push('appId')
	}
	if (typeof input.installationId === 'string' && input.installationId.trim()) {
		wouldUpdate.push('installationId')
	}
	const settings = await readOriginSettings(input)
	if (wouldUpdate.length === 0) return settings
	if (input.dryRun === true) {
		return {
			dryRun: true,
			account: resolved.account,
			wouldUpdate,
			settings,
		}
	}
	if (input.confirm !== true) {
		throw new Error(
			`Saving Origin settings for account "${resolved.account}" requires dryRun: true or confirm: true.`,
		)
	}
	const updated: Array<string> = []
	if (typeof input.appId === 'string' && input.appId.trim()) {
		await writeNamedSetting(resolved.appIdKey, input.appId)
		updated.push('appId')
	}
	if (typeof input.installationId === 'string' && input.installationId.trim()) {
		await writeNamedSetting(resolved.installationIdKey, input.installationId)
		updated.push('installationId')
	}
	return { updated, settings: await readOriginSettings(input) }
}

export { APP_ID_VALUE, INSTALLATION_ID_VALUE }