@dangao/bun-server 1.7.0 → 1.8.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 +196 -19
- package/dist/cache/cache-module.d.ts +18 -0
- package/dist/cache/cache-module.d.ts.map +1 -1
- package/dist/cache/index.d.ts +3 -1
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/interceptors.d.ts +41 -0
- package/dist/cache/interceptors.d.ts.map +1 -0
- package/dist/cache/service-proxy.d.ts +62 -0
- package/dist/cache/service-proxy.d.ts.map +1 -0
- package/dist/controller/controller.d.ts +8 -0
- package/dist/controller/controller.d.ts.map +1 -1
- package/dist/core/application.d.ts +5 -0
- package/dist/core/application.d.ts.map +1 -1
- package/dist/di/container.d.ts +18 -1
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/decorators.d.ts +37 -0
- package/dist/di/decorators.d.ts.map +1 -1
- package/dist/di/index.d.ts +2 -2
- package/dist/di/index.d.ts.map +1 -1
- package/dist/di/module-registry.d.ts +17 -0
- package/dist/di/module-registry.d.ts.map +1 -1
- package/dist/di/types.d.ts +22 -0
- package/dist/di/types.d.ts.map +1 -1
- package/dist/events/decorators.d.ts +52 -0
- package/dist/events/decorators.d.ts.map +1 -0
- package/dist/events/event-module.d.ts +97 -0
- package/dist/events/event-module.d.ts.map +1 -0
- package/dist/events/index.d.ts +5 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/service.d.ts +76 -0
- package/dist/events/service.d.ts.map +1 -0
- package/dist/events/types.d.ts +184 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4641 -2840
- package/dist/security/filter.d.ts +23 -0
- package/dist/security/filter.d.ts.map +1 -1
- package/dist/security/guards/builtin/auth-guard.d.ts +44 -0
- package/dist/security/guards/builtin/auth-guard.d.ts.map +1 -0
- package/dist/security/guards/builtin/index.d.ts +3 -0
- package/dist/security/guards/builtin/index.d.ts.map +1 -0
- package/dist/security/guards/builtin/roles-guard.d.ts +66 -0
- package/dist/security/guards/builtin/roles-guard.d.ts.map +1 -0
- package/dist/security/guards/decorators.d.ts +50 -0
- package/dist/security/guards/decorators.d.ts.map +1 -0
- package/dist/security/guards/execution-context.d.ts +56 -0
- package/dist/security/guards/execution-context.d.ts.map +1 -0
- package/dist/security/guards/guard-registry.d.ts +67 -0
- package/dist/security/guards/guard-registry.d.ts.map +1 -0
- package/dist/security/guards/index.d.ts +7 -0
- package/dist/security/guards/index.d.ts.map +1 -0
- package/dist/security/guards/reflector.d.ts +57 -0
- package/dist/security/guards/reflector.d.ts.map +1 -0
- package/dist/security/guards/types.d.ts +126 -0
- package/dist/security/guards/types.d.ts.map +1 -0
- package/dist/security/index.d.ts +1 -0
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/security-module.d.ts +20 -0
- package/dist/security/security-module.d.ts.map +1 -1
- package/dist/validation/class-validator.d.ts +108 -0
- package/dist/validation/class-validator.d.ts.map +1 -0
- package/dist/validation/custom-validator.d.ts +130 -0
- package/dist/validation/custom-validator.d.ts.map +1 -0
- package/dist/validation/errors.d.ts +22 -2
- package/dist/validation/errors.d.ts.map +1 -1
- package/dist/validation/index.d.ts +7 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/rules/array.d.ts +33 -0
- package/dist/validation/rules/array.d.ts.map +1 -0
- package/dist/validation/rules/common.d.ts +90 -0
- package/dist/validation/rules/common.d.ts.map +1 -0
- package/dist/validation/rules/conditional.d.ts +30 -0
- package/dist/validation/rules/conditional.d.ts.map +1 -0
- package/dist/validation/rules/index.d.ts +5 -0
- package/dist/validation/rules/index.d.ts.map +1 -0
- package/dist/validation/rules/object.d.ts +30 -0
- package/dist/validation/rules/object.d.ts.map +1 -0
- package/dist/validation/types.d.ts +52 -1
- package/dist/validation/types.d.ts.map +1 -1
- package/docs/events.md +494 -0
- package/docs/guards.md +376 -0
- package/docs/guide.md +309 -1
- package/docs/request-lifecycle.md +444 -0
- package/docs/symbol-interface-pattern.md +431 -0
- package/docs/validation.md +407 -0
- package/docs/zh/events.md +494 -0
- package/docs/zh/guards.md +376 -0
- package/docs/zh/guide.md +309 -1
- package/docs/zh/request-lifecycle.md +444 -0
- package/docs/zh/symbol-interface-pattern.md +431 -0
- package/docs/zh/validation.md +407 -0
- package/package.json +1 -1
- package/src/cache/cache-module.ts +37 -0
- package/src/cache/index.ts +16 -1
- package/src/cache/interceptors.ts +295 -0
- package/src/cache/service-proxy.ts +219 -0
- package/src/controller/controller.ts +30 -6
- package/src/core/application.ts +25 -1
- package/src/di/container.ts +57 -7
- package/src/di/decorators.ts +46 -0
- package/src/di/index.ts +17 -2
- package/src/di/module-registry.ts +39 -0
- package/src/di/types.ts +29 -0
- package/src/events/decorators.ts +103 -0
- package/src/events/event-module.ts +272 -0
- package/src/events/index.ts +32 -0
- package/src/events/service.ts +352 -0
- package/src/events/types.ts +223 -0
- package/src/index.ts +140 -1
- package/src/security/filter.ts +88 -8
- package/src/security/guards/builtin/auth-guard.ts +68 -0
- package/src/security/guards/builtin/index.ts +3 -0
- package/src/security/guards/builtin/roles-guard.ts +165 -0
- package/src/security/guards/decorators.ts +124 -0
- package/src/security/guards/execution-context.ts +152 -0
- package/src/security/guards/guard-registry.ts +164 -0
- package/src/security/guards/index.ts +7 -0
- package/src/security/guards/reflector.ts +99 -0
- package/src/security/guards/types.ts +144 -0
- package/src/security/index.ts +1 -0
- package/src/security/security-module.ts +72 -2
- package/src/validation/class-validator.ts +322 -0
- package/src/validation/custom-validator.ts +289 -0
- package/src/validation/errors.ts +50 -2
- package/src/validation/index.ts +103 -1
- package/src/validation/rules/array.ts +118 -0
- package/src/validation/rules/common.ts +286 -0
- package/src/validation/rules/conditional.ts +52 -0
- package/src/validation/rules/index.ts +51 -0
- package/src/validation/rules/object.ts +86 -0
- package/src/validation/types.ts +61 -1
- package/tests/cache/cache-decorators.test.ts +284 -0
- package/tests/controller/path-combination.test.ts +353 -0
- package/tests/di/global-module.test.ts +487 -0
- package/tests/events/event-decorators.test.ts +173 -0
- package/tests/events/event-emitter.test.ts +373 -0
- package/tests/events/event-module.test.ts +373 -0
- package/tests/security/guards/guards-integration.test.ts +371 -0
- package/tests/security/guards/guards.test.ts +775 -0
- package/tests/security/security-module.test.ts +2 -2
- package/tests/validation/class-validator.test.ts +349 -0
- package/tests/validation/custom-validator.test.ts +335 -0
- package/tests/validation/rules.test.ts +543 -0
package/README.md
CHANGED
|
@@ -49,16 +49,117 @@
|
|
|
49
49
|
|
|
50
50
|
## Architecture
|
|
51
51
|
|
|
52
|
+
### Request Lifecycle
|
|
53
|
+
|
|
54
|
+
The following diagram shows the complete request processing flow:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
HTTP Request
|
|
58
|
+
↓
|
|
59
|
+
┌─────────────────────────────────────┐
|
|
60
|
+
│ Middleware Pipeline │ ← Global → Module → Controller → Method
|
|
61
|
+
│ (Logger, CORS, RateLimit, etc.) │
|
|
62
|
+
└─────────────────────────────────────┘
|
|
63
|
+
↓
|
|
64
|
+
┌─────────────────────────────────────┐
|
|
65
|
+
│ Security Filter │ ← Authentication / Authorization
|
|
66
|
+
│ (JWT, OAuth2, Role Check) │
|
|
67
|
+
└─────────────────────────────────────┘
|
|
68
|
+
↓
|
|
69
|
+
┌─────────────────────────────────────┐
|
|
70
|
+
│ Router Matching │ ← Path, Method, Params
|
|
71
|
+
│ (Static → Dynamic → Wildcard) │
|
|
72
|
+
└─────────────────────────────────────┘
|
|
73
|
+
↓
|
|
74
|
+
┌─────────────────────────────────────┐
|
|
75
|
+
│ Interceptors (Pre) │ ← Global → Controller → Method
|
|
76
|
+
│ (Cache, Log, Transform) │
|
|
77
|
+
└─────────────────────────────────────┘
|
|
78
|
+
↓
|
|
79
|
+
┌─────────────────────────────────────┐
|
|
80
|
+
│ Parameter Binding │ ← @Body, @Query, @Param, @Header
|
|
81
|
+
│ + Validation │ ← @Validate, IsString, IsEmail...
|
|
82
|
+
└─────────────────────────────────────┘
|
|
83
|
+
↓
|
|
84
|
+
┌─────────────────────────────────────┐
|
|
85
|
+
│ Controller Method │ ← Business Logic Execution
|
|
86
|
+
│ (with DI injected services) │
|
|
87
|
+
└─────────────────────────────────────┘
|
|
88
|
+
↓
|
|
89
|
+
┌─────────────────────────────────────┐
|
|
90
|
+
│ Interceptors (Post) │ ← Method → Controller → Global
|
|
91
|
+
│ (Response Transform) │
|
|
92
|
+
└─────────────────────────────────────┘
|
|
93
|
+
↓
|
|
94
|
+
┌─────────────────────────────────────┐
|
|
95
|
+
│ Exception Filter │ ← Exception Handling
|
|
96
|
+
│ (HttpException, ValidationError) │
|
|
97
|
+
└─────────────────────────────────────┘
|
|
98
|
+
↓
|
|
99
|
+
HTTP Response
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Execution Order**: Middleware → Security → Router → Interceptors(Pre) →
|
|
103
|
+
Validation → Handler → Interceptors(Post) → Exception Filter
|
|
104
|
+
|
|
105
|
+
### Module System
|
|
106
|
+
|
|
52
107
|
```
|
|
53
|
-
Application
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
108
|
+
Application
|
|
109
|
+
│
|
|
110
|
+
├── ModuleRegistry
|
|
111
|
+
│ │
|
|
112
|
+
│ ├── ConfigModule (Configuration)
|
|
113
|
+
│ ├── LoggerModule (Logging)
|
|
114
|
+
│ ├── SecurityModule (Authentication)
|
|
115
|
+
│ │ └── auth/ (JWT, OAuth2)
|
|
116
|
+
│ ├── SwaggerModule (API Docs)
|
|
117
|
+
│ ├── CacheModule (Caching)
|
|
118
|
+
│ ├── DatabaseModule (Database)
|
|
119
|
+
│ │ └── ORM (Entity, Repository, Transaction)
|
|
120
|
+
│ ├── QueueModule (Job Queue)
|
|
121
|
+
│ ├── SessionModule (Session)
|
|
122
|
+
│ ├── MetricsModule (Metrics)
|
|
123
|
+
│ ├── HealthModule (Health Check)
|
|
124
|
+
│ └── Microservice/
|
|
125
|
+
│ ├── ConfigCenterModule
|
|
126
|
+
│ ├── ServiceRegistryModule
|
|
127
|
+
│ ├── ServiceClient
|
|
128
|
+
│ ├── Governance (Circuit Breaker/Rate Limit/Retry)
|
|
129
|
+
│ └── Tracing
|
|
130
|
+
│
|
|
131
|
+
├── ControllerRegistry
|
|
132
|
+
│ └── All module controllers
|
|
133
|
+
│
|
|
134
|
+
├── WebSocketGatewayRegistry
|
|
135
|
+
│ └── WebSocket gateways
|
|
136
|
+
│
|
|
137
|
+
└── InterceptorRegistry
|
|
138
|
+
└── Interceptor registry
|
|
60
139
|
```
|
|
61
140
|
|
|
141
|
+
### DI Container
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
Container
|
|
145
|
+
│
|
|
146
|
+
├── providers (Map<token, ProviderConfig>)
|
|
147
|
+
│ ├── Singleton (shared globally)
|
|
148
|
+
│ ├── Transient (new instance per resolve)
|
|
149
|
+
│ └── Scoped (per-request instance)
|
|
150
|
+
│
|
|
151
|
+
├── singletons (singleton instance cache)
|
|
152
|
+
│
|
|
153
|
+
├── scopedInstances (WeakMap, request-level cache)
|
|
154
|
+
│
|
|
155
|
+
├── dependencyPlans (dependency resolution plan cache)
|
|
156
|
+
│
|
|
157
|
+
└── postProcessors (instance post-processors)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
For detailed lifecycle documentation, see
|
|
161
|
+
[Request Lifecycle](./docs/request-lifecycle.md).
|
|
162
|
+
|
|
62
163
|
## Getting Started
|
|
63
164
|
|
|
64
165
|
### Requirements
|
|
@@ -78,7 +179,10 @@ Application (Controllers / Modules / DI)
|
|
|
78
179
|
}
|
|
79
180
|
```
|
|
80
181
|
|
|
81
|
-
Without these, dependency injection will fail (injected services will be
|
|
182
|
+
Without these, dependency injection will fail (injected services will be
|
|
183
|
+
`undefined`). See
|
|
184
|
+
[Troubleshooting Guide](./docs/troubleshooting.md#-critical-injected-dependencies-are-undefined)
|
|
185
|
+
for details.
|
|
82
186
|
|
|
83
187
|
### Install
|
|
84
188
|
|
|
@@ -117,14 +221,14 @@ app.listen();
|
|
|
117
221
|
### Useful scripts
|
|
118
222
|
|
|
119
223
|
```bash
|
|
120
|
-
bun --cwd=packages
|
|
121
|
-
bun --cwd=packages
|
|
122
|
-
bun --cwd=packages
|
|
123
|
-
bun --cwd=packages
|
|
224
|
+
bun --cwd=packages/bun-server test
|
|
225
|
+
bun --cwd=packages/bun-server run bench
|
|
226
|
+
bun --cwd=packages/bun-server run bench:router
|
|
227
|
+
bun --cwd=packages/bun-server run bench:di
|
|
124
228
|
```
|
|
125
229
|
|
|
126
230
|
> Running `bun test` from the repo root fails because Bun only scans the current
|
|
127
|
-
> workspace. Use the commands above or `cd packages
|
|
231
|
+
> workspace. Use the commands above or `cd packages/bun-server` first.
|
|
128
232
|
|
|
129
233
|
### Advanced Example: Interface + Symbol + Module
|
|
130
234
|
|
|
@@ -249,11 +353,84 @@ app.listen();
|
|
|
249
353
|
|
|
250
354
|
## Examples & Extensions
|
|
251
355
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
356
|
+
### 📚 Organized Examples
|
|
357
|
+
|
|
358
|
+
Examples are organized by difficulty and feature category:
|
|
359
|
+
|
|
360
|
+
- **[Quick Start](./examples/00-quick-start/)** - Get started in 5 minutes
|
|
361
|
+
- `01-hello-world.ts` - Minimal example (5 lines)
|
|
362
|
+
- `02-basic-routing.ts` - HTTP methods and route parameters
|
|
363
|
+
- `03-dependency-injection.ts` - DI basics with services
|
|
364
|
+
|
|
365
|
+
- **[Core Features](./examples/01-core-features/)** - Deep dive into framework
|
|
366
|
+
mechanics
|
|
367
|
+
- `basic-app.ts` - DI + Logger + Swagger + Config integration
|
|
368
|
+
- `multi-module-app.ts` - Module dependencies and organization
|
|
369
|
+
- `context-scope-app.ts` - Request scoping and ContextService
|
|
370
|
+
- `full-app.ts` - Validation, uploads, static files, WebSocket
|
|
371
|
+
|
|
372
|
+
- **[Official Modules](./examples/02-official-modules/)** - Ready-to-use modules
|
|
373
|
+
- `auth-app.ts` - JWT + OAuth2 authentication (with Web UI)
|
|
374
|
+
- `session-app.ts` - Session management
|
|
375
|
+
- `database-app.ts` - Database connection and queries
|
|
376
|
+
- `orm-app.ts` - Entity + Repository pattern
|
|
377
|
+
- `cache-app.ts` - Caching with decorators
|
|
378
|
+
- `queue-app.ts` - Task queues and Cron jobs
|
|
379
|
+
|
|
380
|
+
- **[Advanced](./examples/03-advanced/)** - Custom framework extensions
|
|
381
|
+
- `custom-decorator-app.ts` - Create custom decorators
|
|
382
|
+
- `websocket-chat-app.ts` - Complete WebSocket chat with rooms (with Web UI)
|
|
383
|
+
- `microservice-app.ts` - Microservices architecture
|
|
384
|
+
|
|
385
|
+
- **[Real World](./examples/04-real-world/)** - Production-ready examples
|
|
386
|
+
- `database-test-app.ts` - Database connection tester (Web UI)
|
|
387
|
+
- `perf/app.ts` - Performance benchmarking
|
|
388
|
+
|
|
389
|
+
### 🔑 Symbol + Interface Pattern
|
|
390
|
+
|
|
391
|
+
This framework features a unique **Symbol + Interface co-naming pattern** that
|
|
392
|
+
solves TypeScript's type erasure problem:
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
// 1. Define interface and Symbol with same name
|
|
396
|
+
interface UserService {
|
|
397
|
+
find(id: string): Promise<User>;
|
|
398
|
+
}
|
|
399
|
+
const UserService = Symbol('UserService');
|
|
400
|
+
|
|
401
|
+
// 2. Implement interface
|
|
402
|
+
@Injectable()
|
|
403
|
+
class UserServiceImpl implements UserService {
|
|
404
|
+
async find(id: string) { ... }
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// 3. Register with Symbol token
|
|
408
|
+
@Module({
|
|
409
|
+
providers: [{
|
|
410
|
+
provide: UserService, // Symbol token
|
|
411
|
+
useClass: UserServiceImpl, // Implementation
|
|
412
|
+
}],
|
|
413
|
+
})
|
|
414
|
+
|
|
415
|
+
// 4. Inject with type safety
|
|
416
|
+
constructor(private readonly userService: UserService) {}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Key**: Import as `import { UserService }` (not `import type { UserService }`).
|
|
420
|
+
|
|
421
|
+
See [Symbol + Interface Pattern Guide](./docs/symbol-interface-pattern.md) for
|
|
422
|
+
details.
|
|
423
|
+
|
|
424
|
+
### 🔌 Extensions
|
|
425
|
+
|
|
426
|
+
- `packages/bun-server/src/extensions/`: Official extensions (e.g.
|
|
255
427
|
`LoggerExtension`) for plugging in external capabilities.
|
|
256
428
|
|
|
429
|
+
### 📖 Complete Example Index
|
|
430
|
+
|
|
431
|
+
See [examples/README.md](./examples/README.md) for the complete catalog with
|
|
432
|
+
learning paths, difficulty ratings, and usage scenarios.
|
|
433
|
+
|
|
257
434
|
## Benchmark Suite
|
|
258
435
|
|
|
259
436
|
Benchmarks live in `benchmark/` and rely on `PerformanceHarness` &
|
|
@@ -278,14 +455,14 @@ Or use `bun run bench*` scripts for convenience.
|
|
|
278
455
|
- **English** (default): `docs/api.md`, `docs/guide.md`,
|
|
279
456
|
`docs/best-practices.md`, `docs/migration.md`, `docs/extensions.md`,
|
|
280
457
|
`docs/deployment.md`, `docs/performance.md`, `docs/troubleshooting.md`,
|
|
281
|
-
`docs/error-handling.md`.
|
|
458
|
+
`docs/error-handling.md`, `docs/request-lifecycle.md`.
|
|
282
459
|
- **Chinese**: mirrored under `docs/zh/`. If something is missing, please fall
|
|
283
460
|
back to the English source.
|
|
284
461
|
|
|
285
462
|
## Roadmap
|
|
286
463
|
|
|
287
|
-
Detailed milestones and history are tracked in
|
|
288
|
-
|
|
464
|
+
Detailed milestones and history are tracked in the [`.roadmap/`](./.roadmap/)
|
|
465
|
+
directory.
|
|
289
466
|
|
|
290
467
|
## AI-Assisted Development
|
|
291
468
|
|
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
import { type CacheModuleOptions } from './types';
|
|
2
|
+
import { CachePostProcessor } from './service-proxy';
|
|
3
|
+
/**
|
|
4
|
+
* 缓存后处理器 Token
|
|
5
|
+
*/
|
|
6
|
+
export declare const CACHE_POST_PROCESSOR_TOKEN: unique symbol;
|
|
2
7
|
export declare class CacheModule {
|
|
8
|
+
/**
|
|
9
|
+
* 缓存后处理器实例(单例)
|
|
10
|
+
*/
|
|
11
|
+
private static postProcessor;
|
|
3
12
|
/**
|
|
4
13
|
* 创建缓存模块
|
|
5
14
|
* @param options - 模块配置
|
|
6
15
|
*/
|
|
7
16
|
static forRoot(options?: CacheModuleOptions): typeof CacheModule;
|
|
17
|
+
/**
|
|
18
|
+
* 获取缓存后处理器
|
|
19
|
+
* 用于在应用启动时注册到 DI 容器
|
|
20
|
+
*/
|
|
21
|
+
static getPostProcessor(): CachePostProcessor | null;
|
|
22
|
+
/**
|
|
23
|
+
* 重置模块状态(主要用于测试)
|
|
24
|
+
*/
|
|
25
|
+
static reset(): void;
|
|
8
26
|
}
|
|
9
27
|
//# sourceMappingURL=cache-module.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-module.d.ts","sourceRoot":"","sources":["../../src/cache/cache-module.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,kBAAkB,EAExB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cache-module.d.ts","sourceRoot":"","sources":["../../src/cache/cache-module.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,kBAAkB,EAExB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,0BAA0B,eAAoD,CAAC;AAE5F,qBAGa,WAAW;IACtB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa,CAAmC;IAE/D;;;OAGG;WACW,OAAO,CACnB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,WAAW;IAwDrB;;;OAGG;WACW,gBAAgB,IAAI,kBAAkB,GAAG,IAAI;IAI3D;;OAEG;WACW,KAAK,IAAI,IAAI;CAI5B"}
|
package/dist/cache/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
export { CacheModule } from './cache-module';
|
|
1
|
+
export { CacheModule, CACHE_POST_PROCESSOR_TOKEN } from './cache-module';
|
|
2
2
|
export { CacheService } from './service';
|
|
3
3
|
export { Cacheable, CacheEvict, CachePut, getCacheableMetadata, getCacheEvictMetadata, getCachePutMetadata, type CacheableOptions, type CacheEvictOptions, type CachePutOptions, type CacheableMetadata, type CacheEvictMetadata, type CachePutMetadata, } from './decorators';
|
|
4
4
|
export { MemoryCacheStore, RedisCacheStore, CACHE_SERVICE_TOKEN, CACHE_OPTIONS_TOKEN, } from './types';
|
|
5
5
|
export type { CacheStore, CacheModuleOptions, RedisCacheStoreOptions, } from './types';
|
|
6
|
+
export { CacheServiceProxy, CachePostProcessor, EnableCacheProxy, isCacheProxyEnabled, CACHE_PROXY_ENABLED_KEY, } from './service-proxy';
|
|
7
|
+
export { CacheableInterceptor, CacheEvictInterceptor, CachePutInterceptor, CACHEABLE_INTERCEPTOR_KEY, CACHE_EVICT_INTERCEPTOR_KEY, CACHE_PUT_INTERCEPTOR_KEY, } from './interceptors';
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { BaseInterceptor } from '../interceptor/base-interceptor';
|
|
3
|
+
import type { Container } from '../di/container';
|
|
4
|
+
import type { Context } from '../core/context';
|
|
5
|
+
/**
|
|
6
|
+
* 缓存装饰器元数据键(用于拦截器注册)
|
|
7
|
+
*/
|
|
8
|
+
export declare const CACHEABLE_INTERCEPTOR_KEY: unique symbol;
|
|
9
|
+
export declare const CACHE_EVICT_INTERCEPTOR_KEY: unique symbol;
|
|
10
|
+
export declare const CACHE_PUT_INTERCEPTOR_KEY: unique symbol;
|
|
11
|
+
/**
|
|
12
|
+
* @Cacheable 拦截器
|
|
13
|
+
* 实现方法结果缓存功能
|
|
14
|
+
*/
|
|
15
|
+
export declare class CacheableInterceptor extends BaseInterceptor {
|
|
16
|
+
/**
|
|
17
|
+
* 执行拦截器逻辑
|
|
18
|
+
*/
|
|
19
|
+
execute<T>(target: unknown, propertyKey: string | symbol, originalMethod: (...args: unknown[]) => T | Promise<T>, args: unknown[], container: Container, context?: Context): Promise<T>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @CacheEvict 拦截器
|
|
23
|
+
* 实现缓存清除功能
|
|
24
|
+
*/
|
|
25
|
+
export declare class CacheEvictInterceptor extends BaseInterceptor {
|
|
26
|
+
/**
|
|
27
|
+
* 执行拦截器逻辑
|
|
28
|
+
*/
|
|
29
|
+
execute<T>(target: unknown, propertyKey: string | symbol, originalMethod: (...args: unknown[]) => T | Promise<T>, args: unknown[], container: Container, context?: Context): Promise<T>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @CachePut 拦截器
|
|
33
|
+
* 实现缓存更新功能(总是执行方法并更新缓存)
|
|
34
|
+
*/
|
|
35
|
+
export declare class CachePutInterceptor extends BaseInterceptor {
|
|
36
|
+
/**
|
|
37
|
+
* 执行拦截器逻辑
|
|
38
|
+
*/
|
|
39
|
+
execute<T>(target: unknown, propertyKey: string | symbol, originalMethod: (...args: unknown[]) => T | Promise<T>, args: unknown[], container: Container, context?: Context): Promise<T>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=interceptors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptors.d.ts","sourceRoot":"","sources":["../../src/cache/interceptors.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAY/C;;GAEG;AACH,eAAO,MAAM,yBAAyB,eAA+C,CAAC;AACtF,eAAO,MAAM,2BAA2B,eAAiD,CAAC;AAC1F,eAAO,MAAM,yBAAyB,eAA+C,CAAC;AA8DtF;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,eAAe;IACvD;;OAEG;IACU,OAAO,CAAC,CAAC,EACpB,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACtD,IAAI,EAAE,OAAO,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,CAAC,CAAC;CAwDd;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;IACxD;;OAEG;IACU,OAAO,CAAC,CAAC,EACpB,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACtD,IAAI,EAAE,OAAO,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,CAAC,CAAC;CAyDd;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACtD;;OAEG;IACU,OAAO,CAAC,CAAC,EACpB,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACtD,IAAI,EAAE,OAAO,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,CAAC,CAAC;CAkDd"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import type { Container } from '../di/container';
|
|
3
|
+
import type { InstancePostProcessor } from '../di/types';
|
|
4
|
+
import type { Constructor } from '../core/types';
|
|
5
|
+
/**
|
|
6
|
+
* 缓存服务代理工厂
|
|
7
|
+
* 为服务实例创建代理,拦截带有缓存装饰器的方法
|
|
8
|
+
*/
|
|
9
|
+
export declare class CacheServiceProxy {
|
|
10
|
+
private static cacheableInterceptor;
|
|
11
|
+
private static cacheEvictInterceptor;
|
|
12
|
+
private static cachePutInterceptor;
|
|
13
|
+
/**
|
|
14
|
+
* 为服务实例创建缓存代理
|
|
15
|
+
* @param instance - 原始服务实例
|
|
16
|
+
* @param container - DI 容器
|
|
17
|
+
* @returns 代理实例
|
|
18
|
+
*/
|
|
19
|
+
static createProxy<T extends object>(instance: T, container: Container): T;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 元数据键:标记服务需要缓存代理
|
|
23
|
+
*/
|
|
24
|
+
export declare const CACHE_PROXY_ENABLED_KEY: unique symbol;
|
|
25
|
+
/**
|
|
26
|
+
* 启用服务缓存代理的装饰器
|
|
27
|
+
* 用于标记服务类需要缓存代理支持
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* @Injectable()
|
|
32
|
+
* @EnableCacheProxy()
|
|
33
|
+
* class UserService {
|
|
34
|
+
* @Cacheable({ key: 'user:{0}', ttl: 60000 })
|
|
35
|
+
* async findById(id: string) {
|
|
36
|
+
* return await this.db.findUser(id);
|
|
37
|
+
* }
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function EnableCacheProxy(): ClassDecorator;
|
|
42
|
+
/**
|
|
43
|
+
* 检查类是否启用了缓存代理
|
|
44
|
+
* @param target - 目标类
|
|
45
|
+
* @returns 是否启用
|
|
46
|
+
*/
|
|
47
|
+
export declare function isCacheProxyEnabled(target: Function): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* 缓存实例后处理器
|
|
50
|
+
* 自动为带有 @EnableCacheProxy() 装饰器的服务创建缓存代理
|
|
51
|
+
*/
|
|
52
|
+
export declare class CachePostProcessor implements InstancePostProcessor {
|
|
53
|
+
/**
|
|
54
|
+
* 优先级(较低以确保在其他处理器之后运行)
|
|
55
|
+
*/
|
|
56
|
+
priority: number;
|
|
57
|
+
/**
|
|
58
|
+
* 处理新创建的实例
|
|
59
|
+
*/
|
|
60
|
+
postProcess<T>(instance: T, constructor: Constructor<T>, container: unknown): T;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=service-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-proxy.d.ts","sourceRoot":"","sources":["../../src/cache/service-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAYjD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAA8B;IACjE,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAA+B;IACnE,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAA6B;IAE/D;;;;;OAKG;WACW,WAAW,CAAC,CAAC,SAAS,MAAM,EACxC,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,SAAS,GACnB,CAAC;CAmHL;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,eAAmD,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CAIjD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAE7D;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,qBAAqB;IAC9D;;OAEG;IACI,QAAQ,SAAM;IAErB;;OAEG;IACI,WAAW,CAAC,CAAC,EAClB,QAAQ,EAAE,CAAC,EACX,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,EAC3B,SAAS,EAAE,OAAO,GACjB,CAAC;CAeL"}
|
|
@@ -48,6 +48,14 @@ export declare class ControllerRegistry {
|
|
|
48
48
|
* @param basePath - 基础路径
|
|
49
49
|
* @param methodPath - 方法路径
|
|
50
50
|
* @returns 组合后的路径
|
|
51
|
+
*
|
|
52
|
+
* 路径规范化规则:
|
|
53
|
+
* - [/ + /api/base] -> /api/base
|
|
54
|
+
* - [// + /api/base] -> /api/base
|
|
55
|
+
* - [/api + /base] -> /api/base
|
|
56
|
+
* - [/api/ + base] -> /api/base
|
|
57
|
+
* - [/api/base + ""] -> /api/base
|
|
58
|
+
* - [/api/base + /] -> /api/base
|
|
51
59
|
*/
|
|
52
60
|
private combinePaths;
|
|
53
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/controller/controller.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAS5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQhD;;GAEG;AACH,eAAO,MAAM,uBAAuB,eAAuB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,MAAW,IACzB,QAAQ,WAAW,CAAC,OAAO,CAAC,UAI9C;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4C;IACxE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8C;IAEnF,OAAO;IAIP;;OAEG;WACW,WAAW,IAAI,kBAAkB;IAO/C;;;OAGG;IACI,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAyJnF
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/controller/controller.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAS5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQhD;;GAEG;AACH,eAAO,MAAM,uBAAuB,eAAuB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,MAAW,IACzB,QAAQ,WAAW,CAAC,OAAO,CAAC,UAI9C;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4C;IACxE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8C;IAEnF,OAAO;IAIP;;OAEG;WACW,WAAW,IAAI,kBAAkB;IAO/C;;;OAGG;IACI,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAyJnF;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,YAAY;IA+BpB;;;OAGG;IACI,YAAY,IAAI,SAAS;IAIhC;;;OAGG;IACI,iBAAiB,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE;IAIlD;;;OAGG;IACI,wBAAwB,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE;IAIzD;;OAEG;IACI,KAAK,IAAI,IAAI;CAKrB"}
|
|
@@ -87,6 +87,11 @@ export declare class Application {
|
|
|
87
87
|
* @param moduleClass - 模块类
|
|
88
88
|
*/
|
|
89
89
|
registerModule(moduleClass: ModuleClass): void;
|
|
90
|
+
/**
|
|
91
|
+
* 检测并注册缓存后处理器
|
|
92
|
+
* @param container - DI 容器
|
|
93
|
+
*/
|
|
94
|
+
private registerCachePostProcessorIfNeeded;
|
|
90
95
|
/**
|
|
91
96
|
* 注册 WebSocket 网关
|
|
92
97
|
* @param gatewayClass - WebSocket 网关类
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/core/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,UAAU,CAAC;AAMzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/core/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,UAAU,CAAC;AAMzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQ3C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2B;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,uBAAuB,CAAkB;gBAE9B,OAAO,GAAE,kBAAuB;IAsBnD;;;OAGG;IACI,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAIxC;;OAEG;IACU,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCpE;;OAEG;YACW,oBAAoB;IAqBlC;;;OAGG;YACW,sBAAsB;IAyBpC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAYlC;;;;;OAKG;IACU,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9D;;OAEG;YACW,eAAe;IAkB7B;;;;OAIG;YACW,aAAa;IA8B3B;;;OAGG;IACI,kBAAkB,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAKtE;;;OAGG;IACI,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAqBrD;;;OAGG;IACH,OAAO,CAAC,kCAAkC;IAc1C;;;OAGG;IACI,wBAAwB,CAAC,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAIzE;;;OAGG;IACI,iBAAiB,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI;IAK/D;;;OAGG;IACI,SAAS,IAAI,SAAS,GAAG,SAAS;IAIzC;;;OAGG;YACW,gBAAgB;IAsB9B;;;OAGG;YACW,kBAAkB;IAwBhC;;;OAGG;IACI,YAAY;IAInB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAS7B"}
|
package/dist/di/container.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
|
-
import { type ProviderConfig } from "./types";
|
|
2
|
+
import { type InstancePostProcessor, type ProviderConfig } from "./types";
|
|
3
3
|
import type { Constructor } from "@/core/types";
|
|
4
4
|
/**
|
|
5
5
|
* 依赖注入容器
|
|
@@ -32,6 +32,10 @@ export declare class Container {
|
|
|
32
32
|
* 依赖计划缓存,避免重复解析反射元数据
|
|
33
33
|
*/
|
|
34
34
|
private readonly dependencyPlans;
|
|
35
|
+
/**
|
|
36
|
+
* 实例后处理器列表
|
|
37
|
+
*/
|
|
38
|
+
private readonly postProcessors;
|
|
35
39
|
/**
|
|
36
40
|
* 注册提供者
|
|
37
41
|
* @param token - 提供者标识符(类构造函数或 token)
|
|
@@ -44,6 +48,19 @@ export declare class Container {
|
|
|
44
48
|
* @param instance - 实例对象
|
|
45
49
|
*/
|
|
46
50
|
registerInstance<T>(token: Constructor<T> | string | symbol, instance: T): void;
|
|
51
|
+
/**
|
|
52
|
+
* 注册实例后处理器
|
|
53
|
+
* @param processor - 后处理器实例
|
|
54
|
+
*/
|
|
55
|
+
registerPostProcessor(processor: InstancePostProcessor): void;
|
|
56
|
+
/**
|
|
57
|
+
* 应用所有后处理器(包括父容器的后处理器)
|
|
58
|
+
* @param instance - 原始实例
|
|
59
|
+
* @param constructor - 构造函数
|
|
60
|
+
* @param originContainer - 原始调用容器(用于后处理器解析依赖)
|
|
61
|
+
* @returns 处理后的实例
|
|
62
|
+
*/
|
|
63
|
+
private applyPostProcessors;
|
|
47
64
|
/**
|
|
48
65
|
* 解析依赖
|
|
49
66
|
* @param token - 提供者标识符
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/di/container.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,qBAAqB,EAG1B,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAOjB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD;;;GAGG;AACH,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY;gBAEjB,OAAO,GAAE,gBAAqB;IAGjD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8C;IAExE;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuC;IAElE;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwD;IAExF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGxB;IAEJ;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAG5B;IAEJ;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAE9D;;;;OAIG;IACI,QAAQ,CAAC,CAAC,EACf,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,EACvC,MAAM,CAAC,EAAE,cAAc,GACtB,IAAI;IA6BP;;;;OAIG;IACI,gBAAgB,CAAC,CAAC,EACvB,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,EACvC,QAAQ,EAAE,CAAC,GACV,IAAI;IAQP;;;OAGG;IACI,qBAAqB,CAAC,SAAS,EAAE,qBAAqB,GAAG,IAAI;IAMpE;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;;;OAIG;IACI,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC;IAyF7D;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAsGvB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IASnB;;;OAGG;IACI,KAAK,IAAI,IAAI;IASpB;;;;OAIG;IACI,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;IAK3E,OAAO,CAAC,iBAAiB;IAuDzB,OAAO,CAAC,eAAe;CA6BxB"}
|
package/dist/di/decorators.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
2
|
import { type DependencyMetadata, Lifecycle } from "./types";
|
|
3
3
|
import type { Constructor } from "@/core/types";
|
|
4
|
+
/**
|
|
5
|
+
* 全局模块元数据键
|
|
6
|
+
*/
|
|
7
|
+
export declare const GLOBAL_MODULE_METADATA_KEY: unique symbol;
|
|
4
8
|
/**
|
|
5
9
|
* Injectable 装饰器
|
|
6
10
|
* 标记类为可注入的
|
|
@@ -40,4 +44,37 @@ export declare function getLifecycle(target: Constructor<unknown>): Lifecycle |
|
|
|
40
44
|
* @returns 类型引用
|
|
41
45
|
*/
|
|
42
46
|
export declare function getTypeReference(constructor: Constructor<unknown>, parameterIndex: number): Constructor<unknown> | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Global 装饰器
|
|
49
|
+
* 标记模块为全局模块,其导出的提供者可在任何模块中使用,无需显式导入
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* @Global()
|
|
54
|
+
* @Module({
|
|
55
|
+
* providers: [ConfigService],
|
|
56
|
+
* exports: [ConfigService],
|
|
57
|
+
* })
|
|
58
|
+
* class GlobalConfigModule {}
|
|
59
|
+
*
|
|
60
|
+
* // 其他模块无需导入 GlobalConfigModule 即可使用 ConfigService
|
|
61
|
+
* @Module({
|
|
62
|
+
* controllers: [UserController],
|
|
63
|
+
* providers: [UserService],
|
|
64
|
+
* })
|
|
65
|
+
* class UserModule {}
|
|
66
|
+
*
|
|
67
|
+
* @Injectable()
|
|
68
|
+
* class UserService {
|
|
69
|
+
* constructor(private readonly config: ConfigService) {}
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function Global(): ClassDecorator;
|
|
74
|
+
/**
|
|
75
|
+
* 检查模块是否为全局模块
|
|
76
|
+
* @param target - 目标模块类
|
|
77
|
+
* @returns 是否为全局模块
|
|
78
|
+
*/
|
|
79
|
+
export declare function isGlobalModule(target: Constructor<unknown>): boolean;
|
|
43
80
|
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/di/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,kBAAkB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/di/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,kBAAkB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQhD;;GAEG;AACH,eAAO,MAAM,0BAA0B,eAA6C,CAAC;AAUrF;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE,GACjC,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,IAAI,CASxC;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CACpB,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,GAC7C,kBAAkB,CAoGpB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,kBAAkB,EAAE,CAuC3E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,OAAO,CAElE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAC3B,SAAS,GAAG,SAAS,CAEvB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,EACjC,cAAc,EAAE,MAAM,GACrB,WAAW,CAAC,OAAO,CAAC,GAAG,SAAS,CAMlC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,MAAM,IAAI,cAAc,CAIvC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,OAAO,CAEpE"}
|
package/dist/di/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { Container } from './container';
|
|
2
|
-
export { Injectable, Inject, getDependencyMetadata, isInjectable, getLifecycle } from './decorators';
|
|
3
|
-
export { Lifecycle, type ProviderConfig, type DependencyMetadata } from './types';
|
|
2
|
+
export { Injectable, Inject, getDependencyMetadata, isInjectable, getLifecycle, Global, isGlobalModule, GLOBAL_MODULE_METADATA_KEY, } from './decorators';
|
|
3
|
+
export { Lifecycle, INSTANCE_POST_PROCESSOR_TOKEN, type ProviderConfig, type DependencyMetadata, type InstancePostProcessor, } from './types';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/di/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/di/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/di/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,UAAU,EACV,MAAM,EACN,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,cAAc,EACd,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,6BAA6B,EAC7B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,GAC3B,MAAM,SAAS,CAAC"}
|
|
@@ -10,18 +10,35 @@ interface ModuleRef {
|
|
|
10
10
|
attachedParents: Set<Container>;
|
|
11
11
|
extensions: ApplicationExtension[];
|
|
12
12
|
middlewares: Middleware[];
|
|
13
|
+
/**
|
|
14
|
+
* 是否为全局模块
|
|
15
|
+
*/
|
|
16
|
+
isGlobal: boolean;
|
|
13
17
|
}
|
|
14
18
|
export declare class ModuleRegistry {
|
|
15
19
|
private static instance;
|
|
16
20
|
private readonly moduleRefs;
|
|
17
21
|
private readonly processing;
|
|
18
22
|
private rootContainer?;
|
|
23
|
+
/**
|
|
24
|
+
* 存储全局模块列表,用于在其他模块注册时自动附加全局 exports
|
|
25
|
+
*/
|
|
26
|
+
private readonly globalModules;
|
|
19
27
|
static getInstance(): ModuleRegistry;
|
|
20
28
|
register(moduleClass: ModuleClass, parentContainer: Container): ModuleRef;
|
|
21
29
|
getModuleRef(moduleClass: ModuleClass): ModuleRef | undefined;
|
|
22
30
|
clear(): void;
|
|
31
|
+
/**
|
|
32
|
+
* 获取所有全局模块
|
|
33
|
+
*/
|
|
34
|
+
getGlobalModules(): ModuleClass[];
|
|
23
35
|
private processModule;
|
|
24
36
|
private getOrCreateModuleRef;
|
|
37
|
+
/**
|
|
38
|
+
* 将全局模块的 exports 注册到根容器
|
|
39
|
+
* 这样所有模块都可以访问全局模块导出的提供者
|
|
40
|
+
*/
|
|
41
|
+
private registerGlobalExports;
|
|
25
42
|
private registerProviders;
|
|
26
43
|
private registerControllers;
|
|
27
44
|
private attachModuleToParent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-registry.d.ts","sourceRoot":"","sources":["../../src/di/module-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAA2C,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"module-registry.d.ts","sourceRoot":"","sources":["../../src/di/module-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAA2C,MAAM,UAAU,CAAC;AAGxG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,UAAU,SAAS;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC/C,SAAS,EAAE,SAAS,CAAC;IACrB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,eAAe,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAChC,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqC;IAChE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0B;IACrD,OAAO,CAAC,aAAa,CAAC,CAAY;IAClC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;WAE1C,WAAW,IAAI,cAAc;IAOpC,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,GAAG,SAAS;IAOzE,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS;IAI7D,KAAK,IAAI,IAAI;IAOpB;;OAEG;IACI,gBAAgB,IAAI,WAAW,EAAE;IAIxC,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,oBAAoB;IAkC5B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACI,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,oBAAoB,EAAE;IAQ5E;;OAEG;IACI,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,UAAU,EAAE;IAQnE,OAAO,CAAC,cAAc;CAgBvB"}
|