nodejs-quickstart-structure 1.18.1 → 1.19.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 (235) hide show
  1. package/CHANGELOG.md +309 -294
  2. package/LICENSE +15 -15
  3. package/README.md +2 -1
  4. package/lib/generator.js +139 -139
  5. package/lib/modules/app-setup.js +401 -401
  6. package/lib/modules/caching-setup.js +76 -73
  7. package/lib/modules/config-files.js +151 -151
  8. package/lib/modules/database-setup.js +116 -116
  9. package/lib/modules/kafka-setup.js +249 -191
  10. package/lib/modules/project-setup.js +32 -31
  11. package/lib/prompts.js +100 -100
  12. package/package.json +78 -67
  13. package/templates/clean-architecture/js/src/domain/models/User.js +9 -9
  14. package/templates/clean-architecture/js/src/errors/ApiError.js +14 -14
  15. package/templates/clean-architecture/js/src/errors/BadRequestError.js +11 -10
  16. package/templates/clean-architecture/js/src/errors/BadRequestError.spec.js.ejs +22 -21
  17. package/templates/clean-architecture/js/src/errors/NotFoundError.js +11 -10
  18. package/templates/clean-architecture/js/src/errors/NotFoundError.spec.js.ejs +22 -21
  19. package/templates/clean-architecture/js/src/index.js.ejs +55 -55
  20. package/templates/clean-architecture/js/src/infrastructure/config/env.js.ejs +47 -47
  21. package/templates/clean-architecture/js/src/infrastructure/log/logger.js +36 -36
  22. package/templates/clean-architecture/js/src/infrastructure/log/logger.spec.js.ejs +63 -63
  23. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.js.ejs +69 -39
  24. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.spec.js.ejs +142 -81
  25. package/templates/clean-architecture/js/src/infrastructure/webserver/middleware/errorMiddleware.js +30 -30
  26. package/templates/clean-architecture/js/src/infrastructure/webserver/server.js.ejs +89 -89
  27. package/templates/clean-architecture/js/src/infrastructure/webserver/swagger.js.ejs +6 -6
  28. package/templates/clean-architecture/js/src/interfaces/controllers/userController.js.ejs +156 -75
  29. package/templates/clean-architecture/js/src/interfaces/controllers/userController.spec.js.ejs +234 -138
  30. package/templates/clean-architecture/js/src/interfaces/graphql/context.js.ejs +13 -13
  31. package/templates/clean-architecture/js/src/interfaces/graphql/context.spec.js.ejs +31 -31
  32. package/templates/clean-architecture/js/src/interfaces/graphql/index.js.ejs +5 -5
  33. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/index.js.ejs +6 -6
  34. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.js.ejs +27 -21
  35. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.spec.js.ejs +66 -49
  36. package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/index.js.ejs +6 -6
  37. package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/user.types.js.ejs +19 -17
  38. package/templates/clean-architecture/js/src/interfaces/routes/api.js +12 -10
  39. package/templates/clean-architecture/js/src/interfaces/routes/api.spec.js.ejs +38 -38
  40. package/templates/clean-architecture/js/src/usecases/CreateUser.js +14 -14
  41. package/templates/clean-architecture/js/src/usecases/CreateUser.spec.js.ejs +51 -51
  42. package/templates/clean-architecture/js/src/usecases/DeleteUser.js +11 -0
  43. package/templates/clean-architecture/js/src/usecases/DeleteUser.spec.js.ejs +47 -0
  44. package/templates/clean-architecture/js/src/usecases/GetAllUsers.js +12 -12
  45. package/templates/clean-architecture/js/src/usecases/GetAllUsers.spec.js.ejs +61 -61
  46. package/templates/clean-architecture/js/src/usecases/UpdateUser.js +11 -0
  47. package/templates/clean-architecture/js/src/usecases/UpdateUser.spec.js.ejs +48 -0
  48. package/templates/clean-architecture/js/src/utils/errorMessages.js +14 -0
  49. package/templates/clean-architecture/js/src/utils/httpCodes.js +9 -9
  50. package/templates/clean-architecture/ts/src/config/env.ts.ejs +46 -46
  51. package/templates/clean-architecture/ts/src/config/swagger.ts.ejs +6 -6
  52. package/templates/clean-architecture/ts/src/domain/user.ts +7 -7
  53. package/templates/clean-architecture/ts/src/errors/ApiError.ts +15 -15
  54. package/templates/clean-architecture/ts/src/errors/BadRequestError.spec.ts.ejs +22 -21
  55. package/templates/clean-architecture/ts/src/errors/BadRequestError.ts +9 -8
  56. package/templates/clean-architecture/ts/src/errors/NotFoundError.spec.ts.ejs +22 -21
  57. package/templates/clean-architecture/ts/src/errors/NotFoundError.ts +9 -8
  58. package/templates/clean-architecture/ts/src/index.ts.ejs +139 -139
  59. package/templates/clean-architecture/ts/src/infrastructure/log/logger.spec.ts.ejs +63 -63
  60. package/templates/clean-architecture/ts/src/infrastructure/log/logger.ts +36 -36
  61. package/templates/clean-architecture/ts/src/infrastructure/repositories/UserRepository.spec.ts.ejs +175 -85
  62. package/templates/clean-architecture/ts/src/infrastructure/repositories/userRepository.ts.ejs +74 -0
  63. package/templates/clean-architecture/ts/src/interfaces/controllers/userController.spec.ts.ejs +331 -185
  64. package/templates/clean-architecture/ts/src/interfaces/controllers/userController.ts.ejs +173 -84
  65. package/templates/clean-architecture/ts/src/interfaces/graphql/context.spec.ts.ejs +32 -32
  66. package/templates/clean-architecture/ts/src/interfaces/graphql/context.ts.ejs +17 -17
  67. package/templates/clean-architecture/ts/src/interfaces/graphql/index.ts.ejs +3 -3
  68. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/index.ts.ejs +4 -4
  69. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.spec.ts.ejs +68 -51
  70. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.ts.ejs +29 -21
  71. package/templates/clean-architecture/ts/src/interfaces/graphql/typeDefs/index.ts.ejs +4 -4
  72. package/templates/clean-architecture/ts/src/interfaces/graphql/typeDefs/user.types.ts.ejs +17 -15
  73. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.spec.ts.ejs +40 -40
  74. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.ts +13 -11
  75. package/templates/clean-architecture/ts/src/usecases/createUser.spec.ts.ejs +51 -51
  76. package/templates/clean-architecture/ts/src/usecases/createUser.ts +13 -13
  77. package/templates/clean-architecture/ts/src/usecases/deleteUser.spec.ts.ejs +47 -0
  78. package/templates/clean-architecture/ts/src/usecases/deleteUser.ts +9 -0
  79. package/templates/clean-architecture/ts/src/usecases/getAllUsers.spec.ts.ejs +63 -63
  80. package/templates/clean-architecture/ts/src/usecases/getAllUsers.ts +10 -10
  81. package/templates/clean-architecture/ts/src/usecases/updateUser.spec.ts.ejs +48 -0
  82. package/templates/clean-architecture/ts/src/usecases/updateUser.ts +9 -0
  83. package/templates/clean-architecture/ts/src/utils/errorMessages.ts +12 -0
  84. package/templates/clean-architecture/ts/src/utils/errorMiddleware.ts.ejs +27 -27
  85. package/templates/clean-architecture/ts/src/utils/httpCodes.ts +7 -7
  86. package/templates/common/.cursorrules.ejs +60 -60
  87. package/templates/common/.dockerignore +12 -12
  88. package/templates/common/.env.example.ejs +41 -41
  89. package/templates/common/.gitattributes +46 -0
  90. package/templates/common/.gitlab-ci.yml.ejs +86 -86
  91. package/templates/common/.lintstagedrc +6 -6
  92. package/templates/common/.prettierrc +7 -7
  93. package/templates/common/Dockerfile +73 -73
  94. package/templates/common/Jenkinsfile.ejs +87 -87
  95. package/templates/common/README.md.ejs +294 -270
  96. package/templates/common/SECURITY.md +20 -20
  97. package/templates/common/_github/workflows/ci.yml.ejs +46 -46
  98. package/templates/common/_github/workflows/security.yml.ejs +36 -36
  99. package/templates/common/_gitignore +5 -5
  100. package/templates/common/_husky/pre-commit +4 -4
  101. package/templates/common/caching/clean/js/CreateUser.js.ejs +29 -29
  102. package/templates/common/caching/clean/js/DeleteUser.js.ejs +27 -0
  103. package/templates/common/caching/clean/js/GetAllUsers.js.ejs +37 -37
  104. package/templates/common/caching/clean/js/UpdateUser.js.ejs +27 -0
  105. package/templates/common/caching/clean/ts/createUser.ts.ejs +27 -27
  106. package/templates/common/caching/clean/ts/deleteUser.ts.ejs +24 -0
  107. package/templates/common/caching/clean/ts/getAllUsers.ts.ejs +34 -34
  108. package/templates/common/caching/clean/ts/updateUser.ts.ejs +25 -0
  109. package/templates/common/caching/js/memoryCache.js.ejs +60 -60
  110. package/templates/common/caching/js/memoryCache.spec.js.ejs +101 -101
  111. package/templates/common/caching/js/redisClient.js.ejs +75 -75
  112. package/templates/common/caching/js/redisClient.spec.js.ejs +147 -147
  113. package/templates/common/caching/ts/memoryCache.spec.ts.ejs +102 -102
  114. package/templates/common/caching/ts/memoryCache.ts.ejs +73 -64
  115. package/templates/common/caching/ts/redisClient.spec.ts.ejs +157 -157
  116. package/templates/common/caching/ts/redisClient.ts.ejs +89 -80
  117. package/templates/common/database/js/database.js.ejs +19 -19
  118. package/templates/common/database/js/database.spec.js.ejs +56 -56
  119. package/templates/common/database/js/models/User.js.ejs +79 -53
  120. package/templates/common/database/js/models/User.js.mongoose.ejs +23 -19
  121. package/templates/common/database/js/models/User.spec.js.ejs +94 -84
  122. package/templates/common/database/js/mongoose.js.ejs +33 -33
  123. package/templates/common/database/js/mongoose.spec.js.ejs +43 -43
  124. package/templates/common/database/ts/database.spec.ts.ejs +56 -56
  125. package/templates/common/database/ts/database.ts.ejs +21 -21
  126. package/templates/common/database/ts/models/User.spec.ts.ejs +100 -84
  127. package/templates/common/database/ts/models/User.ts.ejs +87 -61
  128. package/templates/common/database/ts/models/User.ts.mongoose.ejs +30 -25
  129. package/templates/common/database/ts/mongoose.spec.ts.ejs +42 -42
  130. package/templates/common/database/ts/mongoose.ts.ejs +28 -28
  131. package/templates/common/docker-compose.yml.ejs +159 -159
  132. package/templates/common/ecosystem.config.js.ejs +40 -40
  133. package/templates/common/eslint.config.mjs.ejs +77 -77
  134. package/templates/common/health/js/healthRoute.js.ejs +50 -47
  135. package/templates/common/health/js/healthRoute.spec.js.ejs +70 -70
  136. package/templates/common/health/ts/healthRoute.spec.ts.ejs +76 -76
  137. package/templates/common/health/ts/healthRoute.ts.ejs +49 -46
  138. package/templates/common/jest.config.js.ejs +32 -32
  139. package/templates/common/jest.e2e.config.js.ejs +8 -8
  140. package/templates/common/kafka/js/config/kafka.js +9 -9
  141. package/templates/common/kafka/js/config/kafka.spec.js.ejs +27 -27
  142. package/templates/common/kafka/js/messaging/baseConsumer.js.ejs +30 -30
  143. package/templates/common/kafka/js/messaging/baseConsumer.spec.js.ejs +58 -58
  144. package/templates/common/kafka/js/messaging/userEventSchema.js.ejs +12 -11
  145. package/templates/common/kafka/js/messaging/userEventSchema.spec.js.ejs +27 -27
  146. package/templates/common/kafka/js/messaging/welcomeEmailConsumer.js.ejs +44 -31
  147. package/templates/common/kafka/js/messaging/welcomeEmailConsumer.spec.js.ejs +86 -49
  148. package/templates/common/kafka/js/services/kafkaService.js.ejs +93 -93
  149. package/templates/common/kafka/js/services/kafkaService.spec.js.ejs +106 -106
  150. package/templates/common/kafka/js/utils/kafkaEvents.js.ejs +7 -0
  151. package/templates/common/kafka/ts/config/kafka.spec.ts.ejs +27 -27
  152. package/templates/common/kafka/ts/config/kafka.ts +7 -7
  153. package/templates/common/kafka/ts/messaging/baseConsumer.spec.ts.ejs +50 -50
  154. package/templates/common/kafka/ts/messaging/baseConsumer.ts.ejs +27 -27
  155. package/templates/common/kafka/ts/messaging/userEventSchema.spec.ts.ejs +51 -51
  156. package/templates/common/kafka/ts/messaging/userEventSchema.ts.ejs +12 -11
  157. package/templates/common/kafka/ts/messaging/welcomeEmailConsumer.spec.ts.ejs +86 -49
  158. package/templates/common/kafka/ts/messaging/welcomeEmailConsumer.ts.ejs +38 -25
  159. package/templates/common/kafka/ts/services/kafkaService.spec.ts.ejs +81 -81
  160. package/templates/common/kafka/ts/services/kafkaService.ts.ejs +95 -95
  161. package/templates/common/kafka/ts/utils/kafkaEvents.ts.ejs +5 -0
  162. package/templates/common/migrate-mongo-config.js.ejs +31 -31
  163. package/templates/common/migrations/init.js.ejs +23 -23
  164. package/templates/common/package.json.ejs +119 -118
  165. package/templates/common/prompts/add-feature.md.ejs +26 -26
  166. package/templates/common/prompts/project-context.md.ejs +43 -43
  167. package/templates/common/prompts/troubleshoot.md.ejs +28 -28
  168. package/templates/common/public/css/style.css +147 -147
  169. package/templates/common/scripts/run-e2e.js.ejs +63 -63
  170. package/templates/common/shutdown/js/gracefulShutdown.js.ejs +65 -61
  171. package/templates/common/shutdown/js/gracefulShutdown.spec.js.ejs +149 -160
  172. package/templates/common/shutdown/ts/gracefulShutdown.spec.ts.ejs +179 -158
  173. package/templates/common/shutdown/ts/gracefulShutdown.ts.ejs +59 -55
  174. package/templates/common/sonar-project.properties.ejs +27 -27
  175. package/templates/common/src/tests/e2e/e2e.users.test.js.ejs +120 -49
  176. package/templates/common/src/tests/e2e/e2e.users.test.ts.ejs +120 -49
  177. package/templates/common/src/utils/errorMiddleware.spec.js.ejs +79 -79
  178. package/templates/common/src/utils/errorMiddleware.spec.ts.ejs +94 -94
  179. package/templates/common/swagger.yml.ejs +118 -66
  180. package/templates/common/tsconfig.json +22 -22
  181. package/templates/common/views/ejs/index.ejs +55 -55
  182. package/templates/common/views/pug/index.pug +40 -40
  183. package/templates/db/mysql/V1__Initial_Setup.sql.ejs +10 -9
  184. package/templates/db/postgres/V1__Initial_Setup.sql.ejs +10 -9
  185. package/templates/mvc/js/src/config/env.js.ejs +46 -46
  186. package/templates/mvc/js/src/config/swagger.js.ejs +6 -6
  187. package/templates/mvc/js/src/controllers/userController.js.ejs +246 -105
  188. package/templates/mvc/js/src/controllers/userController.spec.js.ejs +481 -209
  189. package/templates/mvc/js/src/errors/ApiError.js +14 -14
  190. package/templates/mvc/js/src/errors/BadRequestError.js +11 -10
  191. package/templates/mvc/js/src/errors/BadRequestError.spec.js.ejs +22 -21
  192. package/templates/mvc/js/src/errors/NotFoundError.js +11 -10
  193. package/templates/mvc/js/src/errors/NotFoundError.spec.js.ejs +22 -21
  194. package/templates/mvc/js/src/graphql/context.js.ejs +7 -7
  195. package/templates/mvc/js/src/graphql/context.spec.js.ejs +29 -29
  196. package/templates/mvc/js/src/graphql/index.js.ejs +5 -5
  197. package/templates/mvc/js/src/graphql/resolvers/index.js.ejs +6 -6
  198. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.js.ejs +25 -19
  199. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.spec.js.ejs +64 -47
  200. package/templates/mvc/js/src/graphql/typeDefs/index.js.ejs +6 -6
  201. package/templates/mvc/js/src/graphql/typeDefs/user.types.js.ejs +19 -17
  202. package/templates/mvc/js/src/index.js.ejs +136 -136
  203. package/templates/mvc/js/src/routes/api.js +10 -8
  204. package/templates/mvc/js/src/routes/api.spec.js.ejs +41 -36
  205. package/templates/mvc/js/src/utils/errorMessages.js +14 -0
  206. package/templates/mvc/js/src/utils/errorMiddleware.js +29 -29
  207. package/templates/mvc/js/src/utils/httpCodes.js +9 -9
  208. package/templates/mvc/js/src/utils/logger.js +40 -40
  209. package/templates/mvc/js/src/utils/logger.spec.js.ejs +63 -63
  210. package/templates/mvc/ts/src/config/env.ts.ejs +45 -45
  211. package/templates/mvc/ts/src/config/swagger.ts.ejs +6 -6
  212. package/templates/mvc/ts/src/controllers/userController.spec.ts.ejs +481 -203
  213. package/templates/mvc/ts/src/controllers/userController.ts.ejs +248 -107
  214. package/templates/mvc/ts/src/errors/ApiError.ts +15 -15
  215. package/templates/mvc/ts/src/errors/BadRequestError.spec.ts.ejs +22 -21
  216. package/templates/mvc/ts/src/errors/BadRequestError.ts +9 -8
  217. package/templates/mvc/ts/src/errors/NotFoundError.spec.ts.ejs +27 -21
  218. package/templates/mvc/ts/src/errors/NotFoundError.ts +9 -8
  219. package/templates/mvc/ts/src/graphql/context.spec.ts.ejs +30 -30
  220. package/templates/mvc/ts/src/graphql/context.ts.ejs +12 -12
  221. package/templates/mvc/ts/src/graphql/index.ts.ejs +3 -3
  222. package/templates/mvc/ts/src/graphql/resolvers/index.ts.ejs +4 -4
  223. package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.spec.ts.ejs +68 -51
  224. package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.ts.ejs +29 -21
  225. package/templates/mvc/ts/src/graphql/typeDefs/index.ts.ejs +4 -4
  226. package/templates/mvc/ts/src/graphql/typeDefs/user.types.ts.ejs +17 -15
  227. package/templates/mvc/ts/src/index.ts.ejs +156 -153
  228. package/templates/mvc/ts/src/routes/api.spec.ts.ejs +59 -40
  229. package/templates/mvc/ts/src/routes/api.ts +12 -10
  230. package/templates/mvc/ts/src/utils/errorMessages.ts +12 -0
  231. package/templates/mvc/ts/src/utils/errorMiddleware.ts.ejs +27 -27
  232. package/templates/mvc/ts/src/utils/httpCodes.ts +7 -7
  233. package/templates/mvc/ts/src/utils/logger.spec.ts.ejs +63 -63
  234. package/templates/mvc/ts/src/utils/logger.ts +36 -36
  235. package/templates/clean-architecture/ts/src/infrastructure/repositories/UserRepository.ts.ejs +0 -37
@@ -1,79 +1,79 @@
1
- const { errorMiddleware } = require('<% if (architecture === "MVC") { %>@/utils/errorMiddleware<% } else { %>@/infrastructure/webserver/middleware/errorMiddleware<% } %>');
2
- const { ApiError } = require('@/errors/ApiError');
3
- const HTTP_STATUS = require('@/utils/httpCodes');
4
- const logger = require('<% if (architecture === "MVC") { %>@/utils/logger<% } else { %>@/infrastructure/log/logger<% } %>');
5
-
6
- jest.mock('<% if (architecture === "MVC") { %>@/utils/logger<% } else { %>@/infrastructure/log/logger<% } %>');
7
-
8
- describe('Error Middleware', () => {
9
- let mockRequest;
10
- let mockResponse;
11
- let nextFunction;
12
- const originalEnv = process.env.NODE_ENV;
13
-
14
- beforeEach(() => {
15
- mockRequest = {
16
- originalUrl: '/test',
17
- method: 'GET',
18
- ip: '127.0.0.1'
19
- };
20
- mockResponse = {
21
- status: jest.fn().mockReturnThis(),
22
- json: jest.fn()
23
- };
24
- nextFunction = jest.fn();
25
- jest.clearAllMocks();
26
- });
27
-
28
- afterEach(() => {
29
- process.env.NODE_ENV = originalEnv;
30
- });
31
-
32
- it('should handle standard Error by wrapping it in a 500 ApiError', () => {
33
- const error = new Error('Standard Error');
34
- errorMiddleware(error, mockRequest, mockResponse, nextFunction);
35
-
36
- expect(logger.error).toHaveBeenCalled();
37
- expect(mockResponse.status).toHaveBeenCalledWith(HTTP_STATUS.INTERNAL_SERVER_ERROR);
38
- });
39
-
40
- it('should handle custom ApiError directly', () => {
41
- const customError = new ApiError(HTTP_STATUS.BAD_REQUEST, 'Bad Request Data', true);
42
- errorMiddleware(customError, mockRequest, mockResponse, nextFunction);
43
-
44
- expect(mockResponse.status).toHaveBeenCalledWith(HTTP_STATUS.BAD_REQUEST);
45
- expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
46
- statusCode: HTTP_STATUS.BAD_REQUEST,
47
- message: 'Bad Request Data'
48
- }));
49
- });
50
-
51
- it('should include stack trace in development environment', () => {
52
- process.env.NODE_ENV = 'development';
53
- const error = new Error('Test Error');
54
- errorMiddleware(error, mockRequest, mockResponse, nextFunction);
55
-
56
- expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
57
- stack: expect.any(String)
58
- }));
59
- });
60
-
61
- it('should omit stack trace in production environment', () => {
62
- process.env.NODE_ENV = 'production';
63
- const error = new Error('Test Error');
64
- errorMiddleware(error, mockRequest, mockResponse, nextFunction);
65
-
66
- const jsonArg = mockResponse.json.mock.calls[0][0];
67
- expect(jsonArg.stack).toBeUndefined();
68
- });
69
-
70
- it('should handle error without stack trace', () => {
71
- const { ApiError } = require('@/errors/ApiError');
72
- const customError = new ApiError(500, 'No Stack', false);
73
- delete customError.stack;
74
- errorMiddleware(customError, mockRequest, mockResponse, nextFunction);
75
-
76
- expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('No Stack'));
77
- expect(logger.error).toHaveBeenCalledWith('No stack trace');
78
- });
79
- });
1
+ const { errorMiddleware } = require('<% if (architecture === "MVC") { %>@/utils/errorMiddleware<% } else { %>@/infrastructure/webserver/middleware/errorMiddleware<% } %>');
2
+ const { ApiError } = require('@/errors/ApiError');
3
+ const HTTP_STATUS = require('@/utils/httpCodes');
4
+ const logger = require('<% if (architecture === "MVC") { %>@/utils/logger<% } else { %>@/infrastructure/log/logger<% } %>');
5
+
6
+ jest.mock('<% if (architecture === "MVC") { %>@/utils/logger<% } else { %>@/infrastructure/log/logger<% } %>');
7
+
8
+ describe('Error Middleware', () => {
9
+ let mockRequest;
10
+ let mockResponse;
11
+ let nextFunction;
12
+ const originalEnv = process.env.NODE_ENV;
13
+
14
+ beforeEach(() => {
15
+ mockRequest = {
16
+ originalUrl: '/test',
17
+ method: 'GET',
18
+ ip: '127.0.0.1'
19
+ };
20
+ mockResponse = {
21
+ status: jest.fn().mockReturnThis(),
22
+ json: jest.fn()
23
+ };
24
+ nextFunction = jest.fn();
25
+ jest.clearAllMocks();
26
+ });
27
+
28
+ afterEach(() => {
29
+ process.env.NODE_ENV = originalEnv;
30
+ });
31
+
32
+ it('should handle standard Error by wrapping it in a 500 ApiError', () => {
33
+ const error = new Error('Standard Error');
34
+ errorMiddleware(error, mockRequest, mockResponse, nextFunction);
35
+
36
+ expect(logger.error).toHaveBeenCalled();
37
+ expect(mockResponse.status).toHaveBeenCalledWith(HTTP_STATUS.INTERNAL_SERVER_ERROR);
38
+ });
39
+
40
+ it('should handle custom ApiError directly', () => {
41
+ const customError = new ApiError(HTTP_STATUS.BAD_REQUEST, 'Bad Request Data', true);
42
+ errorMiddleware(customError, mockRequest, mockResponse, nextFunction);
43
+
44
+ expect(mockResponse.status).toHaveBeenCalledWith(HTTP_STATUS.BAD_REQUEST);
45
+ expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
46
+ statusCode: HTTP_STATUS.BAD_REQUEST,
47
+ message: 'Bad Request Data'
48
+ }));
49
+ });
50
+
51
+ it('should include stack trace in development environment', () => {
52
+ process.env.NODE_ENV = 'development';
53
+ const error = new Error('Test Error');
54
+ errorMiddleware(error, mockRequest, mockResponse, nextFunction);
55
+
56
+ expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
57
+ stack: expect.any(String)
58
+ }));
59
+ });
60
+
61
+ it('should omit stack trace in production environment', () => {
62
+ process.env.NODE_ENV = 'production';
63
+ const error = new Error('Test Error');
64
+ errorMiddleware(error, mockRequest, mockResponse, nextFunction);
65
+
66
+ const jsonArg = mockResponse.json.mock.calls[0][0];
67
+ expect(jsonArg.stack).toBeUndefined();
68
+ });
69
+
70
+ it('should handle error without stack trace', () => {
71
+ const { ApiError } = require('@/errors/ApiError');
72
+ const customError = new ApiError(500, 'No Stack', false);
73
+ delete customError.stack;
74
+ errorMiddleware(customError, mockRequest, mockResponse, nextFunction);
75
+
76
+ expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('No Stack'));
77
+ expect(logger.error).toHaveBeenCalledWith('No stack trace');
78
+ });
79
+ });
@@ -1,94 +1,94 @@
1
- import { errorMiddleware } from '<% if (architecture === "MVC" || language === "TypeScript") { %>@/utils/errorMiddleware<% } else { %>@/infrastructure/webserver/middleware/errorMiddleware<% } %>';
2
- import { Request, Response } from 'express';
3
- import { ApiError } from '@/errors/ApiError';
4
- import { HTTP_STATUS } from '@/utils/httpCodes';
5
- import logger from '<% if (architecture === "MVC") { %>@/utils/logger<% } else { %>@/infrastructure/log/logger<% } %>';
6
-
7
- jest.mock('<% if (architecture === "MVC") { %>@/utils/logger<% } else { %>@/infrastructure/log/logger<% } %>');
8
-
9
- describe('Error Middleware', () => {
10
- let mockRequest: Partial<Request>;
11
- let mockResponse: Partial<Response>;
12
- let nextFunction: jest.Mock;
13
- const originalEnv = process.env.NODE_ENV;
14
-
15
- beforeEach(() => {
16
- mockRequest = {
17
- originalUrl: '/test',
18
- method: 'GET',
19
- ip: '127.0.0.1'
20
- };
21
- mockResponse = {
22
- status: jest.fn().mockReturnThis(),
23
- json: jest.fn()
24
- };
25
- nextFunction = jest.fn();
26
- jest.clearAllMocks();
27
- });
28
-
29
- afterEach(() => {
30
- process.env.NODE_ENV = originalEnv;
31
- });
32
-
33
- it('should handle standard Error by wrapping it in a 500 ApiError', () => {
34
- const error = new Error('Standard Error');
35
- errorMiddleware(error, mockRequest as Request, mockResponse as Response, nextFunction);
36
-
37
- expect(logger.error).toHaveBeenCalled();
38
- expect(mockResponse.status).toHaveBeenCalledWith(HTTP_STATUS.INTERNAL_SERVER_ERROR);
39
- expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
40
- statusCode: HTTP_STATUS.INTERNAL_SERVER_ERROR,
41
- message: 'Standard Error'
42
- }));
43
- });
44
-
45
- it('should default to Internal Server Error message if none provided on Error', () => {
46
- const error = new Error();
47
- errorMiddleware(error, mockRequest as Request, mockResponse as Response, nextFunction);
48
-
49
- expect(mockResponse.status).toHaveBeenCalledWith(HTTP_STATUS.INTERNAL_SERVER_ERROR);
50
- expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
51
- message: 'Internal Server Error'
52
- }));
53
- });
54
-
55
- it('should handle custom ApiError directly', () => {
56
- const customError = new ApiError(HTTP_STATUS.BAD_REQUEST, 'Bad Request Data', true);
57
- errorMiddleware(customError, mockRequest as Request, mockResponse as Response, nextFunction);
58
-
59
- expect(logger.error).not.toHaveBeenCalled();
60
- expect(mockResponse.status).toHaveBeenCalledWith(HTTP_STATUS.BAD_REQUEST);
61
- expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
62
- statusCode: HTTP_STATUS.BAD_REQUEST,
63
- message: 'Bad Request Data'
64
- }));
65
- });
66
-
67
- it('should include stack trace in development environment', () => {
68
- process.env.NODE_ENV = 'development';
69
- const error = new Error('Test Error');
70
- errorMiddleware(error, mockRequest as Request, mockResponse as Response, nextFunction);
71
-
72
- expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
73
- stack: expect.any(String)
74
- }));
75
- });
76
-
77
- it('should omit stack trace in production environment', () => {
78
- process.env.NODE_ENV = 'production';
79
- const error = new Error('Test Error');
80
- errorMiddleware(error, mockRequest as Request, mockResponse as Response, nextFunction);
81
-
82
- const jsonArg = (mockResponse.json as jest.Mock).mock.calls[0][0];
83
- expect(jsonArg.stack).toBeUndefined();
84
- });
85
-
86
- it('should handle error without stack trace', () => {
87
- const customError = new ApiError(HTTP_STATUS.INTERNAL_SERVER_ERROR, 'No Stack', false);
88
- delete customError.stack;
89
- errorMiddleware(customError, mockRequest as Request, mockResponse as Response, nextFunction);
90
-
91
- expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('No Stack'));
92
- expect(logger.error).toHaveBeenCalledWith('No stack trace');
93
- });
94
- });
1
+ import { errorMiddleware } from '<% if (architecture === "MVC" || language === "TypeScript") { %>@/utils/errorMiddleware<% } else { %>@/infrastructure/webserver/middleware/errorMiddleware<% } %>';
2
+ import { Request, Response } from 'express';
3
+ import { ApiError } from '@/errors/ApiError';
4
+ import { HTTP_STATUS } from '@/utils/httpCodes';
5
+ import logger from '<% if (architecture === "MVC") { %>@/utils/logger<% } else { %>@/infrastructure/log/logger<% } %>';
6
+
7
+ jest.mock('<% if (architecture === "MVC") { %>@/utils/logger<% } else { %>@/infrastructure/log/logger<% } %>');
8
+
9
+ describe('Error Middleware', () => {
10
+ let mockRequest: Partial<Request>;
11
+ let mockResponse: Partial<Response>;
12
+ let nextFunction: jest.Mock;
13
+ const originalEnv = process.env.NODE_ENV;
14
+
15
+ beforeEach(() => {
16
+ mockRequest = {
17
+ originalUrl: '/test',
18
+ method: 'GET',
19
+ ip: '127.0.0.1'
20
+ };
21
+ mockResponse = {
22
+ status: jest.fn().mockReturnThis(),
23
+ json: jest.fn()
24
+ };
25
+ nextFunction = jest.fn();
26
+ jest.clearAllMocks();
27
+ });
28
+
29
+ afterEach(() => {
30
+ process.env.NODE_ENV = originalEnv;
31
+ });
32
+
33
+ it('should handle standard Error by wrapping it in a 500 ApiError', () => {
34
+ const error = new Error('Standard Error');
35
+ errorMiddleware(error, mockRequest as Request, mockResponse as Response, nextFunction);
36
+
37
+ expect(logger.error).toHaveBeenCalled();
38
+ expect(mockResponse.status).toHaveBeenCalledWith(HTTP_STATUS.INTERNAL_SERVER_ERROR);
39
+ expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
40
+ statusCode: HTTP_STATUS.INTERNAL_SERVER_ERROR,
41
+ message: 'Standard Error'
42
+ }));
43
+ });
44
+
45
+ it('should default to Internal Server Error message if none provided on Error', () => {
46
+ const error = new Error();
47
+ errorMiddleware(error, mockRequest as Request, mockResponse as Response, nextFunction);
48
+
49
+ expect(mockResponse.status).toHaveBeenCalledWith(HTTP_STATUS.INTERNAL_SERVER_ERROR);
50
+ expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
51
+ message: 'Internal Server Error'
52
+ }));
53
+ });
54
+
55
+ it('should handle custom ApiError directly', () => {
56
+ const customError = new ApiError(HTTP_STATUS.BAD_REQUEST, 'Bad Request Data', true);
57
+ errorMiddleware(customError, mockRequest as Request, mockResponse as Response, nextFunction);
58
+
59
+ expect(logger.error).not.toHaveBeenCalled();
60
+ expect(mockResponse.status).toHaveBeenCalledWith(HTTP_STATUS.BAD_REQUEST);
61
+ expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
62
+ statusCode: HTTP_STATUS.BAD_REQUEST,
63
+ message: 'Bad Request Data'
64
+ }));
65
+ });
66
+
67
+ it('should include stack trace in development environment', () => {
68
+ process.env.NODE_ENV = 'development';
69
+ const error = new Error('Test Error');
70
+ errorMiddleware(error, mockRequest as Request, mockResponse as Response, nextFunction);
71
+
72
+ expect(mockResponse.json).toHaveBeenCalledWith(expect.objectContaining({
73
+ stack: expect.any(String)
74
+ }));
75
+ });
76
+
77
+ it('should omit stack trace in production environment', () => {
78
+ process.env.NODE_ENV = 'production';
79
+ const error = new Error('Test Error');
80
+ errorMiddleware(error, mockRequest as Request, mockResponse as Response, nextFunction);
81
+
82
+ const jsonArg = (mockResponse.json as jest.Mock).mock.calls[0][0];
83
+ expect(jsonArg.stack).toBeUndefined();
84
+ });
85
+
86
+ it('should handle error without stack trace', () => {
87
+ const customError = new ApiError(HTTP_STATUS.INTERNAL_SERVER_ERROR, 'No Stack', false);
88
+ delete customError.stack;
89
+ errorMiddleware(customError, mockRequest as Request, mockResponse as Response, nextFunction);
90
+
91
+ expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('No Stack'));
92
+ expect(logger.error).toHaveBeenCalledWith('No stack trace');
93
+ });
94
+ });
@@ -1,66 +1,118 @@
1
- openapi: 3.0.0
2
- info:
3
- title: <%= projectName %> API
4
- version: 1.0.0
5
- description: API documentation for <%= projectName %>
6
- servers:
7
- - url: http://localhost:3000
8
- description: Local Server
9
- components:
10
- schemas:
11
- User:
12
- type: object
13
- required:
14
- - name
15
- - email
16
- properties:
17
- id:
18
- type: integer
19
- description: The auto-generated id of the user
20
- name:
21
- type: string
22
- description: The name of the user
23
- email:
24
- type: string
25
- description: The email of the user
26
- example:
27
- id: 1
28
- name: John Doe
29
- email: john@example.com
30
- tags:
31
- - name: Users
32
- description: The users managing API
33
- paths:
34
- /api/users:
35
- get:
36
- summary: Returns the list of all the users
37
- tags:
38
- - Users
39
- responses:
40
- '200':
41
- description: The list of the users
42
- content:
43
- application/json:
44
- schema:
45
- type: array
46
- items:
47
- $ref: '#/components/schemas/User'
48
- post:
49
- summary: Create a new user
50
- tags:
51
- - Users
52
- requestBody:
53
- required: true
54
- content:
55
- application/json:
56
- schema:
57
- $ref: '#/components/schemas/User'
58
- responses:
59
- '201':
60
- description: The created user.
61
- content:
62
- application/json:
63
- schema:
64
- $ref: '#/components/schemas/User'
65
- '500':
66
- description: Some server error
1
+ openapi: 3.0.0
2
+ info:
3
+ title: <%= projectName %> API
4
+ version: 1.0.0
5
+ description: API documentation for <%= projectName %>
6
+ servers:
7
+ - url: http://localhost:3000
8
+ description: Local Server
9
+ components:
10
+ schemas:
11
+ User:
12
+ type: object
13
+ required:
14
+ - name
15
+ - email
16
+ properties:
17
+ id:
18
+ type: integer
19
+ description: The auto-generated id of the user
20
+ name:
21
+ type: string
22
+ description: The name of the user
23
+ email:
24
+ type: string
25
+ description: The email of the user
26
+ example:
27
+ id: 1
28
+ name: John Doe
29
+ email: john@example.com
30
+ tags:
31
+ - name: Users
32
+ description: The users managing API
33
+ paths:
34
+ /api/users:
35
+ get:
36
+ summary: Returns the list of all the users
37
+ tags:
38
+ - Users
39
+ responses:
40
+ '200':
41
+ description: The list of the users
42
+ content:
43
+ application/json:
44
+ schema:
45
+ type: array
46
+ items:
47
+ $ref: '#/components/schemas/User'
48
+ post:
49
+ summary: Create a new user
50
+ tags:
51
+ - Users
52
+ requestBody:
53
+ required: true
54
+ content:
55
+ application/json:
56
+ schema:
57
+ $ref: '#/components/schemas/User'
58
+ responses:
59
+ '201':
60
+ description: The created user.
61
+ content:
62
+ application/json:
63
+ schema:
64
+ $ref: '#/components/schemas/User'
65
+ '500':
66
+ description: Some server error
67
+ /api/users/{id}:
68
+ patch:
69
+ summary: Update an existing user
70
+ tags:
71
+ - Users
72
+ parameters:
73
+ - in: path
74
+ name: id
75
+ schema:
76
+ type: string
77
+ required: true
78
+ description: The user id
79
+ requestBody:
80
+ required: true
81
+ content:
82
+ application/json:
83
+ schema:
84
+ type: object
85
+ properties:
86
+ name:
87
+ type: string
88
+ email:
89
+ type: string
90
+ responses:
91
+ '200':
92
+ description: The updated user
93
+ content:
94
+ application/json:
95
+ schema:
96
+ $ref: '#/components/schemas/User'
97
+ '404':
98
+ description: User not found
99
+ '500':
100
+ description: Some server error
101
+ delete:
102
+ summary: Delete an existing user
103
+ tags:
104
+ - Users
105
+ parameters:
106
+ - in: path
107
+ name: id
108
+ schema:
109
+ type: string
110
+ required: true
111
+ description: The user id
112
+ responses:
113
+ '200':
114
+ description: User deleted successfully
115
+ '404':
116
+ description: User not found
117
+ '500':
118
+ description: Some server error
@@ -1,23 +1,23 @@
1
- {
2
- "compilerOptions": {
3
- "target": "es2020",
4
- "module": "commonjs",
5
- "outDir": "./dist",
6
- "rootDir": "./src",
7
- "strict": true,
8
- "esModuleInterop": true,
9
- "skipLibCheck": true,
10
- "forceConsistentCasingInFileNames": true,
11
- "baseUrl": ".",
12
- "paths": {
13
- "@/*": ["src/*"]
14
- }
15
- },
16
- "include": [
17
- "src/**/*"
18
- ],
19
- "exclude": [
20
- "node_modules",
21
- "dist"
22
- ]
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es2020",
4
+ "module": "commonjs",
5
+ "outDir": "./dist",
6
+ "rootDir": "./src",
7
+ "strict": true,
8
+ "esModuleInterop": true,
9
+ "skipLibCheck": true,
10
+ "forceConsistentCasingInFileNames": true,
11
+ "baseUrl": ".",
12
+ "paths": {
13
+ "@/*": ["src/*"]
14
+ }
15
+ },
16
+ "include": [
17
+ "src/**/*"
18
+ ],
19
+ "exclude": [
20
+ "node_modules",
21
+ "dist"
22
+ ]
23
23
  }