katax-cli 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +241 -29
  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 +9 -40
  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 +4 -4
  135. package/dist/database/mongodb.ts +0 -46
  136. package/dist/database/mysql.ts +0 -26
  137. package/dist/database/postgresql.ts +0 -52
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-utils-template.d.ts","sourceRoot":"","sources":["../../../src/templates/generators/response-utils-template.ts"],"names":[],"mappings":"AAOA,wBAAgB,qBAAqB,IAAI,MAAM,CA+G9C"}
@@ -0,0 +1,112 @@
1
+ import { CodeBuilder } from '../base/code-builder.js';
2
+ export function generateResponseUtils() {
3
+ const builder = new CodeBuilder();
4
+ builder
5
+ .comment('API Response Utilities')
6
+ .comment('Consistent response formatting with Result pattern support')
7
+ .line()
8
+ .import(['Request', 'Response'], 'express')
9
+ .import(['Result', 'isOk'], '../core/result.js')
10
+ .import(['AppError', 'isAppError', 'InternalServerError', 'ValidationError'], '../core/errors.js')
11
+ .import(['logger'], './logger.utils.js')
12
+ .line()
13
+ .section('Response Helper Functions')
14
+ .line()
15
+ .comment('Send success response')
16
+ .line('export function sendSuccess<T>(')
17
+ .line(' res: Response,')
18
+ .line(' data: T,')
19
+ .line(' message?: string,')
20
+ .line(' statusCode: number = 200')
21
+ .line('): void {')
22
+ .line(' res.status(statusCode).json({')
23
+ .line(' success: true,')
24
+ .line(' message,')
25
+ .line(' data')
26
+ .line(' });')
27
+ .line('}')
28
+ .line()
29
+ .comment('Send error response')
30
+ .line('export function sendError(')
31
+ .line(' res: Response,')
32
+ .line(' error: AppError | Error,')
33
+ .line(' statusCode?: number')
34
+ .line('): void {')
35
+ .line(' const appError = isAppError(error)')
36
+ .line(' ? error')
37
+ .line(' : InternalServerError.fromError(error);')
38
+ .line()
39
+ .line(' res.status(statusCode || appError.statusCode).json({')
40
+ .line(' success: false,')
41
+ .line(' error: appError.toJSON()')
42
+ .line(' });')
43
+ .line('}')
44
+ .line()
45
+ .comment('Send validation error')
46
+ .line('export function sendValidationError(')
47
+ .line(' res: Response,')
48
+ .line(' errors: any,')
49
+ .line(' message: string = \"Validation failed\"')
50
+ .line('): void {')
51
+ .line(' const validationError = new ValidationError(message, errors);')
52
+ .line(' res.status(400).json({')
53
+ .line(' success: false,')
54
+ .line(' error: validationError.toJSON()')
55
+ .line(' });')
56
+ .line('}')
57
+ .line()
58
+ .comment('Send Result<T, E> - Handles Result pattern automatically')
59
+ .line('export function sendResult<T, E extends AppError = AppError>(')
60
+ .line(' res: Response,')
61
+ .line(' result: Result<T, E>,')
62
+ .line(' successMessage?: string,')
63
+ .line(' successStatus: number = 200')
64
+ .line('): void {')
65
+ .line(' if (isOk(result)) {')
66
+ .line(' sendSuccess(res, result.value, successMessage, successStatus);')
67
+ .line(' } else {')
68
+ .line(' sendError(res, result.error);')
69
+ .line(' }')
70
+ .line('}')
71
+ .line()
72
+ .comment('Advanced: Send response with validation + controller')
73
+ .comment('Validates data first, then executes controller, then sends response')
74
+ .line('export async function sendResponse<TData, TResult, TError extends AppError = AppError>(')
75
+ .line(' req: Request,')
76
+ .line(' res: Response,')
77
+ .line(' options: {')
78
+ .line(' validator: (data: unknown) => Promise<{ success: boolean; data?: TData; errors?: any }>;')
79
+ .line(' controller: (data: TData) => Promise<Result<TResult, TError>>;')
80
+ .line(' dataSource?: "body" | "query" | "params";')
81
+ .line(' successMessage?: string;')
82
+ .line(' successStatus?: number;')
83
+ .line(' }')
84
+ .line('): Promise<void> {')
85
+ .line(' const { validator, controller, dataSource = "body", successMessage, successStatus = 200 } = options;')
86
+ .line()
87
+ .line(' try {')
88
+ .line(' // 1. Get data from request')
89
+ .line(' const requestData = dataSource === "body" ? req.body')
90
+ .line(' : dataSource === "query" ? req.query')
91
+ .line(' : req.params;')
92
+ .line()
93
+ .line(' // 2. Validate')
94
+ .line(' const validationResult = await validator(requestData);')
95
+ .line(' if (!validationResult.success) {')
96
+ .line(' logger.warn({ method: req.method, path: req.path, errors: validationResult.errors }, "Validation failed");')
97
+ .line(' return sendValidationError(res, validationResult.errors);')
98
+ .line(' }')
99
+ .line()
100
+ .line(' // 3. Execute controller')
101
+ .line(' const result = await controller(validationResult.data!);')
102
+ .line()
103
+ .line(' // 4. Send result')
104
+ .line(' sendResult(res, result, successMessage, successStatus);')
105
+ .line(' } catch (error) {')
106
+ .line(' logger.error({ err: error, method: req.method, path: req.path }, "Handler error");')
107
+ .line(' sendError(res, error as Error);')
108
+ .line(' }')
109
+ .line('}');
110
+ return builder.build();
111
+ }
112
+ //# sourceMappingURL=response-utils-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-utils-template.js","sourceRoot":"","sources":["../../../src/templates/generators/response-utils-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { FieldConfig } from '../../types/index.js';
2
+ export declare function generateRepositoryTests(config: {
3
+ name: string;
4
+ fields: FieldConfig[];
5
+ database: 'postgresql' | 'mysql' | 'mongodb';
6
+ }): string;
7
+ export declare function generateControllerTests(config: {
8
+ name: string;
9
+ fields: FieldConfig[];
10
+ }): string;
11
+ //# sourceMappingURL=test-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-generator.d.ts","sourceRoot":"","sources":["../../../src/templates/generators/test-generator.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKnD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;CAC9C,GAAG,MAAM,CA6HT;AAKD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,GAAG,MAAM,CA4FT"}
@@ -0,0 +1,206 @@
1
+ import { CodeBuilder } from '../base/code-builder.js';
2
+ export function generateRepositoryTests(config) {
3
+ const builder = new CodeBuilder();
4
+ const pascalName = toPascalCase(config.name);
5
+ const camelName = toCamelCase(config.name);
6
+ builder
7
+ .section('Repository Tests')
8
+ .import([`${config.database === 'postgresql' ? 'Postgres' : config.database === 'mysql' ? 'MySQL' : 'Mongo'}${pascalName}Repository`], `./${camelName}.repository.js`)
9
+ .import(['ok', 'err'], '../../core/result.js')
10
+ .import(['DatabaseError'], '../../core/errors.js')
11
+ .line();
12
+ builder
13
+ .section('Mocks')
14
+ .line('const mockDatabase = {')
15
+ .line(' query: jest.fn(),')
16
+ .line(' collection: jest.fn(),')
17
+ .line('};')
18
+ .line()
19
+ .line('const mockLogger = {')
20
+ .line(' error: jest.fn(),')
21
+ .line(' info: jest.fn(),')
22
+ .line(' warn: jest.fn(),')
23
+ .line(' debug: jest.fn(),')
24
+ .line('};')
25
+ .line();
26
+ builder
27
+ .section('Test Suite')
28
+ .line(`describe('${pascalName}Repository', () => {`)
29
+ .line(` let repository: ${config.database === 'postgresql' ? 'Postgres' : config.database === 'mysql' ? 'MySQL' : 'Mongo'}${pascalName}Repository;`)
30
+ .line()
31
+ .line(' beforeEach(() => {')
32
+ .line(' jest.clearAllMocks();')
33
+ .line(` repository = new ${config.database === 'postgresql' ? 'Postgres' : config.database === 'mysql' ? 'MySQL' : 'Mongo'}${pascalName}Repository(mockDatabase as any, mockLogger as any);`)
34
+ .line(' });')
35
+ .line();
36
+ builder
37
+ .section('findAll tests')
38
+ .line(` describe('findAll', () => {`)
39
+ .line(` it('should return all ${camelName}s successfully', async () => {`)
40
+ .line(' const mockData = [')
41
+ .line(' { id: "1", name: "Test 1" },')
42
+ .line(' { id: "2", name: "Test 2" }')
43
+ .line(' ];')
44
+ .line()
45
+ .line(` mockDatabase.query.mockResolvedValue({ rows: mockData });`)
46
+ .line()
47
+ .line(' const result = await repository.findAll();')
48
+ .line()
49
+ .line(' expect(result.ok).toBe(true);')
50
+ .line(' if (result.ok) {')
51
+ .line(' expect(result.value).toEqual(mockData);')
52
+ .line(' }')
53
+ .line(' });')
54
+ .line()
55
+ .line(' it("should return error on database failure", async () => {')
56
+ .line(' mockDatabase.query.mockRejectedValue(new Error("Connection failed"));')
57
+ .line()
58
+ .line(' const result = await repository.findAll();')
59
+ .line()
60
+ .line(' expect(result.ok).toBe(false);')
61
+ .line(' if (!result.ok) {')
62
+ .line(' expect(result.error).toBeInstanceOf(DatabaseError);')
63
+ .line(' }')
64
+ .line(' });')
65
+ .line(' });')
66
+ .line();
67
+ builder
68
+ .section('findById tests')
69
+ .line(' describe("findById", () => {')
70
+ .line(' it("should find entity by id", async () => {')
71
+ .line(' const mockEntity = { id: "1", name: "Test" };')
72
+ .line(' mockDatabase.query.mockResolvedValue({ rows: [mockEntity] });')
73
+ .line()
74
+ .line(' const result = await repository.findById("1");')
75
+ .line()
76
+ .line(' expect(result.ok).toBe(true);')
77
+ .line(' if (result.ok) {')
78
+ .line(' expect(result.value).toEqual(mockEntity);')
79
+ .line(' }')
80
+ .line(' });')
81
+ .line()
82
+ .line(' it("should return null for non-existent id", async () => {')
83
+ .line(' mockDatabase.query.mockResolvedValue({ rows: [] });')
84
+ .line()
85
+ .line(' const result = await repository.findById("999");')
86
+ .line()
87
+ .line(' expect(result.ok).toBe(true);')
88
+ .line(' if (result.ok) {')
89
+ .line(' expect(result.value).toBeNull();')
90
+ .line(' }')
91
+ .line(' });')
92
+ .line(' });')
93
+ .line();
94
+ builder
95
+ .section('create tests')
96
+ .line(' describe("create", () => {')
97
+ .line(' it("should create new entity", async () => {')
98
+ .line(' const newData = { name: "New Test" };')
99
+ .line(' const created = { id: "new-id", ...newData };')
100
+ .line(' mockDatabase.query.mockResolvedValue({ rows: [created] });')
101
+ .line()
102
+ .line(' const result = await repository.create(newData);')
103
+ .line()
104
+ .line(' expect(result.ok).toBe(true);')
105
+ .line(' if (result.ok) {')
106
+ .line(' expect(result.value).toEqual(created);')
107
+ .line(' }')
108
+ .line(' });')
109
+ .line(' });')
110
+ .line();
111
+ builder.line('});');
112
+ return builder.build();
113
+ }
114
+ export function generateControllerTests(config) {
115
+ const builder = new CodeBuilder();
116
+ const pascalName = toPascalCase(config.name);
117
+ const camelName = toCamelCase(config.name);
118
+ builder
119
+ .section('Controller Tests')
120
+ .import([`${pascalName}Controller`], `./${camelName}.controller.js`)
121
+ .import(['ok', 'err'], '../../core/result.js')
122
+ .import(['NotFoundError', 'ValidationError'], '../../core/errors.js')
123
+ .line();
124
+ builder
125
+ .section('Mocks')
126
+ .line('const mockRepository = {')
127
+ .line(' findAll: jest.fn(),')
128
+ .line(' findById: jest.fn(),')
129
+ .line(' create: jest.fn(),')
130
+ .line(' update: jest.fn(),')
131
+ .line(' delete: jest.fn(),')
132
+ .line(' exists: jest.fn(),')
133
+ .line('};')
134
+ .line()
135
+ .line('const mockLogger = {')
136
+ .line(' error: jest.fn(),')
137
+ .line(' info: jest.fn(),')
138
+ .line(' warn: jest.fn(),')
139
+ .line(' debug: jest.fn(),')
140
+ .line('};')
141
+ .line();
142
+ builder
143
+ .section('Test Suite')
144
+ .line(`describe('${pascalName}Controller', () => {`)
145
+ .line(` let controller: ${pascalName}Controller;`)
146
+ .line()
147
+ .line(' beforeEach(() => {')
148
+ .line(' jest.clearAllMocks();')
149
+ .line(` controller = new ${pascalName}Controller(mockRepository as any, mockLogger as any);`)
150
+ .line(' });')
151
+ .line();
152
+ builder
153
+ .line(' describe("getAll", () => {')
154
+ .line(' it("should return all items", async () => {')
155
+ .line(' const mockData = [{ id: "1", name: "Test" }];')
156
+ .line(' mockRepository.findAll.mockResolvedValue(ok(mockData));')
157
+ .line()
158
+ .line(' const result = await controller.getAll();')
159
+ .line()
160
+ .line(' expect(result.ok).toBe(true);')
161
+ .line(' if (result.ok) {')
162
+ .line(' expect(result.value).toEqual(mockData);')
163
+ .line(' }')
164
+ .line(' });')
165
+ .line(' });')
166
+ .line();
167
+ builder
168
+ .line(' describe("getById", () => {')
169
+ .line(' it("should return item by id", async () => {')
170
+ .line(' const mockItem = { id: "1", name: "Test" };')
171
+ .line(' mockRepository.findById.mockResolvedValue(ok(mockItem));')
172
+ .line()
173
+ .line(' const result = await controller.getById("1");')
174
+ .line()
175
+ .line(' expect(result.ok).toBe(true);')
176
+ .line(' if (result.ok) {')
177
+ .line(' expect(result.value).toEqual(mockItem);')
178
+ .line(' }')
179
+ .line(' });')
180
+ .line()
181
+ .line(' it("should return error when not found", async () => {')
182
+ .line(' mockRepository.findById.mockResolvedValue(ok(null));')
183
+ .line()
184
+ .line(' const result = await controller.getById("999");')
185
+ .line()
186
+ .line(' expect(result.ok).toBe(false);')
187
+ .line(' if (!result.ok) {')
188
+ .line(' expect(result.error).toBeInstanceOf(NotFoundError);')
189
+ .line(' }')
190
+ .line(' });')
191
+ .line(' });')
192
+ .line();
193
+ builder.line('});');
194
+ return builder.build();
195
+ }
196
+ function toPascalCase(str) {
197
+ return str
198
+ .split(/[-_]/)
199
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
200
+ .join('');
201
+ }
202
+ function toCamelCase(str) {
203
+ const pascal = toPascalCase(str);
204
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
205
+ }
206
+ //# sourceMappingURL=test-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-generator.js","sourceRoot":"","sources":["../../../src/templates/generators/test-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from './base/template-engine.js';
2
+ export * from './base/code-builder.js';
3
+ export * from './generators/repository-template.js';
4
+ export * from './generators/controller-template.js';
5
+ export * from './generators/handler-template.js';
6
+ export * from './generators/di-container.js';
7
+ export * from './generators/response-utils-template.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAIA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yCAAyC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from './base/template-engine.js';
2
+ export * from './base/code-builder.js';
3
+ export * from './generators/repository-template.js';
4
+ export * from './generators/controller-template.js';
5
+ export * from './generators/handler-template.js';
6
+ export * from './generators/di-container.js';
7
+ export * from './generators/response-utils-template.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAIA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yCAAyC,CAAC"}
@@ -48,3 +48,4 @@ export interface CRUDConfig {
48
48
  fields: FieldConfig[];
49
49
  addAuth: boolean;
50
50
  }
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvD,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAChC,UAAU,EAAE,YAAY,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC9E,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE;QACf,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACrC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACzF,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB"}
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -1,40 +1,11 @@
1
- /**
2
- * Get the templates directory path
3
- */
4
1
  export declare function getTemplatesDir(): string;
5
- /**
6
- * Render an EJS template
7
- */
8
2
  export declare function renderTemplate(templatePath: string, data: any): Promise<string>;
9
- /**
10
- * Copy template file to destination
11
- */
12
3
  export declare function copyTemplate(templatePath: string, destinationPath: string, data?: any): Promise<void>;
13
- /**
14
- * Write a file with content
15
- */
16
4
  export declare function writeFile(filePath: string, content: string): Promise<void>;
17
- /**
18
- * Check if directory exists
19
- */
20
5
  export declare function directoryExists(dirPath: string): boolean;
21
- /**
22
- * Check if file exists
23
- */
24
6
  export declare function fileExists(filePath: string): boolean;
25
- /**
26
- * Create directory if it doesn't exist
27
- */
28
7
  export declare function ensureDir(dirPath: string): Promise<void>;
29
- /**
30
- * Convert string to PascalCase
31
- */
32
8
  export declare function toPascalCase(str: string): string;
33
- /**
34
- * Convert string to camelCase
35
- */
36
9
  export declare function toCamelCase(str: string): string;
37
- /**
38
- * Convert string to kebab-case
39
- */
40
10
  export declare function toKebabCase(str: string): string;
11
+ //# sourceMappingURL=file-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAYA,wBAAgB,eAAe,IAAI,MAAM,CAOxC;AAKD,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAIrF;AAKD,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,IAAI,CAAC,CAWf;AAKD,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAKD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD;AAKD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAKD,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAKD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKhD;AAKD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AAKD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C"}
@@ -5,27 +5,16 @@ import { fileURLToPath } from 'url';
5
5
  import { dirname } from 'path';
6
6
  const __filename = fileURLToPath(import.meta.url);
7
7
  const __dirname = dirname(__filename);
8
- /**
9
- * Get the templates directory path
10
- */
11
8
  export function getTemplatesDir() {
12
- // In development: ../../templates
13
- // In production: ../templates (dist folder)
14
9
  const devPath = path.join(__dirname, '..', '..', 'templates');
15
10
  const prodPath = path.join(__dirname, '..', 'templates');
16
11
  return fs.existsSync(devPath) ? devPath : prodPath;
17
12
  }
18
- /**
19
- * Render an EJS template
20
- */
21
13
  export async function renderTemplate(templatePath, data) {
22
14
  const fullPath = path.join(getTemplatesDir(), templatePath);
23
15
  const templateContent = await fs.readFile(fullPath, 'utf-8');
24
16
  return ejs.render(templateContent, data);
25
17
  }
26
- /**
27
- * Copy template file to destination
28
- */
29
18
  export async function copyTemplate(templatePath, destinationPath, data) {
30
19
  const sourcePath = path.join(getTemplatesDir(), templatePath);
31
20
  await fs.ensureDir(path.dirname(destinationPath));
@@ -37,53 +26,33 @@ export async function copyTemplate(templatePath, destinationPath, data) {
37
26
  await fs.copy(sourcePath, destinationPath);
38
27
  }
39
28
  }
40
- /**
41
- * Write a file with content
42
- */
43
29
  export async function writeFile(filePath, content) {
44
30
  await fs.ensureDir(path.dirname(filePath));
45
31
  await fs.writeFile(filePath, content, 'utf-8');
46
32
  }
47
- /**
48
- * Check if directory exists
49
- */
50
33
  export function directoryExists(dirPath) {
51
34
  return fs.existsSync(dirPath);
52
35
  }
53
- /**
54
- * Check if file exists
55
- */
56
36
  export function fileExists(filePath) {
57
37
  return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
58
38
  }
59
- /**
60
- * Create directory if it doesn't exist
61
- */
62
39
  export async function ensureDir(dirPath) {
63
40
  await fs.ensureDir(dirPath);
64
41
  }
65
- /**
66
- * Convert string to PascalCase
67
- */
68
42
  export function toPascalCase(str) {
69
43
  return str
70
44
  .split(/[-_\s]+/)
71
45
  .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
72
46
  .join('');
73
47
  }
74
- /**
75
- * Convert string to camelCase
76
- */
77
48
  export function toCamelCase(str) {
78
49
  const pascal = toPascalCase(str);
79
50
  return pascal.charAt(0).toLowerCase() + pascal.slice(1);
80
51
  }
81
- /**
82
- * Convert string to kebab-case
83
- */
84
52
  export function toKebabCase(str) {
85
53
  return str
86
54
  .replace(/([a-z])([A-Z])/g, '$1-$2')
87
55
  .replace(/[\s_]+/g, '-')
88
56
  .toLowerCase();
89
57
  }
58
+ //# sourceMappingURL=file-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAKtC,MAAM,UAAU,eAAe;IAG7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAEzD,OAAO,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrD,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,YAAoB,EAAE,IAAS;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,YAAY,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAAoB,EACpB,eAAuB,EACvB,IAAU;IAEV,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,YAAY,CAAC,CAAC;IAE9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAElD,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IAC/D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAKD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAKD,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;AACnE,CAAC;AAKD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAKD,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG;SACP,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACvE,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAKD,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,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;AAC1D,CAAC;AAKD,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC"}
@@ -8,3 +8,4 @@ export declare function verbose(message: string): void;
8
8
  export declare function gray(message: string): void;
9
9
  export declare function title(message: string): void;
10
10
  export declare function code(message: string): void;
11
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEnD;AAMD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI7C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C"}
@@ -36,3 +36,4 @@ export function title(message) {
36
36
  export function code(message) {
37
37
  console.log(applyColor(chalk.bgBlack.white, ` ${message} `));
38
38
  }
39
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,SAAS,GAAG,IAAI,CAAC;AAErB,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,WAAW,GAAG,OAAO,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,SAAS,GAAG,OAAO,CAAC;AACtB,CAAC;AAED,SAAS,UAAU,CAAC,KAA+B,EAAE,IAAY;IAC/D,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "katax-cli",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "CLI tool to generate Express APIs with TypeScript and katax-core validation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -53,7 +53,8 @@
53
53
  "fs-extra": "^11.2.0",
54
54
  "inquirer": "^12.3.0",
55
55
  "katax-core": "^1.1.0",
56
- "ora": "^8.1.1"
56
+ "ora": "^8.1.1",
57
+ "typescript": "^5.7.2"
57
58
  },
58
59
  "devDependencies": {
59
60
  "@types/ejs": "^3.1.5",
@@ -62,7 +63,6 @@
62
63
  "@types/node": "^22.10.5",
63
64
  "copyfiles": "^2.4.1",
64
65
  "rimraf": "^6.0.1",
65
- "tsx": "^4.19.2",
66
- "typescript": "^5.7.2"
66
+ "tsx": "^4.19.2"
67
67
  }
68
68
  }
@@ -1,46 +0,0 @@
1
- import { MongoClient, Db } from 'mongodb';
2
-
3
- let client: MongoClient;
4
- let db: Db;
5
-
6
- export async function connect(): Promise<Db> {
7
- if (db) {
8
- return db;
9
- }
10
-
11
- const uri = process.env.DATABASE_URL;
12
- if (!uri) {
13
- throw new Error('DATABASE_URL is not defined in environment variables');
14
- }
15
-
16
- client = new MongoClient(uri);
17
-
18
- try {
19
- await client.connect();
20
- console.log('✅ Connected to MongoDB database');
21
-
22
- const dbName = uri.split('/').pop()?.split('?')[0];
23
- db = client.db(dbName);
24
-
25
- return db;
26
- } catch (error) {
27
- console.error('❌ MongoDB connection error:', error);
28
- throw error;
29
- }
30
- }
31
-
32
- export async function disconnect(): Promise<void> {
33
- if (client) {
34
- await client.close();
35
- console.log('Disconnected from MongoDB');
36
- }
37
- }
38
-
39
- export function getDb(): Db {
40
- if (!db) {
41
- throw new Error('Database not initialized. Call connect() first.');
42
- }
43
- return db;
44
- }
45
-
46
- export default { connect, disconnect, getDb };