nestforge-generator 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +371 -0
  3. package/README.pt-BR.md +370 -0
  4. package/dist/features/auth-strategy.js +19 -0
  5. package/dist/features/auth-strategy.js.map +1 -0
  6. package/dist/features/database.js +59 -0
  7. package/dist/features/database.js.map +1 -0
  8. package/dist/features/dependencies.js +57 -0
  9. package/dist/features/dependencies.js.map +1 -0
  10. package/dist/features/language.js +172 -0
  11. package/dist/features/language.js.map +1 -0
  12. package/dist/features/markers.js +116 -0
  13. package/dist/features/markers.js.map +1 -0
  14. package/dist/generator.js +120 -0
  15. package/dist/generator.js.map +1 -0
  16. package/dist/index.js +59 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/prompts.js +137 -0
  19. package/dist/prompts.js.map +1 -0
  20. package/package.json +76 -0
  21. package/templates/drizzle/.env.example +45 -0
  22. package/templates/drizzle/.env.test +38 -0
  23. package/templates/drizzle/.github/workflows/ci.yml +119 -0
  24. package/templates/drizzle/ARCHITECTURE.md +227 -0
  25. package/templates/drizzle/ARCHITECTURE.pt-BR.md +225 -0
  26. package/templates/drizzle/CODE_OF_CONDUCT.md +29 -0
  27. package/templates/drizzle/CODE_OF_CONDUCT.pt-BR.md +27 -0
  28. package/templates/drizzle/CONTRIBUTING.md +57 -0
  29. package/templates/drizzle/CONTRIBUTING.pt-BR.md +54 -0
  30. package/templates/drizzle/Dockerfile +43 -0
  31. package/templates/drizzle/LICENSE +21 -0
  32. package/templates/drizzle/README.md +257 -0
  33. package/templates/drizzle/README.pt-BR.md +257 -0
  34. package/templates/drizzle/ROADMAP.md +143 -0
  35. package/templates/drizzle/ROADMAP.pt-BR.md +143 -0
  36. package/templates/drizzle/TESTING.md +136 -0
  37. package/templates/drizzle/TESTING.pt-BR.md +136 -0
  38. package/templates/drizzle/docker-compose.yml +82 -0
  39. package/templates/drizzle/docs/adding-a-module.md +585 -0
  40. package/templates/drizzle/docs/features-markers.md +457 -0
  41. package/templates/drizzle/drizzle.config.ts +49 -0
  42. package/templates/drizzle/nest-cli.json +8 -0
  43. package/templates/drizzle/package.json +96 -0
  44. package/templates/drizzle/src/app.module.ts +72 -0
  45. package/templates/drizzle/src/auth/auth.controller.ts +283 -0
  46. package/templates/drizzle/src/auth/auth.module.ts +81 -0
  47. package/templates/drizzle/src/auth/auth.service.spec.ts +111 -0
  48. package/templates/drizzle/src/auth/auth.service.ts +631 -0
  49. package/templates/drizzle/src/auth/drizzle-session.store.ts +263 -0
  50. package/templates/drizzle/src/auth/dto/forgot-password.dto.ts +9 -0
  51. package/templates/drizzle/src/auth/dto/login.dto.ts +10 -0
  52. package/templates/drizzle/src/auth/dto/refresh-token.dto.ts +9 -0
  53. package/templates/drizzle/src/auth/dto/register.dto.ts +11 -0
  54. package/templates/drizzle/src/auth/dto/reset-password.dto.ts +10 -0
  55. package/templates/drizzle/src/auth/guards/github-auth.guard.ts +10 -0
  56. package/templates/drizzle/src/auth/guards/google-auth.guard.ts +10 -0
  57. package/templates/drizzle/src/auth/guards/jwt-auth.guard.ts +25 -0
  58. package/templates/drizzle/src/auth/guards/session-auth.guard.spec.ts +77 -0
  59. package/templates/drizzle/src/auth/guards/session-auth.guard.ts +37 -0
  60. package/templates/drizzle/src/auth/session.service.spec.ts +74 -0
  61. package/templates/drizzle/src/auth/session.service.ts +96 -0
  62. package/templates/drizzle/src/auth/strategies/github.strategy.ts +41 -0
  63. package/templates/drizzle/src/auth/strategies/google.strategy.ts +43 -0
  64. package/templates/drizzle/src/auth/strategies/jwt.strategy.ts +25 -0
  65. package/templates/drizzle/src/auth/token.service.ts +175 -0
  66. package/templates/drizzle/src/common/constants/permissions.ts +8 -0
  67. package/templates/drizzle/src/common/constants/role-permissions.ts +9 -0
  68. package/templates/drizzle/src/common/constants/role.enum.ts +5 -0
  69. package/templates/drizzle/src/common/decorators/current-user.decorator.ts +8 -0
  70. package/templates/drizzle/src/common/decorators/permissions.decorator.ts +7 -0
  71. package/templates/drizzle/src/common/decorators/public.decorator.ts +4 -0
  72. package/templates/drizzle/src/common/decorators/roles.decorator.ts +6 -0
  73. package/templates/drizzle/src/common/filters/http-exception.filter.ts +34 -0
  74. package/templates/drizzle/src/common/guards/permissions.guard.spec.ts +54 -0
  75. package/templates/drizzle/src/common/guards/permissions.guard.ts +28 -0
  76. package/templates/drizzle/src/common/guards/roles.guard.spec.ts +37 -0
  77. package/templates/drizzle/src/common/guards/roles.guard.ts +24 -0
  78. package/templates/drizzle/src/common/interceptors/logging.interceptor.ts +23 -0
  79. package/templates/drizzle/src/common/middleware/csrf.middleware.spec.ts +97 -0
  80. package/templates/drizzle/src/common/middleware/csrf.middleware.ts +46 -0
  81. package/templates/drizzle/src/common/utils/avatar-storage.util.ts +32 -0
  82. package/templates/drizzle/src/common/utils/hash.util.ts +5 -0
  83. package/templates/drizzle/src/config/env.validation.ts +50 -0
  84. package/templates/drizzle/src/database/database-lifecycle.service.ts +30 -0
  85. package/templates/drizzle/src/database/database.constants.ts +2 -0
  86. package/templates/drizzle/src/database/database.decorators.ts +5 -0
  87. package/templates/drizzle/src/database/database.module.ts +96 -0
  88. package/templates/drizzle/src/database/database.types.ts +28 -0
  89. package/templates/drizzle/src/database/schema/index.ts +11 -0
  90. package/templates/drizzle/src/database/schema/mysql.schema.ts +215 -0
  91. package/templates/drizzle/src/database/schema/postgres.schema.ts +218 -0
  92. package/templates/drizzle/src/database/schema/sqlite.schema.ts +190 -0
  93. package/templates/drizzle/src/database/seed.ts +152 -0
  94. package/templates/drizzle/src/health/health.controller.ts +49 -0
  95. package/templates/drizzle/src/health/health.module.ts +19 -0
  96. package/templates/drizzle/src/health/indicators/drizzle-health.indicator.spec.ts +71 -0
  97. package/templates/drizzle/src/health/indicators/drizzle-health.indicator.ts +52 -0
  98. package/templates/drizzle/src/health/indicators/redis-health.indicator.spec.ts +54 -0
  99. package/templates/drizzle/src/health/indicators/redis-health.indicator.ts +33 -0
  100. package/templates/drizzle/src/mail/mail.module.ts +12 -0
  101. package/templates/drizzle/src/mail/mail.processor.ts +48 -0
  102. package/templates/drizzle/src/mail/mail.service.ts +24 -0
  103. package/templates/drizzle/src/mail/templates/email-templates.ts +28 -0
  104. package/templates/drizzle/src/main.ts +145 -0
  105. package/templates/drizzle/src/metrics/metrics.controller.ts +22 -0
  106. package/templates/drizzle/src/metrics/metrics.interceptor.ts +30 -0
  107. package/templates/drizzle/src/metrics/metrics.module.ts +12 -0
  108. package/templates/drizzle/src/metrics/metrics.service.ts +34 -0
  109. package/templates/drizzle/src/types/express-session.d.ts +13 -0
  110. package/templates/drizzle/src/users/dto/create-user.dto.ts +12 -0
  111. package/templates/drizzle/src/users/dto/find-users-query.dto.ts +12 -0
  112. package/templates/drizzle/src/users/dto/update-user.dto.ts +6 -0
  113. package/templates/drizzle/src/users/entities/user.entity.ts +23 -0
  114. package/templates/drizzle/src/users/users.controller.ts +165 -0
  115. package/templates/drizzle/src/users/users.module.ts +10 -0
  116. package/templates/drizzle/src/users/users.service.spec.ts +301 -0
  117. package/templates/drizzle/src/users/users.service.ts +213 -0
  118. package/templates/drizzle/test/auth.e2e-spec.ts +114 -0
  119. package/templates/drizzle/test/session-auth.e2e-spec.ts +163 -0
  120. package/templates/drizzle/test/users.e2e-spec.ts +212 -0
  121. package/templates/drizzle/test/utils/clean-database.ts +104 -0
  122. package/templates/drizzle/test/utils/e2e-setup.ts +77 -0
  123. package/templates/drizzle/tsconfig.build.json +4 -0
  124. package/templates/drizzle/tsconfig.json +25 -0
  125. package/templates/drizzle/vitest.config.ts +20 -0
  126. package/templates/drizzle/vitest.e2e.config.ts +19 -0
  127. package/templates/prisma/.env.example +44 -0
  128. package/templates/prisma/.env.test +37 -0
  129. package/templates/prisma/.github/workflows/ci.yml +109 -0
  130. package/templates/prisma/ARCHITECTURE.md +70 -0
  131. package/templates/prisma/ARCHITECTURE.pt-BR.md +63 -0
  132. package/templates/prisma/CODE_OF_CONDUCT.md +29 -0
  133. package/templates/prisma/CODE_OF_CONDUCT.pt-BR.md +27 -0
  134. package/templates/prisma/CONTRIBUTING.md +57 -0
  135. package/templates/prisma/CONTRIBUTING.pt-BR.md +54 -0
  136. package/templates/prisma/Dockerfile +33 -0
  137. package/templates/prisma/LICENSE +21 -0
  138. package/templates/prisma/README.md +267 -0
  139. package/templates/prisma/README.pt-BR.md +267 -0
  140. package/templates/prisma/ROADMAP.md +75 -0
  141. package/templates/prisma/ROADMAP.pt-BR.md +65 -0
  142. package/templates/prisma/TESTING.md +123 -0
  143. package/templates/prisma/TESTING.pt-BR.md +123 -0
  144. package/templates/prisma/docker-compose.yml +78 -0
  145. package/templates/prisma/docs/adding-a-module.md +230 -0
  146. package/templates/prisma/docs/features-markers.md +50 -0
  147. package/templates/prisma/nest-cli.json +8 -0
  148. package/templates/prisma/package.json +95 -0
  149. package/templates/prisma/prisma/schema.prisma +105 -0
  150. package/templates/prisma/prisma/seed.ts +46 -0
  151. package/templates/prisma/src/app.module.ts +72 -0
  152. package/templates/prisma/src/auth/auth.controller.ts +283 -0
  153. package/templates/prisma/src/auth/auth.module.ts +59 -0
  154. package/templates/prisma/src/auth/auth.service.spec.ts +53 -0
  155. package/templates/prisma/src/auth/auth.service.ts +224 -0
  156. package/templates/prisma/src/auth/dto/forgot-password.dto.ts +9 -0
  157. package/templates/prisma/src/auth/dto/login.dto.ts +10 -0
  158. package/templates/prisma/src/auth/dto/refresh-token.dto.ts +9 -0
  159. package/templates/prisma/src/auth/dto/register.dto.ts +11 -0
  160. package/templates/prisma/src/auth/dto/reset-password.dto.ts +10 -0
  161. package/templates/prisma/src/auth/guards/github-auth.guard.ts +10 -0
  162. package/templates/prisma/src/auth/guards/google-auth.guard.ts +10 -0
  163. package/templates/prisma/src/auth/guards/jwt-auth.guard.ts +25 -0
  164. package/templates/prisma/src/auth/guards/session-auth.guard.spec.ts +77 -0
  165. package/templates/prisma/src/auth/guards/session-auth.guard.ts +37 -0
  166. package/templates/prisma/src/auth/session.service.spec.ts +74 -0
  167. package/templates/prisma/src/auth/session.service.ts +96 -0
  168. package/templates/prisma/src/auth/strategies/github.strategy.ts +41 -0
  169. package/templates/prisma/src/auth/strategies/google.strategy.ts +43 -0
  170. package/templates/prisma/src/auth/strategies/jwt.strategy.ts +25 -0
  171. package/templates/prisma/src/auth/token.service.ts +84 -0
  172. package/templates/prisma/src/common/constants/permissions.ts +8 -0
  173. package/templates/prisma/src/common/constants/role-permissions.ts +9 -0
  174. package/templates/prisma/src/common/decorators/current-user.decorator.ts +8 -0
  175. package/templates/prisma/src/common/decorators/permissions.decorator.ts +7 -0
  176. package/templates/prisma/src/common/decorators/public.decorator.ts +4 -0
  177. package/templates/prisma/src/common/decorators/roles.decorator.ts +6 -0
  178. package/templates/prisma/src/common/filters/http-exception.filter.ts +34 -0
  179. package/templates/prisma/src/common/guards/permissions.guard.spec.ts +54 -0
  180. package/templates/prisma/src/common/guards/permissions.guard.ts +28 -0
  181. package/templates/prisma/src/common/guards/roles.guard.spec.ts +37 -0
  182. package/templates/prisma/src/common/guards/roles.guard.ts +24 -0
  183. package/templates/prisma/src/common/interceptors/logging.interceptor.ts +23 -0
  184. package/templates/prisma/src/common/middleware/csrf.middleware.spec.ts +97 -0
  185. package/templates/prisma/src/common/middleware/csrf.middleware.ts +46 -0
  186. package/templates/prisma/src/common/utils/avatar-storage.util.ts +32 -0
  187. package/templates/prisma/src/common/utils/hash.util.ts +5 -0
  188. package/templates/prisma/src/config/env.validation.ts +49 -0
  189. package/templates/prisma/src/database/prisma.module.ts +9 -0
  190. package/templates/prisma/src/database/prisma.service.ts +13 -0
  191. package/templates/prisma/src/health/health.controller.ts +49 -0
  192. package/templates/prisma/src/health/health.module.ts +19 -0
  193. package/templates/prisma/src/health/indicators/prisma-health.indicator.spec.ts +22 -0
  194. package/templates/prisma/src/health/indicators/prisma-health.indicator.ts +19 -0
  195. package/templates/prisma/src/health/indicators/redis-health.indicator.spec.ts +54 -0
  196. package/templates/prisma/src/health/indicators/redis-health.indicator.ts +33 -0
  197. package/templates/prisma/src/mail/mail.module.ts +12 -0
  198. package/templates/prisma/src/mail/mail.processor.ts +48 -0
  199. package/templates/prisma/src/mail/mail.service.ts +24 -0
  200. package/templates/prisma/src/mail/templates/email-templates.ts +28 -0
  201. package/templates/prisma/src/main.ts +92 -0
  202. package/templates/prisma/src/metrics/metrics.controller.ts +22 -0
  203. package/templates/prisma/src/metrics/metrics.interceptor.ts +30 -0
  204. package/templates/prisma/src/metrics/metrics.module.ts +12 -0
  205. package/templates/prisma/src/metrics/metrics.service.ts +34 -0
  206. package/templates/prisma/src/types/express-session.d.ts +13 -0
  207. package/templates/prisma/src/users/dto/create-user.dto.ts +12 -0
  208. package/templates/prisma/src/users/dto/find-users-query.dto.ts +12 -0
  209. package/templates/prisma/src/users/dto/update-user.dto.ts +6 -0
  210. package/templates/prisma/src/users/entities/user.entity.ts +20 -0
  211. package/templates/prisma/src/users/users.controller.ts +165 -0
  212. package/templates/prisma/src/users/users.module.ts +10 -0
  213. package/templates/prisma/src/users/users.service.spec.ts +104 -0
  214. package/templates/prisma/src/users/users.service.ts +114 -0
  215. package/templates/prisma/test/auth.e2e-spec.ts +75 -0
  216. package/templates/prisma/test/session-auth.e2e-spec.ts +163 -0
  217. package/templates/prisma/test/users.e2e-spec.ts +106 -0
  218. package/templates/prisma/test/utils/clean-database.ts +14 -0
  219. package/templates/prisma/test/utils/e2e-setup.ts +58 -0
  220. package/templates/prisma/tsconfig.build.json +4 -0
  221. package/templates/prisma/tsconfig.json +25 -0
  222. package/templates/prisma/vitest.config.ts +20 -0
  223. package/templates/prisma/vitest.e2e.config.ts +19 -0
  224. package/templates/typeorm/.env.example +45 -0
  225. package/templates/typeorm/.env.test +38 -0
  226. package/templates/typeorm/.github/workflows/ci.yml +116 -0
  227. package/templates/typeorm/ARCHITECTURE.md +158 -0
  228. package/templates/typeorm/ARCHITECTURE.pt-BR.md +156 -0
  229. package/templates/typeorm/CODE_OF_CONDUCT.md +29 -0
  230. package/templates/typeorm/CODE_OF_CONDUCT.pt-BR.md +27 -0
  231. package/templates/typeorm/CONTRIBUTING.md +57 -0
  232. package/templates/typeorm/CONTRIBUTING.pt-BR.md +54 -0
  233. package/templates/typeorm/Dockerfile +43 -0
  234. package/templates/typeorm/LICENSE +21 -0
  235. package/templates/typeorm/README.md +266 -0
  236. package/templates/typeorm/README.pt-BR.md +266 -0
  237. package/templates/typeorm/ROADMAP.md +79 -0
  238. package/templates/typeorm/ROADMAP.pt-BR.md +67 -0
  239. package/templates/typeorm/TESTING.md +114 -0
  240. package/templates/typeorm/TESTING.pt-BR.md +114 -0
  241. package/templates/typeorm/docker-compose.yml +78 -0
  242. package/templates/typeorm/docs/adding-a-module.md +369 -0
  243. package/templates/typeorm/docs/features-markers.md +50 -0
  244. package/templates/typeorm/nest-cli.json +8 -0
  245. package/templates/typeorm/package.json +98 -0
  246. package/templates/typeorm/src/app.module.ts +72 -0
  247. package/templates/typeorm/src/auth/auth.controller.ts +283 -0
  248. package/templates/typeorm/src/auth/auth.module.ts +86 -0
  249. package/templates/typeorm/src/auth/auth.service.spec.ts +111 -0
  250. package/templates/typeorm/src/auth/auth.service.ts +346 -0
  251. package/templates/typeorm/src/auth/dto/forgot-password.dto.ts +9 -0
  252. package/templates/typeorm/src/auth/dto/login.dto.ts +10 -0
  253. package/templates/typeorm/src/auth/dto/refresh-token.dto.ts +9 -0
  254. package/templates/typeorm/src/auth/dto/register.dto.ts +11 -0
  255. package/templates/typeorm/src/auth/dto/reset-password.dto.ts +10 -0
  256. package/templates/typeorm/src/auth/entities/email-verification-token.entity.ts +69 -0
  257. package/templates/typeorm/src/auth/entities/oauth-account.entity.ts +50 -0
  258. package/templates/typeorm/src/auth/entities/password-reset-token.entity.ts +69 -0
  259. package/templates/typeorm/src/auth/entities/refresh-token.entity.ts +69 -0
  260. package/templates/typeorm/src/auth/entities/session.entity.ts +50 -0
  261. package/templates/typeorm/src/auth/guards/github-auth.guard.ts +10 -0
  262. package/templates/typeorm/src/auth/guards/google-auth.guard.ts +10 -0
  263. package/templates/typeorm/src/auth/guards/jwt-auth.guard.ts +25 -0
  264. package/templates/typeorm/src/auth/guards/session-auth.guard.spec.ts +77 -0
  265. package/templates/typeorm/src/auth/guards/session-auth.guard.ts +37 -0
  266. package/templates/typeorm/src/auth/session.service.spec.ts +74 -0
  267. package/templates/typeorm/src/auth/session.service.ts +96 -0
  268. package/templates/typeorm/src/auth/strategies/github.strategy.ts +41 -0
  269. package/templates/typeorm/src/auth/strategies/google.strategy.ts +43 -0
  270. package/templates/typeorm/src/auth/strategies/jwt.strategy.ts +25 -0
  271. package/templates/typeorm/src/auth/token.service.ts +115 -0
  272. package/templates/typeorm/src/common/constants/permissions.ts +8 -0
  273. package/templates/typeorm/src/common/constants/role-permissions.ts +9 -0
  274. package/templates/typeorm/src/common/constants/role.enum.ts +5 -0
  275. package/templates/typeorm/src/common/decorators/current-user.decorator.ts +8 -0
  276. package/templates/typeorm/src/common/decorators/permissions.decorator.ts +7 -0
  277. package/templates/typeorm/src/common/decorators/public.decorator.ts +4 -0
  278. package/templates/typeorm/src/common/decorators/roles.decorator.ts +6 -0
  279. package/templates/typeorm/src/common/filters/http-exception.filter.ts +34 -0
  280. package/templates/typeorm/src/common/guards/permissions.guard.spec.ts +54 -0
  281. package/templates/typeorm/src/common/guards/permissions.guard.ts +28 -0
  282. package/templates/typeorm/src/common/guards/roles.guard.spec.ts +37 -0
  283. package/templates/typeorm/src/common/guards/roles.guard.ts +24 -0
  284. package/templates/typeorm/src/common/interceptors/logging.interceptor.ts +23 -0
  285. package/templates/typeorm/src/common/middleware/csrf.middleware.spec.ts +97 -0
  286. package/templates/typeorm/src/common/middleware/csrf.middleware.ts +46 -0
  287. package/templates/typeorm/src/common/utils/avatar-storage.util.ts +32 -0
  288. package/templates/typeorm/src/common/utils/hash.util.ts +5 -0
  289. package/templates/typeorm/src/config/env.validation.ts +50 -0
  290. package/templates/typeorm/src/database/data-source.ts +20 -0
  291. package/templates/typeorm/src/database/database.module.ts +39 -0
  292. package/templates/typeorm/src/database/seed.ts +81 -0
  293. package/templates/typeorm/src/database/typeorm-options.ts +49 -0
  294. package/templates/typeorm/src/health/health.controller.ts +49 -0
  295. package/templates/typeorm/src/health/health.module.ts +19 -0
  296. package/templates/typeorm/src/health/indicators/redis-health.indicator.spec.ts +54 -0
  297. package/templates/typeorm/src/health/indicators/redis-health.indicator.ts +33 -0
  298. package/templates/typeorm/src/health/indicators/typeorm-health.indicator.spec.ts +49 -0
  299. package/templates/typeorm/src/health/indicators/typeorm-health.indicator.ts +37 -0
  300. package/templates/typeorm/src/mail/mail.module.ts +12 -0
  301. package/templates/typeorm/src/mail/mail.processor.ts +48 -0
  302. package/templates/typeorm/src/mail/mail.service.ts +24 -0
  303. package/templates/typeorm/src/mail/templates/email-templates.ts +28 -0
  304. package/templates/typeorm/src/main.ts +107 -0
  305. package/templates/typeorm/src/metrics/metrics.controller.ts +22 -0
  306. package/templates/typeorm/src/metrics/metrics.interceptor.ts +30 -0
  307. package/templates/typeorm/src/metrics/metrics.module.ts +12 -0
  308. package/templates/typeorm/src/metrics/metrics.service.ts +34 -0
  309. package/templates/typeorm/src/types/express-session.d.ts +13 -0
  310. package/templates/typeorm/src/users/dto/create-user.dto.ts +12 -0
  311. package/templates/typeorm/src/users/dto/find-users-query.dto.ts +12 -0
  312. package/templates/typeorm/src/users/dto/update-user.dto.ts +6 -0
  313. package/templates/typeorm/src/users/entities/user.entity.ts +113 -0
  314. package/templates/typeorm/src/users/users.controller.ts +165 -0
  315. package/templates/typeorm/src/users/users.module.ts +13 -0
  316. package/templates/typeorm/src/users/users.service.spec.ts +183 -0
  317. package/templates/typeorm/src/users/users.service.ts +124 -0
  318. package/templates/typeorm/test/auth.e2e-spec.ts +111 -0
  319. package/templates/typeorm/test/session-auth.e2e-spec.ts +159 -0
  320. package/templates/typeorm/test/users.e2e-spec.ts +183 -0
  321. package/templates/typeorm/test/utils/clean-database.ts +65 -0
  322. package/templates/typeorm/test/utils/e2e-setup.ts +77 -0
  323. package/templates/typeorm/tsconfig.build.json +4 -0
  324. package/templates/typeorm/tsconfig.json +25 -0
  325. package/templates/typeorm/vitest.config.ts +20 -0
  326. package/templates/typeorm/vitest.e2e.config.ts +19 -0
@@ -0,0 +1,457 @@
1
+ # Marcadores de funcionalidades
2
+
3
+ O template templates/drizzle funciona como projeto de referência e como fonte usada pela CLI para gerar projetos personalizados.
4
+
5
+ Os marcadores permitem remover arquivos ou blocos de código conforme as opções selecionadas pelo usuário, como banco de dados, autenticação, Redis, Swagger e RBAC.
6
+
7
+ ## Marcador de bloco
8
+
9
+ Use um marcador de bloco quando apenas uma parte do arquivo depender de uma funcionalidade.
10
+
11
+ ```ts
12
+ // nestforge:feature:swagger
13
+ @ApiTags('users')
14
+ // nestforge:feature:swagger:end
15
+ @Controller('users')
16
+ export class UsersController {}
17
+ ```
18
+
19
+ Quando swagger estiver habilitado, a CLI mantém o conteúdo e remove somente as linhas dos marcadores.
20
+
21
+ Quando estiver desabilitado, a CLI remove todo o bloco:
22
+
23
+ ```ts
24
+ @Controller('users')
25
+ export class UsersController {}
26
+ ```
27
+
28
+ O nome da abertura deve ser exatamente igual ao nome do fechamento:
29
+
30
+ ```ts
31
+ // nestforge:feature:swagger
32
+ // conteúdo opcional
33
+ // nestforge:feature:swagger:end
34
+ ```
35
+
36
+ Não deixe um marcador aberto. Um fechamento ausente pode fazer a CLI remover o restante do
37
+ arquivo.
38
+
39
+ ## Marcador de arquivo inteiro
40
+
41
+ Use um marcador de arquivo quando todo o arquivo depender de uma funcionalidade.
42
+
43
+ O marcador deve ser a primeira linha não vazia:
44
+
45
+ ```ts
46
+ // nestforge:feature-file:redis
47
+ import { Injectable } from '@nestjs/common';
48
+
49
+ @Injectable()
50
+ export class MailService {}
51
+ ```
52
+
53
+ Se redis estiver habilitado, somente a linha do marcador será removida.
54
+
55
+ Se estiver desabilitado, o arquivo inteiro será excluído.
56
+
57
+ Depois do processamento, a CLI também remove diretórios que ficarem vazios.
58
+
59
+ ## Marcadores com múltiplos requisitos
60
+
61
+ Um marcador pode exigir mais de uma funcionalidade usando nomes separados por vírgula:
62
+
63
+ ```ts
64
+ // nestforge:feature:redis,auth:password
65
+ await this.mailService.sendPasswordResetEmail();
66
+ // nestforge:feature:redis,auth:password:end
67
+ ```
68
+
69
+ Nesse caso, todas as funcionalidades precisam estar habilitadas.
70
+
71
+ O bloco acima somente será mantido quando:
72
+
73
+ * Redis estiver habilitado;
74
+ * a estratégia de autenticação usar senha.
75
+
76
+ A mesma regra funciona para arquivos inteiros:
77
+
78
+ ```ts
79
+ // nestforge:feature-file:auth:password,auth:session
80
+ ```
81
+
82
+ Não use espaços entre os nomes no marcador. Prefira:
83
+
84
+ ```text
85
+ redis,auth:password
86
+ ```
87
+
88
+ ## Prefixos de comentário aceitos
89
+
90
+ Os marcadores aceitam comentários iniciados por //:
91
+
92
+ ```ts
93
+ // nestforge:feature:swagger
94
+ ```
95
+
96
+ Também aceitam comentários iniciados por #, usados em YAML e arquivos de ambiente:
97
+
98
+ ```yaml
99
+ # nestforge:feature:redis
100
+ redis:
101
+ image: redis:alpine
102
+ # nestforge:feature:redis:end
103
+ ```
104
+
105
+ Exemplo em .env.example:
106
+
107
+ ```dotenv
108
+ # nestforge:feature:auth:session
109
+ SESSION_SECRET=troque-este-segredo
110
+ SESSION_MAX_AGE=604800000
111
+ # nestforge:feature:auth:session:end
112
+ ```
113
+
114
+ ## Funcionalidades disponíveis
115
+
116
+ ### Funcionalidades selecionadas diretamente
117
+
118
+ | Nome | Origem |
119
+ | ━━━━━━━━━━━━ | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
120
+ | docker | Pergunta sobre Docker |
121
+ | ──────────── | ────────────────────────────────────── |
122
+ | swagger | Pergunta sobre Swagger/OpenAPI |
123
+ | ──────────── | ────────────────────────────────────── |
124
+ | validation | Pergunta sobre validação global |
125
+ | ──────────── | ────────────────────────────────────── |
126
+ | redis | Pergunta sobre Redis, filas e e-mail |
127
+ | ──────────── | ────────────────────────────────────── |
128
+ | rbac | Pergunta sobre RBAC e Permissions |
129
+
130
+ ### Banco de dados
131
+
132
+ A CLI habilita exatamente um marcador de banco:
133
+
134
+ | Banco selecionado | Marcador |
135
+ | ━━━━━━━━━━━━━━━━━━━ | ━━━━━━━━━━━━━━━━━━━ |
136
+ | PostgreSQL | database:postgres |
137
+ | ─────────────────── | ─────────────────── |
138
+ | MySQL | database:mysql |
139
+ | ─────────────────── | ─────────────────── |
140
+ | SQLite | database:sqlite |
141
+
142
+ Exemplo de arquivo exclusivo do PostgreSQL:
143
+
144
+ ```ts
145
+ // nestforge:feature-file:database:postgres
146
+ import type { Pool } from 'pg';
147
+ ```
148
+
149
+ Exemplo de implementações diferentes dentro do mesmo arquivo:
150
+
151
+ ```ts
152
+ // nestforge:feature:database:postgres
153
+ await client.query('SELECT 1');
154
+ // nestforge:feature:database:postgres:end
155
+
156
+ // nestforge:feature:database:mysql
157
+ await client.query('SELECT 1');
158
+ // nestforge:feature:database:mysql:end
159
+
160
+ // nestforge:feature:database:sqlite
161
+ client.prepare('SELECT 1').get();
162
+ // nestforge:feature:database:sqlite:end
163
+ ```
164
+
165
+ Esses marcadores são importantes no template Drizzle porque cada driver possui tipos, configuração e comportamento de transação diferentes.
166
+
167
+ ### Autenticação
168
+
169
+ A CLI cria marcadores internos de acordo com a estratégia escolhida:
170
+
171
+ | Marcador | Quando é habilitado |
172
+ | ━━━━━━━━━━━━━━━ | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
173
+ | auth:enabled | JWT, OAuth-only ou Session/Cookies |
174
+ | ─────────────── | ──────────────────────────────────── |
175
+ | auth:password | JWT ou Session/Cookies |
176
+ | ─────────────── | ──────────────────────────────────── |
177
+ | auth:token | JWT ou OAuth-only |
178
+ | ─────────────── | ──────────────────────────────────── |
179
+ | auth:session | Session/Cookies |
180
+ | ─────────────── | ──────────────────────────────────── |
181
+ | auth:jwt | Estratégia JWT selecionada |
182
+ | ─────────────── | ──────────────────────────────────── |
183
+ | auth:oauth | Estratégia OAuth-only selecionada |
184
+ | ─────────────── | ──────────────────────────────────── |
185
+ | auth:none | Nenhuma autenticação selecionada |
186
+
187
+ Na maior parte do template, devem ser usados os marcadores de capacidade:
188
+
189
+ * auth:enabled para código compartilhado por qualquer autenticação;
190
+ * auth:password para cadastro, login e senha;
191
+ * auth:token para access token e refresh token;
192
+ * auth:session para sessão persistente e cookies.
193
+
194
+ Exemplo:
195
+
196
+ ```ts
197
+ // nestforge:feature:auth:token
198
+ import { TokenService } from './token.service';
199
+ // nestforge:feature:auth:token:end
200
+ ```
201
+
202
+ Exemplo de código compartilhado por JWT e Session/Cookies:
203
+
204
+ ```ts
205
+ // nestforge:feature-file:auth:password
206
+ import { LoginDto } from './login.dto';
207
+ ```
208
+
209
+ ## Marcadores específicos do Drizzle
210
+
211
+ ### Schemas por banco
212
+
213
+ Cada schema pertence exclusivamente a um banco:
214
+
215
+ ```ts
216
+ // nestforge:feature-file:database:postgres
217
+ ```
218
+
219
+ ```ts
220
+ // nestforge:feature-file:database:mysql
221
+ ```
222
+
223
+ ```ts
224
+ // nestforge:feature-file:database:sqlite
225
+ ```
226
+
227
+ Depois da geração, somente o schema correspondente ao banco selecionado deve permanecer no projeto.
228
+
229
+ O arquivo src/database/schema/index.ts também usa blocos para exportar somente o schema selecionado:
230
+
231
+ ```ts
232
+ // nestforge:feature:database:postgres
233
+ export * from './postgres.schema';
234
+ // nestforge:feature:database:postgres:end
235
+ ```
236
+
237
+ ### Transações do SQLite
238
+
239
+ PostgreSQL e MySQL usam callbacks assíncronos:
240
+
241
+ ```ts
242
+ // nestforge:feature:database:postgres
243
+ await database.transaction(
244
+ async (transaction) => {
245
+ await transaction.delete(users);
246
+ },
247
+ );
248
+ // nestforge:feature:database:postgres:end
249
+ ```
250
+
251
+ SQLite com better-sqlite3 usa callback síncrono e .run():
252
+
253
+ ```ts
254
+ // nestforge:feature:database:sqlite
255
+ database.transaction((transaction) => {
256
+ transaction.delete(users).run();
257
+ });
258
+ // nestforge:feature:database:sqlite:end
259
+ ```
260
+
261
+ Não coloque essas duas implementações no mesmo bloco, pois apenas uma deve permanecer no projeto gerado.
262
+
263
+ ### Tabelas opcionais
264
+
265
+ Tabelas usadas somente por uma estratégia de autenticação também precisam de marcadores:
266
+
267
+ ```ts
268
+ // nestforge:feature:auth:token
269
+ export const refreshTokens = sqliteTable(
270
+ 'refresh_tokens',
271
+ {
272
+ // colunas
273
+ },
274
+ );
275
+ // nestforge:feature:auth:token:end
276
+ ```
277
+
278
+ Para Session/Cookies:
279
+
280
+ ```ts
281
+ // nestforge:feature:auth:session
282
+ export const sessions = sqliteTable(
283
+ 'sessions',
284
+ {
285
+ // colunas
286
+ },
287
+ );
288
+ // nestforge:feature:auth:session:end
289
+ ```
290
+
291
+ Os imports, tipos, services, testes e limpeza E2E relacionados à tabela também devem usar marcadores compatíveis.
292
+
293
+ ## Dependências do package.json
294
+
295
+ JSON não aceita comentários. Portanto, não coloque marcadores dentro de package.json.
296
+
297
+ A remoção de dependências opcionais é controlada por:
298
+
299
+ packages/cli/src/features/dependencies.ts
300
+
301
+ O objeto FEATURE_DEPENDENCIES associa cada funcionalidade às dependências que devem ser removidas quando ela estiver desabilitada.
302
+
303
+ Exemplo conceitual:
304
+
305
+ ```ts
306
+ export const FEATURE_DEPENDENCIES = {
307
+ 'database:postgres': [
308
+ 'pg',
309
+ '@types/pg',
310
+ ],
311
+ 'database:mysql': [
312
+ 'mysql2',
313
+ ],
314
+ 'database:sqlite': [
315
+ 'better-sqlite3',
316
+ '@types/better-sqlite3',
317
+ ],
318
+ };
319
+ ```
320
+
321
+ Ao adicionar uma dependência exclusiva de uma funcionalidade, atualize esse mapeamento.
322
+
323
+ Dependências compartilhadas pelo template Drizzle, como drizzle-orm e drizzle-kit, não devem ser removidas junto com um driver específico.
324
+
325
+ ## Docker
326
+
327
+ O Dockerfile e o docker-compose.yml são removidos diretamente pela CLI quando Docker está desabilitado.
328
+
329
+ Dentro do docker-compose.yml, use marcadores para serviços opcionais:
330
+
331
+ ```yaml
332
+ # nestforge:feature:redis
333
+ redis:
334
+ image: redis:alpine
335
+ # nestforge:feature:redis:end
336
+ ```
337
+
338
+ Dependências entre serviços também precisam ser marcadas:
339
+
340
+ ```yaml
341
+ depends_on:
342
+ # nestforge:feature:database:postgres
343
+ - postgres
344
+ # nestforge:feature:database:postgres:end
345
+ ```
346
+
347
+ Depois da geração, confira se o YAML continua válido em todas as combinações.
348
+
349
+ ## Cuidados ao usar marcadores
350
+
351
+ ### Preserve imports relacionados
352
+
353
+ Não marque apenas o uso de uma classe e deixe o import para trás.
354
+
355
+ Incorreto:
356
+
357
+ ```ts
358
+ import { TokenService } from './token.service';
359
+
360
+ // nestforge:feature:auth:token
361
+ constructor(
362
+ private readonly tokenService: TokenService,
363
+ ) {}
364
+ // nestforge:feature:auth:token:end
365
+ ```
366
+
367
+ Correto:
368
+
369
+ ```ts
370
+ // nestforge:feature:auth:token
371
+ import { TokenService } from './token.service';
372
+ // nestforge:feature:auth:token:end
373
+
374
+ // nestforge:feature:auth:token
375
+ constructor(
376
+ private readonly tokenService: TokenService,
377
+ ) {}
378
+ // nestforge:feature:auth:token:end
379
+ ```
380
+
381
+ ### Preserve a sintaxe do arquivo
382
+
383
+ Ao remover um bloco, o código restante precisa continuar válido.
384
+
385
+ Verifique especialmente:
386
+
387
+ * vírgulas em arrays e objetos;
388
+ * imports parcialmente removidos;
389
+ * parâmetros de construtores;
390
+ * itens em providers, imports e exports;
391
+ * scripts e propriedades YAML;
392
+ * chaves e parênteses;
393
+ * blocos de transação;
394
+ * exports do schema.
395
+
396
+ ### Evite blocos desnecessariamente grandes
397
+
398
+ Marque somente o trecho exclusivo da funcionalidade. Blocos menores facilitam a revisão e reduzem o risco de remover código compartilhado.
399
+
400
+ ### Evite aninhar marcadores
401
+
402
+ Prefira um único marcador com múltiplos requisitos:
403
+
404
+ ```ts
405
+ // nestforge:feature:redis,auth:password
406
+ // conteúdo
407
+ // nestforge:feature:redis,auth:password:end
408
+ ```
409
+
410
+ Isso é mais seguro do que colocar um marcador dentro de outro.
411
+
412
+ ## Como conferir os marcadores
413
+
414
+ No PowerShell, liste todos os marcadores do template:
415
+
416
+ ```powershell
417
+ Get-ChildItem `
418
+ .\templates\drizzle `
419
+ -Recurse `
420
+ -File |
421
+ Select-String -Pattern 'nestforge:feature'
422
+ ```
423
+
424
+ Procure marcadores de abertura e fechamento:
425
+
426
+ ```powershell
427
+ Get-ChildItem `
428
+ .\templates\drizzle `
429
+ -Recurse `
430
+ -File |
431
+ Select-String -Pattern 'nestforge:feature:|nestforge:feature-file:'
432
+ ```
433
+
434
+ A conferência definitiva deve ser feita pelos testes do gerador:
435
+
436
+ ```powershell
437
+ Set-Location .\packages\cli
438
+ npm test
439
+ ```
440
+
441
+ Os testes devem gerar combinações com as funcionalidades habilitadas e desabilitadas.
442
+
443
+ ## Checklist para uma funcionalidade nova
444
+
445
+ * [ ] Blocos exclusivos possuem marcador de abertura e fechamento
446
+ * [ ] Arquivos exclusivos possuem feature-file na primeira linha não vazia
447
+ * [ ] Os nomes de abertura e fechamento são idênticos
448
+ * [ ] Múltiplos requisitos usam uma lista separada por vírgula
449
+ * [ ] Imports exclusivos também estão marcados
450
+ * [ ] Providers e exports exclusivos também estão marcados
451
+ * [ ] Tabelas e tipos opcionais do schema estão marcados
452
+ * [ ] A limpeza E2E considera tabelas opcionais
453
+ * [ ] Dependências opcionais foram adicionadas a FEATURE_DEPENDENCIES
454
+ * [ ] PostgreSQL, MySQL e SQLite mantêm código válido
455
+ * [ ] O projeto foi gerado com a funcionalidade ligada
456
+ * [ ] O projeto foi gerado com a funcionalidade desligada
457
+ * [ ] O projeto gerado executa build e testes
@@ -0,0 +1,49 @@
1
+ import { defineConfig } from 'drizzle-kit';
2
+
3
+ const databaseUrl = process.env.DATABASE_URL;
4
+
5
+ if (!databaseUrl) {
6
+ throw new Error('DATABASE_URL não foi definida');
7
+ }
8
+
9
+ // nestforge:feature:database:postgres
10
+ export default defineConfig({
11
+ dialect: 'postgresql',
12
+ schema:
13
+ './src/database/schema/postgres.schema.ts',
14
+ out: './drizzle',
15
+ dbCredentials: {
16
+ url: databaseUrl,
17
+ },
18
+ verbose: true,
19
+ strict: true,
20
+ });
21
+ // nestforge:feature:database:postgres:end
22
+
23
+ // nestforge:feature:database:mysql
24
+ export default defineConfig({
25
+ dialect: 'mysql',
26
+ schema:
27
+ './src/database/schema/mysql.schema.ts',
28
+ out: './drizzle',
29
+ dbCredentials: {
30
+ url: databaseUrl,
31
+ },
32
+ verbose: true,
33
+ strict: true,
34
+ });
35
+ // nestforge:feature:database:mysql:end
36
+
37
+ // nestforge:feature:database:sqlite
38
+ export default defineConfig({
39
+ dialect: 'sqlite',
40
+ schema:
41
+ './src/database/schema/sqlite.schema.ts',
42
+ out: './drizzle',
43
+ dbCredentials: {
44
+ url: databaseUrl.replace(/^file:/, ''),
45
+ },
46
+ verbose: true,
47
+ strict: true,
48
+ });
49
+ // nestforge:feature:database:sqlite:end
@@ -0,0 +1,8 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/nest-cli",
3
+ "collection": "@nestjs/schematics",
4
+ "sourceRoot": "src",
5
+ "compilerOptions": {
6
+ "deleteOutDir": true
7
+ }
8
+ }
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "nestforge",
3
+ "version": "0.1.0",
4
+ "description": "Production-ready NestJS starter with Drizzle ORM, Authentication, Docker, Testing, CI/CD and Clean Architecture.",
5
+ "license": "MIT",
6
+ "author": "Jeiel Alves <https://github.com/jeiel2013>",
7
+ "private": true,
8
+ "scripts": {
9
+ "build": "nest build",
10
+ "start": "nest start",
11
+ "start:dev": "nest start --watch",
12
+ "start:debug": "nest start --debug --watch",
13
+ "start:prod": "node dist/main.js",
14
+ "lint": "eslint \"{src,test}/**/*.ts\" --fix",
15
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "test:cov": "vitest run --coverage",
19
+ "test:e2e": "dotenv -e .env.test -- vitest run --config ./vitest.e2e.config.ts",
20
+ "drizzle:generate": "dotenv -e .env -- drizzle-kit generate",
21
+ "drizzle:migrate": "dotenv -e .env -- drizzle-kit migrate",
22
+ "drizzle:push": "dotenv -e .env -- drizzle-kit push",
23
+ "drizzle:studio": "dotenv -e .env -- drizzle-kit studio",
24
+ "pretest:e2e": "dotenv -e .env.test -- drizzle-kit migrate",
25
+ "seed": "dotenv -e .env -- ts-node src/database/seed.ts"
26
+ },
27
+ "dependencies": {
28
+ "@nestjs/common": "^11.0.0",
29
+ "@nestjs/config": "^4.0.0",
30
+ "@nestjs/core": "^11.0.0",
31
+ "@nestjs/jwt": "^11.0.0",
32
+ "@nestjs/passport": "^11.0.0",
33
+ "@nestjs/platform-express": "^11.0.0",
34
+ "@nestjs/swagger": "^11.0.0",
35
+ "@nestjs/throttler": "^6.5.0",
36
+ "@nestjs/bullmq": "^11.0.0",
37
+ "@nestjs/terminus": "^11.0.0",
38
+ "express-session": "^1.19.0",
39
+ "bullmq": "^5.0.0",
40
+ "bcryptjs": "^2.4.3",
41
+ "class-transformer": "^0.5.1",
42
+ "helmet": "^8.0.0",
43
+ "ioredis": "^5.4.1",
44
+ "multer": "^1.4.5-lts.1",
45
+ "nestjs-pino": "^4.1.0",
46
+ "nestjs-zod": "^3.0.0",
47
+ "nodemailer": "^6.9.15",
48
+ "passport": "^0.7.0",
49
+ "passport-jwt": "^4.0.1",
50
+ "passport-google-oauth20": "^2.0.0",
51
+ "passport-github2": "^0.1.12",
52
+ "pino-http": "^10.3.0",
53
+ "prom-client": "^15.1.3",
54
+ "reflect-metadata": "^0.2.2",
55
+ "rxjs": "^7.8.1",
56
+ "zod": "^3.23.8",
57
+ "drizzle-orm": "^0.45.2",
58
+ "pg": "^8.23.0",
59
+ "mysql2": "^3.24.2",
60
+ "better-sqlite3": "^13.0.3"
61
+ },
62
+ "devDependencies": {
63
+ "@nestjs/cli": "^11.0.0",
64
+ "@nestjs/schematics": "^11.0.0",
65
+ "@nestjs/testing": "^11.0.0",
66
+ "@types/bcryptjs": "^2.4.6",
67
+ "@types/express-session": "^1.19.0",
68
+ "@types/multer": "^1.4.12",
69
+ "@types/node": "^22.0.0",
70
+ "@types/nodemailer": "^6.4.16",
71
+ "@types/passport-jwt": "^4.0.1",
72
+ "@types/passport-google-oauth20": "^2.0.16",
73
+ "@types/passport-github2": "^1.2.9",
74
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
75
+ "@typescript-eslint/parser": "^8.0.0",
76
+ "@vitest/coverage-v8": "^2.1.0",
77
+ "@swc/core": "^1.13.0",
78
+ "unplugin-swc": "^1.5.10",
79
+ "eslint": "^9.0.0",
80
+ "eslint-config-prettier": "^9.1.0",
81
+ "pino-pretty": "^13.1.3",
82
+ "prettier": "^3.3.3",
83
+ "supertest": "^7.0.0",
84
+ "@types/supertest": "^6.0.2",
85
+ "dotenv-cli": "^7.4.2",
86
+ "ts-node": "^10.9.2",
87
+ "typescript": "^5.6.0",
88
+ "vitest": "^2.1.0",
89
+ "drizzle-kit": "^0.31.10",
90
+ "@types/pg": "^8.23.1",
91
+ "@types/better-sqlite3": "^9.6.0"
92
+ },
93
+ "engines": {
94
+ "node": ">=20"
95
+ }
96
+ }
@@ -0,0 +1,72 @@
1
+ import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
2
+ import { ConfigModule } from '@nestjs/config';
3
+ import { ThrottlerModule } from '@nestjs/throttler';
4
+ // nestforge:feature:redis
5
+ import { BullModule } from '@nestjs/bullmq';
6
+ // nestforge:feature:redis:end
7
+ import { LoggerModule } from 'nestjs-pino';
8
+ // nestforge:feature:auth:enabled
9
+ import { AuthModule } from './auth/auth.module';
10
+ import { UsersModule } from './users/users.module';
11
+ // nestforge:feature:auth:enabled:end
12
+ import { DatabaseModule } from './database/database.module';
13
+ // nestforge:feature:redis
14
+ import { MailModule } from './mail/mail.module';
15
+ // nestforge:feature:redis:end
16
+ import { HealthModule } from './health/health.module';
17
+ import { MetricsModule } from './metrics/metrics.module';
18
+ // nestforge:feature:auth:session
19
+ import { CsrfMiddleware } from './common/middleware/csrf.middleware';
20
+ // nestforge:feature:auth:session:end
21
+ import { validateEnv } from './config/env.validation';
22
+
23
+ @Module({
24
+ imports: [
25
+ ConfigModule.forRoot({
26
+ isGlobal: true,
27
+ validate: validateEnv,
28
+ }),
29
+ LoggerModule.forRoot({
30
+ pinoHttp: {
31
+ level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
32
+ transport:
33
+ process.env.NODE_ENV === 'development'
34
+ ? { target: 'pino-pretty', options: { singleLine: true } }
35
+ : undefined,
36
+ },
37
+ }),
38
+ ThrottlerModule.forRoot([
39
+ {
40
+ ttl: Number(process.env.THROTTLE_TTL ?? 60) * 1000,
41
+ limit: Number(process.env.THROTTLE_LIMIT ?? 100),
42
+ },
43
+ ]),
44
+ // nestforge:feature:redis
45
+ BullModule.forRoot({
46
+ connection: {
47
+ host: process.env.REDIS_HOST ?? 'localhost',
48
+ port: Number(process.env.REDIS_PORT ?? 6379),
49
+ },
50
+ }),
51
+ // nestforge:feature:redis:end
52
+ DatabaseModule,
53
+ // nestforge:feature:auth:enabled
54
+ AuthModule,
55
+ UsersModule,
56
+ // nestforge:feature:auth:enabled:end
57
+ // nestforge:feature:redis
58
+ MailModule,
59
+ // nestforge:feature:redis:end
60
+ HealthModule,
61
+ MetricsModule,
62
+ ],
63
+ })
64
+ export class AppModule implements NestModule {
65
+ configure(consumer: MiddlewareConsumer) {
66
+ // nestforge:feature:auth:session
67
+ if (process.env.ENABLE_CSRF === 'true') {
68
+ consumer.apply(CsrfMiddleware).forRoutes('*');
69
+ }
70
+ // nestforge:feature:auth:session:end
71
+ }
72
+ }