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.
- package/README.md +0 -0
- package/dist/commands/add-endpoint.d.ts +1 -0
- package/dist/commands/add-endpoint.d.ts.map +1 -0
- package/dist/commands/add-endpoint.js +18 -39
- package/dist/commands/add-endpoint.js.map +1 -0
- package/dist/commands/deploy.d.ts +14 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +416 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/generate-crud.d.ts +1 -0
- package/dist/commands/generate-crud.d.ts.map +1 -0
- package/dist/commands/generate-crud.js +1 -8
- package/dist/commands/generate-crud.js.map +1 -0
- package/dist/commands/generate-crud.refactored.d.ts +6 -0
- package/dist/commands/generate-crud.refactored.d.ts.map +1 -0
- package/dist/commands/generate-crud.refactored.js +139 -0
- package/dist/commands/generate-crud.refactored.js.map +1 -0
- package/dist/commands/info.d.ts +1 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +1 -5
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +70 -76
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.refactored.d.ts +6 -0
- package/dist/commands/init.refactored.d.ts.map +1 -0
- package/dist/commands/init.refactored.js +224 -0
- package/dist/commands/init.refactored.js.map +1 -0
- package/dist/core/errors.d.ts +77 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +130 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/result.d.ts +26 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +76 -0
- package/dist/core/result.js.map +1 -0
- package/dist/generators/controller-generator.d.ts +1 -0
- package/dist/generators/controller-generator.d.ts.map +1 -0
- package/dist/generators/controller-generator.js +1 -2
- package/dist/generators/controller-generator.js.map +1 -0
- package/dist/generators/handler-generator.d.ts +1 -0
- package/dist/generators/handler-generator.d.ts.map +1 -0
- package/dist/generators/handler-generator.js +35 -22
- package/dist/generators/handler-generator.js.map +1 -0
- package/dist/generators/route-generator.d.ts +1 -0
- package/dist/generators/route-generator.d.ts.map +1 -0
- package/dist/generators/route-generator.js +1 -2
- package/dist/generators/route-generator.js.map +1 -0
- package/dist/generators/router-updater.d.ts +1 -0
- package/dist/generators/router-updater.d.ts.map +1 -0
- package/dist/generators/router-updater.js +1 -6
- package/dist/generators/router-updater.js.map +1 -0
- package/dist/generators/validator-generator.d.ts +1 -0
- package/dist/generators/validator-generator.d.ts.map +1 -0
- package/dist/generators/validator-generator.improved.d.ts +3 -0
- package/dist/generators/validator-generator.improved.d.ts.map +1 -0
- package/dist/generators/validator-generator.improved.js +184 -0
- package/dist/generators/validator-generator.improved.js.map +1 -0
- package/dist/generators/validator-generator.js +1 -10
- package/dist/generators/validator-generator.js.map +1 -0
- package/dist/index.d.ts +1 -6
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -19
- package/dist/index.js.map +1 -0
- package/dist/services/ast-router-updater.d.ts +16 -0
- package/dist/services/ast-router-updater.d.ts.map +1 -0
- package/dist/services/ast-router-updater.js +130 -0
- package/dist/services/ast-router-updater.js.map +1 -0
- package/dist/services/code-generation.service.d.ts +15 -0
- package/dist/services/code-generation.service.d.ts.map +1 -0
- package/dist/services/code-generation.service.js +110 -0
- package/dist/services/code-generation.service.js.map +1 -0
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +4 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/project-structure-generator.d.ts +30 -0
- package/dist/services/project-structure-generator.d.ts.map +1 -0
- package/dist/services/project-structure-generator.js +884 -0
- package/dist/services/project-structure-generator.js.map +1 -0
- package/dist/templates/base/code-builder.d.ts +34 -0
- package/dist/templates/base/code-builder.d.ts.map +1 -0
- package/dist/templates/base/code-builder.js +154 -0
- package/dist/templates/base/code-builder.js.map +1 -0
- package/dist/templates/base/template-engine.d.ts +28 -0
- package/dist/templates/base/template-engine.d.ts.map +1 -0
- package/dist/templates/base/template-engine.js +47 -0
- package/dist/templates/base/template-engine.js.map +1 -0
- package/dist/templates/generators/controller-template.d.ts +15 -0
- package/dist/templates/generators/controller-template.d.ts.map +1 -0
- package/dist/templates/generators/controller-template.js +185 -0
- package/dist/templates/generators/controller-template.js.map +1 -0
- package/dist/templates/generators/di-container.d.ts +6 -0
- package/dist/templates/generators/di-container.d.ts.map +1 -0
- package/dist/templates/generators/di-container.js +121 -0
- package/dist/templates/generators/di-container.js.map +1 -0
- package/dist/templates/generators/handler-template.d.ts +15 -0
- package/dist/templates/generators/handler-template.d.ts.map +1 -0
- package/dist/templates/generators/handler-template.js +208 -0
- package/dist/templates/generators/handler-template.js.map +1 -0
- package/dist/templates/generators/repository-template.d.ts +23 -0
- package/dist/templates/generators/repository-template.d.ts.map +1 -0
- package/dist/templates/generators/repository-template.js +237 -0
- package/dist/templates/generators/repository-template.js.map +1 -0
- package/dist/templates/generators/response-utils-template.d.ts +2 -0
- package/dist/templates/generators/response-utils-template.d.ts.map +1 -0
- package/dist/templates/generators/response-utils-template.js +112 -0
- package/dist/templates/generators/response-utils-template.js.map +1 -0
- package/dist/templates/generators/test-generator.d.ts +11 -0
- package/dist/templates/generators/test-generator.d.ts.map +1 -0
- package/dist/templates/generators/test-generator.js +206 -0
- package/dist/templates/generators/test-generator.js.map +1 -0
- package/dist/templates/index.d.ts +8 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +8 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/file-utils.d.ts +1 -30
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +1 -32
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +1 -1
- package/dist/database/mongodb.ts +0 -46
- package/dist/database/mysql.ts +0 -26
- package/dist/database/postgresql.ts +0 -52
package/README.md
CHANGED
|
Binary file
|
|
@@ -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
|
|
6
|
-
import {
|
|
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
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
const
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
-
|
|
196
|
-
|
|
197
|
-
const
|
|
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
|
-
|
|
226
|
-
error(err
|
|
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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"}
|
|
@@ -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
|