@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.
Files changed (144) hide show
  1. package/README.md +196 -19
  2. package/dist/cache/cache-module.d.ts +18 -0
  3. package/dist/cache/cache-module.d.ts.map +1 -1
  4. package/dist/cache/index.d.ts +3 -1
  5. package/dist/cache/index.d.ts.map +1 -1
  6. package/dist/cache/interceptors.d.ts +41 -0
  7. package/dist/cache/interceptors.d.ts.map +1 -0
  8. package/dist/cache/service-proxy.d.ts +62 -0
  9. package/dist/cache/service-proxy.d.ts.map +1 -0
  10. package/dist/controller/controller.d.ts +8 -0
  11. package/dist/controller/controller.d.ts.map +1 -1
  12. package/dist/core/application.d.ts +5 -0
  13. package/dist/core/application.d.ts.map +1 -1
  14. package/dist/di/container.d.ts +18 -1
  15. package/dist/di/container.d.ts.map +1 -1
  16. package/dist/di/decorators.d.ts +37 -0
  17. package/dist/di/decorators.d.ts.map +1 -1
  18. package/dist/di/index.d.ts +2 -2
  19. package/dist/di/index.d.ts.map +1 -1
  20. package/dist/di/module-registry.d.ts +17 -0
  21. package/dist/di/module-registry.d.ts.map +1 -1
  22. package/dist/di/types.d.ts +22 -0
  23. package/dist/di/types.d.ts.map +1 -1
  24. package/dist/events/decorators.d.ts +52 -0
  25. package/dist/events/decorators.d.ts.map +1 -0
  26. package/dist/events/event-module.d.ts +97 -0
  27. package/dist/events/event-module.d.ts.map +1 -0
  28. package/dist/events/index.d.ts +5 -0
  29. package/dist/events/index.d.ts.map +1 -0
  30. package/dist/events/service.d.ts +76 -0
  31. package/dist/events/service.d.ts.map +1 -0
  32. package/dist/events/types.d.ts +184 -0
  33. package/dist/events/types.d.ts.map +1 -0
  34. package/dist/index.d.ts +6 -4
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +4641 -2840
  37. package/dist/security/filter.d.ts +23 -0
  38. package/dist/security/filter.d.ts.map +1 -1
  39. package/dist/security/guards/builtin/auth-guard.d.ts +44 -0
  40. package/dist/security/guards/builtin/auth-guard.d.ts.map +1 -0
  41. package/dist/security/guards/builtin/index.d.ts +3 -0
  42. package/dist/security/guards/builtin/index.d.ts.map +1 -0
  43. package/dist/security/guards/builtin/roles-guard.d.ts +66 -0
  44. package/dist/security/guards/builtin/roles-guard.d.ts.map +1 -0
  45. package/dist/security/guards/decorators.d.ts +50 -0
  46. package/dist/security/guards/decorators.d.ts.map +1 -0
  47. package/dist/security/guards/execution-context.d.ts +56 -0
  48. package/dist/security/guards/execution-context.d.ts.map +1 -0
  49. package/dist/security/guards/guard-registry.d.ts +67 -0
  50. package/dist/security/guards/guard-registry.d.ts.map +1 -0
  51. package/dist/security/guards/index.d.ts +7 -0
  52. package/dist/security/guards/index.d.ts.map +1 -0
  53. package/dist/security/guards/reflector.d.ts +57 -0
  54. package/dist/security/guards/reflector.d.ts.map +1 -0
  55. package/dist/security/guards/types.d.ts +126 -0
  56. package/dist/security/guards/types.d.ts.map +1 -0
  57. package/dist/security/index.d.ts +1 -0
  58. package/dist/security/index.d.ts.map +1 -1
  59. package/dist/security/security-module.d.ts +20 -0
  60. package/dist/security/security-module.d.ts.map +1 -1
  61. package/dist/validation/class-validator.d.ts +108 -0
  62. package/dist/validation/class-validator.d.ts.map +1 -0
  63. package/dist/validation/custom-validator.d.ts +130 -0
  64. package/dist/validation/custom-validator.d.ts.map +1 -0
  65. package/dist/validation/errors.d.ts +22 -2
  66. package/dist/validation/errors.d.ts.map +1 -1
  67. package/dist/validation/index.d.ts +7 -1
  68. package/dist/validation/index.d.ts.map +1 -1
  69. package/dist/validation/rules/array.d.ts +33 -0
  70. package/dist/validation/rules/array.d.ts.map +1 -0
  71. package/dist/validation/rules/common.d.ts +90 -0
  72. package/dist/validation/rules/common.d.ts.map +1 -0
  73. package/dist/validation/rules/conditional.d.ts +30 -0
  74. package/dist/validation/rules/conditional.d.ts.map +1 -0
  75. package/dist/validation/rules/index.d.ts +5 -0
  76. package/dist/validation/rules/index.d.ts.map +1 -0
  77. package/dist/validation/rules/object.d.ts +30 -0
  78. package/dist/validation/rules/object.d.ts.map +1 -0
  79. package/dist/validation/types.d.ts +52 -1
  80. package/dist/validation/types.d.ts.map +1 -1
  81. package/docs/events.md +494 -0
  82. package/docs/guards.md +376 -0
  83. package/docs/guide.md +309 -1
  84. package/docs/request-lifecycle.md +444 -0
  85. package/docs/symbol-interface-pattern.md +431 -0
  86. package/docs/validation.md +407 -0
  87. package/docs/zh/events.md +494 -0
  88. package/docs/zh/guards.md +376 -0
  89. package/docs/zh/guide.md +309 -1
  90. package/docs/zh/request-lifecycle.md +444 -0
  91. package/docs/zh/symbol-interface-pattern.md +431 -0
  92. package/docs/zh/validation.md +407 -0
  93. package/package.json +1 -1
  94. package/src/cache/cache-module.ts +37 -0
  95. package/src/cache/index.ts +16 -1
  96. package/src/cache/interceptors.ts +295 -0
  97. package/src/cache/service-proxy.ts +219 -0
  98. package/src/controller/controller.ts +30 -6
  99. package/src/core/application.ts +25 -1
  100. package/src/di/container.ts +57 -7
  101. package/src/di/decorators.ts +46 -0
  102. package/src/di/index.ts +17 -2
  103. package/src/di/module-registry.ts +39 -0
  104. package/src/di/types.ts +29 -0
  105. package/src/events/decorators.ts +103 -0
  106. package/src/events/event-module.ts +272 -0
  107. package/src/events/index.ts +32 -0
  108. package/src/events/service.ts +352 -0
  109. package/src/events/types.ts +223 -0
  110. package/src/index.ts +140 -1
  111. package/src/security/filter.ts +88 -8
  112. package/src/security/guards/builtin/auth-guard.ts +68 -0
  113. package/src/security/guards/builtin/index.ts +3 -0
  114. package/src/security/guards/builtin/roles-guard.ts +165 -0
  115. package/src/security/guards/decorators.ts +124 -0
  116. package/src/security/guards/execution-context.ts +152 -0
  117. package/src/security/guards/guard-registry.ts +164 -0
  118. package/src/security/guards/index.ts +7 -0
  119. package/src/security/guards/reflector.ts +99 -0
  120. package/src/security/guards/types.ts +144 -0
  121. package/src/security/index.ts +1 -0
  122. package/src/security/security-module.ts +72 -2
  123. package/src/validation/class-validator.ts +322 -0
  124. package/src/validation/custom-validator.ts +289 -0
  125. package/src/validation/errors.ts +50 -2
  126. package/src/validation/index.ts +103 -1
  127. package/src/validation/rules/array.ts +118 -0
  128. package/src/validation/rules/common.ts +286 -0
  129. package/src/validation/rules/conditional.ts +52 -0
  130. package/src/validation/rules/index.ts +51 -0
  131. package/src/validation/rules/object.ts +86 -0
  132. package/src/validation/types.ts +61 -1
  133. package/tests/cache/cache-decorators.test.ts +284 -0
  134. package/tests/controller/path-combination.test.ts +353 -0
  135. package/tests/di/global-module.test.ts +487 -0
  136. package/tests/events/event-decorators.test.ts +173 -0
  137. package/tests/events/event-emitter.test.ts +373 -0
  138. package/tests/events/event-module.test.ts +373 -0
  139. package/tests/security/guards/guards-integration.test.ts +371 -0
  140. package/tests/security/guards/guards.test.ts +775 -0
  141. package/tests/security/security-module.test.ts +2 -2
  142. package/tests/validation/class-validator.test.ts +349 -0
  143. package/tests/validation/custom-validator.test.ts +335 -0
  144. 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 (Controllers / Modules / DI)
54
-
55
- Middleware Pipeline
56
-
57
- Router + Context + Response
58
-
59
- Bun Runtime
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 `undefined`). See [Troubleshooting Guide](./docs/troubleshooting.md#-critical-injected-dependencies-are-undefined) for details.
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/@dangao/bun-server test
121
- bun --cwd=packages/@dangao/bun-server run bench
122
- bun --cwd=packages/@dangao/bun-server run bench:router
123
- bun --cwd=packages/@dangao/bun-server run bench:di
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/@dangao/bun-server` first.
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
- - `examples/basic-app.ts`: minimal DI + Logger + Middleware showcase.
253
- - `examples/full-app.ts`: advanced controllers, validation, uploads, WebSocket.
254
- - `packages/@dangao/bun-server/src/extensions/`: official extensions (e.g.
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
- [`.roadmap/v0.3.0.md`](./.roadmap/v0.3.0.md).
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;AAEjB,qBAGa,WAAW;IACtB;;;OAGG;WACW,OAAO,CACnB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,WAAW;CA6CtB"}
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"}
@@ -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;AAC7C,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"}
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;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAepB;;;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"}
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;AAO3C;;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;IAgBrD;;;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"}
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"}
@@ -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,EAGL,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;;;;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;;;;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;IAenB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IASnB;;;OAGG;IACI,KAAK,IAAI,IAAI;IAQpB;;;;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"}
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"}
@@ -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;AAgBhD;;;;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"}
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"}
@@ -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
@@ -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,EAAE,UAAU,EAAE,MAAM,EAAE,qBAAqB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
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;AAExG,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;CAC3B;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;WAEpB,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;IAMpB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,oBAAoB;IAyB5B,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"}
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"}