@koalarx/nest 3.0.2 → 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.
- package/CHANGELOG.md +6 -0
- package/README.md +504 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
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
|
+
[](https://opensource.org/licenses/MIT)
|
|
12
|
+
[](https://bun.sh)
|
|
13
|
+
[](https://www.typescriptlang.org/)
|
|
14
|
+
[](https://www.npmjs.com/package/@koalarx/nest-cli)
|
|
15
|
+
[](https://marketplace.visualstudio.com/items?itemName=koalarx.koala-libs-mcp-docs)
|
|
16
|
+
[](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>
|