@biggora/claude-plugins 1.2.2 → 1.3.1
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 +5 -1
- package/package.json +1 -1
- package/registry/registry.json +15 -0
- package/specs/coding.md +11 -0
- package/src/commands/skills/add.js +115 -31
- package/src/commands/skills/list.js +25 -52
- package/src/commands/skills/remove.js +45 -27
- package/src/commands/skills/resolve.js +104 -0
- package/src/commands/skills/update.js +58 -74
- package/src/config.js +5 -0
- package/src/skills/nest-best-practices/SKILL.md +251 -0
- package/src/skills/nest-best-practices/references/best-practices-request-lifecycle.md +158 -0
- package/src/skills/nest-best-practices/references/cli-monorepo.md +106 -0
- package/src/skills/nest-best-practices/references/cli-overview.md +157 -0
- package/src/skills/nest-best-practices/references/core-controllers.md +165 -0
- package/src/skills/nest-best-practices/references/core-dependency-injection.md +179 -0
- package/src/skills/nest-best-practices/references/core-middleware.md +139 -0
- package/src/skills/nest-best-practices/references/core-modules.md +138 -0
- package/src/skills/nest-best-practices/references/core-providers.md +188 -0
- package/src/skills/nest-best-practices/references/faq-raw-body-hybrid.md +122 -0
- package/src/skills/nest-best-practices/references/fundamentals-circular-dependency.md +89 -0
- package/src/skills/nest-best-practices/references/fundamentals-custom-decorators.md +107 -0
- package/src/skills/nest-best-practices/references/fundamentals-dynamic-modules.md +125 -0
- package/src/skills/nest-best-practices/references/fundamentals-exception-filters.md +202 -0
- package/src/skills/nest-best-practices/references/fundamentals-execution-context.md +107 -0
- package/src/skills/nest-best-practices/references/fundamentals-guards.md +136 -0
- package/src/skills/nest-best-practices/references/fundamentals-interceptors.md +187 -0
- package/src/skills/nest-best-practices/references/fundamentals-lazy-loading.md +89 -0
- package/src/skills/nest-best-practices/references/fundamentals-lifecycle-events.md +87 -0
- package/src/skills/nest-best-practices/references/fundamentals-module-reference.md +107 -0
- package/src/skills/nest-best-practices/references/fundamentals-pipes.md +197 -0
- package/src/skills/nest-best-practices/references/fundamentals-provider-scopes.md +92 -0
- package/src/skills/nest-best-practices/references/fundamentals-testing.md +142 -0
- package/src/skills/nest-best-practices/references/graphql-overview.md +233 -0
- package/src/skills/nest-best-practices/references/graphql-resolvers-mutations.md +199 -0
- package/src/skills/nest-best-practices/references/graphql-scalars-unions-enums.md +180 -0
- package/src/skills/nest-best-practices/references/graphql-subscriptions.md +228 -0
- package/src/skills/nest-best-practices/references/microservices-grpc.md +175 -0
- package/src/skills/nest-best-practices/references/microservices-overview.md +221 -0
- package/src/skills/nest-best-practices/references/microservices-transports.md +119 -0
- package/src/skills/nest-best-practices/references/openapi-swagger.md +207 -0
- package/src/skills/nest-best-practices/references/recipes-authentication.md +97 -0
- package/src/skills/nest-best-practices/references/recipes-cqrs.md +176 -0
- package/src/skills/nest-best-practices/references/recipes-crud-generator.md +87 -0
- package/src/skills/nest-best-practices/references/recipes-documentation.md +93 -0
- package/src/skills/nest-best-practices/references/recipes-mongoose.md +153 -0
- package/src/skills/nest-best-practices/references/recipes-prisma.md +98 -0
- package/src/skills/nest-best-practices/references/recipes-terminus.md +148 -0
- package/src/skills/nest-best-practices/references/recipes-typeorm.md +122 -0
- package/src/skills/nest-best-practices/references/security-authorization.md +196 -0
- package/src/skills/nest-best-practices/references/security-cors-helmet-rate-limiting.md +204 -0
- package/src/skills/nest-best-practices/references/security-encryption-hashing.md +93 -0
- package/src/skills/nest-best-practices/references/techniques-caching.md +142 -0
- package/src/skills/nest-best-practices/references/techniques-compression-streaming-sse.md +194 -0
- package/src/skills/nest-best-practices/references/techniques-configuration.md +132 -0
- package/src/skills/nest-best-practices/references/techniques-database.md +153 -0
- package/src/skills/nest-best-practices/references/techniques-events.md +163 -0
- package/src/skills/nest-best-practices/references/techniques-fastify.md +137 -0
- package/src/skills/nest-best-practices/references/techniques-file-upload.md +140 -0
- package/src/skills/nest-best-practices/references/techniques-http-module.md +176 -0
- package/src/skills/nest-best-practices/references/techniques-logging.md +146 -0
- package/src/skills/nest-best-practices/references/techniques-mvc-serve-static.md +132 -0
- package/src/skills/nest-best-practices/references/techniques-queues.md +162 -0
- package/src/skills/nest-best-practices/references/techniques-serialization.md +158 -0
- package/src/skills/nest-best-practices/references/techniques-sessions-cookies.md +167 -0
- package/src/skills/nest-best-practices/references/techniques-task-scheduling.md +166 -0
- package/src/skills/nest-best-practices/references/techniques-validation.md +126 -0
- package/src/skills/nest-best-practices/references/techniques-versioning.md +153 -0
- package/src/skills/nest-best-practices/references/websockets-advanced.md +96 -0
- package/src/skills/nest-best-practices/references/websockets-gateways.md +215 -0
- package/src/skills/typescript-expert/SKILL.md +145 -0
- package/src/skills/typescript-expert/commands/typescript-fix.md +65 -0
- package/src/skills/typescript-expert/references/advanced-conditional-types.md +190 -0
- package/src/skills/typescript-expert/references/advanced-decorators.md +243 -0
- package/src/skills/typescript-expert/references/advanced-mapped-types.md +223 -0
- package/src/skills/typescript-expert/references/advanced-template-literals.md +209 -0
- package/src/skills/typescript-expert/references/advanced-type-guards.md +308 -0
- package/src/skills/typescript-expert/references/best-practices-patterns.md +313 -0
- package/src/skills/typescript-expert/references/best-practices-performance.md +185 -0
- package/src/skills/typescript-expert/references/best-practices-tsconfig.md +242 -0
- package/src/skills/typescript-expert/references/core-generics.md +246 -0
- package/src/skills/typescript-expert/references/core-interfaces-types.md +231 -0
- package/src/skills/typescript-expert/references/core-type-system.md +261 -0
- package/src/skills/typescript-expert/references/core-utility-types.md +235 -0
- package/src/skills/typescript-expert/references/features-ts5x.md +370 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cli
|
|
3
|
+
description: NestJS CLI for scaffolding, building, and running applications
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Nest CLI
|
|
7
|
+
|
|
8
|
+
The Nest CLI helps initialize, develop, and maintain NestJS applications.
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g @nestjs/cli
|
|
14
|
+
# Or use npx
|
|
15
|
+
npx @nestjs/cli@latest
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Common Commands
|
|
19
|
+
|
|
20
|
+
| Command | Alias | Description |
|
|
21
|
+
|---------|-------|-------------|
|
|
22
|
+
| `nest new` | `n` | Create new application |
|
|
23
|
+
| `nest generate` | `g` | Generate components |
|
|
24
|
+
| `nest build` | | Compile application |
|
|
25
|
+
| `nest start` | | Run application |
|
|
26
|
+
| `nest add` | | Add library |
|
|
27
|
+
| `nest info` | `i` | Display system info |
|
|
28
|
+
|
|
29
|
+
## Creating a New Project
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
nest new my-project
|
|
33
|
+
cd my-project
|
|
34
|
+
npm run start:dev
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Generate Components
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Generate a module
|
|
41
|
+
nest g module users
|
|
42
|
+
|
|
43
|
+
# Generate a controller
|
|
44
|
+
nest g controller users
|
|
45
|
+
|
|
46
|
+
# Generate a service
|
|
47
|
+
nest g service users
|
|
48
|
+
|
|
49
|
+
# Generate a complete resource (CRUD)
|
|
50
|
+
nest g resource users
|
|
51
|
+
|
|
52
|
+
# Generate with specific path
|
|
53
|
+
nest g controller users/admin
|
|
54
|
+
|
|
55
|
+
# Dry run (preview without creating)
|
|
56
|
+
nest g controller users --dry-run
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Generator Schematics
|
|
60
|
+
|
|
61
|
+
| Schematic | Alias | Description |
|
|
62
|
+
|-----------|-------|-------------|
|
|
63
|
+
| `module` | `mo` | Module |
|
|
64
|
+
| `controller` | `co` | Controller |
|
|
65
|
+
| `service` | `s` | Service |
|
|
66
|
+
| `provider` | `pr` | Provider |
|
|
67
|
+
| `pipe` | `pi` | Pipe |
|
|
68
|
+
| `guard` | `gu` | Guard |
|
|
69
|
+
| `interceptor` | `itc` | Interceptor |
|
|
70
|
+
| `filter` | `f` | Exception filter |
|
|
71
|
+
| `decorator` | `d` | Custom decorator |
|
|
72
|
+
| `gateway` | `ga` | WebSocket gateway |
|
|
73
|
+
| `middleware` | `mi` | Middleware |
|
|
74
|
+
| `resource` | `res` | CRUD resource |
|
|
75
|
+
| `class` | `cl` | Class |
|
|
76
|
+
| `interface` | `itf` | Interface |
|
|
77
|
+
|
|
78
|
+
## Build and Run
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Development with watch mode
|
|
82
|
+
npm run start:dev
|
|
83
|
+
|
|
84
|
+
# Production build
|
|
85
|
+
npm run build
|
|
86
|
+
npm run start:prod
|
|
87
|
+
|
|
88
|
+
# Debug mode
|
|
89
|
+
npm run start:debug
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Project Structure
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
src/
|
|
96
|
+
├── app.controller.ts # Root controller
|
|
97
|
+
├── app.controller.spec.ts # Controller tests
|
|
98
|
+
├── app.module.ts # Root module
|
|
99
|
+
├── app.service.ts # Root service
|
|
100
|
+
└── main.ts # Entry point
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## nest-cli.json Configuration
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"collection": "@nestjs/schematics",
|
|
108
|
+
"sourceRoot": "src",
|
|
109
|
+
"compilerOptions": {
|
|
110
|
+
"deleteOutDir": true,
|
|
111
|
+
"webpack": false,
|
|
112
|
+
"tsConfigPath": "tsconfig.build.json"
|
|
113
|
+
},
|
|
114
|
+
"generateOptions": {
|
|
115
|
+
"spec": true
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## SWC Compiler (10x Faster)
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
npm install -D @swc/cli @swc/core
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```json
|
|
127
|
+
// nest-cli.json
|
|
128
|
+
{
|
|
129
|
+
"compilerOptions": {
|
|
130
|
+
"builder": "swc"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Monorepo Mode
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Convert to monorepo
|
|
139
|
+
nest generate app secondary-app
|
|
140
|
+
|
|
141
|
+
# Generate library
|
|
142
|
+
nest generate library shared
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Key Points
|
|
146
|
+
|
|
147
|
+
- Use `--dry-run` or `-d` flag to preview changes
|
|
148
|
+
- Use `--flat` flag to skip creating a subdirectory
|
|
149
|
+
- Use `--no-spec` flag to skip test file generation
|
|
150
|
+
- Use SWC for faster builds in development
|
|
151
|
+
- Generators automatically update module imports
|
|
152
|
+
|
|
153
|
+
<!--
|
|
154
|
+
Source references:
|
|
155
|
+
- https://docs.nestjs.com/cli/overview
|
|
156
|
+
- https://docs.nestjs.com/cli/usages
|
|
157
|
+
-->
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: core-controllers
|
|
3
|
+
description: NestJS controllers for handling HTTP requests and responses
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Controllers
|
|
7
|
+
|
|
8
|
+
Controllers are responsible for handling incoming HTTP requests and sending responses back to the client. They use decorators to define routes and handle different HTTP methods.
|
|
9
|
+
|
|
10
|
+
## Basic Controller
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import { Controller, Get } from '@nestjs/common';
|
|
14
|
+
|
|
15
|
+
@Controller('cats')
|
|
16
|
+
export class CatsController {
|
|
17
|
+
@Get()
|
|
18
|
+
findAll(): string {
|
|
19
|
+
return 'This action returns all cats';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## HTTP Method Decorators
|
|
25
|
+
|
|
26
|
+
Nest provides decorators for all standard HTTP methods:
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
@Controller('cats')
|
|
30
|
+
export class CatsController {
|
|
31
|
+
@Get()
|
|
32
|
+
findAll() {
|
|
33
|
+
return 'All cats';
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@Post()
|
|
37
|
+
create() {
|
|
38
|
+
return 'Create cat';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@Put(':id')
|
|
42
|
+
update(@Param('id') id: string) {
|
|
43
|
+
return `Update cat ${id}`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@Delete(':id')
|
|
47
|
+
remove(@Param('id') id: string) {
|
|
48
|
+
return `Remove cat ${id}`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@Patch(':id')
|
|
52
|
+
patch(@Param('id') id: string) {
|
|
53
|
+
return `Patch cat ${id}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Request Parameters
|
|
59
|
+
|
|
60
|
+
Use decorators to extract request data:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
@Controller('cats')
|
|
64
|
+
export class CatsController {
|
|
65
|
+
@Get(':id')
|
|
66
|
+
findOne(@Param('id') id: string) {
|
|
67
|
+
return `Cat ${id}`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@Post()
|
|
71
|
+
create(@Body() createCatDto: CreateCatDto) {
|
|
72
|
+
return this.catsService.create(createCatDto);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@Get()
|
|
76
|
+
findAll(@Query('breed') breed?: string) {
|
|
77
|
+
return this.catsService.findAll(breed);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@Get()
|
|
81
|
+
findWithHeaders(@Headers('authorization') auth: string) {
|
|
82
|
+
return this.catsService.find(auth);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Available Parameter Decorators
|
|
88
|
+
|
|
89
|
+
- `@Request()`, `@Req()` - Request object
|
|
90
|
+
- `@Response()`, `@Res()` - Response object (use with caution)
|
|
91
|
+
- `@Param(key?: string)` - Route parameters
|
|
92
|
+
- `@Body(key?: string)` - Request body
|
|
93
|
+
- `@Query(key?: string)` - Query parameters
|
|
94
|
+
- `@Headers(name?: string)` - Request headers
|
|
95
|
+
- `@Ip()` - Client IP address
|
|
96
|
+
- `@HostParam()` - Host parameters
|
|
97
|
+
- `@Session()` - Session object
|
|
98
|
+
|
|
99
|
+
## Status Codes and Headers
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
@Post()
|
|
103
|
+
@HttpCode(204)
|
|
104
|
+
@Header('Cache-Control', 'no-store')
|
|
105
|
+
create() {
|
|
106
|
+
return 'Created';
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@Get()
|
|
110
|
+
@Redirect('https://nestjs.com', 301)
|
|
111
|
+
redirect() {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Route Wildcards
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
@Get('abcd/*')
|
|
120
|
+
findAll() {
|
|
121
|
+
return 'Wildcard route';
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Sub-domain Routing
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
@Controller({ host: 'admin.example.com' })
|
|
129
|
+
export class AdminController {
|
|
130
|
+
@Get()
|
|
131
|
+
index(): string {
|
|
132
|
+
return 'Admin page';
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Async Handlers
|
|
138
|
+
|
|
139
|
+
Controllers can return Promises or Observables:
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
@Get()
|
|
143
|
+
async findAll(): Promise<Cat[]> {
|
|
144
|
+
return this.catsService.findAll();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@Get()
|
|
148
|
+
findAll(): Observable<Cat[]> {
|
|
149
|
+
return of([]);
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Key Points
|
|
154
|
+
|
|
155
|
+
- Controllers must be registered in a module's `controllers` array
|
|
156
|
+
- Use DTOs (Data Transfer Objects) for request body validation
|
|
157
|
+
- Prefer returning values over using `@Res()` for better compatibility
|
|
158
|
+
- Route parameters should be declared after static paths
|
|
159
|
+
- Use `@HttpCode()` to set custom status codes
|
|
160
|
+
- Use `@Header()` to set custom response headers
|
|
161
|
+
|
|
162
|
+
<!--
|
|
163
|
+
Source references:
|
|
164
|
+
- https://docs.nestjs.com/controllers
|
|
165
|
+
-->
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: core-dependency-injection
|
|
3
|
+
description: NestJS dependency injection system and custom providers
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Dependency Injection
|
|
7
|
+
|
|
8
|
+
NestJS uses dependency injection (DI) to manage dependencies between components. The DI container automatically resolves and injects dependencies.
|
|
9
|
+
|
|
10
|
+
## How DI Works
|
|
11
|
+
|
|
12
|
+
1. Provider is marked with `@Injectable()`
|
|
13
|
+
2. Consumer declares dependency in constructor
|
|
14
|
+
3. Provider is registered in module's `providers` array
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
// 1. Define provider
|
|
18
|
+
@Injectable()
|
|
19
|
+
export class CatsService {
|
|
20
|
+
findAll() {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// 2. Inject in consumer
|
|
26
|
+
@Controller('cats')
|
|
27
|
+
export class CatsController {
|
|
28
|
+
constructor(private catsService: CatsService) {}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// 3. Register in module
|
|
32
|
+
@Module({
|
|
33
|
+
providers: [CatsService],
|
|
34
|
+
controllers: [CatsController],
|
|
35
|
+
})
|
|
36
|
+
export class CatsModule {}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Standard Providers
|
|
40
|
+
|
|
41
|
+
Short-hand syntax:
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
providers: [CatsService]
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Is equivalent to:
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
providers: [
|
|
51
|
+
{
|
|
52
|
+
provide: CatsService,
|
|
53
|
+
useClass: CatsService,
|
|
54
|
+
},
|
|
55
|
+
]
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Custom Provider Types
|
|
59
|
+
|
|
60
|
+
### Value Providers
|
|
61
|
+
|
|
62
|
+
Inject constant values or mocks:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
const mockCatsService = {
|
|
66
|
+
findAll: () => ['test'],
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
@Module({
|
|
70
|
+
providers: [
|
|
71
|
+
{
|
|
72
|
+
provide: CatsService,
|
|
73
|
+
useValue: mockCatsService,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
})
|
|
77
|
+
export class AppModule {}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Class Providers
|
|
81
|
+
|
|
82
|
+
Dynamically select implementation:
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
const configServiceProvider = {
|
|
86
|
+
provide: ConfigService,
|
|
87
|
+
useClass: process.env.NODE_ENV === 'development'
|
|
88
|
+
? DevelopmentConfigService
|
|
89
|
+
: ProductionConfigService,
|
|
90
|
+
};
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Factory Providers
|
|
94
|
+
|
|
95
|
+
Create providers dynamically:
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
const connectionProvider = {
|
|
99
|
+
provide: 'CONNECTION',
|
|
100
|
+
useFactory: (optionsProvider: OptionsProvider, optional?: string) => {
|
|
101
|
+
const options = optionsProvider.get();
|
|
102
|
+
return new DatabaseConnection(options);
|
|
103
|
+
},
|
|
104
|
+
inject: [OptionsProvider, { token: 'SomeOptionalProvider', optional: true }],
|
|
105
|
+
};
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Alias Providers
|
|
109
|
+
|
|
110
|
+
Create aliases for existing providers:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
const loggerAliasProvider = {
|
|
114
|
+
provide: 'AliasedLoggerService',
|
|
115
|
+
useExisting: LoggerService,
|
|
116
|
+
};
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Non-class Tokens
|
|
120
|
+
|
|
121
|
+
Use strings, symbols, or enums as tokens:
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
@Module({
|
|
125
|
+
providers: [
|
|
126
|
+
{
|
|
127
|
+
provide: 'CONNECTION',
|
|
128
|
+
useValue: connection,
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
})
|
|
132
|
+
export class AppModule {}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Inject with `@Inject()`:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
@Injectable()
|
|
139
|
+
export class CatsRepository {
|
|
140
|
+
constructor(@Inject('CONNECTION') connection: Connection) {}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Exporting Custom Providers
|
|
145
|
+
|
|
146
|
+
Export by token:
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
@Module({
|
|
150
|
+
providers: [connectionFactory],
|
|
151
|
+
exports: ['CONNECTION'],
|
|
152
|
+
})
|
|
153
|
+
export class AppModule {}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Or export the full provider object:
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
@Module({
|
|
160
|
+
providers: [connectionFactory],
|
|
161
|
+
exports: [connectionFactory],
|
|
162
|
+
})
|
|
163
|
+
export class AppModule {}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Key Points
|
|
167
|
+
|
|
168
|
+
- DI container resolves dependencies automatically
|
|
169
|
+
- Dependencies are resolved transitively
|
|
170
|
+
- Use `@Inject()` for non-class tokens
|
|
171
|
+
- Factory providers can inject other providers
|
|
172
|
+
- Providers are cached as singletons by default
|
|
173
|
+
- Use `NEST_DEBUG` environment variable for DI debugging
|
|
174
|
+
|
|
175
|
+
<!--
|
|
176
|
+
Source references:
|
|
177
|
+
- https://docs.nestjs.com/fundamentals/custom-providers
|
|
178
|
+
- https://docs.nestjs.com/providers#dependency-injection
|
|
179
|
+
-->
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: core-middleware
|
|
3
|
+
description: NestJS middleware for request/response processing
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Middleware
|
|
7
|
+
|
|
8
|
+
Middleware functions are called before route handlers. They have access to request and response objects and can modify them or end the request-response cycle.
|
|
9
|
+
|
|
10
|
+
## Class-based Middleware
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import { Injectable, NestMiddleware } from '@nestjs/common';
|
|
14
|
+
import { Request, Response, NextFunction } from 'express';
|
|
15
|
+
|
|
16
|
+
@Injectable()
|
|
17
|
+
export class LoggerMiddleware implements NestMiddleware {
|
|
18
|
+
use(req: Request, res: Response, next: NextFunction) {
|
|
19
|
+
console.log('Request...');
|
|
20
|
+
next();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Functional Middleware
|
|
26
|
+
|
|
27
|
+
For simple middleware without dependencies:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { Request, Response, NextFunction } from 'express';
|
|
31
|
+
|
|
32
|
+
export function logger(req: Request, res: Response, next: NextFunction) {
|
|
33
|
+
console.log('Request...');
|
|
34
|
+
next();
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Applying Middleware
|
|
39
|
+
|
|
40
|
+
Use `configure()` method in module:
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
|
|
44
|
+
import { LoggerMiddleware } from './common/middleware/logger.middleware';
|
|
45
|
+
import { CatsModule } from './cats/cats.module';
|
|
46
|
+
|
|
47
|
+
@Module({
|
|
48
|
+
imports: [CatsModule],
|
|
49
|
+
})
|
|
50
|
+
export class AppModule implements NestModule {
|
|
51
|
+
configure(consumer: MiddlewareConsumer) {
|
|
52
|
+
consumer
|
|
53
|
+
.apply(LoggerMiddleware)
|
|
54
|
+
.forRoutes('cats');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Route-specific Middleware
|
|
60
|
+
|
|
61
|
+
Apply to specific routes:
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
consumer
|
|
65
|
+
.apply(LoggerMiddleware)
|
|
66
|
+
.forRoutes({ path: 'cats', method: RequestMethod.GET });
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Controller-based Middleware
|
|
70
|
+
|
|
71
|
+
Apply to entire controller:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
consumer
|
|
75
|
+
.apply(LoggerMiddleware)
|
|
76
|
+
.forRoutes(CatsController);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Excluding Routes
|
|
80
|
+
|
|
81
|
+
Exclude specific routes:
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
consumer
|
|
85
|
+
.apply(LoggerMiddleware)
|
|
86
|
+
.exclude(
|
|
87
|
+
{ path: 'cats', method: RequestMethod.GET },
|
|
88
|
+
{ path: 'cats', method: RequestMethod.POST },
|
|
89
|
+
'cats/{*splat}',
|
|
90
|
+
)
|
|
91
|
+
.forRoutes(CatsController);
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Multiple Middleware
|
|
95
|
+
|
|
96
|
+
Apply multiple middleware sequentially:
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
consumer
|
|
100
|
+
.apply(cors(), helmet(), logger)
|
|
101
|
+
.forRoutes(CatsController);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Global Middleware
|
|
105
|
+
|
|
106
|
+
Apply to all routes:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
const app = await NestFactory.create(AppModule);
|
|
110
|
+
app.use(logger);
|
|
111
|
+
await app.listen(3000);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Route Wildcards
|
|
115
|
+
|
|
116
|
+
Use wildcards in routes:
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
consumer
|
|
120
|
+
.apply(LoggerMiddleware)
|
|
121
|
+
.forRoutes({
|
|
122
|
+
path: 'abcd/*splat',
|
|
123
|
+
method: RequestMethod.ALL,
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Key Points
|
|
128
|
+
|
|
129
|
+
- Middleware runs before route handlers
|
|
130
|
+
- Use functional middleware when no dependencies needed
|
|
131
|
+
- Class middleware supports dependency injection
|
|
132
|
+
- Middleware can be route-specific or global
|
|
133
|
+
- Use `exclude()` to skip certain routes
|
|
134
|
+
- Global middleware cannot access DI container
|
|
135
|
+
|
|
136
|
+
<!--
|
|
137
|
+
Source references:
|
|
138
|
+
- https://docs.nestjs.com/middleware
|
|
139
|
+
-->
|