create-yaebal 0.0.1 → 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/README.md +78 -13
- package/lib/args.d.ts +27 -0
- package/lib/args.d.ts.map +1 -0
- package/lib/args.js +122 -0
- package/lib/args.js.map +1 -0
- package/lib/args.test.d.ts +2 -0
- package/lib/args.test.d.ts.map +1 -0
- package/lib/args.test.js +38 -0
- package/lib/args.test.js.map +1 -0
- package/lib/catalog.d.ts +56 -0
- package/lib/catalog.d.ts.map +1 -0
- package/lib/catalog.js +241 -0
- package/lib/catalog.js.map +1 -0
- package/lib/config.d.ts +21 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +35 -0
- package/lib/config.js.map +1 -0
- package/lib/index.d.ts +14 -17
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +112 -144
- package/lib/index.js.map +1 -1
- package/lib/prompts.d.ts +10 -0
- package/lib/prompts.d.ts.map +1 -0
- package/lib/prompts.js +95 -0
- package/lib/prompts.js.map +1 -0
- package/lib/scaffold.d.ts +29 -0
- package/lib/scaffold.d.ts.map +1 -0
- package/lib/scaffold.js +296 -0
- package/lib/scaffold.js.map +1 -0
- package/lib/scaffold.test.d.ts +2 -0
- package/lib/scaffold.test.d.ts.map +1 -0
- package/lib/scaffold.test.js +96 -0
- package/lib/scaffold.test.js.map +1 -0
- package/lib/tui/ansi.d.ts +39 -0
- package/lib/tui/ansi.d.ts.map +1 -0
- package/lib/tui/ansi.js +84 -0
- package/lib/tui/ansi.js.map +1 -0
- package/lib/tui/app.d.ts +20 -0
- package/lib/tui/app.d.ts.map +1 -0
- package/lib/tui/app.js +381 -0
- package/lib/tui/app.js.map +1 -0
- package/lib/tui/app.test.d.ts +2 -0
- package/lib/tui/app.test.d.ts.map +1 -0
- package/lib/tui/app.test.js +87 -0
- package/lib/tui/app.test.js.map +1 -0
- package/lib/tui/theme.d.ts +23 -0
- package/lib/tui/theme.d.ts.map +1 -0
- package/lib/tui/theme.js +23 -0
- package/lib/tui/theme.js.map +1 -0
- package/lib/util.d.ts +27 -0
- package/lib/util.d.ts.map +1 -0
- package/lib/util.js +95 -0
- package/lib/util.js.map +1 -0
- package/package.json +1 -1
- package/lib/index.test.d.ts +0 -2
- package/lib/index.test.d.ts.map +0 -1
- package/lib/index.test.js +0 -29
- package/lib/index.test.js.map +0 -1
package/lib/tui/app.js
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* the wizard — a centred, keyboard-driven card rendered with pure ansi (see
|
|
3
|
+
* `./ansi.ts`). no native deps: it runs on node, bun and deno wherever there's
|
|
4
|
+
* a tty. a tiny step state-machine drives a full repaint on every keystroke,
|
|
5
|
+
* which at this size is instant and flicker-free on the alternate screen.
|
|
6
|
+
*
|
|
7
|
+
* the renderer is injectable (input/output/size) so tests can drive it with a
|
|
8
|
+
* fake stdin and read frames back from a fake stdout.
|
|
9
|
+
*/
|
|
10
|
+
import process from "node:process";
|
|
11
|
+
import { PACKAGE_MANAGERS, PLUGINS, RUNTIMES, TEMPLATES } from "../catalog.js";
|
|
12
|
+
import { defaults, sanitizePlugins } from "../config.js";
|
|
13
|
+
import { validateProjectName } from "../util.js";
|
|
14
|
+
import { fg, moveTo, onKeypress, padTo, screen, style, vlen } from "./ansi.js";
|
|
15
|
+
import { CARD_WIDTH, TAGLINE, TITLE, theme } from "./theme.js";
|
|
16
|
+
const STEPS = ["name", "runtime", "pm", "template", "plugins", "review"];
|
|
17
|
+
/** inner text width: card minus borders (2) minus side padding (2). */
|
|
18
|
+
const TW = CARD_WIDTH - 4;
|
|
19
|
+
function indexOfValue(arr, v) {
|
|
20
|
+
const i = arr.findIndex((x) => x.value === v);
|
|
21
|
+
return i === -1 ? 0 : i;
|
|
22
|
+
}
|
|
23
|
+
/** run the wizard. resolves with selections, or `undefined` if cancelled. */
|
|
24
|
+
export async function runTui(args, io = {}) {
|
|
25
|
+
const d = defaults(args);
|
|
26
|
+
const input = io.input ?? process.stdin;
|
|
27
|
+
const output = io.output ?? process.stdout;
|
|
28
|
+
const cols = () => io.cols ?? output.columns ?? 80;
|
|
29
|
+
const rows = () => io.rows ?? output.rows ?? 24;
|
|
30
|
+
const isTty = Boolean(output.isTTY);
|
|
31
|
+
const state = {
|
|
32
|
+
step: 0,
|
|
33
|
+
name: args.name ?? "",
|
|
34
|
+
runtimeIdx: indexOfValue(RUNTIMES, d.runtime),
|
|
35
|
+
pmIdx: indexOfValue(PACKAGE_MANAGERS, d.packageManager),
|
|
36
|
+
templateIdx: indexOfValue(TEMPLATES, d.template),
|
|
37
|
+
pluginCursor: 0,
|
|
38
|
+
selected: new Set(d.plugins),
|
|
39
|
+
git: d.git,
|
|
40
|
+
install: d.install,
|
|
41
|
+
reviewCursor: 2,
|
|
42
|
+
};
|
|
43
|
+
// steps the user already pinned via flags are skipped during navigation.
|
|
44
|
+
const locked = {};
|
|
45
|
+
if (args.runtime)
|
|
46
|
+
locked.runtime = true;
|
|
47
|
+
if (args.packageManager)
|
|
48
|
+
locked.pm = true;
|
|
49
|
+
if (args.template)
|
|
50
|
+
locked.template = true;
|
|
51
|
+
if (args.plugins)
|
|
52
|
+
locked.plugins = true;
|
|
53
|
+
const write = (s) => output.write(s);
|
|
54
|
+
// ── styling shortcuts ────────────────────────────────────────────────────
|
|
55
|
+
const accent = fg(theme.accent);
|
|
56
|
+
const dim = fg(theme.dim);
|
|
57
|
+
const text = fg(theme.text);
|
|
58
|
+
const border = fg(theme.border);
|
|
59
|
+
function clip(s, w) {
|
|
60
|
+
return s.length > w ? s.slice(0, w) : s;
|
|
61
|
+
}
|
|
62
|
+
/** a single row: per-segment fg, a full-width background when active. */
|
|
63
|
+
function rowLine(active, segs) {
|
|
64
|
+
const bg = active ? theme.cursorBg : undefined;
|
|
65
|
+
let remaining = TW;
|
|
66
|
+
let out = "";
|
|
67
|
+
for (const s of segs) {
|
|
68
|
+
if (remaining <= 0)
|
|
69
|
+
break;
|
|
70
|
+
const t = clip(s.t, remaining);
|
|
71
|
+
remaining -= t.length;
|
|
72
|
+
out += style({ fg: s.fg, bg })(t);
|
|
73
|
+
}
|
|
74
|
+
if (remaining > 0)
|
|
75
|
+
out += style({ bg })(" ".repeat(remaining));
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
// ── content builders (return inner lines) ────────────────────────────────
|
|
79
|
+
function headerLines() {
|
|
80
|
+
let crumbs = "";
|
|
81
|
+
STEPS.forEach((_, i) => {
|
|
82
|
+
const color = i < state.step ? theme.accent : i === state.step ? theme.accentBright : theme.border;
|
|
83
|
+
crumbs += fg(color)(i === state.step ? "● " : "○ ");
|
|
84
|
+
});
|
|
85
|
+
crumbs += dim(` ${state.step + 1}/${STEPS.length} ${STEPS[state.step]}`);
|
|
86
|
+
return [dim(TAGLINE), "", crumbs];
|
|
87
|
+
}
|
|
88
|
+
function inputBar(value) {
|
|
89
|
+
const inside = clip(` ${value}█`, TW);
|
|
90
|
+
return style({ bg: theme.panel, fg: theme.text })(padTo(inside, TW));
|
|
91
|
+
}
|
|
92
|
+
function selectLines(choices, cursor) {
|
|
93
|
+
const lines = [];
|
|
94
|
+
choices.forEach((ch, i) => {
|
|
95
|
+
const active = i === cursor;
|
|
96
|
+
lines.push(rowLine(active, [
|
|
97
|
+
{ t: active ? "▶ " : " ", fg: active ? theme.accentBright : theme.dim },
|
|
98
|
+
{ t: ch.label, fg: active ? theme.accentBright : theme.text },
|
|
99
|
+
]));
|
|
100
|
+
lines.push(rowLine(active, [{ t: ` ${ch.hint}`, fg: theme.dim }]));
|
|
101
|
+
});
|
|
102
|
+
return lines;
|
|
103
|
+
}
|
|
104
|
+
/** windowed slice of a long list, keeping the cursor visible. */
|
|
105
|
+
function windowed(total, cursor, max) {
|
|
106
|
+
if (total <= max)
|
|
107
|
+
return [0, total];
|
|
108
|
+
let start = cursor - Math.floor(max / 2);
|
|
109
|
+
if (start < 0)
|
|
110
|
+
start = 0;
|
|
111
|
+
if (start + max > total)
|
|
112
|
+
start = total - max;
|
|
113
|
+
return [start, start + max];
|
|
114
|
+
}
|
|
115
|
+
function pluginLines() {
|
|
116
|
+
const lines = [accent(`plugins · ${state.selected.size} selected`), ""];
|
|
117
|
+
const max = Math.max(6, rows() - 12);
|
|
118
|
+
const [from, to] = windowed(PLUGINS.length, state.pluginCursor, max);
|
|
119
|
+
if (from > 0)
|
|
120
|
+
lines.push(dim(" ↑ more"));
|
|
121
|
+
for (let i = from; i < to; i++) {
|
|
122
|
+
const p = PLUGINS[i];
|
|
123
|
+
if (!p)
|
|
124
|
+
continue;
|
|
125
|
+
const active = i === state.pluginCursor;
|
|
126
|
+
const on = state.selected.has(p.id);
|
|
127
|
+
lines.push(rowLine(active, [
|
|
128
|
+
{ t: ` ${on ? "◉" : "◯"} `, fg: on ? theme.accent : theme.dim },
|
|
129
|
+
{ t: p.recommended ? `${p.id} ★` : p.id, fg: active ? theme.text : theme.dim },
|
|
130
|
+
{ t: ` ${p.hint}`, fg: theme.border },
|
|
131
|
+
]));
|
|
132
|
+
}
|
|
133
|
+
if (to < PLUGINS.length)
|
|
134
|
+
lines.push(dim(" ↓ more"));
|
|
135
|
+
return lines;
|
|
136
|
+
}
|
|
137
|
+
function reviewLines() {
|
|
138
|
+
const sel = sanitizePlugins([...state.selected]);
|
|
139
|
+
const kv = (k, v) => `${dim(` ${k.padEnd(9)}`)} ${text(clip(v, TW - 12))}`;
|
|
140
|
+
return [
|
|
141
|
+
accent("review & create"),
|
|
142
|
+
"",
|
|
143
|
+
kv("name", state.name.trim() || "my-bot"),
|
|
144
|
+
kv("runtime", RUNTIMES[state.runtimeIdx]?.label ?? "node.js"),
|
|
145
|
+
kv("pkg mgr", PACKAGE_MANAGERS[state.pmIdx]?.label ?? "pnpm"),
|
|
146
|
+
kv("template", TEMPLATES[state.templateIdx]?.label ?? "minimal"),
|
|
147
|
+
kv("plugins", sel.length ? sel.join(", ") : "none"),
|
|
148
|
+
"",
|
|
149
|
+
rowLine(state.reviewCursor === 0, [
|
|
150
|
+
{ t: ` ${state.git ? "◉" : "◯"} `, fg: state.git ? theme.accent : theme.dim },
|
|
151
|
+
{ t: "git init", fg: theme.text },
|
|
152
|
+
{ t: " repo + first commit", fg: theme.border },
|
|
153
|
+
]),
|
|
154
|
+
rowLine(state.reviewCursor === 1, [
|
|
155
|
+
{ t: ` ${state.install ? "◉" : "◯"} `, fg: state.install ? theme.accent : theme.dim },
|
|
156
|
+
{ t: "install deps", fg: theme.text },
|
|
157
|
+
{ t: " run the package manager", fg: theme.border },
|
|
158
|
+
]),
|
|
159
|
+
rowLine(state.reviewCursor === 2, [
|
|
160
|
+
{ t: " » ", fg: theme.accentBright },
|
|
161
|
+
{ t: "create project", fg: state.reviewCursor === 2 ? theme.accentBright : theme.text },
|
|
162
|
+
]),
|
|
163
|
+
];
|
|
164
|
+
}
|
|
165
|
+
function bodyAndFooter() {
|
|
166
|
+
switch (STEPS[state.step]) {
|
|
167
|
+
case "name":
|
|
168
|
+
return {
|
|
169
|
+
body: [
|
|
170
|
+
accent("what should we call your bot project?"),
|
|
171
|
+
"",
|
|
172
|
+
inputBar(state.name),
|
|
173
|
+
state.nameError
|
|
174
|
+
? fg(theme.bad)(`✗ ${state.nameError}`)
|
|
175
|
+
: dim("used as the folder & package name"),
|
|
176
|
+
],
|
|
177
|
+
footer: "type to edit · enter next · esc cancel",
|
|
178
|
+
};
|
|
179
|
+
case "runtime":
|
|
180
|
+
return {
|
|
181
|
+
body: [accent("which runtime?"), "", ...selectLines(RUNTIMES, state.runtimeIdx)],
|
|
182
|
+
footer: "↑/↓ move · enter next · ← back · esc cancel",
|
|
183
|
+
};
|
|
184
|
+
case "pm":
|
|
185
|
+
return {
|
|
186
|
+
body: [
|
|
187
|
+
accent("which package manager?"),
|
|
188
|
+
"",
|
|
189
|
+
...selectLines(PACKAGE_MANAGERS, state.pmIdx),
|
|
190
|
+
],
|
|
191
|
+
footer: "↑/↓ move · enter next · ← back · esc cancel",
|
|
192
|
+
};
|
|
193
|
+
case "template":
|
|
194
|
+
return {
|
|
195
|
+
body: [
|
|
196
|
+
accent("pick a starter template"),
|
|
197
|
+
"",
|
|
198
|
+
...selectLines(TEMPLATES, state.templateIdx),
|
|
199
|
+
],
|
|
200
|
+
footer: "↑/↓ move · enter next · ← back · esc cancel",
|
|
201
|
+
};
|
|
202
|
+
case "plugins":
|
|
203
|
+
return {
|
|
204
|
+
body: pluginLines(),
|
|
205
|
+
footer: "↑/↓ · space toggle · a/n all·none · enter next · ← back",
|
|
206
|
+
};
|
|
207
|
+
default:
|
|
208
|
+
return {
|
|
209
|
+
body: reviewLines(),
|
|
210
|
+
footer: "↑/↓ · space toggle · enter create · ← back · esc cancel",
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// ── framing & paint ──────────────────────────────────────────────────────
|
|
215
|
+
function frame(content) {
|
|
216
|
+
const W = CARD_WIDTH;
|
|
217
|
+
const out = [];
|
|
218
|
+
const title = ` ${TITLE} `;
|
|
219
|
+
const dashes = Math.max(0, W - 3 - vlen(title));
|
|
220
|
+
out.push(`${border("╭─")}${accent(title)}${border(`${"─".repeat(dashes)}╮`)}`);
|
|
221
|
+
const blank = `${border("│")}${" ".repeat(W - 2)}${border("│")}`;
|
|
222
|
+
out.push(blank);
|
|
223
|
+
for (const line of content)
|
|
224
|
+
out.push(`${border("│")} ${padTo(line, W - 4)} ${border("│")}`);
|
|
225
|
+
out.push(blank);
|
|
226
|
+
out.push(border(`╰${"─".repeat(W - 2)}╯`));
|
|
227
|
+
return out;
|
|
228
|
+
}
|
|
229
|
+
function render() {
|
|
230
|
+
const { body, footer } = bodyAndFooter();
|
|
231
|
+
// clip the footer so a long hint can never spill past the card border.
|
|
232
|
+
const card = frame([...headerLines(), "", ...body, "", dim(clip(footer, TW))]);
|
|
233
|
+
const top = Math.max(0, Math.floor((rows() - card.length) / 2));
|
|
234
|
+
const left = Math.max(0, Math.floor((cols() - CARD_WIDTH) / 2));
|
|
235
|
+
let out = screen.clear;
|
|
236
|
+
card.forEach((line, i) => {
|
|
237
|
+
out += moveTo(top + i + 1, left + 1) + line;
|
|
238
|
+
});
|
|
239
|
+
write(out);
|
|
240
|
+
}
|
|
241
|
+
// ── navigation + key handling ────────────────────────────────────────────
|
|
242
|
+
return new Promise((resolve) => {
|
|
243
|
+
let done = false;
|
|
244
|
+
let cleanup = () => { };
|
|
245
|
+
const finish = (result) => {
|
|
246
|
+
if (done)
|
|
247
|
+
return;
|
|
248
|
+
done = true;
|
|
249
|
+
cleanup();
|
|
250
|
+
if (isTty)
|
|
251
|
+
write(screen.showCursor + screen.leave);
|
|
252
|
+
resolve(result);
|
|
253
|
+
};
|
|
254
|
+
const commit = () => finish({
|
|
255
|
+
name: state.name.trim() || "my-bot",
|
|
256
|
+
runtime: RUNTIMES[state.runtimeIdx]?.value ?? "node",
|
|
257
|
+
packageManager: PACKAGE_MANAGERS[state.pmIdx]?.value ?? "pnpm",
|
|
258
|
+
template: TEMPLATES[state.templateIdx]?.value ?? "minimal",
|
|
259
|
+
plugins: sanitizePlugins([...state.selected]),
|
|
260
|
+
git: state.git,
|
|
261
|
+
install: state.install,
|
|
262
|
+
});
|
|
263
|
+
const nextStep = () => {
|
|
264
|
+
let i = state.step + 1;
|
|
265
|
+
while (i < STEPS.length && locked[STEPS[i]])
|
|
266
|
+
i++;
|
|
267
|
+
if (i >= STEPS.length)
|
|
268
|
+
return commit();
|
|
269
|
+
state.step = i;
|
|
270
|
+
render();
|
|
271
|
+
};
|
|
272
|
+
const prevStep = () => {
|
|
273
|
+
let i = state.step - 1;
|
|
274
|
+
while (i >= 0 && locked[STEPS[i]])
|
|
275
|
+
i--;
|
|
276
|
+
if (i < 0)
|
|
277
|
+
return;
|
|
278
|
+
state.step = i;
|
|
279
|
+
render();
|
|
280
|
+
};
|
|
281
|
+
const onKey = (key) => {
|
|
282
|
+
const step = STEPS[state.step];
|
|
283
|
+
if (key.ctrl && key.name === "c")
|
|
284
|
+
return finish(undefined);
|
|
285
|
+
if (key.name === "escape")
|
|
286
|
+
return state.step === 0 ? finish(undefined) : prevStep();
|
|
287
|
+
const enter = key.name === "return" || key.name === "enter";
|
|
288
|
+
if (step === "name") {
|
|
289
|
+
if (enter) {
|
|
290
|
+
const err = validateProjectName(state.name.trim());
|
|
291
|
+
if (err) {
|
|
292
|
+
state.nameError = err;
|
|
293
|
+
return render();
|
|
294
|
+
}
|
|
295
|
+
state.name = state.name.trim();
|
|
296
|
+
return nextStep();
|
|
297
|
+
}
|
|
298
|
+
if (key.name === "backspace") {
|
|
299
|
+
state.name = state.name.slice(0, -1);
|
|
300
|
+
state.nameError = undefined;
|
|
301
|
+
return render();
|
|
302
|
+
}
|
|
303
|
+
if (key.sequence && key.sequence.length === 1 && key.sequence >= " " && !key.ctrl) {
|
|
304
|
+
state.name += key.sequence;
|
|
305
|
+
state.nameError = undefined;
|
|
306
|
+
return render();
|
|
307
|
+
}
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
if (key.name === "left")
|
|
311
|
+
return prevStep();
|
|
312
|
+
if (step === "runtime" || step === "pm" || step === "template") {
|
|
313
|
+
const len = step === "runtime"
|
|
314
|
+
? RUNTIMES.length
|
|
315
|
+
: step === "pm"
|
|
316
|
+
? PACKAGE_MANAGERS.length
|
|
317
|
+
: TEMPLATES.length;
|
|
318
|
+
const get = () => step === "runtime" ? state.runtimeIdx : step === "pm" ? state.pmIdx : state.templateIdx;
|
|
319
|
+
const set = (n) => {
|
|
320
|
+
if (step === "runtime")
|
|
321
|
+
state.runtimeIdx = n;
|
|
322
|
+
else if (step === "pm")
|
|
323
|
+
state.pmIdx = n;
|
|
324
|
+
else
|
|
325
|
+
state.templateIdx = n;
|
|
326
|
+
};
|
|
327
|
+
if (key.name === "up")
|
|
328
|
+
set((get() - 1 + len) % len);
|
|
329
|
+
else if (key.name === "down")
|
|
330
|
+
set((get() + 1) % len);
|
|
331
|
+
else if (enter)
|
|
332
|
+
return nextStep();
|
|
333
|
+
else
|
|
334
|
+
return;
|
|
335
|
+
return render();
|
|
336
|
+
}
|
|
337
|
+
if (step === "plugins") {
|
|
338
|
+
if (key.name === "up")
|
|
339
|
+
state.pluginCursor = (state.pluginCursor - 1 + PLUGINS.length) % PLUGINS.length;
|
|
340
|
+
else if (key.name === "down")
|
|
341
|
+
state.pluginCursor = (state.pluginCursor + 1) % PLUGINS.length;
|
|
342
|
+
else if (key.name === "space") {
|
|
343
|
+
const id = PLUGINS[state.pluginCursor]?.id;
|
|
344
|
+
if (id)
|
|
345
|
+
state.selected.has(id) ? state.selected.delete(id) : state.selected.add(id);
|
|
346
|
+
}
|
|
347
|
+
else if (key.name === "a")
|
|
348
|
+
for (const p of PLUGINS)
|
|
349
|
+
state.selected.add(p.id);
|
|
350
|
+
else if (key.name === "n")
|
|
351
|
+
state.selected.clear();
|
|
352
|
+
else if (enter)
|
|
353
|
+
return nextStep();
|
|
354
|
+
else
|
|
355
|
+
return;
|
|
356
|
+
return render();
|
|
357
|
+
}
|
|
358
|
+
// review
|
|
359
|
+
if (key.name === "up")
|
|
360
|
+
state.reviewCursor = (state.reviewCursor + 2) % 3;
|
|
361
|
+
else if (key.name === "down")
|
|
362
|
+
state.reviewCursor = (state.reviewCursor + 1) % 3;
|
|
363
|
+
else if (key.name === "space" || enter) {
|
|
364
|
+
if (state.reviewCursor === 0)
|
|
365
|
+
state.git = !state.git;
|
|
366
|
+
else if (state.reviewCursor === 1)
|
|
367
|
+
state.install = !state.install;
|
|
368
|
+
else
|
|
369
|
+
return commit();
|
|
370
|
+
}
|
|
371
|
+
else
|
|
372
|
+
return;
|
|
373
|
+
return render();
|
|
374
|
+
};
|
|
375
|
+
cleanup = onKeypress(input, onKey);
|
|
376
|
+
if (isTty)
|
|
377
|
+
write(screen.enter + screen.hideCursor);
|
|
378
|
+
render();
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
//# sourceMappingURL=app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.test.d.ts","sourceRoot":"","sources":["../../src/tui/app.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { PassThrough } from "node:stream";
|
|
3
|
+
import test from "node:test";
|
|
4
|
+
import { parseArgs } from "../args.js";
|
|
5
|
+
import { stripAnsi } from "./ansi.js";
|
|
6
|
+
import { runTui } from "./app.js";
|
|
7
|
+
/**
|
|
8
|
+
* the wizard is pure ansi/readline, so it tests on plain node — no native core,
|
|
9
|
+
* no skips. we drive it through a fake stdin (writing raw key sequences) and
|
|
10
|
+
* read frames back from a fake stdout.
|
|
11
|
+
*/
|
|
12
|
+
function harness() {
|
|
13
|
+
const input = new PassThrough();
|
|
14
|
+
const output = new PassThrough();
|
|
15
|
+
let buf = "";
|
|
16
|
+
output.on("data", (d) => {
|
|
17
|
+
buf += d.toString();
|
|
18
|
+
});
|
|
19
|
+
const tick = () => new Promise((r) => setImmediate(r));
|
|
20
|
+
return {
|
|
21
|
+
input: input,
|
|
22
|
+
output: output,
|
|
23
|
+
frame: () => stripAnsi(buf),
|
|
24
|
+
async press(seq) {
|
|
25
|
+
input.write(seq);
|
|
26
|
+
await tick();
|
|
27
|
+
},
|
|
28
|
+
async type(s) {
|
|
29
|
+
for (const ch of s)
|
|
30
|
+
await this.press(ch);
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const ENTER = "\r";
|
|
35
|
+
const DOWN = "\x1b[B";
|
|
36
|
+
const SPACE = " ";
|
|
37
|
+
const CTRL_C = "\x03";
|
|
38
|
+
test("tui: full flow resolves the chosen selections", async () => {
|
|
39
|
+
const h = harness();
|
|
40
|
+
const pending = runTui(parseArgs([]), { input: h.input, output: h.output, rows: 30, cols: 80 });
|
|
41
|
+
await h.type("testbot");
|
|
42
|
+
// name → runtime → pm → template → plugins → review → commit
|
|
43
|
+
for (let i = 0; i < 6; i++)
|
|
44
|
+
await h.press(ENTER);
|
|
45
|
+
const result = await pending;
|
|
46
|
+
assert.ok(result, "wizard should resolve with selections");
|
|
47
|
+
assert.equal(result?.name, "testbot");
|
|
48
|
+
assert.ok(["node", "bun", "deno"].includes(result?.runtime ?? ""));
|
|
49
|
+
assert.ok(result?.plugins.includes("session"));
|
|
50
|
+
});
|
|
51
|
+
test("tui: navigation, toggles and a plugin selection stick", async () => {
|
|
52
|
+
const h = harness();
|
|
53
|
+
const pending = runTui(parseArgs([]), { input: h.input, output: h.output, rows: 30, cols: 80 });
|
|
54
|
+
await h.type("navbot");
|
|
55
|
+
await h.press(ENTER); // → runtime
|
|
56
|
+
await h.press(DOWN); // move the runtime cursor
|
|
57
|
+
await h.press(ENTER); // → pm
|
|
58
|
+
await h.press(ENTER); // → template
|
|
59
|
+
await h.press(ENTER); // → plugins
|
|
60
|
+
await h.press(DOWN); // move to 2nd plugin
|
|
61
|
+
await h.press(SPACE); // toggle it
|
|
62
|
+
await h.press(ENTER); // → review
|
|
63
|
+
await h.press(ENTER); // create (cursor defaults to "create project")
|
|
64
|
+
const result = await pending;
|
|
65
|
+
assert.ok(result);
|
|
66
|
+
assert.equal(result?.name, "navbot");
|
|
67
|
+
// 2nd plugin (i18n) isn't in the default set, so toggling it adds it
|
|
68
|
+
assert.ok(result?.plugins.includes("i18n"));
|
|
69
|
+
assert.ok(["node", "bun", "deno"].includes(result?.runtime ?? ""));
|
|
70
|
+
});
|
|
71
|
+
test("tui: renders a centred card with the current step", async () => {
|
|
72
|
+
const h = harness();
|
|
73
|
+
const pending = runTui(parseArgs([]), { input: h.input, output: h.output, rows: 24, cols: 80 });
|
|
74
|
+
await h.press(""); // let the first frame flush
|
|
75
|
+
const f = h.frame();
|
|
76
|
+
assert.match(f, /create-yaebal/);
|
|
77
|
+
assert.match(f, /what should we call your bot project\?/);
|
|
78
|
+
await h.press(CTRL_C);
|
|
79
|
+
await pending;
|
|
80
|
+
});
|
|
81
|
+
test("tui: ctrl-c on the first step cancels", async () => {
|
|
82
|
+
const h = harness();
|
|
83
|
+
const pending = runTui(parseArgs([]), { input: h.input, output: h.output, rows: 24, cols: 80 });
|
|
84
|
+
await h.press(CTRL_C);
|
|
85
|
+
assert.equal(await pending, undefined);
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=app.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.test.js","sourceRoot":"","sources":["../../src/tui/app.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* palette for the wizard — the same black-on-blue look as the docs site
|
|
3
|
+
* (`--blue: #2a7ce1`). deliberately minimal: one accent, a few greys.
|
|
4
|
+
*/
|
|
5
|
+
export declare const theme: {
|
|
6
|
+
readonly bg: "#0a0a0c";
|
|
7
|
+
readonly panel: "#0e0e10";
|
|
8
|
+
readonly border: "#2a2a2e";
|
|
9
|
+
readonly borderActive: "#2a7ce1";
|
|
10
|
+
readonly text: "#e1e1e1";
|
|
11
|
+
readonly dim: "#75757e";
|
|
12
|
+
readonly accent: "#2a7ce1";
|
|
13
|
+
readonly accentBright: "#2f8af9";
|
|
14
|
+
readonly good: "#30bd1b";
|
|
15
|
+
readonly warn: "#f1b338";
|
|
16
|
+
readonly bad: "#ed2236";
|
|
17
|
+
readonly cursorBg: "#15161c";
|
|
18
|
+
};
|
|
19
|
+
export declare const TITLE = "create-yaebal";
|
|
20
|
+
export declare const TAGLINE = "scaffold a type-safe telegram bot";
|
|
21
|
+
/** fixed card width — keeps the wizard readable and centred on any terminal. */
|
|
22
|
+
export declare const CARD_WIDTH = 62;
|
|
23
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,KAAK;;;;;;;;;;;;;CAaR,CAAC;AAEX,eAAO,MAAM,KAAK,kBAAkB,CAAC;AACrC,eAAO,MAAM,OAAO,sCAAsC,CAAC;AAE3D,gFAAgF;AAChF,eAAO,MAAM,UAAU,KAAK,CAAC"}
|
package/lib/tui/theme.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* palette for the wizard — the same black-on-blue look as the docs site
|
|
3
|
+
* (`--blue: #2a7ce1`). deliberately minimal: one accent, a few greys.
|
|
4
|
+
*/
|
|
5
|
+
export const theme = {
|
|
6
|
+
bg: "#0a0a0c",
|
|
7
|
+
panel: "#0e0e10",
|
|
8
|
+
border: "#2a2a2e",
|
|
9
|
+
borderActive: "#2a7ce1",
|
|
10
|
+
text: "#e1e1e1",
|
|
11
|
+
dim: "#75757e",
|
|
12
|
+
accent: "#2a7ce1",
|
|
13
|
+
accentBright: "#2f8af9",
|
|
14
|
+
good: "#30bd1b",
|
|
15
|
+
warn: "#f1b338",
|
|
16
|
+
bad: "#ed2236",
|
|
17
|
+
cursorBg: "#15161c",
|
|
18
|
+
};
|
|
19
|
+
export const TITLE = "create-yaebal";
|
|
20
|
+
export const TAGLINE = "scaffold a type-safe telegram bot";
|
|
21
|
+
/** fixed card width — keeps the wizard readable and centred on any terminal. */
|
|
22
|
+
export const CARD_WIDTH = 62;
|
|
23
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG;IACpB,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,SAAS;IACjB,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,QAAQ,EAAE,SAAS;CACV,CAAC;AAEX,MAAM,CAAC,MAAM,KAAK,GAAG,eAAe,CAAC;AACrC,MAAM,CAAC,MAAM,OAAO,GAAG,mCAAmC,CAAC;AAE3D,gFAAgF;AAChF,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC"}
|
package/lib/util.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* small runtime/environment helpers shared by every front-end: detection of
|
|
3
|
+
* the current runtime and package manager, tty checks, project-name validation
|
|
4
|
+
* and tiny process spawners for `git init` / dependency install.
|
|
5
|
+
*/
|
|
6
|
+
import type { PackageManager, Runtime } from "./catalog.js";
|
|
7
|
+
/** detect which runtime is executing the scaffolder right now. */
|
|
8
|
+
export declare function detectRuntime(): Runtime;
|
|
9
|
+
/** detect the package manager from `npm_config_user_agent` (set by every pm). */
|
|
10
|
+
export declare function detectPackageManager(): PackageManager | undefined;
|
|
11
|
+
/** true when both stdin and stdout are real ttys (prompts/tui make sense). */
|
|
12
|
+
export declare function isInteractive(): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* whether the rich ansi front-end can run. it needs an interactive tty, a
|
|
15
|
+
* terminal that isn't a dumb one, and the user not opting out via env. callers
|
|
16
|
+
* still fall back gracefully to the plain prompts otherwise.
|
|
17
|
+
*/
|
|
18
|
+
export declare function supportsTui(): boolean;
|
|
19
|
+
/** npm package-name rules, scoped down to what a folder can be called. */
|
|
20
|
+
export declare function validateProjectName(raw: string): string | undefined;
|
|
21
|
+
/** spawn a command, inheriting stdio, resolving to its exit code. */
|
|
22
|
+
export declare function exec(cmd: string, args: string[], cwd: string): Promise<number>;
|
|
23
|
+
/** `git init` + an initial commit; best-effort, never throws. */
|
|
24
|
+
export declare function gitInit(cwd: string): Promise<boolean>;
|
|
25
|
+
/** run the package manager's install in `cwd`. deno is a no-op (no lockfile). */
|
|
26
|
+
export declare function installDeps(pm: PackageManager, cwd: string): Promise<boolean>;
|
|
27
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5D,kEAAkE;AAClE,wBAAgB,aAAa,IAAI,OAAO,CAOvC;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,IAAI,cAAc,GAAG,SAAS,CAYjE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAQrC;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYnE;AAED,qEAAqE;AACrE,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9E;AAED,iEAAiE;AACjE,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ3D;AAED,iFAAiF;AACjF,wBAAsB,WAAW,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnF"}
|