UNPKG

trigger.dev

Version:

A Command-Line Interface for Trigger.dev projects

67 lines 2.8 kB
import { intro, isCancel, outro, select, text } from "@clack/prompts"; import { z } from "zod"; import { CommonCommandOptions, commonOptions, handleTelemetry, OutroCommandError, wrapCommandAction, } from "../../cli/common.js"; import { printStandloneInitialBanner } from "../../utilities/initialBanner.js"; import { getPatApiClient } from "./common.js"; const ProjectsCreateCommandOptions = CommonCommandOptions.extend({ org: z.string().optional(), name: z.string().trim().min(1).max(255).optional(), }); export function configureProjectsCreateCommand(program) { return commonOptions(program .command("create") .description("Create a new Trigger.dev project") .option("-o, --org <org>", "The organization slug or ID to create the project in") .option("-n, --name <name>", "The name of the new project") .action(async (options) => { await handleTelemetry(async () => { await printStandloneInitialBanner(true, options.profile); await projectsCreateCommand(options); }); })); } async function projectsCreateCommand(options) { return await wrapCommandAction("projectsCreateCommand", ProjectsCreateCommandOptions, options, async (opts) => await createProject(opts)); } async function createProject(options) { intro("Creating a new project"); const apiClient = await getPatApiClient(options); const org = options.org ?? (await promptForOrg(apiClient)); const name = options.name ?? (await promptForName()); const response = await apiClient.createProject(org, { name }); if (!response.success) { throw new Error(`Failed to create project: ${response.error}`); } outro(`Created project ${response.data.name} (${response.data.externalRef})`); } async function promptForOrg(apiClient) { const orgs = await apiClient.getOrgs(); if (!orgs.success) { throw new Error(`Failed to list organizations: ${orgs.error}`); } if (orgs.data.length === 0) { throw new Error("You don't belong to any organizations yet. Create one in the dashboard first."); } if (orgs.data.length === 1) { return orgs.data[0].slug; } const selected = await select({ message: "Select an organization", options: orgs.data.map((org) => ({ value: org.slug, label: org.title })), }); if (isCancel(selected)) { throw new OutroCommandError(); } return selected; } async function promptForName() { const name = await text({ message: "What should the project be called?", validate: (value) => (value.trim().length === 0 ? "Please enter a name" : undefined), }); if (isCancel(name)) { throw new OutroCommandError(); } return name.trim(); } //# sourceMappingURL=create.js.map