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 { dimmed } from "../lib/io" import { renderOrganizationDetailBlock } from "../lib/organization-detail-block" import { clearSpinner, startSpinner } from "../lib/spinner" import { ORG_OPT, orgOptsSchema, output, sessionIntro, useOrganization, requireSession, ORG_OPTION_DESCRIPTIONS, } from "../utils" export const orgShowCommand = defineCommand({ name: "show", description: "Show organization details", options: { ...globalOptions, ...ORG_OPT, }, optionDescriptions: { ...ORG_OPTION_DESCRIPTIONS, }, schema: globalOptionsSchema.extend(orgOptsSchema.shape), run: showOrganization, }) /** * Displays details for a resolved organization. * * @param opts - Validated options selecting the organization. */ export async function showOrganization(opts: z.infer) { const session = await requireSession() output.normal(() => sessionIntro(session)) const { id: organizationId } = await useOrganization(opts) startSpinner("Fetching details") const org = await apiClient.org.get({ organizationId }) clearSpinner() output .normal(() => { const pendingInvites = org.invitations.filter( (i) => i.status === "pending", ) log.info(renderOrganizationDetailBlock(org)) log.message( [ `Members (${org.members.length}):`, ...org.members.map( (m) => ` ${m.email.startsWith("temp@") ? "Anonymous" : m.email}${m.userId === session.user.id ? dimmed` (you)` : ""} - ${dimmed(m.role)}`, ), ].join("\n"), ) if (pendingInvites.length > 0) { log.message( [ `Pending invitations (${pendingInvites.length}):`, ...pendingInvites.map((i) => ` ${i.email} - ${dimmed(i.role)}`), ].join("\n"), ) } log.message() }) .json(org) }