import { log } from "@clack/prompts" import { defineCommand } from "../lib/command" import { globalOptions, globalOptionsSchema } from "../lib/global-options" import { z } from "zod" import { apiClient } from "../lib/api-client" import { PAGINATION_OPTS, paginationOptsSchema, output, pluralize, sessionIntro, requireSession, PAGINATION_OPTION_DESCRIPTIONS, } from "../utils" import { accent } from "../lib/io" import { renderOrganizationDetailBlock } from "../lib/organization-detail-block" import { clearSpinner, startSpinner } from "../lib/spinner" export const orgListCommand = defineCommand({ name: "list", description: "List all organizations", options: { ...globalOptions, ...PAGINATION_OPTS, }, optionDescriptions: { ...PAGINATION_OPTION_DESCRIPTIONS, }, schema: globalOptionsSchema.extend(paginationOptsSchema.shape), run: listOrganizations, }) /** * Lists organizations for the current session, including the user's role. * * @param opts - Page size and optional continuation cursor. */ export async function listOrganizations( opts: z.infer, ) { const session = await requireSession() output.normal(() => sessionIntro(session)) startSpinner("Fetching organizations") const page = await apiClient.org.list(opts) clearSpinner() output .normal(() => { const organizations = page.items if (organizations.length === 0) { log.warn("You don't belong to any organizations.") return } log.message( `${accent(organizations.length)} ${pluralize(organizations.length, "organization")}`, ) for (const org of organizations) { log.info(renderOrganizationDetailBlock(org, { includeRole: true })) } if (page.pageInfo.nextCursor) { log.info(`More results: --cursor ${page.pageInfo.nextCursor}`) } log.message() }) .json(page) }