@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
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.principal = exports.next = exports.cookies = exports.headers = exports.body = exports.query = exports.param = exports.response = exports.request = exports.injectHttpContext = void 0;
|
|
4
4
|
exports.controller = controller;
|
|
5
5
|
exports.Http = Http;
|
|
6
|
+
exports.Version = Version;
|
|
6
7
|
exports.All = All;
|
|
7
8
|
exports.Get = Get;
|
|
8
9
|
exports.Post = Post;
|
|
@@ -17,10 +18,14 @@ exports.getRenderMetadata = getRenderMetadata;
|
|
|
17
18
|
exports.FileUpload = FileUpload;
|
|
18
19
|
require("reflect-metadata");
|
|
19
20
|
const core_1 = require("@expressots/core");
|
|
20
|
-
const
|
|
21
|
-
const
|
|
21
|
+
const constants_js_1 = require("./constants.js");
|
|
22
|
+
const resolver_multer_js_1 = require("./resolver-multer.js");
|
|
22
23
|
const core_2 = require("@expressots/core");
|
|
23
|
-
|
|
24
|
+
const path_pattern_compat_js_1 = require("./path-pattern-compat.js");
|
|
25
|
+
// Explicit type annotation: without this, the inferred type pulls a
|
|
26
|
+
// non-portable path from @expressots/core's internal decorator_utils,
|
|
27
|
+
// which TS2742 rejects under NodeNext when emitting .d.ts files.
|
|
28
|
+
exports.injectHttpContext = (0, core_1.inject)(constants_js_1.TYPE.HttpContext);
|
|
24
29
|
/**
|
|
25
30
|
* Controller decorator to define a new controller
|
|
26
31
|
* @param path route path
|
|
@@ -29,29 +34,57 @@ exports.injectHttpContext = (0, core_1.inject)(constants_1.TYPE.HttpContext);
|
|
|
29
34
|
*/
|
|
30
35
|
function controller(path, ...middleware) {
|
|
31
36
|
return (target) => {
|
|
37
|
+
// Check for version metadata on the controller class
|
|
38
|
+
const controllerVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target);
|
|
39
|
+
// Translate any inline regex constraints in the controller-level
|
|
40
|
+
// prefix (`@controller("/users/:tenant(\\d+)")`) into a
|
|
41
|
+
// request-time validator. Keeps `@controller("/")` and the common
|
|
42
|
+
// case allocation-free.
|
|
43
|
+
const split = (0, path_pattern_compat_js_1.splitPathConstraints)(path);
|
|
44
|
+
const constraintMiddleware = (0, path_pattern_compat_js_1.createPathConstraintMiddleware)(split.constraints);
|
|
45
|
+
const effectivePath = split.path;
|
|
46
|
+
const effectiveMiddleware = constraintMiddleware
|
|
47
|
+
? [constraintMiddleware, ...middleware]
|
|
48
|
+
: middleware;
|
|
32
49
|
const currentMetadata = {
|
|
33
|
-
middleware,
|
|
34
|
-
path,
|
|
35
|
-
target,
|
|
50
|
+
middleware: effectiveMiddleware,
|
|
51
|
+
path: effectivePath,
|
|
52
|
+
target: target,
|
|
53
|
+
version: controllerVersion,
|
|
36
54
|
};
|
|
37
|
-
const pathMetadata = Reflect.getOwnMetadata(
|
|
38
|
-
const statusCodeMetadata = Reflect.getOwnMetadata(
|
|
39
|
-
const statusCodePathMapping = Reflect.getOwnMetadata(
|
|
55
|
+
const pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect) || {};
|
|
56
|
+
const statusCodeMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect) || {};
|
|
57
|
+
const statusCodePathMapping = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.httpCode, Reflect) || {};
|
|
40
58
|
for (const key in pathMetadata) {
|
|
41
59
|
if (statusCodeMetadata && statusCodeMetadata[key]) {
|
|
42
|
-
const
|
|
60
|
+
const methodPath = pathMetadata[key]["path"];
|
|
61
|
+
// Properly join controller and method paths. The controller
|
|
62
|
+
// path is the v8-cleaned `effectivePath` so the mapping key is
|
|
63
|
+
// consistent with what gets registered on Express.
|
|
64
|
+
let realPath;
|
|
65
|
+
if (methodPath === "/" || methodPath === "") {
|
|
66
|
+
realPath = effectivePath;
|
|
67
|
+
}
|
|
68
|
+
else if (effectivePath === "/" || effectivePath === "") {
|
|
69
|
+
realPath = methodPath.startsWith("/") ? methodPath : `/${methodPath}`;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const basePath = effectivePath.endsWith("/") ? effectivePath.slice(0, -1) : effectivePath;
|
|
73
|
+
const subPath = methodPath.startsWith("/") ? methodPath : `/${methodPath}`;
|
|
74
|
+
realPath = `${basePath}${subPath}`;
|
|
75
|
+
}
|
|
43
76
|
statusCodePathMapping[`${realPath}/-${pathMetadata[key]["method"].toLowerCase()}`] =
|
|
44
77
|
statusCodeMetadata[key];
|
|
45
78
|
}
|
|
46
79
|
}
|
|
47
|
-
Reflect.defineMetadata(
|
|
48
|
-
Reflect.deleteMetadata(
|
|
49
|
-
Reflect.deleteMetadata(
|
|
80
|
+
Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.httpCode, statusCodePathMapping, Reflect);
|
|
81
|
+
Reflect.deleteMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect);
|
|
82
|
+
Reflect.deleteMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
|
|
50
83
|
(0, core_1.decorate)((0, core_1.injectable)(), target);
|
|
51
|
-
Reflect.defineMetadata(
|
|
52
|
-
const previousMetadata = Reflect.getMetadata(
|
|
84
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.controller, currentMetadata, target);
|
|
85
|
+
const previousMetadata = Reflect.getMetadata(constants_js_1.METADATA_KEY.controller, Reflect) || [];
|
|
53
86
|
const newMetadata = [currentMetadata, ...previousMetadata];
|
|
54
|
-
Reflect.defineMetadata(
|
|
87
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.controller, newMetadata, Reflect);
|
|
55
88
|
};
|
|
56
89
|
}
|
|
57
90
|
/**
|
|
@@ -70,7 +103,7 @@ function controller(path, ...middleware) {
|
|
|
70
103
|
function Http(code) {
|
|
71
104
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
72
105
|
return (target, key, descriptor) => {
|
|
73
|
-
let httpCodeMetadata = Reflect.getOwnMetadata(
|
|
106
|
+
let httpCodeMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect);
|
|
74
107
|
if (httpCodeMetadata) {
|
|
75
108
|
httpCodeMetadata[key] = code;
|
|
76
109
|
}
|
|
@@ -78,7 +111,55 @@ function Http(code) {
|
|
|
78
111
|
httpCodeMetadata = {};
|
|
79
112
|
httpCodeMetadata[key] = code;
|
|
80
113
|
}
|
|
81
|
-
Reflect.defineMetadata(
|
|
114
|
+
Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, httpCodeMetadata, Reflect);
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Version decorator to define the API version for a controller or route method
|
|
119
|
+
* @param version API version (e.g., "1", "1.0", "v1", or 1)
|
|
120
|
+
* @returns ClassDecorator | MethodDecorator
|
|
121
|
+
* @example ```typescript
|
|
122
|
+
* @Version("1")
|
|
123
|
+
* @controller("/users")
|
|
124
|
+
* class UserController {}
|
|
125
|
+
*
|
|
126
|
+
* // Or at method level:
|
|
127
|
+
* @Version("2")
|
|
128
|
+
* @Get("/")
|
|
129
|
+
* getUsers() {
|
|
130
|
+
* return "v2 users";
|
|
131
|
+
* }
|
|
132
|
+
* ```
|
|
133
|
+
* @public API
|
|
134
|
+
*/
|
|
135
|
+
function Version(version) {
|
|
136
|
+
// Normalize version to string format (e.g., "v1" or "1" -> "v1")
|
|
137
|
+
const normalizedVersion = typeof version === "number" ? `v${version}` : version.startsWith("v") ? version : `v${version}`;
|
|
138
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
139
|
+
return (target, key, descriptor) => {
|
|
140
|
+
if (key !== undefined && descriptor !== undefined) {
|
|
141
|
+
// Method decorator - store version metadata for the method
|
|
142
|
+
// This will be read by enhancedHttpMethod/Method when they create metadata
|
|
143
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.version, normalizedVersion, target, key);
|
|
144
|
+
// Also update existing metadata if it exists
|
|
145
|
+
const metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
|
|
146
|
+
if (metadataList) {
|
|
147
|
+
const methodMetadata = metadataList.find((m) => m.key === key);
|
|
148
|
+
if (methodMetadata) {
|
|
149
|
+
methodMetadata.version = normalizedVersion;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Class decorator - store version metadata for the controller
|
|
155
|
+
// This will be read by controller decorator when it creates metadata
|
|
156
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.version, normalizedVersion, target);
|
|
157
|
+
// Also update existing metadata if it exists
|
|
158
|
+
const controllerMetadata = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controller, target);
|
|
159
|
+
if (controllerMetadata) {
|
|
160
|
+
controllerMetadata.version = normalizedVersion;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
82
163
|
};
|
|
83
164
|
}
|
|
84
165
|
/**
|
|
@@ -151,34 +232,47 @@ function Delete(path, ...middleware) {
|
|
|
151
232
|
*/
|
|
152
233
|
function enhancedHttpMethod(method, path, ...middleware) {
|
|
153
234
|
return (target, key) => {
|
|
235
|
+
// Check for version metadata on the method
|
|
236
|
+
const methodVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target, key);
|
|
237
|
+
// Express 5 / path-to-regexp v8 dropped inline regex constraints
|
|
238
|
+
// (`:id(\\d+)`). Split them out into a v8-compatible path + a
|
|
239
|
+
// request-time validator middleware so existing routes — and our
|
|
240
|
+
// {@link Patterns} / {@link pattern} public API — keep working.
|
|
241
|
+
const split = (0, path_pattern_compat_js_1.splitPathConstraints)(path);
|
|
242
|
+
const constraintMiddleware = (0, path_pattern_compat_js_1.createPathConstraintMiddleware)(split.constraints);
|
|
243
|
+
const effectivePath = split.path;
|
|
244
|
+
const effectiveMiddleware = constraintMiddleware
|
|
245
|
+
? [constraintMiddleware, ...middleware]
|
|
246
|
+
: middleware;
|
|
154
247
|
const metadata = {
|
|
155
|
-
key,
|
|
248
|
+
key: String(key),
|
|
156
249
|
method,
|
|
157
|
-
middleware,
|
|
158
|
-
path,
|
|
159
|
-
target,
|
|
250
|
+
middleware: effectiveMiddleware,
|
|
251
|
+
path: effectivePath,
|
|
252
|
+
target: target,
|
|
253
|
+
version: methodVersion,
|
|
160
254
|
};
|
|
161
255
|
let metadataList = [];
|
|
162
|
-
let pathMetadata = Reflect.getOwnMetadata(
|
|
256
|
+
let pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
|
|
163
257
|
if (pathMetadata) {
|
|
164
258
|
pathMetadata[key] = {
|
|
165
|
-
path,
|
|
259
|
+
path: effectivePath,
|
|
166
260
|
method,
|
|
167
261
|
};
|
|
168
262
|
}
|
|
169
263
|
else {
|
|
170
264
|
pathMetadata = {};
|
|
171
265
|
pathMetadata[key] = {
|
|
172
|
-
path,
|
|
266
|
+
path: effectivePath,
|
|
173
267
|
method,
|
|
174
268
|
};
|
|
175
269
|
}
|
|
176
|
-
Reflect.defineMetadata(
|
|
177
|
-
if (!Reflect.hasOwnMetadata(
|
|
178
|
-
Reflect.defineMetadata(
|
|
270
|
+
Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.path, pathMetadata, Reflect);
|
|
271
|
+
if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor)) {
|
|
272
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
|
|
179
273
|
}
|
|
180
274
|
else {
|
|
181
|
-
metadataList = Reflect.getOwnMetadata(
|
|
275
|
+
metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
|
|
182
276
|
}
|
|
183
277
|
metadataList.push(metadata);
|
|
184
278
|
const paramsInfo = Reflect.getMetadata("design:paramtypes", target, key) || [];
|
|
@@ -203,34 +297,44 @@ function enhancedHttpMethod(method, path, ...middleware) {
|
|
|
203
297
|
*/
|
|
204
298
|
function Method(method, path, ...middleware) {
|
|
205
299
|
return (target, key) => {
|
|
300
|
+
// Check for version metadata on the method
|
|
301
|
+
const methodVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target, key);
|
|
302
|
+
// Same path-to-regexp v8 compatibility shim as `enhancedHttpMethod`.
|
|
303
|
+
const split = (0, path_pattern_compat_js_1.splitPathConstraints)(path);
|
|
304
|
+
const constraintMiddleware = (0, path_pattern_compat_js_1.createPathConstraintMiddleware)(split.constraints);
|
|
305
|
+
const effectivePath = split.path;
|
|
306
|
+
const effectiveMiddleware = constraintMiddleware
|
|
307
|
+
? [constraintMiddleware, ...middleware]
|
|
308
|
+
: middleware;
|
|
206
309
|
const metadata = {
|
|
207
|
-
key,
|
|
310
|
+
key: String(key),
|
|
208
311
|
method,
|
|
209
|
-
middleware,
|
|
210
|
-
path,
|
|
211
|
-
target,
|
|
312
|
+
middleware: effectiveMiddleware,
|
|
313
|
+
path: effectivePath,
|
|
314
|
+
target: target,
|
|
315
|
+
version: methodVersion,
|
|
212
316
|
};
|
|
213
317
|
let metadataList = [];
|
|
214
|
-
let pathMetadata = Reflect.getOwnMetadata(
|
|
318
|
+
let pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
|
|
215
319
|
if (pathMetadata) {
|
|
216
320
|
pathMetadata[key] = {
|
|
217
|
-
path,
|
|
321
|
+
path: effectivePath,
|
|
218
322
|
method,
|
|
219
323
|
};
|
|
220
324
|
}
|
|
221
325
|
else {
|
|
222
326
|
pathMetadata = {};
|
|
223
327
|
pathMetadata[key] = {
|
|
224
|
-
path,
|
|
328
|
+
path: effectivePath,
|
|
225
329
|
method,
|
|
226
330
|
};
|
|
227
331
|
}
|
|
228
|
-
Reflect.defineMetadata(
|
|
229
|
-
if (!Reflect.hasOwnMetadata(
|
|
230
|
-
Reflect.defineMetadata(
|
|
332
|
+
Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.path, pathMetadata, Reflect);
|
|
333
|
+
if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor)) {
|
|
334
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
|
|
231
335
|
}
|
|
232
336
|
else {
|
|
233
|
-
metadataList = Reflect.getOwnMetadata(
|
|
337
|
+
metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
|
|
234
338
|
}
|
|
235
339
|
metadataList.push(metadata);
|
|
236
340
|
};
|
|
@@ -239,47 +343,47 @@ function Method(method, path, ...middleware) {
|
|
|
239
343
|
* Parameter decorator to inject the request object
|
|
240
344
|
* @returns ParameterDecorator
|
|
241
345
|
*/
|
|
242
|
-
exports.request = paramDecoratorFactory(
|
|
346
|
+
exports.request = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.REQUEST);
|
|
243
347
|
/**
|
|
244
348
|
* Parameter decorator to inject the response object
|
|
245
349
|
* @returns ParameterDecorator
|
|
246
350
|
*/
|
|
247
|
-
exports.response = paramDecoratorFactory(
|
|
351
|
+
exports.response = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.RESPONSE);
|
|
248
352
|
/**
|
|
249
353
|
* Parameter decorator to inject parameters from the route
|
|
250
354
|
* @returns ParameterDecorator
|
|
251
355
|
*/
|
|
252
|
-
exports.param = paramDecoratorFactory(
|
|
356
|
+
exports.param = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.PARAMS);
|
|
253
357
|
/**
|
|
254
358
|
* Parameter decorator to inject query parameters
|
|
255
359
|
* @returns ParameterDecorator
|
|
256
360
|
*/
|
|
257
|
-
exports.query = paramDecoratorFactory(
|
|
361
|
+
exports.query = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.QUERY);
|
|
258
362
|
/**
|
|
259
363
|
* Parameter decorator to inject the request body
|
|
260
364
|
* @returns ParameterDecorator
|
|
261
365
|
*/
|
|
262
|
-
exports.body = paramDecoratorFactory(
|
|
366
|
+
exports.body = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.BODY);
|
|
263
367
|
/**
|
|
264
368
|
* Parameter decorator to inject the request headers
|
|
265
369
|
* @returns ParameterDecorator
|
|
266
370
|
*/
|
|
267
|
-
exports.headers = paramDecoratorFactory(
|
|
371
|
+
exports.headers = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.HEADERS);
|
|
268
372
|
/**
|
|
269
373
|
* Parameter decorator to inject the request cookies
|
|
270
374
|
* @returns ParameterDecorator
|
|
271
375
|
*/
|
|
272
|
-
exports.cookies = paramDecoratorFactory(
|
|
376
|
+
exports.cookies = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.COOKIES);
|
|
273
377
|
/**
|
|
274
378
|
* Parameter decorator next function
|
|
275
379
|
* @returns ParameterDecorator
|
|
276
380
|
*/
|
|
277
|
-
exports.next = paramDecoratorFactory(
|
|
381
|
+
exports.next = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.NEXT);
|
|
278
382
|
/**
|
|
279
383
|
* Parameter decorator to inject the principal object obtained from AuthProvider
|
|
280
384
|
* @returns ParameterDecorator
|
|
281
385
|
*/
|
|
282
|
-
exports.principal = paramDecoratorFactory(
|
|
386
|
+
exports.principal = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.PRINCIPAL);
|
|
283
387
|
/**
|
|
284
388
|
* Parameter decorator to inject the request user object
|
|
285
389
|
* @returns ParameterDecorator
|
|
@@ -304,18 +408,18 @@ function params(type, parameterName) {
|
|
|
304
408
|
parameterName,
|
|
305
409
|
type,
|
|
306
410
|
};
|
|
307
|
-
if (!Reflect.hasOwnMetadata(
|
|
411
|
+
if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, target.constructor)) {
|
|
308
412
|
parameterMetadataList.unshift(parameterMetadata);
|
|
309
413
|
}
|
|
310
414
|
else {
|
|
311
|
-
metadataList = Reflect.getOwnMetadata(
|
|
415
|
+
metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, target.constructor);
|
|
312
416
|
if (metadataList[methodName]) {
|
|
313
417
|
parameterMetadataList = metadataList[methodName] || [];
|
|
314
418
|
}
|
|
315
419
|
parameterMetadataList.unshift(parameterMetadata);
|
|
316
420
|
}
|
|
317
421
|
metadataList[methodName] = parameterMetadataList;
|
|
318
|
-
Reflect.defineMetadata(
|
|
422
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerParameter, metadataList, target.constructor);
|
|
319
423
|
};
|
|
320
424
|
}
|
|
321
425
|
/**
|
|
@@ -328,11 +432,11 @@ function params(type, parameterName) {
|
|
|
328
432
|
function Render(template, defaultData) {
|
|
329
433
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
330
434
|
return (target, propertyKey, descriptor) => {
|
|
331
|
-
Reflect.defineMetadata(
|
|
435
|
+
Reflect.defineMetadata(constants_js_1.RENDER_METADATA_KEY, { template, defaultData }, target, propertyKey);
|
|
332
436
|
};
|
|
333
437
|
}
|
|
334
438
|
function getRenderMetadata(target, propertyKey) {
|
|
335
|
-
return Reflect.getMetadata(
|
|
439
|
+
return Reflect.getMetadata(constants_js_1.RENDER_METADATA_KEY, target, propertyKey) || {};
|
|
336
440
|
}
|
|
337
441
|
/**
|
|
338
442
|
* Converts a string value to the specified type.
|
|
@@ -365,15 +469,44 @@ function isResponse(obj) {
|
|
|
365
469
|
return (typeof obj === "object" && obj !== null && "status" in obj && "json" in obj && "send" in obj);
|
|
366
470
|
}
|
|
367
471
|
/**
|
|
368
|
-
* File upload decorator to handle file uploads
|
|
369
|
-
*
|
|
370
|
-
*
|
|
472
|
+
* File upload decorator to handle file uploads.
|
|
473
|
+
*
|
|
474
|
+
* This decorator integrates with the global upload configuration
|
|
475
|
+
* set via `Middleware.upload()` in app.ts. If global config exists,
|
|
476
|
+
* it will be used as defaults, with local options taking precedence.
|
|
477
|
+
*
|
|
478
|
+
* @param options - Field configuration (fieldName, maxCount, none, any)
|
|
479
|
+
* @param multerOptions - Optional multer options (overrides global config)
|
|
371
480
|
* @default { none: true }
|
|
372
481
|
* @returns MethodDecorator
|
|
482
|
+
*
|
|
483
|
+
* @example
|
|
484
|
+
* ```typescript
|
|
485
|
+
* // In app.ts - configure globally (optional)
|
|
486
|
+
* this.Middleware.upload({
|
|
487
|
+
* destination: './uploads',
|
|
488
|
+
* limits: { fileSize: 10 * 1024 * 1024 }
|
|
489
|
+
* });
|
|
490
|
+
*
|
|
491
|
+
* // In controller - uses global config automatically
|
|
492
|
+
* @Post('avatar')
|
|
493
|
+
* @FileUpload({ fieldName: 'avatar' })
|
|
494
|
+
* uploadAvatar(req: Request) {
|
|
495
|
+
* return req.file;
|
|
496
|
+
* }
|
|
497
|
+
*
|
|
498
|
+
* // Override global config for specific endpoint
|
|
499
|
+
* @Post('document')
|
|
500
|
+
* @FileUpload({ fieldName: 'doc' }, { limits: { fileSize: 50 * 1024 * 1024 } })
|
|
501
|
+
* uploadDocument(req: Request) {
|
|
502
|
+
* return req.file;
|
|
503
|
+
* }
|
|
504
|
+
* ```
|
|
505
|
+
*
|
|
373
506
|
* @public API
|
|
374
507
|
*/
|
|
375
508
|
function FileUpload(options, multerOptions) {
|
|
376
|
-
const multer = (0,
|
|
509
|
+
const multer = (0, resolver_multer_js_1.packageResolver)("multer");
|
|
377
510
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
378
511
|
let upload;
|
|
379
512
|
let method = "none";
|
|
@@ -381,7 +514,40 @@ function FileUpload(options, multerOptions) {
|
|
|
381
514
|
if (options === undefined) {
|
|
382
515
|
options = { none: true };
|
|
383
516
|
}
|
|
384
|
-
upload
|
|
517
|
+
// Get global upload configuration (set via Middleware.upload())
|
|
518
|
+
const globalConfig = (0, core_1.getGlobalUploadConfig)();
|
|
519
|
+
// Build final multer options, merging global config with local options
|
|
520
|
+
// Local options always take precedence over global config
|
|
521
|
+
const finalMulterOptions = {};
|
|
522
|
+
// Apply global config as defaults
|
|
523
|
+
if (globalConfig) {
|
|
524
|
+
if (globalConfig.destination) {
|
|
525
|
+
finalMulterOptions.dest = globalConfig.destination;
|
|
526
|
+
}
|
|
527
|
+
if (globalConfig.limits) {
|
|
528
|
+
finalMulterOptions.limits = globalConfig.limits;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
// Apply local options (overrides global)
|
|
532
|
+
if (multerOptions) {
|
|
533
|
+
if (multerOptions.dest) {
|
|
534
|
+
finalMulterOptions.dest = multerOptions.dest;
|
|
535
|
+
}
|
|
536
|
+
if (multerOptions.limits) {
|
|
537
|
+
// Merge limits - local takes precedence
|
|
538
|
+
finalMulterOptions.limits = {
|
|
539
|
+
...finalMulterOptions.limits,
|
|
540
|
+
...multerOptions.limits,
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
if (multerOptions.storage) {
|
|
544
|
+
finalMulterOptions.storage = multerOptions.storage;
|
|
545
|
+
}
|
|
546
|
+
if (multerOptions.fileFilter) {
|
|
547
|
+
finalMulterOptions.fileFilter = multerOptions.fileFilter;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
upload = multer(finalMulterOptions);
|
|
385
551
|
method = inferMulterMethod(options);
|
|
386
552
|
}
|
|
387
553
|
return function (target, propertyKey, descriptor) {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UseFilters = exports.Catch = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Re-export exception filter decorators from core for backward compatibility
|
|
6
|
+
* These decorators are now part of @expressots/core to avoid circular dependencies
|
|
7
|
+
* @public API
|
|
8
|
+
*/
|
|
9
|
+
var core_1 = require("@expressots/core");
|
|
10
|
+
Object.defineProperty(exports, "Catch", { enumerable: true, get: function () { return core_1.Catch; } });
|
|
11
|
+
Object.defineProperty(exports, "UseFilters", { enumerable: true, get: function () { return core_1.UseFilters; } });
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.GuardContextFactory = void 0;
|
|
16
|
+
require("reflect-metadata");
|
|
17
|
+
const core_1 = require("@expressots/core");
|
|
18
|
+
const http_context_store_js_1 = require("./http-context-store.js");
|
|
19
|
+
/**
|
|
20
|
+
* Factory for creating GuardContext from Express request/response
|
|
21
|
+
*/
|
|
22
|
+
let GuardContextFactory = class GuardContextFactory {
|
|
23
|
+
constructor(container, scopeExtractor) {
|
|
24
|
+
this.container = container;
|
|
25
|
+
this.scopeExtractor = scopeExtractor;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create GuardContext from Express request/response
|
|
29
|
+
*/
|
|
30
|
+
async create(req, res) {
|
|
31
|
+
// Get HttpContext (created by InversifyExpressServer's first middleware
|
|
32
|
+
// and stored in a per-request WeakMap; see http-context-store.ts).
|
|
33
|
+
const httpContext = (0, http_context_store_js_1.getHttpContext)(req);
|
|
34
|
+
if (!httpContext) {
|
|
35
|
+
throw new Error("HttpContext not found on request. Ensure InversifyExpressServer is properly configured.");
|
|
36
|
+
}
|
|
37
|
+
// Extract scope information
|
|
38
|
+
const scope = await this.scopeExtractor.extract(req);
|
|
39
|
+
// Extract route metadata
|
|
40
|
+
const route = {
|
|
41
|
+
controller:
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
43
|
+
req.__expressotsControllerName || "unknown",
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
|
+
method: req.__expressotsMethod || "unknown",
|
|
46
|
+
path: req.path,
|
|
47
|
+
params: req.params,
|
|
48
|
+
query: req.query,
|
|
49
|
+
};
|
|
50
|
+
// Create guard context
|
|
51
|
+
// Note: httpContext.user is Principal from adapter-express, but GuardContext expects Principal from core
|
|
52
|
+
// They have the same structure, so this is compatible
|
|
53
|
+
// Note: httpContext.container is inversifyInterfaces.Container, but GuardContext expects Container from core
|
|
54
|
+
// They are compatible, so we cast it
|
|
55
|
+
const context = {
|
|
56
|
+
request: req,
|
|
57
|
+
response: res,
|
|
58
|
+
principal: httpContext.user, // Cast to core Principal type (same structure)
|
|
59
|
+
container: httpContext.container, // Request-scoped child container!
|
|
60
|
+
scope,
|
|
61
|
+
route,
|
|
62
|
+
getScoped: (identifier, scopeName) => {
|
|
63
|
+
// Resolve with scope awareness
|
|
64
|
+
// Note: scopeName is optional and can be used for custom scopes (e.g., tenant)
|
|
65
|
+
if (scopeName) {
|
|
66
|
+
// For custom scopes, use named binding or scope registry
|
|
67
|
+
// For now, fallback to regular get (can be enhanced later)
|
|
68
|
+
return httpContext.container.get(identifier);
|
|
69
|
+
}
|
|
70
|
+
return httpContext.container.get(identifier);
|
|
71
|
+
},
|
|
72
|
+
getTenantId: () => scope.tenant,
|
|
73
|
+
getRequestId: () => scope.request,
|
|
74
|
+
};
|
|
75
|
+
return context;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
exports.GuardContextFactory = GuardContextFactory;
|
|
79
|
+
exports.GuardContextFactory = GuardContextFactory = __decorate([
|
|
80
|
+
(0, core_1.injectable)(),
|
|
81
|
+
__param(0, (0, core_1.inject)(core_1.Container)),
|
|
82
|
+
__param(1, (0, core_1.inject)("IScopeExtractor")),
|
|
83
|
+
__metadata("design:paramtypes", [Object, Object])
|
|
84
|
+
], GuardContextFactory);
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.GuardMiddleware = void 0;
|
|
16
|
+
const core_1 = require("@expressots/core");
|
|
17
|
+
const core_2 = require("@expressots/core");
|
|
18
|
+
const guard_context_factory_js_1 = require("./guard-context-factory.js");
|
|
19
|
+
const core_3 = require("@expressots/core");
|
|
20
|
+
/**
|
|
21
|
+
* Express middleware that executes guards before route handler
|
|
22
|
+
*/
|
|
23
|
+
let GuardMiddleware = class GuardMiddleware {
|
|
24
|
+
constructor(executor, contextFactory, container) {
|
|
25
|
+
this.executor = executor;
|
|
26
|
+
this.contextFactory = contextFactory;
|
|
27
|
+
this.container = container;
|
|
28
|
+
/**
|
|
29
|
+
* Express middleware function
|
|
30
|
+
*/
|
|
31
|
+
this.execute = async (req, res, next) => {
|
|
32
|
+
// Get request ID for flow tracking
|
|
33
|
+
const requestContext = core_1.ContextManager.getCurrentContext();
|
|
34
|
+
const requestId = requestContext?.requestId;
|
|
35
|
+
const flowTracker = requestId ? (0, core_1.findFlowTracker)(requestId) : undefined;
|
|
36
|
+
// Extract guards from route metadata (controller + method level)
|
|
37
|
+
const guards = this.extractGuards(req);
|
|
38
|
+
if (guards.length === 0) {
|
|
39
|
+
return next(); // No guards, proceed
|
|
40
|
+
}
|
|
41
|
+
// Start tracking guard execution
|
|
42
|
+
const guardNames = guards.map((g) => {
|
|
43
|
+
if (typeof g === "function") {
|
|
44
|
+
return g.name || "UnknownGuard";
|
|
45
|
+
}
|
|
46
|
+
return g.constructor.name;
|
|
47
|
+
});
|
|
48
|
+
const guardStepName = `Guards: ${guardNames.join(", ")}`;
|
|
49
|
+
if (flowTracker?.isEnabled()) {
|
|
50
|
+
flowTracker.startStep("guard", guardStepName, {
|
|
51
|
+
guardCount: guards.length,
|
|
52
|
+
guardNames,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
// Create guard context
|
|
57
|
+
const context = await this.contextFactory.create(req, res);
|
|
58
|
+
// Execute guards
|
|
59
|
+
const result = await this.executor.execute(guards, context);
|
|
60
|
+
if (!result.allowed) {
|
|
61
|
+
// End guard step with failure
|
|
62
|
+
if (flowTracker?.isEnabled()) {
|
|
63
|
+
flowTracker.failStep(result.error);
|
|
64
|
+
}
|
|
65
|
+
// Throw error to be caught by exception handler
|
|
66
|
+
throw result.error || core_3.AppError.forbidden("Access denied");
|
|
67
|
+
}
|
|
68
|
+
// End guard step with success
|
|
69
|
+
if (flowTracker?.isEnabled()) {
|
|
70
|
+
flowTracker.endStep("success");
|
|
71
|
+
}
|
|
72
|
+
next();
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
// Store error on request for flow tracking
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
77
|
+
req.__expressotsFlowError =
|
|
78
|
+
error instanceof Error ? error : new Error(String(error));
|
|
79
|
+
// End guard step with failure if not already ended
|
|
80
|
+
if (flowTracker?.isEnabled()) {
|
|
81
|
+
const currentFlow = flowTracker.getFlow();
|
|
82
|
+
const lastStep = currentFlow.steps[currentFlow.steps.length - 1];
|
|
83
|
+
if (lastStep && lastStep.name === guardStepName && lastStep.status === "success") {
|
|
84
|
+
// Step was already ended, don't end again
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
flowTracker.failStep(error instanceof Error ? error : undefined);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
next(error);
|
|
91
|
+
}
|
|
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
|
+
exports.GuardMiddleware = GuardMiddleware;
|
|
107
|
+
exports.GuardMiddleware = GuardMiddleware = __decorate([
|
|
108
|
+
(0, core_1.injectable)(),
|
|
109
|
+
__param(0, (0, core_1.inject)(core_2.GuardExecutor)),
|
|
110
|
+
__param(1, (0, core_1.inject)(guard_context_factory_js_1.GuardContextFactory)),
|
|
111
|
+
__param(2, (0, core_1.inject)(core_1.Container)),
|
|
112
|
+
__metadata("design:paramtypes", [core_2.GuardExecutor,
|
|
113
|
+
guard_context_factory_js_1.GuardContextFactory,
|
|
114
|
+
core_1.Container])
|
|
115
|
+
], GuardMiddleware);
|