@sendly/cli 3.35.0 → 3.36.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/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/numbers/buy.d.ts +31 -0
- package/dist/commands/numbers/buy.js +252 -0
- package/dist/commands/numbers/list.d.ts +10 -0
- package/dist/commands/numbers/list.js +53 -0
- package/dist/commands/numbers/search.d.ts +13 -0
- package/dist/commands/numbers/search.js +78 -0
- 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 +1931 -622
- package/package.json +7 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
1
2
|
const HOMEBREW_PREFIX_MARKERS = [
|
|
2
3
|
"/opt/homebrew/",
|
|
3
4
|
"/usr/local/Cellar/",
|
|
@@ -5,21 +6,36 @@ const HOMEBREW_PREFIX_MARKERS = [
|
|
|
5
6
|
"/Cellar/",
|
|
6
7
|
];
|
|
7
8
|
export function detectInstallPath() {
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
// The resolved binary path is the only authoritative signal of how
|
|
10
|
+
// this CLI was installed. `process.argv[1]` is the entry script — npm
|
|
11
|
+
// globals live under `node_modules`, Homebrew installs live under a
|
|
12
|
+
// Cellar/brew prefix.
|
|
13
|
+
//
|
|
14
|
+
// Resolve symlinks so an `npm install -g` that drops a symlink in
|
|
15
|
+
// `~/.nvm/.../bin/sendly -> ../lib/node_modules/...` is correctly
|
|
16
|
+
// classified as "npm" via the resolved target, not "unknown" via the
|
|
17
|
+
// unresolved symlink.
|
|
18
|
+
const argv1 = process.argv[1] ?? "";
|
|
19
|
+
let binPath = argv1;
|
|
20
|
+
try {
|
|
21
|
+
if (argv1)
|
|
22
|
+
binPath = fs.realpathSync(argv1);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// realpath can fail on broken symlinks or weird FS layouts —
|
|
26
|
+
// fall back to the unresolved argv[1].
|
|
27
|
+
binPath = argv1;
|
|
11
28
|
}
|
|
12
|
-
// Fallback — look at the bin path. `process.argv[1]` is the entry
|
|
13
|
-
// script; for Homebrew installs it lives under Cellar/libexec. For npm
|
|
14
|
-
// globals it lives under the npm prefix (e.g. /usr/local/lib/node_modules).
|
|
15
|
-
const binPath = process.argv[1] ?? "";
|
|
16
29
|
for (const marker of HOMEBREW_PREFIX_MARKERS) {
|
|
17
30
|
if (binPath.includes(marker))
|
|
18
31
|
return "homebrew";
|
|
19
32
|
}
|
|
20
|
-
// `node_modules` is the tell-tale for any npm install (global or local).
|
|
21
33
|
if (binPath.includes("/node_modules/"))
|
|
22
34
|
return "npm";
|
|
35
|
+
// Path was inconclusive (e.g. running from a source checkout). Don't
|
|
36
|
+
// guess from `HOMEBREW_CELLAR` — its presence only proves brew exists
|
|
37
|
+
// on the machine, not that this CLI was installed by it. Return
|
|
38
|
+
// "unknown" so the upgrade command prints both options for the user.
|
|
23
39
|
return "unknown";
|
|
24
40
|
}
|
|
25
41
|
/**
|
|
@@ -35,4 +51,4 @@ export function upgradeCommandFor(path) {
|
|
|
35
51
|
return "npm install -g @sendly/cli@latest # or: brew upgrade sendly";
|
|
36
52
|
}
|
|
37
53
|
}
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0LWluc3RhbGwtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZGV0ZWN0LWluc3RhbGwtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQXVCOUIsTUFBTSx1QkFBdUIsR0FBRztJQUM5QixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixVQUFVO0NBQ1gsQ0FBQztBQUVGLE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsbUVBQW1FO0lBQ25FLHNFQUFzRTtJQUN0RSxvRUFBb0U7SUFDcEUsc0JBQXNCO0lBQ3RCLEVBQUU7SUFDRixrRUFBa0U7SUFDbEUsa0VBQWtFO0lBQ2xFLHFFQUFxRTtJQUNyRSxzQkFBc0I7SUFDdEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLElBQUksQ0FBQztRQUNILElBQUksS0FBSztZQUFFLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCw2REFBNkQ7UUFDN0QsdUNBQXVDO1FBQ3ZDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDbEIsQ0FBQztJQUVELEtBQUssTUFBTSxNQUFNLElBQUksdUJBQXVCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxVQUFVLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXJELHFFQUFxRTtJQUNyRSxzRUFBc0U7SUFDdEUsZ0VBQWdFO0lBQ2hFLHFFQUFxRTtJQUNyRSxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBaUI7SUFDakQsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssVUFBVTtZQUNiLE9BQU8scUJBQXFCLENBQUM7UUFDL0IsS0FBSyxLQUFLO1lBQ1IsT0FBTyxtQ0FBbUMsQ0FBQztRQUM3QztZQUNFLE9BQU8sOERBQThELENBQUM7SUFDMUUsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuXG4vKipcbiAqIERldGVjdCBob3cgdGhlIGBAc2VuZGx5L2NsaWAgYmluYXJ5IHdhcyBpbnN0YWxsZWQgc28gYHNlbmRseSB1cGdyYWRlYFxuICogY2FuIHNoZWxsIG91dCB0byB0aGUgY29ycmVjdCBwYWNrYWdlIG1hbmFnZXIuXG4gKlxuICogV2Ugc3VwcG9ydCB0d28gaW5zdGFsbCBwYXRocyBleHBsaWNpdGx5OlxuICogICAtIEhvbWVicmV3IOKAlCBmcm9tIHRoZSBTZW5kbHlIUS9ob21lYnJldy10YXAgZm9ybXVsYVxuICogICAgIChgYnJldyBpbnN0YWxsIHNlbmRseS1saXZlL3RhcC9zZW5kbHlgKS4gRGV0ZWN0ZWQgYnkgdGhlIHJlc29sdmVkXG4gKiAgICAgYmluYXJ5IHBhdGggbGl2aW5nIHVuZGVyIGEgSG9tZWJyZXctb3duZWQgcHJlZml4LlxuICogICAtIG5wbSBnbG9iYWwg4oCUIGBucG0gaW5zdGFsbCAtZyBAc2VuZGx5L2NsaWAuIERldGVjdGVkIGJ5IHRoZVxuICogICAgIHJlc29sdmVkIGJpbmFyeSBwYXRoIGxpdmluZyB1bmRlciBgbm9kZV9tb2R1bGVzYC5cbiAqXG4gKiBUaGUgYEhPTUVCUkVXX0NFTExBUmAgZW52IHZhciBpcyBOT1QgYSByZWxpYWJsZSBzaWduYWwgb24gaXRzIG93biDigJRcbiAqIGl0J3Mgc2V0IGluIGV2ZXJ5IHNoZWxsIHdoZXJlIEhvbWVicmV3IGlzIG9uIFBBVEgsIGV2ZW4gd2hlbiB0aGUgQ0xJXG4gKiB3YXMgaW5zdGFsbGVkIHZpYSBucG0uIFBhdGgtYmFzZWQgZGV0ZWN0aW9uIGlzIGF1dGhvcml0YXRpdmU7IHRoZSBlbnZcbiAqIHZhciBvbmx5IGFjdHMgYXMgYSB0aWVicmVha2VyIGZvciB1bnVzdWFsIGxheW91dHMuXG4gKlxuICogUmV0dXJucyBgXCJ1bmtub3duXCJgIG9ubHkgd2hlbiB3ZSBjYW4ndCBkZXRlcm1pbmUgZWl0aGVyLiBUaGF0J3MgcmFyZSBpblxuICogcHJhY3RpY2U7IHRoZSBgdXBncmFkZWAgY29tbWFuZCBoYW5kbGVzIGl0IGJ5IHByaW50aW5nIGJvdGggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbFBhdGggPSBcImhvbWVicmV3XCIgfCBcIm5wbVwiIHwgXCJ1bmtub3duXCI7XG5cbmNvbnN0IEhPTUVCUkVXX1BSRUZJWF9NQVJLRVJTID0gW1xuICBcIi9vcHQvaG9tZWJyZXcvXCIsXG4gIFwiL3Vzci9sb2NhbC9DZWxsYXIvXCIsXG4gIFwiL2hvbWUvbGludXhicmV3L1wiLFxuICBcIi9DZWxsYXIvXCIsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0SW5zdGFsbFBhdGgoKTogSW5zdGFsbFBhdGgge1xuICAvLyBUaGUgcmVzb2x2ZWQgYmluYXJ5IHBhdGggaXMgdGhlIG9ubHkgYXV0aG9yaXRhdGl2ZSBzaWduYWwgb2YgaG93XG4gIC8vIHRoaXMgQ0xJIHdhcyBpbnN0YWxsZWQuIGBwcm9jZXNzLmFyZ3ZbMV1gIGlzIHRoZSBlbnRyeSBzY3JpcHQg4oCUIG5wbVxuICAvLyBnbG9iYWxzIGxpdmUgdW5kZXIgYG5vZGVfbW9kdWxlc2AsIEhvbWVicmV3IGluc3RhbGxzIGxpdmUgdW5kZXIgYVxuICAvLyBDZWxsYXIvYnJldyBwcmVmaXguXG4gIC8vXG4gIC8vIFJlc29sdmUgc3ltbGlua3Mgc28gYW4gYG5wbSBpbnN0YWxsIC1nYCB0aGF0IGRyb3BzIGEgc3ltbGluayBpblxuICAvLyBgfi8ubnZtLy4uLi9iaW4vc2VuZGx5IC0+IC4uL2xpYi9ub2RlX21vZHVsZXMvLi4uYCBpcyBjb3JyZWN0bHlcbiAgLy8gY2xhc3NpZmllZCBhcyBcIm5wbVwiIHZpYSB0aGUgcmVzb2x2ZWQgdGFyZ2V0LCBub3QgXCJ1bmtub3duXCIgdmlhIHRoZVxuICAvLyB1bnJlc29sdmVkIHN5bWxpbmsuXG4gIGNvbnN0IGFyZ3YxID0gcHJvY2Vzcy5hcmd2WzFdID8/IFwiXCI7XG4gIGxldCBiaW5QYXRoID0gYXJndjE7XG4gIHRyeSB7XG4gICAgaWYgKGFyZ3YxKSBiaW5QYXRoID0gZnMucmVhbHBhdGhTeW5jKGFyZ3YxKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gcmVhbHBhdGggY2FuIGZhaWwgb24gYnJva2VuIHN5bWxpbmtzIG9yIHdlaXJkIEZTIGxheW91dHMg4oCUXG4gICAgLy8gZmFsbCBiYWNrIHRvIHRoZSB1bnJlc29sdmVkIGFyZ3ZbMV0uXG4gICAgYmluUGF0aCA9IGFyZ3YxO1xuICB9XG5cbiAgZm9yIChjb25zdCBtYXJrZXIgb2YgSE9NRUJSRVdfUFJFRklYX01BUktFUlMpIHtcbiAgICBpZiAoYmluUGF0aC5pbmNsdWRlcyhtYXJrZXIpKSByZXR1cm4gXCJob21lYnJld1wiO1xuICB9XG5cbiAgaWYgKGJpblBhdGguaW5jbHVkZXMoXCIvbm9kZV9tb2R1bGVzL1wiKSkgcmV0dXJuIFwibnBtXCI7XG5cbiAgLy8gUGF0aCB3YXMgaW5jb25jbHVzaXZlIChlLmcuIHJ1bm5pbmcgZnJvbSBhIHNvdXJjZSBjaGVja291dCkuIERvbid0XG4gIC8vIGd1ZXNzIGZyb20gYEhPTUVCUkVXX0NFTExBUmAg4oCUIGl0cyBwcmVzZW5jZSBvbmx5IHByb3ZlcyBicmV3IGV4aXN0c1xuICAvLyBvbiB0aGUgbWFjaGluZSwgbm90IHRoYXQgdGhpcyBDTEkgd2FzIGluc3RhbGxlZCBieSBpdC4gUmV0dXJuXG4gIC8vIFwidW5rbm93blwiIHNvIHRoZSB1cGdyYWRlIGNvbW1hbmQgcHJpbnRzIGJvdGggb3B0aW9ucyBmb3IgdGhlIHVzZXIuXG4gIHJldHVybiBcInVua25vd25cIjtcbn1cblxuLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSB1cGdyYWRlIGNvbW1hbmQgZm9yIHRoZSBkZXRlY3RlZCBpbnN0YWxsIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGdyYWRlQ29tbWFuZEZvcihwYXRoOiBJbnN0YWxsUGF0aCk6IHN0cmluZyB7XG4gIHN3aXRjaCAocGF0aCkge1xuICAgIGNhc2UgXCJob21lYnJld1wiOlxuICAgICAgcmV0dXJuIFwiYnJldyB1cGdyYWRlIHNlbmRseVwiO1xuICAgIGNhc2UgXCJucG1cIjpcbiAgICAgIHJldHVybiBcIm5wbSBpbnN0YWxsIC1nIEBzZW5kbHkvY2xpQGxhdGVzdFwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJucG0gaW5zdGFsbCAtZyBAc2VuZGx5L2NsaUBsYXRlc3QgICMgb3I6IGJyZXcgdXBncmFkZSBzZW5kbHlcIjtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared interactive-terminal helpers: press-[c]-to-copy a URL to the
|
|
3
|
+
* clipboard and [q]/Ctrl-C to cancel while the CLI polls a remote action
|
|
4
|
+
* (browser login, hosted document upload / payment for number purchases).
|
|
5
|
+
*
|
|
6
|
+
* Both helpers were originally private to auth.ts; they now live here so
|
|
7
|
+
* the numbers buy flow can reuse the exact same UX without duplicating it.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Wire up the copy-URL / cancel keybindings while polling a remote
|
|
11
|
+
* action. Only active on a real interactive TTY — in CI, piped stdin, or
|
|
12
|
+
* when stdin.setRawMode is missing we no-op and return a cleanup that
|
|
13
|
+
* also no-ops.
|
|
14
|
+
*
|
|
15
|
+
* Returns a cleanup function that the caller MUST invoke on every exit
|
|
16
|
+
* path (success, timeout, error) so the terminal doesn't stay in raw
|
|
17
|
+
* mode. Calling cleanup twice is safe.
|
|
18
|
+
*/
|
|
19
|
+
export declare function attachLoginKeypressHandler(urlToCopy: string): () => void;
|
|
20
|
+
/**
|
|
21
|
+
* Copy text to the system clipboard via the OS's native tool. Returns
|
|
22
|
+
* true if the write succeeded. Does not throw. Shells out rather than
|
|
23
|
+
* adding a native clipboard dep — the three commands (pbcopy / clip /
|
|
24
|
+
* xclip / wl-copy) cover every platform the CLI runs on.
|
|
25
|
+
*/
|
|
26
|
+
export declare function copyToClipboard(text: string): Promise<boolean>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared interactive-terminal helpers: press-[c]-to-copy a URL to the
|
|
3
|
+
* clipboard and [q]/Ctrl-C to cancel while the CLI polls a remote action
|
|
4
|
+
* (browser login, hosted document upload / payment for number purchases).
|
|
5
|
+
*
|
|
6
|
+
* Both helpers were originally private to auth.ts; they now live here so
|
|
7
|
+
* the numbers buy flow can reuse the exact same UX without duplicating it.
|
|
8
|
+
*/
|
|
9
|
+
import { colors } from "./output.js";
|
|
10
|
+
/**
|
|
11
|
+
* Wire up the copy-URL / cancel keybindings while polling a remote
|
|
12
|
+
* action. Only active on a real interactive TTY — in CI, piped stdin, or
|
|
13
|
+
* when stdin.setRawMode is missing we no-op and return a cleanup that
|
|
14
|
+
* also no-ops.
|
|
15
|
+
*
|
|
16
|
+
* Returns a cleanup function that the caller MUST invoke on every exit
|
|
17
|
+
* path (success, timeout, error) so the terminal doesn't stay in raw
|
|
18
|
+
* mode. Calling cleanup twice is safe.
|
|
19
|
+
*/
|
|
20
|
+
export function attachLoginKeypressHandler(urlToCopy) {
|
|
21
|
+
const stdin = process.stdin;
|
|
22
|
+
if (!stdin.isTTY || typeof stdin.setRawMode !== "function") {
|
|
23
|
+
return () => { };
|
|
24
|
+
}
|
|
25
|
+
let cleaned = false;
|
|
26
|
+
const previousRawMode = stdin.isRaw;
|
|
27
|
+
console.log(colors.dim("Press [c] to copy URL to clipboard · [q] or Ctrl-C to cancel"));
|
|
28
|
+
const onData = (key) => {
|
|
29
|
+
const k = typeof key === "string" ? key : key.toString("utf8");
|
|
30
|
+
if (k === "c" || k === "C") {
|
|
31
|
+
copyToClipboard(urlToCopy)
|
|
32
|
+
.then((ok) => {
|
|
33
|
+
if (ok) {
|
|
34
|
+
// Overwrite the hint line with a transient confirmation.
|
|
35
|
+
process.stdout.write("\r" + " ".repeat(70) + "\r" + colors.success(" ✓ URL copied to clipboard\n"));
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
process.stdout.write("\r" + colors.warning(" ✗ Could not copy — copy the URL manually\n"));
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
.catch(() => { });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (k === "q" || k === "Q" || k === "\u0003") {
|
|
45
|
+
cleanup();
|
|
46
|
+
console.log(colors.warning("\n Cancelled."));
|
|
47
|
+
process.exit(130);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
stdin.setRawMode(true);
|
|
51
|
+
stdin.resume();
|
|
52
|
+
stdin.setEncoding("utf8");
|
|
53
|
+
stdin.on("data", onData);
|
|
54
|
+
const cleanup = () => {
|
|
55
|
+
if (cleaned)
|
|
56
|
+
return;
|
|
57
|
+
cleaned = true;
|
|
58
|
+
try {
|
|
59
|
+
stdin.removeListener("data", onData);
|
|
60
|
+
stdin.setRawMode(previousRawMode);
|
|
61
|
+
stdin.pause();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
/* no-op */
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
return cleanup;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Copy text to the system clipboard via the OS's native tool. Returns
|
|
71
|
+
* true if the write succeeded. Does not throw. Shells out rather than
|
|
72
|
+
* adding a native clipboard dep — the three commands (pbcopy / clip /
|
|
73
|
+
* xclip / wl-copy) cover every platform the CLI runs on.
|
|
74
|
+
*/
|
|
75
|
+
export async function copyToClipboard(text) {
|
|
76
|
+
const { spawn } = await import("node:child_process");
|
|
77
|
+
const candidates = process.platform === "darwin"
|
|
78
|
+
? [["pbcopy", []]]
|
|
79
|
+
: process.platform === "win32"
|
|
80
|
+
? [["clip", []]]
|
|
81
|
+
: [
|
|
82
|
+
["wl-copy", []],
|
|
83
|
+
["xclip", ["-selection", "clipboard"]],
|
|
84
|
+
["xsel", ["--clipboard", "--input"]],
|
|
85
|
+
];
|
|
86
|
+
for (const [cmd, args] of candidates) {
|
|
87
|
+
try {
|
|
88
|
+
const ok = await new Promise((resolve) => {
|
|
89
|
+
const child = spawn(cmd, args, { stdio: ["pipe", "ignore", "ignore"] });
|
|
90
|
+
child.on("error", () => resolve(false));
|
|
91
|
+
child.on("exit", (code) => resolve(code === 0));
|
|
92
|
+
child.stdin.end(text);
|
|
93
|
+
});
|
|
94
|
+
if (ok)
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// try next candidate
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5cHJlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2tleXByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJDOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxTQUFpQjtJQUMxRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFFcEMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUNSLDhEQUE4RCxDQUMvRCxDQUNGLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQW9CLEVBQVEsRUFBRTtRQUM1QyxNQUFNLENBQUMsR0FBRyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzNCLGVBQWUsQ0FBQyxTQUFTLENBQUM7aUJBQ3ZCLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNYLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ1AseURBQXlEO29CQUN6RCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDbEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENB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QUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxFQUFFO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxxQkFBcUI7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCBpbnRlcmFjdGl2ZS10ZXJtaW5hbCBoZWxwZXJzOiBwcmVzcy1bY10tdG8tY29weSBhIFVSTCB0byB0aGVcbiAqIGNsaXBib2FyZCBhbmQgW3FdL0N0cmwtQyB0byBjYW5jZWwgd2hpbGUgdGhlIENMSSBwb2xscyBhIHJlbW90ZSBhY3Rpb25cbiAqIChicm93c2VyIGxvZ2luLCBob3N0ZWQgZG9jdW1lbnQgdXBsb2FkIC8gcGF5bWVudCBmb3IgbnVtYmVyIHB1cmNoYXNlcykuXG4gKlxuICogQm90aCBoZWxwZXJzIHdlcmUgb3JpZ2luYWxseSBwcml2YXRlIHRvIGF1dGgudHM7IHRoZXkgbm93IGxpdmUgaGVyZSBzb1xuICogdGhlIG51bWJlcnMgYnV5IGZsb3cgY2FuIHJldXNlIHRoZSBleGFjdCBzYW1lIFVYIHdpdGhvdXQgZHVwbGljYXRpbmcgaXQuXG4gKi9cblxuaW1wb3J0IHsgY29sb3JzIH0gZnJvbSBcIi4vb3V0cHV0LmpzXCI7XG5cbi8qKlxuICogV2lyZSB1cCB0aGUgY29weS1VUkwgLyBjYW5jZWwga2V5YmluZGluZ3Mgd2hpbGUgcG9sbGluZyBhIHJlbW90ZVxuICogYWN0aW9uLiBPbmx5IGFjdGl2ZSBvbiBhIHJlYWwgaW50ZXJhY3RpdmUgVFRZIOKAlCBpbiBDSSwgcGlwZWQgc3RkaW4sIG9yXG4gKiB3aGVuIHN0ZGluLnNldFJhd01vZGUgaXMgbWlzc2luZyB3ZSBuby1vcCBhbmQgcmV0dXJuIGEgY2xlYW51cCB0aGF0XG4gKiBhbHNvIG5vLW9wcy5cbiAqXG4gKiBSZXR1cm5zIGEgY2xlYW51cCBmdW5jdGlvbiB0aGF0IHRoZSBjYWxsZXIgTVVTVCBpbnZva2Ugb24gZXZlcnkgZXhpdFxuICogcGF0aCAoc3VjY2VzcywgdGltZW91dCwgZXJyb3IpIHNvIHRoZSB0ZXJtaW5hbCBkb2Vzbid0IHN0YXkgaW4gcmF3XG4gKiBtb2RlLiBDYWxsaW5nIGNsZWFudXAgdHdpY2UgaXMgc2FmZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaExvZ2luS2V5cHJlc3NIYW5kbGVyKHVybFRvQ29weTogc3RyaW5nKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHN0ZGluID0gcHJvY2Vzcy5zdGRpbjtcbiAgaWYgKCFzdGRpbi5pc1RUWSB8fCB0eXBlb2Ygc3RkaW4uc2V0UmF3TW9kZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IHt9O1xuICB9XG5cbiAgbGV0IGNsZWFuZWQgPSBmYWxzZTtcbiAgY29uc3QgcHJldmlvdXNSYXdNb2RlID0gc3RkaW4uaXNSYXc7XG5cbiAgY29uc29sZS5sb2coXG4gICAgY29sb3JzLmRpbShcbiAgICAgIFwiUHJlc3MgW2NdIHRvIGNvcHkgVVJMIHRvIGNsaXBib2FyZCDCtyBbcV0gb3IgQ3RybC1DIHRvIGNhbmNlbFwiLFxuICAgICksXG4gICk7XG5cbiAgY29uc3Qgb25EYXRhID0gKGtleTogQnVmZmVyIHwgc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgayA9IHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgPyBrZXkgOiBrZXkudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgIGlmIChrID09PSBcImNcIiB8fCBrID09PSBcIkNcIikge1xuICAgICAgY29weVRvQ2xpcGJvYXJkKHVybFRvQ29weSlcbiAgICAgICAgLnRoZW4oKG9rKSA9PiB7XG4gICAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIGhpbnQgbGluZSB3aXRoIGEgdHJhbnNpZW50IGNvbmZpcm1hdGlvbi5cbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKFxuICAgICAgICAgICAgICBcIlxcclwiICsgXCIgXCIucmVwZWF0KDcwKSArIFwiXFxyXCIgKyBjb2xvcnMuc3VjY2VzcyhcIiAg4pyTIFVSTCBjb3BpZWQgdG8gY2xpcGJvYXJkXFxuXCIpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoXG4gICAgICAgICAgICAgIFwiXFxyXCIgKyBjb2xvcnMud2FybmluZyhcIiAg4pyXIENvdWxkIG5vdCBjb3B5IOKAlCBjb3B5IHRoZSBVUkwgbWFudWFsbHlcXG5cIiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGsgPT09IFwicVwiIHx8IGsgPT09IFwiUVwiIHx8IGsgPT09IFwiXFx1MDAwM1wiKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMud2FybmluZyhcIlxcbiAgQ2FuY2VsbGVkLlwiKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMTMwKTtcbiAgICB9XG4gIH07XG5cbiAgc3RkaW4uc2V0UmF3TW9kZSh0cnVlKTtcbiAgc3RkaW4ucmVzdW1lKCk7XG4gIHN0ZGluLnNldEVuY29kaW5nKFwidXRmOFwiKTtcbiAgc3RkaW4ub24oXCJkYXRhXCIsIG9uRGF0YSk7XG5cbiAgY29uc3QgY2xlYW51cCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoY2xlYW5lZCkgcmV0dXJuO1xuICAgIGNsZWFuZWQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBzdGRpbi5yZW1vdmVMaXN0ZW5lcihcImRhdGFcIiwgb25EYXRhKTtcbiAgICAgIHN0ZGluLnNldFJhd01vZGUocHJldmlvdXNSYXdNb2RlKTtcbiAgICAgIHN0ZGluLnBhdXNlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBuby1vcCAqL1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gY2xlYW51cDtcbn1cblxuLyoqXG4gKiBDb3B5IHRleHQgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQgdmlhIHRoZSBPUydzIG5hdGl2ZSB0b29sLiBSZXR1cm5zXG4gKiB0cnVlIGlmIHRoZSB3cml0ZSBzdWNjZWVkZWQuIERvZXMgbm90IHRocm93LiBTaGVsbHMgb3V0IHJhdGhlciB0aGFuXG4gKiBhZGRpbmcgYSBuYXRpdmUgY2xpcGJvYXJkIGRlcCDigJQgdGhlIHRocmVlIGNvbW1hbmRzIChwYmNvcHkgLyBjbGlwIC9cbiAqIHhjbGlwIC8gd2wtY29weSkgY292ZXIgZXZlcnkgcGxhdGZvcm0gdGhlIENMSSBydW5zIG9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weVRvQ2xpcGJvYXJkKHRleHQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IHNwYXduIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ1tdXT4gPVxuICAgIHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCJcbiAgICAgID8gW1tcInBiY29weVwiLCBbXV1dXG4gICAgICA6IHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIlxuICAgICAgICA/IFtbXCJjbGlwXCIsIFtdXV1cbiAgICAgICAgOiBbXG4gICAgICAgICAgICBbXCJ3bC1jb3B5XCIsIFtdXSxcbiAgICAgICAgICAgIFtcInhjbGlwXCIsIFtcIi1zZWxlY3Rpb25cIiwgXCJjbGlwYm9hcmRcIl1dLFxuICAgICAgICAgICAgW1wieHNlbFwiLCBbXCItLWNsaXBib2FyZFwiLCBcIi0taW5wdXRcIl1dLFxuICAgICAgICAgIF07XG5cbiAgZm9yIChjb25zdCBbY21kLCBhcmdzXSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9rID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihjbWQsIGFyZ3MsIHsgc3RkaW86IFtcInBpcGVcIiwgXCJpZ25vcmVcIiwgXCJpZ25vcmVcIl0gfSk7XG4gICAgICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKCkgPT4gcmVzb2x2ZShmYWxzZSkpO1xuICAgICAgICBjaGlsZC5vbihcImV4aXRcIiwgKGNvZGUpID0+IHJlc29sdmUoY29kZSA9PT0gMCkpO1xuICAgICAgICBjaGlsZC5zdGRpbi5lbmQodGV4dCk7XG4gICAgICB9KTtcbiAgICAgIGlmIChvaykgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyB0cnkgbmV4dCBjYW5kaWRhdGVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
|