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
package/README.pt-BR.md
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
# nestforge
|
|
2
|
+
|
|
3
|
+
[English](README.md) | **Português**
|
|
4
|
+
|
|
5
|
+
CLI interativa que gera projetos NestJS a partir dos templates `../../templates/prisma`, `../../templates/typeorm` e `../../templates/drizzle` do NestForge.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx nestforge-generator
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Para o guia de testes, perguntas da CLI e checklist completo, consulte [`TESTING.pt-BR.md`](TESTING.pt-BR.md).
|
|
12
|
+
|
|
13
|
+
## O que já funciona
|
|
14
|
+
|
|
15
|
+
* Prompts interativos usando @clack/prompts;
|
|
16
|
+
* geração em TypeScript ou JavaScript;
|
|
17
|
+
* Prisma, TypeORM e Drizzle ORM;
|
|
18
|
+
* PostgreSQL, MySQL e SQLite;
|
|
19
|
+
* autenticação JWT, Session/Cookies, OAuth-only ou nenhuma;
|
|
20
|
+
* Docker opcional;
|
|
21
|
+
* Swagger/OpenAPI opcional;
|
|
22
|
+
* validação global com Zod opcional;
|
|
23
|
+
* Redis, filas e e-mail opcionais;
|
|
24
|
+
* RBAC e Permissions opcionais;
|
|
25
|
+
* criação opcional do .env;
|
|
26
|
+
* testes automatizados das combinações geradas.
|
|
27
|
+
|
|
28
|
+
Os projetos incluem recursos como upload de avatar, paginação, filtros, health checks, métricas, testes unitários e testes E2E.
|
|
29
|
+
|
|
30
|
+
## Linguagens
|
|
31
|
+
|
|
32
|
+
A CLI gera projetos em:
|
|
33
|
+
|
|
34
|
+
* TypeScript;
|
|
35
|
+
* JavaScript.
|
|
36
|
+
|
|
37
|
+
A opção JavaScript é produzida automaticamente a partir dos templates TypeScript durante a geração.
|
|
38
|
+
|
|
39
|
+
A transformação:
|
|
40
|
+
|
|
41
|
+
* transpila arquivos .ts;
|
|
42
|
+
* remove arquivos TypeScript que não devem permanecer;
|
|
43
|
+
* atualiza scripts do package.json;
|
|
44
|
+
* atualiza configurações do Vitest;
|
|
45
|
+
* atualiza configurações de migrations;
|
|
46
|
+
* adapta os comandos conforme o ORM selecionado.
|
|
47
|
+
|
|
48
|
+
## ORMs e bancos disponíveis
|
|
49
|
+
|
|
50
|
+
### Prisma
|
|
51
|
+
|
|
52
|
+
Disponível com:
|
|
53
|
+
|
|
54
|
+
* PostgreSQL;
|
|
55
|
+
* MySQL;
|
|
56
|
+
* SQLite.
|
|
57
|
+
|
|
58
|
+
A CLI ajusta o provider do schema.prisma, a URL do banco e os recursos específicos do provider.
|
|
59
|
+
|
|
60
|
+
### TypeORM
|
|
61
|
+
|
|
62
|
+
Disponível com:
|
|
63
|
+
|
|
64
|
+
* PostgreSQL usando pg;
|
|
65
|
+
* MySQL usando mysql2;
|
|
66
|
+
* SQLite usando better-sqlite3.
|
|
67
|
+
|
|
68
|
+
A CLI ajusta:
|
|
69
|
+
|
|
70
|
+
* DB_TYPE;
|
|
71
|
+
* DATABASE_URL;
|
|
72
|
+
* tipos de colunas;
|
|
73
|
+
* configuração do DataSource;
|
|
74
|
+
* scripts de migration;
|
|
75
|
+
* driver instalado.
|
|
76
|
+
|
|
77
|
+
Somente o driver necessário permanece no projeto gerado.
|
|
78
|
+
|
|
79
|
+
### Drizzle ORM
|
|
80
|
+
|
|
81
|
+
Disponível com:
|
|
82
|
+
|
|
83
|
+
* PostgreSQL usando pg;
|
|
84
|
+
* MySQL usando mysql2;
|
|
85
|
+
* SQLite usando better-sqlite3.
|
|
86
|
+
|
|
87
|
+
O template Drizzle inclui:
|
|
88
|
+
|
|
89
|
+
* schema específico para cada banco;
|
|
90
|
+
* configuração com Drizzle Kit;
|
|
91
|
+
* migrations SQL;
|
|
92
|
+
* seed;
|
|
93
|
+
* injeção tipada do banco;
|
|
94
|
+
* health check baseado no driver selecionado;
|
|
95
|
+
* DrizzleSessionStore;
|
|
96
|
+
* transações adaptadas ao SQLite.
|
|
97
|
+
|
|
98
|
+
Depois da geração, somente o schema e o driver do banco selecionado permanecem no projeto.
|
|
99
|
+
|
|
100
|
+
## Estratégias de autenticação
|
|
101
|
+
|
|
102
|
+
### JWT
|
|
103
|
+
|
|
104
|
+
A estratégia JWT mantém:
|
|
105
|
+
|
|
106
|
+
* cadastro;
|
|
107
|
+
* login;
|
|
108
|
+
* access token;
|
|
109
|
+
* refresh token;
|
|
110
|
+
* rotação de refresh token;
|
|
111
|
+
* revogação;
|
|
112
|
+
* logout;
|
|
113
|
+
* OAuth com Google e GitHub;
|
|
114
|
+
* recuperação de senha;
|
|
115
|
+
* verificação de e-mail.
|
|
116
|
+
|
|
117
|
+
As rotas de recuperação de senha e verificação de e-mail dependem do recurso Redis, filas e e-mail.
|
|
118
|
+
|
|
119
|
+
### Session/Cookies
|
|
120
|
+
|
|
121
|
+
A estratégia Session/Cookies:
|
|
122
|
+
|
|
123
|
+
* mantém cadastro e login com senha;
|
|
124
|
+
* cria uma sessão persistida no banco;
|
|
125
|
+
* envia um cookie httpOnly;
|
|
126
|
+
* regenera a sessão após o login;
|
|
127
|
+
* usa SessionAuthGuard;
|
|
128
|
+
* protege operações mutáveis com CSRF;
|
|
129
|
+
* destrói a sessão no logout;
|
|
130
|
+
* inicia sessão depois dos callbacks OAuth;
|
|
131
|
+
* remove arquivos, dependências e variáveis exclusivos de JWT.
|
|
132
|
+
|
|
133
|
+
Cada template usa uma integração apropriada:
|
|
134
|
+
|
|
135
|
+
* Prisma usa @quixo3/prisma-session-store;
|
|
136
|
+
* TypeORM usa connect-typeorm;
|
|
137
|
+
* Drizzle usa o DrizzleSessionStore implementado no próprio template.
|
|
138
|
+
|
|
139
|
+
### OAuth-only
|
|
140
|
+
|
|
141
|
+
A estratégia OAuth-only remove os fluxos baseados em senha:
|
|
142
|
+
|
|
143
|
+
* register;
|
|
144
|
+
* login;
|
|
145
|
+
* forgot-password;
|
|
146
|
+
* reset-password;
|
|
147
|
+
* verify-email.
|
|
148
|
+
|
|
149
|
+
Continuam disponíveis:
|
|
150
|
+
|
|
151
|
+
* OAuth Google;
|
|
152
|
+
* OAuth GitHub;
|
|
153
|
+
* access token;
|
|
154
|
+
* refresh token;
|
|
155
|
+
* logout;
|
|
156
|
+
* proteção das rotas autenticadas.
|
|
157
|
+
|
|
158
|
+
### Nenhuma autenticação
|
|
159
|
+
|
|
160
|
+
Quando a opção “Nenhuma” é selecionada, a CLI remove completamente:
|
|
161
|
+
|
|
162
|
+
* src/auth;
|
|
163
|
+
* src/users;
|
|
164
|
+
* DTOs relacionados;
|
|
165
|
+
* guards de autenticação;
|
|
166
|
+
* testes de autenticação;
|
|
167
|
+
* testes de usuários.
|
|
168
|
+
|
|
169
|
+
O projeto mantém somente o core selecionado, como health checks, métricas e recursos de infraestrutura.
|
|
170
|
+
|
|
171
|
+
## Recursos opcionais
|
|
172
|
+
|
|
173
|
+
### Docker
|
|
174
|
+
|
|
175
|
+
Quando Docker é desabilitado, a CLI remove:
|
|
176
|
+
|
|
177
|
+
* Dockerfile;
|
|
178
|
+
* docker-compose.yml.
|
|
179
|
+
|
|
180
|
+
### Swagger/OpenAPI
|
|
181
|
+
|
|
182
|
+
Quando Swagger é desabilitado, a CLI remove:
|
|
183
|
+
|
|
184
|
+
* bootstrap do Swagger no main.ts;
|
|
185
|
+
* rota /docs;
|
|
186
|
+
* decorators como @ApiTags;
|
|
187
|
+
* @ApiOperation;
|
|
188
|
+
* @ApiResponse;
|
|
189
|
+
* demais decorators de documentação.
|
|
190
|
+
|
|
191
|
+
A pergunta sobre Swagger/OpenAPI também controla a documentação da API. Não existe uma segunda opção separada.
|
|
192
|
+
|
|
193
|
+
### Validação global
|
|
194
|
+
|
|
195
|
+
Quando a validação global é desabilitada:
|
|
196
|
+
|
|
197
|
+
* ZodValidationPipe não é registrado no main.ts;
|
|
198
|
+
* o pipe também não é registrado no setup E2E.
|
|
199
|
+
|
|
200
|
+
Os DTOs continuam existindo como classes, mas deixam de ser validados automaticamente pelo pipe global.
|
|
201
|
+
|
|
202
|
+
### Redis, filas e e-mail
|
|
203
|
+
|
|
204
|
+
Quando habilitado, o projeto inclui:
|
|
205
|
+
|
|
206
|
+
* Redis;
|
|
207
|
+
* BullMQ;
|
|
208
|
+
* filas de e-mail;
|
|
209
|
+
* Nodemailer;
|
|
210
|
+
* Mailpit;
|
|
211
|
+
* recuperação de senha;
|
|
212
|
+
* verificação de e-mail;
|
|
213
|
+
* health check do Redis.
|
|
214
|
+
|
|
215
|
+
Quando desabilitado, os módulos, rotas e dependências relacionados são removidos.
|
|
216
|
+
|
|
217
|
+
### RBAC e Permissions
|
|
218
|
+
|
|
219
|
+
Quando habilitado, o projeto inclui:
|
|
220
|
+
|
|
221
|
+
* roles ADMIN, MANAGER e USER;
|
|
222
|
+
* permissions granulares;
|
|
223
|
+
* RolesGuard;
|
|
224
|
+
* PermissionsGuard;
|
|
225
|
+
* decorators de autorização.
|
|
226
|
+
|
|
227
|
+
Quando desabilitado, guards, decorators e constantes de RBAC são removidos. As rotas continuam exigindo autenticação quando uma estratégia de autenticação estiver ativa, mas deixam de exigir permissions específicas.
|
|
228
|
+
|
|
229
|
+
### Arquivo .env
|
|
230
|
+
|
|
231
|
+
Quando solicitado, a CLI cria automaticamente o .env a partir do .env.example já
|
|
232
|
+
processado.
|
|
233
|
+
|
|
234
|
+
## Estado das opções
|
|
235
|
+
|
|
236
|
+
| Escolha | Status |
|
|
237
|
+
| --------------------- | ------------------ |
|
|
238
|
+
| Linguagem: TypeScript | ✅ Implementada |
|
|
239
|
+
| Linguagem: JavaScript | ✅ Implementada |
|
|
240
|
+
| ORM: Prisma | ✅ Implementado |
|
|
241
|
+
| ORM: TypeORM | ✅ Implementado |
|
|
242
|
+
| ORM: Drizzle | ✅ Implementado |
|
|
243
|
+
| ORM: Nenhum | ❌ Não implementado |
|
|
244
|
+
| Banco: PostgreSQL | ✅ Implementado |
|
|
245
|
+
| Banco: MySQL | ✅ Implementado |
|
|
246
|
+
| Banco: SQLite | ✅ Implementado |
|
|
247
|
+
| Banco: MongoDB | ❌ Não implementado |
|
|
248
|
+
| Auth: JWT | ✅ Implementada |
|
|
249
|
+
| Auth: Session/Cookies | ✅ Implementada |
|
|
250
|
+
| Auth: OAuth-only | ✅ Implementada |
|
|
251
|
+
| Auth: Nenhuma | ✅ Implementada |
|
|
252
|
+
|
|
253
|
+
A CLI recusa opções ainda não implementadas antes de criar a pasta do projeto.
|
|
254
|
+
|
|
255
|
+
## Testes automatizados
|
|
256
|
+
|
|
257
|
+
Os testes do gerador ficam em:
|
|
258
|
+
|
|
259
|
+
`packages/cli/test/generator.test.ts`
|
|
260
|
+
|
|
261
|
+
Execute dentro de packages/cli:
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
npm test
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
A cobertura inclui:
|
|
268
|
+
|
|
269
|
+
* Prisma com PostgreSQL;
|
|
270
|
+
* Prisma com MySQL;
|
|
271
|
+
* Prisma com SQLite;
|
|
272
|
+
* TypeORM com SQLite;
|
|
273
|
+
* Drizzle com PostgreSQL;
|
|
274
|
+
* Drizzle com MySQL;
|
|
275
|
+
* Drizzle com SQLite;
|
|
276
|
+
* JWT;
|
|
277
|
+
* Session/Cookies;
|
|
278
|
+
* OAuth-only;
|
|
279
|
+
* nenhuma autenticação;
|
|
280
|
+
* TypeScript;
|
|
281
|
+
* JavaScript;
|
|
282
|
+
* remoção de Redis;
|
|
283
|
+
* remoção de recursos opcionais;
|
|
284
|
+
* drivers corretos por banco;
|
|
285
|
+
* scripts de migrations;
|
|
286
|
+
* schemas gerados;
|
|
287
|
+
* recusa de opções não implementadas.
|
|
288
|
+
|
|
289
|
+
## Smoke tests realizados
|
|
290
|
+
|
|
291
|
+
Foram validadas com instalação, build, testes unitários, migrations, seed e testes E2E:
|
|
292
|
+
|
|
293
|
+
* TypeScript + TypeORM + SQLite + JWT;
|
|
294
|
+
* TypeScript + TypeORM + SQLite + Session/Cookies;
|
|
295
|
+
* TypeScript + Drizzle + SQLite + JWT;
|
|
296
|
+
* TypeScript + Drizzle + SQLite + Session/Cookies.
|
|
297
|
+
|
|
298
|
+
PostgreSQL e MySQL possuem testes automatizados de geração, configuração e remoção dos drivers não utilizados. Smoke tests completos desses bancos ainda exigem serviços locais ou Docker.
|
|
299
|
+
|
|
300
|
+
## Limitações conhecidas
|
|
301
|
+
|
|
302
|
+
### Redis nos templates anteriores
|
|
303
|
+
|
|
304
|
+
Nos templates Prisma e TypeORM, o docker-compose.yml e os arquivos de ambiente ainda podem manter serviços ou variáveis de Redis e Mailpit quando o recurso é desabilitado.
|
|
305
|
+
|
|
306
|
+
Esse conteúdo extra não impede o projeto de compilar ou executar, mas ainda pode ser limpo para deixar a geração completamente enxuta.
|
|
307
|
+
|
|
308
|
+
### Nenhuma autenticação com Prisma
|
|
309
|
+
|
|
310
|
+
No template Prisma, o schema.prisma ainda mantém models como User, RefreshToken e OAuthAccount quando nenhuma autenticação é selecionada.
|
|
311
|
+
|
|
312
|
+
O prisma/seed.ts também pode continuar relacionado aos usuários de demonstração.
|
|
313
|
+
|
|
314
|
+
O código da aplicação é removido corretamente, mas o schema ainda pode criar tabelas que não serão utilizadas.
|
|
315
|
+
|
|
316
|
+
### Criação administrativa no OAuth-only
|
|
317
|
+
|
|
318
|
+
Na estratégia OAuth-only, o endpoint administrativo POST /users continua permitindo a criação manual de um usuário.
|
|
319
|
+
|
|
320
|
+
A CLI ainda não diferencia a estratégia usada para login da forma como um administrador cadastra usuários pelo painel.
|
|
321
|
+
|
|
322
|
+
## Desenvolvimento local
|
|
323
|
+
|
|
324
|
+
Na raiz do monorepo:
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
npm install
|
|
328
|
+
cd packages/cli
|
|
329
|
+
npm run dev
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
O comando npm run dev executa a CLI diretamente pelo TypeScript usando tsx.
|
|
333
|
+
|
|
334
|
+
Para rodar os testes:
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
npm test
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
Para testar como uma CLI instalada:
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
npm run build
|
|
344
|
+
npm link
|
|
345
|
+
nestforge
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
## Publicação
|
|
349
|
+
|
|
350
|
+
Dentro de packages/cli:
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
npm run build
|
|
354
|
+
npm pack --dry-run
|
|
355
|
+
npm publish
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
O build:
|
|
359
|
+
|
|
360
|
+
1. compila a CLI;
|
|
361
|
+
2. copia os templates Prisma, TypeORM e Drizzle;
|
|
362
|
+
3. prepara o pacote publicado no npm.
|
|
363
|
+
|
|
364
|
+
## Próximos itens
|
|
365
|
+
|
|
366
|
+
* opção sem ORM;
|
|
367
|
+
* MongoDB;
|
|
368
|
+
* validação mais completa do nome do projeto e do pacote;
|
|
369
|
+
* ampliação da matriz de smoke tests com PostgreSQL e MySQL reais;
|
|
370
|
+
* redução das limitações conhecidas dos templates anteriores.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Remove src/auth/ e src/users/ inteiros quando a estratégia de autenticação é "none".
|
|
5
|
+
* Pra "jwt" e "oauth" os dois módulos continuam (o OAuth também mora dentro de src/auth/).
|
|
6
|
+
*
|
|
7
|
+
* Por que remoção de diretório em vez de marcador por arquivo: esses dois módulos têm
|
|
8
|
+
* ~23 arquivos ao todo, e alguns já carregam um marcador de outra feature (ex:
|
|
9
|
+
* forgot-password.dto.ts depende de "redis,auth:password"). Continuar tudo via
|
|
10
|
+
* marcador por arquivo individual multiplicaria o número de combinações — remover a
|
|
11
|
+
* pasta toda de uma vez pro caso "sem autenticação nenhuma" é mais simples de auditar.
|
|
12
|
+
*/
|
|
13
|
+
export async function applyAuthStrategyRemoval(targetDir, enabledFeatures) {
|
|
14
|
+
if (!enabledFeatures.has('auth:none'))
|
|
15
|
+
return;
|
|
16
|
+
await fs.remove(path.join(targetDir, 'src', 'auth'));
|
|
17
|
+
await fs.remove(path.join(targetDir, 'src', 'users'));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=auth-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-strategy.js","sourceRoot":"","sources":["../../src/features/auth-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC1C,SAAiB,EACjB,eAA4B;IAE5B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,OAAO;IAE9C,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
const DATABASE_CONFIG = {
|
|
4
|
+
postgres: {
|
|
5
|
+
provider: 'postgresql',
|
|
6
|
+
devUrl: 'postgresql://nestforge:nestforge@localhost:5432/nestforge?schema=public',
|
|
7
|
+
testUrl: 'postgresql://nestforge:nestforge@localhost:5432/nestforge_test?schema=public',
|
|
8
|
+
},
|
|
9
|
+
mysql: {
|
|
10
|
+
provider: 'mysql',
|
|
11
|
+
devUrl: 'mysql://nestforge:nestforge@localhost:3306/nestforge',
|
|
12
|
+
testUrl: 'mysql://nestforge:nestforge@localhost:3306/nestforge_test',
|
|
13
|
+
},
|
|
14
|
+
sqlite: {
|
|
15
|
+
provider: 'sqlite',
|
|
16
|
+
devUrl: 'file:./dev.db',
|
|
17
|
+
testUrl: 'file:./test.db',
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
export async function applyDatabaseConfig(targetDir, database) {
|
|
21
|
+
const databaseChoice = database;
|
|
22
|
+
const config = DATABASE_CONFIG[databaseChoice];
|
|
23
|
+
if (!config) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
await updateSchemaProvider(targetDir, config.provider);
|
|
27
|
+
await updateDatabaseType(targetDir, '.env.example', databaseChoice);
|
|
28
|
+
await updateDatabaseType(targetDir, '.env.test', databaseChoice);
|
|
29
|
+
await updateDatabaseUrl(targetDir, '.env.example', config.devUrl);
|
|
30
|
+
await updateDatabaseUrl(targetDir, '.env.test', config.testUrl);
|
|
31
|
+
}
|
|
32
|
+
async function updateSchemaProvider(targetDir, provider) {
|
|
33
|
+
const schemaPath = path.join(targetDir, 'prisma', 'schema.prisma');
|
|
34
|
+
if (!(await fs.pathExists(schemaPath))) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const content = await fs.readFile(schemaPath, 'utf-8');
|
|
38
|
+
const updated = content.replace(/(datasource\s+db\s*\{[^}]*provider\s*=\s*)"[^"]+"/, `$1"${provider}"`);
|
|
39
|
+
await fs.writeFile(schemaPath, updated, 'utf-8');
|
|
40
|
+
}
|
|
41
|
+
async function updateDatabaseType(targetDir, fileName, database) {
|
|
42
|
+
const filePath = path.join(targetDir, fileName);
|
|
43
|
+
if (!(await fs.pathExists(filePath))) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
47
|
+
const updated = content.replace(/^DB_TYPE=.*$/m, `DB_TYPE=${database}`);
|
|
48
|
+
await fs.writeFile(filePath, updated, 'utf-8');
|
|
49
|
+
}
|
|
50
|
+
async function updateDatabaseUrl(targetDir, fileName, url) {
|
|
51
|
+
const filePath = path.join(targetDir, fileName);
|
|
52
|
+
if (!(await fs.pathExists(filePath))) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
56
|
+
const updated = content.replace(/^DATABASE_URL=.*$/m, `DATABASE_URL="${url}"`);
|
|
57
|
+
await fs.writeFile(filePath, updated, 'utf-8');
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/features/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Pacotes (dependencies ou devDependencies) que só fazem sentido se a feature
|
|
5
|
+
* correspondente estiver habilitada. Mantido separado dos marcadores de código
|
|
6
|
+
* porque package.json é JSON puro — não aceita comentário.
|
|
7
|
+
*/
|
|
8
|
+
const FEATURE_DEPENDENCIES = {
|
|
9
|
+
swagger: ['@nestjs/swagger'],
|
|
10
|
+
redis: [
|
|
11
|
+
'@nestjs/bullmq',
|
|
12
|
+
'bullmq',
|
|
13
|
+
'ioredis',
|
|
14
|
+
'nodemailer',
|
|
15
|
+
'@types/nodemailer',
|
|
16
|
+
],
|
|
17
|
+
'auth:session': [
|
|
18
|
+
'@quixo3/prisma-session-store',
|
|
19
|
+
'connect-typeorm',
|
|
20
|
+
'express-session',
|
|
21
|
+
'@types/express-session',
|
|
22
|
+
],
|
|
23
|
+
'auth:token': [
|
|
24
|
+
'@nestjs/jwt',
|
|
25
|
+
'passport-jwt',
|
|
26
|
+
'@types/passport-jwt',
|
|
27
|
+
],
|
|
28
|
+
'database:postgres': [
|
|
29
|
+
'pg',
|
|
30
|
+
'@types/pg',
|
|
31
|
+
],
|
|
32
|
+
'database:mysql': [
|
|
33
|
+
'mysql2',
|
|
34
|
+
],
|
|
35
|
+
'database:sqlite': [
|
|
36
|
+
'better-sqlite3',
|
|
37
|
+
'@types/better-sqlite3',
|
|
38
|
+
],
|
|
39
|
+
rbac: [],
|
|
40
|
+
};
|
|
41
|
+
export async function removeDisabledDependencies(targetDir, enabledFeatures) {
|
|
42
|
+
const pkgPath = path.join(targetDir, 'package.json');
|
|
43
|
+
if (!(await fs.pathExists(pkgPath))) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const pkg = await fs.readJson(pkgPath);
|
|
47
|
+
for (const [feature, packages] of Object.entries(FEATURE_DEPENDENCIES)) {
|
|
48
|
+
if (enabledFeatures.has(feature))
|
|
49
|
+
continue;
|
|
50
|
+
for (const pkgName of packages) {
|
|
51
|
+
delete pkg.dependencies?.[pkgName];
|
|
52
|
+
delete pkg.devDependencies?.[pkgName];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
await fs.writeJson(pkgPath, pkg, { spaces: 2 });
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=dependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/features/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;GAIG;AACH,MAAM,oBAAoB,GAGtB;IACA,OAAO,EAAE,CAAC,iBAAiB,CAAC;IAE5B,KAAK,EAAE;QACH,gBAAgB;QAChB,QAAQ;QACR,SAAS;QACT,YAAY;QACZ,mBAAmB;KACtB;IAED,cAAc,EAAE;QACZ,8BAA8B;QAC9B,iBAAiB;QACjB,iBAAiB;QACjB,wBAAwB;KAC3B;IAED,YAAY,EAAE;QACV,aAAa;QACb,cAAc;QACd,qBAAqB;KACxB;IAED,mBAAmB,EAAE;QACjB,IAAI;QACJ,WAAW;KACd;IAED,gBAAgB,EAAE;QACd,QAAQ;KACX;IAED,iBAAiB,EAAE;QACf,gBAAgB;QAChB,uBAAuB;KAC1B;IAED,IAAI,EAAE,EAAE;CACX,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC5C,SAAiB,EACjB,eAA4B;IAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACrD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO;IACX,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACrE,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QAE3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,GAAG,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import ts from 'typescript';
|
|
4
|
+
const IGNORED_DIRS = new Set(['node_modules', '.git', 'dist', 'coverage']);
|
|
5
|
+
const TYPESCRIPT_DEV_DEPENDENCIES = [
|
|
6
|
+
'@nestjs/cli',
|
|
7
|
+
'@nestjs/schematics',
|
|
8
|
+
'@types/bcryptjs',
|
|
9
|
+
'@types/express-session',
|
|
10
|
+
'@types/multer',
|
|
11
|
+
'@types/node',
|
|
12
|
+
'@types/nodemailer',
|
|
13
|
+
'@types/passport-github2',
|
|
14
|
+
'@types/passport-google-oauth20',
|
|
15
|
+
'@types/passport-jwt',
|
|
16
|
+
'@types/supertest',
|
|
17
|
+
'@typescript-eslint/eslint-plugin',
|
|
18
|
+
'@typescript-eslint/parser',
|
|
19
|
+
'ts-node',
|
|
20
|
+
'typescript',
|
|
21
|
+
'@types/better-sqlite3',
|
|
22
|
+
'@types/pg',
|
|
23
|
+
];
|
|
24
|
+
export async function applyLanguageTransform(targetDir, language, orm) {
|
|
25
|
+
if (language !== 'javascript') {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const typescriptFiles = await collectTypeScriptFiles(targetDir);
|
|
29
|
+
for (const filePath of typescriptFiles) {
|
|
30
|
+
await transpileFile(filePath);
|
|
31
|
+
}
|
|
32
|
+
await removeTypeDeclarationFiles(targetDir);
|
|
33
|
+
await fs.remove(path.join(targetDir, 'tsconfig.json'));
|
|
34
|
+
await fs.remove(path.join(targetDir, 'tsconfig.build.json'));
|
|
35
|
+
await fs.remove(path.join(targetDir, 'nest-cli.json'));
|
|
36
|
+
await updatePackageJson(targetDir, orm);
|
|
37
|
+
if (orm === 'drizzle') {
|
|
38
|
+
await updateDrizzleWorkflow(targetDir);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function collectTypeScriptFiles(dir) {
|
|
42
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
43
|
+
const files = [];
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
if (IGNORED_DIRS.has(entry.name)) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const fullPath = path.join(dir, entry.name);
|
|
49
|
+
if (entry.isDirectory()) {
|
|
50
|
+
files.push(...(await collectTypeScriptFiles(fullPath)));
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (entry.isFile() && entry.name.endsWith('.ts') && !entry.name.endsWith('.d.ts')) {
|
|
54
|
+
files.push(fullPath);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return files;
|
|
58
|
+
}
|
|
59
|
+
async function removeTypeDeclarationFiles(dir) {
|
|
60
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
if (IGNORED_DIRS.has(entry.name)) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const fullPath = path.join(dir, entry.name);
|
|
66
|
+
if (entry.isDirectory()) {
|
|
67
|
+
await removeTypeDeclarationFiles(fullPath);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (entry.isFile() && entry.name.endsWith('.d.ts')) {
|
|
71
|
+
await fs.remove(fullPath);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function transpileFile(filePath) {
|
|
76
|
+
const source = await fs.readFile(filePath, 'utf8');
|
|
77
|
+
const result = ts.transpileModule(source, {
|
|
78
|
+
compilerOptions: {
|
|
79
|
+
target: ts.ScriptTarget.ES2022,
|
|
80
|
+
module: ts.ModuleKind.CommonJS,
|
|
81
|
+
experimentalDecorators: true,
|
|
82
|
+
emitDecoratorMetadata: true,
|
|
83
|
+
esModuleInterop: true,
|
|
84
|
+
sourceMap: false,
|
|
85
|
+
},
|
|
86
|
+
fileName: filePath,
|
|
87
|
+
reportDiagnostics: true,
|
|
88
|
+
});
|
|
89
|
+
const errors = (result.diagnostics ?? []).filter((diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error);
|
|
90
|
+
if (errors.length > 0) {
|
|
91
|
+
const details = errors
|
|
92
|
+
.map((diagnostic) => ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'))
|
|
93
|
+
.join('\n');
|
|
94
|
+
throw new Error(`Falha ao converter "${filePath}" para JavaScript:\n${details}`);
|
|
95
|
+
}
|
|
96
|
+
const javascriptPath = filePath.replace(/\.ts$/, '.js');
|
|
97
|
+
await fs.writeFile(javascriptPath, result.outputText, 'utf8');
|
|
98
|
+
await fs.remove(filePath);
|
|
99
|
+
}
|
|
100
|
+
async function updatePackageJson(targetDir, orm) {
|
|
101
|
+
const packageJsonPath = path.join(targetDir, 'package.json');
|
|
102
|
+
const packageJson = await fs.readJson(packageJsonPath);
|
|
103
|
+
packageJson.scripts = {
|
|
104
|
+
...packageJson.scripts,
|
|
105
|
+
build: 'node --check src/main.js',
|
|
106
|
+
start: 'node src/main.js',
|
|
107
|
+
'start:dev': 'node --watch src/main.js',
|
|
108
|
+
'start:debug': 'node --inspect --watch src/main.js',
|
|
109
|
+
'start:prod': 'node src/main.js',
|
|
110
|
+
lint: 'eslint "{src,test}/**/*.js" --fix',
|
|
111
|
+
format: 'prettier --write "src/**/*.js" "test/**/*.js"',
|
|
112
|
+
'test:e2e': 'dotenv -e .env.test -- vitest run --config ./vitest.e2e.config.js',
|
|
113
|
+
};
|
|
114
|
+
if (orm === 'prisma') {
|
|
115
|
+
packageJson.scripts['prisma:seed'] =
|
|
116
|
+
'node prisma/seed.js';
|
|
117
|
+
packageJson.prisma = {
|
|
118
|
+
...packageJson.prisma,
|
|
119
|
+
seed: 'node prisma/seed.js',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (orm === 'typeorm') {
|
|
123
|
+
packageJson.scripts.typeorm =
|
|
124
|
+
'dotenv -e .env -- typeorm -d src/database/data-source.js';
|
|
125
|
+
packageJson.scripts['migration:generate'] =
|
|
126
|
+
'npm run typeorm -- migration:generate';
|
|
127
|
+
packageJson.scripts['migration:create'] = 'typeorm migration:create';
|
|
128
|
+
packageJson.scripts['migration:run'] =
|
|
129
|
+
'npm run typeorm -- migration:run';
|
|
130
|
+
packageJson.scripts['migration:revert'] =
|
|
131
|
+
'npm run typeorm -- migration:revert';
|
|
132
|
+
packageJson.scripts['pretest:e2e'] =
|
|
133
|
+
'dotenv -e .env.test -- typeorm -d src/database/data-source.js migration:run';
|
|
134
|
+
packageJson.scripts.seed =
|
|
135
|
+
'dotenv -e .env -- node src/database/seed.js';
|
|
136
|
+
delete packageJson.prisma;
|
|
137
|
+
delete packageJson.scripts['prisma:seed'];
|
|
138
|
+
}
|
|
139
|
+
if (orm === 'drizzle') {
|
|
140
|
+
packageJson.scripts['drizzle:generate'] =
|
|
141
|
+
'dotenv -e .env -- drizzle-kit generate --config=drizzle.config.js';
|
|
142
|
+
packageJson.scripts['drizzle:migrate'] =
|
|
143
|
+
'dotenv -e .env -- drizzle-kit migrate --config=drizzle.config.js';
|
|
144
|
+
packageJson.scripts['drizzle:push'] =
|
|
145
|
+
'dotenv -e .env -- drizzle-kit push --config=drizzle.config.js';
|
|
146
|
+
packageJson.scripts['drizzle:studio'] =
|
|
147
|
+
'dotenv -e .env -- drizzle-kit studio --config=drizzle.config.js';
|
|
148
|
+
packageJson.scripts['pretest:e2e'] =
|
|
149
|
+
'dotenv -e .env.test -- drizzle-kit migrate --config=drizzle.config.js';
|
|
150
|
+
packageJson.scripts.seed =
|
|
151
|
+
'dotenv -e .env -- node src/database/seed.js';
|
|
152
|
+
delete packageJson.prisma;
|
|
153
|
+
delete packageJson.scripts['prisma:seed'];
|
|
154
|
+
}
|
|
155
|
+
for (const dependency of TYPESCRIPT_DEV_DEPENDENCIES) {
|
|
156
|
+
delete packageJson.dependencies?.[dependency];
|
|
157
|
+
delete packageJson.devDependencies?.[dependency];
|
|
158
|
+
}
|
|
159
|
+
await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
|
|
160
|
+
}
|
|
161
|
+
async function updateDrizzleWorkflow(targetDir) {
|
|
162
|
+
const workflowPath = path.join(targetDir, '.github', 'workflows', 'ci.yml');
|
|
163
|
+
if (!(await fs.pathExists(workflowPath))) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const workflow = await fs.readFile(workflowPath, 'utf8');
|
|
167
|
+
const updated = workflow
|
|
168
|
+
.replace('npx drizzle-kit generate', 'npx drizzle-kit generate --config=drizzle.config.js')
|
|
169
|
+
.replace('npx drizzle-kit migrate', 'npx drizzle-kit migrate --config=drizzle.config.js');
|
|
170
|
+
await fs.writeFile(workflowPath, updated, 'utf8');
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=language.js.map
|