Skip to content

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

Package listing

@kody/fly

src/app-machines.ts

43 lines · 1.5 KB · TypeScript
import { listApps } from './apps.ts'
import { listMachines } from './machines.ts'
import type { FlyAppMachinesInput } from './types.ts'

/**
 * List machines for one Fly app resolved by `appName` or `appId`.
 * @param params.appName - Fly app name when `appId` is omitted.
 * @returns Matched app metadata plus machine list for that app.
 * @example
 * import appMachines from 'kody:@kody/fly/app-machines'
 * const result = await appMachines({ appName: 'my-app' })
 * // => { app: { id, name }, count: 2, machines: [...] }
 */
export default async function appMachines(params: FlyAppMachinesInput = {}) {
	const appName = String(params.appName || params.app || '').trim()
	if (!appName && !params.appId) throw new Error('appName or appId is required.')

	let resolvedName = appName
	let app: any = null

	if (!resolvedName && params.appId) {
		const apps = await listApps(params)
		app = apps.apps.find((candidate: any) => candidate.id === params.appId)
		if (!app) throw new Error('Could not find Fly app id: ' + params.appId)
		resolvedName = app.name
	} else if (resolvedName) {
		try {
			const apps = await listApps(params)
			app = apps.apps.find(
				(candidate: any) => candidate.name === resolvedName || candidate.id === resolvedName,
			)
			if (app) resolvedName = app.name
		} catch {
			app = { id: params.appId || null, name: resolvedName }
		}
	}

	const machines = await listMachines({ ...params, appName: resolvedName, appId: undefined })
	return {
		app: app || { id: params.appId || null, name: resolvedName },
		...machines,
	}
}