@nyalajs/cli 1.0.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 (37) hide show
  1. package/dist/bin/nyala.d.ts +3 -0
  2. package/dist/bin/nyala.d.ts.map +1 -0
  3. package/dist/bin/nyala.js +190 -0
  4. package/dist/bin/nyala.js.map +1 -0
  5. package/dist/commands/generate.command.d.ts +63 -0
  6. package/dist/commands/generate.command.d.ts.map +1 -0
  7. package/dist/commands/generate.command.js +554 -0
  8. package/dist/commands/generate.command.js.map +1 -0
  9. package/dist/commands/migrate.command.d.ts +15 -0
  10. package/dist/commands/migrate.command.d.ts.map +1 -0
  11. package/dist/commands/migrate.command.js +179 -0
  12. package/dist/commands/migrate.command.js.map +1 -0
  13. package/dist/commands/new.command.d.ts +19 -0
  14. package/dist/commands/new.command.d.ts.map +1 -0
  15. package/dist/commands/new.command.helpers.d.ts +6 -0
  16. package/dist/commands/new.command.helpers.d.ts.map +1 -0
  17. package/dist/commands/new.command.helpers.js +92 -0
  18. package/dist/commands/new.command.helpers.js.map +1 -0
  19. package/dist/commands/new.command.js +515 -0
  20. package/dist/commands/new.command.js.map +1 -0
  21. package/dist/commands/seed.command.d.ts +15 -0
  22. package/dist/commands/seed.command.d.ts.map +1 -0
  23. package/dist/commands/seed.command.js +144 -0
  24. package/dist/commands/seed.command.js.map +1 -0
  25. package/dist/commands/validate.command.d.ts +7 -0
  26. package/dist/commands/validate.command.d.ts.map +1 -0
  27. package/dist/commands/validate.command.js +127 -0
  28. package/dist/commands/validate.command.js.map +1 -0
  29. package/dist/utils/banner.d.ts +5 -0
  30. package/dist/utils/banner.d.ts.map +1 -0
  31. package/dist/utils/banner.js +174 -0
  32. package/dist/utils/banner.js.map +1 -0
  33. package/dist/utils/naming.d.ts +4 -0
  34. package/dist/utils/naming.d.ts.map +1 -0
  35. package/dist/utils/naming.js +33 -0
  36. package/dist/utils/naming.js.map +1 -0
  37. package/package.json +34 -0
@@ -0,0 +1,144 @@
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.SeedCommand = void 0;
40
+ const path = __importStar(require("path"));
41
+ const fs = __importStar(require("fs-extra"));
42
+ const ora_1 = __importDefault(require("ora"));
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ const dotenv = __importStar(require("dotenv"));
45
+ /**
46
+ * db:seed — Discovers all seeder files in database/seeders/, instantiates
47
+ * each one, connects to the database, and calls seeder.run(db).
48
+ *
49
+ * Usage:
50
+ * nyala db:seed → runs all seeders in alphabetical order
51
+ * nyala db:seed --class UserSeeder → runs only that seeder
52
+ */
53
+ class SeedCommand {
54
+ async handle(options = {}) {
55
+ dotenv.config({ path: path.join(process.cwd(), ".env") });
56
+ const seedersDir = path.join(process.cwd(), "database/seeders");
57
+ const spinner = (0, ora_1.default)("Running seeders...").start();
58
+ try {
59
+ if (!(await fs.pathExists(seedersDir))) {
60
+ spinner.info("No database/seeders directory found. Run `nyala generate seeder <Name>` first.");
61
+ return;
62
+ }
63
+ const connectionString = this.buildConnectionString();
64
+ if (!connectionString) {
65
+ spinner.fail("No database connection string found.\n" +
66
+ " Set DB_URL or (DB_HOST + DB_PORT + DB_NAME + DB_USER + DB_PASSWORD) in your .env file.");
67
+ return;
68
+ }
69
+ // Dynamically load pg + drizzle
70
+ let Pool, drizzle;
71
+ try {
72
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
73
+ ({ Pool } = require("pg"));
74
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
75
+ ({ drizzle } = require("drizzle-orm/node-postgres"));
76
+ }
77
+ catch {
78
+ spinner.fail("pg / drizzle-orm not installed. Run: npm install pg drizzle-orm");
79
+ return;
80
+ }
81
+ const pool = new Pool({ connectionString });
82
+ const db = drizzle(pool);
83
+ // Collect seeder files
84
+ let files = (await fs.readdir(seedersDir))
85
+ .filter((f) => f.endsWith(".ts") || f.endsWith(".js"))
86
+ .sort();
87
+ if (options.class) {
88
+ const target = options.class.toLowerCase();
89
+ files = files.filter((f) => f.toLowerCase().includes(target));
90
+ if (files.length === 0) {
91
+ spinner.fail(`No seeder matching '${options.class}' found in database/seeders/.`);
92
+ await pool.end();
93
+ return;
94
+ }
95
+ }
96
+ if (files.length === 0) {
97
+ spinner.info("No seeder files found in database/seeders/.");
98
+ await pool.end();
99
+ return;
100
+ }
101
+ spinner.text = `Running ${files.length} seeder(s)...`;
102
+ let ran = 0;
103
+ for (const file of files) {
104
+ const seederPath = path.join(seedersDir, file);
105
+ const mod = await Promise.resolve(`${seederPath}`).then(s => __importStar(require(s)));
106
+ // Support both default and named exports
107
+ const SeederClass = mod.default ?? Object.values(mod).find((v) => typeof v === "function");
108
+ if (!SeederClass) {
109
+ console.warn(chalk_1.default.yellow(` Skipping ${file} — no exported class found.`));
110
+ continue;
111
+ }
112
+ const seeder = new SeederClass();
113
+ if (typeof seeder.run !== "function") {
114
+ console.warn(chalk_1.default.yellow(` Skipping ${file} — no run() method.`));
115
+ continue;
116
+ }
117
+ await seeder.run(db);
118
+ console.log(chalk_1.default.green(" ✔ Seeded: ") + file);
119
+ ran++;
120
+ }
121
+ await pool.end();
122
+ spinner.succeed(chalk_1.default.green(`${ran} seeder(s) executed successfully.`));
123
+ }
124
+ catch (error) {
125
+ spinner.fail("Seeding failed: " + (error?.message ?? error));
126
+ process.exit(1);
127
+ }
128
+ }
129
+ buildConnectionString() {
130
+ if (process.env.DB_URL)
131
+ return process.env.DB_URL;
132
+ if (process.env.DATABASE_URL)
133
+ return process.env.DATABASE_URL;
134
+ const { DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD } = process.env;
135
+ if (DB_HOST && DB_NAME && DB_USER) {
136
+ const pass = DB_PASSWORD ? encodeURIComponent(DB_PASSWORD) : "";
137
+ const port = DB_PORT || "5432";
138
+ return `postgresql://${DB_USER}:${pass}@${DB_HOST}:${port}/${DB_NAME}`;
139
+ }
140
+ return null;
141
+ }
142
+ }
143
+ exports.SeedCommand = SeedCommand;
144
+ //# sourceMappingURL=seed.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.command.js","sourceRoot":"","sources":["../../src/commands/seed.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class ValidateCommand {
2
+ execute(): Promise<void>;
3
+ private checkCircularDependencies;
4
+ private checkForbiddenImports;
5
+ private getAllTsFiles;
6
+ }
7
+ //# sourceMappingURL=validate.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.command.d.ts","sourceRoot":"","sources":["../../src/commands/validate.command.ts"],"names":[],"mappings":"AAKA,qBAAa,eAAe;IAClB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAkChB,yBAAyB;YAMzB,qBAAqB;YAmCrB,aAAa;CAkB9B"}
@@ -0,0 +1,127 @@
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.ValidateCommand = void 0;
40
+ const fs = __importStar(require("fs-extra"));
41
+ const path = __importStar(require("path"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const ora_1 = __importDefault(require("ora"));
44
+ class ValidateCommand {
45
+ async execute() {
46
+ const spinner = (0, ora_1.default)("Validating application architecture").start();
47
+ try {
48
+ const violations = [];
49
+ // Check for circular dependencies
50
+ const circularDeps = await this.checkCircularDependencies();
51
+ if (circularDeps.length > 0) {
52
+ violations.push(...circularDeps);
53
+ }
54
+ // Check for forbidden imports
55
+ const forbiddenImports = await this.checkForbiddenImports();
56
+ if (forbiddenImports.length > 0) {
57
+ violations.push(...forbiddenImports);
58
+ }
59
+ if (violations.length === 0) {
60
+ spinner.succeed("Architecture validation passed");
61
+ console.log(chalk_1.default.green("\n✓ No architecture violations found"));
62
+ }
63
+ else {
64
+ spinner.fail("Architecture validation failed");
65
+ console.log(chalk_1.default.red(`\n✗ Found ${violations.length} violation(s):\n`));
66
+ violations.forEach((v) => console.log(chalk_1.default.yellow(` - ${v}`)));
67
+ process.exit(1);
68
+ }
69
+ }
70
+ catch (error) {
71
+ spinner.fail("Validation failed");
72
+ console.error(error);
73
+ process.exit(1);
74
+ }
75
+ }
76
+ async checkCircularDependencies() {
77
+ // Simplified circular dependency check
78
+ // In production, this would use a proper dependency graph analyzer
79
+ return [];
80
+ }
81
+ async checkForbiddenImports() {
82
+ const violations = [];
83
+ // app/, bootstrap/, config/, routes/, database/ per docs/requirements.md §3.1
84
+ const roots = ["app", "bootstrap", "config", "routes", "database"];
85
+ const files = [];
86
+ for (const root of roots) {
87
+ const rootPath = path.join(process.cwd(), root);
88
+ if (await fs.pathExists(rootPath)) {
89
+ files.push(...(await this.getAllTsFiles(rootPath)));
90
+ }
91
+ }
92
+ // Check for deep imports (e.g., importing from module internals)
93
+ // This is a simplified check
94
+ for (const file of files) {
95
+ const content = await fs.readFile(file, "utf-8");
96
+ const lines = content.split("\n");
97
+ lines.forEach((line, index) => {
98
+ // Check for imports from module internals
99
+ if (line.includes("import") && line.includes("../")) {
100
+ const depth = (line.match(/\.\.\//g) || []).length;
101
+ if (depth > 2) {
102
+ violations.push(`${file}:${index + 1} - Deep import detected (depth: ${depth})`);
103
+ }
104
+ }
105
+ });
106
+ }
107
+ return violations;
108
+ }
109
+ async getAllTsFiles(dir) {
110
+ const files = [];
111
+ const entries = await fs.readdir(dir, { withFileTypes: true });
112
+ for (const entry of entries) {
113
+ const fullPath = path.join(dir, entry.name);
114
+ if (entry.isDirectory()) {
115
+ if (entry.name !== "node_modules" && entry.name !== "dist") {
116
+ files.push(...(await this.getAllTsFiles(fullPath)));
117
+ }
118
+ }
119
+ else if (entry.name.endsWith(".ts")) {
120
+ files.push(fullPath);
121
+ }
122
+ }
123
+ return files;
124
+ }
125
+ }
126
+ exports.ValidateCommand = ValidateCommand;
127
+ //# sourceMappingURL=validate.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.command.js","sourceRoot":"","sources":["../../src/commands/validate.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Main banner — shown on every `nyala` invocation. */
2
+ export declare function printBanner(): void;
3
+ /** Welcome splash shown after `nyala new <name>`. */
4
+ export declare function printWelcomeBanner(appName: string): void;
5
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"AAsGA,uDAAuD;AACvD,wBAAgB,WAAW,IAAI,IAAI,CAgBlC;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAqExD"}
@@ -0,0 +1,174 @@
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.printBanner = printBanner;
7
+ exports.printWelcomeBanner = printWelcomeBanner;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ /**
10
+ * NyalaJS CLI banner.
11
+ * Renders "NyalaJS" in ANSI Shadow block font with a green→gold colour ramp.
12
+ * Style: clean, like Laravel's artisan splash.
13
+ */
14
+ // ── 6-row colour ramp (dark green → bright green, top → bottom) ──────────────
15
+ const ROW_COLORS = [
16
+ chalk_1.default.hex("#0E5C2F"),
17
+ chalk_1.default.hex("#1A7A3F"),
18
+ chalk_1.default.hex("#229950"),
19
+ chalk_1.default.hex("#2BB562"),
20
+ chalk_1.default.hex("#35CF76"),
21
+ chalk_1.default.bold.hex("#44E887"),
22
+ ];
23
+ const GOLD = chalk_1.default.hex("#D4A017");
24
+ const SILVER = chalk_1.default.hex("#9BA8A0");
25
+ const GREEN = chalk_1.default.hex("#2BB562");
26
+ const BRIGHT = chalk_1.default.bold.hex("#44E887");
27
+ const DIM = chalk_1.default.hex("#1A6B3A");
28
+ // ── ANSI Shadow font, 6 rows each ─────────────────────────────────────────────
29
+ const FONT = {
30
+ N: [
31
+ "███╗ ██╗",
32
+ "████╗ ██║",
33
+ "██╔██╗ ██║",
34
+ "██║╚██╗██║",
35
+ "██║ ╚████║",
36
+ "╚═╝ ╚═══╝",
37
+ ],
38
+ y: [
39
+ "██╗ ██╗",
40
+ "╚██╗ ██╔╝",
41
+ " ╚████╔╝ ",
42
+ " ╚██╔╝ ",
43
+ " ██║ ",
44
+ " ╚═╝ ",
45
+ ],
46
+ a: [
47
+ " █████╗ ",
48
+ "██╔══██╗",
49
+ "███████║",
50
+ "██╔══██║",
51
+ "██║ ██║",
52
+ "╚═╝ ╚═╝",
53
+ ],
54
+ l: [
55
+ "██╗ ",
56
+ "██║ ",
57
+ "██║ ",
58
+ "██║ ",
59
+ "███████╗",
60
+ "╚══════╝",
61
+ ],
62
+ J: [
63
+ " ██╗",
64
+ " ██║",
65
+ " ██║",
66
+ "██ ██║",
67
+ "╚█████╔╝",
68
+ " ╚════╝ ",
69
+ ],
70
+ S: [
71
+ "███████╗",
72
+ "██╔════╝",
73
+ "███████╗",
74
+ "╚════██║",
75
+ "███████║",
76
+ "╚══════╝",
77
+ ],
78
+ ".": [
79
+ " ",
80
+ " ",
81
+ " ",
82
+ " ",
83
+ "██╗",
84
+ "╚═╝",
85
+ ],
86
+ };
87
+ // Word to render — "Nyala.js"
88
+ const WORD = ["N", "y", "a", "l", "a", ".", "J", "S"];
89
+ const GAP = " ";
90
+ function buildWordmark() {
91
+ return Array.from({ length: 6 }, (_, r) => ROW_COLORS[r](WORD.map((ch, i) => (i ? GAP : "") + FONT[ch][r]).join("")));
92
+ }
93
+ function rule(n = 62) {
94
+ return GOLD(" " + "─".repeat(n));
95
+ }
96
+ // ── public API ────────────────────────────────────────────────────────────────
97
+ /** Main banner — shown on every `nyala` invocation. */
98
+ function printBanner() {
99
+ const rows = buildWordmark();
100
+ console.log();
101
+ rows.forEach((r) => console.log(" " + r));
102
+ console.log();
103
+ console.log(" " +
104
+ SILVER("Enterprise TypeScript Framework ") +
105
+ GOLD("·") +
106
+ SILVER(" batteries-included ") +
107
+ GOLD("·") +
108
+ SILVER(" SaaS-ready"));
109
+ console.log(rule());
110
+ console.log(" " + DIM("v0.1.0") + SILVER(" · ") + DIM("@nyalajs/cli"));
111
+ console.log();
112
+ }
113
+ /** Welcome splash shown after `nyala new <name>`. */
114
+ function printWelcomeBanner(appName) {
115
+ console.log();
116
+ console.log(rule());
117
+ console.log();
118
+ console.log(" " + BRIGHT("🎉 Congratulations! Your Nyala project is ready!"));
119
+ console.log();
120
+ console.log(" " + SILVER(" Project : ") + BRIGHT(appName));
121
+ console.log(" " + SILVER(" Location: ") + GREEN(`./${appName}`));
122
+ console.log();
123
+ console.log(rule());
124
+ console.log();
125
+ // Next steps
126
+ console.log(" " + GOLD("⚡ Quick Start"));
127
+ console.log();
128
+ const step = (n, cmd, note) => " " +
129
+ GOLD(n + " ") +
130
+ GREEN(cmd.padEnd(26)) +
131
+ SILVER(note);
132
+ console.log(step("①", `cd ${appName}`, "navigate to your project"));
133
+ console.log(step("②", "npm install", "install dependencies"));
134
+ console.log(step("③", "cp .env.example .env", "configure environment"));
135
+ console.log(step("④", "npm run dev", "start development server"));
136
+ console.log();
137
+ console.log(" " + SILVER("Your app will be running at ") + BRIGHT("http://localhost:3000"));
138
+ console.log();
139
+ // Generators
140
+ console.log(rule());
141
+ console.log();
142
+ console.log(" " + GOLD("📦 Code Generators"));
143
+ console.log();
144
+ console.log(" " + SILVER("Scaffold new components instantly:"));
145
+ console.log();
146
+ const gen = (type, arg, dest) => " " +
147
+ SILVER("$ nyala generate ") +
148
+ BRIGHT(type.padEnd(12)) +
149
+ GOLD(arg.padEnd(8)) +
150
+ SILVER("→ " + dest);
151
+ console.log(gen("controller", "User", "app/controllers/user.controller.ts"));
152
+ console.log(gen("service", "User", "app/services/user.service.ts"));
153
+ console.log(gen("middleware", "Auth", "app/middleware/auth.middleware.ts"));
154
+ console.log(gen("model", "User", "app/models/user.model.ts"));
155
+ console.log(gen("repository", "User", "app/repositories/user.repository.ts"));
156
+ console.log();
157
+ // Resources
158
+ console.log(rule());
159
+ console.log();
160
+ console.log(" " + GOLD("📚 Resources"));
161
+ console.log();
162
+ console.log(" " + SILVER("Documentation ") + BRIGHT("https://nyalajs.dev"));
163
+ console.log(" " + SILVER("GitHub ") + BRIGHT("https://github.com/nyalajs/nyala"));
164
+ console.log(" " + SILVER("Discord ") + BRIGHT("https://discord.gg/nyalajs"));
165
+ console.log(" " + SILVER("Examples ") + BRIGHT("https://github.com/nyalajs/examples"));
166
+ console.log();
167
+ // Footer
168
+ console.log(rule());
169
+ console.log();
170
+ console.log(" " + BRIGHT("✨ Welcome to the Nyala community!"));
171
+ console.log(" " + SILVER(" Build something amazing.") + GOLD(" 🚀"));
172
+ console.log();
173
+ }
174
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/utils/banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function toPascalCase(str: string): string;
2
+ export declare function toKebabCase(str: string): string;
3
+ export declare function toCamelCase(str: string): string;
4
+ //# sourceMappingURL=naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"AAcA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toPascalCase = toPascalCase;
4
+ exports.toKebabCase = toKebabCase;
5
+ exports.toCamelCase = toCamelCase;
6
+ /**
7
+ * Splits any of kebab-case, snake_case, space separated, camelCase, or
8
+ * PascalCase input into individual words. Needed because CLI generator
9
+ * names are commonly passed as PascalCase (e.g. "UserController",
10
+ * "CreateUserRequest" per docs/requirements.md §4.23) rather than kebab.
11
+ */
12
+ function splitWords(str) {
13
+ return str
14
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
15
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
16
+ .split(/[-_\s]+/)
17
+ .filter(Boolean);
18
+ }
19
+ function toPascalCase(str) {
20
+ return splitWords(str)
21
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
22
+ .join("");
23
+ }
24
+ function toKebabCase(str) {
25
+ return splitWords(str)
26
+ .map((word) => word.toLowerCase())
27
+ .join("-");
28
+ }
29
+ function toCamelCase(str) {
30
+ const pascal = toPascalCase(str);
31
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
32
+ }
33
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":";;AAcA,oCAIC;AAED,kCAIC;AAED,kCAGC;AA7BD;;;;;GAKG;AACH,SAAS,UAAU,CAAC,GAAW;IAC3B,OAAO,GAAG;SACL,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,SAAgB,YAAY,CAAC,GAAW;IACpC,OAAO,UAAU,CAAC,GAAG,CAAC;SACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACzE,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACnC,OAAO,UAAU,CAAC,GAAG,CAAC;SACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SACjC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW;IACnC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@nyalajs/cli",
3
+ "version": "1.0.0",
4
+ "bin": {
5
+ "nyala": "./dist/bin/nyala.js"
6
+ },
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch"
10
+ },
11
+ "dependencies": {
12
+ "@nyalajs/core": "*",
13
+ "@clack/prompts": "^0.7.0",
14
+ "commander": "^11.1.0",
15
+ "inquirer": "^9.2.12",
16
+ "chalk": "^4.1.2",
17
+ "ora": "^5.4.1",
18
+ "fs-extra": "^11.2.0",
19
+ "dotenv": "^16.4.1"
20
+ },
21
+ "devDependencies": {
22
+ "typescript": "^5.3.3",
23
+ "@types/node": "^20.10.6",
24
+ "@types/inquirer": "^9.0.7",
25
+ "@types/fs-extra": "^11.0.4"
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "README.md"
30
+ ],
31
+ "publishConfig": {
32
+ "access": "public"
33
+ }
34
+ }