@baby-ui/cli 0.0.0-stage → 0.1.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/LICENSE +201 -0
- package/README.md +36 -2
- package/bin.mjs +20 -0
- package/dist/add-Dw_xdBjM.js +8472 -0
- package/dist/add-Dw_xdBjM.js.map +1 -0
- package/dist/auth-Cqd8NPiR.js +52 -0
- package/dist/auth-Cqd8NPiR.js.map +1 -0
- package/dist/auth-DLL_PGWB.js +41 -0
- package/dist/auth-DLL_PGWB.js.map +1 -0
- package/dist/banner-b_aKYU5F.js +23 -0
- package/dist/banner-b_aKYU5F.js.map +1 -0
- package/dist/core-Cd391zXy.js +142 -0
- package/dist/core-Cd391zXy.js.map +1 -0
- package/dist/dist-Bs-3vZ2T.js +2712 -0
- package/dist/dist-Bs-3vZ2T.js.map +1 -0
- package/dist/dist-CxDndWiZ.js +6661 -0
- package/dist/dist-CxDndWiZ.js.map +1 -0
- package/dist/errors-zXXytRXF.js +16 -0
- package/dist/errors-zXXytRXF.js.map +1 -0
- package/dist/history-l3B-mc6n.js +55 -0
- package/dist/history-l3B-mc6n.js.map +1 -0
- package/dist/index.js +3097 -0
- package/dist/index.js.map +1 -0
- package/dist/info-mS7KbPJ_.js +43 -0
- package/dist/info-mS7KbPJ_.js.map +1 -0
- package/dist/init-DO1txT-A.js +168 -0
- package/dist/init-DO1txT-A.js.map +1 -0
- package/dist/list-DnQNQUNr.js +48 -0
- package/dist/list-DnQNQUNr.js.map +1 -0
- package/dist/maintain-DeyqYm5K.js +183 -0
- package/dist/maintain-DeyqYm5K.js.map +1 -0
- package/dist/schemas-DwMX1h2B.js +5160 -0
- package/dist/schemas-DwMX1h2B.js.map +1 -0
- package/dist/shared-BJaaV-dl.js +96 -0
- package/dist/shared-BJaaV-dl.js.map +1 -0
- package/dist/state-CsT6LJsH.js +430 -0
- package/dist/state-CsT6LJsH.js.map +1 -0
- package/dist/targets-Bpv2h7C4.js +316 -0
- package/dist/targets-Bpv2h7C4.js.map +1 -0
- package/dist/tx-DBnjY8eR.js +226 -0
- package/dist/tx-DBnjY8eR.js.map +1 -0
- package/dist/ui-Cthxlfe6.js +206 -0
- package/dist/ui-Cthxlfe6.js.map +1 -0
- package/package.json +50 -3
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { a as S, c as head, i as runPrompt, l as summary, o as bar, r as isInteractive, s as cursor, u as c } from "./core-Cd391zXy.js";
|
|
2
|
+
//#region src/ui/prompts.ts
|
|
3
|
+
const out = process.stdout;
|
|
4
|
+
function intro(title) {
|
|
5
|
+
out.write(`\n${c.brand(S.barStart)} ${title}\n${bar()}\n`);
|
|
6
|
+
}
|
|
7
|
+
function outro(message) {
|
|
8
|
+
out.write(`${c.brand(S.barEnd)} ${message}\n\n`);
|
|
9
|
+
}
|
|
10
|
+
function note(body, title) {
|
|
11
|
+
const lines = [];
|
|
12
|
+
if (title) lines.push(`${c.green(S.submit)} ${c.bold(title)}`);
|
|
13
|
+
for (const line of body.split("\n")) lines.push(bar(line));
|
|
14
|
+
lines.push(bar());
|
|
15
|
+
out.write(`${lines.join("\n")}\n`);
|
|
16
|
+
}
|
|
17
|
+
function message(text) {
|
|
18
|
+
out.write(`${bar(text)}\n`);
|
|
19
|
+
}
|
|
20
|
+
const closer = (error) => error ? `${c.red(S.barEnd)} ${c.red(error)}` : c.gray(S.barEnd);
|
|
21
|
+
function withCaret(value, pos, placeholder) {
|
|
22
|
+
if (value === "") {
|
|
23
|
+
const ph = placeholder ?? "";
|
|
24
|
+
return c.inverse(ph.charAt(0) || " ") + c.dim(ph.slice(1));
|
|
25
|
+
}
|
|
26
|
+
return value.slice(0, pos) + c.inverse(value.charAt(pos) || " ") + value.slice(pos + 1);
|
|
27
|
+
}
|
|
28
|
+
async function text(opts) {
|
|
29
|
+
if (!isInteractive()) return opts.defaultValue ?? opts.initialValue ?? "";
|
|
30
|
+
let value = opts.initialValue ?? "";
|
|
31
|
+
let caret = value.length;
|
|
32
|
+
let error = "";
|
|
33
|
+
const shown = () => opts.mask ? "•".repeat(value.length) : value;
|
|
34
|
+
await runPrompt({
|
|
35
|
+
frame: (status) => status === "active" ? [
|
|
36
|
+
head("active", opts.message),
|
|
37
|
+
bar(withCaret(shown(), caret, opts.placeholder)),
|
|
38
|
+
closer(error)
|
|
39
|
+
].join("\n") : summary(status, opts.message, shown() || opts.defaultValue || ""),
|
|
40
|
+
onKey: (key, ctx) => {
|
|
41
|
+
if (key.name === "return") {
|
|
42
|
+
if (value === "" && opts.defaultValue !== void 0) value = opts.defaultValue;
|
|
43
|
+
const err = opts.validate?.(value);
|
|
44
|
+
if (err) error = err;
|
|
45
|
+
else ctx.submit();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
error = "";
|
|
49
|
+
if (key.name === "backspace" && caret > 0) {
|
|
50
|
+
value = value.slice(0, caret - 1) + value.slice(caret);
|
|
51
|
+
caret--;
|
|
52
|
+
} else if (key.name === "left") caret = Math.max(0, caret - 1);
|
|
53
|
+
else if (key.name === "right") caret = Math.min(value.length, caret + 1);
|
|
54
|
+
else if (key.name === "home") caret = 0;
|
|
55
|
+
else if (key.name === "end") caret = value.length;
|
|
56
|
+
else {
|
|
57
|
+
const ch = key.sequence;
|
|
58
|
+
if (ch && ch.length === 1 && ch >= " " && !key.ctrl && !key.meta) {
|
|
59
|
+
value = value.slice(0, caret) + ch + value.slice(caret);
|
|
60
|
+
caret++;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return value || opts.defaultValue || "";
|
|
66
|
+
}
|
|
67
|
+
const step = (key, index, n) => {
|
|
68
|
+
if (key.name === "up" || key.name === "k") return (index - 1 + n) % n;
|
|
69
|
+
if (key.name === "down" || key.name === "j") return (index + 1) % n;
|
|
70
|
+
return index;
|
|
71
|
+
};
|
|
72
|
+
async function select(opts) {
|
|
73
|
+
const first = opts.options[0];
|
|
74
|
+
if (!first) throw new Error("select requires at least one option");
|
|
75
|
+
let index = Math.max(0, opts.options.findIndex((o) => o.value === opts.initialValue));
|
|
76
|
+
if (!isInteractive()) return (opts.options[index] ?? first).value;
|
|
77
|
+
const frame = (status) => {
|
|
78
|
+
if (status !== "active") return summary(status, opts.message, (opts.options[index] ?? first).label);
|
|
79
|
+
const lines = [head("active", opts.message)];
|
|
80
|
+
opts.options.forEach((o, i) => {
|
|
81
|
+
const on = i === index;
|
|
82
|
+
const dot = on ? c.green(S.radioOn) : c.gray(S.radioOff);
|
|
83
|
+
const hint = on && o.hint ? c.dim(` ${o.hint}`) : "";
|
|
84
|
+
lines.push(bar(`${dot} ${on ? c.white(o.label) : c.dim(o.label)}${hint}`));
|
|
85
|
+
});
|
|
86
|
+
lines.push(c.gray(S.barEnd));
|
|
87
|
+
return lines.join("\n");
|
|
88
|
+
};
|
|
89
|
+
await runPrompt({
|
|
90
|
+
frame,
|
|
91
|
+
onKey: (key, ctx) => {
|
|
92
|
+
if (key.name === "return") ctx.submit();
|
|
93
|
+
else index = step(key, index, opts.options.length);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return (opts.options[index] ?? first).value;
|
|
97
|
+
}
|
|
98
|
+
async function multiselect(opts) {
|
|
99
|
+
const selected = /* @__PURE__ */ new Set();
|
|
100
|
+
opts.options.forEach((o, i) => {
|
|
101
|
+
if (opts.initialValues?.includes(o.value)) selected.add(i);
|
|
102
|
+
});
|
|
103
|
+
const values = () => opts.options.filter((_, i) => selected.has(i)).map((o) => o.value);
|
|
104
|
+
if (!isInteractive()) return values();
|
|
105
|
+
let index = 0;
|
|
106
|
+
let error = "";
|
|
107
|
+
const frame = (status) => {
|
|
108
|
+
if (status !== "active") {
|
|
109
|
+
const labels = opts.options.filter((_, i) => selected.has(i)).map((o) => o.label);
|
|
110
|
+
return summary(status, opts.message, labels.join(", ") || "none");
|
|
111
|
+
}
|
|
112
|
+
const lines = [`${head("active", opts.message)} ${c.dim("(space toggles, a for all)")}`];
|
|
113
|
+
opts.options.forEach((o, i) => {
|
|
114
|
+
const on = i === index;
|
|
115
|
+
const picked = selected.has(i);
|
|
116
|
+
const box = picked ? c.green(S.checkOn) : on ? c.white(S.checkOff) : c.gray(S.checkOff);
|
|
117
|
+
const label = on ? c.white(o.label) : picked ? o.label : c.dim(o.label);
|
|
118
|
+
const hint = on && o.hint ? c.dim(` ${o.hint}`) : "";
|
|
119
|
+
lines.push(bar(`${box} ${label}${hint}`));
|
|
120
|
+
});
|
|
121
|
+
lines.push(closer(error));
|
|
122
|
+
return lines.join("\n");
|
|
123
|
+
};
|
|
124
|
+
await runPrompt({
|
|
125
|
+
frame,
|
|
126
|
+
onKey: (key, ctx) => {
|
|
127
|
+
const n = opts.options.length;
|
|
128
|
+
if (key.name === "space") {
|
|
129
|
+
error = "";
|
|
130
|
+
if (selected.has(index)) selected.delete(index);
|
|
131
|
+
else selected.add(index);
|
|
132
|
+
} else if (key.name === "a") {
|
|
133
|
+
error = "";
|
|
134
|
+
if (selected.size === n) selected.clear();
|
|
135
|
+
else for (let i = 0; i < n; i++) selected.add(i);
|
|
136
|
+
} else if (key.name === "return") {
|
|
137
|
+
if (opts.required && selected.size === 0) error = "Select at least one option.";
|
|
138
|
+
else ctx.submit();
|
|
139
|
+
} else index = step(key, index, n);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return values();
|
|
143
|
+
}
|
|
144
|
+
async function confirm(opts) {
|
|
145
|
+
let value = opts.initialValue ?? true;
|
|
146
|
+
if (!isInteractive()) return value;
|
|
147
|
+
const choice = (label, on) => on ? `${c.green(S.radioOn)} ${c.white(label)}` : `${c.gray(S.radioOff)} ${c.dim(label)}`;
|
|
148
|
+
await runPrompt({
|
|
149
|
+
frame: (status) => status === "active" ? [
|
|
150
|
+
head("active", opts.message),
|
|
151
|
+
bar(`${choice("Yes", value)} ${choice("No", !value)}`),
|
|
152
|
+
c.gray(S.barEnd)
|
|
153
|
+
].join("\n") : summary(status, opts.message, value ? "Yes" : "No"),
|
|
154
|
+
onKey: (key, ctx) => {
|
|
155
|
+
if ([
|
|
156
|
+
"left",
|
|
157
|
+
"right",
|
|
158
|
+
"h",
|
|
159
|
+
"l",
|
|
160
|
+
"tab"
|
|
161
|
+
].includes(key.name ?? "")) value = !value;
|
|
162
|
+
else if (key.name === "y") value = true;
|
|
163
|
+
else if (key.name === "n") value = false;
|
|
164
|
+
else if (key.name === "return") ctx.submit();
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
return value;
|
|
168
|
+
}
|
|
169
|
+
/** One-line spinner; non-interactive streams get plain before/after lines. */
|
|
170
|
+
function spinner() {
|
|
171
|
+
let timer;
|
|
172
|
+
let frame = 0;
|
|
173
|
+
let label = "";
|
|
174
|
+
const interactive = isInteractive();
|
|
175
|
+
return {
|
|
176
|
+
start(msg) {
|
|
177
|
+
label = msg;
|
|
178
|
+
if (!interactive) {
|
|
179
|
+
out.write(`${bar(label)}\n`);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
out.write(cursor.hide);
|
|
183
|
+
timer = setInterval(() => {
|
|
184
|
+
frame = (frame + 1) % S.spinner.length;
|
|
185
|
+
out.write(`\r${c.brand(S.spinner[frame] ?? "")} ${label}\x1b[0K`);
|
|
186
|
+
}, 120);
|
|
187
|
+
},
|
|
188
|
+
update(msg) {
|
|
189
|
+
label = msg;
|
|
190
|
+
},
|
|
191
|
+
stop(msg, ok = true) {
|
|
192
|
+
clearInterval(timer);
|
|
193
|
+
timer = void 0;
|
|
194
|
+
if (!interactive) {
|
|
195
|
+
if (msg) out.write(`${bar(msg)}\n`);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const glyph = ok ? c.green(S.submit) : c.red(S.cancel);
|
|
199
|
+
out.write(`\r${glyph} ${msg ?? label}\x1b[0K\n${bar()}\n${cursor.show}`);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
//#endregion
|
|
204
|
+
export { note as a, spinner as c, multiselect as i, text as l, intro as n, outro as o, message as r, select as s, confirm as t };
|
|
205
|
+
|
|
206
|
+
//# sourceMappingURL=ui-Cthxlfe6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-Cthxlfe6.js","names":[],"sources":["../src/ui/prompts.ts"],"sourcesContent":["import { c } from \"../logger.ts\";\nimport { isInteractive, type Key, runPrompt } from \"./core.ts\";\nimport { bar, cursor, head, S, type StepStatus, summary } from \"./theme.ts\";\n\nconst out = process.stdout;\n\n// Every block ends with an empty rail segment and none starts with one, so they stack evenly.\nexport function intro(title: string): void {\n\tout.write(`\\n${c.brand(S.barStart)} ${title}\\n${bar()}\\n`);\n}\n\nexport function outro(message: string): void {\n\tout.write(`${c.brand(S.barEnd)} ${message}\\n\\n`);\n}\n\nexport function cancelOutro(message = \"Cancelled\"): void {\n\tout.write(`${c.red(S.barEnd)} ${c.red(message)}\\n\\n`);\n}\n\nexport function note(body: string, title?: string): void {\n\tconst lines: string[] = [];\n\tif (title) lines.push(`${c.green(S.submit)} ${c.bold(title)}`);\n\tfor (const line of body.split(\"\\n\")) lines.push(bar(line));\n\tlines.push(bar());\n\tout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport function message(text: string): void {\n\tout.write(`${bar(text)}\\n`);\n}\n\nconst closer = (error: string) =>\n\terror ? `${c.red(S.barEnd)} ${c.red(error)}` : c.gray(S.barEnd);\n\nexport interface TextOptions {\n\tmessage: string;\n\tplaceholder?: string;\n\t/** Used when submitted empty and on non-interactive runs. */\n\tdefaultValue?: string;\n\tinitialValue?: string;\n\t/** Return an error string to reject the value. */\n\tvalidate?: (value: string) => string | undefined;\n\t/** Render dots instead of the typed value (secrets). */\n\tmask?: boolean;\n}\n\nfunction withCaret(value: string, pos: number, placeholder?: string): string {\n\tif (value === \"\") {\n\t\tconst ph = placeholder ?? \"\";\n\t\treturn c.inverse(ph.charAt(0) || \" \") + c.dim(ph.slice(1));\n\t}\n\treturn value.slice(0, pos) + c.inverse(value.charAt(pos) || \" \") + value.slice(pos + 1);\n}\n\nexport async function text(opts: TextOptions): Promise<string> {\n\tif (!isInteractive()) return opts.defaultValue ?? opts.initialValue ?? \"\";\n\n\tlet value = opts.initialValue ?? \"\";\n\tlet caret = value.length;\n\tlet error = \"\";\n\tconst shown = () => (opts.mask ? \"•\".repeat(value.length) : value);\n\n\tawait runPrompt({\n\t\tframe: (status) =>\n\t\t\tstatus === \"active\"\n\t\t\t\t? [\n\t\t\t\t\t\thead(\"active\", opts.message),\n\t\t\t\t\t\tbar(withCaret(shown(), caret, opts.placeholder)),\n\t\t\t\t\t\tcloser(error),\n\t\t\t\t\t].join(\"\\n\")\n\t\t\t\t: summary(status, opts.message, shown() || opts.defaultValue || \"\"),\n\t\tonKey: (key: Key, ctx) => {\n\t\t\tif (key.name === \"return\") {\n\t\t\t\tif (value === \"\" && opts.defaultValue !== undefined) value = opts.defaultValue;\n\t\t\t\tconst err = opts.validate?.(value);\n\t\t\t\tif (err) error = err;\n\t\t\t\telse ctx.submit();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\terror = \"\";\n\t\t\tif (key.name === \"backspace\" && caret > 0) {\n\t\t\t\tvalue = value.slice(0, caret - 1) + value.slice(caret);\n\t\t\t\tcaret--;\n\t\t\t} else if (key.name === \"left\") caret = Math.max(0, caret - 1);\n\t\t\telse if (key.name === \"right\") caret = Math.min(value.length, caret + 1);\n\t\t\telse if (key.name === \"home\") caret = 0;\n\t\t\telse if (key.name === \"end\") caret = value.length;\n\t\t\telse {\n\t\t\t\tconst ch = key.sequence;\n\t\t\t\tif (ch && ch.length === 1 && ch >= \" \" && !key.ctrl && !key.meta) {\n\t\t\t\t\tvalue = value.slice(0, caret) + ch + value.slice(caret);\n\t\t\t\t\tcaret++;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t});\n\n\treturn value || opts.defaultValue || \"\";\n}\n\nexport interface SelectOption<T> {\n\tvalue: T;\n\tlabel: string;\n\thint?: string;\n}\n\nexport interface SelectOptions<T> {\n\tmessage: string;\n\toptions: Array<SelectOption<T>>;\n\tinitialValue?: T;\n}\n\nconst step = (key: Key, index: number, n: number) => {\n\tif (key.name === \"up\" || key.name === \"k\") return (index - 1 + n) % n;\n\tif (key.name === \"down\" || key.name === \"j\") return (index + 1) % n;\n\treturn index;\n};\n\nexport async function select<T>(opts: SelectOptions<T>): Promise<T> {\n\tconst first = opts.options[0];\n\tif (!first) throw new Error(\"select requires at least one option\");\n\n\tlet index = Math.max(\n\t\t0,\n\t\topts.options.findIndex((o) => o.value === opts.initialValue),\n\t);\n\tif (!isInteractive()) return (opts.options[index] ?? first).value;\n\n\tconst frame = (status: StepStatus): string => {\n\t\tif (status !== \"active\") {\n\t\t\treturn summary(status, opts.message, (opts.options[index] ?? first).label);\n\t\t}\n\t\tconst lines = [head(\"active\", opts.message)];\n\t\topts.options.forEach((o, i) => {\n\t\t\tconst on = i === index;\n\t\t\tconst dot = on ? c.green(S.radioOn) : c.gray(S.radioOff);\n\t\t\tconst hint = on && o.hint ? c.dim(` ${o.hint}`) : \"\";\n\t\t\tlines.push(bar(`${dot} ${on ? c.white(o.label) : c.dim(o.label)}${hint}`));\n\t\t});\n\t\tlines.push(c.gray(S.barEnd));\n\t\treturn lines.join(\"\\n\");\n\t};\n\n\tawait runPrompt({\n\t\tframe,\n\t\tonKey: (key, ctx) => {\n\t\t\tif (key.name === \"return\") ctx.submit();\n\t\t\telse index = step(key, index, opts.options.length);\n\t\t},\n\t});\n\n\treturn (opts.options[index] ?? first).value;\n}\n\nexport interface MultiSelectOptions<T> {\n\tmessage: string;\n\toptions: Array<SelectOption<T>>;\n\tinitialValues?: T[];\n\trequired?: boolean;\n}\n\nexport async function multiselect<T>(opts: MultiSelectOptions<T>): Promise<T[]> {\n\tconst selected = new Set<number>();\n\topts.options.forEach((o, i) => {\n\t\tif (opts.initialValues?.includes(o.value)) selected.add(i);\n\t});\n\tconst values = (): T[] =>\n\t\topts.options.filter((_, i) => selected.has(i)).map((o) => o.value);\n\n\tif (!isInteractive()) return values();\n\n\tlet index = 0;\n\tlet error = \"\";\n\n\tconst frame = (status: StepStatus): string => {\n\t\tif (status !== \"active\") {\n\t\t\tconst labels = opts.options.filter((_, i) => selected.has(i)).map((o) => o.label);\n\t\t\treturn summary(status, opts.message, labels.join(\", \") || \"none\");\n\t\t}\n\t\tconst lines = [\n\t\t\t`${head(\"active\", opts.message)} ${c.dim(\"(space toggles, a for all)\")}`,\n\t\t];\n\t\topts.options.forEach((o, i) => {\n\t\t\tconst on = i === index;\n\t\t\tconst picked = selected.has(i);\n\t\t\tconst box = picked\n\t\t\t\t? c.green(S.checkOn)\n\t\t\t\t: on\n\t\t\t\t\t? c.white(S.checkOff)\n\t\t\t\t\t: c.gray(S.checkOff);\n\t\t\tconst label = on ? c.white(o.label) : picked ? o.label : c.dim(o.label);\n\t\t\tconst hint = on && o.hint ? c.dim(` ${o.hint}`) : \"\";\n\t\t\tlines.push(bar(`${box} ${label}${hint}`));\n\t\t});\n\t\tlines.push(closer(error));\n\t\treturn lines.join(\"\\n\");\n\t};\n\n\tawait runPrompt({\n\t\tframe,\n\t\tonKey: (key, ctx) => {\n\t\t\tconst n = opts.options.length;\n\t\t\tif (key.name === \"space\") {\n\t\t\t\terror = \"\";\n\t\t\t\tif (selected.has(index)) selected.delete(index);\n\t\t\t\telse selected.add(index);\n\t\t\t} else if (key.name === \"a\") {\n\t\t\t\terror = \"\";\n\t\t\t\tif (selected.size === n) selected.clear();\n\t\t\t\telse for (let i = 0; i < n; i++) selected.add(i);\n\t\t\t} else if (key.name === \"return\") {\n\t\t\t\tif (opts.required && selected.size === 0) error = \"Select at least one option.\";\n\t\t\t\telse ctx.submit();\n\t\t\t} else index = step(key, index, n);\n\t\t},\n\t});\n\n\treturn values();\n}\n\nexport interface ConfirmOptions {\n\tmessage: string;\n\tinitialValue?: boolean;\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean> {\n\tlet value = opts.initialValue ?? true;\n\tif (!isInteractive()) return value;\n\n\tconst choice = (label: string, on: boolean) =>\n\t\ton\n\t\t\t? `${c.green(S.radioOn)} ${c.white(label)}`\n\t\t\t: `${c.gray(S.radioOff)} ${c.dim(label)}`;\n\n\tawait runPrompt({\n\t\tframe: (status) =>\n\t\t\tstatus === \"active\"\n\t\t\t\t? [\n\t\t\t\t\t\thead(\"active\", opts.message),\n\t\t\t\t\t\tbar(`${choice(\"Yes\", value)} ${choice(\"No\", !value)}`),\n\t\t\t\t\t\tc.gray(S.barEnd),\n\t\t\t\t\t].join(\"\\n\")\n\t\t\t\t: summary(status, opts.message, value ? \"Yes\" : \"No\"),\n\t\tonKey: (key, ctx) => {\n\t\t\tif ([\"left\", \"right\", \"h\", \"l\", \"tab\"].includes(key.name ?? \"\")) value = !value;\n\t\t\telse if (key.name === \"y\") value = true;\n\t\t\telse if (key.name === \"n\") value = false;\n\t\t\telse if (key.name === \"return\") ctx.submit();\n\t\t},\n\t});\n\n\treturn value;\n}\n\nexport interface Spinner {\n\tstart(message: string): void;\n\tupdate(message: string): void;\n\tstop(message?: string, ok?: boolean): void;\n}\n\n/** One-line spinner; non-interactive streams get plain before/after lines. */\nexport function spinner(): Spinner {\n\tlet timer: ReturnType<typeof setInterval> | undefined;\n\tlet frame = 0;\n\tlet label = \"\";\n\tconst interactive = isInteractive();\n\n\treturn {\n\t\tstart(msg) {\n\t\t\tlabel = msg;\n\t\t\tif (!interactive) {\n\t\t\t\tout.write(`${bar(label)}\\n`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tout.write(cursor.hide);\n\t\t\ttimer = setInterval(() => {\n\t\t\t\tframe = (frame + 1) % S.spinner.length;\n\t\t\t\tout.write(`\\r${c.brand(S.spinner[frame] ?? \"\")} ${label}\\x1b[0K`);\n\t\t\t}, 120);\n\t\t},\n\t\tupdate(msg) {\n\t\t\tlabel = msg;\n\t\t},\n\t\tstop(msg, ok = true) {\n\t\t\tclearInterval(timer);\n\t\t\ttimer = undefined;\n\t\t\tif (!interactive) {\n\t\t\t\tif (msg) out.write(`${bar(msg)}\\n`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst glyph = ok ? c.green(S.submit) : c.red(S.cancel);\n\t\t\tout.write(`\\r${glyph} ${msg ?? label}\\x1b[0K\\n${bar()}\\n${cursor.show}`);\n\t\t},\n\t};\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@baby-ui/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Add Baby UI and shadcn registry components to React and Svelte projects",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"homepage": "https://baby-ui.nexonauts.com",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/kanakkholwal/baby-ui.git",
|
|
10
|
+
"directory": "packages/cli"
|
|
11
|
+
},
|
|
12
|
+
"bugs": "https://github.com/kanakkholwal/baby-ui/issues",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"bin": {
|
|
15
|
+
"baby-ui": "./bin.mjs"
|
|
16
|
+
},
|
|
17
|
+
"exports": {
|
|
18
|
+
".": "./dist/index.js",
|
|
19
|
+
"./package.json": "./package.json"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"bin.mjs",
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=22.12.0"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"oxc-parser": "^0.154.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^26.6.2",
|
|
33
|
+
"commander": "^15.0.0",
|
|
34
|
+
"magic-string": "^1.4.3",
|
|
35
|
+
"postcss": "^8.5.30",
|
|
36
|
+
"tinyglobby": "^0.2.17",
|
|
37
|
+
"tsdown": "^0.23.1",
|
|
38
|
+
"typescript": "^6.0.3",
|
|
39
|
+
"vitest": "^5.0.4",
|
|
40
|
+
"yaml": "^2.9.1",
|
|
41
|
+
"zod": "^4.6.5"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsdown",
|
|
48
|
+
"dev": "tsdown --watch",
|
|
49
|
+
"check": "tsc --noEmit && vitest run",
|
|
50
|
+
"test": "vitest run",
|
|
51
|
+
"smoke": "node scripts/smoke.mjs"
|
|
52
|
+
}
|
|
6
53
|
}
|