spoonfeeder 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 (690) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -0
  3. package/dist/generator/ai-context-assembler.d.ts +4 -0
  4. package/dist/generator/ai-context-assembler.js +52 -0
  5. package/dist/generator/ai-context-assembler.js.map +1 -0
  6. package/dist/generator/env-merger.d.ts +3 -0
  7. package/dist/generator/env-merger.js +16 -0
  8. package/dist/generator/env-merger.js.map +1 -0
  9. package/dist/generator/generator.d.ts +3 -0
  10. package/dist/generator/generator.js +253 -0
  11. package/dist/generator/generator.js.map +1 -0
  12. package/dist/generator/package-json-merger.d.ts +6 -0
  13. package/dist/generator/package-json-merger.js +29 -0
  14. package/dist/generator/package-json-merger.js.map +1 -0
  15. package/dist/generator/post-generate.d.ts +1 -0
  16. package/dist/generator/post-generate.js +28 -0
  17. package/dist/generator/post-generate.js.map +1 -0
  18. package/dist/generator/template-engine.d.ts +4 -0
  19. package/dist/generator/template-engine.js +20 -0
  20. package/dist/generator/template-engine.js.map +1 -0
  21. package/dist/generators/add-recipe/generator.d.ts +3 -0
  22. package/dist/generators/add-recipe/generator.js +153 -0
  23. package/dist/generators/add-recipe/generator.js.map +1 -0
  24. package/dist/generators/list-recipes/generator.d.ts +3 -0
  25. package/dist/generators/list-recipes/generator.js +58 -0
  26. package/dist/generators/list-recipes/generator.js.map +1 -0
  27. package/dist/generators/migrate-recipe/generator.d.ts +9 -0
  28. package/dist/generators/migrate-recipe/generator.js +90 -0
  29. package/dist/generators/migrate-recipe/generator.js.map +1 -0
  30. package/dist/generators/migrate-recipe/migration-guidance.d.ts +1 -0
  31. package/dist/generators/migrate-recipe/migration-guidance.js +159 -0
  32. package/dist/generators/migrate-recipe/migration-guidance.js.map +1 -0
  33. package/dist/generators/remove-recipe/generator.d.ts +3 -0
  34. package/dist/generators/remove-recipe/generator.js +176 -0
  35. package/dist/generators/remove-recipe/generator.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +40 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/prompts/add-ons.d.ts +3 -0
  40. package/dist/prompts/add-ons.js +29 -0
  41. package/dist/prompts/add-ons.js.map +1 -0
  42. package/dist/prompts/ci-cd.d.ts +2 -0
  43. package/dist/prompts/ci-cd.js +19 -0
  44. package/dist/prompts/ci-cd.js.map +1 -0
  45. package/dist/prompts/cloud-provider.d.ts +2 -0
  46. package/dist/prompts/cloud-provider.js +18 -0
  47. package/dist/prompts/cloud-provider.js.map +1 -0
  48. package/dist/prompts/confirmation.d.ts +2 -0
  49. package/dist/prompts/confirmation.js +29 -0
  50. package/dist/prompts/confirmation.js.map +1 -0
  51. package/dist/prompts/deployment.d.ts +2 -0
  52. package/dist/prompts/deployment.js +20 -0
  53. package/dist/prompts/deployment.js.map +1 -0
  54. package/dist/prompts/frontend.d.ts +2 -0
  55. package/dist/prompts/frontend.js +18 -0
  56. package/dist/prompts/frontend.js.map +1 -0
  57. package/dist/prompts/project-name.d.ts +5 -0
  58. package/dist/prompts/project-name.js +34 -0
  59. package/dist/prompts/project-name.js.map +1 -0
  60. package/dist/prompts/project-type.d.ts +2 -0
  61. package/dist/prompts/project-type.js +22 -0
  62. package/dist/prompts/project-type.js.map +1 -0
  63. package/dist/prompts/run-all.d.ts +3 -0
  64. package/dist/prompts/run-all.js +83 -0
  65. package/dist/prompts/run-all.js.map +1 -0
  66. package/dist/prompts/transport.d.ts +2 -0
  67. package/dist/prompts/transport.js +22 -0
  68. package/dist/prompts/transport.js.map +1 -0
  69. package/dist/recipes/definitions.d.ts +2 -0
  70. package/dist/recipes/definitions.js +3647 -0
  71. package/dist/recipes/definitions.js.map +1 -0
  72. package/dist/recipes/recipe.interface.d.ts +8 -0
  73. package/dist/recipes/recipe.interface.js +2 -0
  74. package/dist/recipes/recipe.interface.js.map +1 -0
  75. package/dist/recipes/registry.d.ts +9 -0
  76. package/dist/recipes/registry.js +23 -0
  77. package/dist/recipes/registry.js.map +1 -0
  78. package/dist/types.d.ts +70 -0
  79. package/dist/types.js +152 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/utils/ai-context-updater.d.ts +6 -0
  82. package/dist/utils/ai-context-updater.js +50 -0
  83. package/dist/utils/ai-context-updater.js.map +1 -0
  84. package/dist/utils/dependency-checker.d.ts +14 -0
  85. package/dist/utils/dependency-checker.js +27 -0
  86. package/dist/utils/dependency-checker.js.map +1 -0
  87. package/dist/utils/env-updater.d.ts +7 -0
  88. package/dist/utils/env-updater.js +35 -0
  89. package/dist/utils/env-updater.js.map +1 -0
  90. package/dist/utils/main-ts-updater.d.ts +37 -0
  91. package/dist/utils/main-ts-updater.js +144 -0
  92. package/dist/utils/main-ts-updater.js.map +1 -0
  93. package/dist/utils/module-updater.d.ts +26 -0
  94. package/dist/utils/module-updater.js +167 -0
  95. package/dist/utils/module-updater.js.map +1 -0
  96. package/dist/utils/recipe-manifest.d.ts +24 -0
  97. package/dist/utils/recipe-manifest.js +45 -0
  98. package/dist/utils/recipe-manifest.js.map +1 -0
  99. package/dist/validation/config-validator.d.ts +13 -0
  100. package/dist/validation/config-validator.js +50 -0
  101. package/dist/validation/config-validator.js.map +1 -0
  102. package/dist/validation/conflict-detector.d.ts +7 -0
  103. package/dist/validation/conflict-detector.js +37 -0
  104. package/dist/validation/conflict-detector.js.map +1 -0
  105. package/generators.json +24 -0
  106. package/package.json +78 -0
  107. package/src/generators/add-recipe/schema.json +21 -0
  108. package/src/generators/list-recipes/schema.json +18 -0
  109. package/src/generators/migrate-recipe/schema.json +20 -0
  110. package/src/generators/remove-recipe/schema.json +21 -0
  111. package/templates/base/.env.example.ejs +3 -0
  112. package/templates/base/README.md.ejs +20 -0
  113. package/templates/base/SECURITY.md +36 -0
  114. package/templates/base/commitlint.config.js +15 -0
  115. package/templates/base/docs/adr/000-template.md +45 -0
  116. package/templates/base/docs/adr/001-framework-selection.md +54 -0
  117. package/templates/base/docs/adr/002-error-handling-strategy.md +36 -0
  118. package/templates/base/docs/adr/003-database-strategy.md +40 -0
  119. package/templates/base/docs/adr/004-authentication-architecture.md +44 -0
  120. package/templates/base/docs/adr/005-deployment-strategy.md +40 -0
  121. package/templates/base/docs/adr/006-testing-strategy.md +41 -0
  122. package/templates/base/docs/adr/007-scaffolder-architecture.md +64 -0
  123. package/templates/base/docs/adr/008-recipe-system.md +47 -0
  124. package/templates/base/docs/adr/009-standards-compliance.md +54 -0
  125. package/templates/base/docs/adr/010-ai-context-generation.md +44 -0
  126. package/templates/base/docs/adr/011-package-versioning.md +44 -0
  127. package/templates/base/docs/adr/012-monorepo-strategy.md +54 -0
  128. package/templates/base/docs/adr/013-http-adapter.md +63 -0
  129. package/templates/base/docs/adr/014-build-toolchain.md +61 -0
  130. package/templates/base/docs/adr/015-cloud-provider-strategy.md +49 -0
  131. package/templates/base/docs/adr/016-ci-cd-pipeline-strategy.md +52 -0
  132. package/templates/base/docs/adr/017-logging-strategy.md +63 -0
  133. package/templates/base/docs/adr/018-security-architecture.md +61 -0
  134. package/templates/base/docs/adr/019-project-type-design.md +61 -0
  135. package/templates/base/docs/adr/020-frontend-framework-support.md +57 -0
  136. package/templates/base/docs/adr/021-observability-strategy.md +68 -0
  137. package/templates/base/docs/adr/022-api-design-patterns.md +64 -0
  138. package/templates/base/docs/adr/023-error-hierarchy.md +54 -0
  139. package/templates/base/docs/adr/024-request-context-pattern.md +57 -0
  140. package/templates/base/docs/adr/025-data-patterns.md +58 -0
  141. package/templates/base/docs/adr/026-migration-strategy.md +57 -0
  142. package/templates/base/docs/adr/027-dependency-management.md +60 -0
  143. package/templates/base/docs/adr/028-code-quality-toolchain.md +60 -0
  144. package/templates/base/docs/adr/029-admin-panel.md +53 -0
  145. package/templates/base/docs/adr/030-performance-patterns.md +60 -0
  146. package/templates/base/docs/adr/031-nx-generators-roadmap.md +73 -0
  147. package/templates/base/docs/runbooks/000-template.md +78 -0
  148. package/templates/base/docs/sla-slo.md +36 -0
  149. package/templates/base/dot-editorconfig +12 -0
  150. package/templates/base/dot-github/ISSUE_TEMPLATE/bug_report.md +33 -0
  151. package/templates/base/dot-github/ISSUE_TEMPLATE/feature_request.md +21 -0
  152. package/templates/base/dot-github/pull_request_template.md +32 -0
  153. package/templates/base/dot-gitignore +28 -0
  154. package/templates/base/dot-husky/commit-msg +1 -0
  155. package/templates/base/dot-husky/pre-commit +1 -0
  156. package/templates/base/dot-husky/pre-push +2 -0
  157. package/templates/base/dot-npmrc +1 -0
  158. package/templates/base/dot-nvmrc +1 -0
  159. package/templates/base/dot-prettierrc +8 -0
  160. package/templates/base/eslint.config.mjs +35 -0
  161. package/templates/base/jest.config.ts +56 -0
  162. package/templates/base/nest-cli.json.ejs +10 -0
  163. package/templates/base/nx.json +3 -0
  164. package/templates/base/package.json.ejs +78 -0
  165. package/templates/base/src/app/modules/.gitkeep +0 -0
  166. package/templates/base/src/config/.gitkeep +0 -0
  167. package/templates/base/src/infrastructure/database/entities/.gitkeep +0 -0
  168. package/templates/base/src/infrastructure/database/migrations/.gitkeep +0 -0
  169. package/templates/base/src/infrastructure/database/repositories/.gitkeep +0 -0
  170. package/templates/base/src/infrastructure/http/.gitkeep +0 -0
  171. package/templates/base/src/infrastructure/notifications/.gitkeep +0 -0
  172. package/templates/base/src/infrastructure/queue/.gitkeep +0 -0
  173. package/templates/base/src/infrastructure/storage/.gitkeep +0 -0
  174. package/templates/base/src/shared/constants/error-codes.constant.ts +30 -0
  175. package/templates/base/src/shared/constants/http.constant.ts +134 -0
  176. package/templates/base/src/shared/constants/index.ts +2 -0
  177. package/templates/base/src/shared/decorators/.gitkeep +0 -0
  178. package/templates/base/src/shared/decorators/api-paginated-response.decorator.ts +10 -0
  179. package/templates/base/src/shared/errors/application.error.ts +21 -0
  180. package/templates/base/src/shared/errors/forbidden.error.ts +7 -0
  181. package/templates/base/src/shared/errors/index.ts +6 -0
  182. package/templates/base/src/shared/errors/invalid-request.error.ts +7 -0
  183. package/templates/base/src/shared/errors/not-found.error.ts +7 -0
  184. package/templates/base/src/shared/errors/requester.error.ts +7 -0
  185. package/templates/base/src/shared/errors/validation.error.ts +7 -0
  186. package/templates/base/src/shared/filters/http-exception.filter.ts +139 -0
  187. package/templates/base/src/shared/guards/.gitkeep +0 -0
  188. package/templates/base/src/shared/interceptors/interfaces/.gitkeep +0 -0
  189. package/templates/base/src/shared/interceptors/response.interceptor.ts +22 -0
  190. package/templates/base/src/shared/middleware/request-timeout.middleware.ts +32 -0
  191. package/templates/base/src/shared/pipes/parse-uuid.pipe.ts +13 -0
  192. package/templates/base/src/shared/utils/index.ts +2 -0
  193. package/templates/base/src/shared/utils/retry.util.ts +32 -0
  194. package/templates/base/src/shared/utils/sleep.util.ts +3 -0
  195. package/templates/base/tests/e2e/app.e2e-spec.ts.ejs +25 -0
  196. package/templates/base/tests/factories/.gitkeep +0 -0
  197. package/templates/base/tests/helpers/.gitkeep +0 -0
  198. package/templates/base/tests/integration/.gitkeep +0 -0
  199. package/templates/base/tests/unit/app.module.spec.ts +11 -0
  200. package/templates/base/tests/unit/shared/errors/error-hierarchy.spec.ts +69 -0
  201. package/templates/base/tests/unit/shared/filters/http-exception.filter.spec.ts +188 -0
  202. package/templates/base/tests/unit/shared/interceptors/response.interceptor.spec.ts +54 -0
  203. package/templates/base/tests/unit/shared/pipes/parse-uuid.pipe.spec.ts +14 -0
  204. package/templates/base/tsconfig.build.json +4 -0
  205. package/templates/base/tsconfig.json.ejs +26 -0
  206. package/templates/project-types/aws-lambda/package-fragment.json +8 -0
  207. package/templates/project-types/aws-lambda/src/app.module.ts.ejs +9 -0
  208. package/templates/project-types/aws-lambda/src/main.ts.ejs +32 -0
  209. package/templates/project-types/aws-lambda/tests/unit/handler.spec.ts +7 -0
  210. package/templates/project-types/cli-app/package-fragment.json +8 -0
  211. package/templates/project-types/cli-app/src/app.module.ts.ejs +11 -0
  212. package/templates/project-types/cli-app/src/commands/hello.command.ts.ejs +8 -0
  213. package/templates/project-types/cli-app/src/main.ts.ejs +8 -0
  214. package/templates/project-types/cli-app/tests/unit/commands/hello.command.spec.ts +17 -0
  215. package/templates/project-types/full-stack/apps/api/src/app.module.ts.ejs +9 -0
  216. package/templates/project-types/full-stack/apps/api/src/main.ts.ejs +32 -0
  217. package/templates/project-types/full-stack/frontend/nextjs/.cursor/rules/nextjs.mdc +12 -0
  218. package/templates/project-types/full-stack/frontend/nextjs/.github/copilot-instructions.md +23 -0
  219. package/templates/project-types/full-stack/frontend/nextjs/CLAUDE.md +25 -0
  220. package/templates/project-types/full-stack/frontend/nextjs/next.config.ts +9 -0
  221. package/templates/project-types/full-stack/frontend/nextjs/package.json +21 -0
  222. package/templates/project-types/full-stack/frontend/nextjs/src/app/layout.tsx +9 -0
  223. package/templates/project-types/full-stack/frontend/nextjs/src/app/page.tsx +8 -0
  224. package/templates/project-types/full-stack/frontend/nextjs/tsconfig.json +21 -0
  225. package/templates/project-types/full-stack/frontend/nuxt/.cursor/rules/nuxt.mdc +14 -0
  226. package/templates/project-types/full-stack/frontend/nuxt/.github/copilot-instructions.md +25 -0
  227. package/templates/project-types/full-stack/frontend/nuxt/CLAUDE.md +25 -0
  228. package/templates/project-types/full-stack/frontend/nuxt/app.vue +5 -0
  229. package/templates/project-types/full-stack/frontend/nuxt/nuxt.config.ts +6 -0
  230. package/templates/project-types/full-stack/frontend/nuxt/package.json +17 -0
  231. package/templates/project-types/full-stack/frontend/nuxt/pages/index.vue +3 -0
  232. package/templates/project-types/full-stack/frontend/nuxt/tsconfig.json +1 -0
  233. package/templates/project-types/full-stack/frontend/sveltekit/.cursor/rules/sveltekit.mdc +13 -0
  234. package/templates/project-types/full-stack/frontend/sveltekit/.github/copilot-instructions.md +24 -0
  235. package/templates/project-types/full-stack/frontend/sveltekit/CLAUDE.md +25 -0
  236. package/templates/project-types/full-stack/frontend/sveltekit/package.json +17 -0
  237. package/templates/project-types/full-stack/frontend/sveltekit/src/app.html +5 -0
  238. package/templates/project-types/full-stack/frontend/sveltekit/src/routes/+page.svelte +1 -0
  239. package/templates/project-types/full-stack/frontend/sveltekit/svelte.config.js +5 -0
  240. package/templates/project-types/full-stack/frontend/sveltekit/vite.config.ts +9 -0
  241. package/templates/project-types/full-stack/frontend/vite-react/.cursor/rules/react.mdc +12 -0
  242. package/templates/project-types/full-stack/frontend/vite-react/.github/copilot-instructions.md +23 -0
  243. package/templates/project-types/full-stack/frontend/vite-react/CLAUDE.md +24 -0
  244. package/templates/project-types/full-stack/frontend/vite-react/index.html +5 -0
  245. package/templates/project-types/full-stack/frontend/vite-react/package.json +22 -0
  246. package/templates/project-types/full-stack/frontend/vite-react/src/App.tsx +8 -0
  247. package/templates/project-types/full-stack/frontend/vite-react/src/main.tsx +9 -0
  248. package/templates/project-types/full-stack/frontend/vite-react/tsconfig.json +21 -0
  249. package/templates/project-types/full-stack/frontend/vite-react/vite.config.ts +9 -0
  250. package/templates/project-types/full-stack/libs/shared-types/package.json.ejs +6 -0
  251. package/templates/project-types/full-stack/libs/shared-types/src/index.ts.ejs +15 -0
  252. package/templates/project-types/full-stack/nx.json.ejs +20 -0
  253. package/templates/project-types/full-stack/package-fragment.json +14 -0
  254. package/templates/project-types/full-stack/pnpm-workspace.yaml +3 -0
  255. package/templates/project-types/full-stack/tsconfig.json.ejs +27 -0
  256. package/templates/project-types/http-api/src/app.module.ts.ejs +9 -0
  257. package/templates/project-types/http-api/src/main.ts.ejs +30 -0
  258. package/templates/project-types/http-api/tests/e2e/health.e2e-spec.ts +23 -0
  259. package/templates/project-types/microservice/package-fragment.json +5 -0
  260. package/templates/project-types/microservice/src/app.module.ts.ejs +9 -0
  261. package/templates/project-types/microservice/src/main.ts.ejs +15 -0
  262. package/templates/project-types/microservice/tests/unit/app.module.spec.ts +9 -0
  263. package/templates/project-types/monorepo/README.md.ejs +33 -0
  264. package/templates/project-types/monorepo/apps/api/src/app.module.ts.ejs +9 -0
  265. package/templates/project-types/monorepo/apps/api/src/main.ts.ejs +30 -0
  266. package/templates/project-types/monorepo/libs/common/package.json.ejs +6 -0
  267. package/templates/project-types/monorepo/libs/common/src/index.ts.ejs +17 -0
  268. package/templates/project-types/monorepo/nx.json.ejs +20 -0
  269. package/templates/project-types/monorepo/package-fragment.json +13 -0
  270. package/templates/project-types/monorepo/pnpm-workspace.yaml +3 -0
  271. package/templates/project-types/monorepo/tsconfig.json.ejs +27 -0
  272. package/templates/project-types/scheduled-worker/package-fragment.json +5 -0
  273. package/templates/project-types/scheduled-worker/src/app.module.ts.ejs +13 -0
  274. package/templates/project-types/scheduled-worker/src/jobs/example.job.ts.ejs +12 -0
  275. package/templates/project-types/scheduled-worker/src/main.ts.ejs +10 -0
  276. package/templates/project-types/scheduled-worker/tests/unit/jobs/example.job.spec.ts +17 -0
  277. package/templates/recipes/adminjs/README.md +145 -0
  278. package/templates/recipes/adminjs/src/app/modules/admin/admin.module.ts +59 -0
  279. package/templates/recipes/adminjs/tests/unit/app/modules/admin/admin.module.spec.ts +22 -0
  280. package/templates/recipes/ai-context/README.md +11 -0
  281. package/templates/recipes/ai-context/claude/base.md +73 -0
  282. package/templates/recipes/ai-context/claude/commands/add-command.md +48 -0
  283. package/templates/recipes/ai-context/claude/commands/add-consumer.md +58 -0
  284. package/templates/recipes/ai-context/claude/commands/add-endpoint.md +69 -0
  285. package/templates/recipes/ai-context/claude/commands/add-job.md +42 -0
  286. package/templates/recipes/ai-context/claude/commands/migrate.md +69 -0
  287. package/templates/recipes/ai-context/copilot/base.md +71 -0
  288. package/templates/recipes/ai-context/cursor/auth.mdc +44 -0
  289. package/templates/recipes/ai-context/cursor/base.mdc +44 -0
  290. package/templates/recipes/ai-context/cursor/prisma.mdc +43 -0
  291. package/templates/recipes/ai-context/cursor/swagger.mdc +48 -0
  292. package/templates/recipes/ai-context/cursor/testing.mdc +58 -0
  293. package/templates/recipes/ai-context/cursor/typeorm.mdc +49 -0
  294. package/templates/recipes/api-keys/README.md +44 -0
  295. package/templates/recipes/api-keys/src/shared/guards/api-key.guard.ts +32 -0
  296. package/templates/recipes/api-keys/tests/unit/shared/guards/api-key.guard.spec.ts +40 -0
  297. package/templates/recipes/api-versioning/README.md +63 -0
  298. package/templates/recipes/audit-trail/README.md +75 -0
  299. package/templates/recipes/audit-trail/src/shared/decorators/auditable.decorator.ts +4 -0
  300. package/templates/recipes/audit-trail/src/shared/interceptors/audit.interceptor.ts +46 -0
  301. package/templates/recipes/audit-trail/tests/unit/shared/interceptors/audit.interceptor.spec.ts +82 -0
  302. package/templates/recipes/auth-flows/README.md +91 -0
  303. package/templates/recipes/auth-flows/src/app/modules/auth/auth.controller.ts +44 -0
  304. package/templates/recipes/auth-flows/src/app/modules/auth/auth.module.ts +11 -0
  305. package/templates/recipes/auth-flows/src/app/modules/auth/auth.service.ts +194 -0
  306. package/templates/recipes/auth-flows/src/app/modules/auth/dto/forgot-password.dto.ts +6 -0
  307. package/templates/recipes/auth-flows/src/app/modules/auth/dto/login.dto.ts +9 -0
  308. package/templates/recipes/auth-flows/src/app/modules/auth/dto/reset-password.dto.ts +11 -0
  309. package/templates/recipes/auth-flows/src/app/modules/auth/dto/signup.dto.ts +16 -0
  310. package/templates/recipes/auth-flows/tests/unit/app/modules/auth/auth.service.spec.ts +13 -0
  311. package/templates/recipes/bullmq/README.md +54 -0
  312. package/templates/recipes/bullmq/src/infrastructure/queue/example.processor.ts +25 -0
  313. package/templates/recipes/bullmq/src/infrastructure/queue/queue.module.ts +26 -0
  314. package/templates/recipes/bullmq/tests/unit/infrastructure/queue/example.processor.spec.ts +17 -0
  315. package/templates/recipes/changelog/.changelogrc.json +18 -0
  316. package/templates/recipes/changelog/README.md +44 -0
  317. package/templates/recipes/ci-cd/README.md +14 -0
  318. package/templates/recipes/ci-cd/aws-codepipeline/README.md +30 -0
  319. package/templates/recipes/ci-cd/aws-codepipeline/buildspec.yml +41 -0
  320. package/templates/recipes/ci-cd/azure-devops/README.md +32 -0
  321. package/templates/recipes/ci-cd/azure-devops/azure-pipelines.yml +79 -0
  322. package/templates/recipes/ci-cd/gcp-cloudbuild/README.md +64 -0
  323. package/templates/recipes/ci-cd/gcp-cloudbuild/cloudbuild.yaml +53 -0
  324. package/templates/recipes/ci-cd/github-actions/.github/workflows/cd.yml +35 -0
  325. package/templates/recipes/ci-cd/github-actions/.github/workflows/ci.yml +62 -0
  326. package/templates/recipes/ci-cd/github-actions/README.md +29 -0
  327. package/templates/recipes/circuit-breaker/README.md +45 -0
  328. package/templates/recipes/circuit-breaker/src/shared/utils/circuit-breaker.ts +100 -0
  329. package/templates/recipes/circuit-breaker/tests/unit/shared/utils/circuit-breaker.spec.ts +28 -0
  330. package/templates/recipes/cloud-aws/README.md +20 -0
  331. package/templates/recipes/cloud-aws/cloudfront/README.md +50 -0
  332. package/templates/recipes/cloud-aws/cloudfront/src/infrastructure/aws/cloudfront.module.ts +8 -0
  333. package/templates/recipes/cloud-aws/cloudfront/src/infrastructure/aws/cloudfront.service.ts +29 -0
  334. package/templates/recipes/cloud-aws/cloudwatch/README.md +40 -0
  335. package/templates/recipes/cloud-aws/cloudwatch/src/infrastructure/aws/cloudwatch.module.ts +8 -0
  336. package/templates/recipes/cloud-aws/cloudwatch/src/infrastructure/aws/cloudwatch.service.ts +40 -0
  337. package/templates/recipes/cloud-aws/cognito/README.md +39 -0
  338. package/templates/recipes/cloud-aws/cognito/src/infrastructure/aws/cognito.module.ts +8 -0
  339. package/templates/recipes/cloud-aws/cognito/src/infrastructure/aws/cognito.service.ts +47 -0
  340. package/templates/recipes/cloud-aws/dynamodb/README.md +48 -0
  341. package/templates/recipes/cloud-aws/dynamodb/src/infrastructure/aws/dynamodb.module.ts +8 -0
  342. package/templates/recipes/cloud-aws/dynamodb/src/infrastructure/aws/dynamodb.service.ts +49 -0
  343. package/templates/recipes/cloud-aws/elasticache/README.md +45 -0
  344. package/templates/recipes/cloud-aws/elasticache/src/infrastructure/aws/redis.module.ts +8 -0
  345. package/templates/recipes/cloud-aws/elasticache/src/infrastructure/aws/redis.service.ts +47 -0
  346. package/templates/recipes/cloud-aws/eventbridge/README.md +46 -0
  347. package/templates/recipes/cloud-aws/eventbridge/src/infrastructure/aws/eventbridge.module.ts +8 -0
  348. package/templates/recipes/cloud-aws/eventbridge/src/infrastructure/aws/eventbridge.service.ts +48 -0
  349. package/templates/recipes/cloud-aws/rds/README.md +59 -0
  350. package/templates/recipes/cloud-aws/s3/README.md +44 -0
  351. package/templates/recipes/cloud-aws/s3/src/infrastructure/aws/s3.module.ts +8 -0
  352. package/templates/recipes/cloud-aws/s3/src/infrastructure/aws/s3.service.ts +42 -0
  353. package/templates/recipes/cloud-aws/secrets-manager/README.md +38 -0
  354. package/templates/recipes/cloud-aws/secrets-manager/src/infrastructure/aws/secrets.module.ts +8 -0
  355. package/templates/recipes/cloud-aws/secrets-manager/src/infrastructure/aws/secrets.service.ts +39 -0
  356. package/templates/recipes/cloud-aws/sns/README.md +43 -0
  357. package/templates/recipes/cloud-aws/sns/src/infrastructure/aws/sns.module.ts +8 -0
  358. package/templates/recipes/cloud-aws/sns/src/infrastructure/aws/sns.service.ts +48 -0
  359. package/templates/recipes/cloud-aws/sqs/README.md +47 -0
  360. package/templates/recipes/cloud-aws/sqs/src/infrastructure/aws/sqs.module.ts +8 -0
  361. package/templates/recipes/cloud-aws/sqs/src/infrastructure/aws/sqs.service.ts +58 -0
  362. package/templates/recipes/cloud-aws/ssm/README.md +41 -0
  363. package/templates/recipes/cloud-aws/ssm/src/infrastructure/aws/ssm.module.ts +8 -0
  364. package/templates/recipes/cloud-aws/ssm/src/infrastructure/aws/ssm.service.ts +54 -0
  365. package/templates/recipes/cloud-azure/README.md +18 -0
  366. package/templates/recipes/cloud-azure/app-insights/README.md +50 -0
  367. package/templates/recipes/cloud-azure/app-insights/src/infrastructure/azure/app-insights.module.ts +11 -0
  368. package/templates/recipes/cloud-azure/app-insights/src/infrastructure/azure/app-insights.service.ts +38 -0
  369. package/templates/recipes/cloud-azure/blob-storage/README.md +49 -0
  370. package/templates/recipes/cloud-azure/blob-storage/src/infrastructure/azure/blob-storage.module.ts +11 -0
  371. package/templates/recipes/cloud-azure/blob-storage/src/infrastructure/azure/blob-storage.service.ts +64 -0
  372. package/templates/recipes/cloud-azure/cache/README.md +47 -0
  373. package/templates/recipes/cloud-azure/cache/src/infrastructure/azure/redis.module.ts +11 -0
  374. package/templates/recipes/cloud-azure/cache/src/infrastructure/azure/redis.service.ts +41 -0
  375. package/templates/recipes/cloud-azure/cosmos-db/README.md +57 -0
  376. package/templates/recipes/cloud-azure/cosmos-db/src/infrastructure/azure/cosmos-db.module.ts +11 -0
  377. package/templates/recipes/cloud-azure/cosmos-db/src/infrastructure/azure/cosmos-db.service.ts +55 -0
  378. package/templates/recipes/cloud-azure/entra-id/README.md +42 -0
  379. package/templates/recipes/cloud-azure/entra-id/src/infrastructure/azure/entra-id.module.ts +11 -0
  380. package/templates/recipes/cloud-azure/entra-id/src/infrastructure/azure/entra-id.service.ts +55 -0
  381. package/templates/recipes/cloud-azure/front-door/README.md +48 -0
  382. package/templates/recipes/cloud-azure/functions/README.md +48 -0
  383. package/templates/recipes/cloud-azure/key-vault/README.md +42 -0
  384. package/templates/recipes/cloud-azure/key-vault/src/infrastructure/azure/key-vault.module.ts +11 -0
  385. package/templates/recipes/cloud-azure/key-vault/src/infrastructure/azure/key-vault.service.ts +27 -0
  386. package/templates/recipes/cloud-azure/service-bus/README.md +49 -0
  387. package/templates/recipes/cloud-azure/service-bus/src/infrastructure/azure/service-bus.module.ts +11 -0
  388. package/templates/recipes/cloud-azure/service-bus/src/infrastructure/azure/service-bus.service.ts +52 -0
  389. package/templates/recipes/cloud-azure/sql-database/README.md +54 -0
  390. package/templates/recipes/cloud-gcp/README.md +18 -0
  391. package/templates/recipes/cloud-gcp/cloud-cdn/README.md +40 -0
  392. package/templates/recipes/cloud-gcp/cloud-functions/README.md +42 -0
  393. package/templates/recipes/cloud-gcp/cloud-logging/README.md +42 -0
  394. package/templates/recipes/cloud-gcp/cloud-logging/src/infrastructure/gcp/logging.module.ts +10 -0
  395. package/templates/recipes/cloud-gcp/cloud-logging/src/infrastructure/gcp/logging.service.ts +50 -0
  396. package/templates/recipes/cloud-gcp/cloud-sql/README.md +53 -0
  397. package/templates/recipes/cloud-gcp/cloud-storage/README.md +43 -0
  398. package/templates/recipes/cloud-gcp/cloud-storage/src/infrastructure/gcp/storage.module.ts +10 -0
  399. package/templates/recipes/cloud-gcp/cloud-storage/src/infrastructure/gcp/storage.service.ts +51 -0
  400. package/templates/recipes/cloud-gcp/firebase-auth/README.md +38 -0
  401. package/templates/recipes/cloud-gcp/firebase-auth/src/infrastructure/gcp/firebase-auth.module.ts +10 -0
  402. package/templates/recipes/cloud-gcp/firebase-auth/src/infrastructure/gcp/firebase-auth.service.ts +41 -0
  403. package/templates/recipes/cloud-gcp/firestore/README.md +46 -0
  404. package/templates/recipes/cloud-gcp/firestore/src/infrastructure/gcp/firestore.module.ts +10 -0
  405. package/templates/recipes/cloud-gcp/firestore/src/infrastructure/gcp/firestore.service.ts +44 -0
  406. package/templates/recipes/cloud-gcp/memorystore/README.md +44 -0
  407. package/templates/recipes/cloud-gcp/memorystore/src/infrastructure/gcp/redis.module.ts +10 -0
  408. package/templates/recipes/cloud-gcp/memorystore/src/infrastructure/gcp/redis.service.ts +54 -0
  409. package/templates/recipes/cloud-gcp/pubsub/README.md +43 -0
  410. package/templates/recipes/cloud-gcp/pubsub/src/infrastructure/gcp/pubsub.module.ts +10 -0
  411. package/templates/recipes/cloud-gcp/pubsub/src/infrastructure/gcp/pubsub.service.ts +60 -0
  412. package/templates/recipes/cloud-gcp/secret-manager/README.md +40 -0
  413. package/templates/recipes/cloud-gcp/secret-manager/src/infrastructure/gcp/secrets.module.ts +10 -0
  414. package/templates/recipes/cloud-gcp/secret-manager/src/infrastructure/gcp/secrets.service.ts +41 -0
  415. package/templates/recipes/config-validation/README.md +61 -0
  416. package/templates/recipes/config-validation/src/config/env.validation.ts +28 -0
  417. package/templates/recipes/config-validation/tests/unit/config/env.validation.spec.ts +34 -0
  418. package/templates/recipes/content-digest/README.md +28 -0
  419. package/templates/recipes/content-digest/src/shared/guards/content-digest.guard.ts +30 -0
  420. package/templates/recipes/content-digest/src/shared/interceptors/content-digest.interceptor.ts +23 -0
  421. package/templates/recipes/content-digest/tests/unit/shared/guards/content-digest.guard.spec.ts +56 -0
  422. package/templates/recipes/content-digest/tests/unit/shared/interceptors/content-digest.interceptor.spec.ts +54 -0
  423. package/templates/recipes/correlation-id/README.md +44 -0
  424. package/templates/recipes/correlation-id/src/shared/middleware/correlation-id.middleware.ts +29 -0
  425. package/templates/recipes/correlation-id/tests/unit/shared/middleware/correlation-id.spec.ts +5 -0
  426. package/templates/recipes/cors/README.md +45 -0
  427. package/templates/recipes/cqrs/README.md +39 -0
  428. package/templates/recipes/cqrs/src/shared/cqrs/example.command.ts +29 -0
  429. package/templates/recipes/cqrs/tests/unit/shared/cqrs/example.command.spec.ts +38 -0
  430. package/templates/recipes/csrf/README.md +55 -0
  431. package/templates/recipes/data-masking/README.md +85 -0
  432. package/templates/recipes/data-masking/src/shared/decorators/sensitive.decorator.ts +12 -0
  433. package/templates/recipes/data-masking/src/shared/utils/mask.util.ts +26 -0
  434. package/templates/recipes/data-masking/tests/unit/shared/utils/mask.util.spec.ts +21 -0
  435. package/templates/recipes/database-factories/README.md +48 -0
  436. package/templates/recipes/database-factories/tests/factories/base.factory.ts +51 -0
  437. package/templates/recipes/database-seeding/README.md +40 -0
  438. package/templates/recipes/database-seeding/src/infrastructure/database/seed.ts +61 -0
  439. package/templates/recipes/database-seeding/tests/unit/infrastructure/database/seed.spec.ts +37 -0
  440. package/templates/recipes/dead-letter-queue/README.md +79 -0
  441. package/templates/recipes/dead-letter-queue/src/infrastructure/queue/dlq.service.ts +43 -0
  442. package/templates/recipes/dead-letter-queue/tests/unit/infrastructure/queue/dlq.service.spec.ts +46 -0
  443. package/templates/recipes/dependabot-renovate/.github/dependabot.yml +52 -0
  444. package/templates/recipes/dependabot-renovate/README.md +37 -0
  445. package/templates/recipes/dependabot-renovate/renovate.json +46 -0
  446. package/templates/recipes/deploy/README.md +13 -0
  447. package/templates/recipes/deploy/docker-compose/README.md +38 -0
  448. package/templates/recipes/deploy/docker-compose/docker-compose.yml +43 -0
  449. package/templates/recipes/deploy/dockerfile/Dockerfile +30 -0
  450. package/templates/recipes/deploy/dockerfile/README.md +30 -0
  451. package/templates/recipes/deploy/dockerfile/dot-dockerignore +9 -0
  452. package/templates/recipes/deploy/kubernetes/README.md +43 -0
  453. package/templates/recipes/deploy/kubernetes/k8s/configmap.yaml +7 -0
  454. package/templates/recipes/deploy/kubernetes/k8s/deployment.yaml +45 -0
  455. package/templates/recipes/deploy/kubernetes/k8s/hpa.yaml +18 -0
  456. package/templates/recipes/deploy/kubernetes/k8s/ingress.yaml +23 -0
  457. package/templates/recipes/deploy/kubernetes/k8s/service.yaml +12 -0
  458. package/templates/recipes/deploy/serverless-framework/README.md +39 -0
  459. package/templates/recipes/deploy/serverless-framework/serverless.yml.ejs +22 -0
  460. package/templates/recipes/deploy/terraform/README.md +99 -0
  461. package/templates/recipes/deploy/terraform/main.tf.ejs +13 -0
  462. package/templates/recipes/deploy/terraform/modules/app/alb.tf +34 -0
  463. package/templates/recipes/deploy/terraform/modules/app/iam.tf +30 -0
  464. package/templates/recipes/deploy/terraform/modules/app/main.tf +80 -0
  465. package/templates/recipes/deploy/terraform/modules/app/outputs.tf +11 -0
  466. package/templates/recipes/deploy/terraform/modules/app/security.tf +37 -0
  467. package/templates/recipes/deploy/terraform/modules/app/variables.tf +42 -0
  468. package/templates/recipes/deploy/terraform/outputs.tf +4 -0
  469. package/templates/recipes/deploy/terraform/variables.tf +11 -0
  470. package/templates/recipes/devcontainer/.devcontainer/Dockerfile +5 -0
  471. package/templates/recipes/devcontainer/.devcontainer/devcontainer.json +32 -0
  472. package/templates/recipes/devcontainer/.devcontainer/docker-compose.yml +62 -0
  473. package/templates/recipes/devcontainer/README.md +31 -0
  474. package/templates/recipes/distributed-tracing/README.md +45 -0
  475. package/templates/recipes/distributed-tracing/src/shared/middleware/trace-propagation.middleware.ts +68 -0
  476. package/templates/recipes/distributed-tracing/tests/unit/shared/middleware/trace-propagation.middleware.spec.ts +76 -0
  477. package/templates/recipes/docker-compose-dev/Dockerfile.dev +14 -0
  478. package/templates/recipes/docker-compose-dev/README.md +57 -0
  479. package/templates/recipes/docker-compose-dev/docker-compose.dev.yml.ejs +54 -0
  480. package/templates/recipes/docs-site/README.md +41 -0
  481. package/templates/recipes/docs-site/docs/.vitepress/config.ts.ejs +53 -0
  482. package/templates/recipes/dpop/README.md +37 -0
  483. package/templates/recipes/dpop/src/shared/guards/dpop.guard.ts +61 -0
  484. package/templates/recipes/dpop/tests/unit/shared/guards/dpop.guard.spec.ts +69 -0
  485. package/templates/recipes/drizzle-postgres/README.md +68 -0
  486. package/templates/recipes/drizzle-postgres/drizzle.config.ts +10 -0
  487. package/templates/recipes/drizzle-postgres/src/infrastructure/database/drizzle.module.ts +25 -0
  488. package/templates/recipes/drizzle-postgres/src/infrastructure/database/schema/example.ts +9 -0
  489. package/templates/recipes/drizzle-postgres/src/infrastructure/database/schema/index.ts +3 -0
  490. package/templates/recipes/drizzle-postgres/tests/unit/infrastructure/database/drizzle.module.spec.ts +35 -0
  491. package/templates/recipes/env-per-environment/.env.development +17 -0
  492. package/templates/recipes/env-per-environment/.env.production +20 -0
  493. package/templates/recipes/env-per-environment/.env.test +17 -0
  494. package/templates/recipes/env-per-environment/README.md +40 -0
  495. package/templates/recipes/feature-flags/README.md +45 -0
  496. package/templates/recipes/feature-flags/src/shared/services/feature-flag.service.ts +48 -0
  497. package/templates/recipes/feature-flags/tests/unit/shared/services/feature-flag.service.spec.ts +36 -0
  498. package/templates/recipes/file-upload/README.md +104 -0
  499. package/templates/recipes/file-upload/src/shared/interceptors/file-upload.interceptor.ts +33 -0
  500. package/templates/recipes/file-upload/src/shared/pipes/file-validation.pipe.ts +45 -0
  501. package/templates/recipes/file-upload/tests/unit/shared/pipes/file-validation.pipe.spec.ts +56 -0
  502. package/templates/recipes/filtering/README.md +43 -0
  503. package/templates/recipes/filtering/src/shared/dto/filter.dto.ts +49 -0
  504. package/templates/recipes/filtering/tests/unit/shared/dto/filter.dto.spec.ts +38 -0
  505. package/templates/recipes/graceful-shutdown/README.md +60 -0
  506. package/templates/recipes/graceful-shutdown/src/shared/lifecycle/shutdown.service.ts +52 -0
  507. package/templates/recipes/graceful-shutdown/tests/unit/shared/lifecycle/shutdown.service.spec.ts +52 -0
  508. package/templates/recipes/graphql-mercurius/README.md +37 -0
  509. package/templates/recipes/graphql-mercurius/src/infrastructure/graphql/graphql.module.ts +18 -0
  510. package/templates/recipes/graphql-mercurius/tests/unit/infrastructure/graphql/graphql.module.spec.ts +12 -0
  511. package/templates/recipes/health-checks/README.md +35 -0
  512. package/templates/recipes/health-checks/src/shared/health/health.controller.ts +26 -0
  513. package/templates/recipes/health-checks/src/shared/health/health.module.ts +9 -0
  514. package/templates/recipes/health-checks/tests/unit/shared/health/health.controller.spec.ts +8 -0
  515. package/templates/recipes/helmet/README.md +43 -0
  516. package/templates/recipes/http-caching/README.md +63 -0
  517. package/templates/recipes/http-caching/src/shared/decorators/cache-control.decorator.ts +18 -0
  518. package/templates/recipes/http-caching/src/shared/interceptors/cache-control.interceptor.ts +43 -0
  519. package/templates/recipes/http-caching/tests/unit/shared/interceptors/cache-control.interceptor.spec.ts +44 -0
  520. package/templates/recipes/i18n/README.md +45 -0
  521. package/templates/recipes/i18n/src/i18n/en/common.json +7 -0
  522. package/templates/recipes/i18n/src/i18n/nl/common.json +7 -0
  523. package/templates/recipes/i18n/src/shared/i18n/i18n.module.ts +17 -0
  524. package/templates/recipes/i18n/tests/unit/shared/i18n/i18n.module.spec.ts +18 -0
  525. package/templates/recipes/idempotency/README.md +63 -0
  526. package/templates/recipes/idempotency/src/shared/decorators/idempotent.decorator.ts +4 -0
  527. package/templates/recipes/idempotency/src/shared/middleware/idempotency.middleware.ts +63 -0
  528. package/templates/recipes/idempotency/tests/unit/shared/middleware/idempotency.middleware.spec.ts +56 -0
  529. package/templates/recipes/json-merge-patch/README.md +53 -0
  530. package/templates/recipes/json-merge-patch/src/shared/pipes/merge-patch.pipe.ts +11 -0
  531. package/templates/recipes/json-merge-patch/tests/unit/shared/pipes/merge-patch.pipe.spec.ts +30 -0
  532. package/templates/recipes/json-patch/README.md +54 -0
  533. package/templates/recipes/json-patch/src/shared/pipes/json-patch.pipe.ts +39 -0
  534. package/templates/recipes/json-patch/tests/unit/shared/pipes/json-patch.pipe.spec.ts +37 -0
  535. package/templates/recipes/jwt-auth/README.md +56 -0
  536. package/templates/recipes/jwt-auth/src/shared/decorators/current-user.decorator.ts +10 -0
  537. package/templates/recipes/jwt-auth/src/shared/decorators/public.decorator.ts +4 -0
  538. package/templates/recipes/jwt-auth/src/shared/guards/jwt-auth.guard.ts +24 -0
  539. package/templates/recipes/jwt-auth/tests/unit/shared/guards/jwt-auth.guard.spec.ts +9 -0
  540. package/templates/recipes/kysely/README.md +53 -0
  541. package/templates/recipes/kysely/src/infrastructure/database/database.module.ts +28 -0
  542. package/templates/recipes/kysely/src/infrastructure/database/types.ts +17 -0
  543. package/templates/recipes/kysely/tests/unit/infrastructure/database/database.module.spec.ts +35 -0
  544. package/templates/recipes/license/LICENSE.agpl3 +59 -0
  545. package/templates/recipes/license/LICENSE.apache +189 -0
  546. package/templates/recipes/license/LICENSE.bsd3 +28 -0
  547. package/templates/recipes/license/LICENSE.gpl3 +22 -0
  548. package/templates/recipes/license/LICENSE.isc +15 -0
  549. package/templates/recipes/license/LICENSE.mit +21 -0
  550. package/templates/recipes/license/LICENSE.mpl2 +24 -0
  551. package/templates/recipes/license/LICENSE.proprietary +76 -0
  552. package/templates/recipes/license/LICENSE.unlicensed +13 -0
  553. package/templates/recipes/license/README.md +53 -0
  554. package/templates/recipes/load-testing/README.md +77 -0
  555. package/templates/recipes/load-testing/k6/smoke.js +20 -0
  556. package/templates/recipes/load-testing/k6/stress.js +22 -0
  557. package/templates/recipes/mfa-totp/README.md +77 -0
  558. package/templates/recipes/mfa-totp/src/shared/auth/totp.service.ts +26 -0
  559. package/templates/recipes/mfa-totp/tests/unit/shared/auth/totp.service.spec.ts +65 -0
  560. package/templates/recipes/mikro-orm/README.md +22 -0
  561. package/templates/recipes/mikro-orm/src/infrastructure/database/database.module.ts +8 -0
  562. package/templates/recipes/mikro-orm/src/infrastructure/database/entities/.gitkeep +0 -0
  563. package/templates/recipes/mikro-orm/src/infrastructure/database/migrations/.gitkeep +0 -0
  564. package/templates/recipes/mikro-orm/src/infrastructure/database/mikro-orm.config.ts +20 -0
  565. package/templates/recipes/mikro-orm/tests/unit/infrastructure/database/mikro-orm.config.spec.ts +53 -0
  566. package/templates/recipes/mongoose/README.md +42 -0
  567. package/templates/recipes/mongoose/src/infrastructure/database/database.module.ts.ejs +17 -0
  568. package/templates/recipes/mongoose/tests/unit/infrastructure/database/database.module.spec.ts +25 -0
  569. package/templates/recipes/multi-tenancy/README.md +49 -0
  570. package/templates/recipes/multi-tenancy/src/shared/decorators/tenant.decorator.ts +14 -0
  571. package/templates/recipes/multi-tenancy/src/shared/middleware/tenant.middleware.ts +49 -0
  572. package/templates/recipes/multi-tenancy/tests/unit/shared/middleware/tenant.middleware.spec.ts +29 -0
  573. package/templates/recipes/nodemailer/README.md +55 -0
  574. package/templates/recipes/nodemailer/src/infrastructure/notifications/mail.module.ts +37 -0
  575. package/templates/recipes/nodemailer/tests/unit/infrastructure/notifications/mail.module.spec.ts +33 -0
  576. package/templates/recipes/oauth-apple/README.md +68 -0
  577. package/templates/recipes/oauth-apple/src/shared/auth/apple-auth.guard.ts +5 -0
  578. package/templates/recipes/oauth-apple/src/shared/auth/apple.strategy.ts +33 -0
  579. package/templates/recipes/oauth-apple/tests/unit/shared/auth/apple.strategy.spec.ts +65 -0
  580. package/templates/recipes/oauth-github/README.md +62 -0
  581. package/templates/recipes/oauth-github/src/shared/auth/github-auth.guard.ts +5 -0
  582. package/templates/recipes/oauth-github/src/shared/auth/github.strategy.ts +33 -0
  583. package/templates/recipes/oauth-github/tests/unit/shared/auth/github.strategy.spec.ts +72 -0
  584. package/templates/recipes/oauth-google/README.md +64 -0
  585. package/templates/recipes/oauth-google/src/shared/auth/google-auth.guard.ts +5 -0
  586. package/templates/recipes/oauth-google/src/shared/auth/google.strategy.ts +33 -0
  587. package/templates/recipes/oauth-google/tests/unit/shared/auth/google.strategy.spec.ts +72 -0
  588. package/templates/recipes/oauth2-introspection/README.md +62 -0
  589. package/templates/recipes/oauth2-introspection/src/shared/guards/token-introspection.guard.ts +77 -0
  590. package/templates/recipes/oauth2-introspection/tests/unit/shared/guards/token-introspection.guard.spec.ts +99 -0
  591. package/templates/recipes/opentelemetry/README.md +44 -0
  592. package/templates/recipes/opentelemetry/src/infrastructure/telemetry/tracing.ts +38 -0
  593. package/templates/recipes/opentelemetry/tests/unit/infrastructure/telemetry/tracing.spec.ts +23 -0
  594. package/templates/recipes/pagination/README.md +71 -0
  595. package/templates/recipes/pagination/src/shared/decorators/paginate.decorator.ts +25 -0
  596. package/templates/recipes/pagination/src/shared/dto/pagination.dto.ts +64 -0
  597. package/templates/recipes/pagination/src/shared/interceptors/pagination-link.interceptor.ts +31 -0
  598. package/templates/recipes/pagination/tests/unit/shared/dto/pagination.dto.spec.ts +56 -0
  599. package/templates/recipes/passport/README.md +41 -0
  600. package/templates/recipes/passport/src/shared/guards/local-auth.guard.ts +5 -0
  601. package/templates/recipes/passport/tests/unit/shared/guards/local-auth.guard.spec.ts +17 -0
  602. package/templates/recipes/pino/README.md +48 -0
  603. package/templates/recipes/pino/src/infrastructure/logging/logger.module.ts +39 -0
  604. package/templates/recipes/pino/tests/unit/infrastructure/logging/logger.module.spec.ts +6 -0
  605. package/templates/recipes/prefer-header/README.md +92 -0
  606. package/templates/recipes/prefer-header/src/shared/interceptors/prefer.interceptor.ts +60 -0
  607. package/templates/recipes/prefer-header/tests/unit/shared/interceptors/prefer.interceptor.spec.ts +44 -0
  608. package/templates/recipes/prisma/README.md +52 -0
  609. package/templates/recipes/prisma/prisma/schema.prisma.ejs +8 -0
  610. package/templates/recipes/prisma/src/infrastructure/database/prisma.service.ts +27 -0
  611. package/templates/recipes/prisma/tests/unit/infrastructure/database/prisma.service.spec.ts +21 -0
  612. package/templates/recipes/prometheus/README.md +54 -0
  613. package/templates/recipes/prometheus/src/infrastructure/metrics/metrics.controller.ts +15 -0
  614. package/templates/recipes/prometheus/src/infrastructure/metrics/metrics.module.ts +29 -0
  615. package/templates/recipes/prometheus/tests/unit/infrastructure/metrics/metrics.controller.spec.ts +22 -0
  616. package/templates/recipes/rabbitmq/README.md +53 -0
  617. package/templates/recipes/rabbitmq/src/infrastructure/queue/queue.module.ts.ejs +27 -0
  618. package/templates/recipes/rbac-casl/README.md +69 -0
  619. package/templates/recipes/rbac-casl/src/shared/auth/casl-ability.factory.ts +43 -0
  620. package/templates/recipes/rbac-casl/src/shared/decorators/roles.decorator.ts +5 -0
  621. package/templates/recipes/rbac-casl/src/shared/guards/policies.guard.ts +32 -0
  622. package/templates/recipes/rbac-casl/src/shared/guards/roles.guard.ts +21 -0
  623. package/templates/recipes/rbac-casl/tests/unit/shared/auth/casl-ability.factory.spec.ts +6 -0
  624. package/templates/recipes/redis-cache/README.md +55 -0
  625. package/templates/recipes/redis-cache/src/infrastructure/cache/cache.module.ts +26 -0
  626. package/templates/recipes/redis-cache/tests/unit/infrastructure/cache/cache.module.spec.ts +12 -0
  627. package/templates/recipes/request-context/README.md +57 -0
  628. package/templates/recipes/request-context/src/shared/context/request-context.module.ts +19 -0
  629. package/templates/recipes/request-context/tests/unit/shared/context/request-context.module.spec.ts +20 -0
  630. package/templates/recipes/request-logging/README.md +36 -0
  631. package/templates/recipes/request-logging/src/shared/middleware/request-logging.middleware.ts +40 -0
  632. package/templates/recipes/request-logging/tests/unit/shared/middleware/request-logging.middleware.spec.ts +64 -0
  633. package/templates/recipes/s3-minio/README.md +52 -0
  634. package/templates/recipes/s3-minio/src/infrastructure/storage/storage.module.ts +10 -0
  635. package/templates/recipes/s3-minio/src/infrastructure/storage/storage.service.ts +72 -0
  636. package/templates/recipes/s3-minio/tests/unit/infrastructure/storage/storage.service.spec.ts +23 -0
  637. package/templates/recipes/sdk-generation/README.md +40 -0
  638. package/templates/recipes/sdk-generation/openapitools.json +21 -0
  639. package/templates/recipes/sendgrid/README.md +45 -0
  640. package/templates/recipes/sendgrid/src/infrastructure/notifications/sendgrid.service.ts +60 -0
  641. package/templates/recipes/sendgrid/tests/unit/infrastructure/notifications/sendgrid.service.spec.ts +59 -0
  642. package/templates/recipes/sentry/README.md +49 -0
  643. package/templates/recipes/sentry/src/infrastructure/sentry/sentry.filter.ts +34 -0
  644. package/templates/recipes/sentry/src/infrastructure/sentry/sentry.module.ts +23 -0
  645. package/templates/recipes/sentry/tests/unit/infrastructure/sentry/sentry.filter.spec.ts +50 -0
  646. package/templates/recipes/seq2/README.md +41 -0
  647. package/templates/recipes/seq2/src/infrastructure/logging/seq.transport.ts +57 -0
  648. package/templates/recipes/seq2/tests/unit/infrastructure/logging/seq.transport.spec.ts +53 -0
  649. package/templates/recipes/serialization-groups/README.md +105 -0
  650. package/templates/recipes/serialization-groups/src/shared/interceptors/serialize.interceptor.ts +29 -0
  651. package/templates/recipes/serialization-groups/tests/unit/shared/interceptors/serialize.interceptor.spec.ts +48 -0
  652. package/templates/recipes/soft-delete/README.md +71 -0
  653. package/templates/recipes/soft-delete/src/shared/decorators/with-deleted.decorator.ts +4 -0
  654. package/templates/recipes/soft-delete/src/shared/entities/soft-deletable.entity.ts +20 -0
  655. package/templates/recipes/soft-delete/tests/unit/shared/entities/soft-deletable.entity.spec.ts +35 -0
  656. package/templates/recipes/sse/README.md +43 -0
  657. package/templates/recipes/sse/src/shared/gateways/events.sse.controller.ts +21 -0
  658. package/templates/recipes/sse/tests/unit/shared/gateways/events.sse.controller.spec.ts +32 -0
  659. package/templates/recipes/swagger/README.md +42 -0
  660. package/templates/recipes/swagger/src/main.swagger.ts.ejs +20 -0
  661. package/templates/recipes/swagger/tests/unit/main.swagger.spec.ts +5 -0
  662. package/templates/recipes/throttler/README.md +49 -0
  663. package/templates/recipes/throttler/src/shared/guards/throttle.config.ts +33 -0
  664. package/templates/recipes/throttler/tests/unit/shared/guards/throttle.spec.ts +5 -0
  665. package/templates/recipes/transactional-outbox/README.md +98 -0
  666. package/templates/recipes/transactional-outbox/src/infrastructure/outbox/outbox.entity.ts +30 -0
  667. package/templates/recipes/transactional-outbox/src/infrastructure/outbox/outbox.service.ts +21 -0
  668. package/templates/recipes/transactional-outbox/tests/unit/infrastructure/outbox/outbox.service.spec.ts +38 -0
  669. package/templates/recipes/typeorm-mysql/README.md +48 -0
  670. package/templates/recipes/typeorm-mysql/src/infrastructure/database/database.module.ts.ejs +24 -0
  671. package/templates/recipes/typeorm-postgres/README.md +101 -0
  672. package/templates/recipes/typeorm-postgres/src/infrastructure/database/data-source.ts.ejs +14 -0
  673. package/templates/recipes/typeorm-postgres/src/infrastructure/database/database.module.ts.ejs +24 -0
  674. package/templates/recipes/typeorm-postgres/src/infrastructure/database/entities/.gitkeep +0 -0
  675. package/templates/recipes/typeorm-postgres/src/infrastructure/database/entities/index.ts +7 -0
  676. package/templates/recipes/typeorm-postgres/src/infrastructure/database/migrations/.gitkeep +0 -0
  677. package/templates/recipes/typeorm-postgres/src/infrastructure/database/migrations/index.ts +10 -0
  678. package/templates/recipes/typeorm-postgres/tests/unit/infrastructure/database/database.module.spec.ts +11 -0
  679. package/templates/recipes/webhooks/README.md +76 -0
  680. package/templates/recipes/webhooks/src/infrastructure/webhooks/webhook.service.ts +53 -0
  681. package/templates/recipes/webhooks/tests/unit/infrastructure/webhooks/webhook.service.spec.ts +31 -0
  682. package/templates/recipes/websockets/README.md +44 -0
  683. package/templates/recipes/websockets/src/shared/gateways/events.gateway.ts +55 -0
  684. package/templates/recipes/websockets/tests/unit/shared/gateways/events.gateway.spec.ts +23 -0
  685. package/templates/recipes/winston/README.md +45 -0
  686. package/templates/recipes/winston/src/infrastructure/logging/logger.module.ts +34 -0
  687. package/templates/recipes/winston/tests/unit/infrastructure/logging/logger.module.spec.ts +12 -0
  688. package/templates/recipes/worker-threads/README.md +71 -0
  689. package/templates/recipes/worker-threads/src/shared/utils/worker-pool.ts +59 -0
  690. package/templates/recipes/worker-threads/tests/unit/shared/utils/worker-pool.spec.ts +36 -0
@@ -0,0 +1,54 @@
1
+ # ADR-009: RFC and Standards Compliance by Default
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-03-10
10
+
11
+ ## Context
12
+
13
+ APIs built without standards compliance create integration friction for consumers, fail security audits, and require rework when standards are eventually adopted. Retrofitting RFC compliance is expensive.
14
+
15
+ ## Decision
16
+
17
+ Implement key RFCs and open standards in the base template and recipes:
18
+
19
+ **Base template (every project):**
20
+
21
+ - RFC 9457 — Problem Details error responses (`application/problem+json`)
22
+ - RFC 9110 — ETags via `@fastify/etag`
23
+ - Graceful shutdown hooks
24
+ - Request timeout middleware
25
+
26
+ **Via recipes:**
27
+
28
+ - RFC 8288 — Link headers for pagination
29
+ - RFC 9111 — Cache-Control headers
30
+ - RFC 7240 — Prefer header
31
+ - RFC 7662 — OAuth 2.0 Token Introspection
32
+ - RFC 9449 — DPoP proof-of-possession
33
+ - RFC 9530 — Content Digest integrity
34
+ - RFC 6902/7396 — JSON Patch / JSON Merge Patch
35
+ - W3C Trace Context — via OpenTelemetry
36
+ - OWASP API Security Top 10 — via security recipes
37
+
38
+ ## Consequences
39
+
40
+ ### Positive
41
+
42
+ - API consumers get predictable, standardized responses
43
+ - Error responses parse correctly in any RFC 9457-aware client
44
+ - ETags reduce bandwidth by enabling conditional requests
45
+ - Security headers (Helmet, CORS, CSRF) pass audit checklists
46
+
47
+ ### Negative
48
+
49
+ - Slightly larger response payloads (RFC 9457 has more fields than a minimal error)
50
+ - Teams must understand the standards to use extensions correctly
51
+
52
+ ## References
53
+
54
+ - [RFC 9457](https://datatracker.ietf.org/doc/html/rfc9457)
@@ -0,0 +1,44 @@
1
+ # ADR-010: AI Assistant Context Generation
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-03-15
10
+
11
+ ## Context
12
+
13
+ Modern development teams use AI coding assistants (Claude Code, Cursor, GitHub Copilot). These tools perform better when given project-specific context about patterns, conventions, and available APIs.
14
+
15
+ ## Decision
16
+
17
+ Generate AI context files for three assistants as part of project scaffolding:
18
+
19
+ - **CLAUDE.md** — Project-level instructions for Claude Code (package manager, imports, testing, commands, active recipes)
20
+ - **.cursor/rules/\*.mdc** — Cursor rules for framework-specific patterns (NestJS backend, React/Vue/Svelte frontend)
21
+ - **.github/copilot-instructions.md** — GitHub Copilot project instructions
22
+
23
+ Context is assembled from:
24
+
25
+ 1. Base instructions (common to all projects)
26
+ 2. Recipe-specific sections (each recipe contributes its own context)
27
+ 3. Frontend framework rules (for full-stack projects)
28
+
29
+ ## Consequences
30
+
31
+ ### Positive
32
+
33
+ - AI assistants understand project conventions immediately
34
+ - Recipe-specific context prevents AI from suggesting patterns that conflict with selected tools
35
+ - Frontend-specific rules guide AI on framework idioms (Server Components in Next.js, Composition API in Vue, etc.)
36
+
37
+ ### Negative
38
+
39
+ - Context files add ~20-30 lines per recipe to CLAUDE.md
40
+ - Teams using other AI tools (Windsurf, Cody) don't benefit without manual adaptation
41
+
42
+ ### Risks
43
+
44
+ - AI context becoming stale as patterns evolve — mitigated by keeping context co-located with recipe templates
@@ -0,0 +1,44 @@
1
+ # ADR-011: Exact Dependency Versions (No Ranges)
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-03-20
10
+
11
+ ## Context
12
+
13
+ npm defaults to caret ranges (`^1.2.3`) which allow minor and patch updates. While this sounds convenient, it has caused production incidents when a patch release introduced breaking changes or was compromised (supply chain attack).
14
+
15
+ ## Decision
16
+
17
+ Pin all dependency versions to exact values (`1.2.3`, not `^1.2.3`). Enforce via:
18
+
19
+ - `.npmrc` with `save-exact=true`
20
+ - Pre-commit hook checking for version ranges
21
+ - `pnpm install -E` for all package installations
22
+
23
+ ## Consequences
24
+
25
+ ### Positive
26
+
27
+ - **Reproducible builds** — Same versions in dev, CI, staging, and production
28
+ - **Security** — No automatic adoption of compromised patch releases
29
+ - **Auditability** — Every version change is an explicit commit with a changelog review
30
+ - **No surprises** — Builds never break from upstream changes
31
+
32
+ ### Negative
33
+
34
+ - Manual dependency updates required (no automatic patch adoption)
35
+ - More frequent dependency update PRs
36
+ - Lockfile churn when updating multiple packages
37
+
38
+ ### Risks
39
+
40
+ - Missing security patches — mitigated by Dependabot/Renovate recipe and `pnpm audit` in CI
41
+
42
+ ## References
43
+
44
+ - `CLAUDE.md` (project root) — "NEVER use version ranges"
@@ -0,0 +1,54 @@
1
+ # ADR-012: Nx for Monorepo and Full-Stack Project Types
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-04-01
10
+
11
+ ## Context
12
+
13
+ Monorepo and full-stack project types need workspace management: shared libraries, task orchestration, dependency graph awareness, and caching.
14
+
15
+ Options: pnpm workspaces only, Nx, Turborepo, Lerna.
16
+
17
+ ## Decision
18
+
19
+ Use Nx with pnpm workspaces for monorepo and full-stack project types.
20
+
21
+ ## Consequences
22
+
23
+ ### Positive
24
+
25
+ - First-class NestJS plugin (`@nx/nest`) with generators matching NestJS schematics
26
+ - Task caching (local + remote) saves CI time as the workspace grows
27
+ - `nx affected` runs only changed projects
28
+ - Dependency graph visualization (`nx graph`)
29
+
30
+ ### Negative
31
+
32
+ - Additional learning curve for teams unfamiliar with Nx
33
+ - Nx adds ~50MB to node_modules
34
+ - Configuration overhead for small projects
35
+
36
+ ### Alternatives Considered
37
+
38
+ #### pnpm workspaces only
39
+
40
+ - **Pros:** Minimal tooling, no extra dependencies
41
+ - **Cons:** No task caching, no dependency graph, no affected commands
42
+ - **Why not:** Missing features that matter at scale (5+ packages)
43
+
44
+ #### Turborepo
45
+
46
+ - **Pros:** Simpler than Nx, good task caching
47
+ - **Cons:** Less NestJS-specific tooling, no generators
48
+ - **Why not:** Nx has better NestJS integration
49
+
50
+ #### Lerna
51
+
52
+ - **Pros:** Well-known
53
+ - **Cons:** Now powered by Nx under the hood, adds an unnecessary layer
54
+ - **Why not:** Just use Nx directly
@@ -0,0 +1,63 @@
1
+ # ADR-013: Fastify as Default HTTP Adapter
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-04-01
10
+
11
+ ## Context
12
+
13
+ NestJS supports two HTTP adapters: Express (`@nestjs/platform-express`) and Fastify (`@nestjs/platform-fastify`). The choice of adapter affects request throughput, plugin architecture, and middleware compatibility across all scaffolded projects.
14
+
15
+ ## Decision
16
+
17
+ Use Fastify as the default HTTP adapter for all project types that handle HTTP traffic (HTTP API, Full-Stack, Lambda). Provide an `express-adapter` recipe for teams that require Express middleware compatibility.
18
+
19
+ The base template configures Fastify in `main.ts`:
20
+
21
+ ```ts
22
+ const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter());
23
+ ```
24
+
25
+ ## Consequences
26
+
27
+ ### Positive
28
+
29
+ - 2-3x higher throughput than Express in synthetic benchmarks (JSON serialization, route matching)
30
+ - Schema-based request validation via Fastify's built-in JSON Schema support
31
+ - Encapsulated plugin system prevents global state leaks between modules
32
+ - First-class TypeScript support with typed request/reply objects
33
+ - Fastify v5 lifecycle hooks align well with NestJS interceptors and guards
34
+
35
+ ### Negative
36
+
37
+ - Express middleware packages (e.g., `express-session`, `passport` strategies using `req`/`res` directly) require the `@fastify/middie` compatibility layer or Fastify-native alternatives
38
+ - Smaller plugin ecosystem compared to Express — some niche middleware has no Fastify equivalent
39
+ - Developers familiar only with Express face a minor learning curve for Fastify's plugin model
40
+
41
+ ### Risks
42
+
43
+ - Breaking changes in Fastify major versions — mitigated by exact version pinning and the scaffolder's dependency audit workflow
44
+
45
+ ## Alternatives Considered
46
+
47
+ ### Express (default)
48
+
49
+ - **Pros:** Largest middleware ecosystem, most developer familiarity
50
+ - **Cons:** Slower request handling, callback-oriented internals, no built-in schema validation
51
+ - **Why not:** Performance cost is measurable at scale; available as the `express-adapter` recipe for teams that need it
52
+
53
+ ### Koa / Hono
54
+
55
+ - **Pros:** Lightweight, modern API design
56
+ - **Cons:** No official NestJS adapter, no DI integration
57
+ - **Why not:** NestJS only ships adapters for Express and Fastify
58
+
59
+ ## References
60
+
61
+ - [Fastify Benchmarks](https://fastify.dev/benchmarks/)
62
+ - [NestJS Performance (Fastify)](https://docs.nestjs.com/techniques/performance)
63
+ - Recipe: `express-adapter`
@@ -0,0 +1,61 @@
1
+ # ADR-014: SWC as Default Build Toolchain
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-04-01
10
+
11
+ ## Context
12
+
13
+ TypeScript projects require a compilation step from TS to JS. The default `tsc` compiler is correct but slow, especially in large monorepos. NestJS v10+ ships with first-class SWC support via `@swc/core` and the `nest build --builder swc` flag.
14
+
15
+ ## Decision
16
+
17
+ Use SWC (`@swc/core`) as the default TypeScript compiler for both builds and tests. The toolchain consists of:
18
+
19
+ - **Build:** `nest build --builder swc` via `@nestjs/cli` with SWC builder
20
+ - **Tests:** `@swc/jest` as the Jest transform, configured in `jest.config.ts`
21
+ - **Path aliases:** `tsc-alias` as a post-build step to resolve `@/*` path mappings in emitted JS
22
+ - **Type checking:** `tsc --noEmit` run separately in CI (SWC does not type-check)
23
+
24
+ ## Consequences
25
+
26
+ ### Positive
27
+
28
+ - 10-20x faster compilation than `tsc` for incremental builds
29
+ - Jest test suites start significantly faster with `@swc/jest` (no `ts-jest` overhead)
30
+ - SWC supports TypeScript 5 decorators and `emitDecoratorMetadata` via `@swc/core` plugins
31
+ - NestJS CLI has native SWC integration — no custom webpack config needed
32
+ - Hot Module Replacement (HMR) in `start:dev` is near-instant
33
+
34
+ ### Negative
35
+
36
+ - SWC does not perform type checking — requires a separate `tsc --noEmit` step in CI
37
+ - Some edge-case TypeScript features (const enums across files, composite projects) need workarounds
38
+ - `tsc-alias` adds a post-build step for path alias resolution
39
+
40
+ ### Risks
41
+
42
+ - Decorator metadata divergence between SWC and tsc — mitigated by testing DI resolution in integration tests
43
+
44
+ ## Alternatives Considered
45
+
46
+ ### tsc (TypeScript Compiler)
47
+
48
+ - **Pros:** Official compiler, type checking included, zero config
49
+ - **Cons:** 10-20x slower builds, slower test startup
50
+ - **Why not:** Build speed directly impacts developer experience and CI costs
51
+
52
+ ### esbuild
53
+
54
+ - **Pros:** Extremely fast, Go-based
55
+ - **Cons:** No decorator metadata support, no NestJS CLI integration
56
+ - **Why not:** NestJS depends on `emitDecoratorMetadata` for DI; esbuild cannot emit it
57
+
58
+ ## References
59
+
60
+ - [NestJS SWC Builder](https://docs.nestjs.com/recipes/swc)
61
+ - Packages: `@swc/core`, `@swc/jest`, `tsc-alias`
@@ -0,0 +1,49 @@
1
+ # ADR-015: Multi-Cloud Support via Composable Recipes
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-04-01
10
+
11
+ ## Context
12
+
13
+ Teams deploy to different cloud providers depending on organizational standards. Locking the boilerplate to a single provider (e.g., AWS-only) would exclude a large portion of users and create vendor lock-in at the template level.
14
+
15
+ ## Decision
16
+
17
+ Support AWS, GCP, and Azure as first-class cloud providers through composable recipes. Each cloud service is wrapped in a dedicated NestJS module that injects configuration via `ConfigService` and exposes a provider-agnostic interface where practical.
18
+
19
+ The CLI presents a `--cloud` flag (`aws`, `gcp`, `azure`) that pre-selects cloud-appropriate recipe defaults:
20
+
21
+ - **AWS:** `aws-s3`, `aws-sqs`, `aws-ses`, `aws-secrets-manager`, `aws-lambda-deploy`
22
+ - **GCP:** `gcp-cloud-storage`, `gcp-pub-sub`, `gcp-cloud-tasks`, `gcp-secret-manager`
23
+ - **Azure:** `azure-blob-storage`, `azure-service-bus`, `azure-key-vault`
24
+
25
+ Each cloud recipe declares conflicts with its counterparts (e.g., `aws-s3` conflicts with `gcp-cloud-storage`).
26
+
27
+ ## Consequences
28
+
29
+ ### Positive
30
+
31
+ - Teams choose their cloud without forking the boilerplate
32
+ - Cloud-aware CLI defaults reduce decision fatigue during scaffolding
33
+ - Service modules use `ConfigService` for credentials — no hardcoded provider SDKs in business logic
34
+ - Adding a new cloud service is a self-contained recipe contribution
35
+
36
+ ### Negative
37
+
38
+ - Maintaining parity across three cloud providers multiplies recipe count
39
+ - Provider-agnostic interfaces can leak abstractions for provider-specific features
40
+ - Testing requires credentials or emulators for each cloud provider
41
+
42
+ ### Risks
43
+
44
+ - SDK version drift across providers — mitigated by exact version pinning and per-provider CI test matrices
45
+
46
+ ## References
47
+
48
+ - Recipe groups: `aws-*`, `gcp-*`, `azure-*`
49
+ - ADR-008: Composable Recipe System
@@ -0,0 +1,52 @@
1
+ # ADR-016: Multi-Provider CI/CD Pipeline Strategy
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-04-01
10
+
11
+ ## Context
12
+
13
+ Organizations standardize on different CI/CD platforms depending on their cloud provider and existing tooling. A boilerplate that only generates GitHub Actions workflows excludes teams on Azure DevOps, AWS, or GCP-native pipelines.
14
+
15
+ ## Decision
16
+
17
+ Support four CI/CD providers via recipes: GitHub Actions, Azure DevOps Pipelines, AWS CodePipeline, and GCP Cloud Build. All providers implement the same standardized pipeline stages:
18
+
19
+ 1. **Install** — dependency installation with lockfile caching
20
+ 2. **Lint & Format** — ESLint + Prettier checks
21
+ 3. **Type Check** — `tsc --noEmit`
22
+ 4. **Unit Test** — Jest with coverage thresholds
23
+ 5. **Build** — SWC compilation
24
+ 6. **Integration Test** — against real services (database, cache)
25
+ 7. **Docker Build** — multi-stage Dockerfile with layer caching
26
+ 8. **Deploy** — environment-specific deployment (dev/staging/prod)
27
+
28
+ Database migrations run via a migration-runner Lambda (AWS) or equivalent serverless function that executes before the application deployment, ensuring schema changes are applied atomically and independently of the application lifecycle.
29
+
30
+ ## Consequences
31
+
32
+ ### Positive
33
+
34
+ - Teams use their existing CI/CD platform without manual pipeline authoring
35
+ - Standardized stages ensure consistent quality gates across all providers
36
+ - Migration-runner pattern decouples schema changes from application deploys
37
+ - Pipeline configs are generated with project-specific values (image names, regions, service names)
38
+
39
+ ### Negative
40
+
41
+ - Four pipeline configurations to maintain and keep in sync
42
+ - Provider-specific features (GitHub Actions marketplace, Azure DevOps service connections) are underutilized to maintain portability
43
+ - Migration-runner adds an extra deployment artifact to manage
44
+
45
+ ### Risks
46
+
47
+ - Pipeline syntax breaking changes in provider updates — mitigated by pinning action/task versions
48
+
49
+ ## References
50
+
51
+ - Recipes: `github-actions`, `azure-devops`, `aws-codepipeline`, `gcp-cloud-build`
52
+ - ADR-005: Deployment Strategy
@@ -0,0 +1,63 @@
1
+ # ADR-017: Structured JSON Logging with Pino
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-04-01
10
+
11
+ ## Context
12
+
13
+ Production applications need structured, machine-parseable logs for integration with cloud log aggregators (CloudWatch, Stackdriver, Azure Monitor). NestJS's default `ConsoleLogger` outputs unstructured text that is difficult to query, filter, and alert on.
14
+
15
+ ## Decision
16
+
17
+ Use Pino (`nestjs-pino`) as the default logging library with structured JSON output. Key design choices:
18
+
19
+ - **Request context propagation:** `nestjs-pino` auto-attaches a correlation ID (`x-correlation-id` header or generated UUID) to every log line within a request lifecycle via `AsyncLocalStorage`
20
+ - **Log levels:** configurable via `LOG_LEVEL` environment variable (default: `info` in production, `debug` in development)
21
+ - **Pretty printing:** `pino-pretty` enabled in development via `NODE_ENV` detection for human-readable output
22
+ - **Redaction:** sensitive fields (`password`, `authorization`, `cookie`) are redacted from log output by default
23
+
24
+ Winston is available as an alternative via the `winston-logger` recipe for teams with existing Winston infrastructure.
25
+
26
+ ## Consequences
27
+
28
+ ### Positive
29
+
30
+ - JSON logs are natively queryable in all major cloud log aggregators
31
+ - Correlation IDs enable end-to-end request tracing across services
32
+ - Pino's low-overhead design (worker-thread serialization) has minimal impact on request latency
33
+ - Automatic request/response logging via `nestjs-pino` middleware eliminates manual log calls
34
+
35
+ ### Negative
36
+
37
+ - JSON output is harder to read in local development without `pino-pretty`
38
+ - Pino's opinionated API differs from Winston — existing Winston log patterns need adaptation
39
+ - Redaction configuration must be maintained as new sensitive fields are added
40
+
41
+ ### Risks
42
+
43
+ - Log volume costs in cloud environments — mitigated by appropriate log level configuration and sampling
44
+
45
+ ## Alternatives Considered
46
+
47
+ ### Winston
48
+
49
+ - **Pros:** Most popular Node.js logger, flexible transports, wide adoption
50
+ - **Cons:** Higher overhead per log call, synchronous serialization, less NestJS integration
51
+ - **Why not:** Pino's performance advantage matters for high-throughput services; Winston available via recipe
52
+
53
+ ### NestJS ConsoleLogger
54
+
55
+ - **Pros:** Zero dependencies, built-in
56
+ - **Cons:** Unstructured text, no correlation IDs, no JSON output
57
+ - **Why not:** Unsuitable for production log aggregation
58
+
59
+ ## References
60
+
61
+ - Packages: `nestjs-pino`, `pino`, `pino-pretty`, `pino-http`
62
+ - Recipe: `winston-logger`
63
+ - ADR-021: Observability Strategy
@@ -0,0 +1,61 @@
1
+ # ADR-018: Defense-in-Depth Security Architecture
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-04-01
10
+
11
+ ## Context
12
+
13
+ APIs are exposed to the public internet and face a wide range of attack vectors. A single security mechanism is insufficient — the OWASP API Security Top 10 requires multiple layers of defense applied consistently across all scaffolded projects.
14
+
15
+ ## Decision
16
+
17
+ Implement a defense-in-depth approach with the following layers enabled by default in the base template:
18
+
19
+ | Layer | Implementation | OWASP Mapping |
20
+ | ---------------- | ---------------------------------------------------------- | ------------- |
21
+ | Security headers | `@fastify/helmet` | API1, API7 |
22
+ | CORS | `@fastify/cors` with explicit origin allowlist | API7 |
23
+ | CSRF protection | `@fastify/csrf-protection` (stateful endpoints) | API2 |
24
+ | Rate limiting | `@nestjs/throttler` with configurable windows | API4 |
25
+ | Input validation | `class-validator` + `class-transformer` on all DTOs | API3, API8 |
26
+ | Request timeouts | Fastify `connectionTimeout` + `requestTimeout` | API4 |
27
+ | Payload limits | Fastify `bodyLimit` (default 1MB) | API4 |
28
+ | SSRF prevention | URL allowlist validation in HTTP-calling services | API7 |
29
+ | Content digest | `content-digest` header verification for webhook receivers | API2 |
30
+
31
+ Additional security recipes available:
32
+
33
+ - `api-key-auth` — API key validation via custom guard
34
+ - `oauth2` — OAuth 2.0 / OpenID Connect integration
35
+ - `mTLS` — mutual TLS for service-to-service communication
36
+
37
+ ## Consequences
38
+
39
+ ### Positive
40
+
41
+ - All projects start with a secure baseline — security is opt-out, not opt-in
42
+ - OWASP API Security Top 10 coverage documented and mapped per control
43
+ - `class-validator` decorators on DTOs enforce validation at the boundary, preventing injection
44
+ - Rate limiting prevents brute-force and DoS attacks at the application layer
45
+
46
+ ### Negative
47
+
48
+ - Default security controls may be too restrictive for internal-only APIs (CORS, CSRF)
49
+ - Rate limiting configuration requires tuning per endpoint — defaults may not fit all use cases
50
+ - Helmet's CSP defaults can break frontend assets if not configured correctly in full-stack projects
51
+
52
+ ### Risks
53
+
54
+ - False sense of security — application-level controls do not replace network-level security (WAF, VPC)
55
+ - Misconfigured CORS allowlists — mitigated by requiring explicit origins, rejecting `*` in production
56
+
57
+ ## References
58
+
59
+ - [OWASP API Security Top 10](https://owasp.org/API-Security/)
60
+ - Packages: `@fastify/helmet`, `@fastify/cors`, `@fastify/csrf-protection`, `@nestjs/throttler`, `class-validator`
61
+ - ADR-004: Authentication Architecture
@@ -0,0 +1,61 @@
1
+ # ADR-019: Seven Project Types with Template Overlays
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-04-01
10
+
11
+ ## Context
12
+
13
+ Not all backend applications are HTTP APIs. Teams build Lambda functions, CLI tools, background workers, and microservices. A single project template cannot serve all these use cases without shipping unnecessary boilerplate for each.
14
+
15
+ ## Decision
16
+
17
+ Support seven project types, each with a distinct `main.ts` bootstrap, package fragment, and template overlay applied on top of the shared base template:
18
+
19
+ | Project Type | Bootstrap | Transport | Key Packages |
20
+ | ---------------- | ---------------------------------------------- | ----------------------------- | --------------------------------------------- |
21
+ | **HTTP API** | `NestFactory.create(FastifyAdapter)` | HTTP | `@nestjs/platform-fastify` |
22
+ | **Lambda** | `@codegenie/serverless-express` handler export | HTTP via API Gateway | `@codegenie/serverless-express`, `aws-lambda` |
23
+ | **Microservice** | `NestFactory.createMicroservice()` | TCP / RabbitMQ / Kafka / gRPC | `@nestjs/microservices` |
24
+ | **CLI** | `nest-commander` bootstrap | stdin/stdout | `nest-commander` |
25
+ | **Worker** | `NestFactory.createApplicationContext()` | Queue consumer | `@nestjs/bullmq`, `bullmq` |
26
+ | **Monorepo** | Multiple apps with shared libs | Per-app | `@nestjs/cli` workspaces |
27
+ | **Full-Stack** | NestJS API + frontend framework | HTTP + SSR/SPA | Per-framework (see ADR-020) |
28
+
29
+ The CLI presents project type selection as the first prompt. Each type determines:
30
+
31
+ 1. Which `main.ts` template to use
32
+ 2. Which package fragments to merge into `package.json`
33
+ 3. Which recipes are available (e.g., `aws-lambda-deploy` only for Lambda type)
34
+ 4. Which default recipes to pre-select
35
+
36
+ Microservice transport is a sub-selection within the Microservice type, choosing between TCP, RabbitMQ (`@nestjs/microservices` + `amqplib`), Kafka (`kafkajs`), and gRPC (`@grpc/grpc-js`).
37
+
38
+ ## Consequences
39
+
40
+ ### Positive
41
+
42
+ - Each project type ships only the dependencies and configuration it needs
43
+ - New project types can be added without modifying the base template
44
+ - Transport selection for microservices is explicit, not a hidden config option
45
+ - Template overlays are composable with recipes for maximum flexibility
46
+
47
+ ### Negative
48
+
49
+ - Seven project types increase scaffolder complexity and test surface
50
+ - Some recipes are only valid for certain project types — requires type-aware recipe filtering
51
+ - Monorepo type has significantly different directory structure than single-app types
52
+
53
+ ### Risks
54
+
55
+ - Project type proliferation — mitigated by requiring an ADR for each new type
56
+
57
+ ## References
58
+
59
+ - ADR-007: Scaffolder Architecture
60
+ - ADR-008: Composable Recipe System
61
+ - ADR-012: Monorepo Strategy
@@ -0,0 +1,57 @@
1
+ # ADR-020: Frontend Framework Support for Full-Stack Projects
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Date
8
+
9
+ 2026-04-01
10
+
11
+ ## Context
12
+
13
+ The Full-Stack project type (ADR-019) requires a frontend framework alongside the NestJS API. Teams have strong preferences for their frontend stack, and prescribing a single framework would limit adoption.
14
+
15
+ ## Decision
16
+
17
+ Support four frontend frameworks as sub-selections within the Full-Stack project type:
18
+
19
+ | Framework | Package | Rendering | Use Case |
20
+ | -------------- | ---------------------------- | --------------- | ----------------------------- |
21
+ | **Next.js** | `next`, `react`, `react-dom` | SSR / SSG / ISR | SEO-critical apps, dashboards |
22
+ | **Vite React** | `vite`, `react`, `react-dom` | SPA (CSR) | Internal tools, admin panels |
23
+ | **Nuxt** | `nuxt`, `vue` | SSR / SSG | Vue-based teams |
24
+ | **SvelteKit** | `@sveltejs/kit`, `svelte` | SSR / SSG | Performance-focused apps |
25
+
26
+ Each framework selection generates:
27
+
28
+ - **Proxy configuration:** API calls from the frontend dev server proxy to the NestJS API (e.g., Vite's `server.proxy`, Next.js rewrites)
29
+ - **Directory structure:** `apps/web/` for the frontend, `apps/api/` for the NestJS backend
30
+ - **AI context:** Framework-specific CLAUDE.md sections, `.cursor/rules`, and `.github/copilot-instructions.md`
31
+ - **Build integration:** Unified `pnpm build` that compiles both frontend and API
32
+ - **Docker configuration:** Multi-stage Dockerfile serving the frontend via the NestJS API or a separate container
33
+
34
+ ## Consequences
35
+
36
+ ### Positive
37
+
38
+ - Teams use their preferred frontend framework without ejecting from the boilerplate
39
+ - Proxy configuration eliminates CORS issues during local development
40
+ - AI context per framework improves code generation quality in Cursor, Copilot, and Claude
41
+ - Shared TypeScript types between frontend and API via monorepo workspace packages
42
+
43
+ ### Negative
44
+
45
+ - Four frontend frameworks quadruple the frontend template maintenance burden
46
+ - Framework-specific build quirks (Next.js standalone output, SvelteKit adapters) require per-framework Docker configs
47
+ - Keeping AI context accurate across framework version updates is ongoing work
48
+
49
+ ### Risks
50
+
51
+ - Framework deprecation or major API changes — mitigated by supporting only actively maintained frameworks with large communities
52
+
53
+ ## References
54
+
55
+ - ADR-019: Project Type Design
56
+ - ADR-010: AI Context Generation
57
+ - ADR-012: Monorepo Strategy