@sendly/cli 3.12.3 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/commands/campaigns/cancel.d.ts +13 -0
  2. package/dist/commands/campaigns/cancel.js +34 -0
  3. package/dist/commands/campaigns/create.d.ts +14 -0
  4. package/dist/commands/campaigns/create.js +63 -0
  5. package/dist/commands/campaigns/delete.d.ts +14 -0
  6. package/dist/commands/campaigns/delete.js +63 -0
  7. package/dist/commands/campaigns/get.d.ts +13 -0
  8. package/dist/commands/campaigns/get.js +91 -0
  9. package/dist/commands/campaigns/list.d.ts +13 -0
  10. package/dist/commands/campaigns/list.js +116 -0
  11. package/dist/commands/campaigns/preview.d.ts +13 -0
  12. package/dist/commands/campaigns/preview.js +60 -0
  13. package/dist/commands/campaigns/schedule.d.ts +15 -0
  14. package/dist/commands/campaigns/schedule.js +59 -0
  15. package/dist/commands/campaigns/send.d.ts +14 -0
  16. package/dist/commands/campaigns/send.js +78 -0
  17. package/dist/commands/contacts/create.d.ts +13 -0
  18. package/dist/commands/contacts/create.js +48 -0
  19. package/dist/commands/contacts/delete.d.ts +14 -0
  20. package/dist/commands/contacts/delete.js +52 -0
  21. package/dist/commands/contacts/get.d.ts +13 -0
  22. package/dist/commands/contacts/get.js +51 -0
  23. package/dist/commands/contacts/list.d.ts +14 -0
  24. package/dist/commands/contacts/list.js +101 -0
  25. package/dist/commands/contacts/lists/add.d.ts +14 -0
  26. package/dist/commands/contacts/lists/add.js +40 -0
  27. package/dist/commands/contacts/lists/create.d.ts +12 -0
  28. package/dist/commands/contacts/lists/create.js +40 -0
  29. package/dist/commands/contacts/lists/delete.d.ts +14 -0
  30. package/dist/commands/contacts/lists/delete.js +52 -0
  31. package/dist/commands/contacts/lists/index.d.ts +10 -0
  32. package/dist/commands/contacts/lists/index.js +68 -0
  33. package/dist/commands/contacts/lists/remove.d.ts +14 -0
  34. package/dist/commands/contacts/lists/remove.js +36 -0
  35. package/dist/commands/keys/get.d.ts +13 -0
  36. package/dist/commands/keys/get.js +53 -0
  37. package/dist/commands/keys/rename.d.ts +14 -0
  38. package/dist/commands/keys/rename.js +53 -0
  39. package/dist/commands/keys/rotate.d.ts +15 -0
  40. package/dist/commands/keys/rotate.js +82 -0
  41. package/dist/commands/keys/usage.d.ts +13 -0
  42. package/dist/commands/keys/usage.js +102 -0
  43. package/dist/commands/templates/clone.d.ts +14 -0
  44. package/dist/commands/templates/clone.js +45 -0
  45. package/dist/commands/verify/list.d.ts +3 -0
  46. package/dist/commands/verify/list.js +31 -5
  47. package/dist/lib/api-client.d.ts +9 -2
  48. package/dist/lib/api-client.js +31 -7
  49. package/dist/lib/base-command.js +31 -4
  50. package/dist/lib/output.d.ts +4 -2
  51. package/dist/lib/output.js +19 -6
  52. package/package.json +1 -1
@@ -0,0 +1,59 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { json, success, colors, isJsonMode, keyValue } from "../../lib/output.js";
5
+ export default class CampaignsSchedule extends AuthenticatedCommand {
6
+ static description = "Schedule a campaign for later";
7
+ static examples = [
8
+ '<%= config.bin %> campaigns schedule cmp_xxx --at "2024-01-15T10:00:00Z"',
9
+ '<%= config.bin %> campaigns schedule cmp_xxx --at "2024-01-15T10:00:00" --timezone "America/New_York"',
10
+ ];
11
+ static args = {
12
+ id: Args.string({
13
+ description: "Campaign ID",
14
+ required: true,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...AuthenticatedCommand.baseFlags,
19
+ at: Flags.string({
20
+ description: "When to send (ISO 8601 datetime)",
21
+ required: true,
22
+ }),
23
+ timezone: Flags.string({
24
+ char: "z",
25
+ description: 'Timezone (e.g., "America/New_York")',
26
+ }),
27
+ };
28
+ async run() {
29
+ const { args, flags } = await this.parse(CampaignsSchedule);
30
+ const scheduledAt = new Date(flags.at);
31
+ if (isNaN(scheduledAt.getTime())) {
32
+ this.error("Invalid date format. Use ISO 8601 format (e.g., 2024-01-15T10:00:00Z)");
33
+ }
34
+ if (scheduledAt <= new Date()) {
35
+ this.error("Scheduled time must be in the future");
36
+ }
37
+ const campaign = await apiClient.post(`/api/v1/campaigns/${args.id}/schedule`, {
38
+ scheduledAt: flags.at,
39
+ timezone: flags.timezone,
40
+ });
41
+ if (isJsonMode()) {
42
+ json(campaign);
43
+ return;
44
+ }
45
+ success(`Campaign scheduled!`);
46
+ console.log();
47
+ keyValue([
48
+ ["Campaign", campaign.name],
49
+ ["Status", colors.warning("scheduled")],
50
+ ["Recipients", String(campaign.recipientCount)],
51
+ ["Scheduled For", new Date(campaign.scheduledAt).toLocaleString()],
52
+ ...(campaign.timezone ? [["Timezone", campaign.timezone]] : []),
53
+ ]);
54
+ console.log();
55
+ console.log(colors.dim("To cancel:"));
56
+ console.log(` ${colors.code(`sendly campaigns cancel ${campaign.id}`)}`);
57
+ }
58
+ }
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvY2FtcGFpZ25zL3NjaGVkdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBWWxGLE1BQU0sQ0FBQyxPQUFPLE9BQU8saUJBQWtCLFNBQVEsb0JBQW9CO0lBQ2pFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsK0JBQStCLENBQUM7SUFFckQsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQiwwRUFBMEU7UUFDMUUsdUdBQXVHO0tBQ3hHLENBQUM7SUFFRixNQUFNLENBQUMsSUFBSSxHQUFHO1FBQ1osRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDZCxXQUFXLEVBQUUsYUFBYTtZQUMxQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxFQUFFLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNmLFdBQVcsRUFBRSxrQ0FBa0M7WUFDL0MsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FBQ0YsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDckIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUscUNBQXFDO1NBQ25ELENBQUM7S0FDSCxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTVELE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRUQsSUFBSSxXQUFXLElBQUksSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUNuQyxxQkFBcUIsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUN2QztZQUNFLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNyQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7U0FDekIsQ0FDRixDQUFDO1FBRUYsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWQsUUFBUSxDQUFDO1lBQ1AsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQztZQUMzQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xFLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3BGLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7IGpzb24sIHN1Y2Nlc3MsIGNvbG9ycywgaXNKc29uTW9kZSwga2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgQ2FtcGFpZ24ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICByZWNpcGllbnRDb3VudDogbnVtYmVyO1xuICBlc3RpbWF0ZWRDcmVkaXRzOiBudW1iZXI7XG4gIHNjaGVkdWxlZEF0OiBzdHJpbmc7XG4gIHRpbWV6b25lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYW1wYWlnbnNTY2hlZHVsZSBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJTY2hlZHVsZSBhIGNhbXBhaWduIGZvciBsYXRlclwiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gY2FtcGFpZ25zIHNjaGVkdWxlIGNtcF94eHggLS1hdCBcIjIwMjQtMDEtMTVUMTA6MDA6MDBaXCInLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBjYW1wYWlnbnMgc2NoZWR1bGUgY21wX3h4eCAtLWF0IFwiMjAyNC0wMS0xNVQxMDowMDowMFwiIC0tdGltZXpvbmUgXCJBbWVyaWNhL05ld19Zb3JrXCInLFxuICBdO1xuXG4gIHN0YXRpYyBhcmdzID0ge1xuICAgIGlkOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJDYW1wYWlnbiBJRFwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBhdDogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldoZW4gdG8gc2VuZCAoSVNPIDg2MDEgZGF0ZXRpbWUpXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgICB0aW1lem9uZTogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwielwiLFxuICAgICAgZGVzY3JpcHRpb246ICdUaW1lem9uZSAoZS5nLiwgXCJBbWVyaWNhL05ld19Zb3JrXCIpJyxcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShDYW1wYWlnbnNTY2hlZHVsZSk7XG5cbiAgICBjb25zdCBzY2hlZHVsZWRBdCA9IG5ldyBEYXRlKGZsYWdzLmF0KTtcbiAgICBpZiAoaXNOYU4oc2NoZWR1bGVkQXQuZ2V0VGltZSgpKSkge1xuICAgICAgdGhpcy5lcnJvcihcIkludmFsaWQgZGF0ZSBmb3JtYXQuIFVzZSBJU08gODYwMSBmb3JtYXQgKGUuZy4sIDIwMjQtMDEtMTVUMTA6MDA6MDBaKVwiKTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZWR1bGVkQXQgPD0gbmV3IERhdGUoKSkge1xuICAgICAgdGhpcy5lcnJvcihcIlNjaGVkdWxlZCB0aW1lIG11c3QgYmUgaW4gdGhlIGZ1dHVyZVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBjYW1wYWlnbiA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PENhbXBhaWduPihcbiAgICAgIGAvYXBpL3YxL2NhbXBhaWducy8ke2FyZ3MuaWR9L3NjaGVkdWxlYCxcbiAgICAgIHtcbiAgICAgICAgc2NoZWR1bGVkQXQ6IGZsYWdzLmF0LFxuICAgICAgICB0aW1lem9uZTogZmxhZ3MudGltZXpvbmUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKGNhbXBhaWduKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWNjZXNzKGBDYW1wYWlnbiBzY2hlZHVsZWQhYCk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGtleVZhbHVlKFtcbiAgICAgIFtcIkNhbXBhaWduXCIsIGNhbXBhaWduLm5hbWVdLFxuICAgICAgW1wiU3RhdHVzXCIsIGNvbG9ycy53YXJuaW5nKFwic2NoZWR1bGVkXCIpXSxcbiAgICAgIFtcIlJlY2lwaWVudHNcIiwgU3RyaW5nKGNhbXBhaWduLnJlY2lwaWVudENvdW50KV0sXG4gICAgICBbXCJTY2hlZHVsZWQgRm9yXCIsIG5ldyBEYXRlKGNhbXBhaWduLnNjaGVkdWxlZEF0KS50b0xvY2FsZVN0cmluZygpXSxcbiAgICAgIC4uLihjYW1wYWlnbi50aW1lem9uZSA/IFtbXCJUaW1lem9uZVwiLCBjYW1wYWlnbi50aW1lem9uZV0gYXMgW3N0cmluZywgc3RyaW5nXV0gOiBbXSksXG4gICAgXSk7XG5cbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJUbyBjYW5jZWw6XCIpKTtcbiAgICBjb25zb2xlLmxvZyhgICAke2NvbG9ycy5jb2RlKGBzZW5kbHkgY2FtcGFpZ25zIGNhbmNlbCAke2NhbXBhaWduLmlkfWApfWApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class CampaignsSend extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ yes: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
@@ -0,0 +1,78 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { json, success, colors, isJsonMode, keyValue, warn } from "../../lib/output.js";
5
+ import * as readline from "readline";
6
+ async function confirm(message) {
7
+ const rl = readline.createInterface({
8
+ input: process.stdin,
9
+ output: process.stdout,
10
+ });
11
+ return new Promise((resolve) => {
12
+ rl.question(`${message} (y/N) `, (answer) => {
13
+ rl.close();
14
+ resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
15
+ });
16
+ });
17
+ }
18
+ export default class CampaignsSend extends AuthenticatedCommand {
19
+ static description = "Send a campaign immediately";
20
+ static examples = [
21
+ "<%= config.bin %> campaigns send cmp_xxx",
22
+ "<%= config.bin %> campaigns send cmp_xxx --yes",
23
+ ];
24
+ static args = {
25
+ id: Args.string({
26
+ description: "Campaign ID",
27
+ required: true,
28
+ }),
29
+ };
30
+ static flags = {
31
+ ...AuthenticatedCommand.baseFlags,
32
+ yes: Flags.boolean({
33
+ char: "y",
34
+ description: "Skip confirmation prompt",
35
+ default: false,
36
+ }),
37
+ };
38
+ async run() {
39
+ const { args, flags } = await this.parse(CampaignsSend);
40
+ const preview = await apiClient.get(`/api/v1/campaigns/${args.id}/preview`);
41
+ if (!preview.hasEnoughCredits) {
42
+ warn(`You need ${preview.estimatedCredits - preview.currentBalance} more credits to send this campaign.`);
43
+ console.log(colors.dim(` Top up at: https://sendly.live/billing`));
44
+ this.exit(1);
45
+ }
46
+ if (!flags.yes && !isJsonMode()) {
47
+ console.log();
48
+ console.log(colors.bold("Campaign Summary"));
49
+ console.log();
50
+ keyValue([
51
+ ["Recipients", String(preview.recipientCount)],
52
+ ["Credits to use", colors.bold(String(preview.estimatedCredits))],
53
+ ]);
54
+ console.log();
55
+ const confirmed = await confirm(colors.warning("Send this campaign now?"));
56
+ if (!confirmed) {
57
+ console.log(colors.dim("Cancelled"));
58
+ return;
59
+ }
60
+ }
61
+ const campaign = await apiClient.post(`/api/v1/campaigns/${args.id}/send`);
62
+ if (isJsonMode()) {
63
+ json(campaign);
64
+ return;
65
+ }
66
+ success(`Campaign is now sending!`);
67
+ console.log();
68
+ keyValue([
69
+ ["Campaign", campaign.name],
70
+ ["Status", colors.info("sending")],
71
+ ["Recipients", String(campaign.recipientCount)],
72
+ ]);
73
+ console.log();
74
+ console.log(colors.dim("Check status:"));
75
+ console.log(` ${colors.code(`sendly campaigns get ${campaign.id}`)}`);
76
+ }
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jYW1wYWlnbnMvc2VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEYsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFpQnJDLEtBQUssVUFBVSxPQUFPLENBQUMsT0FBZTtJQUNwQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDdkIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYyxTQUFRLG9CQUFvQjtJQUM3RCxNQUFNLENBQUMsV0FBVyxHQUFHLDZCQUE2QixD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LENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcmdzLCBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQgeyBqc29uLCBzdWNjZXNzLCBjb2xvcnMsIGlzSnNvbk1vZGUsIGtleVZhbHVlLCB3YXJuIH0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcbmltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gXCJyZWFkbGluZVwiO1xuXG5pbnRlcmZhY2UgQ2FtcGFpZ24ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICByZWNpcGllbnRDb3VudDogbnVtYmVyO1xuICBlc3RpbWF0ZWRDcmVkaXRzOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBDYW1wYWlnblByZXZpZXcge1xuICByZWNpcGllbnRDb3VudDogbnVtYmVyO1xuICBlc3RpbWF0ZWRDcmVkaXRzOiBudW1iZXI7XG4gIGN1cnJlbnRCYWxhbmNlOiBudW1iZXI7XG4gIGhhc0Vub3VnaENyZWRpdHM6IGJvb2xlYW47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbmZpcm0obWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBybC5xdWVzdGlvbihgJHttZXNzYWdlfSAoeS9OKSBgLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudG9Mb3dlckNhc2UoKSA9PT0gXCJ5XCIgfHwgYW5zd2VyLnRvTG93ZXJDYXNlKCkgPT09IFwieWVzXCIpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FtcGFpZ25zU2VuZCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJTZW5kIGEgY2FtcGFpZ24gaW1tZWRpYXRlbHlcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBjYW1wYWlnbnMgc2VuZCBjbXBfeHh4XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBjYW1wYWlnbnMgc2VuZCBjbXBfeHh4IC0teWVzXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNhbXBhaWduIElEXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgfTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIHllczogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBjaGFyOiBcInlcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNraXAgY29uZmlybWF0aW9uIHByb21wdFwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncywgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoQ2FtcGFpZ25zU2VuZCk7XG5cbiAgICBjb25zdCBwcmV2aWV3ID0gYXdhaXQgYXBpQ2xpZW50LmdldDxDYW1wYWlnblByZXZpZXc+KFxuICAgICAgYC9hcGkvdjEvY2FtcGFpZ25zLyR7YXJncy5pZH0vcHJldmlld2AsXG4gICAgKTtcblxuICAgIGlmICghcHJldmlldy5oYXNFbm91Z2hDcmVkaXRzKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgWW91IG5lZWQgJHtwcmV2aWV3LmVzdGltYXRlZENyZWRpdHMgLSBwcmV2aWV3LmN1cnJlbnRCYWxhbmNlfSBtb3JlIGNyZWRpdHMgdG8gc2VuZCB0aGlzIGNhbXBhaWduLmAsXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgICBUb3AgdXAgYXQ6IGh0dHBzOi8vc2VuZGx5LmxpdmUvYmlsbGluZ2ApKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBpZiAoIWZsYWdzLnllcyAmJiAhaXNKc29uTW9kZSgpKSB7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCJDYW1wYWlnbiBTdW1tYXJ5XCIpKTtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBrZXlWYWx1ZShbXG4gICAgICAgIFtcIlJlY2lwaWVudHNcIiwgU3RyaW5nKHByZXZpZXcucmVjaXBpZW50Q291bnQpXSxcbiAgICAgICAgW1wiQ3JlZGl0cyB0byB1c2VcIiwgY29sb3JzLmJvbGQoU3RyaW5nKHByZXZpZXcuZXN0aW1hdGVkQ3JlZGl0cykpXSxcbiAgICAgIF0pO1xuICAgICAgY29uc29sZS5sb2coKTtcblxuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgY29uZmlybShcbiAgICAgICAgY29sb3JzLndhcm5pbmcoXCJTZW5kIHRoaXMgY2FtcGFpZ24gbm93P1wiKSxcbiAgICAgICk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiQ2FuY2VsbGVkXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNhbXBhaWduID0gYXdhaXQgYXBpQ2xpZW50LnBvc3Q8Q2FtcGFpZ24+KFxuICAgICAgYC9hcGkvdjEvY2FtcGFpZ25zLyR7YXJncy5pZH0vc2VuZGAsXG4gICAgKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24oY2FtcGFpZ24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1Y2Nlc3MoYENhbXBhaWduIGlzIG5vdyBzZW5kaW5nIWApO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICBrZXlWYWx1ZShbXG4gICAgICBbXCJDYW1wYWlnblwiLCBjYW1wYWlnbi5uYW1lXSxcbiAgICAgIFtcIlN0YXR1c1wiLCBjb2xvcnMuaW5mbyhcInNlbmRpbmdcIildLFxuICAgICAgW1wiUmVjaXBpZW50c1wiLCBTdHJpbmcoY2FtcGFpZ24ucmVjaXBpZW50Q291bnQpXSxcbiAgICBdKTtcblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIkNoZWNrIHN0YXR1czpcIikpO1xuICAgIGNvbnNvbGUubG9nKGAgICR7Y29sb3JzLmNvZGUoYHNlbmRseSBjYW1wYWlnbnMgZ2V0ICR7Y2FtcGFpZ24uaWR9YCl9YCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class ContactsCreate extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ phone: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ name: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
+ email: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,48 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { success, json, colors, isJsonMode } from "../../lib/output.js";
5
+ export default class ContactsCreate extends AuthenticatedCommand {
6
+ static description = "Create a new contact";
7
+ static examples = [
8
+ "<%= config.bin %> contacts create --phone +15551234567",
9
+ '<%= config.bin %> contacts create --phone +15551234567 --name "John Doe"',
10
+ '<%= config.bin %> contacts create --phone +15551234567 --name "John" --email john@example.com',
11
+ "<%= config.bin %> contacts create --phone +15551234567 --json",
12
+ ];
13
+ static flags = {
14
+ ...AuthenticatedCommand.baseFlags,
15
+ phone: Flags.string({
16
+ char: "p",
17
+ description: "Phone number in E.164 format (e.g., +15551234567)",
18
+ required: true,
19
+ }),
20
+ name: Flags.string({
21
+ char: "n",
22
+ description: "Contact name",
23
+ }),
24
+ email: Flags.string({
25
+ char: "e",
26
+ description: "Contact email",
27
+ }),
28
+ };
29
+ async run() {
30
+ const { flags } = await this.parse(ContactsCreate);
31
+ const contact = await apiClient.post("/api/v1/contacts", {
32
+ phone_number: flags.phone,
33
+ name: flags.name,
34
+ email: flags.email,
35
+ });
36
+ if (isJsonMode()) {
37
+ json(contact);
38
+ return;
39
+ }
40
+ success("Contact created", {
41
+ ID: contact.id,
42
+ Phone: contact.phone_number,
43
+ Name: contact.name || colors.dim("(none)"),
44
+ Email: contact.email || colors.dim("(none)"),
45
+ });
46
+ }
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbnRhY3RzL2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFVeEUsTUFBTSxDQUFDLE9BQU8sT0FBTyxjQUFlLFNBQVEsb0JBQW9CO0lBQzlELE1BQU0sQ0FBQyxXQUFXLEdBQUcsc0JBQXNCLENBQUM7SUFFNUMsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQix3REFBd0Q7UUFDeEQsMEVBQTBFO1FBQzFFLCtGQUErRjtRQUMvRiwrREFBK0Q7S0FDaEUsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDbEIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsbURBQW1EO1lBQ2hFLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztRQUNGLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2pCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLGNBQWM7U0FDNUIsQ0FBQztRQUNGLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2xCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLGVBQWU7U0FDN0IsQ0FBQztLQUNILENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFbkQsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFVLGtCQUFrQixFQUFFO1lBQ2hFLFlBQVksRUFBRSxLQUFLLENBQUMsS0FBSztZQUN6QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQ25CLENBQUMsQ0FBQztRQUVILElBQUksVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDZCxPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtZQUN6QixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDZCxLQUFLLEVBQUUsT0FBTyxDQUFDLFlBQVk7WUFDM0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDMUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7U0FDN0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7IHN1Y2Nlc3MsIGpzb24sIGNvbG9ycywgaXNKc29uTW9kZSB9IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBDb250YWN0IHtcbiAgaWQ6IHN0cmluZztcbiAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBjcmVhdGVkX2F0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhY3RzQ3JlYXRlIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIkNyZWF0ZSBhIG5ldyBjb250YWN0XCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gY29udGFjdHMgY3JlYXRlIC0tcGhvbmUgKzE1NTUxMjM0NTY3XCIsXG4gICAgJzwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGNyZWF0ZSAtLXBob25lICsxNTU1MTIzNDU2NyAtLW5hbWUgXCJKb2huIERvZVwiJyxcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gY29udGFjdHMgY3JlYXRlIC0tcGhvbmUgKzE1NTUxMjM0NTY3IC0tbmFtZSBcIkpvaG5cIiAtLWVtYWlsIGpvaG5AZXhhbXBsZS5jb20nLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gY29udGFjdHMgY3JlYXRlIC0tcGhvbmUgKzE1NTUxMjM0NTY3IC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgcGhvbmU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcInBcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQgKGUuZy4sICsxNTU1MTIzNDU2NylcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICAgIG5hbWU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcIm5cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbnRhY3QgbmFtZVwiLFxuICAgIH0pLFxuICAgIGVtYWlsOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDb250YWN0IGVtYWlsXCIsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoQ29udGFjdHNDcmVhdGUpO1xuXG4gICAgY29uc3QgY29udGFjdCA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PENvbnRhY3Q+KFwiL2FwaS92MS9jb250YWN0c1wiLCB7XG4gICAgICBwaG9uZV9udW1iZXI6IGZsYWdzLnBob25lLFxuICAgICAgbmFtZTogZmxhZ3MubmFtZSxcbiAgICAgIGVtYWlsOiBmbGFncy5lbWFpbCxcbiAgICB9KTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24oY29udGFjdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VjY2VzcyhcIkNvbnRhY3QgY3JlYXRlZFwiLCB7XG4gICAgICBJRDogY29udGFjdC5pZCxcbiAgICAgIFBob25lOiBjb250YWN0LnBob25lX251bWJlcixcbiAgICAgIE5hbWU6IGNvbnRhY3QubmFtZSB8fCBjb2xvcnMuZGltKFwiKG5vbmUpXCIpLFxuICAgICAgRW1haWw6IGNvbnRhY3QuZW1haWwgfHwgY29sb3JzLmRpbShcIihub25lKVwiKSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,14 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class ContactsDelete extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ yes: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
@@ -0,0 +1,52 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { success, error, json, colors, isJsonMode } from "../../lib/output.js";
5
+ import inquirer from "inquirer";
6
+ export default class ContactsDelete extends AuthenticatedCommand {
7
+ static description = "Delete a contact";
8
+ static examples = [
9
+ "<%= config.bin %> contacts delete cnt_xxx",
10
+ "<%= config.bin %> contacts delete cnt_xxx --yes",
11
+ ];
12
+ static args = {
13
+ id: Args.string({
14
+ description: "Contact ID to delete",
15
+ required: true,
16
+ }),
17
+ };
18
+ static flags = {
19
+ ...AuthenticatedCommand.baseFlags,
20
+ yes: Flags.boolean({
21
+ char: "y",
22
+ description: "Skip confirmation prompt",
23
+ default: false,
24
+ }),
25
+ };
26
+ async run() {
27
+ const { args, flags } = await this.parse(ContactsDelete);
28
+ if (!flags.yes) {
29
+ const { confirm } = await inquirer.prompt([
30
+ {
31
+ type: "confirm",
32
+ name: "confirm",
33
+ message: `Are you sure you want to delete contact ${colors.code(args.id)}?`,
34
+ default: false,
35
+ },
36
+ ]);
37
+ if (!confirm) {
38
+ error("Deletion cancelled");
39
+ return;
40
+ }
41
+ }
42
+ await apiClient.delete(`/api/v1/contacts/${args.id}`);
43
+ if (isJsonMode()) {
44
+ json({ success: true, deletedId: args.id });
45
+ return;
46
+ }
47
+ success("Contact deleted", {
48
+ ID: args.id,
49
+ });
50
+ }
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbnRhY3RzL2RlbGV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRSxPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFFaEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxjQUFlLFNBQVEsb0JBQW9CO0lBQzlELE1BQU0sQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7SUFFeEMsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQiwyQ0FBMkM7UUFDM0MsaURBQWlEO0tBQ2xELENBQUM7SUFFRixNQUFNLENBQUMsSUFBSSxHQUFHO1FBQ1osRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDZCxXQUFXLEVBQUUsc0JBQXNCO1lBQ25DLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2pCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLDBCQUEwQjtZQUN2QyxPQUFPLEVBQUUsS0FBSztTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2YsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDeEM7b0JBQ0UsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsT0FBTyxFQUFFLDJDQUEyQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRztvQkFDM0UsT0FBTyxFQUFFLEtBQUs7aUJBQ2Y7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQzVCLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFdEQsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLGlCQUFpQixFQUFFO1lBQ3pCLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtTQUNaLENBQUMsQ0FBQztJQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcmdzLCBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQgeyBzdWNjZXNzLCBlcnJvciwganNvbiwgY29sb3JzLCBpc0pzb25Nb2RlIH0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcbmltcG9ydCBpbnF1aXJlciBmcm9tIFwiaW5xdWlyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udGFjdHNEZWxldGUgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiRGVsZXRlIGEgY29udGFjdFwiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGRlbGV0ZSBjbnRfeHh4XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBjb250YWN0cyBkZWxldGUgY250X3h4eCAtLXllc1wiLFxuICBdO1xuXG4gIHN0YXRpYyBhcmdzID0ge1xuICAgIGlkOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJDb250YWN0IElEIHRvIGRlbGV0ZVwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICB5ZXM6IEZsYWdzLmJvb2xlYW4oe1xuICAgICAgY2hhcjogXCJ5XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJTa2lwIGNvbmZpcm1hdGlvbiBwcm9tcHRcIixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0pLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGFyZ3MsIGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKENvbnRhY3RzRGVsZXRlKTtcblxuICAgIGlmICghZmxhZ3MueWVzKSB7XG4gICAgICBjb25zdCB7IGNvbmZpcm0gfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImNvbmZpcm1cIixcbiAgICAgICAgICBuYW1lOiBcImNvbmZpcm1cIixcbiAgICAgICAgICBtZXNzYWdlOiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBjb250YWN0ICR7Y29sb3JzLmNvZGUoYXJncy5pZCl9P2AsXG4gICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgaWYgKCFjb25maXJtKSB7XG4gICAgICAgIGVycm9yKFwiRGVsZXRpb24gY2FuY2VsbGVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgYXBpQ2xpZW50LmRlbGV0ZShgL2FwaS92MS9jb250YWN0cy8ke2FyZ3MuaWR9YCk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKHsgc3VjY2VzczogdHJ1ZSwgZGVsZXRlZElkOiBhcmdzLmlkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1Y2Nlc3MoXCJDb250YWN0IGRlbGV0ZWRcIiwge1xuICAgICAgSUQ6IGFyZ3MuaWQsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class ContactsGet extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,51 @@
1
+ import { Args } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { detail, json, colors, isJsonMode } from "../../lib/output.js";
5
+ export default class ContactsGet extends AuthenticatedCommand {
6
+ static description = "Get contact details";
7
+ static examples = [
8
+ "<%= config.bin %> contacts get cnt_xxx",
9
+ "<%= config.bin %> contacts get cnt_xxx --json",
10
+ ];
11
+ static args = {
12
+ id: Args.string({
13
+ description: "Contact ID",
14
+ required: true,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...AuthenticatedCommand.baseFlags,
19
+ };
20
+ async run() {
21
+ const { args } = await this.parse(ContactsGet);
22
+ const contact = await apiClient.get(`/api/v1/contacts/${args.id}`);
23
+ if (isJsonMode()) {
24
+ json(contact);
25
+ return;
26
+ }
27
+ console.log();
28
+ detail("Contact Details", {
29
+ ID: contact.id,
30
+ Phone: contact.phone_number,
31
+ Name: contact.name || colors.dim("(none)"),
32
+ Email: contact.email || colors.dim("(none)"),
33
+ Status: contact.opted_out ? colors.error("Opted Out") : colors.success("Active"),
34
+ Lists: contact.lists?.length
35
+ ? contact.lists.map((l) => l.name).join(", ")
36
+ : colors.dim("(none)"),
37
+ Created: new Date(contact.created_at).toLocaleString(),
38
+ ...(contact.updated_at && {
39
+ Updated: new Date(contact.updated_at).toLocaleString(),
40
+ }),
41
+ });
42
+ if (contact.metadata && Object.keys(contact.metadata).length > 0) {
43
+ console.log();
44
+ console.log(colors.bold("Metadata:"));
45
+ for (const [key, value] of Object.entries(contact.metadata)) {
46
+ console.log(` ${key}: ${JSON.stringify(value)}`);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbnRhY3RzL2dldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFjdkUsTUFBTSxDQUFDLE9BQU8sT0FBTyxXQUFZLFNBQVEsb0JBQW9CO0lBQzNELE1BQU0sQ0FBQyxXQUFXLEdBQUcscUJBQXFCLENBQUM7SUFFM0MsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQix3Q0FBd0M7UUFDeEMsK0NBQStDO0tBQ2hELENBQUM7SUFFRixNQUFNLENBQUMsSUFBSSxHQUFHO1FBQ1osRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDZCxXQUFXLEVBQUUsWUFBWTtZQUN6QixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FDakMsb0JBQW9CLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FDOUIsQ0FBQztRQUVGLElBQUksVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDZCxPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtZQUN4QixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDZCxLQUFLLEVBQUUsT0FBTyxDQUFDLFlBQVk7WUFDM0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDMUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDNUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ2hGLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU07Z0JBQzFCLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQzdDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUN4QixPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGNBQWMsRUFBRTtZQUN0RCxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSTtnQkFDeEIsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxjQUFjLEVBQUU7YUFDdkQsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakUsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdEMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzVELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQgeyBkZXRhaWwsIGpzb24sIGNvbG9ycywgaXNKc29uTW9kZSB9IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBDb250YWN0IHtcbiAgaWQ6IHN0cmluZztcbiAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIG9wdGVkX291dD86IGJvb2xlYW47XG4gIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgdXBkYXRlZF9hdD86IHN0cmluZztcbiAgbGlzdHM/OiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9Pjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udGFjdHNHZXQgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiR2V0IGNvbnRhY3QgZGV0YWlsc1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGdldCBjbnRfeHh4XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBjb250YWN0cyBnZXQgY250X3h4eCAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBpZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiQ29udGFjdCBJRFwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKENvbnRhY3RzR2V0KTtcblxuICAgIGNvbnN0IGNvbnRhY3QgPSBhd2FpdCBhcGlDbGllbnQuZ2V0PENvbnRhY3Q+KFxuICAgICAgYC9hcGkvdjEvY29udGFjdHMvJHthcmdzLmlkfWAsXG4gICAgKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24oY29udGFjdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coKTtcbiAgICBkZXRhaWwoXCJDb250YWN0IERldGFpbHNcIiwge1xuICAgICAgSUQ6IGNvbnRhY3QuaWQsXG4gICAgICBQaG9uZTogY29udGFjdC5waG9uZV9udW1iZXIsXG4gICAgICBOYW1lOiBjb250YWN0Lm5hbWUgfHwgY29sb3JzLmRpbShcIihub25lKVwiKSxcbiAgICAgIEVtYWlsOiBjb250YWN0LmVtYWlsIHx8IGNvbG9ycy5kaW0oXCIobm9uZSlcIiksXG4gICAgICBTdGF0dXM6IGNvbnRhY3Qub3B0ZWRfb3V0ID8gY29sb3JzLmVycm9yKFwiT3B0ZWQgT3V0XCIpIDogY29sb3JzLnN1Y2Nlc3MoXCJBY3RpdmVcIiksXG4gICAgICBMaXN0czogY29udGFjdC5saXN0cz8ubGVuZ3RoXG4gICAgICAgID8gY29udGFjdC5saXN0cy5tYXAoKGwpID0+IGwubmFtZSkuam9pbihcIiwgXCIpXG4gICAgICAgIDogY29sb3JzLmRpbShcIihub25lKVwiKSxcbiAgICAgIENyZWF0ZWQ6IG5ldyBEYXRlKGNvbnRhY3QuY3JlYXRlZF9hdCkudG9Mb2NhbGVTdHJpbmcoKSxcbiAgICAgIC4uLihjb250YWN0LnVwZGF0ZWRfYXQgJiYge1xuICAgICAgICBVcGRhdGVkOiBuZXcgRGF0ZShjb250YWN0LnVwZGF0ZWRfYXQpLnRvTG9jYWxlU3RyaW5nKCksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmIChjb250YWN0Lm1ldGFkYXRhICYmIE9iamVjdC5rZXlzKGNvbnRhY3QubWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChcIk1ldGFkYXRhOlwiKSk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb250YWN0Lm1ldGFkYXRhKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAke2tleX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,14 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class ContactsList extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ limit: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ offset: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
+ search: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ list: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
@@ -0,0 +1,101 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { table, json, info, formatRelativeTime, colors, isJsonMode, } from "../../lib/output.js";
5
+ export default class ContactsList extends AuthenticatedCommand {
6
+ static description = "List contacts";
7
+ static examples = [
8
+ "<%= config.bin %> contacts list",
9
+ "<%= config.bin %> contacts list --search john",
10
+ "<%= config.bin %> contacts list --list lst_xxx",
11
+ "<%= config.bin %> contacts list --limit 50",
12
+ "<%= config.bin %> contacts list --json",
13
+ ];
14
+ static flags = {
15
+ ...AuthenticatedCommand.baseFlags,
16
+ limit: Flags.integer({
17
+ char: "l",
18
+ description: "Number of contacts to show",
19
+ default: 50,
20
+ }),
21
+ offset: Flags.integer({
22
+ description: "Offset for pagination",
23
+ default: 0,
24
+ }),
25
+ search: Flags.string({
26
+ char: "s",
27
+ description: "Search by name, phone, or email",
28
+ }),
29
+ list: Flags.string({
30
+ description: "Filter by contact list ID",
31
+ }),
32
+ };
33
+ async run() {
34
+ const { flags } = await this.parse(ContactsList);
35
+ const response = await apiClient.get("/api/v1/contacts", {
36
+ limit: flags.limit,
37
+ offset: flags.offset,
38
+ ...(flags.search && { search: flags.search }),
39
+ ...(flags.list && { list_id: flags.list }),
40
+ });
41
+ if (isJsonMode()) {
42
+ json(response);
43
+ return;
44
+ }
45
+ if (response.contacts.length === 0) {
46
+ info("No contacts found");
47
+ return;
48
+ }
49
+ console.log();
50
+ console.log(colors.dim(`Showing ${response.contacts.length} of ${response.total} contacts`));
51
+ console.log();
52
+ table(response.contacts, [
53
+ {
54
+ header: "ID",
55
+ key: "id",
56
+ width: 18,
57
+ formatter: (v) => colors.dim(String(v).slice(0, 15) + "..."),
58
+ },
59
+ {
60
+ header: "Phone",
61
+ key: "phone_number",
62
+ width: 16,
63
+ },
64
+ {
65
+ header: "Name",
66
+ key: "name",
67
+ width: 20,
68
+ formatter: (v) => {
69
+ if (!v)
70
+ return colors.dim("-");
71
+ const name = String(v);
72
+ return name.length > 18 ? name.slice(0, 18) + "..." : name;
73
+ },
74
+ },
75
+ {
76
+ header: "Email",
77
+ key: "email",
78
+ width: 24,
79
+ formatter: (v) => {
80
+ if (!v)
81
+ return colors.dim("-");
82
+ const email = String(v);
83
+ return email.length > 22 ? email.slice(0, 22) + "..." : email;
84
+ },
85
+ },
86
+ {
87
+ header: "Status",
88
+ key: "opted_out",
89
+ width: 10,
90
+ formatter: (v) => v ? colors.error("opted-out") : colors.success("active"),
91
+ },
92
+ {
93
+ header: "Created",
94
+ key: "created_at",
95
+ width: 12,
96
+ formatter: (v) => formatRelativeTime(String(v)),
97
+ },
98
+ ]);
99
+ }
100
+ }
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jb250YWN0cy9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFDTCxLQUFLLEVBQ0wsSUFBSSxFQUNKLElBQUksRUFDSixrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBa0I3QixNQUFNLENBQUMsT0FBTyxPQUFPLFlBQWEsU0FBUSxvQkFBb0I7SUFDNUQsTUFBTSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUM7SUFFckMsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQixpQ0FBaUM7UUFDakMsK0NBQStDO1FBQy9DLGdEQUFnRDtRQUNoRCw0Q0FBNEM7UUFDNUMsd0NBQXdDO0tBQ3pDLENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ25CLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLDRCQUE0QjtZQUN6QyxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7UUFDRixNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNwQixXQUFXLEVBQUUsdUJBQXVCO1lBQ3BDLE9BQU8sRUFBRSxDQUFDO1NBQ1gsQ0FBQztRQUNGLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ25CLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLGlDQUFpQztTQUMvQyxDQUFDO1FBQ0YsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLENB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QUFDLEtBQUssQ0FBQztnQkFDaEUsQ0FBQzthQUNGO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7YUFDM0U7WUFDRDtnQkFDRSxNQUFNLEVBQUUsU0FBUztnQkFDakIsR0FBRyxFQUFFLFlBQVk7Z0JBQ2pCLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hEO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHRhYmxlLFxuICBqc29uLFxuICBpbmZvLFxuICBmb3JtYXRSZWxhdGl2ZVRpbWUsXG4gIGNvbG9ycyxcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIENvbnRhY3Qge1xuICBpZDogc3RyaW5nO1xuICBwaG9uZV9udW1iZXI6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgZW1haWw/OiBzdHJpbmc7XG4gIG9wdGVkX291dD86IGJvb2xlYW47XG4gIGNyZWF0ZWRfYXQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExpc3RDb250YWN0c1Jlc3BvbnNlIHtcbiAgY29udGFjdHM6IENvbnRhY3RbXTtcbiAgdG90YWw6IG51bWJlcjtcbiAgbGltaXQ6IG51bWJlcjtcbiAgb2Zmc2V0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhY3RzTGlzdCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJMaXN0IGNvbnRhY3RzXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gY29udGFjdHMgbGlzdFwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gY29udGFjdHMgbGlzdCAtLXNlYXJjaCBqb2huXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBjb250YWN0cyBsaXN0IC0tbGlzdCBsc3RfeHh4XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBjb250YWN0cyBsaXN0IC0tbGltaXQgNTBcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGxpc3QgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBsaW1pdDogRmxhZ3MuaW50ZWdlcih7XG4gICAgICBjaGFyOiBcImxcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk51bWJlciBvZiBjb250YWN0cyB0byBzaG93XCIsXG4gICAgICBkZWZhdWx0OiA1MCxcbiAgICB9KSxcbiAgICBvZmZzZXQ6IEZsYWdzLmludGVnZXIoe1xuICAgICAgZGVzY3JpcHRpb246IFwiT2Zmc2V0IGZvciBwYWdpbmF0aW9uXCIsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgIH0pLFxuICAgIHNlYXJjaDogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwic1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiU2VhcmNoIGJ5IG5hbWUsIHBob25lLCBvciBlbWFpbFwiLFxuICAgIH0pLFxuICAgIGxpc3Q6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJGaWx0ZXIgYnkgY29udGFjdCBsaXN0IElEXCIsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoQ29udGFjdHNMaXN0KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LmdldDxMaXN0Q29udGFjdHNSZXNwb25zZT4oXG4gICAgICBcIi9hcGkvdjEvY29udGFjdHNcIixcbiAgICAgIHtcbiAgICAgICAgbGltaXQ6IGZsYWdzLmxpbWl0LFxuICAgICAgICBvZmZzZXQ6IGZsYWdzLm9mZnNldCxcbiAgICAgICAgLi4uKGZsYWdzLnNlYXJjaCAmJiB7IHNlYXJjaDogZmxhZ3Muc2VhcmNoIH0pLFxuICAgICAgICAuLi4oZmxhZ3MubGlzdCAmJiB7IGxpc3RfaWQ6IGZsYWdzLmxpc3QgfSksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKHJlc3BvbnNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UuY29udGFjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbmZvKFwiTm8gY29udGFjdHMgZm91bmRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNvbG9ycy5kaW0oYFNob3dpbmcgJHtyZXNwb25zZS5jb250YWN0cy5sZW5ndGh9IG9mICR7cmVzcG9uc2UudG90YWx9IGNvbnRhY3RzYCksXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgdGFibGUocmVzcG9uc2UuY29udGFjdHMsIFtcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIklEXCIsXG4gICAgICAgIGtleTogXCJpZFwiLFxuICAgICAgICB3aWR0aDogMTgsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGNvbG9ycy5kaW0oU3RyaW5nKHYpLnNsaWNlKDAsIDE1KSArIFwiLi4uXCIpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlBob25lXCIsXG4gICAgICAgIGtleTogXCJwaG9uZV9udW1iZXJcIixcbiAgICAgICAgd2lkdGg6IDE2LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIk5hbWVcIixcbiAgICAgICAga2V5OiBcIm5hbWVcIixcbiAgICAgICAgd2lkdGg6IDIwLFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiB7XG4gICAgICAgICAgaWYgKCF2KSByZXR1cm4gY29sb3JzLmRpbShcIi1cIik7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IFN0cmluZyh2KTtcbiAgICAgICAgICByZXR1cm4gbmFtZS5sZW5ndGggPiAxOCA/IG5hbWUuc2xpY2UoMCwgMTgpICsgXCIuLi5cIiA6IG5hbWU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiRW1haWxcIixcbiAgICAgICAga2V5OiBcImVtYWlsXCIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4ge1xuICAgICAgICAgIGlmICghdikgcmV0dXJuIGNvbG9ycy5kaW0oXCItXCIpO1xuICAgICAgICAgIGNvbnN0IGVtYWlsID0gU3RyaW5nKHYpO1xuICAgICAgICAgIHJldHVybiBlbWFpbC5sZW5ndGggPiAyMiA/IGVtYWlsLnNsaWNlKDAsIDIyKSArIFwiLi4uXCIgOiBlbWFpbDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJTdGF0dXNcIixcbiAgICAgICAga2V5OiBcIm9wdGVkX291dFwiLFxuICAgICAgICB3aWR0aDogMTAsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IHYgPyBjb2xvcnMuZXJyb3IoXCJvcHRlZC1vdXRcIikgOiBjb2xvcnMuc3VjY2VzcyhcImFjdGl2ZVwiKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJDcmVhdGVkXCIsXG4gICAgICAgIGtleTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgIHdpZHRoOiAxMixcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4gZm9ybWF0UmVsYXRpdmVUaW1lKFN0cmluZyh2KSksXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class ContactsListsAdd extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ listId: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ contacts: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[], import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
@@ -0,0 +1,40 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
3
+ import { apiClient } from "../../../lib/api-client.js";
4
+ import { success, json, isJsonMode } from "../../../lib/output.js";
5
+ export default class ContactsListsAdd extends AuthenticatedCommand {
6
+ static description = "Add contacts to a list";
7
+ static examples = [
8
+ "<%= config.bin %> contacts lists add lst_xxx --contacts cnt_abc,cnt_def",
9
+ "<%= config.bin %> contacts lists add lst_xxx --contacts cnt_abc --contacts cnt_def",
10
+ ];
11
+ static args = {
12
+ listId: Args.string({
13
+ description: "Contact list ID",
14
+ required: true,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...AuthenticatedCommand.baseFlags,
19
+ contacts: Flags.string({
20
+ char: "c",
21
+ description: "Contact IDs to add (comma-separated or multiple flags)",
22
+ required: true,
23
+ multiple: true,
24
+ }),
25
+ };
26
+ async run() {
27
+ const { args, flags } = await this.parse(ContactsListsAdd);
28
+ const contactIds = flags.contacts.flatMap((c) => c.split(",").map((id) => id.trim()));
29
+ const response = await apiClient.post(`/api/v1/contact-lists/${args.listId}/contacts`, { contact_ids: contactIds });
30
+ if (isJsonMode()) {
31
+ json(response);
32
+ return;
33
+ }
34
+ success("Contacts added to list", {
35
+ "List ID": args.listId,
36
+ "Added Count": response.added_count,
37
+ });
38
+ }
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbnRhY3RzL2xpc3RzL2FkZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPbkUsTUFBTSxDQUFDLE9BQU8sT0FBTyxnQkFBaUIsU0FBUSxvQkFBb0I7SUFDaEUsTUFBTSxDQUFDLFdBQVcsR0FBRyx3QkFBd0IsQ0FBQztJQUU5QyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLHlFQUF5RTtRQUN6RSxvRkFBb0Y7S0FDckYsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNsQixXQUFXLEVBQUUsaUJBQWlCO1lBQzlCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3JCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLHdEQUF3RDtZQUNyRSxRQUFRLEVBQUUsSUFBSTtZQUNkLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM5QyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQ3BDLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQ25DLHlCQUF5QixJQUFJLENBQUMsTUFBTSxXQUFXLEVBQy9DLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUM1QixDQUFDO1FBRUYsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLHdCQUF3QixFQUFFO1lBQ2hDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTTtZQUN0QixhQUFhLEVBQUUsUUFBUSxDQUFDLFdBQVc7U0FDcEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7IHN1Y2Nlc3MsIGpzb24sIGlzSnNvbk1vZGUgfSBmcm9tIFwiLi4vLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgQWRkQ29udGFjdHNSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGFkZGVkX2NvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhY3RzTGlzdHNBZGQgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiQWRkIGNvbnRhY3RzIHRvIGEgbGlzdFwiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGxpc3RzIGFkZCBsc3RfeHh4IC0tY29udGFjdHMgY250X2FiYyxjbnRfZGVmXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBjb250YWN0cyBsaXN0cyBhZGQgbHN0X3h4eCAtLWNvbnRhY3RzIGNudF9hYmMgLS1jb250YWN0cyBjbnRfZGVmXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgbGlzdElkOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJDb250YWN0IGxpc3QgSURcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgY29udGFjdHM6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImNcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbnRhY3QgSURzIHRvIGFkZCAoY29tbWEtc2VwYXJhdGVkIG9yIG11bHRpcGxlIGZsYWdzKVwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShDb250YWN0c0xpc3RzQWRkKTtcblxuICAgIGNvbnN0IGNvbnRhY3RJZHMgPSBmbGFncy5jb250YWN0cy5mbGF0TWFwKChjKSA9PlxuICAgICAgYy5zcGxpdChcIixcIikubWFwKChpZCkgPT4gaWQudHJpbSgpKSxcbiAgICApO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxBZGRDb250YWN0c1Jlc3BvbnNlPihcbiAgICAgIGAvYXBpL3YxL2NvbnRhY3QtbGlzdHMvJHthcmdzLmxpc3RJZH0vY29udGFjdHNgLFxuICAgICAgeyBjb250YWN0X2lkczogY29udGFjdElkcyB9LFxuICAgICk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKHJlc3BvbnNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWNjZXNzKFwiQ29udGFjdHMgYWRkZWQgdG8gbGlzdFwiLCB7XG4gICAgICBcIkxpc3QgSURcIjogYXJncy5saXN0SWQsXG4gICAgICBcIkFkZGVkIENvdW50XCI6IHJlc3BvbnNlLmFkZGVkX2NvdW50LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,12 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class ContactsListsCreate extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ name: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ description: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
9
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ };
11
+ run(): Promise<void>;
12
+ }