@expressots/adapter-express 3.0.0-beta.4.2 → 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 +43 -0
- 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,115 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable, Container, ContextManager, findFlowTracker } from "@expressots/core";
|
|
14
|
+
import { GuardExecutor } from "@expressots/core";
|
|
15
|
+
import { GuardContextFactory } from "./guard-context-factory.js";
|
|
16
|
+
import { AppError } from "@expressots/core";
|
|
17
|
+
/**
|
|
18
|
+
* Express middleware that executes guards before route handler
|
|
19
|
+
*/
|
|
20
|
+
let GuardMiddleware = class GuardMiddleware {
|
|
21
|
+
executor;
|
|
22
|
+
contextFactory;
|
|
23
|
+
container;
|
|
24
|
+
constructor(executor, contextFactory, container) {
|
|
25
|
+
this.executor = executor;
|
|
26
|
+
this.contextFactory = contextFactory;
|
|
27
|
+
this.container = container;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Express middleware function
|
|
31
|
+
*/
|
|
32
|
+
execute = async (req, res, next) => {
|
|
33
|
+
// Get request ID for flow tracking
|
|
34
|
+
const requestContext = ContextManager.getCurrentContext();
|
|
35
|
+
const requestId = requestContext?.requestId;
|
|
36
|
+
const flowTracker = requestId ? findFlowTracker(requestId) : undefined;
|
|
37
|
+
// Extract guards from route metadata (controller + method level)
|
|
38
|
+
const guards = this.extractGuards(req);
|
|
39
|
+
if (guards.length === 0) {
|
|
40
|
+
return next(); // No guards, proceed
|
|
41
|
+
}
|
|
42
|
+
// Start tracking guard execution
|
|
43
|
+
const guardNames = guards.map((g) => {
|
|
44
|
+
if (typeof g === "function") {
|
|
45
|
+
return g.name || "UnknownGuard";
|
|
46
|
+
}
|
|
47
|
+
return g.constructor.name;
|
|
48
|
+
});
|
|
49
|
+
const guardStepName = `Guards: ${guardNames.join(", ")}`;
|
|
50
|
+
if (flowTracker?.isEnabled()) {
|
|
51
|
+
flowTracker.startStep("guard", guardStepName, {
|
|
52
|
+
guardCount: guards.length,
|
|
53
|
+
guardNames,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
// Create guard context
|
|
58
|
+
const context = await this.contextFactory.create(req, res);
|
|
59
|
+
// Execute guards
|
|
60
|
+
const result = await this.executor.execute(guards, context);
|
|
61
|
+
if (!result.allowed) {
|
|
62
|
+
// End guard step with failure
|
|
63
|
+
if (flowTracker?.isEnabled()) {
|
|
64
|
+
flowTracker.failStep(result.error);
|
|
65
|
+
}
|
|
66
|
+
// Throw error to be caught by exception handler
|
|
67
|
+
throw result.error || AppError.forbidden("Access denied");
|
|
68
|
+
}
|
|
69
|
+
// End guard step with success
|
|
70
|
+
if (flowTracker?.isEnabled()) {
|
|
71
|
+
flowTracker.endStep("success");
|
|
72
|
+
}
|
|
73
|
+
next();
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// Store error on request for flow tracking
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
78
|
+
req.__expressotsFlowError =
|
|
79
|
+
error instanceof Error ? error : new Error(String(error));
|
|
80
|
+
// End guard step with failure if not already ended
|
|
81
|
+
if (flowTracker?.isEnabled()) {
|
|
82
|
+
const currentFlow = flowTracker.getFlow();
|
|
83
|
+
const lastStep = currentFlow.steps[currentFlow.steps.length - 1];
|
|
84
|
+
if (lastStep && lastStep.name === guardStepName && lastStep.status === "success") {
|
|
85
|
+
// Step was already ended, don't end again
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
flowTracker.failStep(error instanceof Error ? error : undefined);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
next(error);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Extract guards from request metadata
|
|
96
|
+
* @private
|
|
97
|
+
*/
|
|
98
|
+
extractGuards(req) {
|
|
99
|
+
// Extract from request metadata (set during route registration)
|
|
100
|
+
const reqWithGuards = req;
|
|
101
|
+
const controllerGuards = reqWithGuards.__expressotsControllerGuards || [];
|
|
102
|
+
const methodGuards = reqWithGuards.__expressotsMethodGuards || [];
|
|
103
|
+
return [...controllerGuards, ...methodGuards];
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
GuardMiddleware = __decorate([
|
|
107
|
+
injectable(),
|
|
108
|
+
__param(0, inject(GuardExecutor)),
|
|
109
|
+
__param(1, inject(GuardContextFactory)),
|
|
110
|
+
__param(2, inject(Container)),
|
|
111
|
+
__metadata("design:paramtypes", [GuardExecutor,
|
|
112
|
+
GuardContextFactory,
|
|
113
|
+
Container])
|
|
114
|
+
], GuardMiddleware);
|
|
115
|
+
export { GuardMiddleware };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { GUARD_METADATA_KEY } from "@expressots/core";
|
|
3
|
+
/**
|
|
4
|
+
* Extract guards from controller metadata
|
|
5
|
+
*/
|
|
6
|
+
export function getControllerGuards(constructor) {
|
|
7
|
+
return (Reflect.getMetadata(GUARD_METADATA_KEY.controllerGuards, constructor) || []);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Extract guards from method metadata
|
|
11
|
+
*/
|
|
12
|
+
export function getMethodGuards(constructor, methodName) {
|
|
13
|
+
return (Reflect.getMetadata(GUARD_METADATA_KEY.methodGuards, constructor, methodName) || []);
|
|
14
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const httpContextByRequest = new WeakMap();
|
|
2
|
+
export function setHttpContext(req, ctx) {
|
|
3
|
+
httpContextByRequest.set(req, ctx);
|
|
4
|
+
}
|
|
5
|
+
export function getHttpContext(req) {
|
|
6
|
+
return httpContextByRequest.get(req);
|
|
7
|
+
}
|
|
8
|
+
export function hasHttpContext(req) {
|
|
9
|
+
return httpContextByRequest.has(req);
|
|
10
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { ExpressoMiddleware } from "@expressots/core";
|
|
3
|
+
import { HTTP_CODE_METADATA } from "./constants.js";
|
|
4
|
+
/**
|
|
5
|
+
* Middleware that applies the status code to the response.
|
|
6
|
+
* @returns express.RequestHandler
|
|
7
|
+
*/
|
|
8
|
+
export class HttpStatusCodeMiddleware extends ExpressoMiddleware {
|
|
9
|
+
globalPrefix;
|
|
10
|
+
constructor(globalPrefix = "/") {
|
|
11
|
+
super();
|
|
12
|
+
this.globalPrefix = globalPrefix;
|
|
13
|
+
}
|
|
14
|
+
use(req, res, next) {
|
|
15
|
+
const statusCodeMapping = Reflect.getMetadata(HTTP_CODE_METADATA.httpCode, Reflect);
|
|
16
|
+
let path = req.path;
|
|
17
|
+
if (this.globalPrefix !== "/" && path.startsWith(this.globalPrefix)) {
|
|
18
|
+
path = path.slice(this.globalPrefix.length);
|
|
19
|
+
}
|
|
20
|
+
path = path.endsWith("/") ? path.slice(0, -1) : path;
|
|
21
|
+
const formattedMethod = req.method.toLowerCase();
|
|
22
|
+
path = `${path || "/"}/-${formattedMethod}`;
|
|
23
|
+
const statusCode = statusCodeMapping[path];
|
|
24
|
+
let explicitStatus = null;
|
|
25
|
+
if (statusCode) {
|
|
26
|
+
res.status(statusCode);
|
|
27
|
+
explicitStatus = statusCode;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const patternMatchStatusCode = this.findMatchingParameterPath(path, statusCodeMapping);
|
|
31
|
+
if (patternMatchStatusCode) {
|
|
32
|
+
res.status(patternMatchStatusCode);
|
|
33
|
+
explicitStatus = patternMatchStatusCode;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.setDefaultStatusCode(req, res);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* When @Http(...) declares an explicit status, honor it even when the
|
|
41
|
+
* client sent conditional headers (If-None-Match / If-Modified-Since).
|
|
42
|
+
*
|
|
43
|
+
* Without this, Express's `res.send()` evaluates `req.fresh` (which is
|
|
44
|
+
* `true` for any 2xx status whose ETag matches the request's
|
|
45
|
+
* If-None-Match) and silently rewrites our 201/202/206/etc. into 304
|
|
46
|
+
* Not Modified. That makes @Http() unreliable in any caching
|
|
47
|
+
* environment — including a developer hitting refresh in their
|
|
48
|
+
* browser. We override `req.fresh` to always return `false` for this
|
|
49
|
+
* one response so the explicit status wins.
|
|
50
|
+
*
|
|
51
|
+
* For the 200 default we leave Express's freshness behavior alone, so
|
|
52
|
+
* normal GET caching still works as expected.
|
|
53
|
+
*/
|
|
54
|
+
if (explicitStatus !== null && explicitStatus !== 200) {
|
|
55
|
+
try {
|
|
56
|
+
Object.defineProperty(req, "fresh", {
|
|
57
|
+
configurable: true,
|
|
58
|
+
enumerable: true,
|
|
59
|
+
get: () => false,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Some proxied / decorated request objects make this property
|
|
64
|
+
// non-configurable. In that case we fall back to stripping the
|
|
65
|
+
// conditional headers entirely, which has the same effect on
|
|
66
|
+
// Express's freshness check.
|
|
67
|
+
delete req.headers["if-none-match"];
|
|
68
|
+
delete req.headers["if-modified-since"];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
next();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Find the matching parameter path.
|
|
75
|
+
* @param path - The path to match.
|
|
76
|
+
* @param mapping - The mapping to check.
|
|
77
|
+
* @param method - The method to check.
|
|
78
|
+
* @returns The status code if found, otherwise null.
|
|
79
|
+
**/
|
|
80
|
+
findMatchingParameterPath(path, mapping) {
|
|
81
|
+
for (const pathCode in mapping) {
|
|
82
|
+
const patternCheck = new RegExp("^" + pathCode.replace(/:[^\s/]+/g, "([^/]+)") + "$");
|
|
83
|
+
if (patternCheck.test(path)) {
|
|
84
|
+
return mapping[pathCode];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Set the default status code based on the request method.
|
|
91
|
+
* @param req - The request object.
|
|
92
|
+
* @param res - The response object.
|
|
93
|
+
**/
|
|
94
|
+
setDefaultStatusCode(req, res) {
|
|
95
|
+
switch (req.method.toLowerCase()) {
|
|
96
|
+
case "get":
|
|
97
|
+
res.statusCode = 200;
|
|
98
|
+
break;
|
|
99
|
+
case "post":
|
|
100
|
+
res.statusCode = 201;
|
|
101
|
+
break;
|
|
102
|
+
case "put":
|
|
103
|
+
res.statusCode = 204;
|
|
104
|
+
break;
|
|
105
|
+
case "patch":
|
|
106
|
+
res.statusCode = 204;
|
|
107
|
+
break;
|
|
108
|
+
case "delete":
|
|
109
|
+
res.statusCode = 204;
|
|
110
|
+
break;
|
|
111
|
+
default:
|
|
112
|
+
res.statusCode = 200;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export class HttpResponseMessage {
|
|
2
|
+
_content;
|
|
3
|
+
_headers = {};
|
|
4
|
+
get headers() {
|
|
5
|
+
return this._headers;
|
|
6
|
+
}
|
|
7
|
+
set headers(headers) {
|
|
8
|
+
this._headers = headers;
|
|
9
|
+
}
|
|
10
|
+
get content() {
|
|
11
|
+
return this._content;
|
|
12
|
+
}
|
|
13
|
+
set content(value) {
|
|
14
|
+
this._content = value;
|
|
15
|
+
}
|
|
16
|
+
_statusCode;
|
|
17
|
+
get statusCode() {
|
|
18
|
+
return this._statusCode;
|
|
19
|
+
}
|
|
20
|
+
set statusCode(code) {
|
|
21
|
+
if (code < 0 || code > 999) {
|
|
22
|
+
throw new Error(`${code} is not a valid status code`);
|
|
23
|
+
}
|
|
24
|
+
this._statusCode = code;
|
|
25
|
+
}
|
|
26
|
+
constructor(statusCode = 200) {
|
|
27
|
+
this.statusCode = statusCode;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export * from "./decorators.js";
|
|
2
|
+
export { Accept, Consumes, Produces, CsvOptions, XmlOptions, YamlOptions, StreamResponse, } from "./content-negotiation-decorators.js";
|
|
3
|
+
export { Patterns, pattern } from "./route-constraints.js";
|
|
4
|
+
export { when, unless, isConditionalMiddleware } from "./conditional-middleware.js";
|
|
5
|
+
export { combine, sequence, isComposedMiddleware } from "./middleware-composition.js";
|
|
6
|
+
export { Catch, UseFilters } from "./exception-filter-decorators.js";
|
|
7
|
+
export { getControllerGuards, getMethodGuards } from "./guard-utils.js";
|
|
8
|
+
export { GuardContextFactory } from "./guard-context-factory.js";
|
|
9
|
+
export { GuardMiddleware } from "./guard-middleware.js";
|
|
10
|
+
export { InterceptorMiddleware, createInterceptorMiddleware } from "./interceptor-middleware.js";
|
|
11
|
+
export { ScopeExtractor } from "./scope-extractor.js";
|
|
12
|
+
export { PermissionPreloaderMiddleware } from "./permission-preloader.middleware.js";
|
|
13
|
+
export { TYPE } from "./constants.js";
|
|
14
|
+
export { setupAuthorizationForExpress } from "./setup-authorization.js";
|
|
15
|
+
export { setupEventSystemForExpress } from "./setup-event-system.js";
|
|
16
|
+
export { setupInterceptorsForExpress } from "./setup-interceptors.js";
|
|
17
|
+
export { setupLazyLoadingForExpress } from "./setup-lazy-loading.js";
|
|
18
|
+
export { createLazyModuleMiddleware, createRouteMappings } from "./lazy-module-middleware.js";
|
|
19
|
+
// Validation decorators
|
|
20
|
+
export { validatedBody, validatedQuery, validatedParam, validatedHeaders, Validate, getValidationMetadata, hasValidationMetadata, } from "./validation-decorators.js";
|
|
21
|
+
// Validation service
|
|
22
|
+
export { ValidationService } from "./validation-service.js";
|
|
23
|
+
// Per-request HttpContext (replaces reflect-metadata for hot path)
|
|
24
|
+
export { getHttpContext, hasHttpContext } from "./http-context-store.js";
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable, Container, ContextManager, findFlowTracker, InterceptorExecutor, createExecutionContext, } from "@expressots/core";
|
|
14
|
+
import { INTERCEPTOR_METADATA_KEY } from "@expressots/core";
|
|
15
|
+
import "reflect-metadata";
|
|
16
|
+
/**
|
|
17
|
+
* Express middleware that executes interceptors around route handler
|
|
18
|
+
*
|
|
19
|
+
* @layer internal
|
|
20
|
+
* @audience framework-developers
|
|
21
|
+
*
|
|
22
|
+
* @summary Quick Start
|
|
23
|
+
* InterceptorMiddleware integrates the interceptor system with Express.
|
|
24
|
+
* It wraps the route handler with interceptors defined via @UseInterceptors().
|
|
25
|
+
*
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
let InterceptorMiddleware = class InterceptorMiddleware {
|
|
29
|
+
executor;
|
|
30
|
+
container;
|
|
31
|
+
constructor(executor, container) {
|
|
32
|
+
this.executor = executor;
|
|
33
|
+
this.container = container;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create middleware for a specific controller and method
|
|
37
|
+
* @param controllerClass - Controller class
|
|
38
|
+
* @param methodName - Method name
|
|
39
|
+
* @param handler - Original route handler
|
|
40
|
+
*/
|
|
41
|
+
createMiddleware(controllerClass, methodName, handler) {
|
|
42
|
+
return async (req, res, next) => {
|
|
43
|
+
// Get request ID for flow tracking
|
|
44
|
+
const requestContext = ContextManager.getCurrentContext();
|
|
45
|
+
const requestId = requestContext?.requestId;
|
|
46
|
+
const flowTracker = requestId ? findFlowTracker(requestId) : undefined;
|
|
47
|
+
// Extract interceptors from metadata
|
|
48
|
+
const interceptors = this.extractInterceptors(controllerClass, methodName);
|
|
49
|
+
if (interceptors.length === 0) {
|
|
50
|
+
// No interceptors, proceed directly
|
|
51
|
+
return handler(req, res, next)
|
|
52
|
+
.then(() => { })
|
|
53
|
+
.catch(next);
|
|
54
|
+
}
|
|
55
|
+
// Get interceptor names for tracking
|
|
56
|
+
const interceptorNames = interceptors.map((i) => {
|
|
57
|
+
if (typeof i === "function") {
|
|
58
|
+
return i.name || "UnknownInterceptor";
|
|
59
|
+
}
|
|
60
|
+
return i.constructor.name;
|
|
61
|
+
});
|
|
62
|
+
const interceptorStepName = `Interceptors: ${interceptorNames.join(", ")}`;
|
|
63
|
+
// Start tracking interceptor execution (using "middleware" type as interceptors are part of request pipeline)
|
|
64
|
+
if (flowTracker?.isEnabled()) {
|
|
65
|
+
flowTracker.startStep("middleware", interceptorStepName, {
|
|
66
|
+
interceptorCount: interceptors.length,
|
|
67
|
+
interceptorNames,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
// Create execution context
|
|
72
|
+
const context = createExecutionContext(req, res, this.container, controllerClass, String(methodName));
|
|
73
|
+
// Execute interceptors with handler
|
|
74
|
+
const result = await this.executor.execute(interceptors, context, async () => {
|
|
75
|
+
// This is the actual handler execution
|
|
76
|
+
const handlerResult = await handler(req, res, next);
|
|
77
|
+
return handlerResult;
|
|
78
|
+
});
|
|
79
|
+
// End interceptor step with success
|
|
80
|
+
if (flowTracker?.isEnabled()) {
|
|
81
|
+
flowTracker.endStep("success");
|
|
82
|
+
}
|
|
83
|
+
// If handler hasn't sent response and we have a result, set it
|
|
84
|
+
if (!res.headersSent && result !== undefined) {
|
|
85
|
+
// Store result for response handling
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
|
+
req.__expressotsInterceptorResult = result;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// End interceptor step with failure
|
|
92
|
+
if (flowTracker?.isEnabled()) {
|
|
93
|
+
flowTracker.failStep(error instanceof Error ? error : undefined);
|
|
94
|
+
}
|
|
95
|
+
next(error);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Extract interceptors from controller and method metadata
|
|
101
|
+
* @private
|
|
102
|
+
*/
|
|
103
|
+
extractInterceptors(controllerClass, methodName) {
|
|
104
|
+
// Get controller-level interceptors
|
|
105
|
+
const controllerInterceptors = Reflect.getMetadata(INTERCEPTOR_METADATA_KEY.controllerInterceptors, controllerClass) || [];
|
|
106
|
+
// Get method-level interceptors
|
|
107
|
+
const methodInterceptors = Reflect.getMetadata(INTERCEPTOR_METADATA_KEY.methodInterceptors, controllerClass, methodName) || [];
|
|
108
|
+
// Combine: controller + method level
|
|
109
|
+
return [...controllerInterceptors, ...methodInterceptors];
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
InterceptorMiddleware = __decorate([
|
|
113
|
+
injectable(),
|
|
114
|
+
__param(0, inject(InterceptorExecutor)),
|
|
115
|
+
__param(1, inject(Container)),
|
|
116
|
+
__metadata("design:paramtypes", [InterceptorExecutor,
|
|
117
|
+
Container])
|
|
118
|
+
], InterceptorMiddleware);
|
|
119
|
+
export { InterceptorMiddleware };
|
|
120
|
+
/**
|
|
121
|
+
* Factory function to create interceptor middleware
|
|
122
|
+
* @param container - DI container
|
|
123
|
+
* @param controllerClass - Controller class
|
|
124
|
+
* @param methodName - Method name
|
|
125
|
+
* @param handler - Original handler
|
|
126
|
+
*/
|
|
127
|
+
export function createInterceptorMiddleware(container, controllerClass, methodName, handler) {
|
|
128
|
+
const middleware = container.get(InterceptorMiddleware);
|
|
129
|
+
return middleware.createMiddleware(controllerClass, methodName, handler);
|
|
130
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|