create-yaebal 0.0.0-test → 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.
Files changed (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +100 -0
  3. package/bin/cli.mjs +3 -0
  4. package/lib/args.d.ts +27 -0
  5. package/lib/args.d.ts.map +1 -0
  6. package/lib/args.js +122 -0
  7. package/lib/args.js.map +1 -0
  8. package/lib/args.test.d.ts +2 -0
  9. package/lib/args.test.d.ts.map +1 -0
  10. package/lib/args.test.js +38 -0
  11. package/lib/args.test.js.map +1 -0
  12. package/lib/catalog.d.ts +56 -0
  13. package/lib/catalog.d.ts.map +1 -0
  14. package/lib/catalog.js +241 -0
  15. package/lib/catalog.js.map +1 -0
  16. package/lib/config.d.ts +21 -0
  17. package/lib/config.d.ts.map +1 -0
  18. package/lib/config.js +35 -0
  19. package/lib/config.js.map +1 -0
  20. package/lib/index.d.ts +15 -0
  21. package/lib/index.d.ts.map +1 -0
  22. package/lib/index.js +125 -0
  23. package/lib/index.js.map +1 -0
  24. package/lib/prompts.d.ts +10 -0
  25. package/lib/prompts.d.ts.map +1 -0
  26. package/lib/prompts.js +95 -0
  27. package/lib/prompts.js.map +1 -0
  28. package/lib/scaffold.d.ts +29 -0
  29. package/lib/scaffold.d.ts.map +1 -0
  30. package/lib/scaffold.js +296 -0
  31. package/lib/scaffold.js.map +1 -0
  32. package/lib/scaffold.test.d.ts +2 -0
  33. package/lib/scaffold.test.d.ts.map +1 -0
  34. package/lib/scaffold.test.js +96 -0
  35. package/lib/scaffold.test.js.map +1 -0
  36. package/lib/tui/ansi.d.ts +39 -0
  37. package/lib/tui/ansi.d.ts.map +1 -0
  38. package/lib/tui/ansi.js +84 -0
  39. package/lib/tui/ansi.js.map +1 -0
  40. package/lib/tui/app.d.ts +20 -0
  41. package/lib/tui/app.d.ts.map +1 -0
  42. package/lib/tui/app.js +381 -0
  43. package/lib/tui/app.js.map +1 -0
  44. package/lib/tui/app.test.d.ts +2 -0
  45. package/lib/tui/app.test.d.ts.map +1 -0
  46. package/lib/tui/app.test.js +87 -0
  47. package/lib/tui/app.test.js.map +1 -0
  48. package/lib/tui/theme.d.ts +23 -0
  49. package/lib/tui/theme.d.ts.map +1 -0
  50. package/lib/tui/theme.js +23 -0
  51. package/lib/tui/theme.js.map +1 -0
  52. package/lib/util.d.ts +27 -0
  53. package/lib/util.d.ts.map +1 -0
  54. package/lib/util.js +95 -0
  55. package/lib/util.js.map +1 -0
  56. package/package.json +38 -7
package/lib/util.js ADDED
@@ -0,0 +1,95 @@
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 { spawn } from "node:child_process";
7
+ import process from "node:process";
8
+ /** detect which runtime is executing the scaffolder right now. */
9
+ export function detectRuntime() {
10
+ const g = globalThis;
11
+ if (typeof g.Bun !== "undefined")
12
+ return "bun";
13
+ if (typeof g.Deno !== "undefined")
14
+ return "deno";
15
+ return "node";
16
+ }
17
+ /** detect the package manager from `npm_config_user_agent` (set by every pm). */
18
+ export function detectPackageManager() {
19
+ const ua = process.env.npm_config_user_agent ?? "";
20
+ if (ua.startsWith("pnpm"))
21
+ return "pnpm";
22
+ if (ua.startsWith("yarn"))
23
+ return "yarn";
24
+ if (ua.startsWith("bun"))
25
+ return "bun";
26
+ if (ua.startsWith("npm"))
27
+ return "npm";
28
+ if (typeof globalThis.Bun !== "undefined")
29
+ return "bun";
30
+ if (typeof globalThis.Deno !== "undefined")
31
+ return "deno";
32
+ return undefined;
33
+ }
34
+ /** true when both stdin and stdout are real ttys (prompts/tui make sense). */
35
+ export function isInteractive() {
36
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY);
37
+ }
38
+ /**
39
+ * whether the rich ansi front-end can run. it needs an interactive tty, a
40
+ * terminal that isn't a dumb one, and the user not opting out via env. callers
41
+ * still fall back gracefully to the plain prompts otherwise.
42
+ */
43
+ export function supportsTui() {
44
+ if (!isInteractive())
45
+ return false;
46
+ if (process.env.CI)
47
+ return false;
48
+ if (process.env.TERM === "dumb")
49
+ return false;
50
+ if (process.env.NO_TUI || process.env.YAEBAL_NO_TUI)
51
+ return false;
52
+ return true;
53
+ }
54
+ /** npm package-name rules, scoped down to what a folder can be called. */
55
+ export function validateProjectName(raw) {
56
+ const name = raw.trim();
57
+ if (!name)
58
+ return "project name is required";
59
+ if (name === "." || name === "..")
60
+ return "pick a real directory name";
61
+ if (name.length > 214)
62
+ return "name is too long (max 214 chars)";
63
+ if (!/^[a-z0-9._-]+$/.test(name))
64
+ return "use lowercase letters, digits, '.', '_' or '-' only";
65
+ if (/^[._]/.test(name))
66
+ return "name can't start with '.' or '_'";
67
+ return undefined;
68
+ }
69
+ /** spawn a command, inheriting stdio, resolving to its exit code. */
70
+ export function exec(cmd, args, cwd) {
71
+ return new Promise((resolve) => {
72
+ const child = spawn(cmd, args, { cwd, stdio: "inherit", shell: process.platform === "win32" });
73
+ child.on("error", () => resolve(1));
74
+ child.on("close", (code) => resolve(code ?? 0));
75
+ });
76
+ }
77
+ /** `git init` + an initial commit; best-effort, never throws. */
78
+ export async function gitInit(cwd) {
79
+ const init = await exec("git", ["init", "-q"], cwd);
80
+ if (init !== 0)
81
+ return false;
82
+ await exec("git", ["add", "-A"], cwd);
83
+ await exec("git", ["commit", "-q", "-m", "init: scaffold with create-yaebal"], cwd);
84
+ return true;
85
+ }
86
+ /** run the package manager's install in `cwd`. deno is a no-op (no lockfile). */
87
+ export async function installDeps(pm, cwd) {
88
+ if (pm === "deno") {
89
+ const code = await exec("deno", ["cache", "src/index.ts"], cwd);
90
+ return code === 0;
91
+ }
92
+ const code = await exec(pm, ["install"], cwd);
93
+ return code === 0;
94
+ }
95
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,43 @@
1
1
  {
2
2
  "name": "create-yaebal",
3
- "version": "0.0.0-test",
4
- "description": "",
5
- "main": "index.js",
6
- "keywords": [],
7
- "author": "",
8
- "license": "ISC",
3
+ "version": "0.1.0",
4
+ "description": "scaffold a new yaebal telegram bot.",
5
+ "type": "module",
6
+ "bin": {
7
+ "create-yaebal": "./bin/cli.mjs"
8
+ },
9
+ "main": "./lib/index.js",
10
+ "types": "./lib/index.d.ts",
11
+ "files": [
12
+ "lib",
13
+ "bin"
14
+ ],
15
+ "devDependencies": {
16
+ "@types/node": "latest"
17
+ },
18
+ "engines": {
19
+ "node": ">=20"
20
+ },
21
+ "keywords": [
22
+ "telegram",
23
+ "telegram-bot",
24
+ "yaebal",
25
+ "create",
26
+ "scaffold",
27
+ "cli"
28
+ ],
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/neverlane/yaebal",
33
+ "directory": "packages/create-yaebal"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
9
38
  "scripts": {
10
- "test": "echo \"Error: no test specified\" && exit 1"
39
+ "build": "tsc -p tsconfig.json",
40
+ "typecheck": "tsc -p tsconfig.json --noEmit",
41
+ "test": "node --test lib"
11
42
  }
12
43
  }