diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..24480c3 Binary files /dev/null and b/.DS_Store differ diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d412a8..8ef223d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Thi --- +## [Unreleased] + +### Added + +- `openmail inbox create` and `openmail init` accept `--domain ` to create an inbox on a verified custom domain you own. When omitted, the inbox uses your account default domain. + +--- + ## [0.1.6] — current Initial public release on [openmailsh/cli](https://github.com/openmailsh/cli). diff --git a/README.md b/README.md index 1a75eef..f91ede9 100644 --- a/README.md +++ b/README.md @@ -36,11 +36,11 @@ openmail setup [--mode websocket|webhook] ```bash # Create a new inbox (interactive prompts, or pass flags) -openmail init [--mailbox-name john] [--display-name "John Smith"] +openmail init [--mailbox-name john] [--display-name "John Smith"] [--domain agent-mail.example.com] # Manage inboxes openmail inbox list --limit 10 -openmail inbox create [--mailbox-name ] [--display-name ] +openmail inbox create [--mailbox-name ] [--display-name ] [--domain ] openmail inbox get --id inb_xxx openmail inbox delete --id inb_xxx diff --git a/src/commands/__tests__/inbox.test.ts b/src/commands/__tests__/inbox.test.ts new file mode 100644 index 0000000..ab52cfc --- /dev/null +++ b/src/commands/__tests__/inbox.test.ts @@ -0,0 +1,51 @@ +import { describe, expect, it, vi } from "vitest"; +import { parseArgs } from "../../lib/args"; +import { runInboxCommand } from "../inbox"; +import type { OpenMailHttpClient } from "../../lib/http"; + +function makeClient() { + return { + post: vi.fn().mockResolvedValue({ id: "inb_1", address: "support@yourco.com" }), + get: vi.fn().mockResolvedValue({ data: [], total: 0 }), + delete: vi.fn().mockResolvedValue({ ok: true }), + } as unknown as OpenMailHttpClient & { + post: ReturnType; + get: ReturnType; + delete: ReturnType; + }; +} + +describe("runInboxCommand create", () => { + it("forwards --domain to POST /v1/inboxes", async () => { + const client = makeClient(); + const parsed = parseArgs([ + "inbox", + "create", + "--mailbox-name", + "support", + "--display-name", + "Support", + "--domain", + "agent-mail.example.com", + ]); + + await runInboxCommand(client, parsed); + + expect(client.post).toHaveBeenCalledWith("/v1/inboxes", { + mailboxName: "support", + displayName: "Support", + domain: "agent-mail.example.com", + }); + }); + + it("omits domain when the flag is not provided", async () => { + const client = makeClient(); + const parsed = parseArgs(["inbox", "create", "--mailbox-name", "support"]); + + await runInboxCommand(client, parsed); + + expect(client.post).toHaveBeenCalledWith("/v1/inboxes", { + mailboxName: "support", + }); + }); +}); diff --git a/src/commands/inbox.ts b/src/commands/inbox.ts index 3906e9d..aeeef70 100644 --- a/src/commands/inbox.ts +++ b/src/commands/inbox.ts @@ -11,9 +11,11 @@ export async function runInboxCommand(client: OpenMailHttpClient, parsed: Parsed if (action === "create") { const mailboxName = getStringFlag(parsed.flags, "mailbox-name"); const displayName = getStringFlag(parsed.flags, "display-name"); + const domain = getStringFlag(parsed.flags, "domain"); return client.post("/v1/inboxes", { ...(mailboxName ? { mailboxName } : {}), ...(displayName ? { displayName } : {}), + ...(domain ? { domain } : {}), }); } diff --git a/src/commands/init.ts b/src/commands/init.ts index dc7f35b..ea55383 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -20,10 +20,12 @@ export async function runInitCommand(params: { }) { const mailboxName = getStringFlag(params.parsed.flags, "mailbox-name"); const displayName = getStringFlag(params.parsed.flags, "display-name"); + const domain = getStringFlag(params.parsed.flags, "domain"); const createParams = await resolveInboxCreateParams({ mailboxName, displayName, + domain, ctx: params.ctx, cancelMessage: "Init cancelled.", }); diff --git a/src/index.ts b/src/index.ts index bffc380..68f379d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -280,9 +280,9 @@ function printHelp(topic?: string) { "openmail init", "", "Usage:", - " init [--mailbox-name ] [--display-name ]", + " init [--mailbox-name ] [--display-name ] [--domain ]", "", - "Creates a new inbox and sets it as the default. Prompts interactively for mailbox name and display name when run without flags.", + "Creates a new inbox and sets it as the default. Prompts interactively for mailbox name and display name when run without flags. Pass --domain to create the inbox on a verified custom domain.", "", ...globalFlags, ].join("\n"), @@ -344,11 +344,15 @@ function printHelp(topic?: string) { "openmail inbox", "", "Subcommands:", - " create [--mailbox-name ] [--display-name ]", + " create [--mailbox-name ] [--display-name ] [--domain ]", " list [--limit ] [--offset ]", " get --id ", " delete --id ", "", + "Notes:", + " --domain Create the inbox on a verified custom domain you own", + " (defaults to your account domain when omitted).", + "", ...globalFlags, ].join("\n"), ); diff --git a/src/lib/inbox-create.ts b/src/lib/inbox-create.ts index 4ec65eb..dda66d9 100644 --- a/src/lib/inbox-create.ts +++ b/src/lib/inbox-create.ts @@ -6,13 +6,15 @@ export const MAILBOX_NAME_REGEX = /^[a-z0-9][a-z0-9.\-]{1,28}[a-z0-9]$/; export async function resolveInboxCreateParams(params: { mailboxName?: string; displayName?: string; + domain?: string; ctx: CliContext; cancelMessage?: string; -}): Promise<{ mailboxName?: string; displayName?: string }> { - if (params.mailboxName || params.displayName) { +}): Promise<{ mailboxName?: string; displayName?: string; domain?: string }> { + if (params.mailboxName || params.displayName || params.domain) { return { ...(params.mailboxName ? { mailboxName: params.mailboxName } : {}), ...(params.displayName ? { displayName: params.displayName } : {}), + ...(params.domain ? { domain: params.domain } : {}), }; }