@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.
Files changed (32) hide show
  1. package/dist/commands/business-upgrade/cancel.d.ts +12 -0
  2. package/dist/commands/business-upgrade/cancel.js +47 -0
  3. package/dist/commands/business-upgrade/disposition.d.ts +13 -0
  4. package/dist/commands/business-upgrade/disposition.js +44 -0
  5. package/dist/commands/business-upgrade/preflight.d.ts +16 -0
  6. package/dist/commands/business-upgrade/preflight.js +82 -0
  7. package/dist/commands/business-upgrade/resubmit.d.ts +24 -0
  8. package/dist/commands/business-upgrade/resubmit.js +109 -0
  9. package/dist/commands/business-upgrade/start.d.ts +38 -0
  10. package/dist/commands/business-upgrade/start.js +142 -0
  11. package/dist/commands/business-upgrade/status.d.ts +11 -0
  12. package/dist/commands/business-upgrade/status.js +38 -0
  13. package/dist/commands/enterprise/verification/get.d.ts +13 -0
  14. package/dist/commands/enterprise/verification/get.js +78 -0
  15. package/dist/commands/enterprise/verification/resubmit.d.ts +41 -0
  16. package/dist/commands/enterprise/verification/resubmit.js +87 -0
  17. package/dist/commands/enterprise/verification/submit.d.ts +77 -0
  18. package/dist/commands/enterprise/verification/submit.js +212 -0
  19. package/dist/commands/numbers/buy.d.ts +31 -0
  20. package/dist/commands/numbers/buy.js +252 -0
  21. package/dist/commands/numbers/list.d.ts +10 -0
  22. package/dist/commands/numbers/list.js +53 -0
  23. package/dist/commands/numbers/search.d.ts +13 -0
  24. package/dist/commands/numbers/search.js +78 -0
  25. package/dist/lib/auth.js +2 -94
  26. package/dist/lib/config.js +31 -2
  27. package/dist/lib/detect-install-path.d.ts +11 -7
  28. package/dist/lib/detect-install-path.js +25 -9
  29. package/dist/lib/keypress.d.ts +26 -0
  30. package/dist/lib/keypress.js +103 -0
  31. package/oclif.manifest.json +1931 -622
  32. 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
- // Strongest signal the env var that `brew shellenv` sets.
9
- if (process.env.HOMEBREW_CELLAR) {
10
- return "homebrew";
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0LWluc3RhbGwtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZGV0ZWN0LWluc3RhbGwtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsTUFBTSx1QkFBdUIsR0FBRztJQUM5QixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixVQUFVO0NBQ1gsQ0FBQztBQUVGLE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsNERBQTREO0lBQzVELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNoQyxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLHVFQUF1RTtJQUN2RSw0RUFBNEU7SUFDNUUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLE1BQU0sSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzdDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFBRSxPQUFPLFVBQVUsQ0FBQztJQUNsRCxDQUFDO0lBRUQseUVBQXlFO0lBQ3pFLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXJELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFpQjtJQUNqRCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxVQUFVO1lBQ2IsT0FBTyxxQkFBcUIsQ0FBQztRQUMvQixLQUFLLEtBQUs7WUFDUixPQUFPLG1DQUFtQyxDQUFDO1FBQzdDO1lBQ0UsT0FBTyw4REFBOEQsQ0FBQztJQUMxRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGV0ZWN0IGhvdyB0aGUgYEBzZW5kbHkvY2xpYCBiaW5hcnkgd2FzIGluc3RhbGxlZCBzbyBgc2VuZGx5IHVwZ3JhZGVgXG4gKiBjYW4gc2hlbGwgb3V0IHRvIHRoZSBjb3JyZWN0IHBhY2thZ2UgbWFuYWdlci5cbiAqXG4gKiBXZSBzdXBwb3J0IHR3byBpbnN0YWxsIHBhdGhzIGV4cGxpY2l0bHk6XG4gKiAgIC0gSG9tZWJyZXcg4oCUIGZyb20gdGhlIFNlbmRseUhRL2hvbWVicmV3LXRhcCBmb3JtdWxhIChgYnJldyBpbnN0YWxsIHNlbmRseWApLlxuICogICAgIERldGVjdGVkIHZpYSB0aGUgYEhPTUVCUkVXX0NFTExBUmAgZW52IHZhciAoc2V0IGJ5IGV2ZXJ5IGJyZXctbWFuYWdlZFxuICogICAgIHNoZWxsKSBPUiBieSB0aGUgYmluYXJ5IHBhdGggbGl2aW5nIHVuZGVyIGEgSG9tZWJyZXctb3duZWQgcHJlZml4LlxuICogICAtIG5wbSBnbG9iYWwg4oCUIGBucG0gaW5zdGFsbCAtZyBAc2VuZGx5L2NsaWAuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYW5kXG4gKiAgICAgd2hhdCB3ZSBmYWxsIGJhY2sgdG8gd2hlbiB3ZSBjYW4ndCBpZGVudGlmeSBIb21lYnJldy5cbiAqXG4gKiBSZXR1cm5zIGBcInVua25vd25cImAgb25seSB3aGVuIHdlIGNhbid0IGRldGVybWluZSBlaXRoZXIuIFRoYXQncyByYXJlIGluXG4gKiBwcmFjdGljZSAobnBtIGluc3RhbGxzIGludG8gcHJlZGljdGFibGUgcGF0aHMpIGJ1dCB3ZSBoYW5kbGUgaXRcbiAqIGdyYWNlZnVsbHkgaW4gdGhlIGB1cGdyYWRlYCBjb21tYW5kIGJ5IHByaW50aW5nIGJvdGggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFsbFBhdGggPSBcImhvbWVicmV3XCIgfCBcIm5wbVwiIHwgXCJ1bmtub3duXCI7XG5cbmNvbnN0IEhPTUVCUkVXX1BSRUZJWF9NQVJLRVJTID0gW1xuICBcIi9vcHQvaG9tZWJyZXcvXCIsXG4gIFwiL3Vzci9sb2NhbC9DZWxsYXIvXCIsXG4gIFwiL2hvbWUvbGludXhicmV3L1wiLFxuICBcIi9DZWxsYXIvXCIsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0SW5zdGFsbFBhdGgoKTogSW5zdGFsbFBhdGgge1xuICAvLyBTdHJvbmdlc3Qgc2lnbmFsIOKAlCB0aGUgZW52IHZhciB0aGF0IGBicmV3IHNoZWxsZW52YCBzZXRzLlxuICBpZiAocHJvY2Vzcy5lbnYuSE9NRUJSRVdfQ0VMTEFSKSB7XG4gICAgcmV0dXJuIFwiaG9tZWJyZXdcIjtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIOKAlCBsb29rIGF0IHRoZSBiaW4gcGF0aC4gYHByb2Nlc3MuYXJndlsxXWAgaXMgdGhlIGVudHJ5XG4gIC8vIHNjcmlwdDsgZm9yIEhvbWVicmV3IGluc3RhbGxzIGl0IGxpdmVzIHVuZGVyIENlbGxhci9saWJleGVjLiBGb3IgbnBtXG4gIC8vIGdsb2JhbHMgaXQgbGl2ZXMgdW5kZXIgdGhlIG5wbSBwcmVmaXggKGUuZy4gL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzKS5cbiAgY29uc3QgYmluUGF0aCA9IHByb2Nlc3MuYXJndlsxXSA/PyBcIlwiO1xuICBmb3IgKGNvbnN0IG1hcmtlciBvZiBIT01FQlJFV19QUkVGSVhfTUFSS0VSUykge1xuICAgIGlmIChiaW5QYXRoLmluY2x1ZGVzKG1hcmtlcikpIHJldHVybiBcImhvbWVicmV3XCI7XG4gIH1cblxuICAvLyBgbm9kZV9tb2R1bGVzYCBpcyB0aGUgdGVsbC10YWxlIGZvciBhbnkgbnBtIGluc3RhbGwgKGdsb2JhbCBvciBsb2NhbCkuXG4gIGlmIChiaW5QYXRoLmluY2x1ZGVzKFwiL25vZGVfbW9kdWxlcy9cIikpIHJldHVybiBcIm5wbVwiO1xuXG4gIHJldHVybiBcInVua25vd25cIjtcbn1cblxuLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSB1cGdyYWRlIGNvbW1hbmQgZm9yIHRoZSBkZXRlY3RlZCBpbnN0YWxsIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGdyYWRlQ29tbWFuZEZvcihwYXRoOiBJbnN0YWxsUGF0aCk6IHN0cmluZyB7XG4gIHN3aXRjaCAocGF0aCkge1xuICAgIGNhc2UgXCJob21lYnJld1wiOlxuICAgICAgcmV0dXJuIFwiYnJldyB1cGdyYWRlIHNlbmRseVwiO1xuICAgIGNhc2UgXCJucG1cIjpcbiAgICAgIHJldHVybiBcIm5wbSBpbnN0YWxsIC1nIEBzZW5kbHkvY2xpQGxhdGVzdFwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJucG0gaW5zdGFsbCAtZyBAc2VuZGx5L2NsaUBsYXRlc3QgICMgb3I6IGJyZXcgdXBncmFkZSBzZW5kbHlcIjtcbiAgfVxufVxuIl19
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