create-coreback 1.0.4 → 1.0.5

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 (181) hide show
  1. package/README.md +30 -1
  2. package/dist/generators/docker.d.ts.map +1 -1
  3. package/dist/generators/docker.js +61 -4
  4. package/dist/generators/docker.js.map +1 -1
  5. package/dist/generators/envExample.d.ts.map +1 -1
  6. package/dist/generators/envExample.js +26 -0
  7. package/dist/generators/envExample.js.map +1 -1
  8. package/dist/generators/index.js +1 -1
  9. package/dist/generators/index.js.map +1 -1
  10. package/dist/generators/packageJson.d.ts.map +1 -1
  11. package/dist/generators/packageJson.js +36 -0
  12. package/dist/generators/packageJson.js.map +1 -1
  13. package/dist/generators/sourceFiles/controllers/index.d.ts +3 -0
  14. package/dist/generators/sourceFiles/controllers/index.d.ts.map +1 -0
  15. package/dist/generators/sourceFiles/controllers/index.js +147 -0
  16. package/dist/generators/sourceFiles/controllers/index.js.map +1 -0
  17. package/dist/generators/sourceFiles/core/configFiles.d.ts +3 -0
  18. package/dist/generators/sourceFiles/core/configFiles.d.ts.map +1 -0
  19. package/dist/generators/sourceFiles/core/configFiles.js +148 -0
  20. package/dist/generators/sourceFiles/core/configFiles.js.map +1 -0
  21. package/dist/generators/sourceFiles/core/index.d.ts +3 -0
  22. package/dist/generators/sourceFiles/core/index.d.ts.map +1 -0
  23. package/dist/generators/sourceFiles/core/index.js +17 -0
  24. package/dist/generators/sourceFiles/core/index.js.map +1 -0
  25. package/dist/generators/sourceFiles/core/indexFile.d.ts +3 -0
  26. package/dist/generators/sourceFiles/core/indexFile.d.ts.map +1 -0
  27. package/dist/generators/sourceFiles/core/indexFile.js +47 -0
  28. package/dist/generators/sourceFiles/core/indexFile.js.map +1 -0
  29. package/dist/generators/sourceFiles/core/middlewares.d.ts +3 -0
  30. package/dist/generators/sourceFiles/core/middlewares.d.ts.map +1 -0
  31. package/dist/generators/sourceFiles/core/middlewares.js +123 -0
  32. package/dist/generators/sourceFiles/core/middlewares.js.map +1 -0
  33. package/dist/generators/sourceFiles/core/routes.d.ts +3 -0
  34. package/dist/generators/sourceFiles/core/routes.d.ts.map +1 -0
  35. package/dist/generators/sourceFiles/core/routes.js +281 -0
  36. package/dist/generators/sourceFiles/core/routes.js.map +1 -0
  37. package/dist/generators/sourceFiles/core/tests.d.ts +3 -0
  38. package/dist/generators/sourceFiles/core/tests.d.ts.map +1 -0
  39. package/dist/generators/sourceFiles/core/tests.js +48 -0
  40. package/dist/generators/sourceFiles/core/tests.js.map +1 -0
  41. package/dist/generators/sourceFiles/core/types.d.ts +2 -0
  42. package/dist/generators/sourceFiles/core/types.d.ts.map +1 -0
  43. package/dist/generators/sourceFiles/core/types.js +13 -0
  44. package/dist/generators/sourceFiles/core/types.js.map +1 -0
  45. package/dist/generators/sourceFiles/core/utils.d.ts +2 -0
  46. package/dist/generators/sourceFiles/core/utils.d.ts.map +1 -0
  47. package/dist/generators/sourceFiles/core/utils.js +173 -0
  48. package/dist/generators/sourceFiles/core/utils.js.map +1 -0
  49. package/dist/generators/sourceFiles/core/validators.d.ts +3 -0
  50. package/dist/generators/sourceFiles/core/validators.d.ts.map +1 -0
  51. package/dist/generators/sourceFiles/core/validators.js +37 -0
  52. package/dist/generators/sourceFiles/core/validators.js.map +1 -0
  53. package/dist/generators/sourceFiles/features/fileUpload.d.ts +3 -0
  54. package/dist/generators/sourceFiles/features/fileUpload.d.ts.map +1 -0
  55. package/dist/generators/sourceFiles/features/fileUpload.js +229 -0
  56. package/dist/generators/sourceFiles/features/fileUpload.js.map +1 -0
  57. package/dist/generators/sourceFiles/features/queue.d.ts +3 -0
  58. package/dist/generators/sourceFiles/features/queue.d.ts.map +1 -0
  59. package/dist/generators/sourceFiles/features/queue.js +211 -0
  60. package/dist/generators/sourceFiles/features/queue.js.map +1 -0
  61. package/dist/generators/sourceFiles/features/redis.d.ts +3 -0
  62. package/dist/generators/sourceFiles/features/redis.d.ts.map +1 -0
  63. package/dist/generators/sourceFiles/features/redis.js +68 -0
  64. package/dist/generators/sourceFiles/features/redis.js.map +1 -0
  65. package/dist/generators/sourceFiles/index.d.ts +3 -0
  66. package/dist/generators/sourceFiles/index.d.ts.map +1 -0
  67. package/dist/generators/sourceFiles/index.js +99 -0
  68. package/dist/generators/sourceFiles/index.js.map +1 -0
  69. package/dist/generators/sourceFiles/phase1/cliGenerators.d.ts +2 -0
  70. package/dist/generators/sourceFiles/phase1/cliGenerators.d.ts.map +1 -0
  71. package/dist/generators/sourceFiles/phase1/cliGenerators.js +336 -0
  72. package/dist/generators/sourceFiles/phase1/cliGenerators.js.map +1 -0
  73. package/dist/generators/sourceFiles/phase1/seedersFactories.d.ts +3 -0
  74. package/dist/generators/sourceFiles/phase1/seedersFactories.d.ts.map +1 -0
  75. package/dist/generators/sourceFiles/phase1/seedersFactories.js +89 -0
  76. package/dist/generators/sourceFiles/phase1/seedersFactories.js.map +1 -0
  77. package/dist/generators/sourceFiles/phase2/dtos.d.ts +2 -0
  78. package/dist/generators/sourceFiles/phase2/dtos.d.ts.map +1 -0
  79. package/dist/generators/sourceFiles/phase2/dtos.js +59 -0
  80. package/dist/generators/sourceFiles/phase2/dtos.js.map +1 -0
  81. package/dist/generators/sourceFiles/phase2/events.d.ts +2 -0
  82. package/dist/generators/sourceFiles/phase2/events.d.ts.map +1 -0
  83. package/dist/generators/sourceFiles/phase2/events.js +76 -0
  84. package/dist/generators/sourceFiles/phase2/events.js.map +1 -0
  85. package/dist/generators/sourceFiles/phase2/exceptionHandling.d.ts +2 -0
  86. package/dist/generators/sourceFiles/phase2/exceptionHandling.d.ts.map +1 -0
  87. package/dist/generators/sourceFiles/phase2/exceptionHandling.js +107 -0
  88. package/dist/generators/sourceFiles/phase2/exceptionHandling.js.map +1 -0
  89. package/dist/generators/sourceFiles/phase2/guards.d.ts +2 -0
  90. package/dist/generators/sourceFiles/phase2/guards.d.ts.map +1 -0
  91. package/dist/generators/sourceFiles/phase2/guards.js +98 -0
  92. package/dist/generators/sourceFiles/phase2/guards.js.map +1 -0
  93. package/dist/generators/sourceFiles/phase2/healthChecks.d.ts +3 -0
  94. package/dist/generators/sourceFiles/phase2/healthChecks.d.ts.map +1 -0
  95. package/dist/generators/sourceFiles/phase2/healthChecks.js +73 -0
  96. package/dist/generators/sourceFiles/phase2/healthChecks.js.map +1 -0
  97. package/dist/generators/sourceFiles/phase2/scheduledTasks.d.ts +2 -0
  98. package/dist/generators/sourceFiles/phase2/scheduledTasks.d.ts.map +1 -0
  99. package/dist/generators/sourceFiles/phase2/scheduledTasks.js +56 -0
  100. package/dist/generators/sourceFiles/phase2/scheduledTasks.js.map +1 -0
  101. package/dist/generators/sourceFiles/phase3/apiVersioning.d.ts +3 -0
  102. package/dist/generators/sourceFiles/phase3/apiVersioning.d.ts.map +1 -0
  103. package/dist/generators/sourceFiles/phase3/apiVersioning.js +72 -0
  104. package/dist/generators/sourceFiles/phase3/apiVersioning.js.map +1 -0
  105. package/dist/generators/sourceFiles/phase3/cliCommands.d.ts +2 -0
  106. package/dist/generators/sourceFiles/phase3/cliCommands.d.ts.map +1 -0
  107. package/dist/generators/sourceFiles/phase3/cliCommands.js +102 -0
  108. package/dist/generators/sourceFiles/phase3/cliCommands.js.map +1 -0
  109. package/dist/generators/sourceFiles/phase3/configSystem.d.ts +2 -0
  110. package/dist/generators/sourceFiles/phase3/configSystem.d.ts.map +1 -0
  111. package/dist/generators/sourceFiles/phase3/configSystem.js +57 -0
  112. package/dist/generators/sourceFiles/phase3/configSystem.js.map +1 -0
  113. package/dist/generators/sourceFiles/phase3/dependencyInjection.d.ts +2 -0
  114. package/dist/generators/sourceFiles/phase3/dependencyInjection.d.ts.map +1 -0
  115. package/dist/generators/sourceFiles/phase3/dependencyInjection.js +153 -0
  116. package/dist/generators/sourceFiles/phase3/dependencyInjection.js.map +1 -0
  117. package/dist/generators/sourceFiles/phase3/moduleSystem.d.ts +2 -0
  118. package/dist/generators/sourceFiles/phase3/moduleSystem.d.ts.map +1 -0
  119. package/dist/generators/sourceFiles/phase3/moduleSystem.js +166 -0
  120. package/dist/generators/sourceFiles/phase3/moduleSystem.js.map +1 -0
  121. package/dist/generators/sourceFiles/phase3/structuredLogging.d.ts +3 -0
  122. package/dist/generators/sourceFiles/phase3/structuredLogging.d.ts.map +1 -0
  123. package/dist/generators/sourceFiles/phase3/structuredLogging.js +155 -0
  124. package/dist/generators/sourceFiles/phase3/structuredLogging.js.map +1 -0
  125. package/dist/generators/sourceFiles/repositories/index.d.ts +3 -0
  126. package/dist/generators/sourceFiles/repositories/index.d.ts.map +1 -0
  127. package/dist/generators/sourceFiles/repositories/index.js +109 -0
  128. package/dist/generators/sourceFiles/repositories/index.js.map +1 -0
  129. package/dist/generators/sourceFiles/services/index.d.ts +3 -0
  130. package/dist/generators/sourceFiles/services/index.d.ts.map +1 -0
  131. package/dist/generators/sourceFiles/services/index.js +353 -0
  132. package/dist/generators/sourceFiles/services/index.js.map +1 -0
  133. package/dist/generators/sourceFiles.d.ts +1 -2
  134. package/dist/generators/sourceFiles.d.ts.map +1 -1
  135. package/dist/generators/sourceFiles.js +2 -1238
  136. package/dist/generators/sourceFiles.js.map +1 -1
  137. package/dist/prompts.d.ts.map +1 -1
  138. package/dist/prompts.js +35 -0
  139. package/dist/prompts.js.map +1 -1
  140. package/dist/types.d.ts +5 -0
  141. package/dist/types.d.ts.map +1 -1
  142. package/jest.config.js +21 -0
  143. package/package.json +4 -1
  144. package/src/generators/docker.ts +61 -4
  145. package/src/generators/envExample.ts +28 -0
  146. package/src/generators/index.ts +1 -1
  147. package/src/generators/packageJson.ts +40 -1
  148. package/src/generators/sourceFiles/controllers/index.ts +157 -0
  149. package/src/generators/sourceFiles/core/configFiles.ts +158 -0
  150. package/src/generators/sourceFiles/core/index.ts +28 -0
  151. package/src/generators/sourceFiles/core/indexFile.ts +49 -0
  152. package/src/generators/sourceFiles/core/middlewares.ts +129 -0
  153. package/src/generators/sourceFiles/core/routes.ts +295 -0
  154. package/src/generators/sourceFiles/core/tests.ts +62 -0
  155. package/src/generators/sourceFiles/core/types.ts +14 -0
  156. package/src/generators/sourceFiles/core/utils.ts +178 -0
  157. package/src/generators/sourceFiles/core/validators.ts +39 -0
  158. package/src/generators/sourceFiles/features/fileUpload.ts +241 -0
  159. package/src/generators/sourceFiles/features/queue.ts +226 -0
  160. package/src/generators/sourceFiles/features/redis.ts +73 -0
  161. package/src/generators/sourceFiles/index.ts +125 -0
  162. package/src/generators/sourceFiles/phase1/cliGenerators.ts +338 -0
  163. package/src/generators/sourceFiles/phase1/seedersFactories.ts +97 -0
  164. package/src/generators/sourceFiles/phase2/dtos.ts +60 -0
  165. package/src/generators/sourceFiles/phase2/events.ts +80 -0
  166. package/src/generators/sourceFiles/phase2/exceptionHandling.ts +111 -0
  167. package/src/generators/sourceFiles/phase2/guards.ts +99 -0
  168. package/src/generators/sourceFiles/phase2/healthChecks.ts +81 -0
  169. package/src/generators/sourceFiles/phase2/scheduledTasks.ts +58 -0
  170. package/src/generators/sourceFiles/phase3/apiVersioning.ts +77 -0
  171. package/src/generators/sourceFiles/phase3/cliCommands.ts +110 -0
  172. package/src/generators/sourceFiles/phase3/configSystem.ts +64 -0
  173. package/src/generators/sourceFiles/phase3/dependencyInjection.ts +155 -0
  174. package/src/generators/sourceFiles/phase3/moduleSystem.ts +170 -0
  175. package/src/generators/sourceFiles/phase3/structuredLogging.ts +160 -0
  176. package/src/generators/sourceFiles/repositories/index.ts +114 -0
  177. package/src/generators/sourceFiles/services/index.ts +363 -0
  178. package/src/generators/sourceFiles.ts +2 -1317
  179. package/src/prompts.ts +36 -1
  180. package/src/types.ts +5 -0
  181. package/tests/integration.test.ts +233 -0
package/README.md CHANGED
@@ -24,16 +24,45 @@ pnpm create coreback my-project
24
24
 
25
25
  ## Features
26
26
 
27
+ ### Core Features
27
28
  - 🚀 **Production-ready** - Includes all best practices and security measures
28
29
  - 🎯 **Interactive CLI** - Easy setup with guided prompts
29
30
  - 🗄️ **Multiple Databases** - PostgreSQL, MySQL, MongoDB, SQLite support
30
- - 🔐 **JWT Authentication** - Optional authentication system
31
+ - 🔐 **JWT Authentication** - Complete authentication system with email verification and password reset
31
32
  - 🐳 **Docker Support** - Ready-to-use Docker configuration
32
33
  - 📚 **Swagger/OpenAPI** - Auto-generated API documentation
33
34
  - 🧪 **Testing Setup** - Jest configured with examples
34
35
  - 🔧 **TypeScript** - Strict TypeScript configuration
35
36
  - 📦 **Clean Architecture** - Organized folder structure
36
37
 
38
+ ### Optional Features
39
+ - 📤 **File Upload System** - Local storage or AWS S3 integration
40
+ - ⚡ **Redis Cache** - Advanced caching and rate limiting
41
+ - 🔄 **Queue System** - Background jobs with Bull/BullMQ and dashboard
42
+ - 📊 **Queue Dashboard** - Visual interface for monitoring queues
43
+
44
+ ### Phase 1: Core Infrastructure
45
+ - 🛠️ **CLI Generators** - Generate controllers, services, repositories, and routes with `make:*` commands
46
+ - 📄 **API Resources/Transformers** - Standardized response formatting
47
+ - 📑 **Pagination Helpers** - Built-in pagination utilities
48
+ - 🌱 **Database Seeders & Factories** - Data seeding and factory patterns
49
+
50
+ ### Phase 2: Advanced Features
51
+ - ✅ **DTOs with Validation** - Zod-based Data Transfer Objects
52
+ - 📢 **Events & Listeners** - Event-driven architecture
53
+ - ⏰ **Scheduled Tasks** - Cron jobs with node-cron
54
+ - 🏥 **Advanced Health Checks** - Database and Redis status monitoring
55
+ - ⚠️ **Exception Handling** - Custom error classes and centralized error handling
56
+ - 🛡️ **Guards & Policies** - Role-based access control (RBAC)
57
+
58
+ ### Phase 3: Enterprise Features
59
+ - 💉 **Dependency Injection** - Container-based DI system
60
+ - 📦 **Module System** - Modular project architecture
61
+ - ⌨️ **CLI Commands** - Custom CLI commands (`cache:clear`, `queue:work`, etc.)
62
+ - ⚙️ **Config System** - Centralized configuration management
63
+ - 🔢 **API Versioning** - Version management for your API
64
+ - 📝 **Structured Logging** - Multi-channel logging with Winston
65
+
37
66
  ## Generated Project Structure
38
67
 
39
68
  ```
@@ -1 +1 @@
1
- {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/generators/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CA0Hf"}
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/generators/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAmLf"}
@@ -29,8 +29,11 @@ services:
29
29
  - "3000:3000"
30
30
  environment:
31
31
  - NODE_ENV=production
32
- - DATABASE_URL=\${DATABASE_URL}
33
- depends_on:
32
+ - DATABASE_URL=\${DATABASE_URL}${config.includeRedis ? `
33
+ - REDIS_HOST=redis
34
+ - REDIS_PORT=6379` : ''}
35
+ depends_on:${config.includeRedis ? `
36
+ - redis` : ''}
34
37
  `;
35
38
  switch (config.database) {
36
39
  case 'postgresql':
@@ -51,8 +54,21 @@ services:
51
54
  networks:
52
55
  - backend
53
56
 
57
+ volumes:
58
+ postgres_data:${config.includeRedis ? `
59
+
60
+ redis:
61
+ image: redis:7-alpine
62
+ ports:
63
+ - "6379:6379"
64
+ volumes:
65
+ - redis_data:/data
66
+ networks:
67
+ - backend
68
+
54
69
  volumes:
55
70
  postgres_data:
71
+ redis_data:` : ''}
56
72
 
57
73
  networks:
58
74
  backend:
@@ -77,8 +93,21 @@ networks:
77
93
  networks:
78
94
  - backend
79
95
 
96
+ volumes:
97
+ mysql_data:${config.includeRedis ? `
98
+
99
+ redis:
100
+ image: redis:7-alpine
101
+ ports:
102
+ - "6379:6379"
103
+ volumes:
104
+ - redis_data:/data
105
+ networks:
106
+ - backend
107
+
80
108
  volumes:
81
109
  mysql_data:
110
+ redis_data:` : ''}
82
111
 
83
112
  networks:
84
113
  backend:
@@ -98,21 +127,49 @@ networks:
98
127
  networks:
99
128
  - backend
100
129
 
130
+ volumes:
131
+ mongo_data:${config.includeRedis ? `
132
+
133
+ redis:
134
+ image: redis:7-alpine
135
+ ports:
136
+ - "6379:6379"
137
+ volumes:
138
+ - redis_data:/data
139
+ networks:
140
+ - backend
141
+
101
142
  volumes:
102
143
  mongo_data:
144
+ redis_data:` : ''}
103
145
 
104
146
  networks:
105
147
  backend:
106
148
  `;
107
149
  break;
108
150
  default:
109
- dockerCompose += ` - app
151
+ dockerCompose += `${config.includeRedis ? ` - redis
152
+ ` : ''} networks:
153
+ - backend
154
+ ${config.includeRedis ? `
155
+ redis:
156
+ image: redis:7-alpine
157
+ ports:
158
+ - "6379:6379"
159
+ volumes:
160
+ - redis_data:/data
110
161
  networks:
111
162
  - backend
112
163
 
164
+ volumes:
165
+ redis_data:
166
+
113
167
  networks:
114
168
  backend:
115
- `;
169
+ ` : `
170
+ networks:
171
+ backend:
172
+ `}`;
116
173
  }
117
174
  await fs.writeFile(path.join(projectPath, 'docker-compose.yml'), dockerCompose);
118
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/generators/docker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB,EACnB,MAAqB;IAErB,aAAa;IACb,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;CAepB,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;IAErE,qBAAqB;IACrB,IAAI,aAAa,GAAG;;;;;;;;;;;CAWrB,CAAC;IAEA,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,YAAY;YACf,aAAa,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBtB,CAAC;YACI,MAAM;QACR,KAAK,OAAO;YACV,aAAa,IAAI;;;;;;;;;;;;;;;;;;;;;;;CAuBtB,CAAC;YACI,MAAM;QACR,KAAK,SAAS;YACZ,aAAa,IAAI;;;;;;;;;;;;;;;;;;CAkBtB,CAAC;YACI,MAAM;QACR;YACE,aAAa,IAAI;;;;;;CAMtB,CAAC;IACA,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,EAC5C,aAAa,CACd,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/generators/docker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB,EACnB,MAAqB;IAErB,aAAa;IACb,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;CAepB,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;IAErE,qBAAqB;IACrB,IAAI,aAAa,GAAG;;;;;;;;;uCASiB,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;;wBAErC,CAAC,CAAC,CAAC,EAAE;iBACZ,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;cACzB,CAAC,CAAC,CAAC,EAAE;CAClB,CAAC;IAEA,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,YAAY;YACf,aAAa,IAAI;;;;;;;;;;;;;;;;;;kBAkBL,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;;;;;;;;;;;;;cAa1B,CAAC,CAAC,CAAC,EAAE;;;;CAIlB,CAAC;YACI,MAAM;QACR,KAAK,OAAO;YACV,aAAa,IAAI;;;;;;;;;;;;;;;;;;;eAmBR,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;;;;;;;;;;;;;cAavB,CAAC,CAAC,CAAC,EAAE;;;;CAIlB,CAAC;YACI,MAAM;QACR,KAAK,SAAS;YACZ,aAAa,IAAI;;;;;;;;;;;;;;eAcR,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;;;;;;;;;;;;;cAavB,CAAC,CAAC,CAAC,EAAE;;;;CAIlB,CAAC;YACI,MAAM;QACR;YACE,aAAa,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;CAC/C,CAAC,CAAC,CAAC,EAAE;;EAEJ,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;CAevB,CAAC,CAAC,CAAC;;;CAGH,EAAE,CAAC;IACF,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,EAC5C,aAAa,CACd,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"envExample.d.ts","sourceRoot":"","sources":["../../src/generators/envExample.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
1
+ {"version":3,"file":"envExample.d.ts","sourceRoot":"","sources":["../../src/generators/envExample.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CA6Ef"}
@@ -43,6 +43,32 @@ APP_URL=http://localhost:3000
43
43
  RATE_LIMIT_WINDOW_MS=900000
44
44
  RATE_LIMIT_MAX=100
45
45
  `;
46
+ if (config.includeFileUpload) {
47
+ envContent += `
48
+ # File Upload
49
+ MAX_FILE_SIZE=5242880
50
+ ALLOWED_FILE_TYPES=image/jpeg,image/png,image/gif,application/pdf
51
+ UPLOAD_DIR=uploads
52
+ `;
53
+ if (config.fileStorage === 's3') {
54
+ envContent += `
55
+ # AWS S3 (if using S3 storage)
56
+ AWS_REGION=us-east-1
57
+ AWS_ACCESS_KEY_ID=your-access-key-id
58
+ AWS_SECRET_ACCESS_KEY=your-secret-access-key
59
+ AWS_S3_BUCKET=your-bucket-name
60
+ `;
61
+ }
62
+ }
63
+ if (config.includeRedis) {
64
+ envContent += `
65
+ # Redis
66
+ REDIS_HOST=localhost
67
+ REDIS_PORT=6379
68
+ REDIS_PASSWORD=
69
+ REDIS_DB=0
70
+ `;
71
+ }
46
72
  await fs.writeFile(path.join(projectPath, '.env.example'), envContent);
47
73
  }
48
74
  //# sourceMappingURL=envExample.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"envExample.js","sourceRoot":"","sources":["../../src/generators/envExample.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB,EACnB,MAAqB;IAErB,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,YAAY;YACf,WAAW,GAAG,gDAAgD,CAAC;YAC/D,MAAM;QACR,KAAK,OAAO;YACV,WAAW,GAAG,2CAA2C,CAAC;YAC1D,MAAM;QACR,KAAK,SAAS;YACZ,WAAW,GAAG,gCAAgC,CAAC;YAC/C,MAAM;QACR,KAAK,QAAQ;YACX,WAAW,GAAG,eAAe,CAAC;YAC9B,MAAM;IACV,CAAC;IAED,IAAI,UAAU,GAAG;;;;gBAIH,WAAW;CAC1B,CAAC;IAEA,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,UAAU,IAAI;;;;;;;;;;;;;CAajB,CAAC;IACA,CAAC;IAED,UAAU,IAAI;;;;CAIf,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;AACzE,CAAC"}
1
+ {"version":3,"file":"envExample.js","sourceRoot":"","sources":["../../src/generators/envExample.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB,EACnB,MAAqB;IAErB,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,YAAY;YACf,WAAW,GAAG,gDAAgD,CAAC;YAC/D,MAAM;QACR,KAAK,OAAO;YACV,WAAW,GAAG,2CAA2C,CAAC;YAC1D,MAAM;QACR,KAAK,SAAS;YACZ,WAAW,GAAG,gCAAgC,CAAC;YAC/C,MAAM;QACR,KAAK,QAAQ;YACX,WAAW,GAAG,eAAe,CAAC;YAC9B,MAAM;IACV,CAAC;IAED,IAAI,UAAU,GAAG;;;;gBAIH,WAAW;CAC1B,CAAC;IAEA,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,UAAU,IAAI;;;;;;;;;;;;;CAajB,CAAC;IACA,CAAC;IAED,UAAU,IAAI;;;;CAIf,CAAC;IAEA,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,UAAU,IAAI;;;;;CAKjB,CAAC;QACE,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAChC,UAAU,IAAI;;;;;;CAMnB,CAAC;QACE,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,UAAU,IAAI;;;;;;CAMjB,CAAC;IACA,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;AACzE,CAAC"}
@@ -7,7 +7,7 @@ import { generatePrettierConfig } from './prettier.js';
7
7
  import { generateJestConfig } from './jest.js';
8
8
  import { generateDockerFiles } from './docker.js';
9
9
  import { generatePrismaSchema } from './prisma.js';
10
- import { generateSourceFiles } from './sourceFiles.js';
10
+ import { generateSourceFiles } from './sourceFiles/index.js';
11
11
  import { generateGitHubActions } from './githubActions.js';
12
12
  import { generateCursorRules } from './cursorRules.js';
13
13
  export async function generateProjectFiles(projectPath, config) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAIvD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,MAAqB;IAErB,aAAa;IACb,MAAM,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACpC,MAAM,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEvC,SAAS;IACT,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,MAAM,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,SAAS;IACT,MAAM,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEhD,eAAe;IACf,MAAM,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE/C,iBAAiB;IACjB,MAAM,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAIvD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,MAAqB;IAErB,aAAa;IACb,MAAM,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACpC,MAAM,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEvC,SAAS;IACT,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,MAAM,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,SAAS;IACT,MAAM,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEhD,eAAe;IACf,MAAM,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE/C,iBAAiB;IACjB,MAAM,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACnD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"packageJson.d.ts","sourceRoot":"","sources":["../../src/generators/packageJson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAkFf"}
1
+ {"version":3,"file":"packageJson.d.ts","sourceRoot":"","sources":["../../src/generators/packageJson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAyHf"}
@@ -19,6 +19,25 @@ export async function generatePackageJson(projectPath, config) {
19
19
  dependencies['bcrypt'] = '^5.1.1';
20
20
  dependencies['nodemailer'] = '^6.9.8';
21
21
  }
22
+ if (config.includeFileUpload) {
23
+ dependencies['multer'] = '^1.4.5-lts.1';
24
+ if (config.fileStorage === 's3') {
25
+ dependencies['@aws-sdk/client-s3'] = '^3.700.0';
26
+ dependencies['multer-s3'] = '^3.0.1';
27
+ }
28
+ }
29
+ if (config.includeRedis) {
30
+ dependencies['ioredis'] = '^5.4.1';
31
+ if (config.includeQueue) {
32
+ dependencies['bull'] = '^4.12.9';
33
+ dependencies['@bull-board/api'] = '^5.18.0';
34
+ dependencies['@bull-board/express'] = '^5.18.0';
35
+ }
36
+ }
37
+ // Add node-cron for scheduled tasks
38
+ dependencies['node-cron'] = '^3.0.3';
39
+ // Add commander for CLI commands
40
+ dependencies['commander'] = '^12.1.0';
22
41
  const devDependencies = {
23
42
  '@types/express': '^4.17.25',
24
43
  '@types/cors': '^2.8.19',
@@ -27,6 +46,9 @@ export async function generatePackageJson(projectPath, config) {
27
46
  '@types/jsonwebtoken': '^9.0.10',
28
47
  '@types/bcrypt': '^5.0.2',
29
48
  '@types/nodemailer': '^6.4.14',
49
+ '@types/multer': '^1.4.12',
50
+ '@types/node-cron': '^3.0.11',
51
+ '@types/commander': '^2.15.2',
30
52
  '@types/swagger-jsdoc': '^6.0.4',
31
53
  '@types/swagger-ui-express': '^4.1.8',
32
54
  '@types/jest': '^29.5.14',
@@ -47,6 +69,9 @@ export async function generatePackageJson(projectPath, config) {
47
69
  version: '1.0.0',
48
70
  description: 'Production-ready backend API',
49
71
  main: 'dist/index.js',
72
+ prisma: {
73
+ seed: 'tsx prisma/seed.ts',
74
+ },
50
75
  scripts: {
51
76
  dev: 'tsx watch src/index.ts',
52
77
  build: 'tsc',
@@ -61,6 +86,17 @@ export async function generatePackageJson(projectPath, config) {
61
86
  'db:migrate': 'prisma migrate dev',
62
87
  'db:studio': 'prisma studio',
63
88
  'db:generate': 'prisma generate',
89
+ 'db:seed': 'tsx prisma/seed.ts',
90
+ 'make:controller': 'tsx scripts/make.ts controller',
91
+ 'make:service': 'tsx scripts/make.ts service',
92
+ 'make:repository': 'tsx scripts/make.ts repository',
93
+ 'make:route': 'tsx scripts/make.ts route',
94
+ 'cli': 'tsx scripts/commands/index.ts',
95
+ 'cache:clear': 'tsx scripts/commands/index.ts cache:clear',
96
+ 'queue:work': 'tsx scripts/commands/index.ts queue:work',
97
+ ...(config.includeQueue && {
98
+ 'queue:dashboard': 'tsx src/queue/dashboard.ts',
99
+ }),
64
100
  ...(config.includeDocker && {
65
101
  'docker:up': 'docker-compose up -d',
66
102
  'docker:down': 'docker-compose down',
@@ -1 +1 @@
1
- {"version":3,"file":"packageJson.js","sourceRoot":"","sources":["../../src/generators/packageJson.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB,EACnB,MAAqB;IAErB,MAAM,YAAY,GAA2B;QAC3C,OAAO,EAAE,SAAS;QAClB,oBAAoB,EAAE,QAAQ;QAC9B,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,QAAQ;QACrB,MAAM,EAAE,SAAS;QACjB,GAAG,EAAE,UAAU;QACf,OAAO,EAAE,SAAS;QAClB,gBAAgB,EAAE,SAAS;QAC3B,eAAe,EAAE,QAAQ;QACzB,oBAAoB,EAAE,QAAQ;KAC/B,CAAC;IAEF,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,YAAY,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC;QACxC,YAAY,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;QAClC,YAAY,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED,MAAM,eAAe,GAA2B;QAC9C,gBAAgB,EAAE,UAAU;QAC5B,aAAa,EAAE,SAAS;QACxB,oBAAoB,EAAE,QAAQ;QAC9B,aAAa,EAAE,WAAW;QAC1B,qBAAqB,EAAE,SAAS;QAChC,eAAe,EAAE,QAAQ;QACzB,mBAAmB,EAAE,SAAS;QAC9B,sBAAsB,EAAE,QAAQ;QAChC,2BAA2B,EAAE,QAAQ;QACrC,aAAa,EAAE,UAAU;QACzB,kBAAkB,EAAE,QAAQ;QAC5B,mBAAmB,EAAE,SAAS;QAC9B,YAAY,EAAE,SAAS;QACvB,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,SAAS;QACpB,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,QAAQ;QACnB,GAAG,EAAE,SAAS;QACd,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,SAAS;KAClB,CAAC;IAEF,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,MAAM,CAAC,WAAW;QACxB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,8BAA8B;QAC3C,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE;YACP,GAAG,EAAE,wBAAwB;YAC7B,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,oBAAoB;YAC3B,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,kBAAkB;YAC9B,MAAM,EAAE,gCAAgC;YACxC,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,cAAc;YAC5B,eAAe,EAAE,iBAAiB;YAClC,SAAS,EAAE,gBAAgB;YAC3B,YAAY,EAAE,oBAAoB;YAClC,WAAW,EAAE,eAAe;YAC5B,aAAa,EAAE,iBAAiB;YAChC,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI;gBAC1B,WAAW,EAAE,sBAAsB;gBACnC,aAAa,EAAE,qBAAqB;aACrC,CAAC;SACH;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC;QACrD,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,KAAK;QACd,YAAY;QACZ,eAAe;QACf,OAAO,EAAE;YACP,IAAI,EAAE,UAAU;SACjB;KACF,CAAC;IAEF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,WAAW,EAAE;QACtE,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"packageJson.js","sourceRoot":"","sources":["../../src/generators/packageJson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ProjectConfig } from '../../../types.js';
2
+ export declare function generateControllers(controllersDir: string, config: ProjectConfig): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/generators/sourceFiles/controllers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIlD,wBAAsB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAwJtG"}
@@ -0,0 +1,147 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ export async function generateControllers(controllersDir, config) {
4
+ // health.controller.ts
5
+ const healthControllerContent = `import { Request, Response } from 'express';
6
+
7
+ export const healthController = {
8
+ check: (_req: Request, res: Response) => {
9
+ res.json({
10
+ status: 'ok',
11
+ timestamp: new Date().toISOString(),
12
+ });
13
+ },
14
+ };
15
+ `;
16
+ await fs.writeFile(path.join(controllersDir, 'health.controller.ts'), healthControllerContent);
17
+ if (config.includeAuth) {
18
+ // auth.controller.ts
19
+ const authControllerContent = `import { Response } from 'express';
20
+ import { AuthRequest } from '../middlewares/auth.js';
21
+ import { authService } from '../services/auth.service.js';
22
+ import { AppError } from '../middlewares/errorHandler.js';
23
+
24
+ export const authController = {
25
+ register: async (req: AuthRequest, res: Response) => {
26
+ try {
27
+ const { email, password, name } = req.body;
28
+ const user = await authService.register(email, password, name);
29
+ res.status(201).json({
30
+ status: 'success',
31
+ data: user,
32
+ });
33
+ } catch (error) {
34
+ if (error instanceof AppError) {
35
+ throw error;
36
+ }
37
+ throw new AppError(500, 'Failed to register user');
38
+ }
39
+ },
40
+
41
+ login: async (req: AuthRequest, res: Response) => {
42
+ try {
43
+ const { email, password } = req.body;
44
+ const result = await authService.login(email, password);
45
+ res.json({
46
+ status: 'success',
47
+ data: result,
48
+ });
49
+ } catch (error) {
50
+ if (error instanceof AppError) {
51
+ throw error;
52
+ }
53
+ throw new AppError(500, 'Failed to login');
54
+ }
55
+ },
56
+
57
+ me: async (req: AuthRequest, res: Response) => {
58
+ try {
59
+ const user = await authService.getUserById(req.user!.id);
60
+ res.json({
61
+ status: 'success',
62
+ data: user,
63
+ });
64
+ } catch (error) {
65
+ if (error instanceof AppError) {
66
+ throw error;
67
+ }
68
+ throw new AppError(500, 'Failed to get user');
69
+ }
70
+ },
71
+
72
+ verifyEmail: async (req: AuthRequest, res: Response) => {
73
+ try {
74
+ const { token } = req.query;
75
+ if (!token || typeof token !== 'string') {
76
+ throw new AppError(400, 'Verification token is required');
77
+ }
78
+ const result = await authService.verifyEmail(token);
79
+ res.json({
80
+ status: 'success',
81
+ data: result,
82
+ });
83
+ } catch (error) {
84
+ if (error instanceof AppError) {
85
+ throw error;
86
+ }
87
+ throw new AppError(500, 'Failed to verify email');
88
+ }
89
+ },
90
+
91
+ resendVerification: async (req: AuthRequest, res: Response) => {
92
+ try {
93
+ const { email } = req.body;
94
+ const result = await authService.resendVerificationEmail(email);
95
+ res.json({
96
+ status: 'success',
97
+ data: result,
98
+ });
99
+ } catch (error) {
100
+ if (error instanceof AppError) {
101
+ throw error;
102
+ }
103
+ throw new AppError(500, 'Failed to resend verification email');
104
+ }
105
+ },
106
+
107
+ forgotPassword: async (req: AuthRequest, res: Response) => {
108
+ try {
109
+ const { email } = req.body;
110
+ const result = await authService.requestPasswordReset(email);
111
+ res.json({
112
+ status: 'success',
113
+ data: result,
114
+ });
115
+ } catch (error) {
116
+ if (error instanceof AppError) {
117
+ throw error;
118
+ }
119
+ throw new AppError(500, 'Failed to send password reset email');
120
+ }
121
+ },
122
+
123
+ resetPassword: async (req: AuthRequest, res: Response) => {
124
+ try {
125
+ const { token } = req.query;
126
+ const { password } = req.body;
127
+ if (!token || typeof token !== 'string') {
128
+ throw new AppError(400, 'Reset token is required');
129
+ }
130
+ const result = await authService.resetPassword(token, password);
131
+ res.json({
132
+ status: 'success',
133
+ data: result,
134
+ });
135
+ } catch (error) {
136
+ if (error instanceof AppError) {
137
+ throw error;
138
+ }
139
+ throw new AppError(500, 'Failed to reset password');
140
+ }
141
+ },
142
+ };
143
+ `;
144
+ await fs.writeFile(path.join(controllersDir, 'auth.controller.ts'), authControllerContent);
145
+ }
146
+ }
147
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/generators/sourceFiles/controllers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,cAAsB,EAAE,MAAqB;IACrF,uBAAuB;IACvB,MAAM,uBAAuB,GAAG;;;;;;;;;;CAUjC,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,sBAAsB,CAAC,EACjD,uBAAuB,CACxB,CAAC;IAEF,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,qBAAqB;QACrB,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4HjC,CAAC;QAEE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,oBAAoB,CAAC,EAC/C,qBAAqB,CACtB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ProjectConfig } from '../../../types.js';
2
+ export declare function generateConfigFiles(configDir: string, config: ProjectConfig): Promise<void>;
3
+ //# sourceMappingURL=configFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configFiles.d.ts","sourceRoot":"","sources":["../../../../src/generators/sourceFiles/core/configFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIlD,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAyJjG"}
@@ -0,0 +1,148 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ export async function generateConfigFiles(configDir, config) {
4
+ // env.ts
5
+ const envContent = `import { z } from 'zod';
6
+ import dotenv from 'dotenv';
7
+
8
+ dotenv.config();
9
+
10
+ const envSchema = z.object({
11
+ NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
12
+ PORT: z.coerce.number().default(3000),
13
+ DATABASE_URL: z.string(),
14
+ ${config.includeAuth ? ` JWT_SECRET: z.string(),
15
+ JWT_EXPIRES_IN: z.string().default('7d'),
16
+ EMAIL_HOST: z.string().optional(),
17
+ EMAIL_PORT: z.coerce.number().optional(),
18
+ EMAIL_SECURE: z.coerce.boolean().default(false),
19
+ EMAIL_USER: z.string().optional(),
20
+ EMAIL_PASSWORD: z.string().optional(),
21
+ EMAIL_FROM: z.string().default('noreply@coreback.app'),
22
+ APP_URL: z.string().default('http://localhost:3000'),` : ''}${config.includeFileUpload ? `
23
+ MAX_FILE_SIZE: z.coerce.number().default(5242880),
24
+ ALLOWED_FILE_TYPES: z.string().default('image/jpeg,image/png,image/gif,application/pdf'),
25
+ UPLOAD_DIR: z.string().default('uploads'),${config.fileStorage === 's3' ? `
26
+ AWS_REGION: z.string().default('us-east-1'),
27
+ AWS_ACCESS_KEY_ID: z.string().optional(),
28
+ AWS_SECRET_ACCESS_KEY: z.string().optional(),
29
+ AWS_S3_BUCKET: z.string().optional(),` : ''}` : ''}${config.includeRedis ? `
30
+ REDIS_HOST: z.string().default('localhost'),
31
+ REDIS_PORT: z.coerce.number().default(6379),
32
+ REDIS_PASSWORD: z.string().optional(),
33
+ REDIS_DB: z.coerce.number().default(0),` : ''}
34
+ RATE_LIMIT_WINDOW_MS: z.coerce.number().default(900000),
35
+ RATE_LIMIT_MAX: z.coerce.number().default(100),
36
+ });
37
+
38
+ export const config = envSchema.parse(process.env);
39
+ `;
40
+ await fs.writeFile(path.join(configDir, 'env.ts'), envContent);
41
+ // database.ts
42
+ const databaseContent = `import { PrismaClient } from '@prisma/client';
43
+ import { logger } from '../utils/logger.js';
44
+
45
+ const prisma = new PrismaClient({
46
+ log: [
47
+ { level: 'query', emit: 'event' },
48
+ { level: 'error', emit: 'stdout' },
49
+ { level: 'warn', emit: 'stdout' },
50
+ ],
51
+ });
52
+
53
+ prisma.$on('query', (e) => {
54
+ logger.debug('Query: ' + e.query);
55
+ logger.debug('Params: ' + e.params);
56
+ logger.debug('Duration: ' + e.duration + 'ms');
57
+ });
58
+
59
+ export { prisma };
60
+ `;
61
+ await fs.writeFile(path.join(configDir, 'database.ts'), databaseContent);
62
+ // middlewares.ts
63
+ const middlewaresContent = `import express, { Express } from 'express';
64
+ import cors from 'cors';
65
+ import helmet from 'helmet';
66
+ import compression from 'compression';
67
+ import rateLimit from 'express-rate-limit';
68
+ import { config } from './env.js';
69
+
70
+ export function setupMiddlewares(app: Express): void {
71
+ app.use(helmet());
72
+ app.use(cors());
73
+ app.use(compression());
74
+ app.use(express.json());
75
+ app.use(express.urlencoded({ extended: true }));
76
+
77
+ const limiter = rateLimit({
78
+ windowMs: config.RATE_LIMIT_WINDOW_MS,
79
+ max: config.RATE_LIMIT_MAX,
80
+ message: 'Too many requests from this IP, please try again later.',
81
+ });
82
+
83
+ app.use('/api/', limiter);
84
+ }
85
+ `;
86
+ await fs.writeFile(path.join(configDir, 'middlewares.ts'), middlewaresContent);
87
+ // swagger.ts
88
+ const swaggerContent = `import { Express } from 'express';
89
+ import swaggerJsdoc from 'swagger-jsdoc';
90
+ import swaggerUi from 'swagger-ui-express';
91
+ import { config } from './env.js';
92
+
93
+ const options: swaggerJsdoc.Options = {
94
+ definition: {
95
+ openapi: '3.0.0',
96
+ info: {
97
+ title: 'CoreBack API',
98
+ version: '1.0.0',
99
+ description: 'Production-ready backend API',
100
+ },
101
+ servers: [
102
+ {
103
+ url: \`http://localhost:\\\${config.PORT}\`,
104
+ description: 'Development server',
105
+ },
106
+ ],
107
+ },
108
+ apis: ['./src/routes/**/*.ts', './src/controllers/**/*.ts'],
109
+ };
110
+
111
+ const swaggerSpec = swaggerJsdoc(options);
112
+
113
+ export function setupSwagger(app: Express): void {
114
+ app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
115
+ }
116
+ `;
117
+ await fs.writeFile(path.join(configDir, 'swagger.ts'), swaggerContent);
118
+ if (config.includeRedis) {
119
+ // redis.ts
120
+ const redisContent = `import Redis from 'ioredis';
121
+ import { config } from './env.js';
122
+ import { logger } from '../utils/logger.js';
123
+
124
+ const redis = new Redis({
125
+ host: config.REDIS_HOST,
126
+ port: config.REDIS_PORT,
127
+ password: config.REDIS_PASSWORD || undefined,
128
+ db: config.REDIS_DB,
129
+ retryStrategy: (times) => {
130
+ const delay = Math.min(times * 50, 2000);
131
+ return delay;
132
+ },
133
+ });
134
+
135
+ redis.on('connect', () => {
136
+ logger.info('✅ Redis connected');
137
+ });
138
+
139
+ redis.on('error', (err) => {
140
+ logger.error('❌ Redis connection error:', err);
141
+ });
142
+
143
+ export { redis };
144
+ `;
145
+ await fs.writeFile(path.join(configDir, 'redis.ts'), redisContent);
146
+ }
147
+ }
148
+ //# sourceMappingURL=configFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configFiles.js","sourceRoot":"","sources":["../../../../src/generators/sourceFiles/core/configFiles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB,EAAE,MAAqB;IAChF,SAAS;IACT,MAAM,UAAU,GAAG;;;;;;;;;EASnB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;;;;;;;;wDAQiC,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;;;8CAG7C,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC;;;;wCAIpC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;;;;0CAInC,CAAC,CAAC,CAAC,EAAE;;;;;;CAM9C,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IAE/D,cAAc;IACd,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;CAkBzB,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,eAAe,CAAC,CAAC;IAEzE,iBAAiB;IACjB,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsB5B,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAE/E,aAAa;IACb,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BxB,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,cAAc,CAAC,CAAC;IAEvE,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,WAAW;QACX,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBxB,CAAC;QAEE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ProjectConfig } from '../../../types.js';
2
+ export declare function generateCoreFiles(srcDir: string, configDir: string, middlewaresDir: string, utilsDir: string, routesDir: string, typesDir: string, validatorsDir: string, config: ProjectConfig): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/generators/sourceFiles/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AASlD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAQf"}