Skip to content
← Public packages

@kentcdodds/fly

Manage Fly.io apps, Machines, logs, and metrics.

src/apps.ts

45 lines · 1.5 KB · TypeScript
import { machinesAppShow, machinesAppsList, resolveOrgSlug, summarizeApp } from './core.ts'
import type { FlyAppsInput } from './types.ts'

/**
 * List Fly apps for an organization via the Machines REST API (`org_slug`, default `personal`).
 * Pass `appName` to fetch a single app instead.
 *
 * @param params.organizationSlug - Fly org slug (default `personal`).
 * @param params.appName - Optional app name to fetch one app.
 * @returns Organization metadata plus summarized app list and count, or `{ app, raw }` for one app.
 *
 * @example
 * import apps from 'kody:@kentcdodds/fly/apps'
 * const result = await apps({ organizationSlug: 'personal' })
 * // => { organization: {...}, count: 3, apps: [...] }
 */
export default async function apps(params: FlyAppsInput = {}) {
	const appName = String(params.appName || params.app || params.name || '').trim()
	if (appName) {
		return await getApp(params)
	}
	return await listApps(params)
}

export async function listApps(params = {}) {
	const organizationSlug = resolveOrgSlug(params)
	const result = await machinesAppsList(params)
	const apps = result.apps.map(summarizeApp)
	return {
		organization: {
			slug: organizationSlug,
			...(result.organization || {}),
		},
		count: apps.length,
		totalApps: result.totalApps,
		apps,
	}
}

export async function getApp(params = {}) {
	const appName = String(params.appName || params.app || params.name || '').trim()
	if (!appName) throw new Error('appName is required.')
	const app = await machinesAppShow(appName)
	return { app: summarizeApp(app), raw: app }
}