@expressots/adapter-express 3.0.0 → 4.0.0-preview.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -21
- package/README.md +61 -118
- package/lib/CHANGELOG.md +36 -5
- package/lib/README.md +61 -118
- package/lib/cjs/adapter-express/application-express.base.js +3 -1
- package/lib/cjs/adapter-express/application-express.js +1405 -85
- package/lib/cjs/adapter-express/express-utils/conditional-middleware.js +102 -0
- package/lib/cjs/adapter-express/express-utils/constants.js +17 -0
- package/lib/cjs/adapter-express/express-utils/content-negotiation-decorators.js +129 -0
- package/lib/cjs/adapter-express/express-utils/decorators.js +225 -59
- package/lib/cjs/adapter-express/express-utils/exception-filter-decorators.js +11 -0
- package/lib/cjs/adapter-express/express-utils/guard-context-factory.js +84 -0
- package/lib/cjs/adapter-express/express-utils/guard-middleware.js +115 -0
- package/lib/cjs/adapter-express/express-utils/guard-utils.js +18 -0
- package/lib/cjs/adapter-express/express-utils/http-context-store.js +15 -0
- package/lib/cjs/adapter-express/express-utils/http-status-middleware.js +37 -2
- package/lib/cjs/adapter-express/express-utils/index.js +67 -1
- package/lib/cjs/adapter-express/express-utils/interceptor-middleware.js +132 -0
- package/lib/cjs/adapter-express/express-utils/inversify-express-server.js +827 -64
- package/lib/cjs/adapter-express/express-utils/lazy-module-middleware.js +241 -0
- package/lib/cjs/adapter-express/express-utils/middleware-composition.js +95 -0
- package/lib/cjs/adapter-express/express-utils/path-pattern-compat.js +129 -0
- package/lib/cjs/adapter-express/express-utils/permission-preloader.middleware.js +48 -0
- package/lib/cjs/adapter-express/express-utils/route-constraints.js +104 -0
- package/lib/cjs/adapter-express/express-utils/scope-extractor.interface.js +2 -0
- package/lib/cjs/adapter-express/express-utils/scope-extractor.js +66 -0
- package/lib/cjs/adapter-express/express-utils/setup-authorization.js +71 -0
- package/lib/cjs/adapter-express/express-utils/setup-event-system.js +113 -0
- package/lib/cjs/adapter-express/express-utils/setup-interceptors.js +103 -0
- package/lib/cjs/adapter-express/express-utils/setup-lazy-loading.js +228 -0
- package/lib/cjs/adapter-express/express-utils/utils.js +30 -12
- package/lib/cjs/adapter-express/express-utils/validation-decorators.js +205 -0
- package/lib/cjs/adapter-express/express-utils/validation-service.js +252 -0
- package/lib/cjs/adapter-express/index.js +7 -5
- package/lib/cjs/adapter-express/micro-api/application-express-micro-route.js +31 -1
- package/lib/cjs/adapter-express/micro-api/application-express-micro.js +8 -38
- package/lib/cjs/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
- package/lib/cjs/adapter-express/micro-api/gateway/index.js +11 -0
- package/lib/cjs/adapter-express/micro-api/gateway/service-proxy.js +214 -0
- package/lib/cjs/adapter-express/micro-api/index.js +27 -3
- package/lib/cjs/adapter-express/micro-api/micro.js +272 -0
- package/lib/cjs/adapter-express/micro-api/queue/index.js +8 -0
- package/lib/cjs/adapter-express/micro-api/queue/queue.interface.js +2 -0
- package/lib/cjs/adapter-express/micro-api/queue/rabbitmq-consumer.js +255 -0
- package/lib/cjs/adapter-express/micro-api/serverless/aws-lambda.adapter.js +183 -0
- package/lib/cjs/adapter-express/micro-api/serverless/cloudflare.adapter.js +158 -0
- package/lib/cjs/adapter-express/micro-api/serverless/index.js +12 -0
- package/lib/cjs/adapter-express/micro-api/serverless/vercel.adapter.js +102 -0
- package/lib/cjs/adapter-express/micro-api/service-mesh/index.js +10 -0
- package/lib/cjs/adapter-express/micro-api/service-mesh/service-client.js +194 -0
- package/lib/cjs/adapter-express/micro-api/service-mesh/service-discovery.js +261 -0
- package/lib/cjs/adapter-express/middleware/index.js +21 -0
- package/lib/cjs/adapter-express/middleware/request-logging.middleware.js +244 -0
- package/lib/cjs/adapter-express/render/engine.js +15 -15
- package/lib/cjs/adapter-express/render/index.js +5 -0
- package/lib/cjs/adapter-express/studio/index.js +10 -0
- package/lib/cjs/adapter-express/studio/studio-integration.js +267 -0
- package/lib/cjs/index.js +1 -1
- package/lib/cjs/types/adapter-express/application-express.base.d.ts +20 -7
- package/lib/cjs/types/adapter-express/application-express.d.ts +316 -33
- package/lib/cjs/types/adapter-express/express-utils/base-middleware.d.ts +2 -2
- package/lib/cjs/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
- package/lib/cjs/types/adapter-express/express-utils/constants.d.ts +13 -0
- package/lib/cjs/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
- package/lib/cjs/types/adapter-express/express-utils/decorators.d.ts +54 -6
- package/lib/cjs/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
- package/lib/cjs/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
- package/lib/cjs/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
- package/lib/cjs/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
- package/lib/cjs/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
- package/lib/cjs/types/adapter-express/express-utils/httpResponseMessage.d.ts +1 -1
- package/lib/cjs/types/adapter-express/express-utils/index.d.ts +30 -2
- package/lib/cjs/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
- package/lib/cjs/types/adapter-express/express-utils/interfaces.d.ts +42 -5
- package/lib/cjs/types/adapter-express/express-utils/inversify-express-server.d.ts +114 -2
- package/lib/cjs/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
- package/lib/cjs/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
- package/lib/cjs/types/adapter-express/express-utils/path-pattern-compat.d.ts +66 -0
- package/lib/cjs/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
- package/lib/cjs/types/adapter-express/express-utils/route-constraints.d.ts +98 -0
- package/lib/cjs/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
- package/lib/cjs/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
- package/lib/cjs/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
- package/lib/cjs/types/adapter-express/express-utils/utils.d.ts +17 -2
- package/lib/cjs/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
- package/lib/cjs/types/adapter-express/express-utils/validation-service.d.ts +88 -0
- package/lib/cjs/types/adapter-express/index.d.ts +6 -4
- package/lib/cjs/types/adapter-express/micro-api/application-express-micro-route.d.ts +25 -14
- package/lib/cjs/types/adapter-express/micro-api/application-express-micro.d.ts +3 -10
- package/lib/cjs/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
- package/lib/cjs/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
- package/lib/cjs/types/adapter-express/micro-api/index.d.ts +7 -1
- package/lib/cjs/types/adapter-express/micro-api/micro.d.ts +83 -0
- package/lib/cjs/types/adapter-express/micro-api/queue/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
- package/lib/cjs/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
- package/lib/cjs/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
- package/lib/cjs/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
- package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
- package/lib/cjs/types/adapter-express/middleware/index.d.ts +5 -0
- package/lib/cjs/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
- package/lib/cjs/types/adapter-express/render/index.d.ts +1 -0
- package/lib/cjs/types/adapter-express/studio/index.d.ts +1 -0
- package/lib/cjs/types/adapter-express/studio/studio-integration.d.ts +170 -0
- package/lib/cjs/types/index.d.ts +1 -1
- package/lib/esm/adapter-express/application-express.base.js +24 -0
- package/lib/esm/adapter-express/application-express.js +1656 -0
- package/lib/esm/adapter-express/application-express.types.js +1 -0
- package/lib/esm/adapter-express/express-utils/base-middleware.js +19 -0
- package/lib/esm/adapter-express/express-utils/conditional-middleware.js +96 -0
- package/lib/esm/adapter-express/express-utils/constants.js +63 -0
- package/lib/esm/adapter-express/express-utils/content/httpContent.js +6 -0
- package/lib/esm/adapter-express/express-utils/content-negotiation-decorators.js +120 -0
- package/lib/esm/adapter-express/express-utils/decorators.js +604 -0
- package/lib/esm/adapter-express/express-utils/exception-filter-decorators.js +6 -0
- package/lib/esm/adapter-express/express-utils/guard-context-factory.js +83 -0
- package/lib/esm/adapter-express/express-utils/guard-middleware.js +115 -0
- package/lib/esm/adapter-express/express-utils/guard-utils.js +14 -0
- package/lib/esm/adapter-express/express-utils/http-context-store.js +10 -0
- package/lib/esm/adapter-express/express-utils/http-status-middleware.js +116 -0
- package/lib/esm/adapter-express/express-utils/httpResponseMessage.js +29 -0
- package/lib/esm/adapter-express/express-utils/index.js +24 -0
- package/lib/esm/adapter-express/express-utils/interceptor-middleware.js +130 -0
- package/lib/esm/adapter-express/express-utils/interfaces.js +1 -0
- package/lib/esm/adapter-express/express-utils/inversify-express-server.js +1047 -0
- package/lib/esm/adapter-express/express-utils/lazy-module-middleware.js +236 -0
- package/lib/esm/adapter-express/express-utils/middleware-composition.js +89 -0
- package/lib/esm/adapter-express/express-utils/path-pattern-compat.js +125 -0
- package/lib/esm/adapter-express/express-utils/permission-preloader.middleware.js +45 -0
- package/lib/esm/adapter-express/express-utils/resolver-multer.js +30 -0
- package/lib/esm/adapter-express/express-utils/route-constraints.js +100 -0
- package/lib/esm/adapter-express/express-utils/scope-extractor.interface.js +1 -0
- package/lib/esm/adapter-express/express-utils/scope-extractor.js +63 -0
- package/lib/esm/adapter-express/express-utils/setup-authorization.js +68 -0
- package/lib/esm/adapter-express/express-utils/setup-event-system.js +110 -0
- package/lib/esm/adapter-express/express-utils/setup-interceptors.js +100 -0
- package/lib/esm/adapter-express/express-utils/setup-lazy-loading.js +225 -0
- package/lib/esm/adapter-express/express-utils/utils.js +68 -0
- package/lib/esm/adapter-express/express-utils/validation-decorators.js +199 -0
- package/lib/esm/adapter-express/express-utils/validation-service.js +251 -0
- package/lib/esm/adapter-express/index.js +7 -0
- package/lib/esm/adapter-express/micro-api/application-express-micro-container.js +48 -0
- package/lib/esm/adapter-express/micro-api/application-express-micro-route.js +128 -0
- package/lib/esm/adapter-express/micro-api/application-express-micro.js +157 -0
- package/lib/esm/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
- package/lib/esm/adapter-express/micro-api/gateway/index.js +5 -0
- package/lib/esm/adapter-express/micro-api/gateway/service-proxy.js +210 -0
- package/lib/esm/adapter-express/micro-api/index.js +10 -0
- package/lib/esm/adapter-express/micro-api/micro.js +266 -0
- package/lib/esm/adapter-express/micro-api/queue/index.js +4 -0
- package/lib/esm/adapter-express/micro-api/queue/queue.interface.js +1 -0
- package/lib/esm/adapter-express/micro-api/queue/rabbitmq-consumer.js +229 -0
- package/lib/esm/adapter-express/micro-api/serverless/aws-lambda.adapter.js +180 -0
- package/lib/esm/adapter-express/micro-api/serverless/cloudflare.adapter.js +155 -0
- package/lib/esm/adapter-express/micro-api/serverless/index.js +6 -0
- package/lib/esm/adapter-express/micro-api/serverless/vercel.adapter.js +99 -0
- package/lib/esm/adapter-express/micro-api/service-mesh/index.js +5 -0
- package/lib/esm/adapter-express/micro-api/service-mesh/service-client.js +191 -0
- package/lib/esm/adapter-express/micro-api/service-mesh/service-discovery.js +259 -0
- package/lib/esm/adapter-express/middleware/index.js +5 -0
- package/lib/esm/adapter-express/middleware/request-logging.middleware.js +239 -0
- package/lib/esm/adapter-express/render/constants.js +37 -0
- package/lib/esm/adapter-express/render/engine.js +51 -0
- package/lib/esm/adapter-express/render/index.js +1 -0
- package/lib/esm/adapter-express/render/resolve-render.js +30 -0
- package/lib/esm/adapter-express/studio/index.js +1 -0
- package/lib/esm/adapter-express/studio/studio-integration.js +236 -0
- package/lib/esm/index.mjs +1 -0
- package/lib/esm/package.json +3 -0
- package/lib/esm/types/adapter-express/application-express.base.d.ts +77 -0
- package/lib/esm/types/adapter-express/application-express.d.ts +453 -0
- package/lib/esm/types/adapter-express/application-express.types.d.ts +23 -0
- package/lib/esm/types/adapter-express/express-utils/base-middleware.d.ts +8 -0
- package/lib/esm/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
- package/lib/esm/types/adapter-express/express-utils/constants.d.ts +57 -0
- package/lib/esm/types/adapter-express/express-utils/content/httpContent.d.ts +6 -0
- package/lib/esm/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
- package/lib/esm/types/adapter-express/express-utils/decorators.d.ts +257 -0
- package/lib/esm/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
- package/lib/esm/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
- package/lib/esm/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
- package/lib/esm/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
- package/lib/esm/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
- package/lib/esm/types/adapter-express/express-utils/http-status-middleware.d.ts +26 -0
- package/lib/esm/types/adapter-express/express-utils/httpResponseMessage.d.ts +14 -0
- package/lib/esm/types/adapter-express/express-utils/index.d.ts +30 -0
- package/lib/esm/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
- package/lib/esm/types/adapter-express/express-utils/interfaces.d.ts +115 -0
- package/lib/esm/types/adapter-express/express-utils/inversify-express-server.d.ts +172 -0
- package/lib/esm/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
- package/lib/esm/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
- package/lib/esm/types/adapter-express/express-utils/path-pattern-compat.d.ts +66 -0
- package/lib/esm/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
- package/lib/esm/types/adapter-express/express-utils/resolver-multer.d.ts +7 -0
- package/lib/esm/types/adapter-express/express-utils/route-constraints.d.ts +98 -0
- package/lib/esm/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
- package/lib/esm/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
- package/lib/esm/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
- package/lib/esm/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
- package/lib/esm/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
- package/lib/esm/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
- package/lib/esm/types/adapter-express/express-utils/utils.d.ts +24 -0
- package/lib/esm/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
- package/lib/esm/types/adapter-express/express-utils/validation-service.d.ts +88 -0
- package/lib/esm/types/adapter-express/index.d.ts +7 -0
- package/lib/esm/types/adapter-express/micro-api/application-express-micro-container.d.ts +47 -0
- package/lib/esm/types/adapter-express/micro-api/application-express-micro-route.d.ts +104 -0
- package/lib/esm/types/adapter-express/micro-api/application-express-micro.d.ts +72 -0
- package/lib/esm/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
- package/lib/esm/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
- package/lib/esm/types/adapter-express/micro-api/index.d.ts +7 -0
- package/lib/esm/types/adapter-express/micro-api/micro.d.ts +83 -0
- package/lib/esm/types/adapter-express/micro-api/queue/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
- package/lib/esm/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
- package/lib/esm/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
- package/lib/esm/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
- package/lib/esm/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
- package/lib/esm/types/adapter-express/middleware/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
- package/lib/esm/types/adapter-express/render/constants.d.ts +26 -0
- package/lib/esm/types/adapter-express/render/engine.d.ts +20 -0
- package/lib/esm/types/adapter-express/render/index.d.ts +5 -0
- package/lib/esm/types/adapter-express/render/resolve-render.d.ts +7 -0
- package/lib/esm/types/adapter-express/studio/index.d.ts +1 -0
- package/lib/esm/types/adapter-express/studio/studio-integration.d.ts +170 -0
- package/lib/esm/types/index.d.ts +1 -0
- package/lib/package.json +170 -146
- package/package.json +170 -146
- package/lib/cjs/di/di.interfaces.js +0 -10
- package/lib/cjs/types/di/di.interfaces.d.ts +0 -289
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
|
-
import { PARAMETER_TYPE, HTTP_VERBS_ENUM } from "./constants";
|
|
3
|
-
import type { HandlerDecorator, Middleware } from "./interfaces";
|
|
2
|
+
import { PARAMETER_TYPE, HTTP_VERBS_ENUM } from "./constants.js";
|
|
3
|
+
import type { HandlerDecorator, Middleware, NewableFunction } from "./interfaces.js";
|
|
4
4
|
import { Request } from "express";
|
|
5
|
-
export declare const injectHttpContext:
|
|
5
|
+
export declare const injectHttpContext: ParameterDecorator & PropertyDecorator;
|
|
6
6
|
/**
|
|
7
7
|
* Controller decorator to define a new controller
|
|
8
8
|
* @param path route path
|
|
@@ -24,6 +24,25 @@ export declare function controller(path: string, ...middleware: Array<Middleware
|
|
|
24
24
|
* @public API
|
|
25
25
|
*/
|
|
26
26
|
export declare function Http(code: number): (target: object, key: string | symbol, descriptor: TypedPropertyDescriptor<any>) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Version decorator to define the API version for a controller or route method
|
|
29
|
+
* @param version API version (e.g., "1", "1.0", "v1", or 1)
|
|
30
|
+
* @returns ClassDecorator | MethodDecorator
|
|
31
|
+
* @example ```typescript
|
|
32
|
+
* @Version("1")
|
|
33
|
+
* @controller("/users")
|
|
34
|
+
* class UserController {}
|
|
35
|
+
*
|
|
36
|
+
* // Or at method level:
|
|
37
|
+
* @Version("2")
|
|
38
|
+
* @Get("/")
|
|
39
|
+
* getUsers() {
|
|
40
|
+
* return "v2 users";
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
* @public API
|
|
44
|
+
*/
|
|
45
|
+
export declare function Version(version: string | number): (target: any, key?: string | symbol, descriptor?: any) => void;
|
|
27
46
|
/**
|
|
28
47
|
* Decorator to allow accept all HTTP methods
|
|
29
48
|
* @param path route path, wildcard
|
|
@@ -195,11 +214,40 @@ type FieldOptions = {
|
|
|
195
214
|
maxCount?: number;
|
|
196
215
|
};
|
|
197
216
|
/**
|
|
198
|
-
* File upload decorator to handle file uploads
|
|
199
|
-
*
|
|
200
|
-
*
|
|
217
|
+
* File upload decorator to handle file uploads.
|
|
218
|
+
*
|
|
219
|
+
* This decorator integrates with the global upload configuration
|
|
220
|
+
* set via `Middleware.upload()` in app.ts. If global config exists,
|
|
221
|
+
* it will be used as defaults, with local options taking precedence.
|
|
222
|
+
*
|
|
223
|
+
* @param options - Field configuration (fieldName, maxCount, none, any)
|
|
224
|
+
* @param multerOptions - Optional multer options (overrides global config)
|
|
201
225
|
* @default { none: true }
|
|
202
226
|
* @returns MethodDecorator
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```typescript
|
|
230
|
+
* // In app.ts - configure globally (optional)
|
|
231
|
+
* this.Middleware.upload({
|
|
232
|
+
* destination: './uploads',
|
|
233
|
+
* limits: { fileSize: 10 * 1024 * 1024 }
|
|
234
|
+
* });
|
|
235
|
+
*
|
|
236
|
+
* // In controller - uses global config automatically
|
|
237
|
+
* @Post('avatar')
|
|
238
|
+
* @FileUpload({ fieldName: 'avatar' })
|
|
239
|
+
* uploadAvatar(req: Request) {
|
|
240
|
+
* return req.file;
|
|
241
|
+
* }
|
|
242
|
+
*
|
|
243
|
+
* // Override global config for specific endpoint
|
|
244
|
+
* @Post('document')
|
|
245
|
+
* @FileUpload({ fieldName: 'doc' }, { limits: { fileSize: 50 * 1024 * 1024 } })
|
|
246
|
+
* uploadDocument(req: Request) {
|
|
247
|
+
* return req.file;
|
|
248
|
+
* }
|
|
249
|
+
* ```
|
|
250
|
+
*
|
|
203
251
|
* @public API
|
|
204
252
|
*/
|
|
205
253
|
export declare function FileUpload(options?: FieldOptions | Array<FieldOptions> | {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { Request, Response } from "express";
|
|
3
|
+
import { interfaces } from "@expressots/core";
|
|
4
|
+
import type { GuardContext } from "@expressots/core";
|
|
5
|
+
import type { IScopeExtractor } from "./scope-extractor.interface.js";
|
|
6
|
+
/**
|
|
7
|
+
* Factory for creating GuardContext from Express request/response
|
|
8
|
+
*/
|
|
9
|
+
export declare class GuardContextFactory {
|
|
10
|
+
private container;
|
|
11
|
+
private scopeExtractor;
|
|
12
|
+
constructor(container: interfaces.Container, scopeExtractor: IScopeExtractor);
|
|
13
|
+
/**
|
|
14
|
+
* Create GuardContext from Express request/response
|
|
15
|
+
*/
|
|
16
|
+
create(req: Request, res: Response): Promise<GuardContext>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from "express";
|
|
2
|
+
import { Container } from "@expressots/core";
|
|
3
|
+
import { GuardExecutor } from "@expressots/core";
|
|
4
|
+
import { GuardContextFactory } from "./guard-context-factory.js";
|
|
5
|
+
/**
|
|
6
|
+
* Express middleware that executes guards before route handler
|
|
7
|
+
*/
|
|
8
|
+
export declare class GuardMiddleware {
|
|
9
|
+
private executor;
|
|
10
|
+
private contextFactory;
|
|
11
|
+
private container;
|
|
12
|
+
constructor(executor: GuardExecutor, contextFactory: GuardContextFactory, container: Container);
|
|
13
|
+
/**
|
|
14
|
+
* Express middleware function
|
|
15
|
+
*/
|
|
16
|
+
execute: (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Extract guards from request metadata
|
|
19
|
+
* @private
|
|
20
|
+
*/
|
|
21
|
+
private extractGuards;
|
|
22
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import type { GuardClass, IGuard } from "@expressots/core";
|
|
3
|
+
import type { NewableFunction } from "./interfaces.js";
|
|
4
|
+
/**
|
|
5
|
+
* Extract guards from controller metadata
|
|
6
|
+
*/
|
|
7
|
+
export declare function getControllerGuards(constructor: NewableFunction): Array<GuardClass | IGuard>;
|
|
8
|
+
/**
|
|
9
|
+
* Extract guards from method metadata
|
|
10
|
+
*/
|
|
11
|
+
export declare function getMethodGuards(constructor: NewableFunction, methodName: string | symbol): Array<GuardClass | IGuard>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request HttpContext storage.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the previous `Reflect.defineMetadata(METADATA_KEY.httpContext, ctx, req)`
|
|
5
|
+
* call in `InversifyExpressServer.build()`, which paid the cost of
|
|
6
|
+
* `reflect-metadata` map allocation and key lookup on every single request.
|
|
7
|
+
*
|
|
8
|
+
* A `WeakMap<Request, HttpContext>` is functionally identical (lookup keyed
|
|
9
|
+
* by request reference, GC'd when the request goes out of scope) and is
|
|
10
|
+
* substantially cheaper on the hot path because it bypasses
|
|
11
|
+
* `reflect-metadata`'s string-keyed metadata store.
|
|
12
|
+
*
|
|
13
|
+
* Both `InversifyExpressServer` and `GuardContextFactory` use this module
|
|
14
|
+
* so they observe the same per-request value.
|
|
15
|
+
*/
|
|
16
|
+
import type { Request } from "express";
|
|
17
|
+
import type { HttpContext } from "./interfaces.js";
|
|
18
|
+
export declare function setHttpContext(req: Request, ctx: HttpContext): void;
|
|
19
|
+
export declare function getHttpContext(req: Request): HttpContext | undefined;
|
|
20
|
+
export declare function hasHttpContext(req: Request): boolean;
|
|
@@ -1,2 +1,30 @@
|
|
|
1
|
-
export * from "./decorators";
|
|
2
|
-
export {
|
|
1
|
+
export * from "./decorators.js";
|
|
2
|
+
export { Accept, Consumes, Produces, CsvOptions, XmlOptions, YamlOptions, StreamResponse, } from "./content-negotiation-decorators.js";
|
|
3
|
+
export { Controller } from "./interfaces.js";
|
|
4
|
+
export { Patterns, pattern } from "./route-constraints.js";
|
|
5
|
+
export { when, unless, isConditionalMiddleware } from "./conditional-middleware.js";
|
|
6
|
+
export type { ConditionalMiddlewareConfig, MiddlewareCondition } from "./conditional-middleware.js";
|
|
7
|
+
export { combine, sequence, isComposedMiddleware } from "./middleware-composition.js";
|
|
8
|
+
export type { ComposedMiddlewareConfig } from "./middleware-composition.js";
|
|
9
|
+
export { Catch, UseFilters } from "./exception-filter-decorators.js";
|
|
10
|
+
export { getControllerGuards, getMethodGuards } from "./guard-utils.js";
|
|
11
|
+
export { GuardContextFactory } from "./guard-context-factory.js";
|
|
12
|
+
export { GuardMiddleware } from "./guard-middleware.js";
|
|
13
|
+
export { InterceptorMiddleware, createInterceptorMiddleware } from "./interceptor-middleware.js";
|
|
14
|
+
export { ScopeExtractor } from "./scope-extractor.js";
|
|
15
|
+
export type { IScopeExtractor } from "./scope-extractor.interface.js";
|
|
16
|
+
export { PermissionPreloaderMiddleware } from "./permission-preloader.middleware.js";
|
|
17
|
+
export { TYPE } from "./constants.js";
|
|
18
|
+
export type { AuthProvider, Principal } from "./interfaces.js";
|
|
19
|
+
export { setupAuthorizationForExpress } from "./setup-authorization.js";
|
|
20
|
+
export { setupEventSystemForExpress } from "./setup-event-system.js";
|
|
21
|
+
export type { EventSystemOptions, EventSystemSetupResult } from "./setup-event-system.js";
|
|
22
|
+
export { setupInterceptorsForExpress } from "./setup-interceptors.js";
|
|
23
|
+
export type { InterceptorSystemOptions, InterceptorSystemSetupResult, BuiltInInterceptor, InterceptorClass, } from "./setup-interceptors.js";
|
|
24
|
+
export { setupLazyLoadingForExpress } from "./setup-lazy-loading.js";
|
|
25
|
+
export type { LazyLoadingOptions, LazyLoadingSetupResult, LazyLoadingExpressOptions, LazyLoadingExpressResult, LazyRouteMapping, } from "./setup-lazy-loading.js";
|
|
26
|
+
export { createLazyModuleMiddleware, createRouteMappings } from "./lazy-module-middleware.js";
|
|
27
|
+
export { validatedBody, validatedQuery, validatedParam, validatedHeaders, Validate, getValidationMetadata, hasValidationMetadata, } from "./validation-decorators.js";
|
|
28
|
+
export type { ValidationSchemaMetadata, SchemaType, ValidatedDecoratorOptions, } from "./validation-decorators.js";
|
|
29
|
+
export { ValidationService } from "./validation-service.js";
|
|
30
|
+
export { getHttpContext, hasHttpContext } from "./http-context-store.js";
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from "express";
|
|
2
|
+
import { Container, interfaces, InterceptorExecutor } from "@expressots/core";
|
|
3
|
+
import "reflect-metadata";
|
|
4
|
+
/**
|
|
5
|
+
* Express middleware that executes interceptors around route handler
|
|
6
|
+
*
|
|
7
|
+
* @layer internal
|
|
8
|
+
* @audience framework-developers
|
|
9
|
+
*
|
|
10
|
+
* @summary Quick Start
|
|
11
|
+
* InterceptorMiddleware integrates the interceptor system with Express.
|
|
12
|
+
* It wraps the route handler with interceptors defined via @UseInterceptors().
|
|
13
|
+
*
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
export declare class InterceptorMiddleware {
|
|
17
|
+
private executor;
|
|
18
|
+
private container;
|
|
19
|
+
constructor(executor: InterceptorExecutor, container: Container);
|
|
20
|
+
/**
|
|
21
|
+
* Create middleware for a specific controller and method
|
|
22
|
+
* @param controllerClass - Controller class
|
|
23
|
+
* @param methodName - Method name
|
|
24
|
+
* @param handler - Original route handler
|
|
25
|
+
*/
|
|
26
|
+
createMiddleware(controllerClass: NewableFunction, methodName: string | symbol, handler: (req: Request, res: Response, next: NextFunction) => Promise<unknown>): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Extract interceptors from controller and method metadata
|
|
29
|
+
* @private
|
|
30
|
+
*/
|
|
31
|
+
private extractInterceptors;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Factory function to create interceptor middleware
|
|
35
|
+
* @param container - DI container
|
|
36
|
+
* @param controllerClass - Controller class
|
|
37
|
+
* @param methodName - Method name
|
|
38
|
+
* @param handler - Original handler
|
|
39
|
+
*/
|
|
40
|
+
export declare function createInterceptorMiddleware(container: interfaces.Container | Container, controllerClass: NewableFunction, methodName: string | symbol, handler: (req: Request, res: Response, next: NextFunction) => Promise<unknown>): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { Application, NextFunction, Request, RequestHandler, Response } from "express";
|
|
2
|
-
import { interfaces as inversifyInterfaces } from "
|
|
3
|
-
import { HTTP_VERBS_ENUM, PARAMETER_TYPE } from "./constants";
|
|
4
|
-
import { HttpResponseMessage } from "./httpResponseMessage";
|
|
2
|
+
import { interfaces as inversifyInterfaces } from "@expressots/core";
|
|
3
|
+
import { HTTP_VERBS_ENUM, PARAMETER_TYPE } from "./constants.js";
|
|
4
|
+
import { HttpResponseMessage } from "./httpResponseMessage.js";
|
|
5
|
+
/**
|
|
6
|
+
* Type for a constructor function (class)
|
|
7
|
+
*/
|
|
8
|
+
export type NewableFunction = abstract new (...args: Array<any>) => any;
|
|
5
9
|
type Prototype<T> = {
|
|
6
10
|
[P in keyof T]: T[P] extends NewableFunction ? T[P] : T[P] | undefined;
|
|
7
11
|
} & {
|
|
@@ -15,7 +19,38 @@ export type DecoratorTarget<T = unknown> = ConstructorFunction<T> | Prototype<T>
|
|
|
15
19
|
export interface IExpressoMiddleware {
|
|
16
20
|
use(req: Request, res: Response, next: NextFunction): Promise<void> | void;
|
|
17
21
|
}
|
|
18
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Conditional middleware configuration type.
|
|
24
|
+
* Import from conditional-middleware.ts for the full ConditionalMiddlewareConfig interface.
|
|
25
|
+
*/
|
|
26
|
+
export interface ConditionalMiddlewareConfig {
|
|
27
|
+
condition: (req: Request) => boolean | Promise<boolean>;
|
|
28
|
+
middleware: Middleware;
|
|
29
|
+
skipOnFalse?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Composed middleware configuration type.
|
|
33
|
+
* Import from middleware-composition.ts for the full ComposedMiddlewareConfig interface.
|
|
34
|
+
*/
|
|
35
|
+
export interface ComposedMiddlewareConfig {
|
|
36
|
+
middleware: Array<Middleware>;
|
|
37
|
+
type: "combine" | "sequence";
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Middleware class constructor type.
|
|
41
|
+
* Supports classes that extend ExpressoMiddleware or implement IExpressoMiddleware.
|
|
42
|
+
* Accepts both concrete and abstract class constructors.
|
|
43
|
+
* Phase 2: Supports class references without 'new' keyword.
|
|
44
|
+
*/
|
|
45
|
+
export type MiddlewareClass = (new (...args: Array<unknown>) => IExpressoMiddleware) | (abstract new (...args: Array<unknown>) => IExpressoMiddleware);
|
|
46
|
+
/**
|
|
47
|
+
* Union type for all supported middleware types.
|
|
48
|
+
* Phase 2: Includes class constructors (class references) for cleaner API.
|
|
49
|
+
* Note: Uses 'any' for class constructors to support typeof class types (e.g., typeof AdminMiddleware).
|
|
50
|
+
*/
|
|
51
|
+
export type Middleware = string | symbol | RequestHandler | IExpressoMiddleware | ConditionalMiddlewareConfig | MiddlewareClass | {
|
|
52
|
+
prototype: IExpressoMiddleware;
|
|
53
|
+
} | any;
|
|
19
54
|
export type ControllerHandler = (...params: Array<unknown>) => unknown;
|
|
20
55
|
export type BaseController = Record<string, ControllerHandler>;
|
|
21
56
|
export interface Controller {
|
|
@@ -24,10 +59,12 @@ export interface ControllerMetadata {
|
|
|
24
59
|
middleware: Array<Middleware>;
|
|
25
60
|
path: string;
|
|
26
61
|
target: DecoratorTarget;
|
|
62
|
+
version?: string | number;
|
|
27
63
|
}
|
|
28
64
|
export interface ControllerMethodMetadata extends ControllerMetadata {
|
|
29
65
|
key: string;
|
|
30
66
|
method: keyof typeof HTTP_VERBS_ENUM;
|
|
67
|
+
version?: string | number;
|
|
31
68
|
}
|
|
32
69
|
export interface ControllerParameterMetadata {
|
|
33
70
|
[methodName: string]: Array<ParameterMetadata>;
|
|
@@ -39,7 +76,7 @@ export interface ParameterMetadata {
|
|
|
39
76
|
type: PARAMETER_TYPE;
|
|
40
77
|
}
|
|
41
78
|
export type ExtractedParameters = Array<ParameterMetadata> | [Request, Response, NextFunction] | Array<unknown>;
|
|
42
|
-
export type HandlerDecorator = (target:
|
|
79
|
+
export type HandlerDecorator = (target: object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => void;
|
|
43
80
|
export type ConfigFunction = (app: Application) => void;
|
|
44
81
|
export interface RoutingConfig {
|
|
45
82
|
rootPath: string;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import express, { Application, Router } from "express";
|
|
2
|
-
import { interfaces } from "
|
|
3
|
-
import type { AuthProvider, ConfigFunction, RoutingConfig } from "./interfaces";
|
|
2
|
+
import { interfaces, ContentNegotiationService } from "@expressots/core";
|
|
3
|
+
import type { AuthProvider, ConfigFunction, RoutingConfig } from "./interfaces.js";
|
|
4
|
+
import { ValidationService } from "./validation-service.js";
|
|
4
5
|
export declare class InversifyExpressServer {
|
|
5
6
|
private _router;
|
|
6
7
|
private _container;
|
|
@@ -10,6 +11,8 @@ export declare class InversifyExpressServer {
|
|
|
10
11
|
private _routingConfig;
|
|
11
12
|
private _AuthProvider;
|
|
12
13
|
private _forceControllers;
|
|
14
|
+
private _contentNegotiationService?;
|
|
15
|
+
private _validationService?;
|
|
13
16
|
/**
|
|
14
17
|
* Wrapper for the express server.
|
|
15
18
|
*
|
|
@@ -45,13 +48,122 @@ export declare class InversifyExpressServer {
|
|
|
45
48
|
* Applies all routes and configuration to the server, returning the express application.
|
|
46
49
|
*/
|
|
47
50
|
build(): express.Application;
|
|
51
|
+
/**
|
|
52
|
+
* Install a catch-all 404 handler that runs after every registered route.
|
|
53
|
+
*
|
|
54
|
+
* When the user has the suggestions feature enabled (default in development),
|
|
55
|
+
* this consults the route registry, computes "Did you mean ...?" suggestions
|
|
56
|
+
* via `getErrorHints` from `@expressots/core`, logs them through the framework
|
|
57
|
+
* Logger, and returns a structured RFC-7807-style JSON 404 instead of the
|
|
58
|
+
* default Express HTML.
|
|
59
|
+
*
|
|
60
|
+
* Users who want the legacy Express HTML 404 can opt out by configuring the
|
|
61
|
+
* Logger with `suggestions.enabled = false` (this also disables the JSON
|
|
62
|
+
* envelope so they can install their own 404 handler in the error-config fn).
|
|
63
|
+
*
|
|
64
|
+
* @private
|
|
65
|
+
*/
|
|
66
|
+
private registerNotFoundHandler;
|
|
67
|
+
/**
|
|
68
|
+
* Resolve the user-configured suggestions config, falling back to the
|
|
69
|
+
* env-aware default when the Logger is not bound or has no overrides.
|
|
70
|
+
*
|
|
71
|
+
* @private
|
|
72
|
+
*/
|
|
73
|
+
private resolveSuggestionsConfig;
|
|
74
|
+
/**
|
|
75
|
+
* Resolve the framework Logger from DI when available.
|
|
76
|
+
*
|
|
77
|
+
* @private
|
|
78
|
+
*/
|
|
79
|
+
private resolveLogger;
|
|
48
80
|
private registerControllers;
|
|
81
|
+
/**
|
|
82
|
+
* Initialize the interceptor system by binding required components
|
|
83
|
+
* @private
|
|
84
|
+
*/
|
|
85
|
+
private initializeInterceptorSystem;
|
|
86
|
+
/**
|
|
87
|
+
* Check if the interceptor system is properly initialized
|
|
88
|
+
* @private
|
|
89
|
+
*/
|
|
90
|
+
private isInterceptorSystemReady;
|
|
91
|
+
/**
|
|
92
|
+
* Extract interceptors from controller and method metadata
|
|
93
|
+
* @private
|
|
94
|
+
*/
|
|
95
|
+
private extractInterceptors;
|
|
96
|
+
/**
|
|
97
|
+
* Wrap a handler with interceptor middleware
|
|
98
|
+
* @private
|
|
99
|
+
*/
|
|
100
|
+
private wrapWithInterceptors;
|
|
101
|
+
/**
|
|
102
|
+
* Checks if a middleware item is a class constructor (not an instance).
|
|
103
|
+
* Handles classes that extend ExpressoMiddleware (which has abstract use method).
|
|
104
|
+
* Note: Abstract methods don't exist at runtime, so we check for concrete implementations.
|
|
105
|
+
*/
|
|
106
|
+
private isMiddlewareClass;
|
|
49
107
|
private isExpressoMiddleware;
|
|
50
108
|
private resolveMiddleware;
|
|
109
|
+
/**
|
|
110
|
+
* Creates a lazy middleware handler for class constructors.
|
|
111
|
+
* Supports both container-bound middleware (via @provide()) and direct instantiation.
|
|
112
|
+
*
|
|
113
|
+
* Performance: Instances are created per-request to support request-scoped state.
|
|
114
|
+
* For better performance with stateless middleware, use container-bound middleware
|
|
115
|
+
* with proper scoping (singleton/request scope) via @provide().
|
|
116
|
+
*
|
|
117
|
+
* Note: If container resolution fails (e.g., base class missing @injectable()),
|
|
118
|
+
* falls back to direct instantiation for backward compatibility.
|
|
119
|
+
*/
|
|
120
|
+
private createLazyMiddlewareHandler;
|
|
121
|
+
/**
|
|
122
|
+
* Creates a request handler for conditional middleware.
|
|
123
|
+
* Evaluates the condition and executes the wrapped middleware if condition is true.
|
|
124
|
+
*/
|
|
125
|
+
private createConditionalMiddlewareHandler;
|
|
126
|
+
/**
|
|
127
|
+
* Creates a request handler for composed middleware (Phase 3: Middleware Composition).
|
|
128
|
+
* Executes all middleware in the composition sequentially.
|
|
129
|
+
* Both 'combine' and 'sequence' types behave the same way - they execute middleware
|
|
130
|
+
* sequentially and propagate errors normally (Express handles errors via next(error)).
|
|
131
|
+
*
|
|
132
|
+
* @param config - ComposedMiddlewareConfig containing the middleware array and type
|
|
133
|
+
* @returns Express RequestHandler
|
|
134
|
+
*/
|
|
135
|
+
private createComposedMiddlewareHandler;
|
|
136
|
+
/**
|
|
137
|
+
* Executes a chain of middleware handlers sequentially.
|
|
138
|
+
* Each middleware calls next() to proceed to the next one.
|
|
139
|
+
* Handles both synchronous and asynchronous middleware.
|
|
140
|
+
*/
|
|
141
|
+
private executeMiddlewareChain;
|
|
51
142
|
private copyHeadersTo;
|
|
52
143
|
private handleHttpResponseMessage;
|
|
53
144
|
private handlerFactory;
|
|
145
|
+
private executeRouteHandler;
|
|
54
146
|
private _getHttpContext;
|
|
147
|
+
/**
|
|
148
|
+
* Sets the content negotiation service instance.
|
|
149
|
+
* @param service - Content negotiation service instance
|
|
150
|
+
*/
|
|
151
|
+
setContentNegotiationService(service: ContentNegotiationService): void;
|
|
152
|
+
/**
|
|
153
|
+
* Gets the content negotiation service if available.
|
|
154
|
+
* @returns Content negotiation service or undefined
|
|
155
|
+
*/
|
|
156
|
+
private getContentNegotiationService;
|
|
157
|
+
/**
|
|
158
|
+
* Sets the validation service instance.
|
|
159
|
+
* @param service - Validation service instance
|
|
160
|
+
*/
|
|
161
|
+
setValidationService(service: ValidationService): void;
|
|
162
|
+
/**
|
|
163
|
+
* Gets the validation service if available.
|
|
164
|
+
* @returns Validation service or undefined
|
|
165
|
+
*/
|
|
166
|
+
private getValidationService;
|
|
55
167
|
private _createHttpContext;
|
|
56
168
|
private _getCurrentUser;
|
|
57
169
|
private extractParameters;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy Module Auto-Load Middleware
|
|
3
|
+
*
|
|
4
|
+
* Automatically loads lazy modules when their routes are accessed.
|
|
5
|
+
* This provides seamless lazy loading without 404 errors.
|
|
6
|
+
*
|
|
7
|
+
* @module adapter-express
|
|
8
|
+
*/
|
|
9
|
+
import { RequestHandler, Router, Express } from "express";
|
|
10
|
+
import { LazyModuleLoader, ILazyModule } from "@expressots/core";
|
|
11
|
+
/**
|
|
12
|
+
* Route prefix mapping for lazy modules.
|
|
13
|
+
* Maps route prefixes to module names for auto-loading.
|
|
14
|
+
*/
|
|
15
|
+
export interface LazyRouteMapping {
|
|
16
|
+
/** Route prefix (e.g., "/admin", "/reports") */
|
|
17
|
+
prefix: string;
|
|
18
|
+
/** Module name to load when this prefix is accessed */
|
|
19
|
+
moduleName: string;
|
|
20
|
+
/** Whether the module is currently loaded */
|
|
21
|
+
loaded: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Configuration for the lazy module middleware.
|
|
25
|
+
*/
|
|
26
|
+
export interface LazyModuleMiddlewareConfig {
|
|
27
|
+
/** Route mappings */
|
|
28
|
+
routes: Array<LazyRouteMapping>;
|
|
29
|
+
/** The lazy module loader instance */
|
|
30
|
+
loader: LazyModuleLoader;
|
|
31
|
+
/** Global route prefix (e.g., "/api") */
|
|
32
|
+
globalPrefix?: string;
|
|
33
|
+
/** Callback when a module starts loading */
|
|
34
|
+
onLoadStart?: (moduleName: string, path: string) => void;
|
|
35
|
+
/** Callback when a module finishes loading */
|
|
36
|
+
onLoadComplete?: (moduleName: string, loadTimeMs: number) => void;
|
|
37
|
+
/** Callback when module loading fails */
|
|
38
|
+
onLoadError?: (moduleName: string, error: Error) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Express app or router for dynamic route registration.
|
|
41
|
+
* When provided, routes are registered dynamically after module load,
|
|
42
|
+
* eliminating the need for 307 redirects.
|
|
43
|
+
*/
|
|
44
|
+
expressApp?: Express | Router;
|
|
45
|
+
/**
|
|
46
|
+
* Callback to register lazy module routes after loading.
|
|
47
|
+
* When provided, this is called to register the module's routes dynamically.
|
|
48
|
+
* If not provided and expressApp is set, default registration is attempted.
|
|
49
|
+
*/
|
|
50
|
+
onRegisterRoutes?: (moduleName: string, router: Router) => void;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create middleware that auto-loads lazy modules when their routes are accessed.
|
|
54
|
+
*
|
|
55
|
+
* @layer public
|
|
56
|
+
* @audience application-developers
|
|
57
|
+
* @concept lazy-loading
|
|
58
|
+
*
|
|
59
|
+
* UNIQUE: Seamless lazy loading - no 404s! Modules load automatically
|
|
60
|
+
* when their routes are accessed for the first time.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const middleware = createLazyModuleMiddleware({
|
|
65
|
+
* routes: [
|
|
66
|
+
* { prefix: "/admin", moduleName: "AdminModule", loaded: false },
|
|
67
|
+
* { prefix: "/reports", moduleName: "ReportsModule", loaded: false }
|
|
68
|
+
* ],
|
|
69
|
+
* loader: lazyModuleLoader,
|
|
70
|
+
* globalPrefix: "/api"
|
|
71
|
+
* });
|
|
72
|
+
*
|
|
73
|
+
* app.use(middleware);
|
|
74
|
+
* ```
|
|
75
|
+
*
|
|
76
|
+
* @param config - Middleware configuration
|
|
77
|
+
* @returns Express middleware function
|
|
78
|
+
*
|
|
79
|
+
* @public API
|
|
80
|
+
*/
|
|
81
|
+
export declare function createLazyModuleMiddleware(config: LazyModuleMiddlewareConfig): RequestHandler;
|
|
82
|
+
/**
|
|
83
|
+
* Extract route prefixes from a lazy module.
|
|
84
|
+
*
|
|
85
|
+
* Uses auto-detected routes from CreateLazyModule (which analyzes @controller decorators),
|
|
86
|
+
* falls back to prefetchOn config, and finally infers from module name.
|
|
87
|
+
*
|
|
88
|
+
* @param lazyModule - The lazy module to analyze
|
|
89
|
+
* @returns Detected route prefixes
|
|
90
|
+
*
|
|
91
|
+
* @public API
|
|
92
|
+
*/
|
|
93
|
+
export declare function extractRoutePrefixes(lazyModule: ILazyModule): Array<string>;
|
|
94
|
+
/**
|
|
95
|
+
* Create route mappings from lazy modules.
|
|
96
|
+
*
|
|
97
|
+
* Route detection priority:
|
|
98
|
+
* 1. Manual routePrefixMap (if provided)
|
|
99
|
+
* 2. Auto-detected from @controller() decorators (via CreateLazyModule)
|
|
100
|
+
* 3. prefetchOn config
|
|
101
|
+
* 4. Inferred from module name
|
|
102
|
+
*
|
|
103
|
+
* @param lazyModules - Array of lazy modules
|
|
104
|
+
* @param routePrefixMap - Optional manual prefix mappings { moduleName: prefix }
|
|
105
|
+
* @returns Array of route mappings
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* // Zero-config: routes auto-detected from controllers!
|
|
110
|
+
* const mappings = createRouteMappings([AdminModule, ReportsModule]);
|
|
111
|
+
* // Automatically maps @controller("/admin") -> /admin
|
|
112
|
+
*
|
|
113
|
+
* // Or with manual overrides
|
|
114
|
+
* const mappings = createRouteMappings(
|
|
115
|
+
* [AdminModule, ReportsModule],
|
|
116
|
+
* { "AdminModule": "/admin-panel" } // Override auto-detection
|
|
117
|
+
* );
|
|
118
|
+
* ```
|
|
119
|
+
*
|
|
120
|
+
* @public API
|
|
121
|
+
*/
|
|
122
|
+
export declare function createRouteMappings(lazyModules: Array<ILazyModule>, routePrefixMap?: Record<string, string>): Array<LazyRouteMapping>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Middleware } from "./interfaces.js";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration object for composed middleware.
|
|
4
|
+
* Represents a group of middleware that should be executed together.
|
|
5
|
+
*/
|
|
6
|
+
export interface ComposedMiddlewareConfig {
|
|
7
|
+
/**
|
|
8
|
+
* Array of middleware to execute.
|
|
9
|
+
* Can be any valid ExpressoTS middleware type (function, class instance, class reference, or container-bound).
|
|
10
|
+
*/
|
|
11
|
+
middleware: Array<Middleware>;
|
|
12
|
+
/**
|
|
13
|
+
* Composition type: 'combine' or 'sequence'.
|
|
14
|
+
* - 'combine': All middleware execute sequentially, errors propagate normally
|
|
15
|
+
* - 'sequence': Middleware execute sequentially, execution stops on error
|
|
16
|
+
*/
|
|
17
|
+
type: "combine" | "sequence";
|
|
18
|
+
/**
|
|
19
|
+
* Symbol to identify composed middleware configuration objects.
|
|
20
|
+
* Used internally for type checking.
|
|
21
|
+
*/
|
|
22
|
+
[COMPOSED_MIDDLEWARE_SYMBOL]: true;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Symbol to identify composed middleware configuration objects.
|
|
26
|
+
* Used internally for type checking.
|
|
27
|
+
*/
|
|
28
|
+
export declare const COMPOSED_MIDDLEWARE_SYMBOL: unique symbol;
|
|
29
|
+
/**
|
|
30
|
+
* Type guard to check if an object is a ComposedMiddlewareConfig.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isComposedMiddleware(item: unknown): item is ComposedMiddlewareConfig;
|
|
33
|
+
/**
|
|
34
|
+
* Combines multiple middleware into a single middleware that executes all of them sequentially.
|
|
35
|
+
* All middleware will execute in order. If any middleware calls `next(error)`, the error
|
|
36
|
+
* is propagated to Express's error handling system.
|
|
37
|
+
*
|
|
38
|
+
* @param middleware - Array of middleware to combine
|
|
39
|
+
* @returns ComposedMiddlewareConfig object
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* // Combine multiple middleware into a reusable group
|
|
44
|
+
* @Get("/api", combine(AuthMiddleware, LoggingMiddleware, RateLimitMiddleware))
|
|
45
|
+
* async apiHandler() {}
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* // Combine with conditional middleware (Phase 3)
|
|
51
|
+
* @Get("/admin",
|
|
52
|
+
* when(req => req.method === "POST", combine(BodyParser, ValidationMiddleware)),
|
|
53
|
+
* combine(AuthMiddleware, LoggingMiddleware)
|
|
54
|
+
* )
|
|
55
|
+
* async adminHandler() {}
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function combine(...middleware: Array<Middleware>): ComposedMiddlewareConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Sequences multiple middleware that execute one after another.
|
|
61
|
+
* Similar to `combine()`, but semantically indicates sequential execution
|
|
62
|
+
* where each middleware depends on the previous one completing successfully.
|
|
63
|
+
* If any middleware calls `next(error)`, execution stops and the error is propagated.
|
|
64
|
+
*
|
|
65
|
+
* @param middleware - Array of middleware to sequence
|
|
66
|
+
* @returns ComposedMiddlewareConfig object
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* // Sequence middleware where each depends on the previous
|
|
71
|
+
* @Get("/api", sequence(ValidateMiddleware, TransformMiddleware, ProcessMiddleware))
|
|
72
|
+
* async apiHandler() {}
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* // Sequence with conditional middleware
|
|
78
|
+
* @Get("/data",
|
|
79
|
+
* when(req => req.method === "POST", sequence(BodyParser, ValidateMiddleware)),
|
|
80
|
+
* sequence(AuthMiddleware, ProcessMiddleware)
|
|
81
|
+
* )
|
|
82
|
+
* async dataHandler() {}
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare function sequence(...middleware: Array<Middleware>): ComposedMiddlewareConfig;
|