Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <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).
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <name>] [--display-name <sender name>]
openmail inbox create [--mailbox-name <name>] [--display-name <sender name>] [--domain <domain>]
openmail inbox get --id inb_xxx
openmail inbox delete --id inb_xxx

Expand Down
51 changes: 51 additions & 0 deletions src/commands/__tests__/inbox.test.ts
Original file line number Diff line number Diff line change
@@ -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<typeof vi.fn>;
get: ReturnType<typeof vi.fn>;
delete: ReturnType<typeof vi.fn>;
};
}

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",
});
});
});
2 changes: 2 additions & 0 deletions src/commands/inbox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 } : {}),
});
}

Expand Down
2 changes: 2 additions & 0 deletions src/commands/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.",
});
Expand Down
10 changes: 7 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,9 +280,9 @@ function printHelp(topic?: string) {
"openmail init",
"",
"Usage:",
" init [--mailbox-name <name>] [--display-name <sender name>]",
" init [--mailbox-name <name>] [--display-name <sender name>] [--domain <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"),
Expand Down Expand Up @@ -344,11 +344,15 @@ function printHelp(topic?: string) {
"openmail inbox",
"",
"Subcommands:",
" create [--mailbox-name <name>] [--display-name <sender name>]",
" create [--mailbox-name <name>] [--display-name <sender name>] [--domain <domain>]",
" list [--limit <n>] [--offset <n>]",
" get --id <inbox_id>",
" delete --id <inbox_id>",
"",
"Notes:",
" --domain Create the inbox on a verified custom domain you own",
" (defaults to your account domain when omitted).",
"",
...globalFlags,
].join("\n"),
);
Expand Down
6 changes: 4 additions & 2 deletions src/lib/inbox-create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 } : {}),
};
}

Expand Down