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 { accent, dimmed, renderTable } from "../lib/io" import { clearSpinner, startSpinner } from "../lib/spinner" import { ORG_OPT, orgOptsSchema, output, PAGINATION_OPTS, paginationOptsSchema, pluralize, requireSession, sessionIntro, useOrganization, ORG_OPTION_DESCRIPTIONS, PAGINATION_OPTION_DESCRIPTIONS, } from "../utils" export const orgApiKeyListCommand = defineCommand({ name: "list", description: "List organization API keys", options: { ...globalOptions, ...ORG_OPT, ...PAGINATION_OPTS, }, optionDescriptions: { ...ORG_OPTION_DESCRIPTIONS, ...PAGINATION_OPTION_DESCRIPTIONS, }, schema: globalOptionsSchema.extend({ ...orgOptsSchema.shape, ...paginationOptsSchema.shape, }), run: listOrganizationApiKeys, }) /** * Lists the API keys owned by one organization. * * @param opts - Organization selector. */ export async function listOrganizationApiKeys( opts: z.infer & z.infer, ) { const session = await requireSession("list organization API keys") output.normal(() => sessionIntro(session)) const organization = await useOrganization(opts) startSpinner("Fetching API keys") const page = await apiClient.apiKey.list({ cursor: opts.cursor, limit: opts.limit, organizationId: organization.id, }) clearSpinner() output .normal(() => { const apiKeys = page.items if (apiKeys.length === 0) { log.warn(`No API keys for ${accent(organization.name)}.`) return } log.message( `${accent(String(apiKeys.length))} ${pluralize(apiKeys.length, "API key")}`, ) console.log( renderTable({ columns: [ { header: "API key", cell: (apiKey) => `${apiKey.name ?? "Unnamed"}\n${dimmed(apiKey.id)}`, }, { header: "Prefix", cell: (apiKey) => apiKey.start, }, { header: "Created", cell: (apiKey) => new Date(apiKey.createdAt).toLocaleDateString(), }, ], rows: apiKeys, }), ) if (page.pageInfo.nextCursor) { log.info(`More results: --cursor ${page.pageInfo.nextCursor}`) } }) .json(page) }