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 }