create-yaebal 0.0.1 → 0.1.1

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 (59) hide show
  1. package/README.md +78 -13
  2. package/bin/cli.mjs +1 -0
  3. package/lib/args.d.ts +27 -0
  4. package/lib/args.d.ts.map +1 -0
  5. package/lib/args.js +122 -0
  6. package/lib/args.js.map +1 -0
  7. package/lib/args.test.d.ts +2 -0
  8. package/lib/args.test.d.ts.map +1 -0
  9. package/lib/args.test.js +38 -0
  10. package/lib/args.test.js.map +1 -0
  11. package/lib/catalog.d.ts +56 -0
  12. package/lib/catalog.d.ts.map +1 -0
  13. package/lib/catalog.js +241 -0
  14. package/lib/catalog.js.map +1 -0
  15. package/lib/config.d.ts +21 -0
  16. package/lib/config.d.ts.map +1 -0
  17. package/lib/config.js +35 -0
  18. package/lib/config.js.map +1 -0
  19. package/lib/index.d.ts +14 -17
  20. package/lib/index.d.ts.map +1 -1
  21. package/lib/index.js +112 -144
  22. package/lib/index.js.map +1 -1
  23. package/lib/prompts.d.ts +10 -0
  24. package/lib/prompts.d.ts.map +1 -0
  25. package/lib/prompts.js +95 -0
  26. package/lib/prompts.js.map +1 -0
  27. package/lib/scaffold.d.ts +29 -0
  28. package/lib/scaffold.d.ts.map +1 -0
  29. package/lib/scaffold.js +296 -0
  30. package/lib/scaffold.js.map +1 -0
  31. package/lib/scaffold.test.d.ts +2 -0
  32. package/lib/scaffold.test.d.ts.map +1 -0
  33. package/lib/scaffold.test.js +96 -0
  34. package/lib/scaffold.test.js.map +1 -0
  35. package/lib/tui/ansi.d.ts +39 -0
  36. package/lib/tui/ansi.d.ts.map +1 -0
  37. package/lib/tui/ansi.js +84 -0
  38. package/lib/tui/ansi.js.map +1 -0
  39. package/lib/tui/app.d.ts +20 -0
  40. package/lib/tui/app.d.ts.map +1 -0
  41. package/lib/tui/app.js +381 -0
  42. package/lib/tui/app.js.map +1 -0
  43. package/lib/tui/app.test.d.ts +2 -0
  44. package/lib/tui/app.test.d.ts.map +1 -0
  45. package/lib/tui/app.test.js +87 -0
  46. package/lib/tui/app.test.js.map +1 -0
  47. package/lib/tui/theme.d.ts +23 -0
  48. package/lib/tui/theme.d.ts.map +1 -0
  49. package/lib/tui/theme.js +23 -0
  50. package/lib/tui/theme.js.map +1 -0
  51. package/lib/util.d.ts +27 -0
  52. package/lib/util.d.ts.map +1 -0
  53. package/lib/util.js +95 -0
  54. package/lib/util.js.map +1 -0
  55. package/package.json +1 -1
  56. package/lib/index.test.d.ts +0 -2
  57. package/lib/index.test.d.ts.map +0 -1
  58. package/lib/index.test.js +0 -29
  59. package/lib/index.test.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ /**
2
+ * the fully-resolved set of choices that drives generation. every front-end
3
+ * (flags-only, plain prompts, tui) produces one of these; `writeProject` and
4
+ * `renderFiles` consume it.
5
+ */
6
+ import type { ParsedArgs } from "./args.js";
7
+ import { type PackageManager, type Runtime, type TemplateId } from "./catalog.js";
8
+ export interface Selections {
9
+ name: string;
10
+ runtime: Runtime;
11
+ packageManager: PackageManager;
12
+ template: TemplateId;
13
+ plugins: string[];
14
+ git: boolean;
15
+ install: boolean;
16
+ }
17
+ /** the sensible default for each field, given what the user already passed. */
18
+ export declare function defaults(args: ParsedArgs): Selections;
19
+ /** drop any plugin ids that aren't in the catalog, preserving order + dedupe. */
20
+ export declare function sanitizePlugins(ids: string[]): string[];
21
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,KAAK,cAAc,EAAc,KAAK,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAI9F,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAcrD;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAYvD"}
package/lib/config.js ADDED
@@ -0,0 +1,35 @@
1
+ /**
2
+ * the fully-resolved set of choices that drives generation. every front-end
3
+ * (flags-only, plain prompts, tui) produces one of these; `writeProject` and
4
+ * `renderFiles` consume it.
5
+ */
6
+ import { PLUGIN_IDS } from "./catalog.js";
7
+ import { defaultPackageManager } from "./scaffold.js";
8
+ import { detectPackageManager, detectRuntime } from "./util.js";
9
+ /** the sensible default for each field, given what the user already passed. */
10
+ export function defaults(args) {
11
+ const runtime = args.runtime ?? detectRuntime();
12
+ const packageManager = args.packageManager ?? detectPackageManager() ?? defaultPackageManager(runtime);
13
+ return {
14
+ name: args.name ?? "my-bot",
15
+ runtime,
16
+ packageManager,
17
+ template: args.template ?? "minimal",
18
+ plugins: args.plugins ?? ["session", "again", "fmt"],
19
+ git: args.git ?? true,
20
+ install: args.install ?? false,
21
+ };
22
+ }
23
+ /** drop any plugin ids that aren't in the catalog, preserving order + dedupe. */
24
+ export function sanitizePlugins(ids) {
25
+ const seen = new Set();
26
+ const out = [];
27
+ for (const id of ids) {
28
+ if (PLUGIN_IDS.includes(id) && !seen.has(id)) {
29
+ seen.add(id);
30
+ out.push(id);
31
+ }
32
+ }
33
+ return out;
34
+ }
35
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAuB,UAAU,EAAiC,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAYhE,+EAA+E;AAC/E,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC;IAChD,MAAM,cAAc,GACnB,IAAI,CAAC,cAAc,IAAI,oBAAoB,EAAE,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEjF,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,QAAQ;QAC3B,OAAO;QACP,cAAc;QACd,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS;QACpC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC;QACpD,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;KAC9B,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,eAAe,CAAC,GAAa;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,CAAC;IACF,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC"}
package/lib/index.d.ts CHANGED
@@ -1,18 +1,15 @@
1
- export type Runtime = "node" | "bun" | "deno";
2
- export interface ScaffoldOptions {
3
- name: string;
4
- runtime: Runtime;
5
- plugins: string[];
6
- }
7
- /** pure: turn options into a map of relative path → file content. */
8
- export declare function renderFiles(opts: ScaffoldOptions): Record<string, string>;
9
- interface Args {
10
- name?: string;
11
- runtime?: string;
12
- plugins?: string;
13
- }
14
- /** pure: parse argv into name + flags. supports `<name> --runtime x --plugins a,b`. */
15
- export declare function parseArgs(argv: string[]): Args;
16
- export declare function main(): Promise<void>;
17
- export {};
1
+ /**
2
+ * create-yaebal — scaffold a type-safe telegram bot.
3
+ *
4
+ * three front-ends, one pipeline:
5
+ * flags (`--yes`) → no prompts · plain readline → fallback · ansi wizard → the
6
+ * hype. all of them produce a `Selections`, which `renderFiles` + `writeProject`
7
+ * turn into a working project.
8
+ */
9
+ export type { ParsedArgs } from "./args.js";
10
+ export { parseArgs } from "./args.js";
11
+ export * from "./catalog.js";
12
+ export * from "./config.js";
13
+ export * from "./scaffold.js";
14
+ export declare function main(argv?: string[]): Promise<void>;
18
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AA6B9C,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB;AAcD,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+DzE;AAID,UAAU,IAAI;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAY9C;AAED,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA+D1C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AA2D9B,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEhF"}
package/lib/index.js CHANGED
@@ -1,157 +1,125 @@
1
+ /**
2
+ * create-yaebal — scaffold a type-safe telegram bot.
3
+ *
4
+ * three front-ends, one pipeline:
5
+ * flags (`--yes`) → no prompts · plain readline → fallback · ansi wizard → the
6
+ * hype. all of them produce a `Selections`, which `renderFiles` + `writeProject`
7
+ * turn into a working project.
8
+ */
1
9
  import { existsSync } from "node:fs";
2
- import { mkdir, writeFile } from "node:fs/promises";
3
- import { dirname, join, resolve } from "node:path";
10
+ import { createRequire } from "node:module";
11
+ import { resolve } from "node:path";
4
12
  import process from "node:process";
5
- import { createInterface } from "node:readline/promises";
6
- const CATALOG = {
7
- session: {
8
- dep: "@yaebal/session",
9
- import: 'import { session } from "@yaebal/session";',
10
- install: "session({ initial: () => ({ seen: 0 }) })",
11
- },
12
- ratelimiter: {
13
- dep: "@yaebal/ratelimiter",
14
- import: 'import { ratelimiter } from "@yaebal/ratelimiter";',
15
- install: "ratelimiter()",
16
- },
17
- again: {
18
- dep: "@yaebal/again",
19
- import: 'import { autoRetry } from "@yaebal/again";',
20
- setup: "autoRetry(bot.api);",
21
- },
13
+ import { HELP, parseArgs } from "./args.js";
14
+ import { defaults, sanitizePlugins } from "./config.js";
15
+ import { runPrompts } from "./prompts.js";
16
+ import { installCommand, renderFiles, runCommand, writeProject } from "./scaffold.js";
17
+ import { gitInit, installDeps, isInteractive, supportsTui, validateProjectName } from "./util.js";
18
+ export { parseArgs } from "./args.js";
19
+ // re-exports so the package is usable as a library / from tests ---------------
20
+ export * from "./catalog.js";
21
+ export * from "./config.js";
22
+ export * from "./scaffold.js";
23
+ const c = {
24
+ cyan: (s) => `\x1b[36m${s}\x1b[0m`,
25
+ green: (s) => `\x1b[32m${s}\x1b[0m`,
26
+ dim: (s) => `\x1b[2m${s}\x1b[0m`,
27
+ bold: (s) => `\x1b[1m${s}\x1b[0m`,
28
+ red: (s) => `\x1b[31m${s}\x1b[0m`,
22
29
  };
23
- const SCRIPTS = {
24
- node: {
25
- dev: "node --watch --experimental-strip-types src/index.ts",
26
- start: "node --experimental-strip-types src/index.ts",
27
- },
28
- bun: { dev: "bun --watch src/index.ts", start: "bun src/index.ts" },
29
- deno: {
30
- dev: "deno run --watch --allow-net --allow-env src/index.ts",
31
- start: "deno run --allow-net --allow-env src/index.ts",
32
- },
33
- };
34
- /** pure: turn options into a map of relative path → file content. */
35
- export function renderFiles(opts) {
36
- const chosen = opts.plugins.filter((p) => p in CATALOG);
37
- const imports = [
38
- 'import { Bot } from "@yaebal/core";',
39
- ...chosen.map((p) => CATALOG[p]?.import ?? ""),
40
- ]
41
- .filter(Boolean)
42
- .join("\n");
43
- const installs = chosen.map((p) => CATALOG[p]?.install).filter((x) => Boolean(x));
44
- const setups = chosen.map((p) => CATALOG[p]?.setup).filter((x) => Boolean(x));
45
- const botDecl = installs.length
46
- ? `const bot = new Bot(process.env.BOT_TOKEN ?? "")\n${installs.map((s) => `\t.install(${s})`).join("\n")};`
47
- : `const bot = new Bot(process.env.BOT_TOKEN ?? "");`;
48
- const index = `${imports}\n\n${botDecl}\n${setups.length ? `\n${setups.join("\n")}\n` : ""}
49
- bot.command("start", (ctx) => ctx.reply("hello from yaebal 👋"));
50
-
51
- bot.on("message:text", (ctx) => ctx.reply(ctx.text));
52
-
53
- bot.start();
54
- console.log("bot running");
55
- `;
56
- const deps = { "@yaebal/core": "latest" };
57
- for (const p of chosen) {
58
- const dep = CATALOG[p]?.dep;
59
- if (dep)
60
- deps[dep] = "latest";
30
+ function version() {
31
+ try {
32
+ const require = createRequire(import.meta.url);
33
+ return require("../package.json").version;
61
34
  }
62
- const pkg = {
63
- name: opts.name,
64
- version: "0.0.0",
65
- private: true,
66
- type: "module",
67
- scripts: SCRIPTS[opts.runtime],
68
- dependencies: deps,
69
- devDependencies: { "@types/node": "^22.0.0", typescript: "^5.7.0" },
70
- };
71
- const tsconfig = {
72
- compilerOptions: {
73
- target: "ES2022",
74
- module: "NodeNext",
75
- moduleResolution: "NodeNext",
76
- strict: true,
77
- noUncheckedIndexedAccess: true,
78
- verbatimModuleSyntax: true,
79
- skipLibCheck: true,
80
- outDir: "lib",
81
- },
82
- include: ["src"],
83
- };
84
- return {
85
- "package.json": `${JSON.stringify(pkg, null, 2)}\n`,
86
- "tsconfig.json": `${JSON.stringify(tsconfig, null, 2)}\n`,
87
- "src/index.ts": index,
88
- ".env.example": "BOT_TOKEN=\n",
89
- ".gitignore": "node_modules\nlib\n.env\n",
90
- "README.md": `# ${opts.name}\n\na telegram bot built with [yaebal](https://github.com/neverlane/yaebal).\n\n\`\`\`sh\n# 1. put your token in .env\ncp .env.example .env\n\n# 2. run\n${opts.runtime === "deno" ? SCRIPTS.deno.dev : "pnpm dev"}\n\`\`\`\n`,
91
- };
92
- }
93
- const isRuntime = (v) => v === "node" || v === "bun" || v === "deno";
94
- /** pure: parse argv into name + flags. supports `<name> --runtime x --plugins a,b`. */
95
- export function parseArgs(argv) {
96
- const out = {};
97
- for (let i = 0; i < argv.length; i++) {
98
- const a = argv[i];
99
- if (a === "--runtime" || a === "-r")
100
- out.runtime = argv[++i];
101
- else if (a === "--plugins" || a === "-p")
102
- out.plugins = argv[++i];
103
- else if (a && !a.startsWith("-") && out.name === undefined)
104
- out.name = a;
35
+ catch {
36
+ return "0.0.0";
105
37
  }
106
- return out;
107
38
  }
108
- export async function main() {
109
- const args = parseArgs(process.argv.slice(2));
110
- const tty = Boolean(process.stdin.isTTY);
111
- const rl = tty ? createInterface({ input: process.stdin, output: process.stdout }) : null;
112
- try {
113
- let name = args.name;
114
- if (!name && rl)
115
- name = (await rl.question("project name: ")).trim();
116
- if (!name) {
117
- console.error("✗ project name is required\n usage: create-yaebal <name> [--runtime node|bun|deno] [--plugins session,again]");
118
- process.exitCode = 1;
119
- return;
120
- }
121
- let runtime = "node";
122
- if (args.runtime && isRuntime(args.runtime))
123
- runtime = args.runtime;
124
- else if (rl) {
125
- const a = (await rl.question("runtime — node / bun / deno [node]: ")).trim().toLowerCase();
126
- if (isRuntime(a))
127
- runtime = a;
128
- }
129
- let pluginsRaw = args.plugins ?? "";
130
- if (args.plugins === undefined && rl) {
131
- pluginsRaw = await rl.question("plugins — comma list of [session, ratelimiter, again] (enter to skip): ");
39
+ /** decide and run the front-end that gathers the user's choices. */
40
+ async function gather(args) {
41
+ // fully non-interactive: take defaults, no questions asked.
42
+ if (args.yes) {
43
+ const d = defaults(args);
44
+ return { ...d, plugins: sanitizePlugins(d.plugins) };
45
+ }
46
+ // no tty (piped/CI) and not --yes: we can't prompt. accept defaults if we
47
+ // at least have a name, otherwise tell the user how to proceed.
48
+ if (!isInteractive()) {
49
+ if (args.name) {
50
+ const d = defaults(args);
51
+ return { ...d, plugins: sanitizePlugins(d.plugins) };
132
52
  }
133
- const plugins = pluginsRaw
134
- .split(",")
135
- .map((s) => s.trim())
136
- .filter((p) => p in CATALOG);
137
- const target = resolve(process.cwd(), name);
138
- if (existsSync(target)) {
139
- console.error(`✗ directory "${name}" already exists`);
140
- process.exitCode = 1;
141
- return;
53
+ console.error(c.red("✗ no interactive terminal."), "pass a name and flags, e.g. `create-yaebal my-bot --yes`.");
54
+ process.exitCode = 1;
55
+ return undefined;
56
+ }
57
+ const wantTui = args.tui === true || (args.tui !== false && supportsTui());
58
+ if (wantTui) {
59
+ try {
60
+ const { runTui } = await import("./tui/app.js");
61
+ return await runTui(args);
142
62
  }
143
- const files = renderFiles({ name, runtime, plugins });
144
- for (const [rel, content] of Object.entries(files)) {
145
- const full = join(target, rel);
146
- await mkdir(dirname(full), { recursive: true });
147
- await writeFile(full, content);
63
+ catch (err) {
64
+ if (process.env.YAEBAL_DEBUG)
65
+ console.error(c.dim(`tui unavailable: ${String(err)}`));
66
+ // fall through to plain prompts
148
67
  }
149
- const installCmd = runtime === "deno" ? "deno cache src/index.ts" : "pnpm install";
150
- const runCmd = runtime === "deno" ? SCRIPTS.deno.dev : "pnpm dev";
151
- console.log(`\n✓ created ${name}/\n\nnext steps:\n cd ${name}\n ${installCmd}\n # add your BOT_TOKEN to .env\n ${runCmd}\n`);
152
68
  }
153
- finally {
154
- rl?.close();
69
+ return runPrompts(args);
70
+ }
71
+ export async function main(argv = process.argv.slice(2)) {
72
+ const args = parseArgs(argv);
73
+ if (args.help) {
74
+ console.log(HELP);
75
+ return;
76
+ }
77
+ if (args.version) {
78
+ console.log(version());
79
+ return;
80
+ }
81
+ for (const u of args.unknown)
82
+ console.error(c.dim(`warning: ignoring unknown argument "${u}"`));
83
+ const selections = await gather(args);
84
+ if (!selections) {
85
+ if (process.exitCode !== 1)
86
+ console.log(c.dim("\n✗ cancelled — nothing was created."));
87
+ return;
88
+ }
89
+ const nameError = validateProjectName(selections.name);
90
+ if (nameError) {
91
+ console.error(c.red(`✗ ${nameError}`));
92
+ process.exitCode = 1;
93
+ return;
94
+ }
95
+ const target = resolve(process.cwd(), selections.name);
96
+ if (existsSync(target)) {
97
+ console.error(c.red(`✗ directory "${selections.name}" already exists`));
98
+ process.exitCode = 1;
99
+ return;
100
+ }
101
+ const files = renderFiles(selections);
102
+ await writeProject(target, files);
103
+ console.log(c.green(`\n✓ created ${selections.name}/`));
104
+ if (selections.git) {
105
+ const ok = await gitInit(target);
106
+ console.log(ok ? c.dim(" • initialised git repository") : c.dim(" • skipped git (not available)"));
107
+ }
108
+ if (selections.install) {
109
+ console.log(c.dim(` • installing dependencies with ${selections.packageManager}…`));
110
+ const ok = await installDeps(selections.packageManager, target);
111
+ if (!ok)
112
+ console.log(c.red(" • install failed — run it manually"));
155
113
  }
114
+ // next steps -----------------------------------------------------------------
115
+ const steps = [`cd ${selections.name}`];
116
+ if (!selections.install)
117
+ steps.push(installCommand(selections.packageManager));
118
+ steps.push(c.dim("# add your BOT_TOKEN to .env"));
119
+ steps.push(runCommand(selections.packageManager, "dev"));
120
+ console.log(`\n${c.bold("next steps:")}`);
121
+ for (const s of steps)
122
+ console.log(` ${s}`);
123
+ console.log(`\n${c.cyan("happy hacking ✦")}\n`);
156
124
  }
157
125
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * the plain, dependency-free wizard used when the rich tui can't run (no tty,
3
+ * `--no-tui`, or a dumb terminal). it's deliberately
4
+ * close to create-gramio's minimal flow: one question per line, sane defaults
5
+ * in brackets, enter to accept.
6
+ */
7
+ import type { ParsedArgs } from "./args.js";
8
+ import { type Selections } from "./config.js";
9
+ export declare function runPrompts(args: ParsedArgs): Promise<Selections | undefined>;
10
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAW5C,OAAO,EAAY,KAAK,UAAU,EAAmB,MAAM,aAAa,CAAC;AAkCzE,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAmElF"}
package/lib/prompts.js ADDED
@@ -0,0 +1,95 @@
1
+ /**
2
+ * the plain, dependency-free wizard used when the rich tui can't run (no tty,
3
+ * `--no-tui`, or a dumb terminal). it's deliberately
4
+ * close to create-gramio's minimal flow: one question per line, sane defaults
5
+ * in brackets, enter to accept.
6
+ */
7
+ import process from "node:process";
8
+ import { createInterface } from "node:readline/promises";
9
+ import { PACKAGE_MANAGERS, PLUGINS, RUNTIMES, TEMPLATES, } from "./catalog.js";
10
+ import { defaults, sanitizePlugins } from "./config.js";
11
+ import { validateProjectName } from "./util.js";
12
+ const c = {
13
+ dim: (s) => `\x1b[2m${s}\x1b[0m`,
14
+ cyan: (s) => `\x1b[36m${s}\x1b[0m`,
15
+ green: (s) => `\x1b[32m${s}\x1b[0m`,
16
+ bold: (s) => `\x1b[1m${s}\x1b[0m`,
17
+ };
18
+ async function pickOne(rl, question, choices, fallback) {
19
+ console.log(`\n${c.bold(question)}`);
20
+ choices.forEach((ch, i) => {
21
+ const mark = ch.value === fallback ? c.green("›") : " ";
22
+ console.log(` ${mark} ${i + 1}. ${ch.label} ${c.dim(`— ${ch.hint}`)}`);
23
+ });
24
+ const def = choices.findIndex((ch) => ch.value === fallback) + 1;
25
+ const ans = (await rl.question(c.dim(` choose 1-${choices.length} [${def}]: `))).trim();
26
+ if (!ans)
27
+ return fallback;
28
+ const idx = Number.parseInt(ans, 10) - 1;
29
+ return choices[idx]?.value ?? fallback;
30
+ }
31
+ export async function runPrompts(args) {
32
+ const d = defaults(args);
33
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
34
+ try {
35
+ console.log(c.cyan("\n ✦ create-yaebal — let's scaffold a bot\n"));
36
+ let name = args.name;
37
+ while (name === undefined) {
38
+ const ans = (await rl.question(`${c.bold("project name")} ${c.dim(`[${d.name}]: `)}`)).trim();
39
+ const candidate = ans || d.name;
40
+ const err = validateProjectName(candidate);
41
+ if (err) {
42
+ console.log(c.dim(` ✗ ${err}`));
43
+ continue;
44
+ }
45
+ name = candidate;
46
+ }
47
+ const runtime = args.runtime ?? (await pickOne(rl, "runtime", RUNTIMES, d.runtime));
48
+ const packageManager = args.packageManager ??
49
+ (await pickOne(rl, "package manager", PACKAGE_MANAGERS, d.packageManager));
50
+ const template = args.template ?? (await pickOne(rl, "template", TEMPLATES, d.template));
51
+ let plugins = args.plugins;
52
+ if (plugins === undefined) {
53
+ console.log(`\n${c.bold("plugins")} ${c.dim("(space/comma separated ids, or 'all')")}`);
54
+ PLUGINS.forEach((p) => {
55
+ const star = p.recommended ? c.green(" ★") : "";
56
+ console.log(` ${p.id}${star} ${c.dim(`— ${p.hint}`)}`);
57
+ });
58
+ const def = d.plugins.join(", ");
59
+ const ans = (await rl.question(c.dim(` plugins [${def}]: `))).trim();
60
+ if (!ans)
61
+ plugins = d.plugins;
62
+ else if (ans.toLowerCase() === "all")
63
+ plugins = PLUGINS.map((p) => p.id);
64
+ else if (ans.toLowerCase() === "none")
65
+ plugins = [];
66
+ else
67
+ plugins = ans.split(/[\s,]+/).filter(Boolean);
68
+ }
69
+ plugins = sanitizePlugins(plugins);
70
+ const git = args.git ?? (await confirm(rl, "initialise a git repository?", d.git));
71
+ const install = args.install ?? (await confirm(rl, "install dependencies now?", d.install));
72
+ return { name, runtime, packageManager, template, plugins, git, install };
73
+ }
74
+ catch (err) {
75
+ // ctrl+c during a question rejects with an AbortError — treat as cancel.
76
+ if (err instanceof Error &&
77
+ (err.name === "AbortError" || err.code === "ABORT_ERR")) {
78
+ return undefined;
79
+ }
80
+ throw err;
81
+ }
82
+ finally {
83
+ rl.close();
84
+ }
85
+ }
86
+ async function confirm(rl, question, fallback) {
87
+ const def = fallback ? "Y/n" : "y/N";
88
+ const ans = (await rl.question(`\n${c.bold(question)} ${c.dim(`[${def}]: `)}`))
89
+ .trim()
90
+ .toLowerCase();
91
+ if (!ans)
92
+ return fallback;
93
+ return ans === "y" || ans === "yes";
94
+ }
95
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * project generation. `renderFiles` is pure — options in, a `path → contents`
3
+ * map out — so it is trivially testable. `writeProject` is the thin fs wrapper
4
+ * that flushes that map to disk.
5
+ *
6
+ * a template is more than a bot body: it can pull in plugins, add real imports,
7
+ * declare consts before the bot, extend the `.install()` chain and even replace
8
+ * the bootstrap (`bot.start()` → `serve()` / `run()`). everything it generates
9
+ * type-checks against the real `@yaebal/*` apis.
10
+ */
11
+ import { type PackageManager, type Runtime, type TemplateId } from "./catalog.js";
12
+ export interface ScaffoldOptions {
13
+ name: string;
14
+ runtime: Runtime;
15
+ plugins: string[];
16
+ packageManager?: PackageManager;
17
+ template?: TemplateId;
18
+ }
19
+ /** default package manager that matches a runtime when the user didn't pick one */
20
+ export declare function defaultPackageManager(runtime: Runtime): PackageManager;
21
+ /** turn options into a `relative path → file content` map. pure. */
22
+ export declare function renderFiles(opts: ScaffoldOptions): Record<string, string>;
23
+ /** the install command for a package manager (deno has none) */
24
+ export declare function installCommand(pm: PackageManager): string;
25
+ /** the `<pm> run <script>` invocation (npm/yarn/bun) or runtime command (deno) */
26
+ export declare function runCommand(pm: PackageManager, script: "dev" | "start"): string;
27
+ /** flush a rendered file map to `targetDir`, creating parent dirs as needed. */
28
+ export declare function writeProject(targetDir: string, files: Record<string, string>): Promise<void>;
29
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9F,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,EAAE,UAAU,CAAC;CACtB;AA4ID,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAItE;AAID,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA0IzE;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAazD;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAa9E;AAED,gFAAgF;AAChF,wBAAsB,YAAY,CACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC,CAMf"}