@keq-request/nestjs 5.0.0-beta.9 → 5.0.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.
@@ -1,10 +1,10 @@
1
1
 
2
- > @keq-request/nestjs@5.0.0-beta.9 build /home/runner/work/keq/keq/packages/nestjs
2
+ > @keq-request/nestjs@5.0.1 build /home/runner/work/keq/keq/packages/nestjs
3
3
  > tsdown
4
4
 
5
5
  ℹ tsdown v0.21.10 powered by rolldown v1.0.0-rc.17
6
6
  ℹ config file: /home/runner/work/keq/keq/packages/nestjs/tsdown.config.ts
7
- (node:2655) [MODULE_TYPELESS_PACKAGE_JSON] Warning: Module type of file:///home/runner/work/keq/keq/packages/nestjs/tsdown.config.ts?no-cache=13f8821f-6db3-40f6-9801-4c8ce3adbf53 is not specified and it doesn't parse as CommonJS.
7
+ (node:2862) [MODULE_TYPELESS_PACKAGE_JSON] Warning: Module type of file:///home/runner/work/keq/keq/packages/nestjs/tsdown.config.ts?no-cache=458d8326-b0c5-4ed1-8725-3dd5fecc0756 is not specified and it doesn't parse as CommonJS.
8
8
  Reparsing as ES module because module syntax was detected. This incurs a performance overhead.
9
9
  To eliminate this warning, add "type": "module" to /home/runner/work/keq/keq/packages/nestjs/package.json.
10
10
  (Use `node --trace-warnings ...` to show where the warning was created)
@@ -12,25 +12,25 @@ To eliminate this warning, add "type": "module" to /home/runner/work/keq/keq/pac
12
12
  ℹ target: node20
13
13
  ℹ tsconfig: tsconfig.lib.json
14
14
  ℹ Build start
15
- ℹ [CJS] dist/index.js 2.35 kB │ gzip: 1.00 kB
16
- ℹ [CJS] dist/index.js.map 3.54 kB │ gzip: 1.35 kB
17
- ℹ [CJS] 2 files, total: 5.89 kB
15
+ ℹ [CJS] dist/index.js  8.01 kB │ gzip: 2.93 kB
16
+ ℹ [CJS] dist/index.js.map 11.70 kB │ gzip: 3.78 kB
17
+ ℹ [CJS] 2 files, total: 19.72 kB
18
18
  [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugin `tsdown:deps`. See https://rolldown.rs/options/checks#plugintimings for more details.
19
19
 
20
- ℹ [CJS] dist/index.d.ts.map 0.54 kB │ gzip: 0.30 kB
21
- ℹ [CJS] dist/index.d.ts 2.17 kB │ gzip: 0.89 kB
22
- ℹ [CJS] 2 files, total: 2.71 kB
20
+ ℹ [CJS] dist/index.d.ts.map 1.39 kB │ gzip: 0.55 kB
21
+ ℹ [CJS] dist/index.d.ts 3.81 kB │ gzip: 1.45 kB
22
+ ℹ [CJS] 2 files, total: 5.20 kB
23
23
  [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugins. Here is a breakdown:
24
- - rolldown-plugin-dts:generate (49%)
25
- ℹ [ESM] dist/index.mjs 2.17 kB │ gzip: 0.92 kB
26
- ℹ [ESM] dist/index.mjs.map 3.49 kB │ gzip: 1.34 kB
27
- ℹ [ESM] dist/index.d.mts.map 0.54 kB │ gzip: 0.30 kB
28
- ℹ [ESM] dist/index.d.mts 2.17 kB │ gzip: 0.89 kB
29
- ℹ [ESM] 4 files, total: 8.37 kB
30
- ✔ Build complete in 4631ms
31
- ✔ Build complete in 4632ms
32
- - tsdown:deps (46%)
24
+ - rolldown-plugin-dts:generate (47%)
25
+ - tsdown:deps (42%)
33
26
  See https://rolldown.rs/options/checks#plugintimings for more details.
34
27
 
28
+ ✔ Build complete in 5441ms
29
+ ℹ [ESM] dist/index.mjs  6.58 kB │ gzip: 2.45 kB
35
30
  [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugin `rolldown-plugin-dts:generate`. See https://rolldown.rs/options/checks#plugintimings for more details.
31
+ ℹ [ESM] dist/index.mjs.map 11.61 kB │ gzip: 3.75 kB
32
+ ℹ [ESM] dist/index.d.mts.map  1.39 kB │ gzip: 0.55 kB
33
+ ℹ [ESM] dist/index.d.mts  3.81 kB │ gzip: 1.46 kB
34
+ ℹ [ESM] 4 files, total: 23.38 kB
36
35
 
36
+ ✔ Build complete in 5443ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,141 @@
1
1
  # @keq-request/nestjs
2
2
 
3
+ ## 5.0.1
4
+
5
+ ## 5.0.0
6
+
7
+ ### Major Changes
8
+
9
+ - 23c971f: **BREAKING CHANGE:** Add NestJS integration with dependency injection pattern.
10
+
11
+ - Introduce `KeqMiddlewareConsumer` as an injectable service and `@InjectKeqConsumer()` decorator with `KeqConsumer<T>` for module-scoped middleware.
12
+ - Remove `KeqMiddlewareModule` interface and `configureKeqMiddleware()` lifecycle method. Middleware is now registered by injecting `KeqMiddlewareConsumer` or `KeqConsumer<T>` directly into services.
13
+ - Remove `KeqMiddlewareConsumer` interface — it is now a concrete `@Injectable()` class provided by `KeqModule`.
14
+ - Remove `hasConfigureKeqMiddleware()` utility function.
15
+ - Remove `forRoutes()` support for `KeqModuleClass` route targets. Use `KeqConsumer<T>` (injected via `@InjectKeqConsumer(ModuleClass)`) for module-scoped middleware.
16
+ - `KeqModuleClass` now requires a static `KEQ_CONSUMER: symbol` property in addition to `KEQ_REQUEST`.
17
+ - `KeqModule` no longer has a `register()` static method — it is now a bare `@Global()` module. Import `KeqModule` directly.
18
+ - Add `@InjectKeqConsumer(ModuleClass)` decorator, `KeqConsumer<T>` class, `KeqRouteTarget` type, and `KeqScopedConfigProxy<T>` interface.
19
+ - Add `exclude()` method to `KeqMiddlewareConfigProxy`, allowing middleware to skip specific routes.
20
+ - CLI-generated NestJS modules auto-import `KeqModule` and expose `KEQ_CONSUMER` symbol with `KeqConsumer` provider for `@InjectKeqConsumer()` injection.
21
+
22
+ ### Patch Changes
23
+
24
+ - Updated dependencies [c2d4453]
25
+ - Updated dependencies [95908fd]
26
+ - Updated dependencies [153244f]
27
+ - Updated dependencies [0a2eb2f]
28
+ - Updated dependencies [153244f]
29
+ - Updated dependencies [a960073]
30
+ - Updated dependencies [214ae66]
31
+ - Updated dependencies [153244f]
32
+ - Updated dependencies [7ff2162]
33
+ - Updated dependencies [f84775d]
34
+ - Updated dependencies [153244f]
35
+ - Updated dependencies [a7a83da]
36
+ - Updated dependencies [153244f]
37
+ - Updated dependencies [153244f]
38
+ - Updated dependencies [f8abc63]
39
+ - Updated dependencies [153244f]
40
+ - Updated dependencies [ca6c879]
41
+ - Updated dependencies [b8d02ca]
42
+ - Updated dependencies [0a04864]
43
+ - Updated dependencies [153244f]
44
+ - Updated dependencies [eed26f9]
45
+ - keq@5.0.0
46
+
47
+ ## 5.0.0-beta.19
48
+
49
+ ### Patch Changes
50
+
51
+ - Updated dependencies [cc017de]
52
+ - keq@5.0.0-beta.19
53
+
54
+ ## 5.0.0-beta.18
55
+
56
+ ### Patch Changes
57
+
58
+ - keq@5.0.0-beta.18
59
+
60
+ ## 5.0.0-beta.17
61
+
62
+ ### Patch Changes
63
+
64
+ - keq@5.0.0-beta.17
65
+
66
+ ## 5.0.0-beta.16
67
+
68
+ ### Patch Changes
69
+
70
+ - Updated dependencies [c2d4453]
71
+ - Updated dependencies [a960073]
72
+ - Updated dependencies [f84775d]
73
+ - keq@5.0.0-beta.16
74
+
75
+ ## 5.0.0-beta.15
76
+
77
+ ### Patch Changes
78
+
79
+ - keq@5.0.0-beta.15
80
+
81
+ ## 5.0.0-beta.14
82
+
83
+ ### Major Changes
84
+
85
+ - 23c971f: **BREAKING CHANGE:** Refactor NestJS middleware configuration from lifecycle hook pattern to dependency injection pattern, introducing `KeqMiddlewareConsumer` as an injectable service and `@InjectKeqConsumer()` decorator with `KeqConsumer<T>` for module-scoped middleware.
86
+
87
+ - Remove `KeqMiddlewareModule` interface and `configureKeqMiddleware()` lifecycle method. Middleware is now registered by injecting `KeqMiddlewareConsumer` or `KeqConsumer<T>` directly into services.
88
+ - Remove `KeqMiddlewareConsumer` interface — it is now a concrete `@Injectable()` class provided by `KeqModule`.
89
+ - Remove `hasConfigureKeqMiddleware()` utility function.
90
+ - Remove `forRoutes()` support for `KeqModuleClass` route targets. Use `KeqConsumer<T>` (injected via `@InjectKeqConsumer(ModuleClass)`) for module-scoped middleware.
91
+ - `KeqModuleClass` now requires a static `KEQ_CONSUMER: symbol` property in addition to `KEQ_REQUEST`.
92
+ - `KeqModule` no longer has a `register()` static method — it is now a bare `@Global()` module. Import `KeqModule` directly.
93
+ - Add `@InjectKeqConsumer(ModuleClass)` decorator, `KeqConsumer<T>` class, `KeqRouteTarget` type, and `KeqScopedConfigProxy<T>` interface.
94
+ - CLI-generated NestJS modules now expose `KEQ_CONSUMER` symbol and provide a `KeqConsumer` provider for `@InjectKeqConsumer()` injection.
95
+
96
+ ### Patch Changes
97
+
98
+ - keq@5.0.0-beta.14
99
+
100
+ ## 5.0.0-beta.13
101
+
102
+ ### Patch Changes
103
+
104
+ - 59f4773: **Fix:** ensure `configureKeqMiddleware()` works correctly in pnpm monorepos and validate module imports at startup.
105
+
106
+ - Fix middleware not being applied when pnpm creates multiple `@keq-request/nestjs` instances due to peerDependency version differences.
107
+ - Detect missing `KeqModule` imports in modules that implement `configureKeqMiddleware()` at startup, throwing a clear error instead of silently skipping middleware.
108
+ - Prevent middleware from being applied more than once when multiple `KeqModule` instances exist.
109
+ - Throw a descriptive error when a NestJS middleware class passed to `consumer.apply()` is not registered as a provider.
110
+ - keq@5.0.0-beta.13
111
+
112
+ ## 5.0.0-beta.12
113
+
114
+ ### Minor Changes
115
+
116
+ - fbc851f: **Feat:** Add `exclude()` method to `KeqMiddlewareConfigProxy`, allowing middleware to skip specific routes. Supports `KeqRouteInfo` with `host`, `method`, and `pathname` patterns, following the NestJS `MiddlewareConfigProxy.exclude()` convention.
117
+
118
+ ### Patch Changes
119
+
120
+ - keq@5.0.0-beta.12
121
+
122
+ ## 5.0.0-beta.11
123
+
124
+ ### Patch Changes
125
+
126
+ - keq@5.0.0-beta.11
127
+
128
+ ## 5.0.0-beta.10
129
+
130
+ ### Minor Changes
131
+
132
+ - 2e13e75: **BREAKING CHANGE:** Remove `request` option from `KeqModuleOptions`, use fork-based instance isolation instead.
133
+
134
+ ### Patch Changes
135
+
136
+ - Updated dependencies [95908fd]
137
+ - keq@5.0.0-beta.10
138
+
3
139
  ## 5.0.0-beta.9
4
140
 
5
141
  ### Patch Changes
@@ -0,0 +1,203 @@
1
+ import 'reflect-metadata'
2
+ import { expect, test } from '@jest/globals'
3
+ import type { KeqMiddleware } from 'keq'
4
+ import { KeqRequest } from 'keq'
5
+ import { KeqMiddlewareConsumer } from '../src/keq-middleware-consumer.js'
6
+ import { KeqConsumer } from '../src/keq-consumer.js'
7
+ import { KEQ_ROUTES } from '../src/constants.js'
8
+
9
+
10
+ test('applies global middleware via forRoutes(KEQ_ROUTES.ALL)', () => {
11
+ const keqRequest = new KeqRequest()
12
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
13
+
14
+ const middleware: KeqMiddleware = async (_ctx, next) => { await next() }
15
+ consumer.apply(middleware).forRoutes(KEQ_ROUTES.ALL)
16
+
17
+ expect(keqRequest.middlewares.length).toBe(1)
18
+ })
19
+
20
+ test('applies global middleware when forRoutes receives no arguments', () => {
21
+ const keqRequest = new KeqRequest()
22
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
23
+
24
+ const middleware: KeqMiddleware = async (_ctx, next) => { await next() }
25
+ consumer.apply(middleware).forRoutes()
26
+
27
+ expect(keqRequest.middlewares.length).toBe(1)
28
+ })
29
+
30
+ test('applies route-specific middleware via forRoutes with KeqRouteInfo', () => {
31
+ const keqRequest = new KeqRequest()
32
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
33
+
34
+ const middleware: KeqMiddleware = async (_ctx, next) => { await next() }
35
+ consumer.apply(middleware).forRoutes({ pathname: '/api/*' })
36
+
37
+ expect(keqRequest.middlewares.length).toBe(1)
38
+ })
39
+
40
+ test('supports multiple middleware in single apply()', () => {
41
+ const keqRequest = new KeqRequest()
42
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
43
+
44
+ const mw1: KeqMiddleware = async (_ctx, next) => { await next() }
45
+ const mw2: KeqMiddleware = async (_ctx, next) => { await next() }
46
+ consumer.apply(mw1, mw2).forRoutes(KEQ_ROUTES.ALL)
47
+
48
+ expect(keqRequest.middlewares.length).toBe(2)
49
+ })
50
+
51
+ test('supports multiple apply() calls', () => {
52
+ const keqRequest = new KeqRequest()
53
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
54
+
55
+ const mw1: KeqMiddleware = async (_ctx, next) => { await next() }
56
+ const mw2: KeqMiddleware = async (_ctx, next) => { await next() }
57
+
58
+ consumer.apply(mw1).forRoutes(KEQ_ROUTES.ALL)
59
+ consumer.apply(mw2).forRoutes({ pathname: '/api/*' })
60
+
61
+ expect(keqRequest.middlewares.length).toBe(2)
62
+ })
63
+
64
+ test('supports exclude().forRoutes() chaining', () => {
65
+ const keqRequest = new KeqRequest()
66
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
67
+
68
+ const middleware: KeqMiddleware = async (_ctx, next) => { await next() }
69
+ consumer.apply(middleware).exclude({ pathname: '/health' }).forRoutes(KEQ_ROUTES.ALL)
70
+
71
+ expect(keqRequest.middlewares.length).toBe(1)
72
+ })
73
+
74
+ test('middleware is applied synchronously at forRoutes() call time', () => {
75
+ const keqRequest = new KeqRequest()
76
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
77
+
78
+ const middleware: KeqMiddleware = async (_ctx, next) => { await next() }
79
+
80
+ expect(keqRequest.middlewares.length).toBe(0)
81
+ consumer.apply(middleware).forRoutes(KEQ_ROUTES.ALL)
82
+ expect(keqRequest.middlewares.length).toBe(1)
83
+ })
84
+
85
+ test('supports chaining multiple apply() calls via forRoutes returning consumer', () => {
86
+ const keqRequest = new KeqRequest()
87
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
88
+
89
+ const mw1: KeqMiddleware = async (_ctx, next) => { await next() }
90
+ const mw2: KeqMiddleware = async (_ctx, next) => { await next() }
91
+ const mw3: KeqMiddleware = async (_ctx, next) => { await next() }
92
+
93
+ consumer
94
+ .apply(mw1).forRoutes(KEQ_ROUTES.ALL)
95
+ .apply(mw2).forRoutes({ pathname: '/api/*' })
96
+ .apply(mw3).exclude({ pathname: '/health' }).forRoutes(KEQ_ROUTES.ALL)
97
+
98
+ expect(keqRequest.middlewares.length).toBe(3)
99
+ })
100
+
101
+ // ─── KeqConsumer(模块绑定)测试 ──────────────────────────
102
+
103
+ test('KeqConsumer applies middleware to its own KeqRequest', () => {
104
+ const scopedKeqRequest = new KeqRequest()
105
+ const consumer = new KeqConsumer(scopedKeqRequest)
106
+
107
+ const middleware: KeqMiddleware = async (_ctx, next) => { await next() }
108
+ consumer.apply(middleware).forRoutes(KEQ_ROUTES.ALL)
109
+
110
+ expect(scopedKeqRequest.middlewares.length).toBe(1)
111
+ })
112
+
113
+ test('KeqConsumer does not affect other KeqRequest instances', () => {
114
+ const globalKeqRequest = new KeqRequest()
115
+ const scopedKeqRequest = new KeqRequest()
116
+
117
+ const globalConsumer = new KeqMiddlewareConsumer(globalKeqRequest)
118
+ const scopedConsumer = new KeqConsumer(scopedKeqRequest)
119
+
120
+ const middleware: KeqMiddleware = async (_ctx, next) => { await next() }
121
+ scopedConsumer.apply(middleware).forRoutes(KEQ_ROUTES.ALL)
122
+
123
+ expect(scopedKeqRequest.middlewares.length).toBe(1)
124
+ expect(globalKeqRequest.middlewares.length).toBe(0)
125
+ })
126
+
127
+ // ─── KeqNestMiddleware 实例对象测试 ──────────────────────
128
+
129
+ test('applies KeqNestMiddleware instance via apply()', () => {
130
+ const keqRequest = new KeqRequest()
131
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
132
+
133
+ const middleware = {
134
+ use: async (_ctx: unknown, next: () => Promise<void>) => { await next() },
135
+ }
136
+ consumer.apply(middleware).forRoutes(KEQ_ROUTES.ALL)
137
+
138
+ expect(keqRequest.middlewares.length).toBe(1)
139
+ })
140
+
141
+ test('applies KeqNestMiddleware instance to specific route', () => {
142
+ const keqRequest = new KeqRequest()
143
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
144
+
145
+ const middleware = {
146
+ use: async (_ctx: unknown, next: () => Promise<void>) => { await next() },
147
+ }
148
+ consumer.apply(middleware).forRoutes({ pathname: '/api/*' })
149
+
150
+ expect(keqRequest.middlewares.length).toBe(1)
151
+ })
152
+
153
+ test('mixes KeqMiddleware function and KeqNestMiddleware instance', () => {
154
+ const keqRequest = new KeqRequest()
155
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
156
+
157
+ const fnMw: KeqMiddleware = async (_ctx, next) => { await next() }
158
+ const instanceMw = {
159
+ use: async (_ctx: unknown, next: () => Promise<void>) => { await next() },
160
+ }
161
+ consumer.apply(fnMw, instanceMw).forRoutes(KEQ_ROUTES.ALL)
162
+
163
+ expect(keqRequest.middlewares.length).toBe(2)
164
+ })
165
+
166
+ test('KeqNestMiddleware instance receives ctx and next in use()', async () => {
167
+ const keqRequest = new KeqRequest()
168
+ const consumer = new KeqMiddlewareConsumer(keqRequest)
169
+
170
+ let capturedCtx: unknown = null
171
+ let capturedNext: unknown = null
172
+
173
+ const middleware = {
174
+ use: async (ctx: unknown, next: () => Promise<void>) => {
175
+ capturedCtx = ctx
176
+ capturedNext = next
177
+ await next()
178
+ },
179
+ }
180
+ consumer.apply(middleware).forRoutes(KEQ_ROUTES.ALL)
181
+
182
+ const middlewareFn = keqRequest.middlewares[0]
183
+ const mockCtx = { request: { url: { host: 'example.com', pathname: '/' }, method: 'GET' } }
184
+ const mockNext = async () => {}
185
+
186
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
187
+ await (middlewareFn as any)(mockCtx, mockNext)
188
+
189
+ expect(capturedCtx).toBe(mockCtx)
190
+ expect(typeof capturedNext).toBe('function')
191
+ })
192
+
193
+ test('KeqConsumer accepts KeqNestMiddleware instance', () => {
194
+ const scopedKeqRequest = new KeqRequest()
195
+ const consumer = new KeqConsumer(scopedKeqRequest)
196
+
197
+ const middleware = {
198
+ use: async (_ctx: unknown, next: () => Promise<void>) => { await next() },
199
+ }
200
+ consumer.apply(middleware).forRoutes(KEQ_ROUTES.ALL)
201
+
202
+ expect(scopedKeqRequest.middlewares.length).toBe(1)
203
+ })
package/dist/index.d.mts CHANGED
@@ -1,62 +1,111 @@
1
- import { KeqMiddleware } from "keq";
2
- import * as _$_nestjs_common0 from "@nestjs/common";
3
- import { DynamicModule } from "@nestjs/common";
1
+ import { Type } from "@nestjs/common";
2
+ import { KeqExecutionContext, KeqMiddleware, KeqNext, KeqRequest } from "keq";
4
3
 
5
- //#region src/types/keq-module-options.d.ts
4
+ //#region src/keq.module.d.ts
5
+ declare class KeqModule {}
6
+ //#endregion
7
+ //#region src/constants.d.ts
8
+ declare const KEQ_ROUTES: {
9
+ readonly ALL: symbol;
10
+ };
11
+ //#endregion
12
+ //#region src/interfaces/keq-nest-middleware.interface.d.ts
13
+ interface KeqNestMiddleware {
14
+ use(ctx: KeqExecutionContext, next: KeqNext): void | PromiseLike<void>;
15
+ }
16
+ //#endregion
17
+ //#region src/keq-consumer.d.ts
18
+ /**
19
+ * 为指定 Keq 模块按路由注册中间件。
20
+ *
21
+ * Keq 模块由 `@keq-request/cli` 生成,通过
22
+ * {@link InjectKeqConsumer} 装饰器注入本实例。
23
+ *
24
+ * @typeParam T - 目标模块类
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * constructor(
29
+ * \@InjectKeqConsumer(GeneratedModule) consumer: KeqConsumer<GeneratedModule>,
30
+ * ) {
31
+ * consumer.apply(authMw).forRoutes('*')
32
+ * }
33
+ * ```
34
+ */
35
+ declare class KeqConsumer<T = KeqModuleClass> {
36
+ private readonly keqRequest;
37
+ constructor(keqRequest: KeqRequest);
38
+ apply(...middlewares: Array<KeqNestMiddleware | KeqMiddleware>): KeqScopedConfigProxy<T>;
39
+ }
40
+ //#endregion
41
+ //#region src/interfaces/keq-middleware-consumer.interface.d.ts
42
+ interface KeqRouteInfo {
43
+ host?: string;
44
+ method?: string;
45
+ pathname?: string;
46
+ }
47
+ interface KeqModuleClass extends Type<any> {
48
+ readonly KEQ_REQUEST: symbol;
49
+ readonly KEQ_CONSUMER: symbol;
50
+ }
51
+ /** forRoutes() 接受的路由目标(不再包含 KeqModuleClass,模块绑定通过 @InjectKeqConsumer 实现) */
52
+ type KeqRouteTarget = typeof KEQ_ROUTES.ALL | KeqRouteInfo;
53
+ interface KeqMiddlewareConfigProxy {
54
+ exclude(...routes: KeqRouteInfo[]): KeqMiddlewareConfigProxy;
55
+ forRoutes(...routes: KeqRouteTarget[]): KeqMiddlewareConsumer;
56
+ }
57
+ /** 模块绑定 Consumer 的配置代理,forRoutes() 返回 KeqConsumer<T> */
58
+ interface KeqScopedConfigProxy<T = KeqModuleClass> {
59
+ exclude(...routes: KeqRouteInfo[]): KeqScopedConfigProxy<T>;
60
+ forRoutes(...routes: KeqRouteTarget[]): KeqConsumer<T>;
61
+ }
62
+ //#endregion
63
+ //#region src/keq-middleware-consumer.d.ts
64
+ /**
65
+ * 全局中间件消费者,提供 `.apply().forRoutes()` API。
66
+ *
67
+ * `forRoutes()` 返回 `KeqMiddlewareConsumer` 自身,支持链式注册:
68
+ *
69
+ * ```ts
70
+ * consumer
71
+ * .apply(mw1).forRoutes(KEQ_ROUTES.ALL)
72
+ * .apply(mw2).forRoutes({ pathname: '/api/*' })
73
+ * ```
74
+ *
75
+ * 模块级别的中间件请使用 `@InjectKeqConsumer(GeneratedModule)` 注入
76
+ * `KeqConsumer<GeneratedModule>`,其 `forRoutes()` 直接作用于目标模块。
77
+ */
78
+ declare class KeqMiddlewareConsumer {
79
+ private readonly keqRequest;
80
+ constructor(keqRequest: KeqRequest);
81
+ apply(...middlewares: Array<KeqNestMiddleware | KeqMiddleware>): KeqMiddlewareConfigProxy;
82
+ }
83
+ //#endregion
84
+ //#region src/interfaces/keq-module-options.interface.d.ts
6
85
  interface KeqModuleOptions {
7
86
  middlewares?: KeqMiddleware[];
87
+ isolate?: boolean;
8
88
  }
9
89
  //#endregion
10
- //#region src/keq.module-definition.d.ts
11
- declare const ConfigurableModuleClass: _$_nestjs_common0.ConfigurableModuleCls<KeqModuleOptions, "register", "create", {}>, MODULE_OPTIONS_TOKEN: string | symbol, OPTIONS_TYPE: KeqModuleOptions & Partial<{}>, ASYNC_OPTIONS_TYPE: _$_nestjs_common0.ConfigurableModuleAsyncOptions<KeqModuleOptions, "create"> & Partial<{}>;
12
- //#endregion
13
- //#region src/keq.module.d.ts
90
+ //#region src/decorators/inject-keq-consumer.decorator.d.ts
14
91
  /**
15
- * KeqModule - Dynamic module for integrating Keq HTTP client with NestJS
92
+ * 注入绑定到指定 Keq Module 的 `KeqConsumer<T>`。
16
93
  *
17
- * This module is global, so KeqRequest can be injected anywhere in your application
18
- * without needing to import the module in every feature module.
94
+ * 被注入的 Module Class 必须同时包含 `KEQ_REQUEST` 和 `KEQ_CONSUMER` 静态属性,
95
+ * 两者均由 keq CLI 生成。
19
96
  *
20
- * @example
21
- * ```typescript
22
- * // Synchronous registration
23
- * KeqModule.register({
24
- * middlewares: [...]
25
- * })
26
- *
27
- * // Asynchronous registration
28
- * KeqModule.registerAsync({
29
- * imports: [ConfigModule],
30
- * useFactory: (config: ConfigService) => ({
31
- * middlewares: [...]
32
- * }),
33
- * inject: [ConfigService]
34
- * })
35
- *
36
- * // Inject in service
37
- * class UserService {
38
- * constructor(private readonly keqRequest: KeqRequest) {}
39
- * async getUser(id: string) {
40
- * return await this.keqRequest.get(`/users/${id}`).resolveWith('json')
41
- * }
97
+ * 使用方式:
98
+ * ```ts
99
+ * constructor(
100
+ * \@InjectKeqConsumer(GeneratedModule) consumer: KeqConsumer<GeneratedModule>,
101
+ * ) {
102
+ * consumer.apply(mw).forRoutes('*')
42
103
  * }
43
104
  * ```
105
+ *
106
+ * @param moduleClass - 目标 KeqModule 类(需具有 `KEQ_REQUEST` 和 `KEQ_CONSUMER` symbol)
44
107
  */
45
- declare class KeqModule extends ConfigurableModuleClass {
46
- /**
47
- * Register the module with synchronous options
48
- * @param options - Configuration options including middlewares
49
- * @returns DynamicModule with KeqRequest provider
50
- */
51
- static register(options: typeof OPTIONS_TYPE): DynamicModule;
52
- /**
53
- * Register the module with asynchronous options
54
- * Useful when you need to inject dependencies like ConfigService
55
- * @param options - Async configuration options
56
- * @returns DynamicModule with KeqRequest provider
57
- */
58
- static registerAsync(options: typeof ASYNC_OPTIONS_TYPE): DynamicModule;
59
- }
60
- //#endregion
61
- export { KeqModule, KeqModuleOptions };
108
+ declare function InjectKeqConsumer<T extends KeqModuleClass>(moduleClass: T): ParameterDecorator;
109
+ //#endregion
110
+ export { InjectKeqConsumer, KEQ_ROUTES, KeqConsumer, type KeqMiddlewareConfigProxy, KeqMiddlewareConsumer, KeqModule, type KeqModuleClass, type KeqModuleOptions, type KeqNestMiddleware, type KeqRouteInfo, type KeqRouteTarget, type KeqScopedConfigProxy };
62
111
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/keq-module-options.ts","../src/keq.module-definition.ts","../src/keq.module.ts"],"mappings":";;;;;UAGiB,gBAAA;EACf,WAAA,GAAc,aAAA;AAAA;;;cCEd,uBAAA,EAAuB,iBAAA,CAAA,qBAAA,CAAA,gBAAA,6BAAA,oBAAA,mBAAA,YAAA,EAEX,gBAAA,GAAA,OAAA,MAAA,kBAAA,EACM,iBAAA,CAAA,8BAAA,CAAA,gBAAA,cAAA,OAAA;;;;;;ADNpB;;;;;;;;ACEA;;;;;;;;;;;;;;;;;;;;cCsDa,SAAA,SAAkB,uBAAA;EDnD7B;;;;;EAAA,OCyDO,QAAA,CAAS,OAAA,SAAgB,YAAA,GAAe,aAAA;EAN1B;;;;;;EAAA,OAoBd,aAAA,CAAc,OAAA,SAAgB,kBAAA,GAAqB,aAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/keq.module.ts","../src/constants.ts","../src/interfaces/keq-nest-middleware.interface.ts","../src/keq-consumer.ts","../src/interfaces/keq-middleware-consumer.interface.ts","../src/keq-middleware-consumer.ts","../src/interfaces/keq-module-options.interface.ts","../src/decorators/inject-keq-consumer.decorator.ts"],"mappings":";;;;cAaa,SAAA;;;cCbA,UAAA;EAAA,SAEH,GAAA;AAAA;;;UCCO,iBAAA;EACf,GAAA,CAAI,GAAA,EAAK,mBAAA,EAAqB,IAAA,EAAM,OAAA,UAAiB,WAAA;AAAA;;;AFCvD;;;;;;;;ACLA;;;;;;;;ACGA;AFEA,cGmBa,WAAA,KAAgB,cAAA;EAAA,iBACE,UAAA;cAAA,UAAA,EAAY,UAAA;EAEzC,KAAA,CAAA,GACK,WAAA,EAAa,KAAA,CAAM,iBAAA,GAAoB,aAAA,IACzC,oBAAA,CAAqB,CAAA;AAAA;;;UCvBT,YAAA;EACf,IAAA;EACA,MAAA;EACA,QAAA;AAAA;AAAA,UAGe,cAAA,SAAuB,IAAA;EAAA,SAC7B,WAAA;EAAA,SACA,YAAA;AAAA;;KAIC,cAAA,UAAwB,UAAA,CAAW,GAAA,GAAM,YAAA;AAAA,UAEpC,wBAAA;EACf,OAAA,IAAW,MAAA,EAAQ,YAAA,KAAiB,wBAAA;EACpC,SAAA,IAAa,MAAA,EAAQ,cAAA,KAAmB,qBAAA;AAAA;;UAIzB,oBAAA,KAAyB,cAAA;EACxC,OAAA,IAAW,MAAA,EAAQ,YAAA,KAAiB,oBAAA,CAAqB,CAAA;EACzD,SAAA,IAAa,MAAA,EAAQ,cAAA,KAAmB,WAAA,CAAY,CAAA;AAAA;;;AJvBtD;;;;;;;;ACLA;;;;;;ADKA,cKkBa,qBAAA;EAAA,iBACkB,UAAA;cAAA,UAAA,EAAY,UAAA;EAEzC,KAAA,CAAA,GACK,WAAA,EAAa,KAAA,CAAM,iBAAA,GAAoB,aAAA,IACzC,wBAAA;AAAA;;;UCzBY,gBAAA;EACf,WAAA,GAAc,aAAA;EACd,OAAA;AAAA;;;;;;ANAF;;;;;;;;ACLA;;;;;;iBMqBgB,iBAAA,WAA4B,cAAA,CAAA,CAC1C,WAAA,EAAa,CAAA,GACZ,kBAAA"}