@sendly/cli 3.35.0 → 3.37.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 +204 -1
- package/dist/commands/10dlc/assignments/list.d.ts +10 -0
- package/dist/commands/10dlc/assignments/list.js +67 -0
- package/dist/commands/10dlc/brands/create.d.ts +25 -0
- package/dist/commands/10dlc/brands/create.js +89 -0
- package/dist/commands/10dlc/brands/get.d.ts +13 -0
- package/dist/commands/10dlc/brands/get.js +63 -0
- package/dist/commands/10dlc/brands/list.d.ts +10 -0
- package/dist/commands/10dlc/brands/list.js +63 -0
- package/dist/commands/10dlc/campaigns/assign.d.ts +14 -0
- package/dist/commands/10dlc/campaigns/assign.js +64 -0
- package/dist/commands/10dlc/campaigns/create.d.ts +24 -0
- package/dist/commands/10dlc/campaigns/create.js +118 -0
- package/dist/commands/10dlc/campaigns/get.d.ts +13 -0
- package/dist/commands/10dlc/campaigns/get.js +84 -0
- package/dist/commands/10dlc/campaigns/list.d.ts +10 -0
- package/dist/commands/10dlc/campaigns/list.js +70 -0
- package/dist/commands/10dlc/qualify.d.ts +14 -0
- package/dist/commands/10dlc/qualify.js +56 -0
- package/dist/commands/business-upgrade/cancel.d.ts +12 -0
- package/dist/commands/business-upgrade/cancel.js +47 -0
- package/dist/commands/business-upgrade/disposition.d.ts +13 -0
- package/dist/commands/business-upgrade/disposition.js +44 -0
- package/dist/commands/business-upgrade/preflight.d.ts +16 -0
- package/dist/commands/business-upgrade/preflight.js +82 -0
- package/dist/commands/business-upgrade/resubmit.d.ts +24 -0
- package/dist/commands/business-upgrade/resubmit.js +109 -0
- package/dist/commands/business-upgrade/start.d.ts +38 -0
- package/dist/commands/business-upgrade/start.js +142 -0
- package/dist/commands/business-upgrade/status.d.ts +11 -0
- package/dist/commands/business-upgrade/status.js +38 -0
- package/dist/commands/enterprise/verification/get.d.ts +13 -0
- package/dist/commands/enterprise/verification/get.js +78 -0
- package/dist/commands/enterprise/verification/resubmit.d.ts +41 -0
- package/dist/commands/enterprise/verification/resubmit.js +87 -0
- package/dist/commands/enterprise/verification/submit.d.ts +77 -0
- package/dist/commands/enterprise/verification/submit.js +212 -0
- package/dist/commands/keys/rotate.js +7 -12
- package/dist/commands/links/create.d.ts +24 -0
- package/dist/commands/links/create.js +71 -0
- package/dist/commands/links/disable.d.ts +21 -0
- package/dist/commands/links/disable.js +55 -0
- package/dist/commands/links/list.d.ts +19 -0
- package/dist/commands/links/list.js +85 -0
- package/dist/commands/numbers/buy.d.ts +31 -0
- package/dist/commands/numbers/buy.js +266 -0
- package/dist/commands/numbers/get.d.ts +20 -0
- package/dist/commands/numbers/get.js +52 -0
- package/dist/commands/numbers/list.d.ts +10 -0
- package/dist/commands/numbers/list.js +70 -0
- package/dist/commands/numbers/release.d.ts +23 -0
- package/dist/commands/numbers/release.js +67 -0
- package/dist/commands/numbers/search.d.ts +13 -0
- package/dist/commands/numbers/search.js +78 -0
- package/dist/commands/numbers/update.d.ts +25 -0
- package/dist/commands/numbers/update.js +70 -0
- package/dist/commands/sms/group.d.ts +25 -0
- package/dist/commands/sms/group.js +164 -0
- package/dist/commands/sms/upload-media.d.ts +1 -1
- package/dist/commands/sms/upload-media.js +4 -4
- package/dist/commands/templates/enhance.js +3 -3
- package/dist/commands/upgrade.d.ts +1 -16
- package/dist/commands/upgrade.js +131 -38
- package/dist/lib/auth.js +2 -94
- package/dist/lib/config.js +31 -2
- package/dist/lib/detect-install-path.d.ts +11 -7
- package/dist/lib/detect-install-path.js +25 -9
- package/dist/lib/keypress.d.ts +26 -0
- package/dist/lib/keypress.js +103 -0
- package/oclif.manifest.json +5005 -2698
- package/package.json +22 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import open from "open";
|
|
3
|
+
import inquirer from "inquirer";
|
|
4
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
5
|
+
import { apiClient, NotFoundError } from "../../lib/api-client.js";
|
|
6
|
+
import { json, success, info, warn, error, colors, spinner, isJsonMode, } from "../../lib/output.js";
|
|
7
|
+
import { attachLoginKeypressHandler } from "../../lib/keypress.js";
|
|
8
|
+
const ACTION_POLL_INTERVAL = 2000; // 2 seconds
|
|
9
|
+
const ACTION_MAX_ATTEMPTS = 600; // ~20 minutes
|
|
10
|
+
const PROVISION_POLL_INTERVAL = 3000; // 3 seconds
|
|
11
|
+
const PROVISION_MAX_ATTEMPTS = 60; // ~3 minutes
|
|
12
|
+
function sleep(ms) {
|
|
13
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
14
|
+
}
|
|
15
|
+
export default class NumbersBuy extends AuthenticatedCommand {
|
|
16
|
+
static description = "Buy a phone number. Handles document/payment steps interactively when a country requires them.";
|
|
17
|
+
static examples = [
|
|
18
|
+
"<%= config.bin %> numbers buy --country GB --type mobile",
|
|
19
|
+
"<%= config.bin %> numbers buy --country US --type local --number +15551234567",
|
|
20
|
+
"<%= config.bin %> numbers buy --country GB --type mobile --json",
|
|
21
|
+
];
|
|
22
|
+
static flags = {
|
|
23
|
+
...AuthenticatedCommand.baseFlags,
|
|
24
|
+
country: Flags.string({
|
|
25
|
+
char: "c",
|
|
26
|
+
description: "ISO country code (e.g. GB, US)",
|
|
27
|
+
required: true,
|
|
28
|
+
}),
|
|
29
|
+
type: Flags.string({
|
|
30
|
+
char: "t",
|
|
31
|
+
description: "Number type (e.g. mobile, local, toll-free)",
|
|
32
|
+
required: true,
|
|
33
|
+
}),
|
|
34
|
+
number: Flags.string({
|
|
35
|
+
char: "n",
|
|
36
|
+
description: "Specific number to buy in E.164 format (skips selection)",
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
39
|
+
async run() {
|
|
40
|
+
const { flags } = await this.parse(NumbersBuy);
|
|
41
|
+
const selected = await this.resolveNumber(flags);
|
|
42
|
+
if (!selected)
|
|
43
|
+
return;
|
|
44
|
+
// The buy body is reused verbatim across every re-POST; only actionCode
|
|
45
|
+
// is added once a hosted action (docs/payment) has completed.
|
|
46
|
+
const buyBody = {
|
|
47
|
+
phoneNumber: selected.phoneNumber,
|
|
48
|
+
countryCode: flags.country,
|
|
49
|
+
phoneNumberType: flags.type,
|
|
50
|
+
monthlyCost: selected.monthlyCost,
|
|
51
|
+
};
|
|
52
|
+
let response = await apiClient.post("/api/v1/numbers/buy", buyBody);
|
|
53
|
+
// Drive the action loop until the carrier accepts the order (provisioning).
|
|
54
|
+
while (response.status === "documents_required" ||
|
|
55
|
+
response.status === "payment_required") {
|
|
56
|
+
const action = response.action;
|
|
57
|
+
if (!action) {
|
|
58
|
+
// Backend says docs/payment required but gave us nowhere to send the
|
|
59
|
+
// user — nothing the CLI can do.
|
|
60
|
+
if (isJsonMode()) {
|
|
61
|
+
json(response);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
error(`This number needs ${response.status === "payment_required" ? "payment" : "documents"} but no action link was returned.`, {
|
|
65
|
+
hint: "Try again, or complete this number from the Sendly dashboard.",
|
|
66
|
+
});
|
|
67
|
+
this.exit(1);
|
|
68
|
+
}
|
|
69
|
+
if (isJsonMode()) {
|
|
70
|
+
// Non-interactive: surface the action so the caller can drive it.
|
|
71
|
+
json(response);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const completed = await this.runHostedAction(response.status, action);
|
|
75
|
+
if (!completed)
|
|
76
|
+
return; // expired / cancelled — already messaged
|
|
77
|
+
// Re-buy with the action identifier (actionCode), NOT the display userCode.
|
|
78
|
+
buyBody.actionCode = action.actionCode;
|
|
79
|
+
response = await apiClient.post("/api/v1/numbers/buy", buyBody);
|
|
80
|
+
}
|
|
81
|
+
// Document-required country: details submitted, number reserved + under
|
|
82
|
+
// review. No carrier order is placed until our team verifies + registers
|
|
83
|
+
// it, so there's nothing to poll for here.
|
|
84
|
+
if (response.status === "under_review") {
|
|
85
|
+
if (isJsonMode()) {
|
|
86
|
+
json(response);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
success("Number reserved — your details are under review", {
|
|
90
|
+
number: response.number?.phoneNumber,
|
|
91
|
+
note: "We verify your documents and register the number, usually within a few business days. It can't send until it's active — check `sendly numbers list`.",
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// status === "provisioning"
|
|
96
|
+
if (isJsonMode()) {
|
|
97
|
+
// Wait for activation then emit the final number record.
|
|
98
|
+
const active = await this.waitForActive(selected.phoneNumber);
|
|
99
|
+
json(active ?? response);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
info(`Order accepted for ${colors.code(selected.phoneNumber)} — provisioning...`);
|
|
103
|
+
const active = await this.waitForActive(selected.phoneNumber);
|
|
104
|
+
if (active) {
|
|
105
|
+
success("Number is active", {
|
|
106
|
+
number: active.phoneNumber,
|
|
107
|
+
id: active.id,
|
|
108
|
+
country: active.countryCode,
|
|
109
|
+
type: active.phoneNumberType,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
warn("Number is still provisioning. It usually activates within a few minutes — check `sendly numbers list`.");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Resolve which number to buy. If --number is given we trust it (and
|
|
118
|
+
* still need its monthlyCost, so we look it up among available numbers).
|
|
119
|
+
* Otherwise we search and prompt the user to pick one.
|
|
120
|
+
*/
|
|
121
|
+
async resolveNumber(flags) {
|
|
122
|
+
const spin = spinner("Finding available numbers...");
|
|
123
|
+
spin.start();
|
|
124
|
+
let available;
|
|
125
|
+
try {
|
|
126
|
+
const search = await apiClient.get("/api/v1/numbers/available", {
|
|
127
|
+
country: flags.country,
|
|
128
|
+
type: flags.type,
|
|
129
|
+
...(flags.number && { contains: flags.number.replace(/^\+/, "") }),
|
|
130
|
+
});
|
|
131
|
+
available = search.numbers ?? [];
|
|
132
|
+
spin.stop();
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
spin.fail("Could not load available numbers");
|
|
136
|
+
throw err;
|
|
137
|
+
}
|
|
138
|
+
if (flags.number) {
|
|
139
|
+
const match = available.find((n) => n.phoneNumber === flags.number);
|
|
140
|
+
if (!match) {
|
|
141
|
+
error(`${flags.number} is not available for purchase.`, {
|
|
142
|
+
hint: `Run: sendly numbers search --country ${flags.country} --type ${flags.type}`,
|
|
143
|
+
});
|
|
144
|
+
this.exit(1);
|
|
145
|
+
}
|
|
146
|
+
return match;
|
|
147
|
+
}
|
|
148
|
+
if (available.length === 0) {
|
|
149
|
+
info(`No available numbers found for ${flags.country} (${flags.type}).`);
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
// Non-interactive (no TTY / json): take the first result.
|
|
153
|
+
if (isJsonMode() || !process.stdout.isTTY) {
|
|
154
|
+
return available[0];
|
|
155
|
+
}
|
|
156
|
+
const { choice } = await inquirer.prompt([
|
|
157
|
+
{
|
|
158
|
+
type: "list",
|
|
159
|
+
name: "choice",
|
|
160
|
+
message: `Choose a number to buy (${flags.country}, ${flags.type}):`,
|
|
161
|
+
choices: available.slice(0, 25).map((n) => ({
|
|
162
|
+
name: `${n.phoneNumber} — ${n.monthlyCost} ${n.currency}/mo`,
|
|
163
|
+
value: n.phoneNumber,
|
|
164
|
+
})),
|
|
165
|
+
},
|
|
166
|
+
]);
|
|
167
|
+
return available.find((n) => n.phoneNumber === choice);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Drive a hosted document-upload / payment action: print the link + code,
|
|
171
|
+
* auto-open it, wire press-[c]-to-copy / [q] to cancel, then poll until
|
|
172
|
+
* the action completes (resolves true) or expires (resolves false).
|
|
173
|
+
*/
|
|
174
|
+
async runHostedAction(kind, action) {
|
|
175
|
+
const label = kind === "payment_required" ? "Payment required" : "Documents required";
|
|
176
|
+
console.log();
|
|
177
|
+
console.log(colors.bold(label));
|
|
178
|
+
console.log();
|
|
179
|
+
console.log(kind === "payment_required"
|
|
180
|
+
? "This number needs a payment to complete. Open this secure page:"
|
|
181
|
+
: "This number needs documents before it can be activated. Open this secure page:");
|
|
182
|
+
console.log(colors.primary(` ${action.url}`));
|
|
183
|
+
console.log();
|
|
184
|
+
console.log("Confirmation code (shown so you can verify this is your session):");
|
|
185
|
+
console.log(colors.bold(colors.primary(` ${action.code}`)));
|
|
186
|
+
console.log();
|
|
187
|
+
try {
|
|
188
|
+
await open(action.url);
|
|
189
|
+
console.log(colors.dim("Browser opened automatically"));
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
console.log(colors.dim("Please open the URL manually"));
|
|
193
|
+
}
|
|
194
|
+
const keypressCleanup = attachLoginKeypressHandler(action.url);
|
|
195
|
+
console.log();
|
|
196
|
+
const spin = spinner("Waiting for you to finish on the secure page...");
|
|
197
|
+
spin.start();
|
|
198
|
+
let attempts = 0;
|
|
199
|
+
while (attempts < ACTION_MAX_ATTEMPTS) {
|
|
200
|
+
await sleep(ACTION_POLL_INTERVAL);
|
|
201
|
+
attempts++;
|
|
202
|
+
let status;
|
|
203
|
+
try {
|
|
204
|
+
status = await apiClient.get(`/api/cli/action/${encodeURIComponent(action.actionCode)}`);
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
if (err instanceof NotFoundError) {
|
|
208
|
+
// The action is gone (expired/cleaned up) — terminal, not transient.
|
|
209
|
+
spin.fail("This step expired");
|
|
210
|
+
keypressCleanup();
|
|
211
|
+
warn("The secure page expired before it was completed. Re-run `sendly numbers buy` to start over.");
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
// Transient error — keep polling.
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (status.status === "completed") {
|
|
218
|
+
spin.succeed("Completed");
|
|
219
|
+
keypressCleanup();
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
if (status.status === "expired") {
|
|
223
|
+
spin.fail("This step expired");
|
|
224
|
+
keypressCleanup();
|
|
225
|
+
warn("The secure page expired before it was completed. Re-run `sendly numbers buy` to start over.");
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
// pending / authorized — keep polling
|
|
229
|
+
}
|
|
230
|
+
spin.fail("Timed out waiting for completion");
|
|
231
|
+
keypressCleanup();
|
|
232
|
+
warn("We stopped waiting. If you finished on the page, re-run `sendly numbers buy` and we'll pick up where you left off.");
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Poll the owned-numbers list until the just-ordered number reports
|
|
237
|
+
* `active`. Returns the active record, or undefined if it hasn't
|
|
238
|
+
* activated within the polling window.
|
|
239
|
+
*/
|
|
240
|
+
async waitForActive(phoneNumber) {
|
|
241
|
+
const spin = spinner("Activating number...");
|
|
242
|
+
spin.start();
|
|
243
|
+
let attempts = 0;
|
|
244
|
+
while (attempts < PROVISION_MAX_ATTEMPTS) {
|
|
245
|
+
let list;
|
|
246
|
+
try {
|
|
247
|
+
list = await apiClient.get("/api/v1/numbers");
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
await sleep(PROVISION_POLL_INTERVAL);
|
|
251
|
+
attempts++;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
const found = (list.numbers ?? []).find((n) => n.phoneNumber === phoneNumber);
|
|
255
|
+
if (found && found.status === "active") {
|
|
256
|
+
spin.succeed("Active");
|
|
257
|
+
return found;
|
|
258
|
+
}
|
|
259
|
+
await sleep(PROVISION_POLL_INTERVAL);
|
|
260
|
+
attempts++;
|
|
261
|
+
}
|
|
262
|
+
spin.stop();
|
|
263
|
+
return undefined;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL251bWJlcnMvYnV5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25FLE9BQU8sRUFDTCxJQUFJLEVBQ0osT0FBTyxFQUNQLElBQUksRUFDSixJQUFJLEVBQ0osS0FBSyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBQ1AsVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUF3RG5FLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLENBQUMsWUFBWTtBQUMvQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxDQUFDLGNBQWM7QUFDL0MsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZO0FBQ2xELE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUMsYUFBYTtBQUVoRCxTQUFTLEtBQUssQ0FBQyxFQUFVO0lBQ3ZCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyxVQUFXLFNBQVEsb0JBQW9CO0lBQzFELE1BQU0sQ0FBQyxXQUFXLEdBQ2hCLGdHQUFnRyxDQUFDO0lBRW5HLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsMERBQTBEO1FB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c0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCBvcGVuIGZyb20gXCJvcGVuXCI7XG5pbXBvcnQgaW5xdWlyZXIgZnJvbSBcImlucXVpcmVyXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQsIE5vdEZvdW5kRXJyb3IgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIGpzb24sXG4gIHN1Y2Nlc3MsXG4gIGluZm8sXG4gIHdhcm4sXG4gIGVycm9yLFxuICBjb2xvcnMsXG4gIHNwaW5uZXIsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5pbXBvcnQgeyBhdHRhY2hMb2dpbktleXByZXNzSGFuZGxlciB9IGZyb20gXCIuLi8uLi9saWIva2V5cHJlc3MuanNcIjtcblxuaW50ZXJmYWNlIEF2YWlsYWJsZU51bWJlciB7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gIGNvdW50cnk6IHN0cmluZztcbiAgbnVtYmVyVHlwZTogc3RyaW5nO1xuICBtb250aGx5Q29zdDogc3RyaW5nO1xuICBjdXJyZW5jeTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2VhcmNoTnVtYmVyc1Jlc3BvbnNlIHtcbiAgbnVtYmVyczogQXZhaWxhYmxlTnVtYmVyW107XG59XG5cbmludGVyZmFjZSBCdXlBY3Rpb24ge1xuICB1cmw6IHN0cmluZztcbiAgLy8gYWN0aW9uQ29kZSAoMzItaGV4KSBpZGVudGlmaWVzIHRoZSBhY3Rpb24g4oCUIHVzZWQgdG8gUE9MTCBhbmQgdG8gUkUtQlVZLlxuICBhY3Rpb25Db2RlOiBzdHJpbmc7XG4gIC8vIGNvZGUgKDgtY2hhciB1c2VyQ29kZSkgaXMgc2hvd24gdG8gdGhlIGh1bWFuIHRvIHR5cGUgb24gdGhlIGhvc3RlZCBwYWdlXG4gIC8vIHRvIHByb3ZlIHRlcm1pbmFsIGFjY2Vzcy4gRElTUExBWSBvbmx5IOKAlCBuZXZlciB1c2VkIGFzIGFjdGlvbkNvZGUuXG4gIGNvZGU6IHN0cmluZztcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBPd25lZE51bWJlciB7XG4gIGlkOiBzdHJpbmc7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBzb3VyY2U6IHN0cmluZztcbiAgY291bnRyeUNvZGU6IHN0cmluZztcbiAgcGhvbmVOdW1iZXJUeXBlOiBzdHJpbmc7XG4gIG1vbnRobHlDb3N0Q2VudHM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEJ1eVJlc3BvbnNlIHtcbiAgc3RhdHVzOlxuICAgIHwgXCJwcm92aXNpb25pbmdcIlxuICAgIHwgXCJkb2N1bWVudHNfcmVxdWlyZWRcIlxuICAgIHwgXCJ1bmRlcl9yZXZpZXdcIlxuICAgIHwgXCJwYXltZW50X3JlcXVpcmVkXCI7XG4gIG51bWJlcj86IE93bmVkTnVtYmVyO1xuICByZXF1aXJlbWVudHM/OiB1bmtub3duO1xuICBhY3Rpb24/OiBCdXlBY3Rpb247XG59XG5cbmludGVyZmFjZSBMaXN0TnVtYmVyc1Jlc3BvbnNlIHtcbiAgbnVtYmVyczogT3duZWROdW1iZXJbXTtcbn1cblxuaW50ZXJmYWNlIEFjdGlvblN0YXR1c1Jlc3BvbnNlIHtcbiAgc3RhdHVzOiBcInBlbmRpbmdcIiB8IFwiYXV0aG9yaXplZFwiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZXhwaXJlZFwiO1xuICBhY3Rpb25UeXBlOiBzdHJpbmc7XG4gIHJlc3VsdD86IHVua25vd247XG4gIGV4cGlyZXNBdDogc3RyaW5nO1xufVxuXG5jb25zdCBBQ1RJT05fUE9MTF9JTlRFUlZBTCA9IDIwMDA7IC8vIDIgc2Vjb25kc1xuY29uc3QgQUNUSU9OX01BWF9BVFRFTVBUUyA9IDYwMDsgLy8gfjIwIG1pbnV0ZXNcbmNvbnN0IFBST1ZJU0lPTl9QT0xMX0lOVEVSVkFMID0gMzAwMDsgLy8gMyBzZWNvbmRzXG5jb25zdCBQUk9WSVNJT05fTUFYX0FUVEVNUFRTID0gNjA7IC8vIH4zIG1pbnV0ZXNcblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTnVtYmVyc0J1eSBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID1cbiAgICBcIkJ1eSBhIHBob25lIG51bWJlci4gSGFuZGxlcyBkb2N1bWVudC9wYXltZW50IHN0ZXBzIGludGVyYWN0aXZlbHkgd2hlbiBhIGNvdW50cnkgcmVxdWlyZXMgdGhlbS5cIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBudW1iZXJzIGJ1eSAtLWNvdW50cnkgR0IgLS10eXBlIG1vYmlsZVwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gbnVtYmVycyBidXkgLS1jb3VudHJ5IFVTIC0tdHlwZSBsb2NhbCAtLW51bWJlciArMTU1NTEyMzQ1NjdcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IG51bWJlcnMgYnV5IC0tY291bnRyeSBHQiAtLXR5cGUgbW9iaWxlIC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgY291bnRyeTogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwiY1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiSVNPIGNvdW50cnkgY29kZSAoZS5nLiBHQiwgVVMpXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgICB0eXBlOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJ0XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJOdW1iZXIgdHlwZSAoZS5nLiBtb2JpbGUsIGxvY2FsLCB0b2xsLWZyZWUpXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgICBudW1iZXI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcIm5cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNwZWNpZmljIG51bWJlciB0byBidXkgaW4gRS4xNjQgZm9ybWF0IChza2lwcyBzZWxlY3Rpb24pXCIsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoTnVtYmVyc0J1eSk7XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IGF3YWl0IHRoaXMucmVzb2x2ZU51bWJlcihmbGFncyk7XG4gICAgaWYgKCFzZWxlY3RlZCkgcmV0dXJuO1xuXG4gICAgLy8gVGhlIGJ1eSBib2R5IGlzIHJldXNlZCB2ZXJiYXRpbSBhY3Jvc3MgZXZlcnkgcmUtUE9TVDsgb25seSBhY3Rpb25Db2RlXG4gICAgLy8gaXMgYWRkZWQgb25jZSBhIGhvc3RlZCBhY3Rpb24gKGRvY3MvcGF5bWVudCkgaGFzIGNvbXBsZXRlZC5cbiAgICBjb25zdCBidXlCb2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIHBob25lTnVtYmVyOiBzZWxlY3RlZC5waG9uZU51bWJlcixcbiAgICAgIGNvdW50cnlDb2RlOiBmbGFncy5jb3VudHJ5LFxuICAgICAgcGhvbmVOdW1iZXJUeXBlOiBmbGFncy50eXBlLFxuICAgICAgbW9udGhseUNvc3Q6IHNlbGVjdGVkLm1vbnRobHlDb3N0LFxuICAgIH07XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxCdXlSZXNwb25zZT4oXG4gICAgICBcIi9hcGkvdjEvbnVtYmVycy9idXlcIixcbiAgICAgIGJ1eUJvZHksXG4gICAgKTtcblxuICAgIC8vIERyaXZlIHRoZSBhY3Rpb24gbG9vcCB1bnRpbCB0aGUgY2FycmllciBhY2NlcHRzIHRoZSBvcmRlciAocHJvdmlzaW9uaW5nKS5cbiAgICB3aGlsZSAoXG4gICAgICByZXNwb25zZS5zdGF0dXMgPT09IFwiZG9jdW1lbnRzX3JlcXVpcmVkXCIgfHxcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gXCJwYXltZW50X3JlcXVpcmVkXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHJlc3BvbnNlLmFjdGlvbjtcbiAgICAgIGlmICghYWN0aW9uKSB7XG4gICAgICAgIC8vIEJhY2tlbmQgc2F5cyBkb2NzL3BheW1lbnQgcmVxdWlyZWQgYnV0IGdhdmUgdXMgbm93aGVyZSB0byBzZW5kIHRoZVxuICAgICAgICAvLyB1c2VyIOKAlCBub3RoaW5nIHRoZSBDTEkgY2FuIGRvLlxuICAgICAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIGBUaGlzIG51bWJlciBuZWVkcyAke3Jlc3BvbnNlLnN0YXR1cyA9PT0gXCJwYXltZW50X3JlcXVpcmVkXCIgPyBcInBheW1lbnRcIiA6IFwiZG9jdW1lbnRzXCJ9IGJ1dCBubyBhY3Rpb24gbGluayB3YXMgcmV0dXJuZWQuYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiBcIlRyeSBhZ2Fpbiwgb3IgY29tcGxldGUgdGhpcyBudW1iZXIgZnJvbSB0aGUgU2VuZGx5IGRhc2hib2FyZC5cIixcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgICAgLy8gTm9uLWludGVyYWN0aXZlOiBzdXJmYWNlIHRoZSBhY3Rpb24gc28gdGhlIGNhbGxlciBjYW4gZHJpdmUgaXQuXG4gICAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBsZXRlZCA9IGF3YWl0IHRoaXMucnVuSG9zdGVkQWN0aW9uKHJlc3BvbnNlLnN0YXR1cywgYWN0aW9uKTtcbiAgICAgIGlmICghY29tcGxldGVkKSByZXR1cm47IC8vIGV4cGlyZWQgLyBjYW5jZWxsZWQg4oCUIGFscmVhZHkgbWVzc2FnZWRcblxuICAgICAgLy8gUmUtYnV5IHdpdGggdGhlIGFjdGlvbiBpZGVudGlmaWVyIChhY3Rpb25Db2RlKSwgTk9UIHRoZSBkaXNwbGF5IHVzZXJDb2RlLlxuICAgICAgYnV5Qm9keS5hY3Rpb25Db2RlID0gYWN0aW9uLmFjdGlvbkNvZGU7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PEJ1eVJlc3BvbnNlPihcbiAgICAgICAgXCIvYXBpL3YxL251bWJlcnMvYnV5XCIsXG4gICAgICAgIGJ1eUJvZHksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERvY3VtZW50LXJlcXVpcmVkIGNvdW50cnk6IGRldGFpbHMgc3VibWl0dGVkLCBudW1iZXIgcmVzZXJ2ZWQgKyB1bmRlclxuICAgIC8vIHJldmlldy4gTm8gY2FycmllciBvcmRlciBpcyBwbGFjZWQgdW50aWwgb3VyIHRlYW0gdmVyaWZpZXMgKyByZWdpc3RlcnNcbiAgICAvLyBpdCwgc28gdGhlcmUncyBub3RoaW5nIHRvIHBvbGwgZm9yIGhlcmUuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gXCJ1bmRlcl9yZXZpZXdcIikge1xuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3VjY2VzcyhcIk51bWJlciByZXNlcnZlZCDigJQgeW91ciBkZXRhaWxzIGFyZSB1bmRlciByZXZpZXdcIiwge1xuICAgICAgICBudW1iZXI6IHJlc3BvbnNlLm51bWJlcj8ucGhvbmVOdW1iZXIsXG4gICAgICAgIG5vdGU6IFwiV2UgdmVyaWZ5IHlvdXIgZG9jdW1lbnRzIGFuZCByZWdpc3RlciB0aGUgbnVtYmVyLCB1c3VhbGx5IHdpdGhpbiBhIGZldyBidXNpbmVzcyBkYXlzLiBJdCBjYW4ndCBzZW5kIHVudGlsIGl0J3MgYWN0aXZlIOKAlCBjaGVjayBgc2VuZGx5IG51bWJlcnMgbGlzdGAuXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzdGF0dXMgPT09IFwicHJvdmlzaW9uaW5nXCJcbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICAvLyBXYWl0IGZvciBhY3RpdmF0aW9uIHRoZW4gZW1pdCB0aGUgZmluYWwgbnVtYmVyIHJlY29yZC5cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IGF3YWl0IHRoaXMud2FpdEZvckFjdGl2ZShzZWxlY3RlZC5waG9uZU51bWJlcik7XG4gICAgICBqc29uKGFjdGl2ZSA/PyByZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5mbyhgT3JkZXIgYWNjZXB0ZWQgZm9yICR7Y29sb3JzLmNvZGUoc2VsZWN0ZWQucGhvbmVOdW1iZXIpfSDigJQgcHJvdmlzaW9uaW5nLi4uYCk7XG4gICAgY29uc3QgYWN0aXZlID0gYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZlKHNlbGVjdGVkLnBob25lTnVtYmVyKTtcblxuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHN1Y2Nlc3MoXCJOdW1iZXIgaXMgYWN0aXZlXCIsIHtcbiAgICAgICAgbnVtYmVyOiBhY3RpdmUucGhvbmVOdW1iZXIsXG4gICAgICAgIGlkOiBhY3RpdmUuaWQsXG4gICAgICAgIGNvdW50cnk6IGFjdGl2ZS5jb3VudHJ5Q29kZSxcbiAgICAgICAgdHlwZTogYWN0aXZlLnBob25lTnVtYmVyVHlwZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuKFxuICAgICAgICBcIk51bWJlciBpcyBzdGlsbCBwcm92aXNpb25pbmcuIEl0IHVzdWFsbHkgYWN0aXZhdGVzIHdpdGhpbiBhIGZldyBtaW51dGVzIOKAlCBjaGVjayBgc2VuZGx5IG51bWJlcnMgbGlzdGAuXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHdoaWNoIG51bWJlciB0byBidXkuIElmIC0tbnVtYmVyIGlzIGdpdmVuIHdlIHRydXN0IGl0IChhbmRcbiAgICogc3RpbGwgbmVlZCBpdHMgbW9udGhseUNvc3QsIHNvIHdlIGxvb2sgaXQgdXAgYW1vbmcgYXZhaWxhYmxlIG51bWJlcnMpLlxuICAgKiBPdGhlcndpc2Ugd2Ugc2VhcmNoIGFuZCBwcm9tcHQgdGhlIHVzZXIgdG8gcGljayBvbmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVOdW1iZXIoZmxhZ3M6IHtcbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIG51bWJlcj86IHN0cmluZztcbiAgfSk6IFByb21pc2U8QXZhaWxhYmxlTnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3BpbiA9IHNwaW5uZXIoXCJGaW5kaW5nIGF2YWlsYWJsZSBudW1iZXJzLi4uXCIpO1xuICAgIHNwaW4uc3RhcnQoKTtcblxuICAgIGxldCBhdmFpbGFibGU6IEF2YWlsYWJsZU51bWJlcltdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZWFyY2ggPSBhd2FpdCBhcGlDbGllbnQuZ2V0PFNlYXJjaE51bWJlcnNSZXNwb25zZT4oXG4gICAgICAgIFwiL2FwaS92MS9udW1iZXJzL2F2YWlsYWJsZVwiLFxuICAgICAgICB7XG4gICAgICAgICAgY291bnRyeTogZmxhZ3MuY291bnRyeSxcbiAgICAgICAgICB0eXBlOiBmbGFncy50eXBlLFxuICAgICAgICAgIC4uLihmbGFncy5udW1iZXIgJiYgeyBjb250YWluczogZmxhZ3MubnVtYmVyLnJlcGxhY2UoL15cXCsvLCBcIlwiKSB9KSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBhdmFpbGFibGUgPSBzZWFyY2gubnVtYmVycyA/PyBbXTtcbiAgICAgIHNwaW4uc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc3Bpbi5mYWlsKFwiQ291bGQgbm90IGxvYWQgYXZhaWxhYmxlIG51bWJlcnNcIik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgaWYgKGZsYWdzLm51bWJlcikge1xuICAgICAgY29uc3QgbWF0Y2ggPSBhdmFpbGFibGUuZmluZCgobikgPT4gbi5waG9uZU51bWJlciA9PT0gZmxhZ3MubnVtYmVyKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgZXJyb3IoYCR7ZmxhZ3MubnVtYmVyfSBpcyBub3QgYXZhaWxhYmxlIGZvciBwdXJjaGFzZS5gLCB7XG4gICAgICAgICAgaGludDogYFJ1bjogc2VuZGx5IG51bWJlcnMgc2VhcmNoIC0tY291bnRyeSAke2ZsYWdzLmNvdW50cnl9IC0tdHlwZSAke2ZsYWdzLnR5cGV9YCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cbiAgICBpZiAoYXZhaWxhYmxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyhgTm8gYXZhaWxhYmxlIG51bWJlcnMgZm91bmQgZm9yICR7ZmxhZ3MuY291bnRyeX0gKCR7ZmxhZ3MudHlwZX0pLmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBOb24taW50ZXJhY3RpdmUgKG5vIFRUWSAvIGpzb24pOiB0YWtlIHRoZSBmaXJzdCByZXN1bHQuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSB8fCAhcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICAgIHJldHVybiBhdmFpbGFibGVbMF07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjaG9pY2UgfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBuYW1lOiBcImNob2ljZVwiLFxuICAgICAgICBtZXNzYWdlOiBgQ2hvb3NlIGEgbnVtYmVyIHRvIGJ1eSAoJHtmbGFncy5jb3VudHJ5fSwgJHtmbGFncy50eXBlfSk6YCxcbiAgICAgICAgY2hvaWNlczogYXZhaWxhYmxlLnNsaWNlKDAsIDI1KS5tYXAoKG4pID0+ICh7XG4gICAgICAgICAgbmFtZTogYCR7bi5waG9uZU51bWJlcn0gIOKAlCAgJHtuLm1vbnRobHlDb3N0fSAke24uY3VycmVuY3l9L21vYCxcbiAgICAgICAgICB2YWx1ZTogbi5waG9uZU51bWJlcixcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIHJldHVybiBhdmFpbGFibGUuZmluZCgobikgPT4gbi5waG9uZU51bWJlciA9PT0gY2hvaWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcml2ZSBhIGhvc3RlZCBkb2N1bWVudC11cGxvYWQgLyBwYXltZW50IGFjdGlvbjogcHJpbnQgdGhlIGxpbmsgKyBjb2RlLFxuICAgKiBhdXRvLW9wZW4gaXQsIHdpcmUgcHJlc3MtW2NdLXRvLWNvcHkgLyBbcV0gdG8gY2FuY2VsLCB0aGVuIHBvbGwgdW50aWxcbiAgICogdGhlIGFjdGlvbiBjb21wbGV0ZXMgKHJlc29sdmVzIHRydWUpIG9yIGV4cGlyZXMgKHJlc29sdmVzIGZhbHNlKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuSG9zdGVkQWN0aW9uKFxuICAgIGtpbmQ6IFwiZG9jdW1lbnRzX3JlcXVpcmVkXCIgfCBcInBheW1lbnRfcmVxdWlyZWRcIixcbiAgICBhY3Rpb246IEJ1eUFjdGlvbixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbGFiZWwgPVxuICAgICAga2luZCA9PT0gXCJwYXltZW50X3JlcXVpcmVkXCIgPyBcIlBheW1lbnQgcmVxdWlyZWRcIiA6IFwiRG9jdW1lbnRzIHJlcXVpcmVkXCI7XG5cbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5ib2xkKGxhYmVsKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGtpbmQgPT09IFwicGF5bWVudF9yZXF1aXJlZFwiXG4gICAgICAgID8gXCJUaGlzIG51bWJlciBuZWVkcyBhIHBheW1lbnQgdG8gY29tcGxldGUuIE9wZW4gdGhpcyBzZWN1cmUgcGFnZTpcIlxuICAgICAgICA6IFwiVGhpcyBudW1iZXIgbmVlZHMgZG9jdW1lbnRzIGJlZm9yZSBpdCBjYW4gYmUgYWN0aXZhdGVkLiBPcGVuIHRoaXMgc2VjdXJlIHBhZ2U6XCIsXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMucHJpbWFyeShgICAke2FjdGlvbi51cmx9YCkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coXCJDb25maXJtYXRpb24gY29kZSAoc2hvd24gc28geW91IGNhbiB2ZXJpZnkgdGhpcyBpcyB5b3VyIHNlc3Npb24pOlwiKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChjb2xvcnMucHJpbWFyeShgICAke2FjdGlvbi5jb2RlfWApKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBvcGVuKGFjdGlvbi51cmwpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIkJyb3dzZXIgb3BlbmVkIGF1dG9tYXRpY2FsbHlcIikpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlBsZWFzZSBvcGVuIHRoZSBVUkwgbWFudWFsbHlcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXByZXNzQ2xlYW51cCA9IGF0dGFjaExvZ2luS2V5cHJlc3NIYW5kbGVyKGFjdGlvbi51cmwpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICBjb25zdCBzcGluID0gc3Bpbm5lcihcIldhaXRpbmcgZm9yIHlvdSB0byBmaW5pc2ggb24gdGhlIHNlY3VyZSBwYWdlLi4uXCIpO1xuICAgIHNwaW4uc3RhcnQoKTtcblxuICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgd2hpbGUgKGF0dGVtcHRzIDwgQUNUSU9OX01BWF9BVFRFTVBUUykge1xuICAgICAgYXdhaXQgc2xlZXAoQUNUSU9OX1BPTExfSU5URVJWQUwpO1xuICAgICAgYXR0ZW1wdHMrKztcblxuICAgICAgbGV0IHN0YXR1czogQWN0aW9uU3RhdHVzUmVzcG9uc2U7XG4gICAgICB0cnkge1xuICAgICAgICBzdGF0dXMgPSBhd2FpdCBhcGlDbGllbnQuZ2V0PEFjdGlvblN0YXR1c1Jlc3BvbnNlPihcbiAgICAgICAgICBgL2FwaS9jbGkvYWN0aW9uLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGFjdGlvbi5hY3Rpb25Db2RlKX1gLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGFjdGlvbiBpcyBnb25lIChleHBpcmVkL2NsZWFuZWQgdXApIOKAlCB0ZXJtaW5hbCwgbm90IHRyYW5zaWVudC5cbiAgICAgICAgICBzcGluLmZhaWwoXCJUaGlzIHN0ZXAgZXhwaXJlZFwiKTtcbiAgICAgICAgICBrZXlwcmVzc0NsZWFudXAoKTtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJUaGUgc2VjdXJlIHBhZ2UgZXhwaXJlZCBiZWZvcmUgaXQgd2FzIGNvbXBsZXRlZC4gUmUtcnVuIGBzZW5kbHkgbnVtYmVycyBidXlgIHRvIHN0YXJ0IG92ZXIuXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhbnNpZW50IGVycm9yIOKAlCBrZWVwIHBvbGxpbmcuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICBzcGluLnN1Y2NlZWQoXCJDb21wbGV0ZWRcIik7XG4gICAgICAgIGtleXByZXNzQ2xlYW51cCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXR1cy5zdGF0dXMgPT09IFwiZXhwaXJlZFwiKSB7XG4gICAgICAgIHNwaW4uZmFpbChcIlRoaXMgc3RlcCBleHBpcmVkXCIpO1xuICAgICAgICBrZXlwcmVzc0NsZWFudXAoKTtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBcIlRoZSBzZWN1cmUgcGFnZSBleHBpcmVkIGJlZm9yZSBpdCB3YXMgY29tcGxldGVkLiBSZS1ydW4gYHNlbmRseSBudW1iZXJzIGJ1eWAgdG8gc3RhcnQgb3Zlci5cIixcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gcGVuZGluZyAvIGF1dGhvcml6ZWQg4oCUIGtlZXAgcG9sbGluZ1xuICAgIH1cblxuICAgIHNwaW4uZmFpbChcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBjb21wbGV0aW9uXCIpO1xuICAgIGtleXByZXNzQ2xlYW51cCgpO1xuICAgIHdhcm4oXG4gICAgICBcIldlIHN0b3BwZWQgd2FpdGluZy4gSWYgeW91IGZpbmlzaGVkIG9uIHRoZSBwYWdlLCByZS1ydW4gYHNlbmRseSBudW1iZXJzIGJ1eWAgYW5kIHdlJ2xsIHBpY2sgdXAgd2hlcmUgeW91IGxlZnQgb2ZmLlwiLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGwgdGhlIG93bmVkLW51bWJlcnMgbGlzdCB1bnRpbCB0aGUganVzdC1vcmRlcmVkIG51bWJlciByZXBvcnRzXG4gICAqIGBhY3RpdmVgLiBSZXR1cm5zIHRoZSBhY3RpdmUgcmVjb3JkLCBvciB1bmRlZmluZWQgaWYgaXQgaGFzbid0XG4gICAqIGFjdGl2YXRlZCB3aXRoaW4gdGhlIHBvbGxpbmcgd2luZG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQWN0aXZlKFxuICAgIHBob25lTnVtYmVyOiBzdHJpbmcsXG4gICk6IFByb21pc2U8T3duZWROdW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzcGluID0gc3Bpbm5lcihcIkFjdGl2YXRpbmcgbnVtYmVyLi4uXCIpO1xuICAgIHNwaW4uc3RhcnQoKTtcblxuICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgd2hpbGUgKGF0dGVtcHRzIDwgUFJPVklTSU9OX01BWF9BVFRFTVBUUykge1xuICAgICAgbGV0IGxpc3Q6IExpc3ROdW1iZXJzUmVzcG9uc2U7XG4gICAgICB0cnkge1xuICAgICAgICBsaXN0ID0gYXdhaXQgYXBpQ2xpZW50LmdldDxMaXN0TnVtYmVyc1Jlc3BvbnNlPihcIi9hcGkvdjEvbnVtYmVyc1wiKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhd2FpdCBzbGVlcChQUk9WSVNJT05fUE9MTF9JTlRFUlZBTCk7XG4gICAgICAgIGF0dGVtcHRzKys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3VuZCA9IChsaXN0Lm51bWJlcnMgPz8gW10pLmZpbmQoXG4gICAgICAgIChuKSA9PiBuLnBob25lTnVtYmVyID09PSBwaG9uZU51bWJlcixcbiAgICAgICk7XG4gICAgICBpZiAoZm91bmQgJiYgZm91bmQuc3RhdHVzID09PSBcImFjdGl2ZVwiKSB7XG4gICAgICAgIHNwaW4uc3VjY2VlZChcIkFjdGl2ZVwiKTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzbGVlcChQUk9WSVNJT05fUE9MTF9JTlRFUlZBTCk7XG4gICAgICBhdHRlbXB0cysrO1xuICAgIH1cblxuICAgIHNwaW4uc3RvcCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
/**
|
|
3
|
+
* `sendly numbers get <id>` — show one phone number you own, including whether
|
|
4
|
+
* it's the workspace default sender.
|
|
5
|
+
*
|
|
6
|
+
* Wraps `GET /api/v1/numbers/:id`. Returns 404 when the id isn't one of your
|
|
7
|
+
* numbers.
|
|
8
|
+
*/
|
|
9
|
+
export default class NumbersGet extends AuthenticatedCommand {
|
|
10
|
+
static description: string;
|
|
11
|
+
static examples: string[];
|
|
12
|
+
static args: {
|
|
13
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
14
|
+
};
|
|
15
|
+
static flags: {
|
|
16
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
17
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
18
|
+
};
|
|
19
|
+
run(): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
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, json, colors, formatStatus, formatRelativeTime, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
/**
|
|
6
|
+
* `sendly numbers get <id>` — show one phone number you own, including whether
|
|
7
|
+
* it's the workspace default sender.
|
|
8
|
+
*
|
|
9
|
+
* Wraps `GET /api/v1/numbers/:id`. Returns 404 when the id isn't one of your
|
|
10
|
+
* numbers.
|
|
11
|
+
*/
|
|
12
|
+
export default class NumbersGet extends AuthenticatedCommand {
|
|
13
|
+
static description = "Show details for one phone number you own";
|
|
14
|
+
static examples = [
|
|
15
|
+
"<%= config.bin %> numbers get num_abc123",
|
|
16
|
+
"<%= config.bin %> numbers get num_abc123 --json",
|
|
17
|
+
];
|
|
18
|
+
static args = {
|
|
19
|
+
id: Args.string({
|
|
20
|
+
description: "Phone number ID (from `sendly numbers list`)",
|
|
21
|
+
required: true,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
static flags = {
|
|
25
|
+
...AuthenticatedCommand.baseFlags,
|
|
26
|
+
};
|
|
27
|
+
async run() {
|
|
28
|
+
const { args } = await this.parse(NumbersGet);
|
|
29
|
+
const number = await apiClient.get(`/api/v1/numbers/${encodeURIComponent(args.id)}`);
|
|
30
|
+
if (isJsonMode()) {
|
|
31
|
+
json(number);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
success("Number details", {
|
|
35
|
+
ID: number.id,
|
|
36
|
+
Number: colors.code(number.phoneNumber),
|
|
37
|
+
Status: formatStatus(number.status),
|
|
38
|
+
Country: number.countryCode,
|
|
39
|
+
Type: number.phoneNumberType,
|
|
40
|
+
Source: number.source,
|
|
41
|
+
Default: number.isDefault ? colors.success("yes") : "no",
|
|
42
|
+
"Monthly cost": `$${(number.monthlyCostCents / 100).toFixed(2)}`,
|
|
43
|
+
...(number.pendingCancellation && {
|
|
44
|
+
"Pending release": colors.warning("yes"),
|
|
45
|
+
}),
|
|
46
|
+
...(number.scheduledReleaseAt && {
|
|
47
|
+
"Scheduled release": formatRelativeTime(number.scheduledReleaseAt),
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL251bWJlcnMvZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFDTCxPQUFPLEVBQ1AsSUFBSSxFQUNKLE1BQU0sRUFDTixZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBZ0I3Qjs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLFVBQVcsU0FBUSxvQkFBb0I7SUFDMUQsTUFBTSxDQUFDLFdBQVcsR0FBRywyQ0FBMkMsQ0FBQztJQUVqRSxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDBDQUEwQztRQUMxQyxpREFBaUQ7S0FDbEQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSw4Q0FBOEM7WUFDM0QsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7S0FDbEMsQ0FBQztJQUVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU5QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQ2hDLG1CQUFtQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FDakQsQ0FBQztRQUVGLElBQUksVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDYixPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUN4QixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDYixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDM0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxlQUFlO1lBQzVCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixPQUFPLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUN4RCxjQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDaEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSTtnQkFDaEMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7YUFDekMsQ0FBQztZQUNGLEdBQUcsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLElBQUk7Z0JBQy9CLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQzthQUNuRSxDQUFDO1NBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAganNvbixcbiAgY29sb3JzLFxuICBmb3JtYXRTdGF0dXMsXG4gIGZvcm1hdFJlbGF0aXZlVGltZSxcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIE93bmVkTnVtYmVyIHtcbiAgaWQ6IHN0cmluZztcbiAgcGhvbmVOdW1iZXI6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICBjb3VudHJ5Q29kZTogc3RyaW5nO1xuICBwaG9uZU51bWJlclR5cGU6IHN0cmluZztcbiAgbW9udGhseUNvc3RDZW50czogbnVtYmVyO1xuICBpc0RlZmF1bHQ/OiBib29sZWFuO1xuICByZXF1aXJlbWVudHNTdWJtaXR0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgcGVuZGluZ0NhbmNlbGxhdGlvbjogYm9vbGVhbjtcbiAgc2NoZWR1bGVkUmVsZWFzZUF0OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIGBzZW5kbHkgbnVtYmVycyBnZXQgPGlkPmAg4oCUIHNob3cgb25lIHBob25lIG51bWJlciB5b3Ugb3duLCBpbmNsdWRpbmcgd2hldGhlclxuICogaXQncyB0aGUgd29ya3NwYWNlIGRlZmF1bHQgc2VuZGVyLlxuICpcbiAqIFdyYXBzIGBHRVQgL2FwaS92MS9udW1iZXJzLzppZGAuIFJldHVybnMgNDA0IHdoZW4gdGhlIGlkIGlzbid0IG9uZSBvZiB5b3VyXG4gKiBudW1iZXJzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOdW1iZXJzR2V0IGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIlNob3cgZGV0YWlscyBmb3Igb25lIHBob25lIG51bWJlciB5b3Ugb3duXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gbnVtYmVycyBnZXQgbnVtX2FiYzEyM1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gbnVtYmVycyBnZXQgbnVtX2FiYzEyMyAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBpZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiUGhvbmUgbnVtYmVyIElEIChmcm9tIGBzZW5kbHkgbnVtYmVycyBsaXN0YClcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShOdW1iZXJzR2V0KTtcblxuICAgIGNvbnN0IG51bWJlciA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8T3duZWROdW1iZXI+KFxuICAgICAgYC9hcGkvdjEvbnVtYmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChhcmdzLmlkKX1gLFxuICAgICk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKG51bWJlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VjY2VzcyhcIk51bWJlciBkZXRhaWxzXCIsIHtcbiAgICAgIElEOiBudW1iZXIuaWQsXG4gICAgICBOdW1iZXI6IGNvbG9ycy5jb2RlKG51bWJlci5waG9uZU51bWJlciksXG4gICAgICBTdGF0dXM6IGZvcm1hdFN0YXR1cyhudW1iZXIuc3RhdHVzKSxcbiAgICAgIENvdW50cnk6IG51bWJlci5jb3VudHJ5Q29kZSxcbiAgICAgIFR5cGU6IG51bWJlci5waG9uZU51bWJlclR5cGUsXG4gICAgICBTb3VyY2U6IG51bWJlci5zb3VyY2UsXG4gICAgICBEZWZhdWx0OiBudW1iZXIuaXNEZWZhdWx0ID8gY29sb3JzLnN1Y2Nlc3MoXCJ5ZXNcIikgOiBcIm5vXCIsXG4gICAgICBcIk1vbnRobHkgY29zdFwiOiBgJCR7KG51bWJlci5tb250aGx5Q29zdENlbnRzIC8gMTAwKS50b0ZpeGVkKDIpfWAsXG4gICAgICAuLi4obnVtYmVyLnBlbmRpbmdDYW5jZWxsYXRpb24gJiYge1xuICAgICAgICBcIlBlbmRpbmcgcmVsZWFzZVwiOiBjb2xvcnMud2FybmluZyhcInllc1wiKSxcbiAgICAgIH0pLFxuICAgICAgLi4uKG51bWJlci5zY2hlZHVsZWRSZWxlYXNlQXQgJiYge1xuICAgICAgICBcIlNjaGVkdWxlZCByZWxlYXNlXCI6IGZvcm1hdFJlbGF0aXZlVGltZShudW1iZXIuc2NoZWR1bGVkUmVsZWFzZUF0KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class NumbersList 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
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
3
|
+
import { table, json, info, formatStatus, colors, isJsonMode, } from "../../lib/output.js";
|
|
4
|
+
export default class NumbersList extends AuthenticatedCommand {
|
|
5
|
+
static description = "List the phone numbers on your account";
|
|
6
|
+
static examples = [
|
|
7
|
+
"<%= config.bin %> numbers list",
|
|
8
|
+
"<%= config.bin %> numbers list --json",
|
|
9
|
+
];
|
|
10
|
+
static flags = {
|
|
11
|
+
...AuthenticatedCommand.baseFlags,
|
|
12
|
+
};
|
|
13
|
+
async run() {
|
|
14
|
+
await this.parse(NumbersList);
|
|
15
|
+
const response = await apiClient.get("/api/v1/numbers");
|
|
16
|
+
if (isJsonMode()) {
|
|
17
|
+
json(response);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (!response.numbers || response.numbers.length === 0) {
|
|
21
|
+
info("No phone numbers on your account yet. Buy one with: sendly numbers buy");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
console.log();
|
|
25
|
+
console.log(colors.dim(`Showing ${response.numbers.length} numbers`));
|
|
26
|
+
console.log();
|
|
27
|
+
table(response.numbers, [
|
|
28
|
+
{
|
|
29
|
+
header: "Number",
|
|
30
|
+
key: "phoneNumber",
|
|
31
|
+
width: 18,
|
|
32
|
+
formatter: (v) => colors.code(String(v)),
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
header: "Status",
|
|
36
|
+
key: "status",
|
|
37
|
+
width: 14,
|
|
38
|
+
formatter: (v) => formatStatus(String(v)),
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
header: "Country",
|
|
42
|
+
key: "countryCode",
|
|
43
|
+
width: 9,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
header: "Type",
|
|
47
|
+
key: "phoneNumberType",
|
|
48
|
+
width: 12,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
header: "Source",
|
|
52
|
+
key: "source",
|
|
53
|
+
width: 12,
|
|
54
|
+
formatter: (v) => {
|
|
55
|
+
const s = String(v);
|
|
56
|
+
return s === "purchased"
|
|
57
|
+
? "Bought"
|
|
58
|
+
: s === "ported_hosted_sms"
|
|
59
|
+
? "Hosted SMS"
|
|
60
|
+
: s === "ported_full"
|
|
61
|
+
? "Ported"
|
|
62
|
+
: s === "provisioned"
|
|
63
|
+
? "Provisioned"
|
|
64
|
+
: s;
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9udW1iZXJzL2xpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFDTCxLQUFLLEVBQ0wsSUFBSSxFQUNKLElBQUksRUFDSixZQUFZLEVBQ1osTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBbUI3QixNQUFNLENBQUMsT0FBTyxPQUFPLFdBQVksU0FBUSxvQkFBb0I7SUFDM0QsTUFBTSxDQUFDLFdBQVcsR0FBRyx3Q0FBd0MsQ0FBQztJQUU5RCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLGdDQUFnQztRQUNoQyx1Q0FBdUM7S0FDeEMsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7S0FDbEMsQ0FBQztJQUVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FDbEMsaUJBQWlCLENBQ2xCLENBQUM7UUFFRixJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsd0VBQXdFLENBQUMsQ0FBQztZQUMvRSxPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVkLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQ3RCO2dCQUNFLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixHQUFHLEVBQUUsYUFBYTtnQkFDbEIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6QztZQUNEO2dCQUNFLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixHQUFHLEVBQUUsUUFBUTtnQkFDYixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUM7WUFDRDtnQkFDRSxNQUFNLEVBQUUsU0FBUztnQkFDakIsR0FBRyxFQUFFLGFBQWE7Z0JBQ2xCLEtBQUssRUFBRSxDQUFDO2FBQ1Q7WUFDRDtnQkFDRSxNQUFNLEVBQUUsTUFBTTtnQkFDZCxHQUFHLEVBQUUsaUJBQWlCO2dCQUN0QixLQUFLLEVBQUUsRUFBRTthQUNWO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEdBQUcsRUFBRSxRQUFRO2dCQUNiLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNmLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEIsT0FBTyxDQUFDLEtBQUssV0FBVzt3QkFDdEIsQ0FBQyxDQUFDLFFBQVE7d0JBQ1YsQ0FBQyxDQUFDLENBQUMsS0FBSyxtQkFBbUI7NEJBQ3pCLENBQUMsQ0FBQyxZQUFZOzRCQUNkLENBQUMsQ0FBQyxDQUFDLEtBQUssYUFBYTtnQ0FDbkIsQ0FBQyxDQUFDLFFBQVE7Z0NBQ1YsQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhO29DQUNuQixDQUFDLENBQUMsYUFBYTtvQ0FDZixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNkLENBQUM7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHRhYmxlLFxuICBqc29uLFxuICBpbmZvLFxuICBmb3JtYXRTdGF0dXMsXG4gIGNvbG9ycyxcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIE93bmVkTnVtYmVyIHtcbiAgaWQ6IHN0cmluZztcbiAgcGhvbmVOdW1iZXI6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICBjb3VudHJ5Q29kZTogc3RyaW5nO1xuICBwaG9uZU51bWJlclR5cGU6IHN0cmluZztcbiAgbW9udGhseUNvc3RDZW50czogbnVtYmVyO1xuICByZXF1aXJlbWVudHNTdWJtaXR0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgcGVuZGluZ0NhbmNlbGxhdGlvbjogYm9vbGVhbjtcbiAgc2NoZWR1bGVkUmVsZWFzZUF0OiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgTGlzdE51bWJlcnNSZXNwb25zZSB7XG4gIG51bWJlcnM6IE93bmVkTnVtYmVyW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE51bWJlcnNMaXN0IGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIkxpc3QgdGhlIHBob25lIG51bWJlcnMgb24geW91ciBhY2NvdW50XCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gbnVtYmVycyBsaXN0XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBudW1iZXJzIGxpc3QgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJzZShOdW1iZXJzTGlzdCk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8TGlzdE51bWJlcnNSZXNwb25zZT4oXG4gICAgICBcIi9hcGkvdjEvbnVtYmVyc1wiLFxuICAgICk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKHJlc3BvbnNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm51bWJlcnMgfHwgcmVzcG9uc2UubnVtYmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8oXCJObyBwaG9uZSBudW1iZXJzIG9uIHlvdXIgYWNjb3VudCB5ZXQuIEJ1eSBvbmUgd2l0aDogc2VuZGx5IG51bWJlcnMgYnV5XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgU2hvd2luZyAke3Jlc3BvbnNlLm51bWJlcnMubGVuZ3RofSBudW1iZXJzYCkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICB0YWJsZShyZXNwb25zZS5udW1iZXJzLCBbXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJOdW1iZXJcIixcbiAgICAgICAga2V5OiBcInBob25lTnVtYmVyXCIsXG4gICAgICAgIHdpZHRoOiAxOCxcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4gY29sb3JzLmNvZGUoU3RyaW5nKHYpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJTdGF0dXNcIixcbiAgICAgICAga2V5OiBcInN0YXR1c1wiLFxuICAgICAgICB3aWR0aDogMTQsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGZvcm1hdFN0YXR1cyhTdHJpbmcodikpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIkNvdW50cnlcIixcbiAgICAgICAga2V5OiBcImNvdW50cnlDb2RlXCIsXG4gICAgICAgIHdpZHRoOiA5LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlR5cGVcIixcbiAgICAgICAga2V5OiBcInBob25lTnVtYmVyVHlwZVwiLFxuICAgICAgICB3aWR0aDogMTIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiU291cmNlXCIsXG4gICAgICAgIGtleTogXCJzb3VyY2VcIixcbiAgICAgICAgd2lkdGg6IDEyLFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgcyA9IFN0cmluZyh2KTtcbiAgICAgICAgICByZXR1cm4gcyA9PT0gXCJwdXJjaGFzZWRcIlxuICAgICAgICAgICAgPyBcIkJvdWdodFwiXG4gICAgICAgICAgICA6IHMgPT09IFwicG9ydGVkX2hvc3RlZF9zbXNcIlxuICAgICAgICAgICAgICA/IFwiSG9zdGVkIFNNU1wiXG4gICAgICAgICAgICAgIDogcyA9PT0gXCJwb3J0ZWRfZnVsbFwiXG4gICAgICAgICAgICAgICAgPyBcIlBvcnRlZFwiXG4gICAgICAgICAgICAgICAgOiBzID09PSBcInByb3Zpc2lvbmVkXCJcbiAgICAgICAgICAgICAgICAgID8gXCJQcm92aXNpb25lZFwiXG4gICAgICAgICAgICAgICAgICA6IHM7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
/**
|
|
3
|
+
* `sendly numbers release <id>` — give up a number you own. A live paid
|
|
4
|
+
* purchase is scheduled to release at the end of the current billing period
|
|
5
|
+
* (undo with `sendly numbers update <id> --keep`); anything else is released at
|
|
6
|
+
* the carrier immediately.
|
|
7
|
+
*
|
|
8
|
+
* Wraps `DELETE /api/v1/numbers/:id`. Prompts for confirmation unless --yes is
|
|
9
|
+
* passed. Returns 404 when the id isn't one of your numbers.
|
|
10
|
+
*/
|
|
11
|
+
export default class NumbersRelease extends AuthenticatedCommand {
|
|
12
|
+
static description: string;
|
|
13
|
+
static examples: string[];
|
|
14
|
+
static args: {
|
|
15
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
16
|
+
};
|
|
17
|
+
static flags: {
|
|
18
|
+
yes: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
19
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
20
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
21
|
+
};
|
|
22
|
+
run(): Promise<void>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Args, Flags } from "@oclif/core";
|
|
2
|
+
import inquirer from "inquirer";
|
|
3
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
4
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
5
|
+
import { success, info, json, colors, isJsonMode } from "../../lib/output.js";
|
|
6
|
+
/**
|
|
7
|
+
* `sendly numbers release <id>` — give up a number you own. A live paid
|
|
8
|
+
* purchase is scheduled to release at the end of the current billing period
|
|
9
|
+
* (undo with `sendly numbers update <id> --keep`); anything else is released at
|
|
10
|
+
* the carrier immediately.
|
|
11
|
+
*
|
|
12
|
+
* Wraps `DELETE /api/v1/numbers/:id`. Prompts for confirmation unless --yes is
|
|
13
|
+
* passed. Returns 404 when the id isn't one of your numbers.
|
|
14
|
+
*/
|
|
15
|
+
export default class NumbersRelease extends AuthenticatedCommand {
|
|
16
|
+
static description = "Release a number you own (paid purchases release at period end, others immediately)";
|
|
17
|
+
static examples = [
|
|
18
|
+
"<%= config.bin %> numbers release num_abc123",
|
|
19
|
+
"<%= config.bin %> numbers release num_abc123 --yes",
|
|
20
|
+
"<%= config.bin %> numbers release num_abc123 --json",
|
|
21
|
+
];
|
|
22
|
+
static args = {
|
|
23
|
+
id: Args.string({
|
|
24
|
+
description: "Phone number ID (from `sendly numbers list`)",
|
|
25
|
+
required: true,
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
static flags = {
|
|
29
|
+
...AuthenticatedCommand.baseFlags,
|
|
30
|
+
yes: Flags.boolean({
|
|
31
|
+
char: "y",
|
|
32
|
+
description: "Skip confirmation prompt",
|
|
33
|
+
default: false,
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
async run() {
|
|
37
|
+
const { args, flags } = await this.parse(NumbersRelease);
|
|
38
|
+
if (!flags.yes && !isJsonMode() && process.stdin.isTTY) {
|
|
39
|
+
const { confirm } = await inquirer.prompt([
|
|
40
|
+
{
|
|
41
|
+
type: "confirm",
|
|
42
|
+
name: "confirm",
|
|
43
|
+
message: `Release ${colors.code(args.id)}? Paid numbers release at the end of the billing period; everything else releases immediately.`,
|
|
44
|
+
default: false,
|
|
45
|
+
},
|
|
46
|
+
]);
|
|
47
|
+
if (!confirm) {
|
|
48
|
+
info("Release cancelled");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const response = await apiClient.delete(`/api/v1/numbers/${encodeURIComponent(args.id)}`);
|
|
53
|
+
if (isJsonMode()) {
|
|
54
|
+
json(response);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (response.scheduled && response.scheduledReleaseAt) {
|
|
58
|
+
success("Number scheduled for release", {
|
|
59
|
+
Releases: new Date(response.scheduledReleaseAt).toLocaleDateString(),
|
|
60
|
+
Note: `It stays active until then. Undo with: sendly numbers update ${args.id} --keep`,
|
|
61
|
+
});
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
success("Number released");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsZWFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9udW1iZXJzL3JlbGVhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBUTlFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxjQUFlLFNBQVEsb0JBQW9CO0lBQzlELE1BQU0sQ0FBQyxXQUFXLEdBQ2hCLHFGQUFxRixDQUFDO0lBRXhGLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsOENBQThDO1FBQzlDLG9EQUFvRDtRQUNwRCxxREFBcUQ7S0FDdEQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSw4Q0FBOEM7WUFDM0QsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsMEJBQTBCO1lBQ3ZDLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2RCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUN4QztvQkFDRSxJQUFJLEVBQUUsU0FBUztvQkFDZixJQUFJLEVBQUUsU0FBUztvQkFDZixPQUFPLEVBQUUsV0FBVyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZ0dBQWdHO29CQUN4SSxPQUFPLEVBQUUsS0FBSztpQkFDZjthQUNGLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDMUIsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUNyQyxtQkFBbUIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQ2pELENBQUM7UUFFRixJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDdEQsT0FBTyxDQUFDLDhCQUE4QixFQUFFO2dCQUN0QyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ3BFLElBQUksRUFBRSxnRUFBZ0UsSUFBSSxDQUFDLEVBQUUsU0FBUzthQUN2RixDQUFDLENBQUM7WUFDSCxPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcmdzLCBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IGlucXVpcmVyIGZyb20gXCJpbnF1aXJlclwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQgeyBzdWNjZXNzLCBpbmZvLCBqc29uLCBjb2xvcnMsIGlzSnNvbk1vZGUgfSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgUmVsZWFzZVJlc3BvbnNlIHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgc2NoZWR1bGVkPzogYm9vbGVhbjtcbiAgc2NoZWR1bGVkUmVsZWFzZUF0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIGBzZW5kbHkgbnVtYmVycyByZWxlYXNlIDxpZD5gIOKAlCBnaXZlIHVwIGEgbnVtYmVyIHlvdSBvd24uIEEgbGl2ZSBwYWlkXG4gKiBwdXJjaGFzZSBpcyBzY2hlZHVsZWQgdG8gcmVsZWFzZSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGJpbGxpbmcgcGVyaW9kXG4gKiAodW5kbyB3aXRoIGBzZW5kbHkgbnVtYmVycyB1cGRhdGUgPGlkPiAtLWtlZXBgKTsgYW55dGhpbmcgZWxzZSBpcyByZWxlYXNlZCBhdFxuICogdGhlIGNhcnJpZXIgaW1tZWRpYXRlbHkuXG4gKlxuICogV3JhcHMgYERFTEVURSAvYXBpL3YxL251bWJlcnMvOmlkYC4gUHJvbXB0cyBmb3IgY29uZmlybWF0aW9uIHVubGVzcyAtLXllcyBpc1xuICogcGFzc2VkLiBSZXR1cm5zIDQwNCB3aGVuIHRoZSBpZCBpc24ndCBvbmUgb2YgeW91ciBudW1iZXJzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOdW1iZXJzUmVsZWFzZSBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID1cbiAgICBcIlJlbGVhc2UgYSBudW1iZXIgeW91IG93biAocGFpZCBwdXJjaGFzZXMgcmVsZWFzZSBhdCBwZXJpb2QgZW5kLCBvdGhlcnMgaW1tZWRpYXRlbHkpXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gbnVtYmVycyByZWxlYXNlIG51bV9hYmMxMjNcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IG51bWJlcnMgcmVsZWFzZSBudW1fYWJjMTIzIC0teWVzXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBudW1iZXJzIHJlbGVhc2UgbnVtX2FiYzEyMyAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBpZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiUGhvbmUgbnVtYmVyIElEIChmcm9tIGBzZW5kbHkgbnVtYmVycyBsaXN0YClcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgeWVzOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwieVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiU2tpcCBjb25maXJtYXRpb24gcHJvbXB0XCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShOdW1iZXJzUmVsZWFzZSk7XG5cbiAgICBpZiAoIWZsYWdzLnllcyAmJiAhaXNKc29uTW9kZSgpICYmIHByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICAgIGNvbnN0IHsgY29uZmlybSB9ID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICAgIG5hbWU6IFwiY29uZmlybVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBSZWxlYXNlICR7Y29sb3JzLmNvZGUoYXJncy5pZCl9PyBQYWlkIG51bWJlcnMgcmVsZWFzZSBhdCB0aGUgZW5kIG9mIHRoZSBiaWxsaW5nIHBlcmlvZDsgZXZlcnl0aGluZyBlbHNlIHJlbGVhc2VzIGltbWVkaWF0ZWx5LmAsXG4gICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGlmICghY29uZmlybSkge1xuICAgICAgICBpbmZvKFwiUmVsZWFzZSBjYW5jZWxsZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5kZWxldGU8UmVsZWFzZVJlc3BvbnNlPihcbiAgICAgIGAvYXBpL3YxL251bWJlcnMvJHtlbmNvZGVVUklDb21wb25lbnQoYXJncy5pZCl9YCxcbiAgICApO1xuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnNjaGVkdWxlZCAmJiByZXNwb25zZS5zY2hlZHVsZWRSZWxlYXNlQXQpIHtcbiAgICAgIHN1Y2Nlc3MoXCJOdW1iZXIgc2NoZWR1bGVkIGZvciByZWxlYXNlXCIsIHtcbiAgICAgICAgUmVsZWFzZXM6IG5ldyBEYXRlKHJlc3BvbnNlLnNjaGVkdWxlZFJlbGVhc2VBdCkudG9Mb2NhbGVEYXRlU3RyaW5nKCksXG4gICAgICAgIE5vdGU6IGBJdCBzdGF5cyBhY3RpdmUgdW50aWwgdGhlbi4gVW5kbyB3aXRoOiBzZW5kbHkgbnVtYmVycyB1cGRhdGUgJHthcmdzLmlkfSAtLWtlZXBgLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VjY2VzcyhcIk51bWJlciByZWxlYXNlZFwiKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class NumbersSearch extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
country: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
7
|
+
type: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
8
|
+
contains: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
9
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
10
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|