@koalarx/nest 3.0.1 → 3.0.3

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.
Files changed (3) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +504 -0
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @koalarx/nest
2
2
 
3
+ ## 3.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - c87bce1: Ajuste no README ao realizar o build do KoalaNest
8
+
9
+ ## 3.0.2
10
+
11
+ ### Patch Changes
12
+
13
+ - a446e40: Incluindo README.md
14
+
3
15
  ## 3.0.1
4
16
 
5
17
  ### Patch Changes
package/README.md ADDED
@@ -0,0 +1,504 @@
1
+ <p align="center">
2
+ <a href="https://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="120" alt="Nest Logo" /></a>
3
+ </p>
4
+
5
+ <h1 align="center">@koalarx/nest</h1>
6
+
7
+ <p align="center">Uma abstração <a href="https://nestjs.com" target="_blank">NestJS</a> robusta para criar APIs escaláveis seguindo os princípios do Domain-Driven Design (DDD).</p>
8
+
9
+ <div align="center">
10
+
11
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
12
+ [![Bun](https://img.shields.io/badge/Bun-1.3%2B-black)](https://bun.sh)
13
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.1%2B-blue)](https://www.typescriptlang.org/)
14
+ [![CLI](https://img.shields.io/badge/CLI-@koalarx/nest--cli-brightgreen)](https://www.npmjs.com/package/@koalarx/nest-cli)
15
+ [![VS Code Extension](https://img.shields.io/badge/VS%20Code-MCP%20Extension-blue)](https://marketplace.visualstudio.com/items?itemName=koalarx.koala-libs-mcp-docs)
16
+ [![Documentation](https://img.shields.io/badge/📖-Docs-blue)](https://nest.koalarx.com/)
17
+
18
+ </div>
19
+
20
+ ## 📖 Documentação
21
+
22
+ Acesse a documentação completa e interativa em: **[nest.koalarx.com](https://nest.koalarx.com/)**
23
+
24
+ ## 🤖 Extensão VS Code com MCP
25
+
26
+ Acelere seu desenvolvimento com a **extensão oficial para VS Code**! Toda a documentação do Koala Nest integrada diretamente no GitHub Copilot através do Model Context Protocol.
27
+
28
+ **[📦 Instalar Extensão](https://marketplace.visualstudio.com/items?itemName=koalarx.koala-libs-mcp-docs)**
29
+
30
+ Basta instalar e perguntar ao Copilot sobre o Koala Nest - ele terá acesso instantâneo à documentação oficial!
31
+
32
+ > 💡 **Exemplo:** "Como criar um controller CRUD no Koala Nest?" - O Copilot responderá com base na documentação atualizada.
33
+
34
+ **[📖 Documentação da Extensão MCP](./docs/09-mcp-vscode-extension.md)**
35
+
36
+ ## 🎯 O que você consegue fazer com @koalarx/nest
37
+
38
+ - ✅ **Implementar APIs REST completas** com CRUD automático
39
+ - ✅ **AutoMapping** transparente entre Request, Entity e Response
40
+ - ✅ **Validação automática** com Zod integrado
41
+ - ✅ **Testes unitários e E2E** simplificados
42
+ - ✅ **CronJobs** com suporte a múltiplos pods via Redis
43
+ - ✅ **EventJobs** para processamento assíncrono de eventos
44
+ - ✅ **Paginação** automaticamente documentada
45
+ - ✅ **Documentação OpenAPI (Swagger ou Scalar)** automática
46
+
47
+ ## 📚 Documentação Completa
48
+
49
+ Toda a documentação está organizada em arquivos separados para facilitar a navegação:
50
+
51
+ | Documento | Descrição |
52
+ |-----------|-----------|
53
+ | [**EXAMPLE.md**](./docs/EXAMPLE.md) | **Exemplo prático completo** - API CRUD com todas as camadas DDD |
54
+ | [**CLI Reference**](./docs/00-cli-reference.md) | Guia da CLI oficial - Forma rápida de criar projetos |
55
+ | [**Guia de Instalação**](./docs/01-guia-instalacao.md) | Como instalar e configurar a biblioteca |
56
+ | [**Configuração Inicial**](./docs/02-configuracao-inicial.md) | Setup do projeto com KoalaNestModule e KoalaApp |
57
+ | [**Tratamento de Erros**](./docs/04-tratamento-erros.md) | Sistema robusto de tratamento e filtros de exceção |
58
+ | [**Features Avançadas**](./docs/05-features-avancadas.md) | Cron Jobs, Event Handlers, Redis, Transações e Padrões de Autenticação |
59
+ | [**Decoradores**](./docs/06-decoradores.md) | @IsPublic, @Upload, @Cookies e mais |
60
+ | [**Guia Bun**](./docs/07-guia-bun.md) | Por que Bun e como usá-lo |
61
+ | [**Prisma Client**](./docs/08-prisma-client.md) | Integração com Prisma |
62
+ | [**🤖 Extensão MCP**](./docs/09-mcp-vscode-extension.md) | **Extensão VS Code com integração ao Copilot** |
63
+
64
+ ## Quick Start
65
+
66
+ ### Usando Bun (Recomendado - Mais Rápido)
67
+
68
+ O projeto agora usa **Bun** como runtime JavaScript. Para instalar o Bun:
69
+
70
+ ```bash
71
+ # Instalar Bun (Windows, macOS, Linux)
72
+ curl -fsSL https://bun.sh/install | bash
73
+
74
+ # Ou em Windows com PowerShell:
75
+ powershell -Command "irm https://bun.sh/install.ps1 | iex"
76
+
77
+ # Instalar dependências
78
+ bun install
79
+
80
+ # Iniciar em modo desenvolvimento
81
+ bun run start:dev
82
+
83
+ # Executar testes
84
+ bun run test
85
+
86
+ # Fazer build
87
+ bun run build
88
+ ```
89
+
90
+ **Vantagens do Bun:**
91
+ - ⚡ Runtime ~3x mais rápido que Node.js
92
+ - 📦 Package manager integrado (mais rápido que npm)
93
+ - 🧪 Test runner nativo (compatível com Vitest)
94
+ - 🔄 Hot reload automático
95
+ - 💾 Menor consumo de memória
96
+
97
+ ### Forma Rápida com CLI (Recomendado)
98
+
99
+ ```bash
100
+ # Instalar a CLI globalmente
101
+ npm install -g @koalarx/nest-cli
102
+
103
+ # Criar novo projeto estruturado
104
+ koala-nest new meu-projeto
105
+
106
+ # Entrar na pasta
107
+ cd meu-projeto
108
+
109
+ # Iniciar em modo desenvolvimento (com Bun)
110
+ bun run start:dev
111
+ ```
112
+
113
+ **Pronto!** Seu projeto está estruturado com:
114
+ - [x] Módulo DDD configurado
115
+ - [x] Documentação da API (Scalar UI)
116
+ - [x] Tratamento de erros robusto
117
+ - [x] Banco de dados Prisma
118
+ - [x] Redis para background services
119
+
120
+ ### Forma Manual
121
+
122
+ > ⚠️ **Requisito Obrigatório**: A abstração de banco de dados da biblioteca requer **Prisma como ORM**.
123
+ >
124
+ > **💡 Dica**: Para um exemplo completo e funcionando, veja [docs/EXAMPLE.md](./docs/EXAMPLE.md)
125
+
126
+ ```bash
127
+ # Com Bun (Recomendado - Mais rápido)
128
+ bun install @koalarx/nest
129
+
130
+ # Ou com npm (Alternativa)
131
+ npm install @koalarx/nest
132
+ ```
133
+
134
+ ### 2. Criar Módulo Principal
135
+
136
+ ```typescript
137
+ // src/host/app.module.ts
138
+ import { KoalaNestModule } from '@koalarx/nest/core/koala-nest.module'
139
+ import { Module } from '@nestjs/common'
140
+ import { env } from '../core/env'
141
+ // Importar seus módulos de controllers
142
+ // import { PersonModule } from './controllers/person/person.module'
143
+
144
+ @Module({
145
+ imports: [
146
+ KoalaNestModule.register({
147
+ env,
148
+ // controllers: [PersonModule], // Adicione seus módulos aqui
149
+ }),
150
+ ],
151
+ })
152
+ export class AppModule {}
153
+ ```
154
+
155
+ ### 3. Inicializar Aplicação
156
+
157
+ ```typescript
158
+ // src/host/main.ts
159
+ import { NestFactory } from '@nestjs/core'
160
+ import { KoalaApp } from '@koalarx/nest/core/koala-app'
161
+ import { AppModule } from './app.module'
162
+ import { DbTransactionContext } from '@/infra/database/db-transaction-context'
163
+ import { setPrismaClientOptions } from '@koalarx/nest/core/database/prisma.service'
164
+ import { PrismaPg } from '@prisma/adapter-pg'
165
+ import { Pool } from 'pg'
166
+ import 'dotenv/config'
167
+
168
+ async function bootstrap() {
169
+ // Configurar Prisma com adapter PostgreSQL
170
+ const pool = new Pool({
171
+ connectionString: process.env.DATABASE_URL,
172
+ })
173
+ const adapter = new PrismaPg(pool)
174
+ setPrismaClientOptions({ adapter })
175
+
176
+ // Criar aplicação NestJS
177
+ const app = await NestFactory.create(AppModule)
178
+
179
+ // Configurar e iniciar KoalaApp
180
+ await new KoalaApp(app)
181
+ .useDoc({
182
+ ui: 'scalar',
183
+ endpoint: '/doc',
184
+ title: 'API de Demonstração',
185
+ version: '1.0',
186
+ })
187
+ .setAppName('example')
188
+ .setInternalUserName('integration.bot')
189
+ .setDbTransactionContext(DbTransactionContext)
190
+ .enableCors()
191
+ .buildAndServe()
192
+ }
193
+
194
+ bootstrap()
195
+ ```
196
+
197
+ ### 4. Executar
198
+
199
+ ```bash
200
+ npm run start:dev
201
+ ```
202
+
203
+ Acesse `http://localhost:3000/doc` para a documentação interativa!
204
+
205
+ ## Principais Features
206
+
207
+ ### Camadas DDD (Domain-Driven Design)
208
+
209
+ A biblioteca implementa um padrão com 4 camadas bem definidas:
210
+
211
+ 1. **Domain** - Entidades, DTOs e interfaces de repositório
212
+ 2. **Application** - Handlers com lógica de negócio, Validators, AutoMapping
213
+ 3. **Host** - Controllers REST que expõem os endpoints
214
+ 4. **Infra** - Repositórios concretos e acesso ao banco de dados
215
+
216
+ Veja [docs/EXAMPLE.md](./docs/EXAMPLE.md) para implementação completa.
217
+
218
+ ### AutoMapping Automático
219
+
220
+ Converte Request → Entity → Response transparentemente:
221
+
222
+ ```typescript
223
+ // Define os mapeamentos
224
+ createMap(CreatePersonRequest, Person)
225
+ createMap(Person, ReadPersonResponse)
226
+
227
+ // Usa automaticamente
228
+ const person = mapper.map(request, CreatePersonRequest, Person)
229
+ const response = mapper.map(entity, Person, ReadPersonResponse)
230
+ ```
231
+
232
+ ### Validação com Zod
233
+
234
+ Validação tipada integrada com transformação de dados:
235
+
236
+ ```typescript
237
+ export class CreatePersonValidator extends RequestValidatorBase<CreatePersonRequest> {
238
+ protected get schema(): ZodType<any, ZodTypeDef, any> {
239
+ return z.object({
240
+ name: z.string(),
241
+ phones: z.array(z.object({ phone: z.string() })),
242
+ address: z.object({ address: z.string() }),
243
+ })
244
+ }
245
+ }
246
+ ```
247
+
248
+ ### Handlers e RequestResult
249
+
250
+ Padrão funcional para tratamento de sucesso/erro:
251
+
252
+ ```typescript
253
+ @Injectable()
254
+ export class CreatePersonHandler extends RequestHandlerBase<...> {
255
+ async handle(req: CreatePersonRequest): Promise<RequestResult<Error, CreatePersonResponse>> {
256
+ const person = this.mapper.map(
257
+ new CreatePersonValidator(req).validate(),
258
+ CreatePersonRequest,
259
+ Person,
260
+ )
261
+ const result = await this.repository.save(person)
262
+ return ok({ id: result.id })
263
+ }
264
+ }
265
+
266
+ // Controller
267
+ const response = await handler.handle(request)
268
+ if (response.isFailure()) {
269
+ throw response.value
270
+ }
271
+ return response.value
272
+ ```
273
+
274
+ ### Paginação Automática
275
+
276
+ Queries com paginação documentada automaticamente:
277
+
278
+ ```typescript
279
+ // Requisição
280
+ GET /person?name=John&active=true&page=1&pageSize=10
281
+
282
+ // Response com count
283
+ {
284
+ "items": [...],
285
+ "count": 5
286
+ }
287
+ ```
288
+
289
+ ### CronJobs com Redis (Sincronização)
290
+
291
+ Tarefas agendadas com lock automático via RedLock em ambientes multi-pod:
292
+
293
+ ```typescript
294
+ @Injectable()
295
+ export class DeleteInactiveJob extends CronJobHandlerBase {
296
+ protected async settings(): Promise<CronJobSettings> {
297
+ return {
298
+ isActive: true,
299
+ timeInMinutes: 1,
300
+ }
301
+ }
302
+
303
+ protected async run(): Promise<CronJobResponse> {
304
+ // Executa apenas em um pod por vez
305
+ const result = await this.readManyPerson.handle(
306
+ new ReadManyPersonDto({ active: false })
307
+ )
308
+
309
+ if (result.isOk()) {
310
+ for (const person of result.value.items) {
311
+ await this.deletePerson.handle(person.id)
312
+ }
313
+ }
314
+
315
+ return ok(null)
316
+ }
317
+ }
318
+ ```
319
+
320
+ ### EventJobs - Processamento Assíncrono
321
+
322
+ Processamento de eventos assincronamente:
323
+
324
+ ```typescript
325
+ export class PersonEventJob extends EventJob<Person> {
326
+ defineHandlers(): Type<EventHandlerBase>[] {
327
+ return [InactivePersonHandler]
328
+ }
329
+ }
330
+
331
+ @Injectable()
332
+ export class InactivePersonHandler extends EventHandlerBase {
333
+ async handleEvent(): Promise<void> {
334
+ const result = await this.repository.readMany(
335
+ new ReadManyPersonDto({ active: true })
336
+ )
337
+
338
+ for (const person of result.items) {
339
+ person.active = false
340
+ await this.repository.save(person)
341
+ }
342
+ }
343
+ }
344
+
345
+ // Registrar na aplicação
346
+ .addEventJob(InactivePersonHandler)
347
+ ```
348
+
349
+ ### Testes Unitários
350
+
351
+ Setup simplificado com dependências injetadas:
352
+
353
+ ```typescript
354
+ describe('CreatePersonHandler', () => {
355
+ const app = createUnitTestApp()
356
+
357
+ it('should create a person', async () => {
358
+ const handler = app.get(CreatePersonHandler)
359
+ const result = await handler.handle(createPersonRequestMockup)
360
+
361
+ expect(result.isOk()).toBeTruthy()
362
+ if (result.isOk()) {
363
+ expect(result.value).toEqual({
364
+ id: expect.any(Number),
365
+ })
366
+ }
367
+ })
368
+ })
369
+ ```
370
+
371
+ ### Testes E2E
372
+
373
+ Testes de integração completos:
374
+
375
+ ```typescript
376
+ const app = await createE2ETestApp()
377
+
378
+ it('should create a person', async () => {
379
+ const response = await request(app.getHttpServer())
380
+ .post('/person')
381
+ .send({
382
+ name: 'John Doe',
383
+ phones: [],
384
+ address: { address: 'Street 1' },
385
+ })
386
+
387
+ expect(response.statusCode).toBe(201)
388
+ expect(response.body.id).toBeDefined()
389
+ })
390
+ ```
391
+
392
+ ## Exemplo Prático Completo
393
+
394
+ Veja em [docs/EXAMPLE.md](./docs/EXAMPLE.md) um CRUD completo de **Pessoa** implementado com:
395
+
396
+ - ✅ Entidades (Person, PersonAddress, PersonPhone)
397
+ - ✅ DTOs com paginação (ReadManyPersonDto)
398
+ - ✅ 5 Handlers (Create, Read, ReadMany, Update, Delete)
399
+ - ✅ 5 Controllers REST
400
+ - ✅ Repository com Prisma
401
+ - ✅ Testes unitários e E2E
402
+ - ✅ CronJobs e EventJobs
403
+ - ✅ AutoMapping automático
404
+ - ✅ Validação com Zod
405
+
406
+ ## Estrutura de Projeto Recomendada
407
+
408
+ Seguindo DDD conforme implementado no exemplo:
409
+
410
+ ```
411
+ apps/
412
+ ├── example/ # Projeto exemplo
413
+ │ └── src/
414
+ │ ├── domain/ # Entidades, DTOs, Interfaces
415
+ │ ├── application/ # Handlers, Validators, Mapping
416
+ │ ├── host/ # Controllers, Roteamento
417
+ │ ├── infra/ # Repositories, Database
418
+ │ ├── core/ # Configuração
419
+ │ └── test/ # Setup de testes
420
+ └── koala-nest/ # Biblioteca principal
421
+
422
+ prisma/
423
+ ├── schema.prisma # Modelo de dados
424
+ ├── migrations/ # Histórico de migrações
425
+ └── generated/ # Cliente Prisma gerado
426
+ ```
427
+
428
+ ## Configuração de Ambiente
429
+
430
+ Crie seu `.env`:
431
+
432
+ ```env
433
+ # Banco de dados
434
+ DATABASE_URL=postgresql://user:password@localhost:5432/koala_db
435
+
436
+ # Aplicação
437
+ NODE_ENV=develop
438
+
439
+ # Prisma (opcional - habilita logs das queries)
440
+ PRISMA_QUERY_LOG=true
441
+
442
+ # Swagger/Scalar (opcional)
443
+ SWAGGER_USERNAME=admin
444
+ SWAGGER_PASSWORD=password123
445
+
446
+ # Redis (opcional - necessário para CronJobs em múltiplas instâncias)
447
+ REDIS_CONNECTION_STRING=redis://localhost:6379
448
+ ```
449
+
450
+ Consulte [docs/02-configuracao-inicial.md](./docs/02-configuracao-inicial.md) para mais detalhes.
451
+
452
+ ## Recursos Adicionais
453
+
454
+ A biblioteca inclui vários decoradores e utilitários para facilitar o desenvolvimento:
455
+
456
+ - **@ApiPropertyEnum()** - Documente enums corretamente no Swagger
457
+ - **@ApiPropertyOnlyDevelop()** - Propriedades apenas em ambiente de desenvolvimento
458
+ - **@ApiExcludeEndpointDiffDevelop()** - Endpoints apenas em dev (excluídos em produção)
459
+ - **@Upload()** - Documentação automática de uploads de arquivos
460
+ - **@Cookies()** - Extrai cookies da requisição HTTP
461
+ - **@IsPublic()** - Marca endpoint como público (sem validação de token)
462
+
463
+ Veja [docs/06-decoradores.md](./docs/06-decoradores.md) para documentação completa.
464
+
465
+ ## Arquitetura
466
+
467
+ A biblioteca utiliza duas classes principais:
468
+
469
+ 1. **KoalaNestModule** - Módulo NestJS com configuração
470
+ 2. **KoalaApp** - Classe fluent para setup da aplicação
471
+
472
+ Ambas seguem o padrão de **Fluent Interface** para configuração clara e intuitiva.
473
+
474
+ ## Dependências Principais
475
+
476
+ - `@nestjs/*` - Framework NestJS
477
+ - `@prisma/client` - ORM Prisma
478
+ - `zod` - Validação de dados
479
+ - `ioredis` - Cliente Redis
480
+ - `@nestjs/swagger` - Documentação automática
481
+
482
+ ## Links Importantes
483
+
484
+ - **[CLI (@koalarx/nest-cli)](https://www.npmjs.com/package/@koalarx/nest-cli)** - Ferramenta oficial para criar projetos rapidamente
485
+ - **[GitHub da Library](https://github.com/igordrangel/koala-nest)** - Repositório principal
486
+ - **[GitHub da CLI](https://github.com/igordrangel/koala-nest-cli)** - Repositório da CLI
487
+
488
+ ## Licença
489
+
490
+ MIT License © 2023-2025 Igor D. Rangel
491
+
492
+ ## Contribuindo
493
+
494
+ Contribuições são bem-vindas! Abra uma issue ou pull request no repositório.
495
+
496
+ ## Suporte
497
+
498
+ Para dúvidas, abra uma issue no repositório ou consulte a [documentação completa](./docs).
499
+
500
+ ---
501
+
502
+ <p align="center">
503
+ Feito para desenvolvedores NestJS
504
+ </p>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koalarx/nest",
3
- "version": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "description": "",
5
5
  "author": "Igor D. Rangel",
6
6
  "license": "MIT",