@sendly/cli 1.0.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.
- package/README.md +323 -0
- package/bin/run.js +5 -0
- package/dist/commands/config/get.d.ts +13 -0
- package/dist/commands/config/get.js +38 -0
- package/dist/commands/config/list.d.ts +10 -0
- package/dist/commands/config/list.js +45 -0
- package/dist/commands/config/set.d.ts +14 -0
- package/dist/commands/config/set.js +67 -0
- package/dist/commands/credits/balance.d.ts +10 -0
- package/dist/commands/credits/balance.js +38 -0
- package/dist/commands/credits/history.d.ts +11 -0
- package/dist/commands/credits/history.js +88 -0
- package/dist/commands/doctor.d.ts +23 -0
- package/dist/commands/doctor.js +336 -0
- package/dist/commands/keys/create.d.ts +12 -0
- package/dist/commands/keys/create.js +47 -0
- package/dist/commands/keys/list.d.ts +10 -0
- package/dist/commands/keys/list.js +65 -0
- package/dist/commands/keys/revoke.d.ts +15 -0
- package/dist/commands/keys/revoke.js +68 -0
- package/dist/commands/login.d.ts +12 -0
- package/dist/commands/login.js +114 -0
- package/dist/commands/logout.d.ts +10 -0
- package/dist/commands/logout.js +20 -0
- package/dist/commands/logs/tail.d.ts +17 -0
- package/dist/commands/logs/tail.js +183 -0
- package/dist/commands/sms/batch.d.ts +16 -0
- package/dist/commands/sms/batch.js +163 -0
- package/dist/commands/sms/cancel.d.ts +13 -0
- package/dist/commands/sms/cancel.js +46 -0
- package/dist/commands/sms/get.d.ts +13 -0
- package/dist/commands/sms/get.js +51 -0
- package/dist/commands/sms/list.d.ts +12 -0
- package/dist/commands/sms/list.js +79 -0
- package/dist/commands/sms/schedule.d.ts +14 -0
- package/dist/commands/sms/schedule.js +91 -0
- package/dist/commands/sms/scheduled.d.ts +12 -0
- package/dist/commands/sms/scheduled.js +82 -0
- package/dist/commands/sms/send.d.ts +13 -0
- package/dist/commands/sms/send.js +70 -0
- package/dist/commands/webhooks/list.d.ts +10 -0
- package/dist/commands/webhooks/list.js +80 -0
- package/dist/commands/webhooks/listen.d.ts +20 -0
- package/dist/commands/webhooks/listen.js +202 -0
- package/dist/commands/whoami.d.ts +10 -0
- package/dist/commands/whoami.js +51 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +27 -0
- package/dist/lib/api-client.d.ts +52 -0
- package/dist/lib/api-client.js +129 -0
- package/dist/lib/auth.d.ts +52 -0
- package/dist/lib/auth.js +171 -0
- package/dist/lib/base-command.d.ts +17 -0
- package/dist/lib/base-command.js +60 -0
- package/dist/lib/config.d.ts +54 -0
- package/dist/lib/config.js +182 -0
- package/dist/lib/output.d.ts +43 -0
- package/dist/lib/output.js +222 -0
- package/oclif.manifest.json +1147 -0
- package/package.json +98 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
4
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
5
|
+
import { success, error, spinner, colors, json, isJsonMode, } from "../../lib/output.js";
|
|
6
|
+
export default class SmsBatch extends AuthenticatedCommand {
|
|
7
|
+
static description = "Send batch SMS messages";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> sms batch --file recipients.json",
|
|
10
|
+
'<%= config.bin %> sms batch --to +15551234567,+15559876543 --text "Hello everyone!"',
|
|
11
|
+
'<%= config.bin %> sms batch --file recipients.csv --from "Sendly"',
|
|
12
|
+
"<%= config.bin %> sms batch --file messages.json --json",
|
|
13
|
+
];
|
|
14
|
+
static flags = {
|
|
15
|
+
...AuthenticatedCommand.baseFlags,
|
|
16
|
+
file: Flags.string({
|
|
17
|
+
char: "F",
|
|
18
|
+
description: "JSON file with messages array [{to, text}, ...]",
|
|
19
|
+
exclusive: ["to"],
|
|
20
|
+
}),
|
|
21
|
+
to: Flags.string({
|
|
22
|
+
char: "t",
|
|
23
|
+
description: "Comma-separated recipient phone numbers (E.164 format)",
|
|
24
|
+
exclusive: ["file"],
|
|
25
|
+
}),
|
|
26
|
+
text: Flags.string({
|
|
27
|
+
char: "m",
|
|
28
|
+
description: "Message text (used with --to flag)",
|
|
29
|
+
}),
|
|
30
|
+
from: Flags.string({
|
|
31
|
+
char: "f",
|
|
32
|
+
description: "Sender ID or phone number for all messages",
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
35
|
+
async run() {
|
|
36
|
+
const { flags } = await this.parse(SmsBatch);
|
|
37
|
+
let messages = [];
|
|
38
|
+
// Parse messages from file or flags
|
|
39
|
+
if (flags.file) {
|
|
40
|
+
messages = this.parseMessagesFromFile(flags.file);
|
|
41
|
+
}
|
|
42
|
+
else if (flags.to) {
|
|
43
|
+
if (!flags.text) {
|
|
44
|
+
error("--text is required when using --to");
|
|
45
|
+
this.exit(1);
|
|
46
|
+
}
|
|
47
|
+
messages = this.parseMessagesFromFlags(flags.to, flags.text);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
error("Either --file or --to is required");
|
|
51
|
+
this.exit(1);
|
|
52
|
+
}
|
|
53
|
+
// Validate messages
|
|
54
|
+
if (messages.length === 0) {
|
|
55
|
+
error("No messages to send");
|
|
56
|
+
this.exit(1);
|
|
57
|
+
}
|
|
58
|
+
if (messages.length > 1000) {
|
|
59
|
+
error("Batch size cannot exceed 1000 messages", {
|
|
60
|
+
hint: "Split your messages into smaller batches",
|
|
61
|
+
});
|
|
62
|
+
this.exit(1);
|
|
63
|
+
}
|
|
64
|
+
// Validate each message
|
|
65
|
+
for (const msg of messages) {
|
|
66
|
+
if (!/^\+[1-9]\d{1,14}$/.test(msg.to)) {
|
|
67
|
+
error(`Invalid phone number: ${msg.to}`, {
|
|
68
|
+
hint: "Use E.164 format: +15551234567",
|
|
69
|
+
});
|
|
70
|
+
this.exit(1);
|
|
71
|
+
}
|
|
72
|
+
if (!msg.text?.trim()) {
|
|
73
|
+
error(`Empty message text for ${msg.to}`);
|
|
74
|
+
this.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const spin = spinner(`Sending ${messages.length} messages...`);
|
|
78
|
+
spin.start();
|
|
79
|
+
try {
|
|
80
|
+
const response = await apiClient.post("/api/v1/messages/batch", {
|
|
81
|
+
messages,
|
|
82
|
+
...(flags.from && { from: flags.from }),
|
|
83
|
+
});
|
|
84
|
+
spin.stop();
|
|
85
|
+
if (isJsonMode()) {
|
|
86
|
+
json(response);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
success("Batch sent", {
|
|
90
|
+
"Batch ID": response.batchId,
|
|
91
|
+
Total: response.total,
|
|
92
|
+
Queued: colors.success(String(response.queued)),
|
|
93
|
+
Failed: response.failed > 0 ? colors.error(String(response.failed)) : "0",
|
|
94
|
+
"Credits Used": response.creditsUsed,
|
|
95
|
+
Status: response.status,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
spin.stop();
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
parseMessagesFromFile(filePath) {
|
|
104
|
+
try {
|
|
105
|
+
const content = readFileSync(filePath, "utf-8");
|
|
106
|
+
// Try JSON first
|
|
107
|
+
if (filePath.endsWith(".json")) {
|
|
108
|
+
const data = JSON.parse(content);
|
|
109
|
+
if (Array.isArray(data)) {
|
|
110
|
+
return data.map((item) => ({
|
|
111
|
+
to: item.to,
|
|
112
|
+
text: item.text,
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
if (data.messages && Array.isArray(data.messages)) {
|
|
116
|
+
return data.messages;
|
|
117
|
+
}
|
|
118
|
+
error("Invalid JSON format", {
|
|
119
|
+
hint: "Expected array of {to, text} objects or {messages: [...]}",
|
|
120
|
+
});
|
|
121
|
+
this.exit(1);
|
|
122
|
+
}
|
|
123
|
+
// Try CSV
|
|
124
|
+
if (filePath.endsWith(".csv")) {
|
|
125
|
+
const lines = content.trim().split("\n");
|
|
126
|
+
const messages = [];
|
|
127
|
+
// Skip header if present
|
|
128
|
+
const startIndex = lines[0].toLowerCase().includes("to") ? 1 : 0;
|
|
129
|
+
for (let i = startIndex; i < lines.length; i++) {
|
|
130
|
+
const parts = lines[i].split(",");
|
|
131
|
+
if (parts.length >= 2) {
|
|
132
|
+
messages.push({
|
|
133
|
+
to: parts[0].trim().replace(/"/g, ""),
|
|
134
|
+
text: parts.slice(1).join(",").trim().replace(/"/g, ""),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return messages;
|
|
139
|
+
}
|
|
140
|
+
error("Unsupported file format", {
|
|
141
|
+
hint: "Use .json or .csv file",
|
|
142
|
+
});
|
|
143
|
+
this.exit(1);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
if (err.code === "ENOENT") {
|
|
147
|
+
error(`File not found: ${filePath}`);
|
|
148
|
+
}
|
|
149
|
+
else if (err instanceof SyntaxError) {
|
|
150
|
+
error("Invalid JSON in file", { hint: err.message });
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
this.exit(1);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
parseMessagesFromFlags(to, text) {
|
|
159
|
+
const phones = to.split(",").map((p) => p.trim());
|
|
160
|
+
return phones.map((phone) => ({ to: phone, text }));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc21zL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixJQUFJLEVBQ0osVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFnQjdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUyxTQUFRLG9CQUFvQjtJQUN4RCxNQUFNLENBQUMsV0FBVyxHQUFHLHlCQUF5QixDQUFDO0lBRS9DLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsb0RBQW9EO1FBQ3BELHFGQUFxRjtRQUNyRixtRUFBbUU7UUFDbkUseURBQXlEO0tBQzFELENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2pCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLGlEQUFpRDtZQUM5RCxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDbEIsQ0FBQztRQUNGLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2YsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsd0RBQXdEO1lBQ3JFLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztTQUNwQixDQUFDO1FBQ0YsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQUc7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QUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICBzdWNjZXNzLFxuICBlcnJvcixcbiAgc3Bpbm5lcixcbiAgY29sb3JzLFxuICBqc29uLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgQmF0Y2hNZXNzYWdlIHtcbiAgdG86IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQmF0Y2hSZXNwb25zZSB7XG4gIGJhdGNoSWQ6IHN0cmluZztcbiAgdG90YWw6IG51bWJlcjtcbiAgcXVldWVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBjcmVkaXRzVXNlZDogbnVtYmVyO1xuICBzdGF0dXM6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU21zQmF0Y2ggZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiU2VuZCBiYXRjaCBTTVMgbWVzc2FnZXNcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIHJlY2lwaWVudHMuanNvblwiLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS10byArMTU1NTEyMzQ1NjcsKzE1NTU5ODc2NTQzIC0tdGV4dCBcIkhlbGxvIGV2ZXJ5b25lIVwiJyxcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gc21zIGJhdGNoIC0tZmlsZSByZWNpcGllbnRzLmNzdiAtLWZyb20gXCJTZW5kbHlcIicsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBzbXMgYmF0Y2ggLS1maWxlIG1lc3NhZ2VzLmpzb24gLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBmaWxlOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJGXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJKU09OIGZpbGUgd2l0aCBtZXNzYWdlcyBhcnJheSBbe3RvLCB0ZXh0fSwgLi4uXVwiLFxuICAgICAgZXhjbHVzaXZlOiBbXCJ0b1wiXSxcbiAgICB9KSxcbiAgICB0bzogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwidFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQ29tbWEtc2VwYXJhdGVkIHJlY2lwaWVudCBwaG9uZSBudW1iZXJzIChFLjE2NCBmb3JtYXQpXCIsXG4gICAgICBleGNsdXNpdmU6IFtcImZpbGVcIl0sXG4gICAgfSksXG4gICAgdGV4dDogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwibVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiTWVzc2FnZSB0ZXh0ICh1c2VkIHdpdGggLS10byBmbGFnKVwiLFxuICAgIH0pLFxuICAgIGZyb206IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImZcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNlbmRlciBJRCBvciBwaG9uZSBudW1iZXIgZm9yIGFsbCBtZXNzYWdlc1wiLFxuICAgIH0pLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFNtc0JhdGNoKTtcblxuICAgIGxldCBtZXNzYWdlczogQmF0Y2hNZXNzYWdlW10gPSBbXTtcblxuICAgIC8vIFBhcnNlIG1lc3NhZ2VzIGZyb20gZmlsZSBvciBmbGFnc1xuICAgIGlmIChmbGFncy5maWxlKSB7XG4gICAgICBtZXNzYWdlcyA9IHRoaXMucGFyc2VNZXNzYWdlc0Zyb21GaWxlKGZsYWdzLmZpbGUpO1xuICAgIH0gZWxzZSBpZiAoZmxhZ3MudG8pIHtcbiAgICAgIGlmICghZmxhZ3MudGV4dCkge1xuICAgICAgICBlcnJvcihcIi0tdGV4dCBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIC0tdG9cIik7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIG1lc3NhZ2VzID0gdGhpcy5wYXJzZU1lc3NhZ2VzRnJvbUZsYWdzKGZsYWdzLnRvLCBmbGFncy50ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoXCJFaXRoZXIgLS1maWxlIG9yIC0tdG8gaXMgcmVxdWlyZWRcIik7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWVzc2FnZXNcbiAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlcnJvcihcIk5vIG1lc3NhZ2VzIHRvIHNlbmRcIik7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgIGVycm9yKFwiQmF0Y2ggc2l6ZSBjYW5ub3QgZXhjZWVkIDEwMDAgbWVzc2FnZXNcIiwge1xuICAgICAgICBoaW50OiBcIlNwbGl0IHlvdXIgbWVzc2FnZXMgaW50byBzbWFsbGVyIGJhdGNoZXNcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggbWVzc2FnZVxuICAgIGZvciAoY29uc3QgbXNnIG9mIG1lc3NhZ2VzKSB7XG4gICAgICBpZiAoIS9eXFwrWzEtOV1cXGR7MSwxNH0kLy50ZXN0KG1zZy50bykpIHtcbiAgICAgICAgZXJyb3IoYEludmFsaWQgcGhvbmUgbnVtYmVyOiAke21zZy50b31gLCB7XG4gICAgICAgICAgaGludDogXCJVc2UgRS4xNjQgZm9ybWF0OiArMTU1NTEyMzQ1NjdcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGlmICghbXNnLnRleHQ/LnRyaW0oKSkge1xuICAgICAgICBlcnJvcihgRW1wdHkgbWVzc2FnZSB0ZXh0IGZvciAke21zZy50b31gKTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKGBTZW5kaW5nICR7bWVzc2FnZXMubGVuZ3RofSBtZXNzYWdlcy4uLmApO1xuICAgIHNwaW4uc3RhcnQoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PEJhdGNoUmVzcG9uc2U+KFxuICAgICAgICBcIi9hcGkvdjEvbWVzc2FnZXMvYmF0Y2hcIixcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2VzLFxuICAgICAgICAgIC4uLihmbGFncy5mcm9tICYmIHsgZnJvbTogZmxhZ3MuZnJvbSB9KSxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN1Y2Nlc3MoXCJCYXRjaCBzZW50XCIsIHtcbiAgICAgICAgXCJCYXRjaCBJRFwiOiByZXNwb25zZS5iYXRjaElkLFxuICAgICAgICBUb3RhbDogcmVzcG9uc2UudG90YWwsXG4gICAgICAgIFF1ZXVlZDogY29sb3JzLnN1Y2Nlc3MoU3RyaW5nKHJlc3BvbnNlLnF1ZXVlZCkpLFxuICAgICAgICBGYWlsZWQ6XG4gICAgICAgICAgcmVzcG9uc2UuZmFpbGVkID4gMCA/IGNvbG9ycy5lcnJvcihTdHJpbmcocmVzcG9uc2UuZmFpbGVkKSkgOiBcIjBcIixcbiAgICAgICAgXCJDcmVkaXRzIFVzZWRcIjogcmVzcG9uc2UuY3JlZGl0c1VzZWQsXG4gICAgICAgIFN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzcGluLnN0b3AoKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTWVzc2FnZXNGcm9tRmlsZShmaWxlUGF0aDogc3RyaW5nKTogQmF0Y2hNZXNzYWdlW10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgICAvLyBUcnkgSlNPTiBmaXJzdFxuICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgdG86IGl0ZW0udG8sXG4gICAgICAgICAgICB0ZXh0OiBpdGVtLnRleHQsXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLm1lc3NhZ2VzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5tZXNzYWdlcykpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5tZXNzYWdlcztcbiAgICAgICAgfVxuICAgICAgICBlcnJvcihcIkludmFsaWQgSlNPTiBmb3JtYXRcIiwge1xuICAgICAgICAgIGhpbnQ6IFwiRXhwZWN0ZWQgYXJyYXkgb2Yge3RvLCB0ZXh0fSBvYmplY3RzIG9yIHttZXNzYWdlczogWy4uLl19XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyeSBDU1ZcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aChcIi5jc3ZcIikpIHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnRyaW0oKS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXM6IEJhdGNoTWVzc2FnZVtdID0gW107XG5cbiAgICAgICAgLy8gU2tpcCBoZWFkZXIgaWYgcHJlc2VudFxuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gbGluZXNbMF0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcInRvXCIpID8gMSA6IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gbGluZXNbaV0uc3BsaXQoXCIsXCIpO1xuICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgIHRvOiBwYXJ0c1swXS50cmltKCkucmVwbGFjZSgvXCIvZywgXCJcIiksXG4gICAgICAgICAgICAgIHRleHQ6IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIsXCIpLnRyaW0oKS5yZXBsYWNlKC9cIi9nLCBcIlwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZXM7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKFwiVW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXRcIiwge1xuICAgICAgICBoaW50OiBcIlVzZSAuanNvbiBvciAuY3N2IGZpbGVcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKChlcnIgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIGVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgICAgZXJyb3IoXCJJbnZhbGlkIEpTT04gaW4gZmlsZVwiLCB7IGhpbnQ6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VNZXNzYWdlc0Zyb21GbGFncyh0bzogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBCYXRjaE1lc3NhZ2VbXSB7XG4gICAgY29uc3QgcGhvbmVzID0gdG8uc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuICAgIHJldHVybiBwaG9uZXMubWFwKChwaG9uZSkgPT4gKHsgdG86IHBob25lLCB0ZXh0IH0pKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class SmsCancel 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,46 @@
|
|
|
1
|
+
import { Args } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
4
|
+
import { success, error, spinner, json, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
export default class SmsCancel extends AuthenticatedCommand {
|
|
6
|
+
static description = "Cancel a scheduled message";
|
|
7
|
+
static examples = [
|
|
8
|
+
"<%= config.bin %> sms cancel sched_abc123",
|
|
9
|
+
"<%= config.bin %> sms cancel sched_abc123 --json",
|
|
10
|
+
];
|
|
11
|
+
static args = {
|
|
12
|
+
id: Args.string({
|
|
13
|
+
description: "Scheduled message ID to cancel",
|
|
14
|
+
required: true,
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
static flags = {
|
|
18
|
+
...AuthenticatedCommand.baseFlags,
|
|
19
|
+
};
|
|
20
|
+
async run() {
|
|
21
|
+
const { args } = await this.parse(SmsCancel);
|
|
22
|
+
if (!args.id.trim()) {
|
|
23
|
+
error("Scheduled message ID is required");
|
|
24
|
+
this.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const spin = spinner("Cancelling scheduled message...");
|
|
27
|
+
spin.start();
|
|
28
|
+
try {
|
|
29
|
+
const response = await apiClient.delete(`/api/v1/messages/scheduled/${encodeURIComponent(args.id)}`);
|
|
30
|
+
spin.stop();
|
|
31
|
+
if (isJsonMode()) {
|
|
32
|
+
json(response);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
success("Scheduled message cancelled", {
|
|
36
|
+
ID: response.id,
|
|
37
|
+
Status: "cancelled",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
spin.stop();
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3Ntcy9jYW5jZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsT0FBTyxFQUNQLElBQUksRUFDSixVQUFVLEdBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQVE3QixNQUFNLENBQUMsT0FBTyxPQUFPLFNBQVUsU0FBUSxvQkFBb0I7SUFDekQsTUFBTSxDQUFDLFdBQVcsR0FBRyw0QkFBNEIsQ0FBQztJQUVsRCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDJDQUEyQztRQUMzQyxrREFBa0Q7S0FDbkQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxnQ0FBZ0M7WUFDN0MsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7S0FDbEMsQ0FBQztJQUVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUNyQyw4QkFBOEIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQzVELENBQUM7WUFFRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFWixJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDZixPQUFPO1lBQ1QsQ0FBQztZQUVELE9BQU8sQ0FBQyw2QkFBNkIsRUFBRTtnQkFDckMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUNmLE1BQU0sRUFBRSxXQUFXO2FBQ3BCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIHNwaW5uZXIsXG4gIGpzb24sXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBDYW5jZWxSZXNwb25zZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbXNDYW5jZWwgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiQ2FuY2VsIGEgc2NoZWR1bGVkIG1lc3NhZ2VcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBzbXMgY2FuY2VsIHNjaGVkX2FiYzEyM1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGNhbmNlbCBzY2hlZF9hYmMxMjMgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNjaGVkdWxlZCBtZXNzYWdlIElEIHRvIGNhbmNlbFwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFNtc0NhbmNlbCk7XG5cbiAgICBpZiAoIWFyZ3MuaWQudHJpbSgpKSB7XG4gICAgICBlcnJvcihcIlNjaGVkdWxlZCBtZXNzYWdlIElEIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHNwaW4gPSBzcGlubmVyKFwiQ2FuY2VsbGluZyBzY2hlZHVsZWQgbWVzc2FnZS4uLlwiKTtcbiAgICBzcGluLnN0YXJ0KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQuZGVsZXRlPENhbmNlbFJlc3BvbnNlPihcbiAgICAgICAgYC9hcGkvdjEvbWVzc2FnZXMvc2NoZWR1bGVkLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3MuaWQpfWBcbiAgICAgICk7XG5cbiAgICAgIHNwaW4uc3RvcCgpO1xuXG4gICAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN1Y2Nlc3MoXCJTY2hlZHVsZWQgbWVzc2FnZSBjYW5jZWxsZWRcIiwge1xuICAgICAgICBJRDogcmVzcG9uc2UuaWQsXG4gICAgICAgIFN0YXR1czogXCJjYW5jZWxsZWRcIixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc3Bpbi5zdG9wKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class SmsGet 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 { keyValue, json, header, formatStatus, formatDate, formatCredits, formatPhone, colors, divider, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
export default class SmsGet extends AuthenticatedCommand {
|
|
6
|
+
static description = "Get details of a specific message";
|
|
7
|
+
static examples = [
|
|
8
|
+
"<%= config.bin %> sms get msg_abc123",
|
|
9
|
+
"<%= config.bin %> sms get msg_abc123 --json",
|
|
10
|
+
];
|
|
11
|
+
static args = {
|
|
12
|
+
id: Args.string({
|
|
13
|
+
description: "Message ID",
|
|
14
|
+
required: true,
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
static flags = {
|
|
18
|
+
...AuthenticatedCommand.baseFlags,
|
|
19
|
+
};
|
|
20
|
+
async run() {
|
|
21
|
+
const { args } = await this.parse(SmsGet);
|
|
22
|
+
const message = await apiClient.get(`/api/v1/messages/${encodeURIComponent(args.id)}`);
|
|
23
|
+
if (isJsonMode()) {
|
|
24
|
+
json(message);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
header("Message Details");
|
|
28
|
+
keyValue({
|
|
29
|
+
ID: message.id,
|
|
30
|
+
To: formatPhone(message.to),
|
|
31
|
+
From: message.from || colors.dim("(default)"),
|
|
32
|
+
Status: formatStatus(message.status),
|
|
33
|
+
Segments: message.segments,
|
|
34
|
+
Credits: formatCredits(message.creditsUsed),
|
|
35
|
+
Sandbox: message.isSandbox ? colors.warning("Yes") : "No",
|
|
36
|
+
Created: formatDate(message.createdAt),
|
|
37
|
+
...(message.deliveredAt && {
|
|
38
|
+
Delivered: formatDate(message.deliveredAt),
|
|
39
|
+
}),
|
|
40
|
+
...(message.error && {
|
|
41
|
+
Error: colors.error(message.error),
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
divider();
|
|
45
|
+
console.log(colors.bold("Message Text:"));
|
|
46
|
+
console.log(colors.dim("─".repeat(40)));
|
|
47
|
+
console.log(message.text);
|
|
48
|
+
console.log();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3Ntcy9nZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBQ0osTUFBTSxFQUNOLFlBQVksRUFDWixVQUFVLEVBQ1YsYUFBYSxFQUNiLFdBQVcsRUFDWCxNQUFNLEVBQ04sT0FBTyxFQUNQLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBZ0I3QixNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU8sU0FBUSxvQkFBb0I7SUFDdEQsTUFBTSxDQUFDLFdBQVcsR0FBRyxtQ0FBbUMsQ0FBQztJQUV6RCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLHNDQUFzQztRQUN0Qyw2Q0FBNkM7S0FDOUMsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO0tBQ2xDLENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFMUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUNqQyxvQkFBb0Isa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQ2xELENBQUM7UUFFRixJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUxQixRQUFRLENBQUM7WUFDUCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDZCxFQUFFLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDN0MsTUFBTSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3BDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDM0MsT0FBTyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDekQsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ3RDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJO2dCQUN6QixTQUFTLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7YUFDM0MsQ0FBQztZQUNGLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJO2dCQUNuQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2FBQ25DLENBQUM7U0FDSCxDQUFDLENBQUM7UUFFSCxPQUFPLEVBQUUsQ0FBQztRQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAga2V5VmFsdWUsXG4gIGpzb24sXG4gIGhlYWRlcixcbiAgZm9ybWF0U3RhdHVzLFxuICBmb3JtYXREYXRlLFxuICBmb3JtYXRDcmVkaXRzLFxuICBmb3JtYXRQaG9uZSxcbiAgY29sb3JzLFxuICBkaXZpZGVyLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgTWVzc2FnZSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRvOiBzdHJpbmc7XG4gIGZyb206IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgc2VnbWVudHM6IG51bWJlcjtcbiAgY3JlZGl0c1VzZWQ6IG51bWJlcjtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIGRlbGl2ZXJlZEF0Pzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbiAgaXNTYW5kYm94OiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbXNHZXQgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiR2V0IGRldGFpbHMgb2YgYSBzcGVjaWZpYyBtZXNzYWdlXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGdldCBtc2dfYWJjMTIzXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBzbXMgZ2V0IG1zZ19hYmMxMjMgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk1lc3NhZ2UgSURcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShTbXNHZXQpO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8TWVzc2FnZT4oXG4gICAgICBgL2FwaS92MS9tZXNzYWdlcy8ke2VuY29kZVVSSUNvbXBvbmVudChhcmdzLmlkKX1gXG4gICAgKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24obWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaGVhZGVyKFwiTWVzc2FnZSBEZXRhaWxzXCIpO1xuXG4gICAga2V5VmFsdWUoe1xuICAgICAgSUQ6IG1lc3NhZ2UuaWQsXG4gICAgICBUbzogZm9ybWF0UGhvbmUobWVzc2FnZS50byksXG4gICAgICBGcm9tOiBtZXNzYWdlLmZyb20gfHwgY29sb3JzLmRpbShcIihkZWZhdWx0KVwiKSxcbiAgICAgIFN0YXR1czogZm9ybWF0U3RhdHVzKG1lc3NhZ2Uuc3RhdHVzKSxcbiAgICAgIFNlZ21lbnRzOiBtZXNzYWdlLnNlZ21lbnRzLFxuICAgICAgQ3JlZGl0czogZm9ybWF0Q3JlZGl0cyhtZXNzYWdlLmNyZWRpdHNVc2VkKSxcbiAgICAgIFNhbmRib3g6IG1lc3NhZ2UuaXNTYW5kYm94ID8gY29sb3JzLndhcm5pbmcoXCJZZXNcIikgOiBcIk5vXCIsXG4gICAgICBDcmVhdGVkOiBmb3JtYXREYXRlKG1lc3NhZ2UuY3JlYXRlZEF0KSxcbiAgICAgIC4uLihtZXNzYWdlLmRlbGl2ZXJlZEF0ICYmIHtcbiAgICAgICAgRGVsaXZlcmVkOiBmb3JtYXREYXRlKG1lc3NhZ2UuZGVsaXZlcmVkQXQpLFxuICAgICAgfSksXG4gICAgICAuLi4obWVzc2FnZS5lcnJvciAmJiB7XG4gICAgICAgIEVycm9yOiBjb2xvcnMuZXJyb3IobWVzc2FnZS5lcnJvciksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGRpdmlkZXIoKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChcIk1lc3NhZ2UgVGV4dDpcIikpO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCLilIBcIi5yZXBlYXQoNDApKSk7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZS50ZXh0KTtcbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class SmsList 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
|
+
status: 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,79 @@
|
|
|
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, formatStatus, formatRelativeTime, formatPhone, colors, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
export default class SmsList extends AuthenticatedCommand {
|
|
6
|
+
static description = "List sent messages";
|
|
7
|
+
static examples = [
|
|
8
|
+
"<%= config.bin %> sms list",
|
|
9
|
+
"<%= config.bin %> sms list --limit 10",
|
|
10
|
+
"<%= config.bin %> sms list --status delivered",
|
|
11
|
+
"<%= config.bin %> sms list --json",
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
...AuthenticatedCommand.baseFlags,
|
|
15
|
+
limit: Flags.integer({
|
|
16
|
+
char: "l",
|
|
17
|
+
description: "Number of messages to show",
|
|
18
|
+
default: 20,
|
|
19
|
+
}),
|
|
20
|
+
status: Flags.string({
|
|
21
|
+
char: "s",
|
|
22
|
+
description: "Filter by status (queued, sent, delivered, failed)",
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
async run() {
|
|
26
|
+
const { flags } = await this.parse(SmsList);
|
|
27
|
+
const response = await apiClient.get("/api/v1/messages", {
|
|
28
|
+
limit: flags.limit,
|
|
29
|
+
...(flags.status && { status: flags.status }),
|
|
30
|
+
});
|
|
31
|
+
if (isJsonMode()) {
|
|
32
|
+
json(response);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (response.data.length === 0) {
|
|
36
|
+
info("No messages found");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
console.log();
|
|
40
|
+
console.log(colors.dim(`Showing ${response.data.length} of ${response.count} messages`));
|
|
41
|
+
console.log();
|
|
42
|
+
table(response.data, [
|
|
43
|
+
{
|
|
44
|
+
header: "ID",
|
|
45
|
+
key: "id",
|
|
46
|
+
width: 20,
|
|
47
|
+
formatter: (v) => colors.dim(String(v).slice(0, 16) + "..."),
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
header: "To",
|
|
51
|
+
key: "to",
|
|
52
|
+
width: 18,
|
|
53
|
+
formatter: (v) => formatPhone(String(v)),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
header: "Status",
|
|
57
|
+
key: "status",
|
|
58
|
+
width: 12,
|
|
59
|
+
formatter: (v) => formatStatus(String(v)),
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
header: "Text",
|
|
63
|
+
key: "text",
|
|
64
|
+
width: 30,
|
|
65
|
+
formatter: (v) => {
|
|
66
|
+
const text = String(v);
|
|
67
|
+
return text.length > 27 ? text.slice(0, 27) + "..." : text;
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
header: "Sent",
|
|
72
|
+
key: "createdAt",
|
|
73
|
+
width: 12,
|
|
74
|
+
formatter: (v) => formatRelativeTime(String(v)),
|
|
75
|
+
},
|
|
76
|
+
]);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zbXMvbGlzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osWUFBWSxFQUNaLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gsTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBbUI3QixNQUFNLENBQUMsT0FBTyxPQUFPLE9BQVEsU0FBUSxvQkFBb0I7SUFDdkQsTUFBTSxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQztJQUUxQyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDRCQUE0QjtRQUM1Qix1Q0FBdUM7UUFDdkMsK0NBQStDO1FBQy9DLG1DQUFtQztLQUNwQyxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNuQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSw0QkFBNEI7WUFDekMsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBQ0YsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDbkIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsb0RBQW9EO1NBQ2xFLENBQUM7S0FDSCxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FDbEMsa0JBQWtCLEVBQ2xCO1lBQ0UsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ2xCLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM5QyxDQUNGLENBQUM7UUFFRixJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzFCLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLE9BQU8sUUFBUSxDQUFDLEtBQUssV0FBVyxDQUFDLENBQzVFLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFZCxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNuQjtnQkFDRSxNQUFNLEVBQUUsSUFBSTtnQkFDWixHQUFHLEVBQUUsSUFBSTtnQkFDVCxLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQzdEO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLElBQUk7Z0JBQ1osR0FBRyxFQUFFLElBQUk7Z0JBQ1QsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pDO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEdBQUcsRUFBRSxRQUFRO2dCQUNiLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxQztZQUNEO2dCQUNFLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNmLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkIsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzdELENBQUM7YUFDRjtZQUNEO2dCQUNFLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoRDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICB0YWJsZSxcbiAganNvbixcbiAgaW5mbyxcbiAgZm9ybWF0U3RhdHVzLFxuICBmb3JtYXRSZWxhdGl2ZVRpbWUsXG4gIGZvcm1hdFBob25lLFxuICBjb2xvcnMsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBNZXNzYWdlIHtcbiAgaWQ6IHN0cmluZztcbiAgdG86IHN0cmluZztcbiAgZnJvbTogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBzZWdtZW50czogbnVtYmVyO1xuICBjcmVkaXRzVXNlZDogbnVtYmVyO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgZGVsaXZlcmVkQXQ/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBMaXN0TWVzc2FnZXNSZXNwb25zZSB7XG4gIGRhdGE6IE1lc3NhZ2VbXTtcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU21zTGlzdCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJMaXN0IHNlbnQgbWVzc2FnZXNcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBzbXMgbGlzdFwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGxpc3QgLS1saW1pdCAxMFwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gc21zIGxpc3QgLS1zdGF0dXMgZGVsaXZlcmVkXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBzbXMgbGlzdCAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIGxpbWl0OiBGbGFncy5pbnRlZ2VyKHtcbiAgICAgIGNoYXI6IFwibFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIHNob3dcIixcbiAgICAgIGRlZmF1bHQ6IDIwLFxuICAgIH0pLFxuICAgIHN0YXR1czogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwic1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRmlsdGVyIGJ5IHN0YXR1cyAocXVldWVkLCBzZW50LCBkZWxpdmVyZWQsIGZhaWxlZClcIixcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShTbXNMaXN0KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LmdldDxMaXN0TWVzc2FnZXNSZXNwb25zZT4oXG4gICAgICBcIi9hcGkvdjEvbWVzc2FnZXNcIixcbiAgICAgIHtcbiAgICAgICAgbGltaXQ6IGZsYWdzLmxpbWl0LFxuICAgICAgICAuLi4oZmxhZ3Muc3RhdHVzICYmIHsgc3RhdHVzOiBmbGFncy5zdGF0dXMgfSksXG4gICAgICB9XG4gICAgKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyhcIk5vIG1lc3NhZ2VzIGZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjb2xvcnMuZGltKGBTaG93aW5nICR7cmVzcG9uc2UuZGF0YS5sZW5ndGh9IG9mICR7cmVzcG9uc2UuY291bnR9IG1lc3NhZ2VzYClcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICB0YWJsZShyZXNwb25zZS5kYXRhLCBbXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJJRFwiLFxuICAgICAgICBrZXk6IFwiaWRcIixcbiAgICAgICAgd2lkdGg6IDIwLFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBjb2xvcnMuZGltKFN0cmluZyh2KS5zbGljZSgwLCAxNikgKyBcIi4uLlwiKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJUb1wiLFxuICAgICAgICBrZXk6IFwidG9cIixcbiAgICAgICAgd2lkdGg6IDE4LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBmb3JtYXRQaG9uZShTdHJpbmcodikpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlN0YXR1c1wiLFxuICAgICAgICBrZXk6IFwic3RhdHVzXCIsXG4gICAgICAgIHdpZHRoOiAxMixcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4gZm9ybWF0U3RhdHVzKFN0cmluZyh2KSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiVGV4dFwiLFxuICAgICAgICBrZXk6IFwidGV4dFwiLFxuICAgICAgICB3aWR0aDogMzAsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gU3RyaW5nKHYpO1xuICAgICAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCA+IDI3ID8gdGV4dC5zbGljZSgwLCAyNykgKyBcIi4uLlwiIDogdGV4dDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJTZW50XCIsXG4gICAgICAgIGtleTogXCJjcmVhdGVkQXRcIixcbiAgICAgICAgd2lkdGg6IDEyLFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBmb3JtYXRSZWxhdGl2ZVRpbWUoU3RyaW5nKHYpKSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class SmsSchedule extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
to: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
7
|
+
text: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
8
|
+
at: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
9
|
+
from: 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,91 @@
|
|
|
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, error, spinner, colors, formatStatus, json, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
export default class SmsSchedule extends AuthenticatedCommand {
|
|
6
|
+
static description = "Schedule an SMS message for future delivery";
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> sms schedule --to +15551234567 --text "Reminder!" --at "2025-01-20T10:00:00Z"',
|
|
9
|
+
'<%= config.bin %> sms schedule --to +15551234567 --text "Meeting in 1 hour" --at "2025-01-15T14:00:00Z" --from "Sendly"',
|
|
10
|
+
'<%= config.bin %> sms schedule --to +15551234567 --text "Hello!" --at "2025-01-20T10:00:00Z" --json',
|
|
11
|
+
];
|
|
12
|
+
static flags = {
|
|
13
|
+
...AuthenticatedCommand.baseFlags,
|
|
14
|
+
to: Flags.string({
|
|
15
|
+
char: "t",
|
|
16
|
+
description: "Recipient phone number (E.164 format)",
|
|
17
|
+
required: true,
|
|
18
|
+
}),
|
|
19
|
+
text: Flags.string({
|
|
20
|
+
char: "m",
|
|
21
|
+
description: "Message text",
|
|
22
|
+
required: true,
|
|
23
|
+
}),
|
|
24
|
+
at: Flags.string({
|
|
25
|
+
char: "a",
|
|
26
|
+
description: "Scheduled time (ISO 8601 format, e.g., 2025-01-20T10:00:00Z)",
|
|
27
|
+
required: true,
|
|
28
|
+
}),
|
|
29
|
+
from: Flags.string({
|
|
30
|
+
char: "f",
|
|
31
|
+
description: "Sender ID or phone number",
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
async run() {
|
|
35
|
+
const { flags } = await this.parse(SmsSchedule);
|
|
36
|
+
// Validate phone number format
|
|
37
|
+
if (!/^\+[1-9]\d{1,14}$/.test(flags.to)) {
|
|
38
|
+
error("Invalid phone number format", {
|
|
39
|
+
hint: "Use E.164 format: +15551234567",
|
|
40
|
+
});
|
|
41
|
+
this.exit(1);
|
|
42
|
+
}
|
|
43
|
+
// Validate message text
|
|
44
|
+
if (!flags.text.trim()) {
|
|
45
|
+
error("Message text cannot be empty");
|
|
46
|
+
this.exit(1);
|
|
47
|
+
}
|
|
48
|
+
// Validate scheduled time
|
|
49
|
+
const scheduledDate = new Date(flags.at);
|
|
50
|
+
if (isNaN(scheduledDate.getTime())) {
|
|
51
|
+
error("Invalid scheduled time format", {
|
|
52
|
+
hint: "Use ISO 8601 format: 2025-01-20T10:00:00Z",
|
|
53
|
+
});
|
|
54
|
+
this.exit(1);
|
|
55
|
+
}
|
|
56
|
+
// Check if scheduled time is in the future
|
|
57
|
+
if (scheduledDate.getTime() <= Date.now()) {
|
|
58
|
+
error("Scheduled time must be in the future", {
|
|
59
|
+
hint: "The scheduled time must be at least 1 minute from now",
|
|
60
|
+
});
|
|
61
|
+
this.exit(1);
|
|
62
|
+
}
|
|
63
|
+
const spin = spinner("Scheduling message...");
|
|
64
|
+
spin.start();
|
|
65
|
+
try {
|
|
66
|
+
const response = await apiClient.post("/api/v1/messages/schedule", {
|
|
67
|
+
to: flags.to,
|
|
68
|
+
text: flags.text,
|
|
69
|
+
scheduledAt: flags.at,
|
|
70
|
+
...(flags.from && { from: flags.from }),
|
|
71
|
+
});
|
|
72
|
+
spin.stop();
|
|
73
|
+
if (isJsonMode()) {
|
|
74
|
+
json(response);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const formattedTime = new Date(response.scheduledAt).toLocaleString();
|
|
78
|
+
success("Message scheduled", {
|
|
79
|
+
ID: response.id,
|
|
80
|
+
To: response.to,
|
|
81
|
+
Status: formatStatus(response.status),
|
|
82
|
+
"Scheduled For": colors.code(formattedTime),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
spin.stop();
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc21zL3NjaGVkdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFDTCxPQUFPLEVBQ1AsS0FBSyxFQUNMLE9BQU8sRUFDUCxNQUFNLEVBQ04sWUFBWSxFQUNaLElBQUksRUFDSixVQUFVLEdBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQVk3QixNQUFNLENBQUMsT0FBTyxPQUFPLFdBQVksU0FBUSxvQkFBb0I7SUFDM0QsTUFBTSxDQUFDLFdBQVcsR0FBRyw2Q0FBNkMsQ0FBQztJQUVuRSxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLGlHQUFpRztRQUNqRyx5SEFBeUg7UUFDekgscUdBQXFHO0tBQ3RHLENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2YsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsdUNBQXVDO1lBQ3BELFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztRQUNGLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2pCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLGNBQWM7WUFDM0IsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FBQ0YsRUFBRSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDZixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFDVCw4REFBOEQ7WUFDaEUsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FBQ0YsSUFBSSxF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QUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIHNwaW5uZXIsXG4gIGNvbG9ycyxcbiAgZm9ybWF0U3RhdHVzLFxuICBqc29uLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgU2NoZWR1bGVkTWVzc2FnZVJlc3BvbnNlIHtcbiAgaWQ6IHN0cmluZztcbiAgdG86IHN0cmluZztcbiAgZnJvbT86IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgc2NoZWR1bGVkQXQ6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNtc1NjaGVkdWxlIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIlNjaGVkdWxlIGFuIFNNUyBtZXNzYWdlIGZvciBmdXR1cmUgZGVsaXZlcnlcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBzY2hlZHVsZSAtLXRvICsxNTU1MTIzNDU2NyAtLXRleHQgXCJSZW1pbmRlciFcIiAtLWF0IFwiMjAyNS0wMS0yMFQxMDowMDowMFpcIicsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHNtcyBzY2hlZHVsZSAtLXRvICsxNTU1MTIzNDU2NyAtLXRleHQgXCJNZWV0aW5nIGluIDEgaG91clwiIC0tYXQgXCIyMDI1LTAxLTE1VDE0OjAwOjAwWlwiIC0tZnJvbSBcIlNlbmRseVwiJyxcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gc21zIHNjaGVkdWxlIC0tdG8gKzE1NTUxMjM0NTY3IC0tdGV4dCBcIkhlbGxvIVwiIC0tYXQgXCIyMDI1LTAxLTIwVDEwOjAwOjAwWlwiIC0tanNvbicsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICB0bzogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwidFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUmVjaXBpZW50IHBob25lIG51bWJlciAoRS4xNjQgZm9ybWF0KVwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gICAgdGV4dDogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwibVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiTWVzc2FnZSB0ZXh0XCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgICBhdDogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwiYVwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU2NoZWR1bGVkIHRpbWUgKElTTyA4NjAxIGZvcm1hdCwgZS5nLiwgMjAyNS0wMS0yMFQxMDowMDowMFopXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgICBmcm9tOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJmXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJTZW5kZXIgSUQgb3IgcGhvbmUgbnVtYmVyXCIsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoU21zU2NoZWR1bGUpO1xuXG4gICAgLy8gVmFsaWRhdGUgcGhvbmUgbnVtYmVyIGZvcm1hdFxuICAgIGlmICghL15cXCtbMS05XVxcZHsxLDE0fSQvLnRlc3QoZmxhZ3MudG8pKSB7XG4gICAgICBlcnJvcihcIkludmFsaWQgcGhvbmUgbnVtYmVyIGZvcm1hdFwiLCB7XG4gICAgICAgIGhpbnQ6IFwiVXNlIEUuMTY0IGZvcm1hdDogKzE1NTUxMjM0NTY3XCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtZXNzYWdlIHRleHRcbiAgICBpZiAoIWZsYWdzLnRleHQudHJpbSgpKSB7XG4gICAgICBlcnJvcihcIk1lc3NhZ2UgdGV4dCBjYW5ub3QgYmUgZW1wdHlcIik7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgc2NoZWR1bGVkIHRpbWVcbiAgICBjb25zdCBzY2hlZHVsZWREYXRlID0gbmV3IERhdGUoZmxhZ3MuYXQpO1xuICAgIGlmIChpc05hTihzY2hlZHVsZWREYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIGVycm9yKFwiSW52YWxpZCBzY2hlZHVsZWQgdGltZSBmb3JtYXRcIiwge1xuICAgICAgICBoaW50OiBcIlVzZSBJU08gODYwMSBmb3JtYXQ6IDIwMjUtMDEtMjBUMTA6MDA6MDBaXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBzY2hlZHVsZWQgdGltZSBpcyBpbiB0aGUgZnV0dXJlXG4gICAgaWYgKHNjaGVkdWxlZERhdGUuZ2V0VGltZSgpIDw9IERhdGUubm93KCkpIHtcbiAgICAgIGVycm9yKFwiU2NoZWR1bGVkIHRpbWUgbXVzdCBiZSBpbiB0aGUgZnV0dXJlXCIsIHtcbiAgICAgICAgaGludDogXCJUaGUgc2NoZWR1bGVkIHRpbWUgbXVzdCBiZSBhdCBsZWFzdCAxIG1pbnV0ZSBmcm9tIG5vd1wiLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BpbiA9IHNwaW5uZXIoXCJTY2hlZHVsaW5nIG1lc3NhZ2UuLi5cIik7XG4gICAgc3Bpbi5zdGFydCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LnBvc3Q8U2NoZWR1bGVkTWVzc2FnZVJlc3BvbnNlPihcbiAgICAgICAgXCIvYXBpL3YxL21lc3NhZ2VzL3NjaGVkdWxlXCIsXG4gICAgICAgIHtcbiAgICAgICAgICB0bzogZmxhZ3MudG8sXG4gICAgICAgICAgdGV4dDogZmxhZ3MudGV4dCxcbiAgICAgICAgICBzY2hlZHVsZWRBdDogZmxhZ3MuYXQsXG4gICAgICAgICAgLi4uKGZsYWdzLmZyb20gJiYgeyBmcm9tOiBmbGFncy5mcm9tIH0pLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgc3Bpbi5zdG9wKCk7XG5cbiAgICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0dGVkVGltZSA9IG5ldyBEYXRlKHJlc3BvbnNlLnNjaGVkdWxlZEF0KS50b0xvY2FsZVN0cmluZygpO1xuXG4gICAgICBzdWNjZXNzKFwiTWVzc2FnZSBzY2hlZHVsZWRcIiwge1xuICAgICAgICBJRDogcmVzcG9uc2UuaWQsXG4gICAgICAgIFRvOiByZXNwb25zZS50byxcbiAgICAgICAgU3RhdHVzOiBmb3JtYXRTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSxcbiAgICAgICAgXCJTY2hlZHVsZWQgRm9yXCI6IGNvbG9ycy5jb2RlKGZvcm1hdHRlZFRpbWUpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzcGluLnN0b3AoKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class SmsScheduled 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
|
+
status: 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
|
+
}
|