@sendly/cli 3.12.3 → 3.13.1

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 (66) 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/clone.d.ts +14 -0
  4. package/dist/commands/campaigns/clone.js +47 -0
  5. package/dist/commands/campaigns/create.d.ts +14 -0
  6. package/dist/commands/campaigns/create.js +64 -0
  7. package/dist/commands/campaigns/delete.d.ts +14 -0
  8. package/dist/commands/campaigns/delete.js +63 -0
  9. package/dist/commands/campaigns/get.d.ts +13 -0
  10. package/dist/commands/campaigns/get.js +101 -0
  11. package/dist/commands/campaigns/list.d.ts +13 -0
  12. package/dist/commands/campaigns/list.js +115 -0
  13. package/dist/commands/campaigns/preview.d.ts +13 -0
  14. package/dist/commands/campaigns/preview.js +71 -0
  15. package/dist/commands/campaigns/schedule.d.ts +15 -0
  16. package/dist/commands/campaigns/schedule.js +61 -0
  17. package/dist/commands/campaigns/send.d.ts +14 -0
  18. package/dist/commands/campaigns/send.js +96 -0
  19. package/dist/commands/campaigns/update.d.ts +17 -0
  20. package/dist/commands/campaigns/update.js +66 -0
  21. package/dist/commands/contacts/create.d.ts +13 -0
  22. package/dist/commands/contacts/create.js +48 -0
  23. package/dist/commands/contacts/delete.d.ts +14 -0
  24. package/dist/commands/contacts/delete.js +52 -0
  25. package/dist/commands/contacts/get.d.ts +13 -0
  26. package/dist/commands/contacts/get.js +51 -0
  27. package/dist/commands/contacts/import.d.ts +14 -0
  28. package/dist/commands/contacts/import.js +132 -0
  29. package/dist/commands/contacts/list.d.ts +14 -0
  30. package/dist/commands/contacts/list.js +101 -0
  31. package/dist/commands/contacts/lists/add.d.ts +14 -0
  32. package/dist/commands/contacts/lists/add.js +40 -0
  33. package/dist/commands/contacts/lists/create.d.ts +12 -0
  34. package/dist/commands/contacts/lists/create.js +40 -0
  35. package/dist/commands/contacts/lists/delete.d.ts +14 -0
  36. package/dist/commands/contacts/lists/delete.js +52 -0
  37. package/dist/commands/contacts/lists/get.d.ts +13 -0
  38. package/dist/commands/contacts/lists/get.js +63 -0
  39. package/dist/commands/contacts/lists/index.d.ts +10 -0
  40. package/dist/commands/contacts/lists/index.js +68 -0
  41. package/dist/commands/contacts/lists/remove.d.ts +14 -0
  42. package/dist/commands/contacts/lists/remove.js +36 -0
  43. package/dist/commands/contacts/lists/update.d.ts +15 -0
  44. package/dist/commands/contacts/lists/update.js +51 -0
  45. package/dist/commands/contacts/update.d.ts +15 -0
  46. package/dist/commands/contacts/update.js +52 -0
  47. package/dist/commands/keys/get.d.ts +13 -0
  48. package/dist/commands/keys/get.js +53 -0
  49. package/dist/commands/keys/rename.d.ts +14 -0
  50. package/dist/commands/keys/rename.js +53 -0
  51. package/dist/commands/keys/rotate.d.ts +15 -0
  52. package/dist/commands/keys/rotate.js +82 -0
  53. package/dist/commands/keys/usage.d.ts +13 -0
  54. package/dist/commands/keys/usage.js +102 -0
  55. package/dist/commands/status.js +3 -3
  56. package/dist/commands/templates/clone.d.ts +14 -0
  57. package/dist/commands/templates/clone.js +45 -0
  58. package/dist/commands/verify/list.d.ts +3 -0
  59. package/dist/commands/verify/list.js +31 -5
  60. package/dist/lib/api-client.d.ts +9 -2
  61. package/dist/lib/api-client.js +31 -7
  62. package/dist/lib/base-command.js +31 -4
  63. package/dist/lib/output.d.ts +4 -2
  64. package/dist/lib/output.js +19 -6
  65. package/oclif.manifest.json +2264 -723
  66. package/package.json +1 -1
@@ -0,0 +1,14 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class ContactsImport extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ file: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
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,132 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { readFileSync } from "node:fs";
3
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
4
+ import { apiClient } from "../../lib/api-client.js";
5
+ import { json, success, colors, isJsonMode, keyValue, warn, } from "../../lib/output.js";
6
+ function normalizePhone(raw) {
7
+ let phone = raw.replace(/[\s\-\(\)\.\+]/g, "");
8
+ if (/^\d{10}$/.test(phone)) {
9
+ phone = "1" + phone;
10
+ }
11
+ if (/^\d{11}$/.test(phone) && phone.startsWith("1")) {
12
+ return "+" + phone;
13
+ }
14
+ if (/^\d{7,15}$/.test(phone)) {
15
+ return "+" + phone;
16
+ }
17
+ if (raw.startsWith("+")) {
18
+ return "+" + phone;
19
+ }
20
+ return raw.trim();
21
+ }
22
+ function parseCsv(content) {
23
+ const lines = content.split(/\r?\n/).filter((l) => l.trim());
24
+ if (lines.length < 2)
25
+ return [];
26
+ const headers = lines[0].split(",").map((h) => h.trim().toLowerCase());
27
+ const rows = [];
28
+ for (let i = 1; i < lines.length; i++) {
29
+ const values = lines[i].split(",").map((v) => v.trim());
30
+ const row = {};
31
+ for (let j = 0; j < headers.length; j++) {
32
+ row[headers[j]] = values[j] || "";
33
+ }
34
+ rows.push(row);
35
+ }
36
+ return rows;
37
+ }
38
+ function detectPhoneColumn(headers) {
39
+ const candidates = [
40
+ "phone",
41
+ "phonenumber",
42
+ "phone_number",
43
+ "to",
44
+ "number",
45
+ "mobile",
46
+ "cell",
47
+ ];
48
+ for (const h of headers) {
49
+ if (candidates.includes(h.toLowerCase()))
50
+ return h;
51
+ }
52
+ return null;
53
+ }
54
+ export default class ContactsImport extends AuthenticatedCommand {
55
+ static description = "Import contacts from a CSV file";
56
+ static examples = [
57
+ "<%= config.bin %> contacts import contacts.csv",
58
+ "<%= config.bin %> contacts import contacts.csv --list lst_xxx",
59
+ "<%= config.bin %> contacts import contacts.csv --list lst_xxx --json",
60
+ ];
61
+ static args = {
62
+ file: Args.string({
63
+ description: "Path to CSV file (columns: phone, name, email)",
64
+ required: true,
65
+ }),
66
+ };
67
+ static flags = {
68
+ ...AuthenticatedCommand.baseFlags,
69
+ list: Flags.string({
70
+ char: "l",
71
+ description: "Contact list ID to add imported contacts to",
72
+ }),
73
+ };
74
+ async run() {
75
+ const { args, flags } = await this.parse(ContactsImport);
76
+ let content;
77
+ try {
78
+ content = readFileSync(args.file, "utf-8");
79
+ }
80
+ catch {
81
+ this.error(`Cannot read file: ${args.file}`);
82
+ }
83
+ const rows = parseCsv(content);
84
+ if (rows.length === 0) {
85
+ this.error("CSV file is empty or has no data rows");
86
+ }
87
+ const headers = Object.keys(rows[0]);
88
+ const phoneCol = detectPhoneColumn(headers);
89
+ if (!phoneCol) {
90
+ this.error(`No phone column found. Expected one of: phone, phoneNumber, to, number, mobile`);
91
+ }
92
+ const contacts = rows.map((row) => ({
93
+ phone: normalizePhone(row[phoneCol] || ""),
94
+ name: row["name"] || row["fullname"] || row["full_name"] || undefined,
95
+ email: row["email"] || row["e-mail"] || undefined,
96
+ }));
97
+ if (!isJsonMode()) {
98
+ console.log();
99
+ console.log(colors.dim(`Importing ${contacts.length} contacts from ${args.file}`));
100
+ if (flags.list) {
101
+ console.log(colors.dim(`Adding to list: ${flags.list}`));
102
+ }
103
+ console.log();
104
+ }
105
+ const result = await apiClient.post("/api/v1/contacts/import", {
106
+ contacts,
107
+ listId: flags.list,
108
+ });
109
+ if (isJsonMode()) {
110
+ json(result);
111
+ return;
112
+ }
113
+ success(`Import complete`);
114
+ console.log();
115
+ keyValue([
116
+ ["Imported", colors.success(String(result.imported))],
117
+ ["Skipped (duplicates)", String(result.skippedDuplicates)],
118
+ ["Errors", result.totalErrors > 0 ? colors.error(String(result.totalErrors)) : "0"],
119
+ ]);
120
+ if (result.totalErrors > 0 && result.errors.length > 0) {
121
+ console.log();
122
+ warn(`${result.totalErrors} contacts had errors:`);
123
+ for (const err of result.errors.slice(0, 10)) {
124
+ console.log(colors.dim(` Row ${err.index + 1}: ${err.phone || "(empty)"} - ${err.error}`));
125
+ }
126
+ if (result.totalErrors > 10) {
127
+ console.log(colors.dim(` ... and ${result.totalErrors - 10} more`));
128
+ }
129
+ }
130
+ }
131
+ }
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbnRhY3RzL2ltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsSUFBSSxFQUNKLE9BQU8sRUFDUCxNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFDUixJQUFJLEdBQ0wsTUFBTSxxQkFBcUIsQ0FBQztBQVM3QixTQUFTLGNBQWMsQ0FBQyxHQUFXO0lBQ2pDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDM0IsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEQsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3QixPQUFPLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFD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LENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxXQUFXLHVCQUF1QixDQUFDLENBQUM7WUFDbkQsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssSUFBSSxTQUFTLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQy9FLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsV0FBVyxHQUFHLEVBQUUsRUFBRSxDQUFDO2dCQUM1QixPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxNQUFNLENBQUMsV0FBVyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQ3hELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcmdzLCBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAganNvbixcbiAgc3VjY2VzcyxcbiAgY29sb3JzLFxuICBpc0pzb25Nb2RlLFxuICBrZXlWYWx1ZSxcbiAgd2Fybixcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIEltcG9ydFJlc3BvbnNlIHtcbiAgaW1wb3J0ZWQ6IG51bWJlcjtcbiAgc2tpcHBlZER1cGxpY2F0ZXM6IG51bWJlcjtcbiAgZXJyb3JzOiBBcnJheTx7IGluZGV4OiBudW1iZXI7IHBob25lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47XG4gIHRvdGFsRXJyb3JzOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBob25lKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHBob25lID0gcmF3LnJlcGxhY2UoL1tcXHNcXC1cXChcXClcXC5cXCtdL2csIFwiXCIpO1xuICBpZiAoL15cXGR7MTB9JC8udGVzdChwaG9uZSkpIHtcbiAgICBwaG9uZSA9IFwiMVwiICsgcGhvbmU7XG4gIH1cbiAgaWYgKC9eXFxkezExfSQvLnRlc3QocGhvbmUpICYmIHBob25lLnN0YXJ0c1dpdGgoXCIxXCIpKSB7XG4gICAgcmV0dXJuIFwiK1wiICsgcGhvbmU7XG4gIH1cbiAgaWYgKC9eXFxkezcsMTV9JC8udGVzdChwaG9uZSkpIHtcbiAgICByZXR1cm4gXCIrXCIgKyBwaG9uZTtcbiAgfVxuICBpZiAocmF3LnN0YXJ0c1dpdGgoXCIrXCIpKSB7XG4gICAgcmV0dXJuIFwiK1wiICsgcGhvbmU7XG4gIH1cbiAgcmV0dXJuIHJhdy50cmltKCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ3N2KGNvbnRlbnQ6IHN0cmluZyk6IEFycmF5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKChsKSA9PiBsLnRyaW0oKSk7XG4gIGlmIChsaW5lcy5sZW5ndGggPCAyKSByZXR1cm4gW107XG5cbiAgY29uc3QgaGVhZGVycyA9IGxpbmVzWzBdLnNwbGl0KFwiLFwiKS5tYXAoKGgpID0+IGgudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCByb3dzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBsaW5lc1tpXS5zcGxpdChcIixcIikubWFwKCh2KSA9PiB2LnRyaW0oKSk7XG4gICAgY29uc3Qgcm93OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBoZWFkZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICByb3dbaGVhZGVyc1tqXV0gPSB2YWx1ZXNbal0gfHwgXCJcIjtcbiAgICB9XG4gICAgcm93cy5wdXNoKHJvdyk7XG4gIH1cblxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UGhvbmVDb2x1bW4oaGVhZGVyczogc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICBcInBob25lXCIsXG4gICAgXCJwaG9uZW51bWJlclwiLFxuICAgIFwicGhvbmVfbnVtYmVyXCIsXG4gICAgXCJ0b1wiLFxuICAgIFwibnVtYmVyXCIsXG4gICAgXCJtb2JpbGVcIixcbiAgICBcImNlbGxcIixcbiAgXTtcbiAgZm9yIChjb25zdCBoIG9mIGhlYWRlcnMpIHtcbiAgICBpZiAoY2FuZGlkYXRlcy5pbmNsdWRlcyhoLnRvTG93ZXJDYXNlKCkpKSByZXR1cm4gaDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udGFjdHNJbXBvcnQgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiSW1wb3J0IGNvbnRhY3RzIGZyb20gYSBDU1YgZmlsZVwiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGltcG9ydCBjb250YWN0cy5jc3ZcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGltcG9ydCBjb250YWN0cy5jc3YgLS1saXN0IGxzdF94eHhcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGltcG9ydCBjb250YWN0cy5jc3YgLS1saXN0IGxzdF94eHggLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgZmlsZTogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiUGF0aCB0byBDU1YgZmlsZSAoY29sdW1uczogcGhvbmUsIG5hbWUsIGVtYWlsKVwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBsaXN0OiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJsXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDb250YWN0IGxpc3QgSUQgdG8gYWRkIGltcG9ydGVkIGNvbnRhY3RzIHRvXCIsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncywgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoQ29udGFjdHNJbXBvcnQpO1xuXG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgY29udGVudCA9IHJlYWRGaWxlU3luYyhhcmdzLmZpbGUsIFwidXRmLThcIik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmVycm9yKGBDYW5ub3QgcmVhZCBmaWxlOiAke2FyZ3MuZmlsZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gcGFyc2VDc3YoY29udGVudCk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVycm9yKFwiQ1NWIGZpbGUgaXMgZW1wdHkgb3IgaGFzIG5vIGRhdGEgcm93c1wiKTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMocm93c1swXSk7XG4gICAgY29uc3QgcGhvbmVDb2wgPSBkZXRlY3RQaG9uZUNvbHVtbihoZWFkZXJzKTtcbiAgICBpZiAoIXBob25lQ29sKSB7XG4gICAgICB0aGlzLmVycm9yKFxuICAgICAgICBgTm8gcGhvbmUgY29sdW1uIGZvdW5kLiBFeHBlY3RlZCBvbmUgb2Y6IHBob25lLCBwaG9uZU51bWJlciwgdG8sIG51bWJlciwgbW9iaWxlYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFjdHMgPSByb3dzLm1hcCgocm93KSA9PiAoe1xuICAgICAgcGhvbmU6IG5vcm1hbGl6ZVBob25lKHJvd1twaG9uZUNvbF0gfHwgXCJcIiksXG4gICAgICBuYW1lOiByb3dbXCJuYW1lXCJdIHx8IHJvd1tcImZ1bGxuYW1lXCJdIHx8IHJvd1tcImZ1bGxfbmFtZVwiXSB8fCB1bmRlZmluZWQsXG4gICAgICBlbWFpbDogcm93W1wiZW1haWxcIl0gfHwgcm93W1wiZS1tYWlsXCJdIHx8IHVuZGVmaW5lZCxcbiAgICB9KSk7XG5cbiAgICBpZiAoIWlzSnNvbk1vZGUoKSkge1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjb2xvcnMuZGltKGBJbXBvcnRpbmcgJHtjb250YWN0cy5sZW5ndGh9IGNvbnRhY3RzIGZyb20gJHthcmdzLmZpbGV9YCksXG4gICAgICApO1xuICAgICAgaWYgKGZsYWdzLmxpc3QpIHtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgQWRkaW5nIHRvIGxpc3Q6ICR7ZmxhZ3MubGlzdH1gKSk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PEltcG9ydFJlc3BvbnNlPihcbiAgICAgIFwiL2FwaS92MS9jb250YWN0cy9pbXBvcnRcIixcbiAgICAgIHtcbiAgICAgICAgY29udGFjdHMsXG4gICAgICAgIGxpc3RJZDogZmxhZ3MubGlzdCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24ocmVzdWx0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWNjZXNzKGBJbXBvcnQgY29tcGxldGVgKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAga2V5VmFsdWUoW1xuICAgICAgW1wiSW1wb3J0ZWRcIiwgY29sb3JzLnN1Y2Nlc3MoU3RyaW5nKHJlc3VsdC5pbXBvcnRlZCkpXSxcbiAgICAgIFtcIlNraXBwZWQgKGR1cGxpY2F0ZXMpXCIsIFN0cmluZyhyZXN1bHQuc2tpcHBlZER1cGxpY2F0ZXMpXSxcbiAgICAgIFtcIkVycm9yc1wiLCByZXN1bHQudG90YWxFcnJvcnMgPiAwID8gY29sb3JzLmVycm9yKFN0cmluZyhyZXN1bHQudG90YWxFcnJvcnMpKSA6IFwiMFwiXSxcbiAgICBdKTtcblxuICAgIGlmIChyZXN1bHQudG90YWxFcnJvcnMgPiAwICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIHdhcm4oYCR7cmVzdWx0LnRvdGFsRXJyb3JzfSBjb250YWN0cyBoYWQgZXJyb3JzOmApO1xuICAgICAgZm9yIChjb25zdCBlcnIgb2YgcmVzdWx0LmVycm9ycy5zbGljZSgwLCAxMCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY29sb3JzLmRpbShgICBSb3cgJHtlcnIuaW5kZXggKyAxfTogJHtlcnIucGhvbmUgfHwgXCIoZW1wdHkpXCJ9IC0gJHtlcnIuZXJyb3J9YCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0LnRvdGFsRXJyb3JzID4gMTApIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY29sb3JzLmRpbShgICAuLi4gYW5kICR7cmVzdWx0LnRvdGFsRXJyb3JzIC0gMTB9IG1vcmVgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -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
+ }
@@ -0,0 +1,40 @@
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 ContactsListsCreate extends AuthenticatedCommand {
6
+ static description = "Create a new contact list";
7
+ static examples = [
8
+ '<%= config.bin %> contacts lists create --name "VIP Customers"',
9
+ '<%= config.bin %> contacts lists create --name "Newsletter" --description "Weekly newsletter subscribers"',
10
+ ];
11
+ static flags = {
12
+ ...AuthenticatedCommand.baseFlags,
13
+ name: Flags.string({
14
+ char: "n",
15
+ description: "List name",
16
+ required: true,
17
+ }),
18
+ description: Flags.string({
19
+ char: "d",
20
+ description: "List description",
21
+ }),
22
+ };
23
+ async run() {
24
+ const { flags } = await this.parse(ContactsListsCreate);
25
+ const list = await apiClient.post("/api/v1/contact-lists", {
26
+ name: flags.name,
27
+ description: flags.description,
28
+ });
29
+ if (isJsonMode()) {
30
+ json(list);
31
+ return;
32
+ }
33
+ success("Contact list created", {
34
+ ID: list.id,
35
+ Name: list.name,
36
+ Description: list.description || colors.dim("(none)"),
37
+ });
38
+ }
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbnRhY3RzL2xpc3RzL2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFVM0UsTUFBTSxDQUFDLE9BQU8sT0FBTyxtQkFBb0IsU0FBUSxvQkFBb0I7SUFDbkUsTUFBTSxDQUFDLFdBQVcsR0FBRywyQkFBMkIsQ0FBQztJQUVqRCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLGdFQUFnRTtRQUNoRSwyR0FBMkc7S0FDNUcsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsV0FBVztZQUN4QixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFDRixXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUN4QixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSxrQkFBa0I7U0FDaEMsQ0FBQztLQUNILENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUV4RCxNQUFNLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQWMsdUJBQXVCLEVBQUU7WUFDdEUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztTQUMvQixDQUFDLENBQUM7UUFFSCxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ1gsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsc0JBQXNCLEVBQUU7WUFDOUIsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7U0FDdEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7IHN1Y2Nlc3MsIGpzb24sIGNvbG9ycywgaXNKc29uTW9kZSB9IGZyb20gXCIuLi8uLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBDb250YWN0TGlzdCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNvbnRhY3RfY291bnQ6IG51bWJlcjtcbiAgY3JlYXRlZF9hdDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb250YWN0c0xpc3RzQ3JlYXRlIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIkNyZWF0ZSBhIG5ldyBjb250YWN0IGxpc3RcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgJzwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGxpc3RzIGNyZWF0ZSAtLW5hbWUgXCJWSVAgQ3VzdG9tZXJzXCInLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBjb250YWN0cyBsaXN0cyBjcmVhdGUgLS1uYW1lIFwiTmV3c2xldHRlclwiIC0tZGVzY3JpcHRpb24gXCJXZWVrbHkgbmV3c2xldHRlciBzdWJzY3JpYmVyc1wiJyxcbiAgXTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIG5hbWU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcIm5cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkxpc3QgbmFtZVwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gICAgZGVzY3JpcHRpb246IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkxpc3QgZGVzY3JpcHRpb25cIixcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShDb250YWN0c0xpc3RzQ3JlYXRlKTtcblxuICAgIGNvbnN0IGxpc3QgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxDb250YWN0TGlzdD4oXCIvYXBpL3YxL2NvbnRhY3QtbGlzdHNcIiwge1xuICAgICAgbmFtZTogZmxhZ3MubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBmbGFncy5kZXNjcmlwdGlvbixcbiAgICB9KTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24obGlzdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VjY2VzcyhcIkNvbnRhY3QgbGlzdCBjcmVhdGVkXCIsIHtcbiAgICAgIElEOiBsaXN0LmlkLFxuICAgICAgTmFtZTogbGlzdC5uYW1lLFxuICAgICAgRGVzY3JpcHRpb246IGxpc3QuZGVzY3JpcHRpb24gfHwgY29sb3JzLmRpbShcIihub25lKVwiKSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,14 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class ContactsListsDelete 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 ContactsListsDelete extends AuthenticatedCommand {
7
+ static description = "Delete a contact list (does not delete the contacts)";
8
+ static examples = [
9
+ "<%= config.bin %> contacts lists delete lst_xxx",
10
+ "<%= config.bin %> contacts lists delete lst_xxx --yes",
11
+ ];
12
+ static args = {
13
+ id: Args.string({
14
+ description: "Contact list 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(ContactsListsDelete);
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 list ${colors.code(args.id)}? Contacts will NOT be deleted.`,
34
+ default: false,
35
+ },
36
+ ]);
37
+ if (!confirm) {
38
+ error("Deletion cancelled");
39
+ return;
40
+ }
41
+ }
42
+ await apiClient.delete(`/api/v1/contact-lists/${args.id}`);
43
+ if (isJsonMode()) {
44
+ json({ success: true, deletedId: args.id });
45
+ return;
46
+ }
47
+ success("Contact list deleted", {
48
+ ID: args.id,
49
+ });
50
+ }
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbnRhY3RzL2xpc3RzL2RlbGV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFFaEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxtQkFBb0IsU0FBUSxvQkFBb0I7SUFDbkUsTUFBTSxDQUFDLFdBQVcsR0FBRyxzREFBc0QsQ0FBQztJQUU1RSxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLGlEQUFpRDtRQUNqRCx1REFBdUQ7S0FDeEQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSwyQkFBMkI7WUFDeEMsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsMEJBQTBCO1lBQ3ZDLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNmLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hDO29CQUNFLElBQUksRUFBRSxTQUFTO29CQUNmLElBQUksRUFBRSxTQUFTO29CQUNmLE9BQU8sRUFBRSx3Q0FBd0MsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGlDQUFpQztvQkFDdEcsT0FBTyxFQUFFLEtBQUs7aUJBQ2Y7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQzVCLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFM0QsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLHNCQUFzQixFQUFFO1lBQzlCLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtTQUNaLENBQUMsQ0FBQztJQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcmdzLCBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQgeyBzdWNjZXNzLCBlcnJvciwganNvbiwgY29sb3JzLCBpc0pzb25Nb2RlIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9vdXRwdXQuanNcIjtcbmltcG9ydCBpbnF1aXJlciBmcm9tIFwiaW5xdWlyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udGFjdHNMaXN0c0RlbGV0ZSBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJEZWxldGUgYSBjb250YWN0IGxpc3QgKGRvZXMgbm90IGRlbGV0ZSB0aGUgY29udGFjdHMpXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gY29udGFjdHMgbGlzdHMgZGVsZXRlIGxzdF94eHhcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGxpc3RzIGRlbGV0ZSBsc3RfeHh4IC0teWVzXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbnRhY3QgbGlzdCBJRCB0byBkZWxldGVcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgeWVzOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwieVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiU2tpcCBjb25maXJtYXRpb24gcHJvbXB0XCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShDb250YWN0c0xpc3RzRGVsZXRlKTtcblxuICAgIGlmICghZmxhZ3MueWVzKSB7XG4gICAgICBjb25zdCB7IGNvbmZpcm0gfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImNvbmZpcm1cIixcbiAgICAgICAgICBuYW1lOiBcImNvbmZpcm1cIixcbiAgICAgICAgICBtZXNzYWdlOiBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBsaXN0ICR7Y29sb3JzLmNvZGUoYXJncy5pZCl9PyBDb250YWN0cyB3aWxsIE5PVCBiZSBkZWxldGVkLmAsXG4gICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgaWYgKCFjb25maXJtKSB7XG4gICAgICAgIGVycm9yKFwiRGVsZXRpb24gY2FuY2VsbGVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgYXBpQ2xpZW50LmRlbGV0ZShgL2FwaS92MS9jb250YWN0LWxpc3RzLyR7YXJncy5pZH1gKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24oeyBzdWNjZXNzOiB0cnVlLCBkZWxldGVkSWQ6IGFyZ3MuaWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VjY2VzcyhcIkNvbnRhY3QgbGlzdCBkZWxldGVkXCIsIHtcbiAgICAgIElEOiBhcmdzLmlkLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class ContactsListsGet 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,63 @@
1
+ import { Args } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
3
+ import { apiClient } from "../../../lib/api-client.js";
4
+ import { json, colors, isJsonMode, keyValue, table, } from "../../../lib/output.js";
5
+ export default class ContactsListsGet extends AuthenticatedCommand {
6
+ static description = "Get contact list details";
7
+ static examples = [
8
+ "<%= config.bin %> contacts lists get lst_xxx",
9
+ "<%= config.bin %> contacts lists get lst_xxx --json",
10
+ ];
11
+ static args = {
12
+ id: Args.string({
13
+ description: "Contact list ID",
14
+ required: true,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...AuthenticatedCommand.baseFlags,
19
+ };
20
+ async run() {
21
+ const { args } = await this.parse(ContactsListsGet);
22
+ const list = await apiClient.get(`/api/v1/contact-lists/${args.id}`, { includeContacts: "true", limit: "10" });
23
+ if (isJsonMode()) {
24
+ json(list);
25
+ return;
26
+ }
27
+ console.log();
28
+ console.log(colors.bold(list.name));
29
+ console.log();
30
+ keyValue([
31
+ ["ID", list.id],
32
+ ["Description", list.description || colors.dim("(none)")],
33
+ ["Contacts", String(list.contact_count)],
34
+ ["Created", new Date(list.created_at).toLocaleString()],
35
+ ["Updated", new Date(list.updated_at).toLocaleString()],
36
+ ]);
37
+ if (list.contacts && list.contacts.length > 0) {
38
+ console.log();
39
+ console.log(colors.dim("Contacts:"));
40
+ console.log();
41
+ table(list.contacts, [
42
+ { header: "Phone", key: "phone_number", width: 18 },
43
+ {
44
+ header: "Name",
45
+ key: "name",
46
+ width: 20,
47
+ formatter: (v) => String(v || colors.dim("-")),
48
+ },
49
+ {
50
+ header: "Email",
51
+ key: "email",
52
+ width: 25,
53
+ formatter: (v) => String(v || colors.dim("-")),
54
+ },
55
+ ]);
56
+ if (list.contact_count > 10) {
57
+ console.log();
58
+ console.log(colors.dim(` Showing 10 of ${list.contact_count} contacts`));
59
+ }
60
+ }
61
+ }
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2NvbnRhY3RzL2xpc3RzL2dldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsSUFBSSxFQUNKLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssR0FDTixNQUFNLHdCQUF3QixDQUFDO0FBaUJoQyxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFpQixTQUFRLG9CQUFvQjtJQUNoRSxNQUFNLENBQUMsV0FBVyxHQUFHLDBCQUEwQixDQUFDO0lBRWhELE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsOENBQThDO1FBQzlDLHFEQUFxRDtLQUN0RCxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRztRQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2QsV0FBVyxFQUFFLGlCQUFpQjtZQUM5QixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFcEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUM5Qix5QkFBeUIsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUNsQyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUN6QyxDQUFDO1FBRUYsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNYLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVkLFFBQVEsQ0FBQztZQUNQLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDZixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekQsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN4QyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkQsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3hELENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNyQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFZCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDbkIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtnQkFDbkQ7b0JBQ0UsTUFBTSxFQUFFLE1BQU07b0JBQ2QsR0FBRyxFQUFFLE1BQU07b0JBQ1gsS0FBSyxFQUFFLEVBQUU7b0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQy9DO2dCQUNEO29CQUNFLE1BQU0sRUFBRSxPQUFPO29CQUNmLEdBQUcsRUFBRSxPQUFPO29CQUNaLEtBQUssRUFBRSxFQUFFO29CQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUMvQzthQUNGLENBQUMsQ0FBQztZQUVILElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNkLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLGFBQWEsV0FBVyxDQUFDLENBQzdELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcmdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIGpzb24sXG4gIGNvbG9ycyxcbiAgaXNKc29uTW9kZSxcbiAga2V5VmFsdWUsXG4gIHRhYmxlLFxufSBmcm9tIFwiLi4vLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgQ29udGFjdExpc3REZXRhaWwge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBjb250YWN0X2NvdW50OiBudW1iZXI7XG4gIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICBjb250YWN0cz86IEFycmF5PHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHBob25lX251bWJlcjogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgZW1haWw/OiBzdHJpbmc7XG4gIH0+O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb250YWN0c0xpc3RzR2V0IGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIkdldCBjb250YWN0IGxpc3QgZGV0YWlsc1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGNvbnRhY3RzIGxpc3RzIGdldCBsc3RfeHh4XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBjb250YWN0cyBsaXN0cyBnZXQgbHN0X3h4eCAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBpZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiQ29udGFjdCBsaXN0IElEXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgfTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGFyZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoQ29udGFjdHNMaXN0c0dldCk7XG5cbiAgICBjb25zdCBsaXN0ID0gYXdhaXQgYXBpQ2xpZW50LmdldDxDb250YWN0TGlzdERldGFpbD4oXG4gICAgICBgL2FwaS92MS9jb250YWN0LWxpc3RzLyR7YXJncy5pZH1gLFxuICAgICAgeyBpbmNsdWRlQ29udGFjdHM6IFwidHJ1ZVwiLCBsaW1pdDogXCIxMFwiIH0sXG4gICAgKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24obGlzdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChsaXN0Lm5hbWUpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAga2V5VmFsdWUoW1xuICAgICAgW1wiSURcIiwgbGlzdC5pZF0sXG4gICAgICBbXCJEZXNjcmlwdGlvblwiLCBsaXN0LmRlc2NyaXB0aW9uIHx8IGNvbG9ycy5kaW0oXCIobm9uZSlcIildLFxuICAgICAgW1wiQ29udGFjdHNcIiwgU3RyaW5nKGxpc3QuY29udGFjdF9jb3VudCldLFxuICAgICAgW1wiQ3JlYXRlZFwiLCBuZXcgRGF0ZShsaXN0LmNyZWF0ZWRfYXQpLnRvTG9jYWxlU3RyaW5nKCldLFxuICAgICAgW1wiVXBkYXRlZFwiLCBuZXcgRGF0ZShsaXN0LnVwZGF0ZWRfYXQpLnRvTG9jYWxlU3RyaW5nKCldLFxuICAgIF0pO1xuXG4gICAgaWYgKGxpc3QuY29udGFjdHMgJiYgbGlzdC5jb250YWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIkNvbnRhY3RzOlwiKSk7XG4gICAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgICB0YWJsZShsaXN0LmNvbnRhY3RzLCBbXG4gICAgICAgIHsgaGVhZGVyOiBcIlBob25lXCIsIGtleTogXCJwaG9uZV9udW1iZXJcIiwgd2lkdGg6IDE4IH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXI6IFwiTmFtZVwiLFxuICAgICAgICAgIGtleTogXCJuYW1lXCIsXG4gICAgICAgICAgd2lkdGg6IDIwLFxuICAgICAgICAgIGZvcm1hdHRlcjogKHYpID0+IFN0cmluZyh2IHx8IGNvbG9ycy5kaW0oXCItXCIpKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcjogXCJFbWFpbFwiLFxuICAgICAgICAgIGtleTogXCJlbWFpbFwiLFxuICAgICAgICAgIHdpZHRoOiAyNSxcbiAgICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBTdHJpbmcodiB8fCBjb2xvcnMuZGltKFwiLVwiKSksXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgaWYgKGxpc3QuY29udGFjdF9jb3VudCA+IDEwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNvbG9ycy5kaW0oYCAgU2hvd2luZyAxMCBvZiAke2xpc3QuY29udGFjdF9jb3VudH0gY29udGFjdHNgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class ContactsListsList extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
7
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
8
+ };
9
+ run(): Promise<void>;
10
+ }