nestforge-generator 0.2.0 → 0.3.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 +11 -6
- package/README.pt-BR.md +11 -6
- package/dist/features/database.js +35 -0
- package/dist/features/database.js.map +1 -1
- package/dist/generator.js +7 -1
- package/dist/generator.js.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/prompts.js +3 -1
- 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/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/src/auth/token.service.ts +12 -3
- 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/typeorm/README.md +2 -0
- package/templates/typeorm/README.pt-BR.md +2 -0
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;
|
|
@@ -61,9 +61,10 @@ Available with:
|
|
|
61
61
|
|
|
62
62
|
- PostgreSQL;
|
|
63
63
|
- MySQL;
|
|
64
|
-
- SQLite
|
|
64
|
+
- SQLite;
|
|
65
|
+
- MongoDB.
|
|
65
66
|
|
|
66
|
-
The CLI adjusts the `schema.prisma` provider, database URL, and provider-specific resources.
|
|
67
|
+
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
68
|
|
|
68
69
|
### TypeORM
|
|
69
70
|
|
|
@@ -105,6 +106,8 @@ The Drizzle template includes:
|
|
|
105
106
|
|
|
106
107
|
After generation, only the schema and driver for the selected database remain in the project.
|
|
107
108
|
|
|
109
|
+
> **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.
|
|
110
|
+
|
|
108
111
|
### No ORM
|
|
109
112
|
|
|
110
113
|
The “None” option:
|
|
@@ -261,7 +264,7 @@ When requested, the CLI automatically creates `.env` from the already processed
|
|
|
261
264
|
| Database: PostgreSQL | ✅ Implemented |
|
|
262
265
|
| Database: MySQL | ✅ Implemented |
|
|
263
266
|
| Database: SQLite | ✅ Implemented |
|
|
264
|
-
| Database: MongoDB |
|
|
267
|
+
| Database: MongoDB | ✅ Implemented with Prisma |
|
|
265
268
|
| Auth: JWT | ✅ Implemented |
|
|
266
269
|
| Auth: Session/Cookies | ✅ Implemented |
|
|
267
270
|
| Auth: OAuth-only | ✅ Implemented |
|
|
@@ -288,6 +291,8 @@ Coverage includes:
|
|
|
288
291
|
- Prisma with PostgreSQL;
|
|
289
292
|
- Prisma with MySQL;
|
|
290
293
|
- Prisma with SQLite;
|
|
294
|
+
- Prisma with MongoDB and JWT;
|
|
295
|
+
- Prisma with MongoDB and Session/Cookies;
|
|
291
296
|
- TypeORM with SQLite;
|
|
292
297
|
- Drizzle with PostgreSQL;
|
|
293
298
|
- Drizzle with MySQL;
|
|
@@ -316,7 +321,7 @@ The following combinations were validated with installation, build, unit tests,
|
|
|
316
321
|
- TypeScript + Drizzle + SQLite + JWT;
|
|
317
322
|
- TypeScript + Drizzle + SQLite + Session/Cookies.
|
|
318
323
|
|
|
319
|
-
PostgreSQL and
|
|
324
|
+
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
325
|
|
|
321
326
|
## Known limitations
|
|
322
327
|
|
|
@@ -384,7 +389,7 @@ The build:
|
|
|
384
389
|
|
|
385
390
|
## Next steps
|
|
386
391
|
|
|
387
|
-
- MongoDB;
|
|
392
|
+
- expand MongoDB support beyond Prisma when a compatible ORM integration is available;
|
|
388
393
|
- more complete project and package name validation;
|
|
389
394
|
- expand the smoke-test matrix with real PostgreSQL and MySQL services;
|
|
390
395
|
- 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;
|
|
@@ -61,9 +61,10 @@ Disponível com:
|
|
|
61
61
|
|
|
62
62
|
* PostgreSQL;
|
|
63
63
|
* MySQL;
|
|
64
|
-
* SQLite
|
|
64
|
+
* SQLite;
|
|
65
|
+
* MongoDB.
|
|
65
66
|
|
|
66
|
-
A CLI ajusta o provider do schema.prisma, a URL do banco e os recursos específicos do provider.
|
|
67
|
+
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
68
|
|
|
68
69
|
### TypeORM
|
|
69
70
|
|
|
@@ -105,6 +106,8 @@ O template Drizzle inclui:
|
|
|
105
106
|
|
|
106
107
|
Depois da geração, somente o schema e o driver do banco selecionado permanecem no projeto.
|
|
107
108
|
|
|
109
|
+
> **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.
|
|
110
|
+
|
|
108
111
|
### Sem ORM
|
|
109
112
|
|
|
110
113
|
A opção “Nenhum”:
|
|
@@ -262,7 +265,7 @@ processado.
|
|
|
262
265
|
| Banco: PostgreSQL | ✅ Implementado |
|
|
263
266
|
| Banco: MySQL | ✅ Implementado |
|
|
264
267
|
| Banco: SQLite | ✅ Implementado |
|
|
265
|
-
| Banco: MongoDB |
|
|
268
|
+
| Banco: MongoDB | ✅ Com Prisma |
|
|
266
269
|
| Auth: JWT | ✅ Implementada |
|
|
267
270
|
| Auth: Session/Cookies | ✅ Implementada |
|
|
268
271
|
| Auth: OAuth-only | ✅ Implementada |
|
|
@@ -287,6 +290,8 @@ A cobertura inclui:
|
|
|
287
290
|
* Prisma com PostgreSQL;
|
|
288
291
|
* Prisma com MySQL;
|
|
289
292
|
* Prisma com SQLite;
|
|
293
|
+
* Prisma com MongoDB e JWT;
|
|
294
|
+
* Prisma com MongoDB e Session/Cookies;
|
|
290
295
|
* TypeORM com SQLite;
|
|
291
296
|
* Drizzle com PostgreSQL;
|
|
292
297
|
* Drizzle com MySQL;
|
|
@@ -315,7 +320,7 @@ Foram validadas com instalação, build, testes unitários, migrations, seed e t
|
|
|
315
320
|
* TypeScript + Drizzle + SQLite + JWT;
|
|
316
321
|
* TypeScript + Drizzle + SQLite + Session/Cookies.
|
|
317
322
|
|
|
318
|
-
PostgreSQL e
|
|
323
|
+
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
324
|
|
|
320
325
|
## Limitações conhecidas
|
|
321
326
|
|
|
@@ -383,7 +388,7 @@ O build:
|
|
|
383
388
|
|
|
384
389
|
## Próximos itens
|
|
385
390
|
|
|
386
|
-
* MongoDB;
|
|
391
|
+
* ampliar o suporte a MongoDB além do Prisma quando houver uma integração compatível com o ORM;
|
|
387
392
|
* validação mais completa do nome do projeto e do pacote;
|
|
388
393
|
* ampliação da matriz de smoke tests com PostgreSQL e MySQL reais;
|
|
389
394
|
* redução das limitações conhecidas dos templates anteriores.
|
|
@@ -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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"}
|
package/dist/generator.js
CHANGED
|
@@ -18,7 +18,7 @@ const IMPLEMENTED_ORMS = [
|
|
|
18
18
|
'none',
|
|
19
19
|
];
|
|
20
20
|
const IMPLEMENTED_LANGUAGES = ['typescript', 'javascript'];
|
|
21
|
-
const IMPLEMENTED_DATABASES = ['postgres', 'mysql', 'sqlite'];
|
|
21
|
+
const IMPLEMENTED_DATABASES = ['postgres', 'mysql', 'sqlite', 'mongodb'];
|
|
22
22
|
const IMPLEMENTED_AUTH_STRATEGIES = ['jwt', 'session', 'oauth', 'none'];
|
|
23
23
|
async function resolveTemplatesRoot() {
|
|
24
24
|
if (await fs.pathExists(PACKAGE_TEMPLATES_ROOT)) {
|
|
@@ -40,6 +40,9 @@ export async function generateProject(options) {
|
|
|
40
40
|
if (orm !== 'none' && !IMPLEMENTED_DATABASES.includes(database)) {
|
|
41
41
|
throw new Error(`The "${database}" database is not ready yet — currently implemented: ${IMPLEMENTED_DATABASES.join(', ')}. Contributions are welcome!`);
|
|
42
42
|
}
|
|
43
|
+
if (database === 'mongodb' && orm !== 'prisma') {
|
|
44
|
+
throw new Error('MongoDB is currently available only with Prisma.');
|
|
45
|
+
}
|
|
43
46
|
if (orm === 'none' && authStrategy !== 'none') {
|
|
44
47
|
throw new Error('Projects without an ORM currently support only the "none" authentication strategy.');
|
|
45
48
|
}
|
|
@@ -82,6 +85,9 @@ function buildEnabledFeatures(features, accessControl, database, authStrategy) {
|
|
|
82
85
|
}
|
|
83
86
|
enabled.add(`database:${database}`);
|
|
84
87
|
enabled.add(`auth:${authStrategy}`);
|
|
88
|
+
if (['postgres', 'mysql', 'sqlite'].includes(database)) {
|
|
89
|
+
enabled.add('database:relational');
|
|
90
|
+
}
|
|
85
91
|
if (authStrategy !== 'none') {
|
|
86
92
|
enabled.add('auth:enabled');
|
|
87
93
|
}
|
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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"}
|
package/dist/prompts.js
CHANGED
|
@@ -63,7 +63,9 @@ export async function runPrompts() {
|
|
|
63
63
|
{ value: 'postgres', label: 'PostgreSQL', hint: 'Recommended' },
|
|
64
64
|
{ value: 'mysql', label: 'MySQL' },
|
|
65
65
|
{ value: 'sqlite', label: 'SQLite' },
|
|
66
|
-
|
|
66
|
+
...(orm === 'prisma'
|
|
67
|
+
? [{ value: 'mongodb', label: 'MongoDB' }]
|
|
68
|
+
: []),
|
|
67
69
|
],
|
|
68
70
|
});
|
|
69
71
|
handleCancel(databaseSelection);
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,MAAM,YAAY,CAAC;AAkB5B,mCAAmC;AACnC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAE3D,MAAM,IAAI,GAAG;;;;;;;;;CASZ,CAAC;AAEF,SAAS,UAAU;IACf,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,UAAU,EAAE,CAAC;IACb,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAE7C,kBAAkB;IAClB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;QAC3B,OAAO,EAAE,4BAA4B;QACrC,WAAW,EAAE,aAAa;QAC1B,YAAY,EAAE,aAAa;KAC9B,CAAC,CAAC;IACH,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1B,cAAc;IACd,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE;YACL,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE;YACjE,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;SAC/C;KACJ,CAAC,CAAC;IACH,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEvB,mBAAmB;IACnB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;QACrB,OAAO,EAAE,+BAA+B;QACxC,OAAO,EAAE;YACL,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE;YACzD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;YACtC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE;YAC1C,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;SACnC;KACJ,CAAC,CAAC;IACH,YAAY,CAAC,GAAG,CAAC,CAAC;IAElB,cAAc;IACd,IAAI,QAAQ,GAAmB,MAAM,CAAC;IAEtC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACjB,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC;YACnC,OAAO,EAAE,oCAAoC;YAC7C,OAAO,EAAE;gBACL,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE;gBAC/D,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;gBAClC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACpC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nestforge-generator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Interactive CLI for generating a NestJS project from a NestForge starter template",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"postgresql",
|
|
41
41
|
"mysql",
|
|
42
42
|
"sqlite",
|
|
43
|
+
"mongodb",
|
|
43
44
|
"docker",
|
|
44
45
|
"swagger",
|
|
45
46
|
"api",
|
|
@@ -25,6 +25,8 @@ NestForge is a NestJS starter designed to accelerate the beginning of serious ba
|
|
|
25
25
|
- 🐳 **Docker** — complete environment with a single command
|
|
26
26
|
- ⚙️ **CI/CD** — GitHub Actions (build, lint, test)
|
|
27
27
|
|
|
28
|
+
> **MongoDB compatibility:** MongoDB is not available in this template because Drizzle does not currently provide an official MongoDB dialect. MongoDB generation is currently available through the Prisma template.
|
|
29
|
+
|
|
28
30
|
## 🧱 Stack
|
|
29
31
|
|
|
30
32
|
| Layer | Technology |
|
|
@@ -25,6 +25,8 @@ NestForge é um boilerplate de NestJS pensado para acelerar o início de projeto
|
|
|
25
25
|
- 🐳 **Docker** — ambiente completo com um comando
|
|
26
26
|
- ⚙️ **CI/CD** — GitHub Actions (build, lint, test)
|
|
27
27
|
|
|
28
|
+
> **Compatibilidade com MongoDB:** o MongoDB não está disponível neste template porque o Drizzle não oferece atualmente um dialeto oficial para MongoDB. A geração com MongoDB está disponível atualmente por meio do template Prisma.
|
|
29
|
+
|
|
28
30
|
## 🧱 Stack
|
|
29
31
|
|
|
30
32
|
| Camada | Tecnologia |
|
|
@@ -64,6 +64,9 @@ jobs:
|
|
|
64
64
|
# nestforge:feature:database:sqlite
|
|
65
65
|
DATABASE_URL: file:./ci-dev.db
|
|
66
66
|
# nestforge:feature:database:sqlite:end
|
|
67
|
+
# nestforge:feature:database:mongodb
|
|
68
|
+
DATABASE_URL: mongodb://localhost:27017/nestforge?replicaSet=rs0
|
|
69
|
+
# nestforge:feature:database:mongodb:end
|
|
67
70
|
JWT_ACCESS_SECRET: ci-access-secret-0123456789
|
|
68
71
|
JWT_REFRESH_SECRET: ci-refresh-secret-0123456789
|
|
69
72
|
|
|
@@ -77,14 +80,34 @@ jobs:
|
|
|
77
80
|
node-version: 20
|
|
78
81
|
cache: npm
|
|
79
82
|
|
|
83
|
+
# nestforge:feature:database:mongodb
|
|
84
|
+
- name: Start MongoDB replica set
|
|
85
|
+
run: |
|
|
86
|
+
docker run --detach --name nestforge-mongodb --publish 27017:27017 mongo:8 mongod --replSet rs0 --bind_ip_all
|
|
87
|
+
for attempt in {1..30}; do
|
|
88
|
+
if docker exec nestforge-mongodb mongosh --quiet --eval "try { rs.status().ok } catch (error) { rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'localhost:27017'}]}).ok }" | grep -q 1; then
|
|
89
|
+
exit 0
|
|
90
|
+
fi
|
|
91
|
+
sleep 2
|
|
92
|
+
done
|
|
93
|
+
exit 1
|
|
94
|
+
# nestforge:feature:database:mongodb:end
|
|
95
|
+
|
|
80
96
|
- name: Instalar dependências
|
|
81
97
|
run: npm ci
|
|
82
98
|
|
|
83
99
|
- name: Gerar Prisma Client
|
|
84
100
|
run: npx prisma generate
|
|
85
101
|
|
|
102
|
+
# nestforge:feature:database:relational
|
|
86
103
|
- name: Rodar migrations
|
|
87
104
|
run: npx prisma migrate deploy
|
|
105
|
+
# nestforge:feature:database:relational:end
|
|
106
|
+
|
|
107
|
+
# nestforge:feature:database:mongodb
|
|
108
|
+
- name: Sincronizar schema do MongoDB
|
|
109
|
+
run: npx prisma db push
|
|
110
|
+
# nestforge:feature:database:mongodb:end
|
|
88
111
|
|
|
89
112
|
- name: Lint
|
|
90
113
|
run: npm run lint
|
|
@@ -106,4 +129,4 @@ jobs:
|
|
|
106
129
|
# nestforge:feature:database:mysql:end
|
|
107
130
|
|
|
108
131
|
- name: Testes e2e
|
|
109
|
-
run: npm run test:e2e
|
|
132
|
+
run: npm run test:e2e
|
|
@@ -11,7 +11,7 @@ Request → main.ts (global pipes/filters/interceptors)
|
|
|
11
11
|
→ Guards (JwtAuthGuard → RolesGuard → PermissionsGuard)
|
|
12
12
|
→ Controller (validates through a Zod DTO, delegates to the service)
|
|
13
13
|
→ Service (business rules, calls Prisma)
|
|
14
|
-
→ Prisma →
|
|
14
|
+
→ Prisma → selected database
|
|
15
15
|
→ Response (passes through ClassSerializerInterceptor before becoming JSON)
|
|
16
16
|
```
|
|
17
17
|
|
|
@@ -38,6 +38,12 @@ Controllers never communicate with Prisma directly — they always go through th
|
|
|
38
38
|
|
|
39
39
|
Prisma Client is effectively already a type-safe repository. Adding an abstraction layer on top merely to “follow the pattern” would add indirection without a real benefit in this project (there is no plan to replace the ORM). Services call `this.prisma.<model>` directly.
|
|
40
40
|
|
|
41
|
+
### How does MongoDB differ from the relational databases?
|
|
42
|
+
|
|
43
|
+
MongoDB documents use `_id`. The generated Prisma schema maps model IDs to `_id`, uses native `ObjectId` values where IDs are generated by MongoDB, and marks relation scalar fields with `@db.ObjectId`. The session store keeps its externally supplied string ID mapped directly to `_id`.
|
|
44
|
+
|
|
45
|
+
MongoDB uses `prisma db push` instead of Prisma Migrate. A replica set is required for transactional and nested-write behavior, so the generated Docker Compose starts a single-node replica set. The database health indicator uses MongoDB's `ping` command instead of executing `SELECT 1`.
|
|
46
|
+
|
|
41
47
|
### Why are permissions a fixed map in code (`ROLE_PERMISSIONS`) instead of a database table?
|
|
42
48
|
|
|
43
49
|
A fully dynamic permission system (`roles`, `permissions`, and `role_permissions` tables) is overkill for a starter — most projects created from it will have 3–5 fixed roles. Keeping the mapping in `src/common/constants/role-permissions.ts` makes it explicitly auditable: the entire permission array for every role is visible in one file. If the project grows enough to require permissions configurable at runtime (for example, an administrator creating custom roles through the UI), then migrating to database tables becomes worthwhile.
|
|
@@ -11,7 +11,7 @@ Request → main.ts (pipes/filters/interceptors globais)
|
|
|
11
11
|
→ Guards (JwtAuthGuard → RolesGuard → PermissionsGuard)
|
|
12
12
|
→ Controller (valida via DTO Zod, delega pro service)
|
|
13
13
|
→ Service (regra de negócio, chama o Prisma)
|
|
14
|
-
→ Prisma →
|
|
14
|
+
→ Prisma → banco selecionado
|
|
15
15
|
→ Response (passa pelo ClassSerializerInterceptor antes de virar JSON)
|
|
16
16
|
```
|
|
17
17
|
|
|
@@ -36,6 +36,12 @@ Controllers nunca falam com o Prisma diretamente — sempre passam pelo service.
|
|
|
36
36
|
### Por que Prisma sem uma camada de "repository" por cima?
|
|
37
37
|
Prisma Client já é, na prática, um repository type-safe — adicionar uma camada de abstração em cima dele só pra "seguir o padrão" adicionaria indireção sem trazer benefício real neste projeto (não há plano de trocar de ORM). Os services chamam `this.prisma.<model>` diretamente.
|
|
38
38
|
|
|
39
|
+
### Como o MongoDB difere dos bancos relacionais?
|
|
40
|
+
|
|
41
|
+
Documentos MongoDB usam `_id`. O schema Prisma gerado mapeia os IDs dos models para `_id`, usa valores nativos `ObjectId` quando os IDs são gerados pelo MongoDB e marca os campos escalares de relação com `@db.ObjectId`. O armazenamento de sessão mantém seu ID textual fornecido externamente mapeado diretamente para `_id`.
|
|
42
|
+
|
|
43
|
+
MongoDB usa `prisma db push` no lugar do Prisma Migrate. Um replica set é necessário para transações e escritas aninhadas, então o Docker Compose gerado inicia um replica set de nó único. O indicador de saúde usa o comando `ping` do MongoDB em vez de executar `SELECT 1`.
|
|
44
|
+
|
|
39
45
|
### Por que permissions são um mapa fixo em código (`ROLE_PERMISSIONS`) e não uma tabela no banco?
|
|
40
46
|
Um sistema de permissions 100% dinâmico (tabelas `roles`, `permissions`, `role_permissions`) é overkill pra um boilerplate — a maioria dos projetos que nascem daqui vai ter 3-5 roles fixas. Manter o mapeamento em `src/common/constants/role-permissions.ts` deixa auditável de forma explícita: dá pra ver o array inteiro de permissões de cada role em um arquivo só. Se o seu projeto crescer a ponto de precisar de permissions configuráveis em runtime (ex.: um admin criando roles customizadas pela UI), aí sim vale migrar pra tabela.
|
|
41
47
|
|
|
@@ -17,7 +17,7 @@ NestForge is a NestJS starter designed to accelerate the beginning of serious ba
|
|
|
17
17
|
- 🌐 **OAuth** — Google and GitHub, integrated with the selected token or session strategy
|
|
18
18
|
- 👥 **RBAC** — Roles (Admin, Manager, User) and granular Permissions
|
|
19
19
|
- 🛡️ **Security** — Helmet, CORS, Rate Limiting, validation, and serialization with Zod
|
|
20
|
-
- 🗄️ **Database** — Prisma with PostgreSQL, MySQL, or
|
|
20
|
+
- 🗄️ **Database** — Prisma with PostgreSQL, MySQL, SQLite, or MongoDB
|
|
21
21
|
- 📨 **Email** — queues with BullMQ + Redis, locally tested with Mailpit
|
|
22
22
|
- 📄 **Automatic documentation** — Swagger
|
|
23
23
|
- 🪵 **Structured logs** — Pino
|
|
@@ -31,7 +31,7 @@ NestForge is a NestJS starter designed to accelerate the beginning of serious ba
|
|
|
31
31
|
|---|---|
|
|
32
32
|
| Framework | NestJS + TypeScript |
|
|
33
33
|
| ORM | Prisma |
|
|
34
|
-
| Database | PostgreSQL, MySQL, or
|
|
34
|
+
| Database | PostgreSQL, MySQL, SQLite, or MongoDB |
|
|
35
35
|
| Cache / Queues | Redis + BullMQ |
|
|
36
36
|
| Authentication | JWT, Session/Cookies, or OAuth with Passport |
|
|
37
37
|
| Validation | Zod + nestjs-zod (schemas automatically become DTOs + Swagger) |
|
|
@@ -73,14 +73,19 @@ cp .env.example .env
|
|
|
73
73
|
docker compose up
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
This starts the API,
|
|
76
|
+
This starts the API, the selected database, Redis, and Mailpit (email interface at `http://localhost:8025`). MongoDB runs as a single-node replica set for transaction support.
|
|
77
77
|
|
|
78
78
|
### Running locally
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
81
|
npm install
|
|
82
82
|
cp .env.example .env
|
|
83
|
+
# nestforge:feature:database:relational
|
|
83
84
|
npx prisma migrate dev
|
|
85
|
+
# nestforge:feature:database:relational:end
|
|
86
|
+
# nestforge:feature:database:mongodb
|
|
87
|
+
npm run prisma:push
|
|
88
|
+
# nestforge:feature:database:mongodb:end
|
|
84
89
|
npx prisma db seed
|
|
85
90
|
npm run start:dev
|
|
86
91
|
```
|
|
@@ -234,15 +239,14 @@ npm run test:e2e # integration tests (E2E)
|
|
|
234
239
|
npm run test:cov # coverage
|
|
235
240
|
```
|
|
236
241
|
|
|
237
|
-
E2E tests (`test/*.e2e-spec.ts`) start the real application (Nest + Prisma + Redis) and call its endpoints with `supertest`, using an isolated database (`.env.test`, the `nestforge_test` database — never the development database). Before running them for the first time:
|
|
242
|
+
E2E tests (`test/*.e2e-spec.ts`) start the real application (Nest + Prisma + Redis) and call its endpoints with `supertest`, using an isolated database (`.env.test`, the `nestforge_test` database — never the development database). Before running them for the first time, start the selected database and Redis:
|
|
238
243
|
|
|
239
244
|
```bash
|
|
240
|
-
|
|
241
|
-
docker compose up -d postgres redis
|
|
245
|
+
docker compose up -d
|
|
242
246
|
npm run test:e2e
|
|
243
247
|
```
|
|
244
248
|
|
|
245
|
-
The `pretest:e2e` script automatically applies migrations
|
|
249
|
+
The `pretest:e2e` script automatically applies migrations for relational databases or pushes the Prisma schema for MongoDB before every run. Each test cleans the database before running (`test/utils/clean-database.ts`), so nothing needs to be reset manually between runs. Current coverage includes the complete authentication flow (registration, login, refresh, logout, duplicate email, invalid credentials) and user CRUD with RBAC (ADMIN can do everything, USER can read but cannot create, `/users/me`, and access without a token).
|
|
246
250
|
|
|
247
251
|
Unit tests (`src/**/*.spec.ts`) run in isolation with Prisma and `ioredis` mocked (`vi.fn()` / `vi.mock()`), so they do not require a real database or Redis. Current coverage includes `AuthService` (registration/login), `UsersService` (complete CRUD + pagination + confirmation through `instanceToPlain` that `passwordHash` is not leaked during serialization), `RolesGuard` and `PermissionsGuard` (allowing/blocking, including multiple permissions required at the same time), and health indicators (`PrismaHealthIndicator`, `RedisHealthIndicator`).
|
|
248
252
|
|
|
@@ -17,7 +17,7 @@ NestForge é um boilerplate de NestJS pensado para acelerar o início de projeto
|
|
|
17
17
|
- 🌐 **OAuth** — Google e GitHub, integrado à estratégia de token ou sessão escolhida
|
|
18
18
|
- 👥 **RBAC** — Roles (Admin, Manager, User) e Permissions granulares
|
|
19
19
|
- 🛡️ **Segurança** — Helmet, CORS, Rate Limiting, validação e serialização com Zod
|
|
20
|
-
- 🗄️ **Banco de dados** — Prisma com PostgreSQL, MySQL ou
|
|
20
|
+
- 🗄️ **Banco de dados** — Prisma com PostgreSQL, MySQL, SQLite ou MongoDB
|
|
21
21
|
- 📨 **E-mails** — filas com BullMQ + Redis, testado localmente com Mailpit
|
|
22
22
|
- 📄 **Documentação automática** — Swagger
|
|
23
23
|
- 🪵 **Logs estruturados** — Pino
|
|
@@ -31,7 +31,7 @@ NestForge é um boilerplate de NestJS pensado para acelerar o início de projeto
|
|
|
31
31
|
|---|---|
|
|
32
32
|
| Framework | NestJS + TypeScript |
|
|
33
33
|
| ORM | Prisma |
|
|
34
|
-
| Banco | PostgreSQL, MySQL ou
|
|
34
|
+
| Banco | PostgreSQL, MySQL, SQLite ou MongoDB |
|
|
35
35
|
| Cache / Filas | Redis + BullMQ |
|
|
36
36
|
| Autenticação | JWT, Session/Cookies ou OAuth com Passport |
|
|
37
37
|
| Validação | Zod + nestjs-zod (schemas viram DTO + Swagger automaticamente) |
|
|
@@ -73,14 +73,19 @@ cp .env.example .env
|
|
|
73
73
|
docker compose up
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
Isso sobe
|
|
76
|
+
Isso sobe a API, o banco selecionado, Redis e Mailpit (interface de e-mail em `http://localhost:8025`). O MongoDB funciona como replica set de nó único para permitir transações.
|
|
77
77
|
|
|
78
78
|
### Rodando localmente
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
81
|
npm install
|
|
82
82
|
cp .env.example .env
|
|
83
|
+
# nestforge:feature:database:relational
|
|
83
84
|
npx prisma migrate dev
|
|
85
|
+
# nestforge:feature:database:relational:end
|
|
86
|
+
# nestforge:feature:database:mongodb
|
|
87
|
+
npm run prisma:push
|
|
88
|
+
# nestforge:feature:database:mongodb:end
|
|
84
89
|
npx prisma db seed
|
|
85
90
|
npm run start:dev
|
|
86
91
|
```
|
|
@@ -234,15 +239,14 @@ npm run test:e2e # integração (e2e)
|
|
|
234
239
|
npm run test:cov # cobertura
|
|
235
240
|
```
|
|
236
241
|
|
|
237
|
-
Os testes e2e (`test/*.e2e-spec.ts`) sobem a aplicação real (Nest + Prisma + Redis) e batem nos endpoints com `supertest`, usando um banco isolado (`.env.test`, banco `nestforge_test` — nunca o de desenvolvimento). Antes de rodar pela primeira vez:
|
|
242
|
+
Os testes e2e (`test/*.e2e-spec.ts`) sobem a aplicação real (Nest + Prisma + Redis) e batem nos endpoints com `supertest`, usando um banco isolado (`.env.test`, banco `nestforge_test` — nunca o de desenvolvimento). Antes de rodar pela primeira vez, inicie o banco selecionado e o Redis:
|
|
238
243
|
|
|
239
244
|
```bash
|
|
240
|
-
|
|
241
|
-
docker compose up -d postgres redis
|
|
245
|
+
docker compose up -d
|
|
242
246
|
npm run test:e2e
|
|
243
247
|
```
|
|
244
248
|
|
|
245
|
-
O script `pretest:e2e`
|
|
249
|
+
O script `pretest:e2e` aplica as migrations nos bancos relacionais ou envia o schema Prisma ao MongoDB antes de cada rodada. Cada teste limpa o banco antes de rodar (`test/utils/clean-database.ts`), então não precisa zerar nada manualmente entre execuções. Hoje cobrem o fluxo de autenticação completo (registro, login, refresh, logout, e-mail duplicado, credenciais inválidas) e o CRUD de usuários com RBAC (ADMIN consegue tudo, USER lê mas não cria, `/users/me`, acesso sem token).
|
|
246
250
|
|
|
247
251
|
Os testes unitários (`src/**/*.spec.ts`) rodam isolados, com Prisma e `ioredis` mockados (`vi.fn()` / `vi.mock()`) — não precisam de banco nem Redis de verdade. Hoje cobrem: `AuthService` (registro/login), `UsersService` (CRUD completo + paginação + confirma que o `passwordHash` não vaza na serialização via `instanceToPlain`), `RolesGuard` e `PermissionsGuard` (liberação/bloqueio, inclusive com múltiplas permissões exigidas ao mesmo tempo) e os indicadores de saúde (`PrismaHealthIndicator`, `RedisHealthIndicator`).
|
|
248
252
|
|
|
@@ -41,7 +41,11 @@ This roadmap makes it clear what is ready and where contributions are possible.
|
|
|
41
41
|
|
|
42
42
|
- [x] Prisma
|
|
43
43
|
- [x] PostgreSQL
|
|
44
|
-
- [x]
|
|
44
|
+
- [x] MySQL
|
|
45
|
+
- [x] SQLite
|
|
46
|
+
- [x] MongoDB
|
|
47
|
+
- [x] Migrations for relational databases
|
|
48
|
+
- [x] Schema synchronization with `prisma db push` for MongoDB
|
|
45
49
|
- [x] Complete seed (roles, permissions, administrator user)
|
|
46
50
|
|
|
47
51
|
## Infrastructure
|
|
@@ -36,7 +36,11 @@ Este roadmap existe para deixar claro o que já está pronto e onde dá pra cont
|
|
|
36
36
|
## Banco de dados
|
|
37
37
|
- [x] Prisma
|
|
38
38
|
- [x] PostgreSQL
|
|
39
|
-
- [x]
|
|
39
|
+
- [x] MySQL
|
|
40
|
+
- [x] SQLite
|
|
41
|
+
- [x] MongoDB
|
|
42
|
+
- [x] Migrations para bancos relacionais
|
|
43
|
+
- [x] Sincronização do schema com `prisma db push` para MongoDB
|
|
40
44
|
- [x] Seed completo (roles, permissions, usuário admin)
|
|
41
45
|
|
|
42
46
|
## Infra
|