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.
- package/LICENSE +21 -0
- package/README.md +249 -0
- package/dist/generator/ai-context-assembler.d.ts +4 -0
- package/dist/generator/ai-context-assembler.js +52 -0
- package/dist/generator/ai-context-assembler.js.map +1 -0
- package/dist/generator/env-merger.d.ts +3 -0
- package/dist/generator/env-merger.js +16 -0
- package/dist/generator/env-merger.js.map +1 -0
- package/dist/generator/generator.d.ts +3 -0
- package/dist/generator/generator.js +253 -0
- package/dist/generator/generator.js.map +1 -0
- package/dist/generator/package-json-merger.d.ts +6 -0
- package/dist/generator/package-json-merger.js +29 -0
- package/dist/generator/package-json-merger.js.map +1 -0
- package/dist/generator/post-generate.d.ts +1 -0
- package/dist/generator/post-generate.js +28 -0
- package/dist/generator/post-generate.js.map +1 -0
- package/dist/generator/template-engine.d.ts +4 -0
- package/dist/generator/template-engine.js +20 -0
- package/dist/generator/template-engine.js.map +1 -0
- package/dist/generators/add-recipe/generator.d.ts +3 -0
- package/dist/generators/add-recipe/generator.js +153 -0
- package/dist/generators/add-recipe/generator.js.map +1 -0
- package/dist/generators/list-recipes/generator.d.ts +3 -0
- package/dist/generators/list-recipes/generator.js +58 -0
- package/dist/generators/list-recipes/generator.js.map +1 -0
- package/dist/generators/migrate-recipe/generator.d.ts +9 -0
- package/dist/generators/migrate-recipe/generator.js +90 -0
- package/dist/generators/migrate-recipe/generator.js.map +1 -0
- package/dist/generators/migrate-recipe/migration-guidance.d.ts +1 -0
- package/dist/generators/migrate-recipe/migration-guidance.js +159 -0
- package/dist/generators/migrate-recipe/migration-guidance.js.map +1 -0
- package/dist/generators/remove-recipe/generator.d.ts +3 -0
- package/dist/generators/remove-recipe/generator.js +176 -0
- package/dist/generators/remove-recipe/generator.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/add-ons.d.ts +3 -0
- package/dist/prompts/add-ons.js +29 -0
- package/dist/prompts/add-ons.js.map +1 -0
- package/dist/prompts/ci-cd.d.ts +2 -0
- package/dist/prompts/ci-cd.js +19 -0
- package/dist/prompts/ci-cd.js.map +1 -0
- package/dist/prompts/cloud-provider.d.ts +2 -0
- package/dist/prompts/cloud-provider.js +18 -0
- package/dist/prompts/cloud-provider.js.map +1 -0
- package/dist/prompts/confirmation.d.ts +2 -0
- package/dist/prompts/confirmation.js +29 -0
- package/dist/prompts/confirmation.js.map +1 -0
- package/dist/prompts/deployment.d.ts +2 -0
- package/dist/prompts/deployment.js +20 -0
- package/dist/prompts/deployment.js.map +1 -0
- package/dist/prompts/frontend.d.ts +2 -0
- package/dist/prompts/frontend.js +18 -0
- package/dist/prompts/frontend.js.map +1 -0
- package/dist/prompts/project-name.d.ts +5 -0
- package/dist/prompts/project-name.js +34 -0
- package/dist/prompts/project-name.js.map +1 -0
- package/dist/prompts/project-type.d.ts +2 -0
- package/dist/prompts/project-type.js +22 -0
- package/dist/prompts/project-type.js.map +1 -0
- package/dist/prompts/run-all.d.ts +3 -0
- package/dist/prompts/run-all.js +83 -0
- package/dist/prompts/run-all.js.map +1 -0
- package/dist/prompts/transport.d.ts +2 -0
- package/dist/prompts/transport.js +22 -0
- package/dist/prompts/transport.js.map +1 -0
- package/dist/recipes/definitions.d.ts +2 -0
- package/dist/recipes/definitions.js +3647 -0
- package/dist/recipes/definitions.js.map +1 -0
- package/dist/recipes/recipe.interface.d.ts +8 -0
- package/dist/recipes/recipe.interface.js +2 -0
- package/dist/recipes/recipe.interface.js.map +1 -0
- package/dist/recipes/registry.d.ts +9 -0
- package/dist/recipes/registry.js +23 -0
- package/dist/recipes/registry.js.map +1 -0
- package/dist/types.d.ts +70 -0
- package/dist/types.js +152 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/ai-context-updater.d.ts +6 -0
- package/dist/utils/ai-context-updater.js +50 -0
- package/dist/utils/ai-context-updater.js.map +1 -0
- package/dist/utils/dependency-checker.d.ts +14 -0
- package/dist/utils/dependency-checker.js +27 -0
- package/dist/utils/dependency-checker.js.map +1 -0
- package/dist/utils/env-updater.d.ts +7 -0
- package/dist/utils/env-updater.js +35 -0
- package/dist/utils/env-updater.js.map +1 -0
- package/dist/utils/main-ts-updater.d.ts +37 -0
- package/dist/utils/main-ts-updater.js +144 -0
- package/dist/utils/main-ts-updater.js.map +1 -0
- package/dist/utils/module-updater.d.ts +26 -0
- package/dist/utils/module-updater.js +167 -0
- package/dist/utils/module-updater.js.map +1 -0
- package/dist/utils/recipe-manifest.d.ts +24 -0
- package/dist/utils/recipe-manifest.js +45 -0
- package/dist/utils/recipe-manifest.js.map +1 -0
- package/dist/validation/config-validator.d.ts +13 -0
- package/dist/validation/config-validator.js +50 -0
- package/dist/validation/config-validator.js.map +1 -0
- package/dist/validation/conflict-detector.d.ts +7 -0
- package/dist/validation/conflict-detector.js +37 -0
- package/dist/validation/conflict-detector.js.map +1 -0
- package/generators.json +24 -0
- package/package.json +78 -0
- package/src/generators/add-recipe/schema.json +21 -0
- package/src/generators/list-recipes/schema.json +18 -0
- package/src/generators/migrate-recipe/schema.json +20 -0
- package/src/generators/remove-recipe/schema.json +21 -0
- package/templates/base/.env.example.ejs +3 -0
- package/templates/base/README.md.ejs +20 -0
- package/templates/base/SECURITY.md +36 -0
- package/templates/base/commitlint.config.js +15 -0
- package/templates/base/docs/adr/000-template.md +45 -0
- package/templates/base/docs/adr/001-framework-selection.md +54 -0
- package/templates/base/docs/adr/002-error-handling-strategy.md +36 -0
- package/templates/base/docs/adr/003-database-strategy.md +40 -0
- package/templates/base/docs/adr/004-authentication-architecture.md +44 -0
- package/templates/base/docs/adr/005-deployment-strategy.md +40 -0
- package/templates/base/docs/adr/006-testing-strategy.md +41 -0
- package/templates/base/docs/adr/007-scaffolder-architecture.md +64 -0
- package/templates/base/docs/adr/008-recipe-system.md +47 -0
- package/templates/base/docs/adr/009-standards-compliance.md +54 -0
- package/templates/base/docs/adr/010-ai-context-generation.md +44 -0
- package/templates/base/docs/adr/011-package-versioning.md +44 -0
- package/templates/base/docs/adr/012-monorepo-strategy.md +54 -0
- package/templates/base/docs/adr/013-http-adapter.md +63 -0
- package/templates/base/docs/adr/014-build-toolchain.md +61 -0
- package/templates/base/docs/adr/015-cloud-provider-strategy.md +49 -0
- package/templates/base/docs/adr/016-ci-cd-pipeline-strategy.md +52 -0
- package/templates/base/docs/adr/017-logging-strategy.md +63 -0
- package/templates/base/docs/adr/018-security-architecture.md +61 -0
- package/templates/base/docs/adr/019-project-type-design.md +61 -0
- package/templates/base/docs/adr/020-frontend-framework-support.md +57 -0
- package/templates/base/docs/adr/021-observability-strategy.md +68 -0
- package/templates/base/docs/adr/022-api-design-patterns.md +64 -0
- package/templates/base/docs/adr/023-error-hierarchy.md +54 -0
- package/templates/base/docs/adr/024-request-context-pattern.md +57 -0
- package/templates/base/docs/adr/025-data-patterns.md +58 -0
- package/templates/base/docs/adr/026-migration-strategy.md +57 -0
- package/templates/base/docs/adr/027-dependency-management.md +60 -0
- package/templates/base/docs/adr/028-code-quality-toolchain.md +60 -0
- package/templates/base/docs/adr/029-admin-panel.md +53 -0
- package/templates/base/docs/adr/030-performance-patterns.md +60 -0
- package/templates/base/docs/adr/031-nx-generators-roadmap.md +73 -0
- package/templates/base/docs/runbooks/000-template.md +78 -0
- package/templates/base/docs/sla-slo.md +36 -0
- package/templates/base/dot-editorconfig +12 -0
- package/templates/base/dot-github/ISSUE_TEMPLATE/bug_report.md +33 -0
- package/templates/base/dot-github/ISSUE_TEMPLATE/feature_request.md +21 -0
- package/templates/base/dot-github/pull_request_template.md +32 -0
- package/templates/base/dot-gitignore +28 -0
- package/templates/base/dot-husky/commit-msg +1 -0
- package/templates/base/dot-husky/pre-commit +1 -0
- package/templates/base/dot-husky/pre-push +2 -0
- package/templates/base/dot-npmrc +1 -0
- package/templates/base/dot-nvmrc +1 -0
- package/templates/base/dot-prettierrc +8 -0
- package/templates/base/eslint.config.mjs +35 -0
- package/templates/base/jest.config.ts +56 -0
- package/templates/base/nest-cli.json.ejs +10 -0
- package/templates/base/nx.json +3 -0
- package/templates/base/package.json.ejs +78 -0
- package/templates/base/src/app/modules/.gitkeep +0 -0
- package/templates/base/src/config/.gitkeep +0 -0
- package/templates/base/src/infrastructure/database/entities/.gitkeep +0 -0
- package/templates/base/src/infrastructure/database/migrations/.gitkeep +0 -0
- package/templates/base/src/infrastructure/database/repositories/.gitkeep +0 -0
- package/templates/base/src/infrastructure/http/.gitkeep +0 -0
- package/templates/base/src/infrastructure/notifications/.gitkeep +0 -0
- package/templates/base/src/infrastructure/queue/.gitkeep +0 -0
- package/templates/base/src/infrastructure/storage/.gitkeep +0 -0
- package/templates/base/src/shared/constants/error-codes.constant.ts +30 -0
- package/templates/base/src/shared/constants/http.constant.ts +134 -0
- package/templates/base/src/shared/constants/index.ts +2 -0
- package/templates/base/src/shared/decorators/.gitkeep +0 -0
- package/templates/base/src/shared/decorators/api-paginated-response.decorator.ts +10 -0
- package/templates/base/src/shared/errors/application.error.ts +21 -0
- package/templates/base/src/shared/errors/forbidden.error.ts +7 -0
- package/templates/base/src/shared/errors/index.ts +6 -0
- package/templates/base/src/shared/errors/invalid-request.error.ts +7 -0
- package/templates/base/src/shared/errors/not-found.error.ts +7 -0
- package/templates/base/src/shared/errors/requester.error.ts +7 -0
- package/templates/base/src/shared/errors/validation.error.ts +7 -0
- package/templates/base/src/shared/filters/http-exception.filter.ts +139 -0
- package/templates/base/src/shared/guards/.gitkeep +0 -0
- package/templates/base/src/shared/interceptors/interfaces/.gitkeep +0 -0
- package/templates/base/src/shared/interceptors/response.interceptor.ts +22 -0
- package/templates/base/src/shared/middleware/request-timeout.middleware.ts +32 -0
- package/templates/base/src/shared/pipes/parse-uuid.pipe.ts +13 -0
- package/templates/base/src/shared/utils/index.ts +2 -0
- package/templates/base/src/shared/utils/retry.util.ts +32 -0
- package/templates/base/src/shared/utils/sleep.util.ts +3 -0
- package/templates/base/tests/e2e/app.e2e-spec.ts.ejs +25 -0
- package/templates/base/tests/factories/.gitkeep +0 -0
- package/templates/base/tests/helpers/.gitkeep +0 -0
- package/templates/base/tests/integration/.gitkeep +0 -0
- package/templates/base/tests/unit/app.module.spec.ts +11 -0
- package/templates/base/tests/unit/shared/errors/error-hierarchy.spec.ts +69 -0
- package/templates/base/tests/unit/shared/filters/http-exception.filter.spec.ts +188 -0
- package/templates/base/tests/unit/shared/interceptors/response.interceptor.spec.ts +54 -0
- package/templates/base/tests/unit/shared/pipes/parse-uuid.pipe.spec.ts +14 -0
- package/templates/base/tsconfig.build.json +4 -0
- package/templates/base/tsconfig.json.ejs +26 -0
- package/templates/project-types/aws-lambda/package-fragment.json +8 -0
- package/templates/project-types/aws-lambda/src/app.module.ts.ejs +9 -0
- package/templates/project-types/aws-lambda/src/main.ts.ejs +32 -0
- package/templates/project-types/aws-lambda/tests/unit/handler.spec.ts +7 -0
- package/templates/project-types/cli-app/package-fragment.json +8 -0
- package/templates/project-types/cli-app/src/app.module.ts.ejs +11 -0
- package/templates/project-types/cli-app/src/commands/hello.command.ts.ejs +8 -0
- package/templates/project-types/cli-app/src/main.ts.ejs +8 -0
- package/templates/project-types/cli-app/tests/unit/commands/hello.command.spec.ts +17 -0
- package/templates/project-types/full-stack/apps/api/src/app.module.ts.ejs +9 -0
- package/templates/project-types/full-stack/apps/api/src/main.ts.ejs +32 -0
- package/templates/project-types/full-stack/frontend/nextjs/.cursor/rules/nextjs.mdc +12 -0
- package/templates/project-types/full-stack/frontend/nextjs/.github/copilot-instructions.md +23 -0
- package/templates/project-types/full-stack/frontend/nextjs/CLAUDE.md +25 -0
- package/templates/project-types/full-stack/frontend/nextjs/next.config.ts +9 -0
- package/templates/project-types/full-stack/frontend/nextjs/package.json +21 -0
- package/templates/project-types/full-stack/frontend/nextjs/src/app/layout.tsx +9 -0
- package/templates/project-types/full-stack/frontend/nextjs/src/app/page.tsx +8 -0
- package/templates/project-types/full-stack/frontend/nextjs/tsconfig.json +21 -0
- package/templates/project-types/full-stack/frontend/nuxt/.cursor/rules/nuxt.mdc +14 -0
- package/templates/project-types/full-stack/frontend/nuxt/.github/copilot-instructions.md +25 -0
- package/templates/project-types/full-stack/frontend/nuxt/CLAUDE.md +25 -0
- package/templates/project-types/full-stack/frontend/nuxt/app.vue +5 -0
- package/templates/project-types/full-stack/frontend/nuxt/nuxt.config.ts +6 -0
- package/templates/project-types/full-stack/frontend/nuxt/package.json +17 -0
- package/templates/project-types/full-stack/frontend/nuxt/pages/index.vue +3 -0
- package/templates/project-types/full-stack/frontend/nuxt/tsconfig.json +1 -0
- package/templates/project-types/full-stack/frontend/sveltekit/.cursor/rules/sveltekit.mdc +13 -0
- package/templates/project-types/full-stack/frontend/sveltekit/.github/copilot-instructions.md +24 -0
- package/templates/project-types/full-stack/frontend/sveltekit/CLAUDE.md +25 -0
- package/templates/project-types/full-stack/frontend/sveltekit/package.json +17 -0
- package/templates/project-types/full-stack/frontend/sveltekit/src/app.html +5 -0
- package/templates/project-types/full-stack/frontend/sveltekit/src/routes/+page.svelte +1 -0
- package/templates/project-types/full-stack/frontend/sveltekit/svelte.config.js +5 -0
- package/templates/project-types/full-stack/frontend/sveltekit/vite.config.ts +9 -0
- package/templates/project-types/full-stack/frontend/vite-react/.cursor/rules/react.mdc +12 -0
- package/templates/project-types/full-stack/frontend/vite-react/.github/copilot-instructions.md +23 -0
- package/templates/project-types/full-stack/frontend/vite-react/CLAUDE.md +24 -0
- package/templates/project-types/full-stack/frontend/vite-react/index.html +5 -0
- package/templates/project-types/full-stack/frontend/vite-react/package.json +22 -0
- package/templates/project-types/full-stack/frontend/vite-react/src/App.tsx +8 -0
- package/templates/project-types/full-stack/frontend/vite-react/src/main.tsx +9 -0
- package/templates/project-types/full-stack/frontend/vite-react/tsconfig.json +21 -0
- package/templates/project-types/full-stack/frontend/vite-react/vite.config.ts +9 -0
- package/templates/project-types/full-stack/libs/shared-types/package.json.ejs +6 -0
- package/templates/project-types/full-stack/libs/shared-types/src/index.ts.ejs +15 -0
- package/templates/project-types/full-stack/nx.json.ejs +20 -0
- package/templates/project-types/full-stack/package-fragment.json +14 -0
- package/templates/project-types/full-stack/pnpm-workspace.yaml +3 -0
- package/templates/project-types/full-stack/tsconfig.json.ejs +27 -0
- package/templates/project-types/http-api/src/app.module.ts.ejs +9 -0
- package/templates/project-types/http-api/src/main.ts.ejs +30 -0
- package/templates/project-types/http-api/tests/e2e/health.e2e-spec.ts +23 -0
- package/templates/project-types/microservice/package-fragment.json +5 -0
- package/templates/project-types/microservice/src/app.module.ts.ejs +9 -0
- package/templates/project-types/microservice/src/main.ts.ejs +15 -0
- package/templates/project-types/microservice/tests/unit/app.module.spec.ts +9 -0
- package/templates/project-types/monorepo/README.md.ejs +33 -0
- package/templates/project-types/monorepo/apps/api/src/app.module.ts.ejs +9 -0
- package/templates/project-types/monorepo/apps/api/src/main.ts.ejs +30 -0
- package/templates/project-types/monorepo/libs/common/package.json.ejs +6 -0
- package/templates/project-types/monorepo/libs/common/src/index.ts.ejs +17 -0
- package/templates/project-types/monorepo/nx.json.ejs +20 -0
- package/templates/project-types/monorepo/package-fragment.json +13 -0
- package/templates/project-types/monorepo/pnpm-workspace.yaml +3 -0
- package/templates/project-types/monorepo/tsconfig.json.ejs +27 -0
- package/templates/project-types/scheduled-worker/package-fragment.json +5 -0
- package/templates/project-types/scheduled-worker/src/app.module.ts.ejs +13 -0
- package/templates/project-types/scheduled-worker/src/jobs/example.job.ts.ejs +12 -0
- package/templates/project-types/scheduled-worker/src/main.ts.ejs +10 -0
- package/templates/project-types/scheduled-worker/tests/unit/jobs/example.job.spec.ts +17 -0
- package/templates/recipes/adminjs/README.md +145 -0
- package/templates/recipes/adminjs/src/app/modules/admin/admin.module.ts +59 -0
- package/templates/recipes/adminjs/tests/unit/app/modules/admin/admin.module.spec.ts +22 -0
- package/templates/recipes/ai-context/README.md +11 -0
- package/templates/recipes/ai-context/claude/base.md +73 -0
- package/templates/recipes/ai-context/claude/commands/add-command.md +48 -0
- package/templates/recipes/ai-context/claude/commands/add-consumer.md +58 -0
- package/templates/recipes/ai-context/claude/commands/add-endpoint.md +69 -0
- package/templates/recipes/ai-context/claude/commands/add-job.md +42 -0
- package/templates/recipes/ai-context/claude/commands/migrate.md +69 -0
- package/templates/recipes/ai-context/copilot/base.md +71 -0
- package/templates/recipes/ai-context/cursor/auth.mdc +44 -0
- package/templates/recipes/ai-context/cursor/base.mdc +44 -0
- package/templates/recipes/ai-context/cursor/prisma.mdc +43 -0
- package/templates/recipes/ai-context/cursor/swagger.mdc +48 -0
- package/templates/recipes/ai-context/cursor/testing.mdc +58 -0
- package/templates/recipes/ai-context/cursor/typeorm.mdc +49 -0
- package/templates/recipes/api-keys/README.md +44 -0
- package/templates/recipes/api-keys/src/shared/guards/api-key.guard.ts +32 -0
- package/templates/recipes/api-keys/tests/unit/shared/guards/api-key.guard.spec.ts +40 -0
- package/templates/recipes/api-versioning/README.md +63 -0
- package/templates/recipes/audit-trail/README.md +75 -0
- package/templates/recipes/audit-trail/src/shared/decorators/auditable.decorator.ts +4 -0
- package/templates/recipes/audit-trail/src/shared/interceptors/audit.interceptor.ts +46 -0
- package/templates/recipes/audit-trail/tests/unit/shared/interceptors/audit.interceptor.spec.ts +82 -0
- package/templates/recipes/auth-flows/README.md +91 -0
- package/templates/recipes/auth-flows/src/app/modules/auth/auth.controller.ts +44 -0
- package/templates/recipes/auth-flows/src/app/modules/auth/auth.module.ts +11 -0
- package/templates/recipes/auth-flows/src/app/modules/auth/auth.service.ts +194 -0
- package/templates/recipes/auth-flows/src/app/modules/auth/dto/forgot-password.dto.ts +6 -0
- package/templates/recipes/auth-flows/src/app/modules/auth/dto/login.dto.ts +9 -0
- package/templates/recipes/auth-flows/src/app/modules/auth/dto/reset-password.dto.ts +11 -0
- package/templates/recipes/auth-flows/src/app/modules/auth/dto/signup.dto.ts +16 -0
- package/templates/recipes/auth-flows/tests/unit/app/modules/auth/auth.service.spec.ts +13 -0
- package/templates/recipes/bullmq/README.md +54 -0
- package/templates/recipes/bullmq/src/infrastructure/queue/example.processor.ts +25 -0
- package/templates/recipes/bullmq/src/infrastructure/queue/queue.module.ts +26 -0
- package/templates/recipes/bullmq/tests/unit/infrastructure/queue/example.processor.spec.ts +17 -0
- package/templates/recipes/changelog/.changelogrc.json +18 -0
- package/templates/recipes/changelog/README.md +44 -0
- package/templates/recipes/ci-cd/README.md +14 -0
- package/templates/recipes/ci-cd/aws-codepipeline/README.md +30 -0
- package/templates/recipes/ci-cd/aws-codepipeline/buildspec.yml +41 -0
- package/templates/recipes/ci-cd/azure-devops/README.md +32 -0
- package/templates/recipes/ci-cd/azure-devops/azure-pipelines.yml +79 -0
- package/templates/recipes/ci-cd/gcp-cloudbuild/README.md +64 -0
- package/templates/recipes/ci-cd/gcp-cloudbuild/cloudbuild.yaml +53 -0
- package/templates/recipes/ci-cd/github-actions/.github/workflows/cd.yml +35 -0
- package/templates/recipes/ci-cd/github-actions/.github/workflows/ci.yml +62 -0
- package/templates/recipes/ci-cd/github-actions/README.md +29 -0
- package/templates/recipes/circuit-breaker/README.md +45 -0
- package/templates/recipes/circuit-breaker/src/shared/utils/circuit-breaker.ts +100 -0
- package/templates/recipes/circuit-breaker/tests/unit/shared/utils/circuit-breaker.spec.ts +28 -0
- package/templates/recipes/cloud-aws/README.md +20 -0
- package/templates/recipes/cloud-aws/cloudfront/README.md +50 -0
- package/templates/recipes/cloud-aws/cloudfront/src/infrastructure/aws/cloudfront.module.ts +8 -0
- package/templates/recipes/cloud-aws/cloudfront/src/infrastructure/aws/cloudfront.service.ts +29 -0
- package/templates/recipes/cloud-aws/cloudwatch/README.md +40 -0
- package/templates/recipes/cloud-aws/cloudwatch/src/infrastructure/aws/cloudwatch.module.ts +8 -0
- package/templates/recipes/cloud-aws/cloudwatch/src/infrastructure/aws/cloudwatch.service.ts +40 -0
- package/templates/recipes/cloud-aws/cognito/README.md +39 -0
- package/templates/recipes/cloud-aws/cognito/src/infrastructure/aws/cognito.module.ts +8 -0
- package/templates/recipes/cloud-aws/cognito/src/infrastructure/aws/cognito.service.ts +47 -0
- package/templates/recipes/cloud-aws/dynamodb/README.md +48 -0
- package/templates/recipes/cloud-aws/dynamodb/src/infrastructure/aws/dynamodb.module.ts +8 -0
- package/templates/recipes/cloud-aws/dynamodb/src/infrastructure/aws/dynamodb.service.ts +49 -0
- package/templates/recipes/cloud-aws/elasticache/README.md +45 -0
- package/templates/recipes/cloud-aws/elasticache/src/infrastructure/aws/redis.module.ts +8 -0
- package/templates/recipes/cloud-aws/elasticache/src/infrastructure/aws/redis.service.ts +47 -0
- package/templates/recipes/cloud-aws/eventbridge/README.md +46 -0
- package/templates/recipes/cloud-aws/eventbridge/src/infrastructure/aws/eventbridge.module.ts +8 -0
- package/templates/recipes/cloud-aws/eventbridge/src/infrastructure/aws/eventbridge.service.ts +48 -0
- package/templates/recipes/cloud-aws/rds/README.md +59 -0
- package/templates/recipes/cloud-aws/s3/README.md +44 -0
- package/templates/recipes/cloud-aws/s3/src/infrastructure/aws/s3.module.ts +8 -0
- package/templates/recipes/cloud-aws/s3/src/infrastructure/aws/s3.service.ts +42 -0
- package/templates/recipes/cloud-aws/secrets-manager/README.md +38 -0
- package/templates/recipes/cloud-aws/secrets-manager/src/infrastructure/aws/secrets.module.ts +8 -0
- package/templates/recipes/cloud-aws/secrets-manager/src/infrastructure/aws/secrets.service.ts +39 -0
- package/templates/recipes/cloud-aws/sns/README.md +43 -0
- package/templates/recipes/cloud-aws/sns/src/infrastructure/aws/sns.module.ts +8 -0
- package/templates/recipes/cloud-aws/sns/src/infrastructure/aws/sns.service.ts +48 -0
- package/templates/recipes/cloud-aws/sqs/README.md +47 -0
- package/templates/recipes/cloud-aws/sqs/src/infrastructure/aws/sqs.module.ts +8 -0
- package/templates/recipes/cloud-aws/sqs/src/infrastructure/aws/sqs.service.ts +58 -0
- package/templates/recipes/cloud-aws/ssm/README.md +41 -0
- package/templates/recipes/cloud-aws/ssm/src/infrastructure/aws/ssm.module.ts +8 -0
- package/templates/recipes/cloud-aws/ssm/src/infrastructure/aws/ssm.service.ts +54 -0
- package/templates/recipes/cloud-azure/README.md +18 -0
- package/templates/recipes/cloud-azure/app-insights/README.md +50 -0
- package/templates/recipes/cloud-azure/app-insights/src/infrastructure/azure/app-insights.module.ts +11 -0
- package/templates/recipes/cloud-azure/app-insights/src/infrastructure/azure/app-insights.service.ts +38 -0
- package/templates/recipes/cloud-azure/blob-storage/README.md +49 -0
- package/templates/recipes/cloud-azure/blob-storage/src/infrastructure/azure/blob-storage.module.ts +11 -0
- package/templates/recipes/cloud-azure/blob-storage/src/infrastructure/azure/blob-storage.service.ts +64 -0
- package/templates/recipes/cloud-azure/cache/README.md +47 -0
- package/templates/recipes/cloud-azure/cache/src/infrastructure/azure/redis.module.ts +11 -0
- package/templates/recipes/cloud-azure/cache/src/infrastructure/azure/redis.service.ts +41 -0
- package/templates/recipes/cloud-azure/cosmos-db/README.md +57 -0
- package/templates/recipes/cloud-azure/cosmos-db/src/infrastructure/azure/cosmos-db.module.ts +11 -0
- package/templates/recipes/cloud-azure/cosmos-db/src/infrastructure/azure/cosmos-db.service.ts +55 -0
- package/templates/recipes/cloud-azure/entra-id/README.md +42 -0
- package/templates/recipes/cloud-azure/entra-id/src/infrastructure/azure/entra-id.module.ts +11 -0
- package/templates/recipes/cloud-azure/entra-id/src/infrastructure/azure/entra-id.service.ts +55 -0
- package/templates/recipes/cloud-azure/front-door/README.md +48 -0
- package/templates/recipes/cloud-azure/functions/README.md +48 -0
- package/templates/recipes/cloud-azure/key-vault/README.md +42 -0
- package/templates/recipes/cloud-azure/key-vault/src/infrastructure/azure/key-vault.module.ts +11 -0
- package/templates/recipes/cloud-azure/key-vault/src/infrastructure/azure/key-vault.service.ts +27 -0
- package/templates/recipes/cloud-azure/service-bus/README.md +49 -0
- package/templates/recipes/cloud-azure/service-bus/src/infrastructure/azure/service-bus.module.ts +11 -0
- package/templates/recipes/cloud-azure/service-bus/src/infrastructure/azure/service-bus.service.ts +52 -0
- package/templates/recipes/cloud-azure/sql-database/README.md +54 -0
- package/templates/recipes/cloud-gcp/README.md +18 -0
- package/templates/recipes/cloud-gcp/cloud-cdn/README.md +40 -0
- package/templates/recipes/cloud-gcp/cloud-functions/README.md +42 -0
- package/templates/recipes/cloud-gcp/cloud-logging/README.md +42 -0
- package/templates/recipes/cloud-gcp/cloud-logging/src/infrastructure/gcp/logging.module.ts +10 -0
- package/templates/recipes/cloud-gcp/cloud-logging/src/infrastructure/gcp/logging.service.ts +50 -0
- package/templates/recipes/cloud-gcp/cloud-sql/README.md +53 -0
- package/templates/recipes/cloud-gcp/cloud-storage/README.md +43 -0
- package/templates/recipes/cloud-gcp/cloud-storage/src/infrastructure/gcp/storage.module.ts +10 -0
- package/templates/recipes/cloud-gcp/cloud-storage/src/infrastructure/gcp/storage.service.ts +51 -0
- package/templates/recipes/cloud-gcp/firebase-auth/README.md +38 -0
- package/templates/recipes/cloud-gcp/firebase-auth/src/infrastructure/gcp/firebase-auth.module.ts +10 -0
- package/templates/recipes/cloud-gcp/firebase-auth/src/infrastructure/gcp/firebase-auth.service.ts +41 -0
- package/templates/recipes/cloud-gcp/firestore/README.md +46 -0
- package/templates/recipes/cloud-gcp/firestore/src/infrastructure/gcp/firestore.module.ts +10 -0
- package/templates/recipes/cloud-gcp/firestore/src/infrastructure/gcp/firestore.service.ts +44 -0
- package/templates/recipes/cloud-gcp/memorystore/README.md +44 -0
- package/templates/recipes/cloud-gcp/memorystore/src/infrastructure/gcp/redis.module.ts +10 -0
- package/templates/recipes/cloud-gcp/memorystore/src/infrastructure/gcp/redis.service.ts +54 -0
- package/templates/recipes/cloud-gcp/pubsub/README.md +43 -0
- package/templates/recipes/cloud-gcp/pubsub/src/infrastructure/gcp/pubsub.module.ts +10 -0
- package/templates/recipes/cloud-gcp/pubsub/src/infrastructure/gcp/pubsub.service.ts +60 -0
- package/templates/recipes/cloud-gcp/secret-manager/README.md +40 -0
- package/templates/recipes/cloud-gcp/secret-manager/src/infrastructure/gcp/secrets.module.ts +10 -0
- package/templates/recipes/cloud-gcp/secret-manager/src/infrastructure/gcp/secrets.service.ts +41 -0
- package/templates/recipes/config-validation/README.md +61 -0
- package/templates/recipes/config-validation/src/config/env.validation.ts +28 -0
- package/templates/recipes/config-validation/tests/unit/config/env.validation.spec.ts +34 -0
- package/templates/recipes/content-digest/README.md +28 -0
- package/templates/recipes/content-digest/src/shared/guards/content-digest.guard.ts +30 -0
- package/templates/recipes/content-digest/src/shared/interceptors/content-digest.interceptor.ts +23 -0
- package/templates/recipes/content-digest/tests/unit/shared/guards/content-digest.guard.spec.ts +56 -0
- package/templates/recipes/content-digest/tests/unit/shared/interceptors/content-digest.interceptor.spec.ts +54 -0
- package/templates/recipes/correlation-id/README.md +44 -0
- package/templates/recipes/correlation-id/src/shared/middleware/correlation-id.middleware.ts +29 -0
- package/templates/recipes/correlation-id/tests/unit/shared/middleware/correlation-id.spec.ts +5 -0
- package/templates/recipes/cors/README.md +45 -0
- package/templates/recipes/cqrs/README.md +39 -0
- package/templates/recipes/cqrs/src/shared/cqrs/example.command.ts +29 -0
- package/templates/recipes/cqrs/tests/unit/shared/cqrs/example.command.spec.ts +38 -0
- package/templates/recipes/csrf/README.md +55 -0
- package/templates/recipes/data-masking/README.md +85 -0
- package/templates/recipes/data-masking/src/shared/decorators/sensitive.decorator.ts +12 -0
- package/templates/recipes/data-masking/src/shared/utils/mask.util.ts +26 -0
- package/templates/recipes/data-masking/tests/unit/shared/utils/mask.util.spec.ts +21 -0
- package/templates/recipes/database-factories/README.md +48 -0
- package/templates/recipes/database-factories/tests/factories/base.factory.ts +51 -0
- package/templates/recipes/database-seeding/README.md +40 -0
- package/templates/recipes/database-seeding/src/infrastructure/database/seed.ts +61 -0
- package/templates/recipes/database-seeding/tests/unit/infrastructure/database/seed.spec.ts +37 -0
- package/templates/recipes/dead-letter-queue/README.md +79 -0
- package/templates/recipes/dead-letter-queue/src/infrastructure/queue/dlq.service.ts +43 -0
- package/templates/recipes/dead-letter-queue/tests/unit/infrastructure/queue/dlq.service.spec.ts +46 -0
- package/templates/recipes/dependabot-renovate/.github/dependabot.yml +52 -0
- package/templates/recipes/dependabot-renovate/README.md +37 -0
- package/templates/recipes/dependabot-renovate/renovate.json +46 -0
- package/templates/recipes/deploy/README.md +13 -0
- package/templates/recipes/deploy/docker-compose/README.md +38 -0
- package/templates/recipes/deploy/docker-compose/docker-compose.yml +43 -0
- package/templates/recipes/deploy/dockerfile/Dockerfile +30 -0
- package/templates/recipes/deploy/dockerfile/README.md +30 -0
- package/templates/recipes/deploy/dockerfile/dot-dockerignore +9 -0
- package/templates/recipes/deploy/kubernetes/README.md +43 -0
- package/templates/recipes/deploy/kubernetes/k8s/configmap.yaml +7 -0
- package/templates/recipes/deploy/kubernetes/k8s/deployment.yaml +45 -0
- package/templates/recipes/deploy/kubernetes/k8s/hpa.yaml +18 -0
- package/templates/recipes/deploy/kubernetes/k8s/ingress.yaml +23 -0
- package/templates/recipes/deploy/kubernetes/k8s/service.yaml +12 -0
- package/templates/recipes/deploy/serverless-framework/README.md +39 -0
- package/templates/recipes/deploy/serverless-framework/serverless.yml.ejs +22 -0
- package/templates/recipes/deploy/terraform/README.md +99 -0
- package/templates/recipes/deploy/terraform/main.tf.ejs +13 -0
- package/templates/recipes/deploy/terraform/modules/app/alb.tf +34 -0
- package/templates/recipes/deploy/terraform/modules/app/iam.tf +30 -0
- package/templates/recipes/deploy/terraform/modules/app/main.tf +80 -0
- package/templates/recipes/deploy/terraform/modules/app/outputs.tf +11 -0
- package/templates/recipes/deploy/terraform/modules/app/security.tf +37 -0
- package/templates/recipes/deploy/terraform/modules/app/variables.tf +42 -0
- package/templates/recipes/deploy/terraform/outputs.tf +4 -0
- package/templates/recipes/deploy/terraform/variables.tf +11 -0
- package/templates/recipes/devcontainer/.devcontainer/Dockerfile +5 -0
- package/templates/recipes/devcontainer/.devcontainer/devcontainer.json +32 -0
- package/templates/recipes/devcontainer/.devcontainer/docker-compose.yml +62 -0
- package/templates/recipes/devcontainer/README.md +31 -0
- package/templates/recipes/distributed-tracing/README.md +45 -0
- package/templates/recipes/distributed-tracing/src/shared/middleware/trace-propagation.middleware.ts +68 -0
- package/templates/recipes/distributed-tracing/tests/unit/shared/middleware/trace-propagation.middleware.spec.ts +76 -0
- package/templates/recipes/docker-compose-dev/Dockerfile.dev +14 -0
- package/templates/recipes/docker-compose-dev/README.md +57 -0
- package/templates/recipes/docker-compose-dev/docker-compose.dev.yml.ejs +54 -0
- package/templates/recipes/docs-site/README.md +41 -0
- package/templates/recipes/docs-site/docs/.vitepress/config.ts.ejs +53 -0
- package/templates/recipes/dpop/README.md +37 -0
- package/templates/recipes/dpop/src/shared/guards/dpop.guard.ts +61 -0
- package/templates/recipes/dpop/tests/unit/shared/guards/dpop.guard.spec.ts +69 -0
- package/templates/recipes/drizzle-postgres/README.md +68 -0
- package/templates/recipes/drizzle-postgres/drizzle.config.ts +10 -0
- package/templates/recipes/drizzle-postgres/src/infrastructure/database/drizzle.module.ts +25 -0
- package/templates/recipes/drizzle-postgres/src/infrastructure/database/schema/example.ts +9 -0
- package/templates/recipes/drizzle-postgres/src/infrastructure/database/schema/index.ts +3 -0
- package/templates/recipes/drizzle-postgres/tests/unit/infrastructure/database/drizzle.module.spec.ts +35 -0
- package/templates/recipes/env-per-environment/.env.development +17 -0
- package/templates/recipes/env-per-environment/.env.production +20 -0
- package/templates/recipes/env-per-environment/.env.test +17 -0
- package/templates/recipes/env-per-environment/README.md +40 -0
- package/templates/recipes/feature-flags/README.md +45 -0
- package/templates/recipes/feature-flags/src/shared/services/feature-flag.service.ts +48 -0
- package/templates/recipes/feature-flags/tests/unit/shared/services/feature-flag.service.spec.ts +36 -0
- package/templates/recipes/file-upload/README.md +104 -0
- package/templates/recipes/file-upload/src/shared/interceptors/file-upload.interceptor.ts +33 -0
- package/templates/recipes/file-upload/src/shared/pipes/file-validation.pipe.ts +45 -0
- package/templates/recipes/file-upload/tests/unit/shared/pipes/file-validation.pipe.spec.ts +56 -0
- package/templates/recipes/filtering/README.md +43 -0
- package/templates/recipes/filtering/src/shared/dto/filter.dto.ts +49 -0
- package/templates/recipes/filtering/tests/unit/shared/dto/filter.dto.spec.ts +38 -0
- package/templates/recipes/graceful-shutdown/README.md +60 -0
- package/templates/recipes/graceful-shutdown/src/shared/lifecycle/shutdown.service.ts +52 -0
- package/templates/recipes/graceful-shutdown/tests/unit/shared/lifecycle/shutdown.service.spec.ts +52 -0
- package/templates/recipes/graphql-mercurius/README.md +37 -0
- package/templates/recipes/graphql-mercurius/src/infrastructure/graphql/graphql.module.ts +18 -0
- package/templates/recipes/graphql-mercurius/tests/unit/infrastructure/graphql/graphql.module.spec.ts +12 -0
- package/templates/recipes/health-checks/README.md +35 -0
- package/templates/recipes/health-checks/src/shared/health/health.controller.ts +26 -0
- package/templates/recipes/health-checks/src/shared/health/health.module.ts +9 -0
- package/templates/recipes/health-checks/tests/unit/shared/health/health.controller.spec.ts +8 -0
- package/templates/recipes/helmet/README.md +43 -0
- package/templates/recipes/http-caching/README.md +63 -0
- package/templates/recipes/http-caching/src/shared/decorators/cache-control.decorator.ts +18 -0
- package/templates/recipes/http-caching/src/shared/interceptors/cache-control.interceptor.ts +43 -0
- package/templates/recipes/http-caching/tests/unit/shared/interceptors/cache-control.interceptor.spec.ts +44 -0
- package/templates/recipes/i18n/README.md +45 -0
- package/templates/recipes/i18n/src/i18n/en/common.json +7 -0
- package/templates/recipes/i18n/src/i18n/nl/common.json +7 -0
- package/templates/recipes/i18n/src/shared/i18n/i18n.module.ts +17 -0
- package/templates/recipes/i18n/tests/unit/shared/i18n/i18n.module.spec.ts +18 -0
- package/templates/recipes/idempotency/README.md +63 -0
- package/templates/recipes/idempotency/src/shared/decorators/idempotent.decorator.ts +4 -0
- package/templates/recipes/idempotency/src/shared/middleware/idempotency.middleware.ts +63 -0
- package/templates/recipes/idempotency/tests/unit/shared/middleware/idempotency.middleware.spec.ts +56 -0
- package/templates/recipes/json-merge-patch/README.md +53 -0
- package/templates/recipes/json-merge-patch/src/shared/pipes/merge-patch.pipe.ts +11 -0
- package/templates/recipes/json-merge-patch/tests/unit/shared/pipes/merge-patch.pipe.spec.ts +30 -0
- package/templates/recipes/json-patch/README.md +54 -0
- package/templates/recipes/json-patch/src/shared/pipes/json-patch.pipe.ts +39 -0
- package/templates/recipes/json-patch/tests/unit/shared/pipes/json-patch.pipe.spec.ts +37 -0
- package/templates/recipes/jwt-auth/README.md +56 -0
- package/templates/recipes/jwt-auth/src/shared/decorators/current-user.decorator.ts +10 -0
- package/templates/recipes/jwt-auth/src/shared/decorators/public.decorator.ts +4 -0
- package/templates/recipes/jwt-auth/src/shared/guards/jwt-auth.guard.ts +24 -0
- package/templates/recipes/jwt-auth/tests/unit/shared/guards/jwt-auth.guard.spec.ts +9 -0
- package/templates/recipes/kysely/README.md +53 -0
- package/templates/recipes/kysely/src/infrastructure/database/database.module.ts +28 -0
- package/templates/recipes/kysely/src/infrastructure/database/types.ts +17 -0
- package/templates/recipes/kysely/tests/unit/infrastructure/database/database.module.spec.ts +35 -0
- package/templates/recipes/license/LICENSE.agpl3 +59 -0
- package/templates/recipes/license/LICENSE.apache +189 -0
- package/templates/recipes/license/LICENSE.bsd3 +28 -0
- package/templates/recipes/license/LICENSE.gpl3 +22 -0
- package/templates/recipes/license/LICENSE.isc +15 -0
- package/templates/recipes/license/LICENSE.mit +21 -0
- package/templates/recipes/license/LICENSE.mpl2 +24 -0
- package/templates/recipes/license/LICENSE.proprietary +76 -0
- package/templates/recipes/license/LICENSE.unlicensed +13 -0
- package/templates/recipes/license/README.md +53 -0
- package/templates/recipes/load-testing/README.md +77 -0
- package/templates/recipes/load-testing/k6/smoke.js +20 -0
- package/templates/recipes/load-testing/k6/stress.js +22 -0
- package/templates/recipes/mfa-totp/README.md +77 -0
- package/templates/recipes/mfa-totp/src/shared/auth/totp.service.ts +26 -0
- package/templates/recipes/mfa-totp/tests/unit/shared/auth/totp.service.spec.ts +65 -0
- package/templates/recipes/mikro-orm/README.md +22 -0
- package/templates/recipes/mikro-orm/src/infrastructure/database/database.module.ts +8 -0
- package/templates/recipes/mikro-orm/src/infrastructure/database/entities/.gitkeep +0 -0
- package/templates/recipes/mikro-orm/src/infrastructure/database/migrations/.gitkeep +0 -0
- package/templates/recipes/mikro-orm/src/infrastructure/database/mikro-orm.config.ts +20 -0
- package/templates/recipes/mikro-orm/tests/unit/infrastructure/database/mikro-orm.config.spec.ts +53 -0
- package/templates/recipes/mongoose/README.md +42 -0
- package/templates/recipes/mongoose/src/infrastructure/database/database.module.ts.ejs +17 -0
- package/templates/recipes/mongoose/tests/unit/infrastructure/database/database.module.spec.ts +25 -0
- package/templates/recipes/multi-tenancy/README.md +49 -0
- package/templates/recipes/multi-tenancy/src/shared/decorators/tenant.decorator.ts +14 -0
- package/templates/recipes/multi-tenancy/src/shared/middleware/tenant.middleware.ts +49 -0
- package/templates/recipes/multi-tenancy/tests/unit/shared/middleware/tenant.middleware.spec.ts +29 -0
- package/templates/recipes/nodemailer/README.md +55 -0
- package/templates/recipes/nodemailer/src/infrastructure/notifications/mail.module.ts +37 -0
- package/templates/recipes/nodemailer/tests/unit/infrastructure/notifications/mail.module.spec.ts +33 -0
- package/templates/recipes/oauth-apple/README.md +68 -0
- package/templates/recipes/oauth-apple/src/shared/auth/apple-auth.guard.ts +5 -0
- package/templates/recipes/oauth-apple/src/shared/auth/apple.strategy.ts +33 -0
- package/templates/recipes/oauth-apple/tests/unit/shared/auth/apple.strategy.spec.ts +65 -0
- package/templates/recipes/oauth-github/README.md +62 -0
- package/templates/recipes/oauth-github/src/shared/auth/github-auth.guard.ts +5 -0
- package/templates/recipes/oauth-github/src/shared/auth/github.strategy.ts +33 -0
- package/templates/recipes/oauth-github/tests/unit/shared/auth/github.strategy.spec.ts +72 -0
- package/templates/recipes/oauth-google/README.md +64 -0
- package/templates/recipes/oauth-google/src/shared/auth/google-auth.guard.ts +5 -0
- package/templates/recipes/oauth-google/src/shared/auth/google.strategy.ts +33 -0
- package/templates/recipes/oauth-google/tests/unit/shared/auth/google.strategy.spec.ts +72 -0
- package/templates/recipes/oauth2-introspection/README.md +62 -0
- package/templates/recipes/oauth2-introspection/src/shared/guards/token-introspection.guard.ts +77 -0
- package/templates/recipes/oauth2-introspection/tests/unit/shared/guards/token-introspection.guard.spec.ts +99 -0
- package/templates/recipes/opentelemetry/README.md +44 -0
- package/templates/recipes/opentelemetry/src/infrastructure/telemetry/tracing.ts +38 -0
- package/templates/recipes/opentelemetry/tests/unit/infrastructure/telemetry/tracing.spec.ts +23 -0
- package/templates/recipes/pagination/README.md +71 -0
- package/templates/recipes/pagination/src/shared/decorators/paginate.decorator.ts +25 -0
- package/templates/recipes/pagination/src/shared/dto/pagination.dto.ts +64 -0
- package/templates/recipes/pagination/src/shared/interceptors/pagination-link.interceptor.ts +31 -0
- package/templates/recipes/pagination/tests/unit/shared/dto/pagination.dto.spec.ts +56 -0
- package/templates/recipes/passport/README.md +41 -0
- package/templates/recipes/passport/src/shared/guards/local-auth.guard.ts +5 -0
- package/templates/recipes/passport/tests/unit/shared/guards/local-auth.guard.spec.ts +17 -0
- package/templates/recipes/pino/README.md +48 -0
- package/templates/recipes/pino/src/infrastructure/logging/logger.module.ts +39 -0
- package/templates/recipes/pino/tests/unit/infrastructure/logging/logger.module.spec.ts +6 -0
- package/templates/recipes/prefer-header/README.md +92 -0
- package/templates/recipes/prefer-header/src/shared/interceptors/prefer.interceptor.ts +60 -0
- package/templates/recipes/prefer-header/tests/unit/shared/interceptors/prefer.interceptor.spec.ts +44 -0
- package/templates/recipes/prisma/README.md +52 -0
- package/templates/recipes/prisma/prisma/schema.prisma.ejs +8 -0
- package/templates/recipes/prisma/src/infrastructure/database/prisma.service.ts +27 -0
- package/templates/recipes/prisma/tests/unit/infrastructure/database/prisma.service.spec.ts +21 -0
- package/templates/recipes/prometheus/README.md +54 -0
- package/templates/recipes/prometheus/src/infrastructure/metrics/metrics.controller.ts +15 -0
- package/templates/recipes/prometheus/src/infrastructure/metrics/metrics.module.ts +29 -0
- package/templates/recipes/prometheus/tests/unit/infrastructure/metrics/metrics.controller.spec.ts +22 -0
- package/templates/recipes/rabbitmq/README.md +53 -0
- package/templates/recipes/rabbitmq/src/infrastructure/queue/queue.module.ts.ejs +27 -0
- package/templates/recipes/rbac-casl/README.md +69 -0
- package/templates/recipes/rbac-casl/src/shared/auth/casl-ability.factory.ts +43 -0
- package/templates/recipes/rbac-casl/src/shared/decorators/roles.decorator.ts +5 -0
- package/templates/recipes/rbac-casl/src/shared/guards/policies.guard.ts +32 -0
- package/templates/recipes/rbac-casl/src/shared/guards/roles.guard.ts +21 -0
- package/templates/recipes/rbac-casl/tests/unit/shared/auth/casl-ability.factory.spec.ts +6 -0
- package/templates/recipes/redis-cache/README.md +55 -0
- package/templates/recipes/redis-cache/src/infrastructure/cache/cache.module.ts +26 -0
- package/templates/recipes/redis-cache/tests/unit/infrastructure/cache/cache.module.spec.ts +12 -0
- package/templates/recipes/request-context/README.md +57 -0
- package/templates/recipes/request-context/src/shared/context/request-context.module.ts +19 -0
- package/templates/recipes/request-context/tests/unit/shared/context/request-context.module.spec.ts +20 -0
- package/templates/recipes/request-logging/README.md +36 -0
- package/templates/recipes/request-logging/src/shared/middleware/request-logging.middleware.ts +40 -0
- package/templates/recipes/request-logging/tests/unit/shared/middleware/request-logging.middleware.spec.ts +64 -0
- package/templates/recipes/s3-minio/README.md +52 -0
- package/templates/recipes/s3-minio/src/infrastructure/storage/storage.module.ts +10 -0
- package/templates/recipes/s3-minio/src/infrastructure/storage/storage.service.ts +72 -0
- package/templates/recipes/s3-minio/tests/unit/infrastructure/storage/storage.service.spec.ts +23 -0
- package/templates/recipes/sdk-generation/README.md +40 -0
- package/templates/recipes/sdk-generation/openapitools.json +21 -0
- package/templates/recipes/sendgrid/README.md +45 -0
- package/templates/recipes/sendgrid/src/infrastructure/notifications/sendgrid.service.ts +60 -0
- package/templates/recipes/sendgrid/tests/unit/infrastructure/notifications/sendgrid.service.spec.ts +59 -0
- package/templates/recipes/sentry/README.md +49 -0
- package/templates/recipes/sentry/src/infrastructure/sentry/sentry.filter.ts +34 -0
- package/templates/recipes/sentry/src/infrastructure/sentry/sentry.module.ts +23 -0
- package/templates/recipes/sentry/tests/unit/infrastructure/sentry/sentry.filter.spec.ts +50 -0
- package/templates/recipes/seq2/README.md +41 -0
- package/templates/recipes/seq2/src/infrastructure/logging/seq.transport.ts +57 -0
- package/templates/recipes/seq2/tests/unit/infrastructure/logging/seq.transport.spec.ts +53 -0
- package/templates/recipes/serialization-groups/README.md +105 -0
- package/templates/recipes/serialization-groups/src/shared/interceptors/serialize.interceptor.ts +29 -0
- package/templates/recipes/serialization-groups/tests/unit/shared/interceptors/serialize.interceptor.spec.ts +48 -0
- package/templates/recipes/soft-delete/README.md +71 -0
- package/templates/recipes/soft-delete/src/shared/decorators/with-deleted.decorator.ts +4 -0
- package/templates/recipes/soft-delete/src/shared/entities/soft-deletable.entity.ts +20 -0
- package/templates/recipes/soft-delete/tests/unit/shared/entities/soft-deletable.entity.spec.ts +35 -0
- package/templates/recipes/sse/README.md +43 -0
- package/templates/recipes/sse/src/shared/gateways/events.sse.controller.ts +21 -0
- package/templates/recipes/sse/tests/unit/shared/gateways/events.sse.controller.spec.ts +32 -0
- package/templates/recipes/swagger/README.md +42 -0
- package/templates/recipes/swagger/src/main.swagger.ts.ejs +20 -0
- package/templates/recipes/swagger/tests/unit/main.swagger.spec.ts +5 -0
- package/templates/recipes/throttler/README.md +49 -0
- package/templates/recipes/throttler/src/shared/guards/throttle.config.ts +33 -0
- package/templates/recipes/throttler/tests/unit/shared/guards/throttle.spec.ts +5 -0
- package/templates/recipes/transactional-outbox/README.md +98 -0
- package/templates/recipes/transactional-outbox/src/infrastructure/outbox/outbox.entity.ts +30 -0
- package/templates/recipes/transactional-outbox/src/infrastructure/outbox/outbox.service.ts +21 -0
- package/templates/recipes/transactional-outbox/tests/unit/infrastructure/outbox/outbox.service.spec.ts +38 -0
- package/templates/recipes/typeorm-mysql/README.md +48 -0
- package/templates/recipes/typeorm-mysql/src/infrastructure/database/database.module.ts.ejs +24 -0
- package/templates/recipes/typeorm-postgres/README.md +101 -0
- package/templates/recipes/typeorm-postgres/src/infrastructure/database/data-source.ts.ejs +14 -0
- package/templates/recipes/typeorm-postgres/src/infrastructure/database/database.module.ts.ejs +24 -0
- package/templates/recipes/typeorm-postgres/src/infrastructure/database/entities/.gitkeep +0 -0
- package/templates/recipes/typeorm-postgres/src/infrastructure/database/entities/index.ts +7 -0
- package/templates/recipes/typeorm-postgres/src/infrastructure/database/migrations/.gitkeep +0 -0
- package/templates/recipes/typeorm-postgres/src/infrastructure/database/migrations/index.ts +10 -0
- package/templates/recipes/typeorm-postgres/tests/unit/infrastructure/database/database.module.spec.ts +11 -0
- package/templates/recipes/webhooks/README.md +76 -0
- package/templates/recipes/webhooks/src/infrastructure/webhooks/webhook.service.ts +53 -0
- package/templates/recipes/webhooks/tests/unit/infrastructure/webhooks/webhook.service.spec.ts +31 -0
- package/templates/recipes/websockets/README.md +44 -0
- package/templates/recipes/websockets/src/shared/gateways/events.gateway.ts +55 -0
- package/templates/recipes/websockets/tests/unit/shared/gateways/events.gateway.spec.ts +23 -0
- package/templates/recipes/winston/README.md +45 -0
- package/templates/recipes/winston/src/infrastructure/logging/logger.module.ts +34 -0
- package/templates/recipes/winston/tests/unit/infrastructure/logging/logger.module.spec.ts +12 -0
- package/templates/recipes/worker-threads/README.md +71 -0
- package/templates/recipes/worker-threads/src/shared/utils/worker-pool.ts +59 -0
- 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
|