@scalebun/cli 1.6.5 → 1.8.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.
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WORDMARK = exports.MARK = void 0;
7
+ exports.termWidth = termWidth;
8
+ exports.banner = banner;
9
+ exports.shouldShowArt = shouldShowArt;
10
+ // scalebun/src/ui/banner.ts
11
+ // Ported from the reference banner.mjs — do NOT retune the width thresholds, the
12
+ // gradient stops, the colour ladder, or the mark art. The mark is pre-rendered;
13
+ // regenerate with `pnpm --filter @scalebun/cli gen:mark` if the logo changes.
14
+ // Glyph set is ▀ ▄ █ + space only: the CP437 legacy subset that every monospace
15
+ // font ships (braille U+2800 does NOT ship in DejaVu Sans Mono / Liberation Mono
16
+ // and renders as tofu).
17
+ const chalk_1 = __importDefault(require("chalk"));
18
+ const mark_1 = require("./mark");
19
+ Object.defineProperty(exports, "MARK", { enumerable: true, get: function () { return mark_1.MARK; } });
20
+ const MARK_H = mark_1.MARK.length;
21
+ exports.WORDMARK = [
22
+ '███████╗ ██████╗ █████╗ ██╗ ███████╗██████╗ ██╗ ██╗███╗ ██╗',
23
+ '██╔════╝██╔════╝██╔══██╗██║ ██╔════╝██╔══██╗██║ ██║████╗ ██║',
24
+ '███████╗██║ ███████║██║ █████╗ ██████╔╝██║ ██║██╔██╗ ██║',
25
+ '╚════██║██║ ██╔══██║██║ ██╔══╝ ██╔══██╗██║ ██║██║╚██╗██║',
26
+ '███████║╚██████╗██║ ██║███████╗███████╗██████╔╝╚██████╔╝██║ ╚████║',
27
+ '╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚══════╝╚═════╝ ╚═════╝ ╚═╝ ╚═══╝',
28
+ ];
29
+ const WORD_W = exports.WORDMARK[0].length;
30
+ /* ── colour ─────────────────────────────────────────────────────────── */
31
+ // Detection is chalk's (`chalk.level`), the CLI's single source of truth for
32
+ // colour support — it also parses argv, so `--no-color` / `--color=never` are
33
+ // honoured here exactly as they are for the status box and command table. The
34
+ // raw-ANSI emitters below stay local: they do per-character gradient with
35
+ // repeat-collapsing, which chalk does not offer.
36
+ const BRAND = [80, 70, 229]; // #5046E5, flat logo indigo
37
+ const GRAD = [
38
+ [108, 92, 231], // #6C5CE7
39
+ [244, 114, 208], // #F472D0
40
+ ];
41
+ function rgb256(r, g, b) {
42
+ const q = (v) => Math.round((v / 255) * 5);
43
+ return 16 + 36 * q(r) + 6 * q(g) + q(b);
44
+ }
45
+ function fg(level, r, g, b) {
46
+ if (level >= 3)
47
+ return `\x1b[38;2;${r};${g};${b}m`;
48
+ if (level === 2)
49
+ return `\x1b[38;5;${rgb256(r, g, b)}m`;
50
+ if (level === 1)
51
+ return '\x1b[95m'; // bright magenta
52
+ return '';
53
+ }
54
+ const RESET = (lvl) => (lvl ? '\x1b[0m' : '');
55
+ const STEPS = 12; // quantised: 12 stops instead of one escape per character
56
+ function mix(t) {
57
+ const [a, b] = GRAD;
58
+ const q = Math.round(t * (STEPS - 1)) / (STEPS - 1);
59
+ return [
60
+ Math.round(a[0] + (b[0] - a[0]) * q),
61
+ Math.round(a[1] + (b[1] - a[1]) * q),
62
+ Math.round(a[2] + (b[2] - a[2]) * q),
63
+ ];
64
+ }
65
+ /** Per-character horizontal gradient. Falls back to one flat escape below truecolor. */
66
+ function gradient(line, level) {
67
+ if (level === 0)
68
+ return line;
69
+ if (level < 3)
70
+ return fg(level, GRAD[0][0], GRAD[0][1], GRAD[0][2]) + line + RESET(level);
71
+ let out = '';
72
+ let last = '';
73
+ for (let i = 0; i < line.length; i++) {
74
+ const [r, g, b] = mix(i / Math.max(1, line.length - 1));
75
+ const c = fg(3, r, g, b);
76
+ if (c !== last) {
77
+ out += c;
78
+ last = c;
79
+ } // collapse repeats
80
+ out += line[i];
81
+ }
82
+ return out + RESET(level);
83
+ }
84
+ /* ── layout ─────────────────────────────────────────────────────────── */
85
+ /** Real TTY width wins; COLUMNS only covers the non-TTY case (pipes, tests). */
86
+ function termWidth() {
87
+ return process.stdout.columns || Number(process.env.COLUMNS) || 80;
88
+ }
89
+ const pad = (s, n) => s + ' '.repeat(Math.max(0, n - s.length));
90
+ function banner(o = {}) {
91
+ const version = o.version ?? '0.0.0';
92
+ const tagline = o.tagline ?? 'Enterprise OTA Update & Telemetry Control Plane';
93
+ const level = o.level ?? chalk_1.default.level; // 0 none · 1 basic · 2 256 · 3 truecolor
94
+ const width = o.width ?? termWidth();
95
+ const dim = level ? '\x1b[90m' : '';
96
+ const R = RESET(level);
97
+ // Narrow terminals: no art at all. One line beats a broken picture.
98
+ if (width < 46)
99
+ return `${fg(level, BRAND[0], BRAND[1], BRAND[2])}scalebun${R} ${dim}v${version}${R}\n`;
100
+ const GAP = 2;
101
+ const OFF = GAP + 3; // gap used by the compact lockup
102
+ const brand = fg(level, BRAND[0], BRAND[1], BRAND[2]);
103
+ const lines = [];
104
+ // Full lockup — mark + block wordmark, wordmark optically centred.
105
+ if (o.mark !== false && width >= mark_1.MARK_W + GAP + WORD_W) {
106
+ const top = Math.floor((MARK_H - exports.WORDMARK.length) / 2) - 1;
107
+ for (let i = 0; i < MARK_H; i++) {
108
+ const left = brand + pad(mark_1.MARK[i] ?? '', mark_1.MARK_W) + R;
109
+ const wi = i - top;
110
+ let right = '';
111
+ if (wi >= 0 && wi < exports.WORDMARK.length)
112
+ right = gradient(exports.WORDMARK[wi], level);
113
+ else if (wi === exports.WORDMARK.length + 1)
114
+ right = `${dim}v${version} · ${tagline}${R}`;
115
+ lines.push(right ? left + ' '.repeat(GAP) + right : left);
116
+ }
117
+ return lines.join('\n').replace(/[ \t]+$/gm, '') + '\n';
118
+ }
119
+ // Compact lockup — mark + type. Same composition as the `quiet` direction, so
120
+ // an 80-column terminal still gets the rabbit.
121
+ const shortTag = 'OTA updates and telemetry';
122
+ const tag = width >= mark_1.MARK_W + OFF + tagline.length ? tagline : shortTag;
123
+ if (o.mark !== false && width >= mark_1.MARK_W + OFF + shortTag.length) {
124
+ const bold = level ? '\x1b[1m' : '';
125
+ const type = [
126
+ `${bold}${fg(level, GRAD[0][0], GRAD[0][1], GRAD[0][2])}scalebun${R} ${dim}v${version}${R}`,
127
+ `${dim}${tag}${R}`,
128
+ ];
129
+ const top = Math.floor((MARK_H - type.length) / 2);
130
+ for (let i = 0; i < MARK_H; i++) {
131
+ const left = brand + pad(mark_1.MARK[i] ?? '', mark_1.MARK_W) + R;
132
+ const ti = i - top;
133
+ const right = ti >= 0 && ti < type.length ? type[ti] : '';
134
+ lines.push(right ? left + ' '.repeat(OFF) + right : left);
135
+ }
136
+ return lines.join('\n').replace(/[ \t]+$/gm, '') + '\n';
137
+ }
138
+ // No room beside the mark: type only.
139
+ if (width >= WORD_W)
140
+ exports.WORDMARK.forEach((l) => lines.push(gradient(l, level)));
141
+ else
142
+ lines.push(`${fg(level, BRAND[0], BRAND[1], BRAND[2])}scalebun${R}`);
143
+ lines.push('');
144
+ lines.push(`${dim}v${version} · ${width >= 60 ? tagline : shortTag}${R}`);
145
+ return lines.join('\n') + '\n';
146
+ }
147
+ /**
148
+ * Gates the ART ONLY (mark + wordmark). The splash body — status line and
149
+ * command table — is the output of the no-arg command, not banner decoration,
150
+ * so it must NOT be gated by this. Keep the two concerns separate.
151
+ */
152
+ function shouldShowArt(argv = process.argv.slice(2)) {
153
+ if (argv.includes('--no-banner') || process.env.SCALEBUN_NO_BANNER)
154
+ return false;
155
+ if (process.env.CI && !process.stdout.isTTY)
156
+ return false;
157
+ const cmd = argv.find((a) => !a.startsWith('-'));
158
+ return !cmd || cmd === 'help'; // bare `scalebun` and `scalebun help` only
159
+ }
160
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/ui/banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const MARK: readonly string[];
2
+ export declare const MARK_W = 20;
3
+ //# sourceMappingURL=mark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../src/ui/mark.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,IAAI,EAAE,SAAS,MAAM,EAejC,CAAC;AACF,eAAO,MAAM,MAAM,KAAK,CAAC"}
package/lib/ui/mark.js ADDED
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MARK_W = exports.MARK = void 0;
4
+ /* eslint-disable */
5
+ // prettier-ignore
6
+ // GENERATED by tools/gen-mark.mjs — do not edit by hand.
7
+ exports.MARK = [
8
+ " ▄▄█████",
9
+ " █████ ████████",
10
+ "███████ ███████",
11
+ "███ ████ ▄███▀ ▀▀",
12
+ "████ ███ ████▀",
13
+ "▀███▄███▄████▄▄",
14
+ " ▀███████████████▄",
15
+ " ████▀▀▀ ▀▀████▄",
16
+ "████ ▄▄▄ ▀███",
17
+ "███ ███ ▄███",
18
+ "███ ▀███",
19
+ "███▄ ▄▄▄ ▄████",
20
+ "▀████▄▄▄▄▄▄███████▀",
21
+ " ▀██████████▀▀▀▀",
22
+ ];
23
+ exports.MARK_W = 20;
24
+ //# sourceMappingURL=mark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mark.js","sourceRoot":"","sources":["../../src/ui/mark.ts"],"names":[],"mappings":";;;AAAA,oBAAoB;AACpB,kBAAkB;AAClB,yDAAyD;AAC5C,QAAA,IAAI,GAAsB;IACrC,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,iBAAiB;IACjB,iBAAiB;IACjB,oBAAoB;IACpB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,sBAAsB;IACtB,qBAAqB;IACrB,mBAAmB;CACpB,CAAC;AACW,QAAA,MAAM,GAAG,EAAE,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { ApiClient } from '../api/client';
2
+ /**
3
+ * Fetching the account's apps — shared by `scalebun apps`, `quickstart`, and the
4
+ * interactive `ota publish` wizard, so the org → project → app walk lives in one
5
+ * place instead of being copy-pasted per command.
6
+ */
7
+ export interface AppRow {
8
+ id: string;
9
+ name: string;
10
+ platform: string | null;
11
+ }
12
+ export interface AppEntry {
13
+ orgId: string;
14
+ orgName: string;
15
+ projectName: string;
16
+ app: AppRow;
17
+ }
18
+ /** Every app the account can see, flattened for listing/selection. */
19
+ export declare function fetchAllApps(client: ApiClient): Promise<AppEntry[]>;
20
+ //# sourceMappingURL=apps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/utils/apps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C;;;;GAIG;AAEH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAaD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,sEAAsE;AACtE,wBAAsB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAiBzE"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchAllApps = fetchAllApps;
4
+ /** Every app the account can see, flattened for listing/selection. */
5
+ async function fetchAllApps(client) {
6
+ const orgs = await client.get('/organizations');
7
+ const entries = [];
8
+ for (const org of orgs ?? []) {
9
+ const projects = await client.get(`/organizations/${org.id}/projects`);
10
+ for (const p of projects ?? []) {
11
+ const detail = await client.get(`/organizations/${org.id}/projects/${p.id}`);
12
+ for (const app of detail?.apps ?? []) {
13
+ entries.push({ orgId: org.id, orgName: org.name, projectName: p.name, app });
14
+ }
15
+ }
16
+ }
17
+ return entries;
18
+ }
19
+ //# sourceMappingURL=apps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.js","sourceRoot":"","sources":["../../src/utils/apps.ts"],"names":[],"mappings":";;AAiCA,oCAiBC;AAlBD,sEAAsE;AAC/D,KAAK,UAAU,YAAY,CAAC,MAAiB;IAClD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAW,gBAAgB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,kBAAkB,GAAG,CAAC,EAAE,WAAW,CACpC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC7B,kBAAkB,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,EAAE,CAC5C,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Best-effort "open this URL in the default browser". Non-fatal: callers always
3
+ * print the URL too, so a headless box or a missing opener never blocks the flow.
4
+ *
5
+ * Uses the platform opener (`start` on Windows, `open` on macOS, `xdg-open` on
6
+ * Linux) detached, so the CLI doesn't wait on the browser process.
7
+ */
8
+ export declare function openUrl(url: string): void;
9
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAuBzC"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openUrl = openUrl;
4
+ const child_process_1 = require("child_process");
5
+ /**
6
+ * Best-effort "open this URL in the default browser". Non-fatal: callers always
7
+ * print the URL too, so a headless box or a missing opener never blocks the flow.
8
+ *
9
+ * Uses the platform opener (`start` on Windows, `open` on macOS, `xdg-open` on
10
+ * Linux) detached, so the CLI doesn't wait on the browser process.
11
+ */
12
+ function openUrl(url) {
13
+ try {
14
+ let command;
15
+ let args;
16
+ if (process.platform === 'win32') {
17
+ // `start` is a cmd builtin; the empty "" is the window title arg it expects.
18
+ command = 'cmd';
19
+ args = ['/c', 'start', '', url];
20
+ }
21
+ else if (process.platform === 'darwin') {
22
+ command = 'open';
23
+ args = [url];
24
+ }
25
+ else {
26
+ command = 'xdg-open';
27
+ args = [url];
28
+ }
29
+ const child = (0, child_process_1.spawn)(command, args, { stdio: 'ignore', detached: true });
30
+ child.on('error', () => {
31
+ /* opener missing — the caller already printed the URL */
32
+ });
33
+ child.unref();
34
+ }
35
+ catch {
36
+ /* never throw from a convenience opener */
37
+ }
38
+ }
39
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":";;AASA,0BAuBC;AAhCD,iDAAsC;AAEtC;;;;;;GAMG;AACH,SAAgB,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,IAAI,OAAe,CAAC;QACpB,IAAI,IAAc,CAAC;QACnB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,6EAA6E;YAC7E,OAAO,GAAG,KAAK,CAAC;YAChB,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,GAAG,MAAM,CAAC;YACjB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,UAAU,CAAC;YACrB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,yDAAyD;QAC3D,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;AACH,CAAC"}
@@ -1,20 +1,32 @@
1
- /**
2
- * Hidden terminal input for secrets (access tokens).
3
- *
4
- * `readline.question` echoes what the user types, so a pasted access token would
5
- * sit in the terminal scrollback in cleartext. This reads the token in raw mode
6
- * and echoes a `*` per character instead — the token never appears on screen.
7
- *
8
- * Paste-safe: a pasted token usually arrives as one multi-character `data`
9
- * chunk (often with a trailing newline), so each chunk is processed
10
- * character-by-character. Backspace and Ctrl-C are handled. When stdin is not a
11
- * TTY (CI, pipes) raw mode is unavailable — callers must supply the token via
12
- * --token or an env var instead of relying on this.
13
- *
14
- * Control keys are compared by char code to avoid embedding raw control bytes in
15
- * this source file.
16
- */
17
1
  /** True when interactive hidden input is possible on this stdin. */
18
2
  export declare function canPromptHidden(): boolean;
19
3
  export declare function promptHidden(query: string): Promise<string>;
4
+ /** Close the shared prompt interface so the process can exit / move on. */
5
+ export declare function closePrompts(): void;
6
+ /** Free-text question with an optional default (shown in parentheses). */
7
+ export declare function text(query: string, opts?: {
8
+ default?: string;
9
+ }): Promise<string>;
10
+ /** Yes/no question. Empty input takes the default. */
11
+ export declare function confirm(query: string, opts?: {
12
+ default?: boolean;
13
+ }): Promise<boolean>;
14
+ /** Integer question with optional default and min/max validation (loops until valid). */
15
+ export declare function number(query: string, opts?: {
16
+ default?: number;
17
+ min?: number;
18
+ max?: number;
19
+ }): Promise<number>;
20
+ export interface Choice<T> {
21
+ label: string;
22
+ value: T;
23
+ hint?: string;
24
+ }
25
+ /**
26
+ * Single choice from a list. Arrow keys (↑/↓, j/k) in a real TTY; a numbered
27
+ * prompt otherwise. Returns the chosen value.
28
+ */
29
+ export declare function select<T>(query: string, choices: Choice<T>[], opts?: {
30
+ default?: number;
31
+ }): Promise<T>;
20
32
  //# sourceMappingURL=prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,oEAAoE;AACpE,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiD3D"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AA4BA,oEAAoE;AACpE,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiD3D;AAyBD,2EAA2E;AAC3E,wBAAgB,YAAY,IAAI,IAAI,CAKnC;AAmBD,0EAA0E;AAC1E,wBAAsB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAI1F;AAED,sDAAsD;AACtD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/F;AAED,yFAAyF;AACzF,wBAAsB,MAAM,CAC1B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1D,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAC5B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EACpB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9B,OAAO,CAAC,CAAC,CAAC,CAKZ"}
@@ -1,4 +1,50 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.canPromptHidden = canPromptHidden;
40
+ exports.promptHidden = promptHidden;
41
+ exports.closePrompts = closePrompts;
42
+ exports.text = text;
43
+ exports.confirm = confirm;
44
+ exports.number = number;
45
+ exports.select = select;
46
+ const chalk_1 = __importDefault(require("chalk"));
47
+ const readline = __importStar(require("readline"));
2
48
  /**
3
49
  * Hidden terminal input for secrets (access tokens).
4
50
  *
@@ -15,9 +61,6 @@
15
61
  * Control keys are compared by char code to avoid embedding raw control bytes in
16
62
  * this source file.
17
63
  */
18
- Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.canPromptHidden = canPromptHidden;
20
- exports.promptHidden = promptHidden;
21
64
  const CODE_ETX = 3; // Ctrl-C
22
65
  const CODE_EOT = 4; // Ctrl-D
23
66
  const CODE_LF = 10; // \n
@@ -80,4 +123,171 @@ function promptHidden(query) {
80
123
  stdin.on('data', onData);
81
124
  });
82
125
  }
126
+ // ── Interactive prompts (dependency-free) ────────────────────────────────────
127
+ //
128
+ // A tiny prompt toolkit for the interactive `ota publish` wizard: text, confirm,
129
+ // number, and a select. `select` uses arrow keys in a real TTY and falls back to
130
+ // a numbered choice otherwise, so it works over pipes / limited terminals too.
131
+ // A single shared readline for all line-based prompts in a session. Creating a
132
+ // fresh interface per question is the classic anti-pattern: over a pipe the
133
+ // first one buffers the remaining lines and later ones hang on an already-ended
134
+ // stdin. One interface reads sequential lines correctly. It is created lazily —
135
+ // after the raw-mode `select`s run — so it never fights their stdin handling.
136
+ let sharedRl = null;
137
+ function getRl() {
138
+ if (!sharedRl) {
139
+ sharedRl = readline.createInterface({ input: process.stdin, output: process.stdout });
140
+ sharedRl.on('close', () => {
141
+ sharedRl = null;
142
+ });
143
+ }
144
+ return sharedRl;
145
+ }
146
+ /** Close the shared prompt interface so the process can exit / move on. */
147
+ function closePrompts() {
148
+ if (sharedRl) {
149
+ sharedRl.close();
150
+ sharedRl = null;
151
+ }
152
+ }
153
+ /** One-line echoed question via the shared readline. Resolves '' on EOF. */
154
+ function ask(query) {
155
+ return new Promise((resolve) => {
156
+ const rl = getRl();
157
+ let answered = false;
158
+ const onClose = () => {
159
+ if (!answered)
160
+ resolve('');
161
+ };
162
+ rl.once('close', onClose);
163
+ rl.question(query, (answer) => {
164
+ answered = true;
165
+ rl.removeListener('close', onClose);
166
+ resolve(answer);
167
+ });
168
+ });
169
+ }
170
+ /** Free-text question with an optional default (shown in parentheses). */
171
+ async function text(query, opts = {}) {
172
+ const suffix = opts.default ? chalk_1.default.dim(` (${opts.default})`) : '';
173
+ const answer = (await ask(`${chalk_1.default.cyan('?')} ${query}${suffix}: `)).trim();
174
+ return answer || opts.default || '';
175
+ }
176
+ /** Yes/no question. Empty input takes the default. */
177
+ async function confirm(query, opts = {}) {
178
+ const def = opts.default ?? false;
179
+ const answer = (await ask(`${chalk_1.default.cyan('?')} ${query} ${chalk_1.default.dim(def ? '(Y/n)' : '(y/N)')}: `))
180
+ .trim()
181
+ .toLowerCase();
182
+ if (!answer)
183
+ return def;
184
+ return answer === 'y' || answer === 'yes';
185
+ }
186
+ /** Integer question with optional default and min/max validation (loops until valid). */
187
+ async function number(query, opts = {}) {
188
+ const { min, max } = opts;
189
+ const range = min !== undefined && max !== undefined ? ` between ${min} and ${max}` : '';
190
+ // eslint-disable-next-line no-constant-condition
191
+ while (true) {
192
+ const suffix = opts.default !== undefined ? chalk_1.default.dim(` (${opts.default})`) : '';
193
+ const raw = (await ask(`${chalk_1.default.cyan('?')} ${query}${suffix}: `)).trim();
194
+ if (!raw && opts.default !== undefined)
195
+ return opts.default;
196
+ const n = Number(raw);
197
+ if (Number.isInteger(n) &&
198
+ (min === undefined || n >= min) &&
199
+ (max === undefined || n <= max)) {
200
+ return n;
201
+ }
202
+ console.log(chalk_1.default.yellow(` Please enter a whole number${range}.`));
203
+ }
204
+ }
205
+ /**
206
+ * Single choice from a list. Arrow keys (↑/↓, j/k) in a real TTY; a numbered
207
+ * prompt otherwise. Returns the chosen value.
208
+ */
209
+ async function select(query, choices, opts = {}) {
210
+ if (!choices.length)
211
+ throw new Error('select() needs at least one choice');
212
+ const def = Math.min(Math.max(opts.default ?? 0, 0), choices.length - 1);
213
+ if (!process.stdin.isTTY)
214
+ return numberedSelect(query, choices, def);
215
+ return arrowSelect(query, choices, def);
216
+ }
217
+ async function numberedSelect(query, choices, def) {
218
+ console.log(`${chalk_1.default.cyan('?')} ${query}`);
219
+ choices.forEach((c, i) => {
220
+ console.log(` ${chalk_1.default.cyan(String(i + 1))}) ${c.label}${c.hint ? chalk_1.default.dim(` — ${c.hint}`) : ''}`);
221
+ });
222
+ // eslint-disable-next-line no-constant-condition
223
+ while (true) {
224
+ const raw = (await ask(` Choose 1-${choices.length} ${chalk_1.default.dim(`(${def + 1})`)}: `)).trim();
225
+ if (!raw)
226
+ return choices[def].value;
227
+ const n = parseInt(raw, 10);
228
+ if (Number.isInteger(n) && n >= 1 && n <= choices.length)
229
+ return choices[n - 1].value;
230
+ console.log(chalk_1.default.yellow(` Enter a number between 1 and ${choices.length}.`));
231
+ }
232
+ }
233
+ function arrowSelect(query, choices, def) {
234
+ return new Promise((resolve) => {
235
+ const stdin = process.stdin;
236
+ const stdout = process.stdout;
237
+ let idx = def;
238
+ stdin.resume();
239
+ stdin.setEncoding('utf8');
240
+ if (stdin.isTTY)
241
+ stdin.setRawMode(true);
242
+ stdout.write('\x1b[?25l'); // hide cursor
243
+ const draw = (first) => {
244
+ if (!first)
245
+ stdout.write(`\x1b[${choices.length}A`); // back up to the first option
246
+ choices.forEach((c, i) => {
247
+ const active = i === idx;
248
+ const pointer = active ? chalk_1.default.cyan('❯') : ' ';
249
+ const label = active ? chalk_1.default.cyan(c.label) : c.label;
250
+ const hint = c.hint ? chalk_1.default.dim(` ${c.hint}`) : '';
251
+ stdout.write(`\r\x1b[K ${pointer} ${label}${hint}\n`);
252
+ });
253
+ };
254
+ stdout.write(`${chalk_1.default.cyan('?')} ${query}\n`);
255
+ draw(true);
256
+ const cleanup = () => {
257
+ if (stdin.isTTY)
258
+ stdin.setRawMode(false);
259
+ stdin.pause();
260
+ stdin.removeListener('data', onData);
261
+ stdout.write('\x1b[?25h'); // show cursor
262
+ };
263
+ const finish = () => {
264
+ cleanup();
265
+ // Collapse the query + options into one summary line.
266
+ stdout.write('\r');
267
+ stdout.write(`\x1b[${choices.length + 1}A`); // up to the query line
268
+ stdout.write('\x1b[J'); // clear query + options
269
+ stdout.write(`${chalk_1.default.cyan('?')} ${query} ${chalk_1.default.cyan('›')} ${chalk_1.default.cyan(choices[idx].label)}\n`);
270
+ resolve(choices[idx].value);
271
+ };
272
+ const onData = (chunk) => {
273
+ if (chunk === '\x1b[A' || chunk === '\x1bOA' || chunk === 'k') {
274
+ idx = (idx - 1 + choices.length) % choices.length;
275
+ draw(false);
276
+ }
277
+ else if (chunk === '\x1b[B' || chunk === '\x1bOB' || chunk === 'j') {
278
+ idx = (idx + 1) % choices.length;
279
+ draw(false);
280
+ }
281
+ else if (chunk === '\r' || chunk === '\n') {
282
+ finish();
283
+ }
284
+ else if (chunk === '\x03') {
285
+ cleanup();
286
+ stdout.write('\n');
287
+ process.exit(1);
288
+ }
289
+ };
290
+ stdin.on('data', onData);
291
+ });
292
+ }
83
293
  //# sourceMappingURL=prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
package/lib/utils/ui.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export declare function renderBanner(): void;
2
1
  export declare function renderStatus(): void;
3
2
  export declare function renderCommands(): void;
4
3
  //# sourceMappingURL=ui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAQA,wBAAgB,YAAY,IAAI,IAAI,CAUnC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAUnC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAwDrC"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,IAAI,IAAI,CAUnC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAwDrC"}