@expressots/adapter-express 3.0.0 → 4.0.0-preview.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -96
- package/lib/CHANGELOG.md +31 -5
- package/lib/README.md +39 -96
- package/lib/cjs/adapter-express/application-express.base.js +3 -1
- package/lib/cjs/adapter-express/application-express.js +1049 -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 +186 -49
- 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 +810 -63
- 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/permission-preloader.middleware.js +48 -0
- package/lib/cjs/adapter-express/express-utils/route-constraints.js +95 -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 +11 -37
- 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 +217 -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 +9 -0
- package/lib/cjs/adapter-express/studio/studio-integration.js +214 -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 +273 -32
- 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/permission-preloader.middleware.d.ts +10 -0
- package/lib/cjs/types/adapter-express/express-utils/route-constraints.d.ts +89 -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 +66 -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 +92 -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 +1300 -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 +575 -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 +1031 -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/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 +91 -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 +161 -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 +211 -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 +184 -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 +411 -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/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 +89 -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 +66 -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 +92 -0
- package/lib/esm/types/index.d.ts +1 -0
- package/lib/package.json +156 -146
- package/package.json +156 -146
- package/lib/cjs/di/di.interfaces.js +0 -10
- package/lib/cjs/types/di/di.interfaces.d.ts +0 -289
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Request } from "express";
|
|
2
|
+
import type { GuardScope } from "@expressots/core";
|
|
3
|
+
import type { IScopeExtractor } from "./scope-extractor.interface.js";
|
|
4
|
+
/**
|
|
5
|
+
* Extracts scope information from requests
|
|
6
|
+
* Supports tenant extraction from subdomain, header, or param
|
|
7
|
+
* Note: This is bound manually in setupAuthorizationForExpress() to allow user overrides
|
|
8
|
+
*/
|
|
9
|
+
export declare class ScopeExtractor implements IScopeExtractor {
|
|
10
|
+
extract(req: Request): Promise<GuardScope>;
|
|
11
|
+
/**
|
|
12
|
+
* Extract tenant ID from multiple sources
|
|
13
|
+
* @private
|
|
14
|
+
*/
|
|
15
|
+
private extractTenant;
|
|
16
|
+
/**
|
|
17
|
+
* Generate or retrieve request ID
|
|
18
|
+
* @private
|
|
19
|
+
*/
|
|
20
|
+
private generateRequestId;
|
|
21
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Request } from "express";
|
|
2
|
+
import type { GuardScope } from "@expressots/core";
|
|
3
|
+
/**
|
|
4
|
+
* Interface for extracting scope information from requests
|
|
5
|
+
*/
|
|
6
|
+
export interface IScopeExtractor {
|
|
7
|
+
/**
|
|
8
|
+
* Extract scope information from request
|
|
9
|
+
* @param req - Express request
|
|
10
|
+
*/
|
|
11
|
+
extract(req: Request): Promise<GuardScope>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { interfaces } from "@expressots/core";
|
|
2
|
+
import { type AuthorizationConfig } from "@expressots/core";
|
|
3
|
+
import type { AuthProvider } from "./interfaces.js";
|
|
4
|
+
import type { IMiddleware } from "@expressots/core";
|
|
5
|
+
/**
|
|
6
|
+
* Express-specific authorization setup
|
|
7
|
+
* Automatically registers all adapter-specific services and middleware
|
|
8
|
+
*
|
|
9
|
+
* @param container - DI container
|
|
10
|
+
* @param config - Authorization configuration
|
|
11
|
+
* @param middleware - Optional middleware manager to add PermissionPreloaderMiddleware
|
|
12
|
+
* @param authProvider - Optional AuthProvider class (if not already bound)
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* export class App extends AppExpress {
|
|
17
|
+
* async configureServices(): Promise<void> {
|
|
18
|
+
* setupAuthorizationForExpress(
|
|
19
|
+
* this.config.Container,
|
|
20
|
+
* {
|
|
21
|
+
* enablePreloading: true,
|
|
22
|
+
* enableCaching: true,
|
|
23
|
+
* permissionHierarchy: {
|
|
24
|
+
* admin: ["moderator", "user"],
|
|
25
|
+
* moderator: ["user"],
|
|
26
|
+
* },
|
|
27
|
+
* },
|
|
28
|
+
* this.Middleware,
|
|
29
|
+
* );
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function setupAuthorizationForExpress(container: interfaces.Container, config?: AuthorizationConfig, middleware?: IMiddleware, authProvider?: new () => AuthProvider): void;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { interfaces, EventRegistry, EventEmitter, EventRecorder, EventFlowTracker } from "@expressots/core";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration options for the event system setup.
|
|
4
|
+
*
|
|
5
|
+
* @public API
|
|
6
|
+
*/
|
|
7
|
+
export interface EventSystemOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Enable event recording for debugging.
|
|
10
|
+
* When true, all emitted events are recorded for later inspection or replay.
|
|
11
|
+
* @default true in development, false in production
|
|
12
|
+
*/
|
|
13
|
+
enableRecording?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Enable flow tracking for event visualization.
|
|
16
|
+
* When true, tracks the flow of events through handlers.
|
|
17
|
+
* @default true in development, false in production
|
|
18
|
+
*/
|
|
19
|
+
enableFlowTracking?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Maximum number of events to keep in the recording buffer.
|
|
22
|
+
* @default 1000
|
|
23
|
+
*/
|
|
24
|
+
maxRecordedEvents?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Default timeout for handler execution in milliseconds.
|
|
27
|
+
* @default 30000
|
|
28
|
+
*/
|
|
29
|
+
defaultTimeout?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Auto-discover event handlers from the container.
|
|
32
|
+
* When true, scans the container for @OnEvent decorated handlers.
|
|
33
|
+
* @default true
|
|
34
|
+
*/
|
|
35
|
+
autoDiscover?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Callback when an event is emitted.
|
|
38
|
+
*/
|
|
39
|
+
onEmit?: (event: unknown) => void;
|
|
40
|
+
/**
|
|
41
|
+
* Callback when a handler completes execution.
|
|
42
|
+
*/
|
|
43
|
+
onHandlerComplete?: (result: {
|
|
44
|
+
handler: string;
|
|
45
|
+
success: boolean;
|
|
46
|
+
duration: number;
|
|
47
|
+
}) => void;
|
|
48
|
+
/**
|
|
49
|
+
* Custom error handler for handler failures.
|
|
50
|
+
*/
|
|
51
|
+
onError?: (error: Error, event: unknown, handlerName: string) => void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Result of event system setup.
|
|
55
|
+
*
|
|
56
|
+
* @public API
|
|
57
|
+
*/
|
|
58
|
+
export interface EventSystemSetupResult {
|
|
59
|
+
/**
|
|
60
|
+
* The event registry instance.
|
|
61
|
+
*/
|
|
62
|
+
registry: EventRegistry;
|
|
63
|
+
/**
|
|
64
|
+
* The event emitter instance.
|
|
65
|
+
*/
|
|
66
|
+
emitter: EventEmitter;
|
|
67
|
+
/**
|
|
68
|
+
* The event recorder instance (if recording is enabled).
|
|
69
|
+
*/
|
|
70
|
+
recorder: EventRecorder;
|
|
71
|
+
/**
|
|
72
|
+
* The flow tracker instance (if flow tracking is enabled).
|
|
73
|
+
*/
|
|
74
|
+
flowTracker: EventFlowTracker;
|
|
75
|
+
/**
|
|
76
|
+
* Number of event handlers discovered.
|
|
77
|
+
*/
|
|
78
|
+
handlersDiscovered: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set up the ExpressoTS Event System with zero boilerplate.
|
|
82
|
+
*
|
|
83
|
+
* This function:
|
|
84
|
+
* 1. Registers all event system services (EventRegistry, EventEmitter, EventRecorder, EventFlowTracker)
|
|
85
|
+
* 2. Auto-discovers and registers all @OnEvent decorated handlers
|
|
86
|
+
* 3. Configures recording and flow tracking based on environment
|
|
87
|
+
* 4. Sets up replay emitter for development debugging
|
|
88
|
+
*
|
|
89
|
+
* @param container - The DI container
|
|
90
|
+
* @param options - Configuration options for the event system
|
|
91
|
+
* @returns Setup result with references to all event system services
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* export class App extends AppExpress {
|
|
96
|
+
* async configureServices(): Promise<void> {
|
|
97
|
+
* // Simple setup with defaults (recommended)
|
|
98
|
+
* const { handlersDiscovered } = setupEventSystemForExpress(
|
|
99
|
+
* this.config.Container
|
|
100
|
+
* );
|
|
101
|
+
* console.log(`Discovered ${handlersDiscovered} event handlers`);
|
|
102
|
+
*
|
|
103
|
+
* // Or with custom options
|
|
104
|
+
* setupEventSystemForExpress(this.config.Container, {
|
|
105
|
+
* enableRecording: true,
|
|
106
|
+
* maxRecordedEvents: 500,
|
|
107
|
+
* defaultTimeout: 10000,
|
|
108
|
+
* onError: (error, event, handler) => {
|
|
109
|
+
* console.error(`Handler ${handler} failed:`, error);
|
|
110
|
+
* }
|
|
111
|
+
* });
|
|
112
|
+
* }
|
|
113
|
+
* }
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @public API
|
|
117
|
+
*/
|
|
118
|
+
export declare function setupEventSystemForExpress(container: interfaces.Container, options?: EventSystemOptions): EventSystemSetupResult;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { interfaces } from "@expressots/core";
|
|
2
|
+
import { InterceptorRegistry, InterceptorExecutor, IInterceptor } from "@expressots/core";
|
|
3
|
+
/**
|
|
4
|
+
* Type for interceptor classes that can be registered.
|
|
5
|
+
* Accepts any class constructor, including those with DI-injected dependencies.
|
|
6
|
+
* The DI container resolves constructor parameters at runtime.
|
|
7
|
+
*/
|
|
8
|
+
export type InterceptorClass = new (...args: Array<any>) => IInterceptor;
|
|
9
|
+
/**
|
|
10
|
+
* Built-in interceptor types that can be enabled via configuration.
|
|
11
|
+
*
|
|
12
|
+
* @public API
|
|
13
|
+
*/
|
|
14
|
+
export type BuiltInInterceptor = "performance" | "logging" | "timeout";
|
|
15
|
+
/**
|
|
16
|
+
* Configuration options for the interceptor system setup.
|
|
17
|
+
*
|
|
18
|
+
* @public API
|
|
19
|
+
*/
|
|
20
|
+
export interface InterceptorSystemOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Enable and configure built-in interceptors.
|
|
23
|
+
* Set to true to enable with defaults, or provide configuration object.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* {
|
|
28
|
+
* performance: true, // Enable with defaults
|
|
29
|
+
* logging: { logResponse: true }, // Enable with custom config
|
|
30
|
+
* timeout: { defaultTimeout: 5000 }
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
builtIn?: {
|
|
35
|
+
performance?: boolean;
|
|
36
|
+
logging?: boolean;
|
|
37
|
+
timeout?: boolean | {
|
|
38
|
+
defaultTimeout?: number;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Custom interceptor classes to register.
|
|
43
|
+
* These will be bound as singletons and auto-discovered.
|
|
44
|
+
* Supports classes with DI-injected constructor dependencies.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* customInterceptors: [CacheInterceptor, AuditInterceptor]
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
customInterceptors?: Array<InterceptorClass>;
|
|
52
|
+
/**
|
|
53
|
+
* Auto-discover interceptors from the container.
|
|
54
|
+
* When true, scans the container for @UseInterceptor decorated controllers/methods.
|
|
55
|
+
* @default true
|
|
56
|
+
*/
|
|
57
|
+
autoDiscover?: boolean;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Result of interceptor system setup.
|
|
61
|
+
*
|
|
62
|
+
* @public API
|
|
63
|
+
*/
|
|
64
|
+
export interface InterceptorSystemSetupResult {
|
|
65
|
+
/**
|
|
66
|
+
* The interceptor registry instance.
|
|
67
|
+
*/
|
|
68
|
+
registry: InterceptorRegistry;
|
|
69
|
+
/**
|
|
70
|
+
* The interceptor executor instance.
|
|
71
|
+
*/
|
|
72
|
+
executor: InterceptorExecutor;
|
|
73
|
+
/**
|
|
74
|
+
* Number of interceptors registered.
|
|
75
|
+
*/
|
|
76
|
+
interceptorsRegistered: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Set up the ExpressoTS Interceptor System with zero boilerplate.
|
|
80
|
+
*
|
|
81
|
+
* This function:
|
|
82
|
+
* 1. Registers all interceptor infrastructure (InterceptorRegistry, InterceptorExecutor)
|
|
83
|
+
* 2. Optionally enables built-in interceptors (Performance, Logging, Timeout)
|
|
84
|
+
* 3. Registers custom interceptor classes
|
|
85
|
+
* 4. Initializes the interceptor registry
|
|
86
|
+
*
|
|
87
|
+
* @param container - The DI container
|
|
88
|
+
* @param options - Configuration options for the interceptor system
|
|
89
|
+
* @returns Setup result with references to interceptor services
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* export class App extends AppExpress {
|
|
94
|
+
* async configureServices(): Promise<void> {
|
|
95
|
+
* // Simple setup with performance interceptor
|
|
96
|
+
* setupInterceptorsForExpress(this.config.Container, {
|
|
97
|
+
* builtIn: { performance: true }
|
|
98
|
+
* });
|
|
99
|
+
*
|
|
100
|
+
* // Full setup with custom interceptors
|
|
101
|
+
* setupInterceptorsForExpress(this.config.Container, {
|
|
102
|
+
* builtIn: {
|
|
103
|
+
* performance: true,
|
|
104
|
+
* logging: true,
|
|
105
|
+
* timeout: { defaultTimeout: 5000 }
|
|
106
|
+
* },
|
|
107
|
+
* customInterceptors: [CacheInterceptor, AuditInterceptor]
|
|
108
|
+
* });
|
|
109
|
+
* }
|
|
110
|
+
* }
|
|
111
|
+
* ```
|
|
112
|
+
*
|
|
113
|
+
* @public API
|
|
114
|
+
*/
|
|
115
|
+
export declare function setupInterceptorsForExpress(container: interfaces.Container, options?: InterceptorSystemOptions): InterceptorSystemSetupResult;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup Lazy Loading for Express
|
|
3
|
+
*
|
|
4
|
+
* One-liner helper function to configure the lazy loading system.
|
|
5
|
+
*
|
|
6
|
+
* @module adapter-express
|
|
7
|
+
*/
|
|
8
|
+
import { RequestHandler } from "express";
|
|
9
|
+
import { Container } from "@expressots/core";
|
|
10
|
+
import { ILazyModule, LazyLoadingOptions, LazyLoadingSetupResult } from "@expressots/core";
|
|
11
|
+
import { LazyRouteMapping } from "./lazy-module-middleware.js";
|
|
12
|
+
/**
|
|
13
|
+
* Set up the lazy loading system with one function call.
|
|
14
|
+
*
|
|
15
|
+
* @layer public
|
|
16
|
+
* @audience application-developers
|
|
17
|
+
* @concept lazy-loading
|
|
18
|
+
*
|
|
19
|
+
* UNIQUE: Zero-configuration lazy loading!
|
|
20
|
+
* - Auto-detects routes from @controller() decorators
|
|
21
|
+
* - Creates middleware for automatic module loading
|
|
22
|
+
* - Optional metrics and background warmup
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* // 1. Define lazy modules (routes auto-detected from @controller)
|
|
27
|
+
* // lazy-modules.ts
|
|
28
|
+
* export const AdminModule = CreateLazyModule([AdminController]);
|
|
29
|
+
* // Routes auto-detected: ["/admin"] from @controller("/admin")
|
|
30
|
+
*
|
|
31
|
+
* export const ReportsModule = CreateLazyModule([ReportsController]);
|
|
32
|
+
* // Routes auto-detected: ["/reports"] from @controller("/reports")
|
|
33
|
+
*
|
|
34
|
+
* // 2. Setup in app.ts (just pass the modules!)
|
|
35
|
+
* export class App extends AppExpress {
|
|
36
|
+
* async configureServices(): Promise<void> {
|
|
37
|
+
* const { middleware } = setupLazyLoadingForExpress(
|
|
38
|
+
* this.config.Container,
|
|
39
|
+
* {
|
|
40
|
+
* lazyModules: [AdminModule, ReportsModule],
|
|
41
|
+
* globalPrefix: "/api" // Optional
|
|
42
|
+
* }
|
|
43
|
+
* );
|
|
44
|
+
*
|
|
45
|
+
* // Add middleware - that's it!
|
|
46
|
+
* if (middleware) {
|
|
47
|
+
* this.Middleware.addMiddleware(middleware);
|
|
48
|
+
* }
|
|
49
|
+
* }
|
|
50
|
+
* }
|
|
51
|
+
*
|
|
52
|
+
* // Now:
|
|
53
|
+
* // - GET /api/admin/* → AdminModule auto-loads
|
|
54
|
+
* // - GET /api/reports/* → ReportsModule auto-loads
|
|
55
|
+
* // - No manual route mapping needed!
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @param container - The DI container
|
|
59
|
+
* @param options - Configuration options
|
|
60
|
+
* @returns Setup result with loader, manager, and middleware
|
|
61
|
+
*
|
|
62
|
+
* @public API
|
|
63
|
+
*/
|
|
64
|
+
export declare function setupLazyLoadingForExpress(container: Container, options?: LazyLoadingExpressOptions): LazyLoadingExpressResult;
|
|
65
|
+
/**
|
|
66
|
+
* Extended lazy loading options for Express.
|
|
67
|
+
*
|
|
68
|
+
* @public API
|
|
69
|
+
*/
|
|
70
|
+
export interface LazyLoadingExpressOptions extends LazyLoadingOptions {
|
|
71
|
+
/** Lazy modules to register */
|
|
72
|
+
lazyModules?: Array<ILazyModule>;
|
|
73
|
+
/**
|
|
74
|
+
* Manual route prefix mappings.
|
|
75
|
+
* Maps module names to route prefixes for auto-loading.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* routePrefixes: {
|
|
80
|
+
* "AdminModule": "/admin",
|
|
81
|
+
* "ReportsModule": "/reports"
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
routePrefixes?: Record<string, string>;
|
|
86
|
+
/**
|
|
87
|
+
* Global route prefix (e.g., "/api").
|
|
88
|
+
* Used when determining if a request matches a lazy module route.
|
|
89
|
+
*/
|
|
90
|
+
globalPrefix?: string;
|
|
91
|
+
/**
|
|
92
|
+
* Enable automatic module loading when routes are accessed.
|
|
93
|
+
* When enabled, accessing a lazy module's route will trigger loading.
|
|
94
|
+
* @default true
|
|
95
|
+
*/
|
|
96
|
+
enableAutoLoad?: boolean;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Extended result of lazy loading setup for Express.
|
|
100
|
+
*
|
|
101
|
+
* @public API
|
|
102
|
+
*/
|
|
103
|
+
export interface LazyLoadingExpressResult extends LazyLoadingSetupResult {
|
|
104
|
+
/**
|
|
105
|
+
* Middleware for auto-loading lazy modules.
|
|
106
|
+
* Add this to your Express app to enable auto-loading.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const { middleware } = setupLazyLoadingForExpress(container, options);
|
|
111
|
+
* if (middleware) {
|
|
112
|
+
* this.Middleware.addMiddleware(middleware);
|
|
113
|
+
* }
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
middleware?: RequestHandler;
|
|
117
|
+
/**
|
|
118
|
+
* Route mappings used by the middleware.
|
|
119
|
+
*/
|
|
120
|
+
routeMappings: Array<LazyRouteMapping>;
|
|
121
|
+
}
|
|
122
|
+
export type { LazyLoadingOptions, LazyLoadingSetupResult } from "@expressots/core";
|
|
123
|
+
export type { LazyRouteMapping } from "./lazy-module-middleware.js";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { interfaces } from "@expressots/core";
|
|
2
|
+
import type { BaseController, ControllerMetadata, ControllerMethodMetadata, ControllerParameterMetadata, DecoratorTarget, IHttpActionResult } from "./interfaces.js";
|
|
3
|
+
export declare function getControllersFromContainer(container: interfaces.Container, forceControllers: boolean): Array<BaseController>;
|
|
4
|
+
export declare function getControllersFromMetadata(): Array<DecoratorTarget>;
|
|
5
|
+
export declare function getControllerMetadata(constructor: NewableFunction): ControllerMetadata;
|
|
6
|
+
export declare function getControllerMethodMetadata(constructor: NewableFunction): Array<ControllerMethodMetadata>;
|
|
7
|
+
export declare function getControllerParameterMetadata(constructor: NewableFunction): ControllerParameterMetadata;
|
|
8
|
+
export declare function cleanUpMetadata(): void;
|
|
9
|
+
export declare function instanceOfIHttpActionResult(value: unknown): value is IHttpActionResult;
|
|
10
|
+
/**
|
|
11
|
+
* Gets content negotiation metadata from a controller method.
|
|
12
|
+
* @param target - Controller instance
|
|
13
|
+
* @param propertyKey - Method name
|
|
14
|
+
* @returns Content negotiation metadata
|
|
15
|
+
*/
|
|
16
|
+
export declare function getContentNegotiationMetadata(target: object, propertyKey: string | symbol): {
|
|
17
|
+
accept?: Array<string>;
|
|
18
|
+
consumes?: Array<string>;
|
|
19
|
+
produces?: Array<string>;
|
|
20
|
+
csvOptions?: import("@expressots/core").CsvFormatOptions;
|
|
21
|
+
xmlOptions?: import("@expressots/core").XmlFormatOptions;
|
|
22
|
+
yamlOptions?: import("@expressots/core").YamlFormatOptions;
|
|
23
|
+
streamResponse?: boolean;
|
|
24
|
+
};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Decorators
|
|
3
|
+
* @module @expressots/adapter-express
|
|
4
|
+
*
|
|
5
|
+
* Enhanced parameter decorators with validation support.
|
|
6
|
+
* These decorators extend the standard @body, @query, @param, @headers
|
|
7
|
+
* to accept optional schema for automatic validation.
|
|
8
|
+
*/
|
|
9
|
+
import "reflect-metadata";
|
|
10
|
+
import type { ValidationOptions } from "@expressots/core";
|
|
11
|
+
/**
|
|
12
|
+
* Metadata stored for validation
|
|
13
|
+
*/
|
|
14
|
+
export interface ValidationSchemaMetadata {
|
|
15
|
+
/** Parameter index */
|
|
16
|
+
index: number;
|
|
17
|
+
/** Parameter source (body, query, params, headers) */
|
|
18
|
+
source: "body" | "query" | "params" | "headers";
|
|
19
|
+
/** Schema to validate against */
|
|
20
|
+
schema?: unknown;
|
|
21
|
+
/** Validation options */
|
|
22
|
+
options?: ValidationOptions;
|
|
23
|
+
/** Whether this metadata was auto-inferred from TypeScript types */
|
|
24
|
+
inferred?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Schema type - can be a class constructor, Zod schema, or any other schema type
|
|
28
|
+
*/
|
|
29
|
+
export type SchemaType = (new (...args: Array<unknown>) => unknown) | object;
|
|
30
|
+
/**
|
|
31
|
+
* Options for validated decorators
|
|
32
|
+
*/
|
|
33
|
+
export interface ValidatedDecoratorOptions extends ValidationOptions {
|
|
34
|
+
/** Force specific adapter by name */
|
|
35
|
+
adapter?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Enhanced body decorator with validation support
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* // Without validation (backward compatible)
|
|
43
|
+
* @Post("/users")
|
|
44
|
+
* createUser(@body() user: CreateUserDTO) {}
|
|
45
|
+
*
|
|
46
|
+
* // With class-validator schema
|
|
47
|
+
* @Post("/users")
|
|
48
|
+
* createUser(@body(CreateUserDTO) user: CreateUserDTO) {}
|
|
49
|
+
*
|
|
50
|
+
* // With Zod schema
|
|
51
|
+
* const UserSchema = z.object({ email: z.string().email() });
|
|
52
|
+
* @Post("/users")
|
|
53
|
+
* createUser(@body(UserSchema) user: z.infer<typeof UserSchema>) {}
|
|
54
|
+
*
|
|
55
|
+
* // With validation options
|
|
56
|
+
* @Post("/users")
|
|
57
|
+
* createUser(@body({ group: "create", partial: false }) user: CreateUserDTO) {}
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare const validatedBody: {
|
|
61
|
+
(schema?: SchemaType | ValidatedDecoratorOptions): ParameterDecorator;
|
|
62
|
+
(nameOrSchema?: string | SchemaType | ValidatedDecoratorOptions): ParameterDecorator;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Enhanced query decorator with validation support
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* // Extract single query param (backward compatible)
|
|
70
|
+
* @Get("/search")
|
|
71
|
+
* search(@query("page") page: number) {}
|
|
72
|
+
*
|
|
73
|
+
* // Extract all query params with validation
|
|
74
|
+
* @Get("/search")
|
|
75
|
+
* search(@query(SearchQueryDTO) query: SearchQueryDTO) {}
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare const validatedQuery: {
|
|
79
|
+
(schema?: SchemaType | ValidatedDecoratorOptions): ParameterDecorator;
|
|
80
|
+
(nameOrSchema?: string | SchemaType | ValidatedDecoratorOptions): ParameterDecorator;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Enhanced param decorator with validation support
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* // Extract single route param (backward compatible)
|
|
88
|
+
* @Get("/:id")
|
|
89
|
+
* getUser(@param("id") id: string) {}
|
|
90
|
+
*
|
|
91
|
+
* // Extract all route params with validation
|
|
92
|
+
* @Get("/:userId/posts/:postId")
|
|
93
|
+
* getPost(@param(RouteParamsDTO) params: RouteParamsDTO) {}
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare const validatedParam: {
|
|
97
|
+
(schema?: SchemaType | ValidatedDecoratorOptions): ParameterDecorator;
|
|
98
|
+
(nameOrSchema?: string | SchemaType | ValidatedDecoratorOptions): ParameterDecorator;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Enhanced headers decorator with validation support
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* // Extract single header (backward compatible)
|
|
106
|
+
* @Get("/")
|
|
107
|
+
* handle(@headers("authorization") auth: string) {}
|
|
108
|
+
*
|
|
109
|
+
* // Extract all headers with validation
|
|
110
|
+
* @Get("/")
|
|
111
|
+
* handle(@headers(RequiredHeadersDTO) headers: RequiredHeadersDTO) {}
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export declare const validatedHeaders: {
|
|
115
|
+
(schema?: SchemaType | ValidatedDecoratorOptions): ParameterDecorator;
|
|
116
|
+
(nameOrSchema?: string | SchemaType | ValidatedDecoratorOptions): ParameterDecorator;
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Get validation schema metadata for a method
|
|
120
|
+
* @param target - Controller constructor
|
|
121
|
+
* @param methodName - Method name
|
|
122
|
+
* @returns Array of validation metadata
|
|
123
|
+
*/
|
|
124
|
+
export declare function getValidationMetadata(target: object, methodName: string): Array<ValidationSchemaMetadata>;
|
|
125
|
+
/**
|
|
126
|
+
* Check if a method has validation metadata
|
|
127
|
+
* @param target - Controller constructor
|
|
128
|
+
* @param methodName - Method name
|
|
129
|
+
* @returns true if validation is configured
|
|
130
|
+
*/
|
|
131
|
+
export declare function hasValidationMetadata(target: object, methodName: string): boolean;
|
|
132
|
+
/**
|
|
133
|
+
* @Validate decorator - marks a parameter for auto-validation
|
|
134
|
+
* Can be used with any parameter decorator
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```typescript
|
|
138
|
+
* @Post("/users")
|
|
139
|
+
* createUser(
|
|
140
|
+
* @Validate(CreateUserDTO)
|
|
141
|
+
* @body() user: CreateUserDTO
|
|
142
|
+
* ) {}
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export declare function Validate<T = unknown>(schema: (new (...args: Array<unknown>) => T) | object, options?: ValidatedDecoratorOptions): ParameterDecorator;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Service
|
|
3
|
+
* @module @expressots/adapter-express
|
|
4
|
+
*
|
|
5
|
+
* Service for validating request parameters using the Smart Validation System.
|
|
6
|
+
* Integrates with the route handler to automatically validate parameters.
|
|
7
|
+
*/
|
|
8
|
+
import type { Request, Response } from "express";
|
|
9
|
+
import { ValidationRegistry, SmartFieldDetector, HelpfulErrorFormatter, ValidationResult, ValidationConfig } from "@expressots/core";
|
|
10
|
+
import { ValidationSchemaMetadata } from "./validation-decorators.js";
|
|
11
|
+
import type { NewableFunction } from "./interfaces.js";
|
|
12
|
+
/**
|
|
13
|
+
* Validation Service
|
|
14
|
+
*
|
|
15
|
+
* Handles validation of request parameters (body, query, params, headers)
|
|
16
|
+
* using the configured validation adapters and smart field detection.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ValidationService {
|
|
19
|
+
private registry;
|
|
20
|
+
private smartDetector;
|
|
21
|
+
private errorFormatter;
|
|
22
|
+
private enabled;
|
|
23
|
+
private config;
|
|
24
|
+
constructor();
|
|
25
|
+
/**
|
|
26
|
+
* Enable the validation service with the given configuration
|
|
27
|
+
* @param config - Validation configuration
|
|
28
|
+
*/
|
|
29
|
+
enable(config?: ValidationConfig): void;
|
|
30
|
+
/**
|
|
31
|
+
* Register built-in validation adapters
|
|
32
|
+
* Additional adapters (Zod, Yup, Joi) can be registered via config.adapters
|
|
33
|
+
* @private
|
|
34
|
+
*/
|
|
35
|
+
private registerBuiltInAdapters;
|
|
36
|
+
/**
|
|
37
|
+
* Disable the validation service
|
|
38
|
+
*/
|
|
39
|
+
disable(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Check if validation is enabled
|
|
42
|
+
*/
|
|
43
|
+
isEnabled(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Get the validation registry for adapter management
|
|
46
|
+
*/
|
|
47
|
+
getRegistry(): ValidationRegistry;
|
|
48
|
+
/**
|
|
49
|
+
* Get the smart field detector
|
|
50
|
+
*/
|
|
51
|
+
getSmartDetector(): SmartFieldDetector;
|
|
52
|
+
/**
|
|
53
|
+
* Get the error formatter
|
|
54
|
+
*/
|
|
55
|
+
getErrorFormatter(): HelpfulErrorFormatter;
|
|
56
|
+
/**
|
|
57
|
+
* Validate request parameters based on controller method metadata
|
|
58
|
+
* @param req - Express request
|
|
59
|
+
* @param res - Express response
|
|
60
|
+
* @param controllerConstructor - Controller class constructor
|
|
61
|
+
* @param methodName - Method name
|
|
62
|
+
* @param args - Current parameter values
|
|
63
|
+
* @returns Validated and transformed arguments, or null if validation failed (response sent)
|
|
64
|
+
*/
|
|
65
|
+
validateParameters(req: Request, res: Response, controllerConstructor: NewableFunction, methodName: string, args: Array<unknown>): Promise<Array<unknown> | null>;
|
|
66
|
+
/**
|
|
67
|
+
* Infer validation metadata from TypeScript type information
|
|
68
|
+
* Uses reflect-metadata to get parameter types and automatically
|
|
69
|
+
* detect class-validator DTOs or Zod schemas
|
|
70
|
+
*/
|
|
71
|
+
private inferValidationFromTypes;
|
|
72
|
+
/**
|
|
73
|
+
* Validate a single value against a schema
|
|
74
|
+
*/
|
|
75
|
+
validateValue(value: unknown, metadata: ValidationSchemaMetadata): Promise<ValidationResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Get the parameter value from the request
|
|
78
|
+
*/
|
|
79
|
+
private getParameterValue;
|
|
80
|
+
/**
|
|
81
|
+
* Validate request data using smart field detection
|
|
82
|
+
*/
|
|
83
|
+
private validateWithSmartDetection;
|
|
84
|
+
/**
|
|
85
|
+
* Send validation error response
|
|
86
|
+
*/
|
|
87
|
+
private sendValidationError;
|
|
88
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./express-utils/index.js";
|
|
2
|
+
export { AppExpress } from "./application-express.js";
|
|
3
|
+
export * from "./micro-api/index.js";
|
|
4
|
+
export { IWebServerPublic, IWebServer, IWebServerConstructor, Environment, IEnvironment, RenderEngine, } from "@expressots/shared";
|
|
5
|
+
export * from "./render/index.js";
|
|
6
|
+
export * from "./middleware/index.js";
|
|
7
|
+
export * from "./studio/index.js";
|