katax-cli 0.1.1 → 1.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 (137) hide show
  1. package/README.md +0 -0
  2. package/dist/commands/add-endpoint.d.ts +1 -0
  3. package/dist/commands/add-endpoint.d.ts.map +1 -0
  4. package/dist/commands/add-endpoint.js +18 -39
  5. package/dist/commands/add-endpoint.js.map +1 -0
  6. package/dist/commands/deploy.d.ts +14 -0
  7. package/dist/commands/deploy.d.ts.map +1 -0
  8. package/dist/commands/deploy.js +416 -0
  9. package/dist/commands/deploy.js.map +1 -0
  10. package/dist/commands/generate-crud.d.ts +1 -0
  11. package/dist/commands/generate-crud.d.ts.map +1 -0
  12. package/dist/commands/generate-crud.js +1 -8
  13. package/dist/commands/generate-crud.js.map +1 -0
  14. package/dist/commands/generate-crud.refactored.d.ts +6 -0
  15. package/dist/commands/generate-crud.refactored.d.ts.map +1 -0
  16. package/dist/commands/generate-crud.refactored.js +139 -0
  17. package/dist/commands/generate-crud.refactored.js.map +1 -0
  18. package/dist/commands/info.d.ts +1 -0
  19. package/dist/commands/info.d.ts.map +1 -0
  20. package/dist/commands/info.js +1 -5
  21. package/dist/commands/info.js.map +1 -0
  22. package/dist/commands/init.d.ts +1 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +70 -76
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/init.refactored.d.ts +6 -0
  27. package/dist/commands/init.refactored.d.ts.map +1 -0
  28. package/dist/commands/init.refactored.js +224 -0
  29. package/dist/commands/init.refactored.js.map +1 -0
  30. package/dist/core/errors.d.ts +77 -0
  31. package/dist/core/errors.d.ts.map +1 -0
  32. package/dist/core/errors.js +130 -0
  33. package/dist/core/errors.js.map +1 -0
  34. package/dist/core/index.d.ts +3 -0
  35. package/dist/core/index.d.ts.map +1 -0
  36. package/dist/core/index.js +3 -0
  37. package/dist/core/index.js.map +1 -0
  38. package/dist/core/result.d.ts +26 -0
  39. package/dist/core/result.d.ts.map +1 -0
  40. package/dist/core/result.js +76 -0
  41. package/dist/core/result.js.map +1 -0
  42. package/dist/generators/controller-generator.d.ts +1 -0
  43. package/dist/generators/controller-generator.d.ts.map +1 -0
  44. package/dist/generators/controller-generator.js +1 -2
  45. package/dist/generators/controller-generator.js.map +1 -0
  46. package/dist/generators/handler-generator.d.ts +1 -0
  47. package/dist/generators/handler-generator.d.ts.map +1 -0
  48. package/dist/generators/handler-generator.js +35 -22
  49. package/dist/generators/handler-generator.js.map +1 -0
  50. package/dist/generators/route-generator.d.ts +1 -0
  51. package/dist/generators/route-generator.d.ts.map +1 -0
  52. package/dist/generators/route-generator.js +1 -2
  53. package/dist/generators/route-generator.js.map +1 -0
  54. package/dist/generators/router-updater.d.ts +1 -0
  55. package/dist/generators/router-updater.d.ts.map +1 -0
  56. package/dist/generators/router-updater.js +1 -6
  57. package/dist/generators/router-updater.js.map +1 -0
  58. package/dist/generators/validator-generator.d.ts +1 -0
  59. package/dist/generators/validator-generator.d.ts.map +1 -0
  60. package/dist/generators/validator-generator.improved.d.ts +3 -0
  61. package/dist/generators/validator-generator.improved.d.ts.map +1 -0
  62. package/dist/generators/validator-generator.improved.js +184 -0
  63. package/dist/generators/validator-generator.improved.js.map +1 -0
  64. package/dist/generators/validator-generator.js +1 -10
  65. package/dist/generators/validator-generator.js.map +1 -0
  66. package/dist/index.d.ts +1 -6
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +37 -19
  69. package/dist/index.js.map +1 -0
  70. package/dist/services/ast-router-updater.d.ts +16 -0
  71. package/dist/services/ast-router-updater.d.ts.map +1 -0
  72. package/dist/services/ast-router-updater.js +130 -0
  73. package/dist/services/ast-router-updater.js.map +1 -0
  74. package/dist/services/code-generation.service.d.ts +15 -0
  75. package/dist/services/code-generation.service.d.ts.map +1 -0
  76. package/dist/services/code-generation.service.js +110 -0
  77. package/dist/services/code-generation.service.js.map +1 -0
  78. package/dist/services/index.d.ts +4 -0
  79. package/dist/services/index.d.ts.map +1 -0
  80. package/dist/services/index.js +4 -0
  81. package/dist/services/index.js.map +1 -0
  82. package/dist/services/project-structure-generator.d.ts +30 -0
  83. package/dist/services/project-structure-generator.d.ts.map +1 -0
  84. package/dist/services/project-structure-generator.js +884 -0
  85. package/dist/services/project-structure-generator.js.map +1 -0
  86. package/dist/templates/base/code-builder.d.ts +34 -0
  87. package/dist/templates/base/code-builder.d.ts.map +1 -0
  88. package/dist/templates/base/code-builder.js +154 -0
  89. package/dist/templates/base/code-builder.js.map +1 -0
  90. package/dist/templates/base/template-engine.d.ts +28 -0
  91. package/dist/templates/base/template-engine.d.ts.map +1 -0
  92. package/dist/templates/base/template-engine.js +47 -0
  93. package/dist/templates/base/template-engine.js.map +1 -0
  94. package/dist/templates/generators/controller-template.d.ts +15 -0
  95. package/dist/templates/generators/controller-template.d.ts.map +1 -0
  96. package/dist/templates/generators/controller-template.js +185 -0
  97. package/dist/templates/generators/controller-template.js.map +1 -0
  98. package/dist/templates/generators/di-container.d.ts +6 -0
  99. package/dist/templates/generators/di-container.d.ts.map +1 -0
  100. package/dist/templates/generators/di-container.js +121 -0
  101. package/dist/templates/generators/di-container.js.map +1 -0
  102. package/dist/templates/generators/handler-template.d.ts +15 -0
  103. package/dist/templates/generators/handler-template.d.ts.map +1 -0
  104. package/dist/templates/generators/handler-template.js +208 -0
  105. package/dist/templates/generators/handler-template.js.map +1 -0
  106. package/dist/templates/generators/repository-template.d.ts +23 -0
  107. package/dist/templates/generators/repository-template.d.ts.map +1 -0
  108. package/dist/templates/generators/repository-template.js +237 -0
  109. package/dist/templates/generators/repository-template.js.map +1 -0
  110. package/dist/templates/generators/response-utils-template.d.ts +2 -0
  111. package/dist/templates/generators/response-utils-template.d.ts.map +1 -0
  112. package/dist/templates/generators/response-utils-template.js +112 -0
  113. package/dist/templates/generators/response-utils-template.js.map +1 -0
  114. package/dist/templates/generators/test-generator.d.ts +11 -0
  115. package/dist/templates/generators/test-generator.d.ts.map +1 -0
  116. package/dist/templates/generators/test-generator.js +206 -0
  117. package/dist/templates/generators/test-generator.js.map +1 -0
  118. package/dist/templates/index.d.ts +8 -0
  119. package/dist/templates/index.d.ts.map +1 -0
  120. package/dist/templates/index.js +8 -0
  121. package/dist/templates/index.js.map +1 -0
  122. package/dist/types/index.d.ts +1 -0
  123. package/dist/types/index.d.ts.map +1 -0
  124. package/dist/types/index.js +1 -0
  125. package/dist/types/index.js.map +1 -0
  126. package/dist/utils/file-utils.d.ts +1 -30
  127. package/dist/utils/file-utils.d.ts.map +1 -0
  128. package/dist/utils/file-utils.js +1 -32
  129. package/dist/utils/file-utils.js.map +1 -0
  130. package/dist/utils/logger.d.ts +1 -0
  131. package/dist/utils/logger.d.ts.map +1 -0
  132. package/dist/utils/logger.js +1 -0
  133. package/dist/utils/logger.js.map +1 -0
  134. package/package.json +1 -1
  135. package/dist/database/mongodb.ts +0 -46
  136. package/dist/database/mysql.ts +0 -26
  137. package/dist/database/postgresql.ts +0 -52
package/README.md CHANGED
Binary file
@@ -4,3 +4,4 @@ interface AddEndpointOptions {
4
4
  }
5
5
  export declare function addEndpointCommand(name: string, options?: AddEndpointOptions): Promise<void>;
6
6
  export {};
7
+ //# sourceMappingURL=add-endpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-endpoint.d.ts","sourceRoot":"","sources":["../../src/commands/add-endpoint.ts"],"names":[],"mappings":"AAoBA,UAAU,kBAAkB;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,iBA2OtF"}
@@ -2,21 +2,15 @@ import inquirer from 'inquirer';
2
2
  import ora from 'ora';
3
3
  import path from 'path';
4
4
  import { success, error, warning, gray, title, info } from '../utils/logger.js';
5
- import { fileExists, writeFile } from '../utils/file-utils.js';
6
- import { generateValidator } from '../generators/validator-generator.js';
7
- import { generateController } from '../generators/controller-generator.js';
8
- import { generateHandler } from '../generators/handler-generator.js';
9
- import { generateRoute } from '../generators/route-generator.js';
10
- import { updateMainRouter } from '../generators/router-updater.js';
5
+ import { fileExists } from '../utils/file-utils.js';
6
+ import { codeGenerationService } from '../services/code-generation.service.js';
11
7
  export async function addEndpointCommand(name, options = {}) {
12
8
  title(`🎯 Add Endpoint: ${name}`);
13
- // Check if we're in a Katax project
14
9
  if (!fileExists(path.join(process.cwd(), 'package.json'))) {
15
10
  error('Not in a project directory!');
16
11
  gray('Run this command from your project root\n');
17
12
  process.exit(1);
18
13
  }
19
- // Check if katax-core is installed
20
14
  const packageJsonPath = path.join(process.cwd(), 'package.json');
21
15
  const packageJson = JSON.parse(await import('fs').then(fs => fs.promises.readFile(packageJsonPath, 'utf-8')));
22
16
  const hasKataxCore = packageJson.dependencies?.['katax-core'];
@@ -34,13 +28,11 @@ export async function addEndpointCommand(name, options = {}) {
34
28
  error('Cannot create endpoint without validation library');
35
29
  process.exit(1);
36
30
  }
37
- // Install katax-core
38
31
  const spinner = ora('Installing katax-core...').start();
39
32
  const { execa } = await import('execa');
40
33
  await execa('npm', ['install', 'katax-core'], { cwd: process.cwd() });
41
34
  spinner.succeed('katax-core installed');
42
35
  }
43
- // Interactive prompts
44
36
  const answers = await inquirer.prompt([
45
37
  {
46
38
  type: 'list',
@@ -79,7 +71,6 @@ export async function addEndpointCommand(name, options = {}) {
79
71
  addAsyncValidators: false,
80
72
  dbOperations: []
81
73
  };
82
- // If validation is enabled, collect fields
83
74
  if (config.addValidation && config.method !== 'GET' && config.method !== 'DELETE') {
84
75
  info('\nDefine request body fields:');
85
76
  let addingFields = true;
@@ -121,7 +112,6 @@ export async function addEndpointCommand(name, options = {}) {
121
112
  required: fieldConfig.required,
122
113
  rules: []
123
114
  };
124
- // Add type-specific rules
125
115
  if (fieldConfig.type === 'string' || fieldConfig.type === 'email') {
126
116
  const stringRules = await inquirer.prompt([
127
117
  {
@@ -181,34 +171,22 @@ export async function addEndpointCommand(name, options = {}) {
181
171
  config.addAsyncValidators = addAsync;
182
172
  }
183
173
  }
184
- // Generate files
185
174
  const spinner = ora('Generating endpoint files...').start();
186
175
  try {
187
- const basePath = path.join(process.cwd(), 'src', 'api', name.toLowerCase());
188
- // Generate validator
189
- if (config.addValidation) {
190
- const validatorPath = path.join(basePath, `${name.toLowerCase()}.validator.ts`);
191
- const validatorContent = generateValidator(config);
192
- await writeFile(validatorPath, validatorContent);
193
- spinner.text = `Generated ${name.toLowerCase()}.validator.ts`;
176
+ const packageJsonPath = path.join(process.cwd(), 'package.json');
177
+ let database;
178
+ try {
179
+ const packageJson = JSON.parse(await import('fs').then(fs => fs.promises.readFile(packageJsonPath, 'utf-8')));
180
+ if (packageJson.dependencies?.pg)
181
+ database = 'postgresql';
182
+ else if (packageJson.dependencies?.mysql2)
183
+ database = 'mysql';
184
+ else if (packageJson.dependencies?.mongodb)
185
+ database = 'mongodb';
194
186
  }
195
- // Generate controller
196
- const controllerPath = path.join(basePath, `${name.toLowerCase()}.controller.ts`);
197
- const controllerContent = generateController(config);
198
- await writeFile(controllerPath, controllerContent);
199
- spinner.text = `Generated ${name.toLowerCase()}.controller.ts`;
200
- // Generate handler
201
- const handlerPath = path.join(basePath, `${name.toLowerCase()}.handler.ts`);
202
- const handlerContent = generateHandler(config);
203
- await writeFile(handlerPath, handlerContent);
204
- spinner.text = `Generated ${name.toLowerCase()}.handler.ts`;
205
- // Generate route
206
- const routePath = path.join(basePath, `${name.toLowerCase()}.routes.ts`);
207
- const routeContent = generateRoute(config);
208
- await writeFile(routePath, routeContent);
209
- spinner.text = `Generated ${name.toLowerCase()}.routes.ts`;
210
- // Update main router
211
- await updateMainRouter(name, config);
187
+ catch (err) {
188
+ }
189
+ const files = await codeGenerationService.generateEndpoint(config, process.cwd(), database);
212
190
  spinner.succeed('Endpoint files generated');
213
191
  success(`\n✨ Endpoint "${name}" created successfully!\n`);
214
192
  info('Generated files:');
@@ -222,8 +200,9 @@ export async function addEndpointCommand(name, options = {}) {
222
200
  gray(` ${config.method} ${config.path}\n`);
223
201
  }
224
202
  catch (err) {
225
- spinner.fail('Failed to generate endpoint');
226
- error(err instanceof Error ? err.message : 'Unknown error');
203
+ error('Failed to add endpoint');
204
+ console.error(err);
227
205
  process.exit(1);
228
206
  }
229
207
  }
208
+ //# sourceMappingURL=add-endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-endpoint.js","sourceRoot":"","sources":["../../src/commands/add-endpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare function deployInitCommand(): Promise<void>;
2
+ export declare function deployUpdateCommand(options: {
3
+ branch?: string;
4
+ hard?: boolean;
5
+ }): Promise<void>;
6
+ export declare function deployRollbackCommand(options: {
7
+ commits?: number;
8
+ }): Promise<void>;
9
+ export declare function deployLogsCommand(options: {
10
+ lines?: number;
11
+ follow?: boolean;
12
+ }): Promise<void>;
13
+ export declare function deployStatusCommand(): Promise<void>;
14
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAuBA,wBAAsB,iBAAiB,kBAgHtC;AAKD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,iBAqDrF;AAKD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,iBA8BxE;AAKD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,iBAoBpF;AAKD,wBAAsB,mBAAmB,kBASxC"}
@@ -0,0 +1,416 @@
1
+ import chalk from 'chalk';
2
+ import inquirer from 'inquirer';
3
+ import ora from 'ora';
4
+ import path from 'path';
5
+ import { execa } from 'execa';
6
+ import { success, error, warning, title, info, gray } from '../utils/logger.js';
7
+ import { directoryExists, writeFile } from '../utils/file-utils.js';
8
+ export async function deployInitCommand() {
9
+ title('🚀 Katax Deploy - Initial Setup');
10
+ const pm2Installed = await checkPM2Installation();
11
+ if (!pm2Installed) {
12
+ error('PM2 is not installed globally!');
13
+ info('Install with: npm install -g pm2');
14
+ process.exit(1);
15
+ }
16
+ const answers = await inquirer.prompt([
17
+ {
18
+ type: 'input',
19
+ name: 'appName',
20
+ message: 'Application name for PM2:',
21
+ default: 'my-api',
22
+ validate: (input) => {
23
+ if (!/^[a-z0-9-_]+$/i.test(input)) {
24
+ return 'App name can only contain letters, numbers, hyphens, and underscores';
25
+ }
26
+ return true;
27
+ }
28
+ },
29
+ {
30
+ type: 'list',
31
+ name: 'repoType',
32
+ message: 'Repository connection type:',
33
+ choices: [
34
+ { name: 'HTTPS (username/password or token)', value: 'https' },
35
+ { name: 'SSH (requires SSH key setup)', value: 'ssh' }
36
+ ],
37
+ default: 'https'
38
+ },
39
+ {
40
+ type: 'input',
41
+ name: 'repoUrl',
42
+ message: 'Git repository URL:',
43
+ validate: (input) => {
44
+ if (!input)
45
+ return 'Repository URL is required';
46
+ if (!input.includes('git') && !input.includes('.git')) {
47
+ return 'Please provide a valid Git repository URL';
48
+ }
49
+ return true;
50
+ }
51
+ },
52
+ {
53
+ type: 'input',
54
+ name: 'branch',
55
+ message: 'Branch to deploy:',
56
+ default: 'main'
57
+ },
58
+ {
59
+ type: 'input',
60
+ name: 'installPath',
61
+ message: 'Installation path (absolute):',
62
+ default: `/home/${process.env.USER || 'ubuntu'}/apps`,
63
+ validate: (input) => {
64
+ if (!path.isAbsolute(input)) {
65
+ return 'Please provide an absolute path';
66
+ }
67
+ return true;
68
+ }
69
+ },
70
+ {
71
+ type: 'list',
72
+ name: 'instances',
73
+ message: 'PM2 instances (cluster mode):',
74
+ choices: [
75
+ { name: 'Max (use all CPU cores)', value: 'max' },
76
+ { name: '1 instance', value: 1 },
77
+ { name: '2 instances', value: 2 },
78
+ { name: '4 instances', value: 4 }
79
+ ],
80
+ default: 'max'
81
+ },
82
+ {
83
+ type: 'input',
84
+ name: 'maxMemory',
85
+ message: 'Max memory per instance (e.g., 512M, 1G):',
86
+ default: '512M'
87
+ },
88
+ {
89
+ type: 'confirm',
90
+ name: 'addEnvVars',
91
+ message: 'Add environment variables?',
92
+ default: true
93
+ }
94
+ ]);
95
+ let envVars = {};
96
+ if (answers.addEnvVars) {
97
+ envVars = await collectEnvVars();
98
+ }
99
+ const deployConfig = {
100
+ appName: answers.appName,
101
+ repoUrl: answers.repoUrl,
102
+ branch: answers.branch,
103
+ installPath: answers.installPath,
104
+ pm2Config: {
105
+ instances: answers.instances,
106
+ maxMemory: answers.maxMemory,
107
+ env: envVars
108
+ }
109
+ };
110
+ await executeInitialDeploy(deployConfig);
111
+ }
112
+ export async function deployUpdateCommand(options) {
113
+ title('🔄 Katax Deploy - Update Application');
114
+ const isGitRepo = await checkGitRepository();
115
+ if (!isGitRepo) {
116
+ error('Not a git repository! Run this command from your project directory.');
117
+ info('Or use: katax deploy init');
118
+ process.exit(1);
119
+ }
120
+ const pm2Installed = await checkPM2Installation();
121
+ if (!pm2Installed) {
122
+ error('PM2 is not installed globally!');
123
+ info('Install with: npm install -g pm2');
124
+ process.exit(1);
125
+ }
126
+ const currentDir = process.cwd();
127
+ const appName = path.basename(currentDir);
128
+ let targetBranch = options.branch;
129
+ if (!targetBranch) {
130
+ const branchResult = await execa('git', ['branch', '--show-current']);
131
+ targetBranch = branchResult.stdout.trim();
132
+ }
133
+ info(`📦 Application: ${chalk.cyan(appName)}`);
134
+ info(`🌿 Branch: ${chalk.cyan(targetBranch)}`);
135
+ if (options.hard) {
136
+ warning('⚠️ Hard reset enabled - all local changes will be lost!');
137
+ }
138
+ const { confirm } = await inquirer.prompt([
139
+ {
140
+ type: 'confirm',
141
+ name: 'confirm',
142
+ message: 'Proceed with update?',
143
+ default: true
144
+ }
145
+ ]);
146
+ if (!confirm) {
147
+ warning('Update cancelled');
148
+ return;
149
+ }
150
+ await executeUpdate(appName, targetBranch, options.hard || false);
151
+ }
152
+ export async function deployRollbackCommand(options) {
153
+ title('⏮️ Katax Deploy - Rollback');
154
+ const isGitRepo = await checkGitRepository();
155
+ if (!isGitRepo) {
156
+ error('Not a git repository!');
157
+ process.exit(1);
158
+ }
159
+ const commits = options.commits || 1;
160
+ const currentDir = process.cwd();
161
+ const appName = path.basename(currentDir);
162
+ warning(`Rolling back ${commits} commit(s) for ${appName}`);
163
+ const { confirm } = await inquirer.prompt([
164
+ {
165
+ type: 'confirm',
166
+ name: 'confirm',
167
+ message: 'This will reset your code. Continue?',
168
+ default: false
169
+ }
170
+ ]);
171
+ if (!confirm) {
172
+ warning('Rollback cancelled');
173
+ return;
174
+ }
175
+ await executeRollback(appName, commits);
176
+ }
177
+ export async function deployLogsCommand(options) {
178
+ const currentDir = process.cwd();
179
+ const appName = path.basename(currentDir);
180
+ title(`📋 PM2 Logs - ${appName}`);
181
+ const args = ['logs', appName];
182
+ if (options.lines) {
183
+ args.push('--lines', options.lines.toString());
184
+ }
185
+ if (!options.follow) {
186
+ args.push('--nostream');
187
+ }
188
+ try {
189
+ await execa('pm2', args, { stdio: 'inherit' });
190
+ }
191
+ catch (err) {
192
+ error('Failed to fetch logs');
193
+ console.error(err);
194
+ }
195
+ }
196
+ export async function deployStatusCommand() {
197
+ title('📊 PM2 Status');
198
+ try {
199
+ await execa('pm2', ['list'], { stdio: 'inherit' });
200
+ }
201
+ catch (err) {
202
+ error('Failed to get PM2 status');
203
+ console.error(err);
204
+ }
205
+ }
206
+ async function checkPM2Installation() {
207
+ try {
208
+ await execa('pm2', ['--version']);
209
+ return true;
210
+ }
211
+ catch {
212
+ return false;
213
+ }
214
+ }
215
+ async function checkGitRepository() {
216
+ try {
217
+ await execa('git', ['rev-parse', '--git-dir']);
218
+ return true;
219
+ }
220
+ catch {
221
+ return false;
222
+ }
223
+ }
224
+ async function collectEnvVars() {
225
+ const envVars = {};
226
+ info('\n📝 Add environment variables (leave empty to finish):\n');
227
+ while (true) {
228
+ const { key } = await inquirer.prompt([
229
+ {
230
+ type: 'input',
231
+ name: 'key',
232
+ message: 'Variable name:',
233
+ }
234
+ ]);
235
+ if (!key)
236
+ break;
237
+ const { value } = await inquirer.prompt([
238
+ {
239
+ type: 'input',
240
+ name: 'value',
241
+ message: `Value for ${key}:`,
242
+ }
243
+ ]);
244
+ envVars[key] = value;
245
+ success(`✓ ${key} added`);
246
+ }
247
+ return envVars;
248
+ }
249
+ async function executeInitialDeploy(config) {
250
+ const fullPath = path.join(config.installPath, config.appName);
251
+ if (directoryExists(fullPath)) {
252
+ error(`Directory ${fullPath} already exists!`);
253
+ process.exit(1);
254
+ }
255
+ const cloneSpinner = ora('Cloning repository...').start();
256
+ try {
257
+ await execa('git', ['clone', '--branch', config.branch, config.repoUrl, fullPath]);
258
+ cloneSpinner.succeed('Repository cloned');
259
+ }
260
+ catch (err) {
261
+ cloneSpinner.fail('Failed to clone repository');
262
+ console.error(err);
263
+ process.exit(1);
264
+ }
265
+ const installSpinner = ora('Installing dependencies...').start();
266
+ try {
267
+ await execa('npm', ['install'], { cwd: fullPath });
268
+ installSpinner.succeed('Dependencies installed');
269
+ }
270
+ catch (err) {
271
+ installSpinner.fail('Failed to install dependencies');
272
+ console.error(err);
273
+ process.exit(1);
274
+ }
275
+ const buildSpinner = ora('Building project...').start();
276
+ try {
277
+ await execa('npm', ['run', 'build'], { cwd: fullPath });
278
+ buildSpinner.succeed('Project built');
279
+ }
280
+ catch (err) {
281
+ buildSpinner.fail('Failed to build project');
282
+ console.error(err);
283
+ process.exit(1);
284
+ }
285
+ await generatePM2Config(fullPath, config);
286
+ const pm2Spinner = ora('Starting with PM2...').start();
287
+ try {
288
+ await execa('pm2', ['start', 'ecosystem.config.cjs', '--env', 'production'], { cwd: fullPath });
289
+ await execa('pm2', ['save']);
290
+ pm2Spinner.succeed('Application started with PM2');
291
+ }
292
+ catch (err) {
293
+ pm2Spinner.fail('Failed to start with PM2');
294
+ console.error(err);
295
+ process.exit(1);
296
+ }
297
+ success(`\n✅ Deployment completed successfully!`);
298
+ info(`\n📍 Location: ${fullPath}`);
299
+ info(`🔧 PM2 App Name: ${config.appName}`);
300
+ info(`\nUseful commands:`);
301
+ gray(` pm2 logs ${config.appName} # View logs`);
302
+ gray(` pm2 restart ${config.appName} # Restart app`);
303
+ gray(` pm2 stop ${config.appName} # Stop app`);
304
+ gray(` katax deploy update # Update deployment\n`);
305
+ }
306
+ async function executeUpdate(appName, branch, hard) {
307
+ const currentDir = process.cwd();
308
+ const gitSpinner = ora('Updating code from git...').start();
309
+ try {
310
+ await execa('git', ['fetch', 'origin', branch]);
311
+ if (hard) {
312
+ await execa('git', ['reset', '--hard', `origin/${branch}`]);
313
+ }
314
+ else {
315
+ await execa('git', ['pull', 'origin', branch]);
316
+ }
317
+ gitSpinner.succeed('Code updated');
318
+ }
319
+ catch (err) {
320
+ gitSpinner.fail('Git update failed');
321
+ error(err.message);
322
+ process.exit(1);
323
+ }
324
+ const installSpinner = ora('Installing dependencies...').start();
325
+ try {
326
+ await execa('npm', ['install'], { cwd: currentDir });
327
+ installSpinner.succeed('Dependencies updated');
328
+ }
329
+ catch (err) {
330
+ installSpinner.fail('Failed to install dependencies');
331
+ console.error(err);
332
+ process.exit(1);
333
+ }
334
+ const buildSpinner = ora('Building project...').start();
335
+ try {
336
+ await execa('npm', ['run', 'build'], { cwd: currentDir });
337
+ buildSpinner.succeed('Project rebuilt');
338
+ }
339
+ catch (err) {
340
+ buildSpinner.fail('Build failed');
341
+ console.error(err);
342
+ process.exit(1);
343
+ }
344
+ const pm2Spinner = ora('Restarting PM2...').start();
345
+ try {
346
+ await execa('pm2', ['restart', appName]);
347
+ pm2Spinner.succeed('Application restarted');
348
+ }
349
+ catch (err) {
350
+ pm2Spinner.fail('PM2 restart failed');
351
+ console.error(err);
352
+ process.exit(1);
353
+ }
354
+ success('\n✅ Update completed successfully!');
355
+ info(`\nView logs with: pm2 logs ${appName}\n`);
356
+ }
357
+ async function executeRollback(appName, commits) {
358
+ const rollbackSpinner = ora(`Rolling back ${commits} commit(s)...`).start();
359
+ try {
360
+ await execa('git', ['reset', '--hard', `HEAD~${commits}`]);
361
+ rollbackSpinner.succeed('Code rolled back');
362
+ const buildSpinner = ora('Rebuilding...').start();
363
+ await execa('npm', ['install']);
364
+ await execa('npm', ['run', 'build']);
365
+ buildSpinner.succeed('Project rebuilt');
366
+ const pm2Spinner = ora('Restarting PM2...').start();
367
+ await execa('pm2', ['restart', appName]);
368
+ pm2Spinner.succeed('Application restarted');
369
+ success('\n✅ Rollback completed successfully!');
370
+ }
371
+ catch (err) {
372
+ rollbackSpinner.fail('Rollback failed');
373
+ console.error(err);
374
+ process.exit(1);
375
+ }
376
+ }
377
+ async function generatePM2Config(projectPath, config) {
378
+ const ecosystem = `// PM2 Ecosystem Configuration
379
+ // Generated by Katax CLI
380
+
381
+ module.exports = {
382
+ apps: [{
383
+ name: '${config.appName}',
384
+ script: './dist/index.js',
385
+
386
+ // Cluster mode
387
+ instances: ${typeof config.pm2Config.instances === 'number' ? config.pm2Config.instances : `'${config.pm2Config.instances}'`},
388
+ exec_mode: 'cluster',
389
+
390
+ // Resource limits
391
+ max_memory_restart: '${config.pm2Config.maxMemory}',
392
+
393
+ // Logging
394
+ error_file: './logs/pm2-error.log',
395
+ out_file: './logs/pm2-out.log',
396
+ log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
397
+ merge_logs: true,
398
+
399
+ // Auto restart configuration
400
+ autorestart: true,
401
+ watch: false,
402
+ max_restarts: 10,
403
+ min_uptime: '10s',
404
+
405
+ // Environment variables
406
+ env_production: ${JSON.stringify({
407
+ NODE_ENV: 'production',
408
+ ...config.pm2Config.env
409
+ }, null, 6)}
410
+ }]
411
+ };
412
+ `;
413
+ await writeFile(path.join(projectPath, 'ecosystem.config.cjs'), ecosystem);
414
+ success('✓ PM2 ecosystem.config.cjs generated');
415
+ }
416
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -3,3 +3,4 @@ interface GenerateCrudOptions {
3
3
  }
4
4
  export declare function generateCrudCommand(resourceName: string, options?: GenerateCrudOptions): Promise<void>;
5
5
  export {};
6
+ //# sourceMappingURL=generate-crud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-crud.d.ts","sourceRoot":"","sources":["../../src/commands/generate-crud.ts"],"names":[],"mappings":"AAoBA,UAAU,mBAAmB;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,iBA+GhG"}
@@ -5,13 +5,11 @@ import { success, error, warning, gray, title, info } from '../utils/logger.js';
5
5
  import { fileExists, writeFile, toPascalCase, toCamelCase } from '../utils/file-utils.js';
6
6
  export async function generateCrudCommand(resourceName, options = {}) {
7
7
  title(`🔧 Generate CRUD: ${resourceName}`);
8
- // Check if we're in a project
9
8
  if (!fileExists(path.join(process.cwd(), 'package.json'))) {
10
9
  error('Not in a project directory!');
11
10
  gray('Run this command from your project root\n');
12
11
  process.exit(1);
13
12
  }
14
- // Interactive prompts
15
13
  const answers = await inquirer.prompt([
16
14
  {
17
15
  type: 'input',
@@ -103,16 +101,12 @@ export async function generateCrudCommand(resourceName, options = {}) {
103
101
  async function generateCRUDFiles(config) {
104
102
  const { resourceName, fields } = config;
105
103
  const basePath = path.join(process.cwd(), 'src', 'api', resourceName.toLowerCase());
106
- // Generate validator with all operations
107
104
  const validatorContent = generateCRUDValidator(config);
108
105
  await writeFile(path.join(basePath, `${resourceName.toLowerCase()}.validator.ts`), validatorContent);
109
- // Generate controller with CRUD operations
110
106
  const controllerContent = generateCRUDController(config);
111
107
  await writeFile(path.join(basePath, `${resourceName.toLowerCase()}.controller.ts`), controllerContent);
112
- // Generate routes with all CRUD endpoints
113
108
  const routesContent = generateCRUDRoutes(config);
114
109
  await writeFile(path.join(basePath, `${resourceName.toLowerCase()}.routes.ts`), routesContent);
115
- // Update main router
116
110
  const { updateMainRouter } = await import('../generators/router-updater.js');
117
111
  await updateMainRouter(resourceName, {
118
112
  name: resourceName,
@@ -129,7 +123,6 @@ function generateCRUDValidator(config) {
129
123
  const camelName = toCamelCase(resourceName);
130
124
  let content = `import { k, kataxInfer } from 'katax-core';\n\n`;
131
125
  content += `// ==================== SCHEMAS ====================\n\n`;
132
- // Create schema
133
126
  content += `export const create${pascalName}Schema = k.object({\n`;
134
127
  fields.forEach((field, index) => {
135
128
  const isLast = index === fields.length - 1;
@@ -139,7 +132,6 @@ function generateCRUDValidator(config) {
139
132
  content += ` ${field.name}: ${fieldSchema}${isLast ? '' : ','}\n`;
140
133
  });
141
134
  content += `});\n\n`;
142
- // Update schema (all fields optional)
143
135
  content += `export const update${pascalName}Schema = k.object({\n`;
144
136
  fields.forEach((field, index) => {
145
137
  const isLast = index === fields.length - 1;
@@ -280,3 +272,4 @@ router.delete('/:id', ${addAuth ? '/* requireAuth, */ ' : ''}async (req: Request
280
272
  export default router;
281
273
  `;
282
274
  }
275
+ //# sourceMappingURL=generate-crud.js.map