nestforge-generator 0.2.0 → 0.4.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/README.md +24 -7
- package/README.pt-BR.md +24 -7
- package/dist/features/auth-strategy.js +7 -7
- package/dist/features/database.js +35 -0
- package/dist/features/database.js.map +1 -1
- package/dist/features/dependencies.js +3 -3
- package/dist/features/language.js +1 -1
- package/dist/features/language.js.map +1 -1
- package/dist/features/markers.js +11 -11
- package/dist/features/markers.js.map +1 -1
- package/dist/generator.js +14 -2
- package/dist/generator.js.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/project-name.js +50 -0
- package/dist/project-name.js.map +1 -0
- package/dist/prompts.js +15 -11
- package/dist/prompts.js.map +1 -1
- package/package.json +2 -1
- package/templates/drizzle/README.md +2 -0
- package/templates/drizzle/README.pt-BR.md +2 -0
- package/templates/drizzle/drizzle.config.ts +2 -2
- package/templates/drizzle/src/auth/auth.controller.ts +35 -35
- package/templates/drizzle/src/auth/auth.service.spec.ts +4 -4
- package/templates/drizzle/src/auth/auth.service.ts +9 -9
- package/templates/drizzle/src/auth/dto/forgot-password.dto.ts +2 -2
- package/templates/drizzle/src/auth/dto/login.dto.ts +3 -3
- package/templates/drizzle/src/auth/dto/register.dto.ts +4 -4
- package/templates/drizzle/src/auth/dto/reset-password.dto.ts +3 -3
- package/templates/drizzle/src/auth/guards/github-auth.guard.ts +2 -2
- package/templates/drizzle/src/auth/guards/google-auth.guard.ts +2 -2
- package/templates/drizzle/src/auth/guards/session-auth.guard.spec.ts +4 -4
- package/templates/drizzle/src/auth/guards/session-auth.guard.ts +2 -2
- package/templates/drizzle/src/auth/session.service.spec.ts +5 -5
- package/templates/drizzle/src/auth/session.service.ts +5 -5
- package/templates/drizzle/src/auth/strategies/github.strategy.ts +3 -3
- package/templates/drizzle/src/auth/token.service.ts +3 -3
- package/templates/drizzle/src/common/filters/http-exception.filter.ts +1 -1
- package/templates/drizzle/src/common/guards/permissions.guard.spec.ts +7 -7
- package/templates/drizzle/src/common/guards/roles.guard.spec.ts +4 -4
- package/templates/drizzle/src/common/middleware/csrf.middleware.spec.ts +5 -5
- package/templates/drizzle/src/common/middleware/csrf.middleware.ts +2 -2
- package/templates/drizzle/src/common/utils/avatar-storage.util.ts +2 -2
- package/templates/drizzle/src/config/env.validation.ts +1 -1
- package/templates/drizzle/src/database/seed.ts +4 -4
- package/templates/drizzle/src/health/health.controller.ts +2 -2
- package/templates/drizzle/src/health/indicators/drizzle-health.indicator.spec.ts +5 -5
- package/templates/drizzle/src/health/indicators/drizzle-health.indicator.ts +2 -2
- package/templates/drizzle/src/health/indicators/redis-health.indicator.spec.ts +5 -5
- package/templates/drizzle/src/health/indicators/redis-health.indicator.ts +3 -3
- package/templates/drizzle/src/mail/mail.processor.ts +4 -4
- package/templates/drizzle/src/mail/templates/email-templates.ts +7 -7
- package/templates/drizzle/src/metrics/metrics.service.ts +3 -3
- package/templates/drizzle/src/users/dto/create-user.dto.ts +5 -5
- package/templates/drizzle/src/users/dto/find-users-query.dto.ts +3 -3
- package/templates/drizzle/src/users/users.controller.ts +21 -21
- package/templates/drizzle/src/users/users.service.spec.ts +12 -12
- package/templates/drizzle/src/users/users.service.ts +4 -4
- package/templates/drizzle/test/auth.e2e-spec.ts +8 -8
- package/templates/drizzle/test/session-auth.e2e-spec.ts +9 -9
- package/templates/drizzle/test/users.e2e-spec.ts +18 -18
- package/templates/prisma/.github/workflows/ci.yml +24 -1
- package/templates/prisma/ARCHITECTURE.md +7 -1
- package/templates/prisma/ARCHITECTURE.pt-BR.md +7 -1
- package/templates/prisma/README.md +11 -7
- package/templates/prisma/README.pt-BR.md +11 -7
- package/templates/prisma/ROADMAP.md +5 -1
- package/templates/prisma/ROADMAP.pt-BR.md +5 -1
- package/templates/prisma/TESTING.md +25 -3
- package/templates/prisma/TESTING.pt-BR.md +25 -3
- package/templates/prisma/docker-compose.yml +29 -1
- package/templates/prisma/docs/adding-a-module.md +246 -230
- package/templates/prisma/docs/features-markers.md +11 -1
- package/templates/prisma/prisma/schema.prisma +4 -0
- package/templates/prisma/prisma/seed.ts +46 -46
- package/templates/prisma/src/auth/auth.controller.ts +35 -35
- package/templates/prisma/src/auth/auth.service.spec.ts +3 -3
- package/templates/prisma/src/auth/auth.service.ts +11 -11
- package/templates/prisma/src/auth/dto/forgot-password.dto.ts +2 -2
- package/templates/prisma/src/auth/dto/login.dto.ts +3 -3
- package/templates/prisma/src/auth/dto/register.dto.ts +4 -4
- package/templates/prisma/src/auth/dto/reset-password.dto.ts +3 -3
- package/templates/prisma/src/auth/guards/github-auth.guard.ts +10 -10
- package/templates/prisma/src/auth/guards/google-auth.guard.ts +10 -10
- package/templates/prisma/src/auth/guards/session-auth.guard.spec.ts +4 -4
- package/templates/prisma/src/auth/guards/session-auth.guard.ts +2 -2
- package/templates/prisma/src/auth/session.service.spec.ts +5 -5
- package/templates/prisma/src/auth/session.service.ts +5 -5
- package/templates/prisma/src/auth/strategies/github.strategy.ts +3 -3
- package/templates/prisma/src/auth/token.service.ts +14 -5
- package/templates/prisma/src/common/filters/http-exception.filter.ts +34 -34
- package/templates/prisma/src/common/guards/permissions.guard.spec.ts +7 -7
- package/templates/prisma/src/common/guards/roles.guard.spec.ts +4 -4
- package/templates/prisma/src/common/middleware/csrf.middleware.spec.ts +5 -5
- package/templates/prisma/src/common/middleware/csrf.middleware.ts +2 -2
- package/templates/prisma/src/common/utils/avatar-storage.util.ts +32 -32
- package/templates/prisma/src/config/env.validation.ts +1 -1
- package/templates/prisma/src/health/health.controller.ts +2 -2
- package/templates/prisma/src/health/indicators/prisma-health.indicator.spec.ts +39 -22
- package/templates/prisma/src/health/indicators/prisma-health.indicator.ts +24 -19
- package/templates/prisma/src/health/indicators/redis-health.indicator.spec.ts +5 -5
- package/templates/prisma/src/health/indicators/redis-health.indicator.ts +3 -3
- package/templates/prisma/src/mail/mail.processor.ts +4 -4
- package/templates/prisma/src/mail/templates/email-templates.ts +7 -7
- package/templates/prisma/src/metrics/metrics.service.ts +34 -34
- package/templates/prisma/src/users/dto/create-user.dto.ts +12 -12
- package/templates/prisma/src/users/dto/find-users-query.dto.ts +12 -12
- package/templates/prisma/src/users/users.controller.ts +21 -21
- package/templates/prisma/src/users/users.service.spec.ts +11 -11
- package/templates/prisma/src/users/users.service.ts +4 -4
- package/templates/prisma/test/auth.e2e-spec.ts +8 -8
- package/templates/prisma/test/session-auth.e2e-spec.ts +9 -9
- package/templates/prisma/test/users.e2e-spec.ts +14 -14
- package/templates/typeorm/README.md +2 -0
- package/templates/typeorm/README.pt-BR.md +2 -0
- package/templates/typeorm/src/auth/auth.controller.ts +35 -35
- package/templates/typeorm/src/auth/auth.service.spec.ts +4 -4
- package/templates/typeorm/src/auth/auth.service.ts +9 -9
- package/templates/typeorm/src/auth/dto/forgot-password.dto.ts +2 -2
- package/templates/typeorm/src/auth/dto/login.dto.ts +3 -3
- package/templates/typeorm/src/auth/dto/register.dto.ts +4 -4
- package/templates/typeorm/src/auth/dto/reset-password.dto.ts +3 -3
- package/templates/typeorm/src/auth/guards/github-auth.guard.ts +2 -2
- package/templates/typeorm/src/auth/guards/google-auth.guard.ts +2 -2
- package/templates/typeorm/src/auth/guards/session-auth.guard.spec.ts +4 -4
- package/templates/typeorm/src/auth/guards/session-auth.guard.ts +2 -2
- package/templates/typeorm/src/auth/session.service.spec.ts +5 -5
- package/templates/typeorm/src/auth/session.service.ts +5 -5
- package/templates/typeorm/src/auth/strategies/github.strategy.ts +3 -3
- package/templates/typeorm/src/auth/token.service.ts +3 -3
- package/templates/typeorm/src/common/filters/http-exception.filter.ts +1 -1
- package/templates/typeorm/src/common/guards/permissions.guard.spec.ts +7 -7
- package/templates/typeorm/src/common/guards/roles.guard.spec.ts +4 -4
- package/templates/typeorm/src/common/middleware/csrf.middleware.spec.ts +5 -5
- package/templates/typeorm/src/common/middleware/csrf.middleware.ts +2 -2
- package/templates/typeorm/src/common/utils/avatar-storage.util.ts +2 -2
- package/templates/typeorm/src/config/env.validation.ts +1 -1
- package/templates/typeorm/src/database/data-source.ts +2 -2
- package/templates/typeorm/src/database/seed.ts +3 -3
- package/templates/typeorm/src/database/typeorm-options.ts +2 -2
- package/templates/typeorm/src/health/health.controller.ts +2 -2
- package/templates/typeorm/src/health/indicators/redis-health.indicator.spec.ts +5 -5
- package/templates/typeorm/src/health/indicators/redis-health.indicator.ts +3 -3
- package/templates/typeorm/src/health/indicators/typeorm-health.indicator.spec.ts +4 -4
- package/templates/typeorm/src/health/indicators/typeorm-health.indicator.ts +2 -2
- package/templates/typeorm/src/mail/mail.processor.ts +4 -4
- package/templates/typeorm/src/mail/templates/email-templates.ts +7 -7
- package/templates/typeorm/src/metrics/metrics.service.ts +3 -3
- package/templates/typeorm/src/users/dto/create-user.dto.ts +5 -5
- package/templates/typeorm/src/users/dto/find-users-query.dto.ts +3 -3
- package/templates/typeorm/src/users/users.controller.ts +21 -21
- package/templates/typeorm/src/users/users.service.spec.ts +12 -12
- package/templates/typeorm/src/users/users.service.ts +4 -4
- package/templates/typeorm/test/auth.e2e-spec.ts +8 -8
- package/templates/typeorm/test/session-auth.e2e-spec.ts +9 -9
- package/templates/typeorm/test/users.e2e-spec.ts +18 -18
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ For the testing guide, CLI prompts, and complete checklist, see [`TESTING.md`](T
|
|
|
23
23
|
- Interactive prompts using `@clack/prompts`;
|
|
24
24
|
- TypeScript or JavaScript generation;
|
|
25
25
|
- Prisma, TypeORM, Drizzle ORM, or no ORM;
|
|
26
|
-
- PostgreSQL, MySQL, and
|
|
26
|
+
- PostgreSQL, MySQL, SQLite, and MongoDB with Prisma;
|
|
27
27
|
- JWT, Session/Cookies, OAuth-only, or no authentication;
|
|
28
28
|
- optional Docker;
|
|
29
29
|
- optional Swagger/OpenAPI;
|
|
@@ -35,6 +35,19 @@ For the testing guide, CLI prompts, and complete checklist, see [`TESTING.md`](T
|
|
|
35
35
|
|
|
36
36
|
Generated projects include features such as avatar upload, pagination, filters, health checks, metrics, unit tests, and E2E tests.
|
|
37
37
|
|
|
38
|
+
## Project names
|
|
39
|
+
|
|
40
|
+
The CLI validates the name before creating the project directory. A valid name:
|
|
41
|
+
|
|
42
|
+
- uses only lowercase letters, numbers, dots, hyphens, or underscores;
|
|
43
|
+
- starts with a letter or number;
|
|
44
|
+
- has no leading or trailing whitespace;
|
|
45
|
+
- contains no path separators or npm scope;
|
|
46
|
+
- has no more than 214 characters;
|
|
47
|
+
- is not an npm or Windows reserved name.
|
|
48
|
+
|
|
49
|
+
The generator rejects invalid names and existing target directories without writing project files.
|
|
50
|
+
|
|
38
51
|
## Languages
|
|
39
52
|
|
|
40
53
|
The CLI generates projects in:
|
|
@@ -61,9 +74,10 @@ Available with:
|
|
|
61
74
|
|
|
62
75
|
- PostgreSQL;
|
|
63
76
|
- MySQL;
|
|
64
|
-
- SQLite
|
|
77
|
+
- SQLite;
|
|
78
|
+
- MongoDB.
|
|
65
79
|
|
|
66
|
-
The CLI adjusts the `schema.prisma` provider, database URL, and provider-specific resources.
|
|
80
|
+
The CLI adjusts the `schema.prisma` provider, database URL, and provider-specific resources. MongoDB projects use mapped `ObjectId` fields and `prisma db push` instead of Prisma Migrate.
|
|
67
81
|
|
|
68
82
|
### TypeORM
|
|
69
83
|
|
|
@@ -105,6 +119,8 @@ The Drizzle template includes:
|
|
|
105
119
|
|
|
106
120
|
After generation, only the schema and driver for the selected database remain in the project.
|
|
107
121
|
|
|
122
|
+
> **MongoDB compatibility:** MongoDB generation is currently available only with Prisma. TypeORM provides basic MongoDB support, but it is not directly compatible with the relational architecture of NestForge's TypeORM template. Drizzle does not currently provide an official MongoDB dialect. Therefore, the CLI does not offer MongoDB when TypeORM or Drizzle is selected.
|
|
123
|
+
|
|
108
124
|
### No ORM
|
|
109
125
|
|
|
110
126
|
The “None” option:
|
|
@@ -261,7 +277,7 @@ When requested, the CLI automatically creates `.env` from the already processed
|
|
|
261
277
|
| Database: PostgreSQL | ✅ Implemented |
|
|
262
278
|
| Database: MySQL | ✅ Implemented |
|
|
263
279
|
| Database: SQLite | ✅ Implemented |
|
|
264
|
-
| Database: MongoDB |
|
|
280
|
+
| Database: MongoDB | ✅ Implemented with Prisma |
|
|
265
281
|
| Auth: JWT | ✅ Implemented |
|
|
266
282
|
| Auth: Session/Cookies | ✅ Implemented |
|
|
267
283
|
| Auth: OAuth-only | ✅ Implemented |
|
|
@@ -288,6 +304,8 @@ Coverage includes:
|
|
|
288
304
|
- Prisma with PostgreSQL;
|
|
289
305
|
- Prisma with MySQL;
|
|
290
306
|
- Prisma with SQLite;
|
|
307
|
+
- Prisma with MongoDB and JWT;
|
|
308
|
+
- Prisma with MongoDB and Session/Cookies;
|
|
291
309
|
- TypeORM with SQLite;
|
|
292
310
|
- Drizzle with PostgreSQL;
|
|
293
311
|
- Drizzle with MySQL;
|
|
@@ -316,7 +334,7 @@ The following combinations were validated with installation, build, unit tests,
|
|
|
316
334
|
- TypeScript + Drizzle + SQLite + JWT;
|
|
317
335
|
- TypeScript + Drizzle + SQLite + Session/Cookies.
|
|
318
336
|
|
|
319
|
-
PostgreSQL and
|
|
337
|
+
PostgreSQL, MySQL, and MongoDB have automated generation and configuration tests. Complete smoke tests that connect to these databases still require local services or Docker; MongoDB must run as a replica set.
|
|
320
338
|
|
|
321
339
|
## Known limitations
|
|
322
340
|
|
|
@@ -384,7 +402,6 @@ The build:
|
|
|
384
402
|
|
|
385
403
|
## Next steps
|
|
386
404
|
|
|
387
|
-
- MongoDB;
|
|
388
|
-
- more complete project and package name validation;
|
|
405
|
+
- expand MongoDB support beyond Prisma when a compatible ORM integration is available;
|
|
389
406
|
- expand the smoke-test matrix with real PostgreSQL and MySQL services;
|
|
390
407
|
- reduce the known limitations in the earlier templates.
|
package/README.pt-BR.md
CHANGED
|
@@ -23,7 +23,7 @@ Para o guia de testes, perguntas da CLI e checklist completo, consulte [`TESTING
|
|
|
23
23
|
* Prompts interativos usando @clack/prompts;
|
|
24
24
|
* geração em TypeScript ou JavaScript;
|
|
25
25
|
* Prisma, TypeORM, Drizzle ORM ou nenhum ORM;
|
|
26
|
-
* PostgreSQL, MySQL e
|
|
26
|
+
* PostgreSQL, MySQL, SQLite e MongoDB com Prisma;
|
|
27
27
|
* autenticação JWT, Session/Cookies, OAuth-only ou nenhuma;
|
|
28
28
|
* Docker opcional;
|
|
29
29
|
* Swagger/OpenAPI opcional;
|
|
@@ -35,6 +35,19 @@ Para o guia de testes, perguntas da CLI e checklist completo, consulte [`TESTING
|
|
|
35
35
|
|
|
36
36
|
Os projetos incluem recursos como upload de avatar, paginação, filtros, health checks, métricas, testes unitários e testes E2E.
|
|
37
37
|
|
|
38
|
+
## Nomes de projeto
|
|
39
|
+
|
|
40
|
+
A CLI valida o nome antes de criar o diretório do projeto. Um nome válido:
|
|
41
|
+
|
|
42
|
+
* usa apenas letras minúsculas, números, pontos, hífens ou underscores;
|
|
43
|
+
* começa com uma letra ou número;
|
|
44
|
+
* não possui espaços no início ou no fim;
|
|
45
|
+
* não contém separadores de caminho nem escopo npm;
|
|
46
|
+
* possui no máximo 214 caracteres;
|
|
47
|
+
* não é um nome reservado do npm ou do Windows.
|
|
48
|
+
|
|
49
|
+
O gerador recusa nomes inválidos e diretórios de destino existentes sem gravar arquivos do projeto.
|
|
50
|
+
|
|
38
51
|
## Linguagens
|
|
39
52
|
|
|
40
53
|
A CLI gera projetos em:
|
|
@@ -61,9 +74,10 @@ Disponível com:
|
|
|
61
74
|
|
|
62
75
|
* PostgreSQL;
|
|
63
76
|
* MySQL;
|
|
64
|
-
* SQLite
|
|
77
|
+
* SQLite;
|
|
78
|
+
* MongoDB.
|
|
65
79
|
|
|
66
|
-
A CLI ajusta o provider do schema.prisma, a URL do banco e os recursos específicos do provider.
|
|
80
|
+
A CLI ajusta o provider do schema.prisma, a URL do banco e os recursos específicos do provider. Projetos MongoDB usam campos `ObjectId` mapeados e `prisma db push` no lugar do Prisma Migrate.
|
|
67
81
|
|
|
68
82
|
### TypeORM
|
|
69
83
|
|
|
@@ -105,6 +119,8 @@ O template Drizzle inclui:
|
|
|
105
119
|
|
|
106
120
|
Depois da geração, somente o schema e o driver do banco selecionado permanecem no projeto.
|
|
107
121
|
|
|
122
|
+
> **Compatibilidade com MongoDB:** a geração com MongoDB está disponível atualmente apenas com Prisma. O TypeORM oferece suporte básico a MongoDB, mas ele não é diretamente compatível com a arquitetura relacional do template TypeORM do NestForge. O Drizzle não oferece atualmente um dialeto oficial para MongoDB. Portanto, a CLI não disponibiliza MongoDB quando TypeORM ou Drizzle é selecionado.
|
|
123
|
+
|
|
108
124
|
### Sem ORM
|
|
109
125
|
|
|
110
126
|
A opção “Nenhum”:
|
|
@@ -262,7 +278,7 @@ processado.
|
|
|
262
278
|
| Banco: PostgreSQL | ✅ Implementado |
|
|
263
279
|
| Banco: MySQL | ✅ Implementado |
|
|
264
280
|
| Banco: SQLite | ✅ Implementado |
|
|
265
|
-
| Banco: MongoDB |
|
|
281
|
+
| Banco: MongoDB | ✅ Com Prisma |
|
|
266
282
|
| Auth: JWT | ✅ Implementada |
|
|
267
283
|
| Auth: Session/Cookies | ✅ Implementada |
|
|
268
284
|
| Auth: OAuth-only | ✅ Implementada |
|
|
@@ -287,6 +303,8 @@ A cobertura inclui:
|
|
|
287
303
|
* Prisma com PostgreSQL;
|
|
288
304
|
* Prisma com MySQL;
|
|
289
305
|
* Prisma com SQLite;
|
|
306
|
+
* Prisma com MongoDB e JWT;
|
|
307
|
+
* Prisma com MongoDB e Session/Cookies;
|
|
290
308
|
* TypeORM com SQLite;
|
|
291
309
|
* Drizzle com PostgreSQL;
|
|
292
310
|
* Drizzle com MySQL;
|
|
@@ -315,7 +333,7 @@ Foram validadas com instalação, build, testes unitários, migrations, seed e t
|
|
|
315
333
|
* TypeScript + Drizzle + SQLite + JWT;
|
|
316
334
|
* TypeScript + Drizzle + SQLite + Session/Cookies.
|
|
317
335
|
|
|
318
|
-
PostgreSQL e
|
|
336
|
+
PostgreSQL, MySQL e MongoDB possuem testes automatizados de geração e configuração. Smoke tests que conectam a esses bancos ainda exigem serviços locais ou Docker; o MongoDB deve funcionar como replica set.
|
|
319
337
|
|
|
320
338
|
## Limitações conhecidas
|
|
321
339
|
|
|
@@ -383,7 +401,6 @@ O build:
|
|
|
383
401
|
|
|
384
402
|
## Próximos itens
|
|
385
403
|
|
|
386
|
-
* MongoDB;
|
|
387
|
-
* validação mais completa do nome do projeto e do pacote;
|
|
404
|
+
* ampliar o suporte a MongoDB além do Prisma quando houver uma integração compatível com o ORM;
|
|
388
405
|
* ampliação da matriz de smoke tests com PostgreSQL e MySQL reais;
|
|
389
406
|
* redução das limitações conhecidas dos templates anteriores.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import fs from 'fs-extra';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Removes the entire src/auth/ and src/users/ directories when authentication is "none".
|
|
5
|
+
* Both modules remain for "jwt" and "oauth" because OAuth also lives in src/auth/.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* forgot-password.dto.ts
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* Directory removal is used instead of per-file markers because these two modules contain
|
|
8
|
+
* about 23 files, some of which already depend on another feature marker (for example,
|
|
9
|
+
* forgot-password.dto.ts requires "redis,auth:password"). Adding markers to every file
|
|
10
|
+
* would multiply the number of combinations, while removing both directories for the
|
|
11
|
+
* no-authentication case is easier to audit.
|
|
12
12
|
*/
|
|
13
13
|
export async function applyAuthStrategyRemoval(targetDir, enabledFeatures) {
|
|
14
14
|
if (!enabledFeatures.has('auth:none'))
|
|
@@ -16,6 +16,11 @@ const DATABASE_CONFIG = {
|
|
|
16
16
|
devUrl: 'file:./dev.db',
|
|
17
17
|
testUrl: 'file:./test.db',
|
|
18
18
|
},
|
|
19
|
+
mongodb: {
|
|
20
|
+
provider: 'mongodb',
|
|
21
|
+
devUrl: 'mongodb://localhost:27017/nestforge?replicaSet=rs0',
|
|
22
|
+
testUrl: 'mongodb://localhost:27017/nestforge_test?replicaSet=rs0',
|
|
23
|
+
},
|
|
19
24
|
};
|
|
20
25
|
export async function applyDatabaseConfig(targetDir, database) {
|
|
21
26
|
const databaseChoice = database;
|
|
@@ -24,6 +29,10 @@ export async function applyDatabaseConfig(targetDir, database) {
|
|
|
24
29
|
return;
|
|
25
30
|
}
|
|
26
31
|
await updateSchemaProvider(targetDir, config.provider);
|
|
32
|
+
if (databaseChoice === 'mongodb') {
|
|
33
|
+
await updateMongoSchema(targetDir);
|
|
34
|
+
await updateMongoScripts(targetDir);
|
|
35
|
+
}
|
|
27
36
|
await updateDatabaseType(targetDir, '.env.example', databaseChoice);
|
|
28
37
|
await updateDatabaseType(targetDir, '.env.test', databaseChoice);
|
|
29
38
|
await updateDatabaseUrl(targetDir, '.env.example', config.devUrl);
|
|
@@ -56,4 +65,30 @@ async function updateDatabaseUrl(targetDir, fileName, url) {
|
|
|
56
65
|
const updated = content.replace(/^DATABASE_URL=.*$/m, `DATABASE_URL="${url}"`);
|
|
57
66
|
await fs.writeFile(filePath, updated, 'utf-8');
|
|
58
67
|
}
|
|
68
|
+
async function updateMongoScripts(targetDir) {
|
|
69
|
+
const packageJsonPath = path.join(targetDir, 'package.json');
|
|
70
|
+
if (!(await fs.pathExists(packageJsonPath))) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const packageJson = await fs.readJson(packageJsonPath);
|
|
74
|
+
packageJson.scripts['prisma:push'] =
|
|
75
|
+
'prisma db push';
|
|
76
|
+
packageJson.scripts['pretest:e2e'] =
|
|
77
|
+
'dotenv -e .env.test -- npx prisma db push --skip-generate';
|
|
78
|
+
delete packageJson.scripts['prisma:migrate'];
|
|
79
|
+
delete packageJson.scripts['prisma:deploy'];
|
|
80
|
+
await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
|
|
81
|
+
}
|
|
82
|
+
async function updateMongoSchema(targetDir) {
|
|
83
|
+
const schemaPath = path.join(targetDir, 'prisma', 'schema.prisma');
|
|
84
|
+
if (!(await fs.pathExists(schemaPath))) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const schema = await fs.readFile(schemaPath, 'utf8');
|
|
88
|
+
const updated = schema
|
|
89
|
+
.replaceAll('@id @default(uuid())', '@id @default(auto()) @map("_id") @db.ObjectId')
|
|
90
|
+
.replace(/id\s+String\s+@id\r?\n\s+sid String @unique/, 'id String @id @map("_id")\n sid String @unique')
|
|
91
|
+
.replace(/userId(\s+)String(?!\s+@db\.ObjectId)/g, 'userId$1String @db.ObjectId');
|
|
92
|
+
await fs.writeFile(schemaPath, updated, 'utf8');
|
|
93
|
+
}
|
|
59
94
|
//# sourceMappingURL=database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/features/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/features/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import fs from 'fs-extra';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Packages (dependencies or devDependencies) that are only needed when the corresponding
|
|
5
|
+
* feature is enabled. This remains separate from code markers because package.json is
|
|
6
|
+
* plain JSON and does not support comments.
|
|
7
7
|
*/
|
|
8
8
|
const FEATURE_DEPENDENCIES = {
|
|
9
9
|
swagger: ['@nestjs/swagger'],
|
|
@@ -109,7 +109,7 @@ async function transpileFile(filePath) {
|
|
|
109
109
|
const details = errors
|
|
110
110
|
.map((diagnostic) => ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'))
|
|
111
111
|
.join('\n');
|
|
112
|
-
throw new Error(`
|
|
112
|
+
throw new Error(`Failed to convert "${filePath}" to JavaScript:\n${details}`);
|
|
113
113
|
}
|
|
114
114
|
const javascriptPath = filePath.replace(/\.ts$/, '.js');
|
|
115
115
|
await fs.writeFile(javascriptPath, result.outputText, 'utf8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/features/language.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/features/language.ts"],"names":[],"mappings":"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"}
|
package/dist/features/markers.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import fs from 'fs-extra';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
const IGNORED_DIRS = new Set(['node_modules', '.git', 'dist', 'coverage']);
|
|
4
|
-
//
|
|
5
|
-
//
|
|
4
|
+
// If the first non-empty line matches, the entire file belongs to a feature.
|
|
5
|
+
// Accepts "//" (TS/JS) and "#" (YAML/.env) as comment prefixes.
|
|
6
6
|
const FILE_MARKER = /^(?:\/\/|#) nestforge:feature-file:(\S+)\s*$/;
|
|
7
|
-
//
|
|
7
|
+
// Marks the start/end of a block inside a file (one or multiple lines).
|
|
8
8
|
const BLOCK_START = /^(\s*)(?:\/\/|#) nestforge:feature:(\S+)\s*$/;
|
|
9
9
|
const BLOCK_END = /^(\s*)(?:\/\/|#) nestforge:feature:(\S+):end\s*$/;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Applies feature markers to every text file in the generated project.
|
|
12
|
+
* Enabled features keep their content and remove only the marker lines.
|
|
13
|
+
* Disabled features remove the entire block, or the entire file for file markers.
|
|
14
14
|
*/
|
|
15
15
|
export async function applyFeatureMarkers(targetDir, enabledFeatures) {
|
|
16
16
|
const files = await collectFiles(targetDir);
|
|
@@ -36,10 +36,10 @@ async function collectFiles(dir) {
|
|
|
36
36
|
return files;
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
40
|
-
* (
|
|
41
|
-
*
|
|
42
|
-
*
|
|
39
|
+
* The name after "feature:" can be a comma-separated list
|
|
40
|
+
* (for example, "redis,auth:password"). In that case, every requirement must be
|
|
41
|
+
* enabled for the content to remain. A single feature, the most common case,
|
|
42
|
+
* continues to work as a one-item list.
|
|
43
43
|
*/
|
|
44
44
|
function isRequirementMet(rawName, enabledFeatures) {
|
|
45
45
|
return rawName
|
|
@@ -75,7 +75,7 @@ function stripBlockMarkers(lines, enabledFeatures) {
|
|
|
75
75
|
if (endMatch && endMatch[2] === skippingFeature) {
|
|
76
76
|
skippingFeature = null;
|
|
77
77
|
}
|
|
78
|
-
continue; //
|
|
78
|
+
continue; // Skip the entire block, including its closing :end line.
|
|
79
79
|
}
|
|
80
80
|
const endMatch = line.match(BLOCK_END);
|
|
81
81
|
if (endMatch) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markers.js","sourceRoot":"","sources":["../../src/features/markers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAE3E,
|
|
1
|
+
{"version":3,"file":"markers.js","sourceRoot":"","sources":["../../src/features/markers.ts"],"names":[],"mappings":"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"}
|
package/dist/generator.js
CHANGED
|
@@ -7,6 +7,7 @@ import { applyDatabaseConfig } from './features/database.js';
|
|
|
7
7
|
import { applyAuthStrategyRemoval } from './features/auth-strategy.js';
|
|
8
8
|
import { applyLanguageTransform } from './features/language.js';
|
|
9
9
|
import { applyNoOrmTransform } from './features/no-orm.js';
|
|
10
|
+
import { assertValidProjectName } from './project-name.js';
|
|
10
11
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
12
|
const PACKAGE_TEMPLATES_ROOT = path.resolve(__dirname, '../templates');
|
|
12
13
|
const MONOREPO_TEMPLATES_ROOT = path.resolve(__dirname, '../../../templates');
|
|
@@ -18,7 +19,7 @@ const IMPLEMENTED_ORMS = [
|
|
|
18
19
|
'none',
|
|
19
20
|
];
|
|
20
21
|
const IMPLEMENTED_LANGUAGES = ['typescript', 'javascript'];
|
|
21
|
-
const IMPLEMENTED_DATABASES = ['postgres', 'mysql', 'sqlite'];
|
|
22
|
+
const IMPLEMENTED_DATABASES = ['postgres', 'mysql', 'sqlite', 'mongodb'];
|
|
22
23
|
const IMPLEMENTED_AUTH_STRATEGIES = ['jwt', 'session', 'oauth', 'none'];
|
|
23
24
|
async function resolveTemplatesRoot() {
|
|
24
25
|
if (await fs.pathExists(PACKAGE_TEMPLATES_ROOT)) {
|
|
@@ -28,6 +29,7 @@ async function resolveTemplatesRoot() {
|
|
|
28
29
|
}
|
|
29
30
|
export async function generateProject(options) {
|
|
30
31
|
const { projectName, language, orm, database, features, authStrategy, accessControl, createEnv } = options;
|
|
32
|
+
assertValidProjectName(projectName);
|
|
31
33
|
if (!IMPLEMENTED_LANGUAGES.includes(language)) {
|
|
32
34
|
throw new Error(`Generation in "${language}" is not ready yet — only "typescript" is currently implemented. Contributions are welcome!`);
|
|
33
35
|
}
|
|
@@ -40,6 +42,9 @@ export async function generateProject(options) {
|
|
|
40
42
|
if (orm !== 'none' && !IMPLEMENTED_DATABASES.includes(database)) {
|
|
41
43
|
throw new Error(`The "${database}" database is not ready yet — currently implemented: ${IMPLEMENTED_DATABASES.join(', ')}. Contributions are welcome!`);
|
|
42
44
|
}
|
|
45
|
+
if (database === 'mongodb' && orm !== 'prisma') {
|
|
46
|
+
throw new Error('MongoDB is currently available only with Prisma.');
|
|
47
|
+
}
|
|
43
48
|
if (orm === 'none' && authStrategy !== 'none') {
|
|
44
49
|
throw new Error('Projects without an ORM currently support only the "none" authentication strategy.');
|
|
45
50
|
}
|
|
@@ -52,7 +57,11 @@ export async function generateProject(options) {
|
|
|
52
57
|
const templatesRoot = await resolveTemplatesRoot();
|
|
53
58
|
const templateName = orm === 'none' ? 'prisma' : orm;
|
|
54
59
|
const templateDir = path.join(templatesRoot, templateName);
|
|
55
|
-
const
|
|
60
|
+
const currentDirectory = path.resolve(process.cwd());
|
|
61
|
+
const targetDir = path.resolve(currentDirectory, projectName);
|
|
62
|
+
if (path.dirname(targetDir) !== currentDirectory) {
|
|
63
|
+
throw new Error('Invalid project name: the project must be created inside the current directory.');
|
|
64
|
+
}
|
|
56
65
|
if (await fs.pathExists(targetDir)) {
|
|
57
66
|
throw new Error(`The "${projectName}" directory already exists. Choose another name or remove the directory.`);
|
|
58
67
|
}
|
|
@@ -82,6 +91,9 @@ function buildEnabledFeatures(features, accessControl, database, authStrategy) {
|
|
|
82
91
|
}
|
|
83
92
|
enabled.add(`database:${database}`);
|
|
84
93
|
enabled.add(`auth:${authStrategy}`);
|
|
94
|
+
if (['postgres', 'mysql', 'sqlite'].includes(database)) {
|
|
95
|
+
enabled.add('database:relational');
|
|
96
|
+
}
|
|
85
97
|
if (authStrategy !== 'none') {
|
|
86
98
|
enabled.add('auth:enabled');
|
|
87
99
|
}
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACvE,MAAM,uBAAuB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAE9E,2EAA2E;AAC3E,MAAM,gBAAgB,GAAG;IACrB,QAAQ;IACR,SAAS;IACT,SAAS;IACT,MAAM;CACT,CAAC;AACF,MAAM,qBAAqB,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAC3D,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -39,7 +39,14 @@ async function main() {
|
|
|
39
39
|
...seedSteps,
|
|
40
40
|
]
|
|
41
41
|
: [
|
|
42
|
-
|
|
42
|
+
...(options.database === 'mongodb'
|
|
43
|
+
? [
|
|
44
|
+
'npm run prisma:push',
|
|
45
|
+
...(shouldRunSeed
|
|
46
|
+
? ['npm run prisma:seed']
|
|
47
|
+
: []),
|
|
48
|
+
]
|
|
49
|
+
: ['npx prisma migrate dev']),
|
|
43
50
|
];
|
|
44
51
|
const steps = [
|
|
45
52
|
`cd ${relativeDir}`,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,KAAK,UAAU,IAAI;IACf,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,IAAI,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC;QACnE,MAAM,cAAc,GAAG;YACnB,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC1C,CAAC,CAAC,OAAO,CAAC,QAAQ;gBAClB,CAAC,CAAC,IAAI;YACV,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;SACtD;aACI,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,CAAC;QAEf,MAAM,aAAa,GAAG;YAClB,KAAK;YACL,SAAS;SACZ,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAEjC,MAAM,SAAS,GAAG,aAAa;YAC3B,CAAC,CAAC,CAAC,cAAc,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,aAAa,GACf,OAAO,CAAC,GAAG,KAAK,MAAM;YAClB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS;gBAC3B,CAAC,CAAC;oBACE,qEAAqE;oBACrE,uBAAuB;oBACvB,GAAG,SAAS;iBACf;gBACD,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS;oBACvB,CAAC,CAAC;wBACE,0BAA0B;wBAC1B,yBAAyB;wBACzB,GAAG,SAAS;qBACf;oBACD,CAAC,CAAC;wBACE,wBAAwB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const MAX_PACKAGE_NAME_LENGTH = 214;
|
|
2
|
+
const NPM_RESERVED_NAMES = new Set([
|
|
3
|
+
'node_modules',
|
|
4
|
+
'favicon.ico',
|
|
5
|
+
]);
|
|
6
|
+
const WINDOWS_RESERVED_NAME = /^(?:con|prn|aux|nul|clock\$|com[1-9]|lpt[1-9])(?:\..*)?$/i;
|
|
7
|
+
const VALID_PROJECT_NAME = /^[a-z0-9][a-z0-9._-]*$/;
|
|
8
|
+
export function validateProjectName(projectName) {
|
|
9
|
+
if (projectName.length === 0) {
|
|
10
|
+
return 'Project name is required.';
|
|
11
|
+
}
|
|
12
|
+
if (projectName !== projectName.trim()) {
|
|
13
|
+
return 'Project name cannot start or end with whitespace.';
|
|
14
|
+
}
|
|
15
|
+
if (projectName.length > MAX_PACKAGE_NAME_LENGTH) {
|
|
16
|
+
return `Project name cannot exceed ${MAX_PACKAGE_NAME_LENGTH} characters.`;
|
|
17
|
+
}
|
|
18
|
+
if (projectName === '.' || projectName === '..') {
|
|
19
|
+
return 'Project name cannot be "." or "..".';
|
|
20
|
+
}
|
|
21
|
+
if (projectName.startsWith('@')) {
|
|
22
|
+
return 'Scoped package names are not supported as project names.';
|
|
23
|
+
}
|
|
24
|
+
if (projectName.includes('/') || projectName.includes('\\')) {
|
|
25
|
+
return 'Project name cannot contain path separators.';
|
|
26
|
+
}
|
|
27
|
+
if (projectName !== projectName.toLowerCase()) {
|
|
28
|
+
return 'Project name must be lowercase.';
|
|
29
|
+
}
|
|
30
|
+
if (!VALID_PROJECT_NAME.test(projectName)) {
|
|
31
|
+
return 'Project name must start with a letter or number and contain only lowercase letters, numbers, dots, hyphens, or underscores.';
|
|
32
|
+
}
|
|
33
|
+
if (projectName.endsWith('.')) {
|
|
34
|
+
return 'Project name cannot end with a dot.';
|
|
35
|
+
}
|
|
36
|
+
if (NPM_RESERVED_NAMES.has(projectName)) {
|
|
37
|
+
return `"${projectName}" is reserved and cannot be used as a project name.`;
|
|
38
|
+
}
|
|
39
|
+
if (WINDOWS_RESERVED_NAME.test(projectName)) {
|
|
40
|
+
return `"${projectName}" is a reserved name on Windows.`;
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
export function assertValidProjectName(projectName) {
|
|
45
|
+
const validationError = validateProjectName(projectName);
|
|
46
|
+
if (validationError) {
|
|
47
|
+
throw new Error(`Invalid project name: ${validationError}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=project-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-name.js","sourceRoot":"","sources":["../src/project-name.ts"],"names":[],"mappings":"AAAA,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IAC/B,cAAc;IACd,aAAa;CAChB,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,2DAA2D,CAAC;AAC1F,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACnD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,2BAA2B,CAAC;IACvC,CAAC;IAED,IAAI,WAAW,KAAK,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACrC,OAAO,mDAAmD,CAAC;IAC/D,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;QAC/C,OAAO,8BAA8B,uBAAuB,cAAc,CAAC;IAC/E,CAAC;IAED,IAAI,WAAW,KAAK,GAAG,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,qCAAqC,CAAC;IACjD,CAAC;IAED,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,0DAA0D,CAAC;IACtE,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,OAAO,8CAA8C,CAAC;IAC1D,CAAC;IAED,IAAI,WAAW,KAAK,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5C,OAAO,iCAAiC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,OAAO,6HAA6H,CAAC;IACzI,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,qCAAqC,CAAC;IACjD,CAAC;IAED,IAAI,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,WAAW,qDAAqD,CAAC;IAChF,CAAC;IAED,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1C,OAAO,IAAI,WAAW,kCAAkC,CAAC;IAC7D,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACtD,MAAM,eAAe,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEzD,IAAI,eAAe,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,eAAe,EAAE,CAAC,CAAC;IAChE,CAAC;AACL,CAAC"}
|
package/dist/prompts.js
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { intro, outro, text, select, confirm, isCancel, cancel } from '@clack/prompts';
|
|
2
2
|
import gradient from 'gradient-string';
|
|
3
3
|
import pc from 'picocolors';
|
|
4
|
+
import { validateProjectName } from './project-name.js';
|
|
4
5
|
// red -> orange, the NestJS colors
|
|
5
6
|
const nestforgeGradient = gradient(['#e0234e', '#ff8a65']);
|
|
6
|
-
const logo =
|
|
7
|
-
|
|
8
|
-
|
|
|
9
|
-
|
|
|
10
|
-
| .
|
|
11
|
-
|
|
|
12
|
-
|_|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
7
|
+
const logo = [
|
|
8
|
+
' _ _ _ ______',
|
|
9
|
+
' | \\ | | | | | ____|',
|
|
10
|
+
' | \\| | ___ ___| |_| |__ ___ _ __ __ _ ___',
|
|
11
|
+
" | . ` |/ _ \\/ __| __| __/ _ \\| '__/ _` |/ _ \\",
|
|
12
|
+
' | |\\ | __/\\__ \\ |_| | | (_) | | | (_| | __/',
|
|
13
|
+
' |_| \\_|\\___||___/\\__|_| \\___/|_| \\__, |\\___|',
|
|
14
|
+
' __/ |',
|
|
15
|
+
' |___/',
|
|
16
|
+
].join('\n');
|
|
16
17
|
function showBanner() {
|
|
17
18
|
console.log();
|
|
18
19
|
console.log(nestforgeGradient.multiline(logo));
|
|
@@ -32,6 +33,7 @@ export async function runPrompts() {
|
|
|
32
33
|
message: 'What is your project name?',
|
|
33
34
|
placeholder: 'my-nest-api',
|
|
34
35
|
defaultValue: 'my-nest-api',
|
|
36
|
+
validate: (value) => validateProjectName(value ?? ''),
|
|
35
37
|
});
|
|
36
38
|
handleCancel(projectName);
|
|
37
39
|
// 2. Language
|
|
@@ -63,7 +65,9 @@ export async function runPrompts() {
|
|
|
63
65
|
{ value: 'postgres', label: 'PostgreSQL', hint: 'Recommended' },
|
|
64
66
|
{ value: 'mysql', label: 'MySQL' },
|
|
65
67
|
{ value: 'sqlite', label: 'SQLite' },
|
|
66
|
-
|
|
68
|
+
...(orm === 'prisma'
|
|
69
|
+
? [{ value: 'mongodb', label: 'MongoDB' }]
|
|
70
|
+
: []),
|
|
67
71
|
],
|
|
68
72
|
});
|
|
69
73
|
handleCancel(databaseSelection);
|