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