@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,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONDITIONAL_MIDDLEWARE_SYMBOL = void 0;
|
|
4
|
+
exports.isConditionalMiddleware = isConditionalMiddleware;
|
|
5
|
+
exports.when = when;
|
|
6
|
+
exports.unless = unless;
|
|
7
|
+
/**
|
|
8
|
+
* Symbol to identify conditional middleware configuration objects.
|
|
9
|
+
* Used internally for type checking.
|
|
10
|
+
*/
|
|
11
|
+
exports.CONDITIONAL_MIDDLEWARE_SYMBOL = Symbol("ConditionalMiddleware");
|
|
12
|
+
/**
|
|
13
|
+
* Type guard to check if an object is a ConditionalMiddlewareConfig.
|
|
14
|
+
*/
|
|
15
|
+
function isConditionalMiddleware(item) {
|
|
16
|
+
return (typeof item === "object" &&
|
|
17
|
+
item !== null &&
|
|
18
|
+
"condition" in item &&
|
|
19
|
+
"middleware" in item &&
|
|
20
|
+
typeof item.condition === "function");
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Creates a conditional middleware configuration that executes the middleware
|
|
24
|
+
* when the condition evaluates to true.
|
|
25
|
+
*
|
|
26
|
+
* @param condition - Function that receives the Request and returns boolean or Promise<boolean>
|
|
27
|
+
* @param middleware - The middleware to execute when condition is true
|
|
28
|
+
* @returns ConditionalMiddlewareConfig object
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // Phase 2: Class reference support - no 'new' keyword needed
|
|
33
|
+
* @Get("/admin",
|
|
34
|
+
* when(req => req.hostname.startsWith("admin."), AdminMiddleware),
|
|
35
|
+
* AuthMiddleware
|
|
36
|
+
* )
|
|
37
|
+
* async adminHandler() {}
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* // Async condition with class reference (Phase 2)
|
|
43
|
+
* @Get("/api",
|
|
44
|
+
* when(async req => {
|
|
45
|
+
* const user = await getUser(req);
|
|
46
|
+
* return user.isAdmin;
|
|
47
|
+
* }, AdminMiddleware)
|
|
48
|
+
* )
|
|
49
|
+
* async apiHandler() {}
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
function when(condition,
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
54
|
+
middleware) {
|
|
55
|
+
return {
|
|
56
|
+
condition,
|
|
57
|
+
middleware: middleware,
|
|
58
|
+
skipOnFalse: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Creates a conditional middleware configuration that executes the middleware
|
|
63
|
+
* when the condition evaluates to false (inverse of `when`).
|
|
64
|
+
*
|
|
65
|
+
* @param condition - Function that receives the Request and returns boolean or Promise<boolean>
|
|
66
|
+
* @param middleware - The middleware to execute when condition is false
|
|
67
|
+
* @returns ConditionalMiddlewareConfig object
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* // Phase 2: Class reference support - no 'new' keyword needed
|
|
72
|
+
* @Get("/public",
|
|
73
|
+
* unless(req => req.headers.authorization, AuthMiddleware)
|
|
74
|
+
* )
|
|
75
|
+
* async publicHandler() {}
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```typescript
|
|
80
|
+
* // Skip authentication for public routes (Phase 2: class reference)
|
|
81
|
+
* @Get("/health",
|
|
82
|
+
* unless(req => req.path.startsWith("/api"), AuthMiddleware)
|
|
83
|
+
* )
|
|
84
|
+
* async healthCheck() {}
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
function unless(condition,
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
+
middleware) {
|
|
90
|
+
return {
|
|
91
|
+
condition: (req) => {
|
|
92
|
+
const result = condition(req);
|
|
93
|
+
// Invert the condition: if condition returns Promise, return inverted Promise
|
|
94
|
+
if (result instanceof Promise) {
|
|
95
|
+
return result.then((value) => !value);
|
|
96
|
+
}
|
|
97
|
+
return !result;
|
|
98
|
+
},
|
|
99
|
+
middleware: middleware,
|
|
100
|
+
skipOnFalse: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
@@ -6,11 +6,28 @@ exports.TYPE = {
|
|
|
6
6
|
Controller: Symbol.for("Controller"),
|
|
7
7
|
HttpContext: Symbol.for("HttpContext"),
|
|
8
8
|
};
|
|
9
|
+
// Import exception filter metadata keys from core to maintain compatibility
|
|
10
|
+
const core_1 = require("@expressots/core");
|
|
9
11
|
exports.METADATA_KEY = {
|
|
10
12
|
controller: "inversify-express-utils:controller",
|
|
11
13
|
controllerMethod: "inversify-express-utils:controller-method",
|
|
12
14
|
controllerParameter: "inversify-express-utils:controller-parameter",
|
|
13
15
|
httpContext: "inversify-express-utils:httpcontext",
|
|
16
|
+
version: "inversify-express-utils:version",
|
|
17
|
+
accept: "inversify-express-utils:accept",
|
|
18
|
+
consumes: "inversify-express-utils:consumes",
|
|
19
|
+
produces: "inversify-express-utils:produces",
|
|
20
|
+
csvOptions: "inversify-express-utils:csv-options",
|
|
21
|
+
xmlOptions: "inversify-express-utils:xml-options",
|
|
22
|
+
yamlOptions: "inversify-express-utils:yaml-options",
|
|
23
|
+
streamResponse: "inversify-express-utils:stream-response",
|
|
24
|
+
// Validation metadata
|
|
25
|
+
validationSchema: "inversify-express-utils:validation-schema",
|
|
26
|
+
validationOptions: "inversify-express-utils:validation-options",
|
|
27
|
+
// Re-export exception filter metadata keys from core for backward compatibility
|
|
28
|
+
exceptionFilter: core_1.EXCEPTION_FILTER_METADATA_KEY.exceptionFilter,
|
|
29
|
+
controllerExceptionFilters: core_1.EXCEPTION_FILTER_METADATA_KEY.controllerExceptionFilters,
|
|
30
|
+
methodExceptionFilters: core_1.EXCEPTION_FILTER_METADATA_KEY.methodExceptionFilters,
|
|
14
31
|
};
|
|
15
32
|
exports.HTTP_CODE_METADATA = {
|
|
16
33
|
httpCode: "inversify-express-utils:httpcode",
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Accept = Accept;
|
|
4
|
+
exports.Consumes = Consumes;
|
|
5
|
+
exports.Produces = Produces;
|
|
6
|
+
exports.CsvOptions = CsvOptions;
|
|
7
|
+
exports.XmlOptions = XmlOptions;
|
|
8
|
+
exports.YamlOptions = YamlOptions;
|
|
9
|
+
exports.StreamResponse = StreamResponse;
|
|
10
|
+
require("reflect-metadata");
|
|
11
|
+
const constants_js_1 = require("./constants.js");
|
|
12
|
+
/**
|
|
13
|
+
* Accept decorator to specify which content types this route accepts for responses.
|
|
14
|
+
* Used for content negotiation based on Accept header.
|
|
15
|
+
* @param contentTypes - Array of accepted content types (e.g., ["application/json", "application/xml"])
|
|
16
|
+
* @returns MethodDecorator
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* @Accept("application/json", "application/xml")
|
|
20
|
+
* @Get("/users")
|
|
21
|
+
* getUsers() {
|
|
22
|
+
* return [{ id: 1, name: "John" }];
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
* @public API
|
|
26
|
+
*/
|
|
27
|
+
function Accept(...contentTypes) {
|
|
28
|
+
return (target, key) => {
|
|
29
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.accept, contentTypes, target, key);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Consumes decorator to specify which content types this route consumes for requests.
|
|
34
|
+
* Used for content negotiation based on Content-Type header.
|
|
35
|
+
* @param contentTypes - Array of consumed content types (e.g., ["application/json", "application/xml"])
|
|
36
|
+
* @returns MethodDecorator
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* @Consumes("application/json", "application/xml")
|
|
40
|
+
* @Post("/users")
|
|
41
|
+
* createUser(@body() user: UserDto) {
|
|
42
|
+
* return this.userService.create(user);
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
* @public API
|
|
46
|
+
*/
|
|
47
|
+
function Consumes(...contentTypes) {
|
|
48
|
+
return (target, key) => {
|
|
49
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.consumes, contentTypes, target, key);
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Produces decorator to specify which content types this route produces for responses.
|
|
54
|
+
* Alias for @Accept() decorator.
|
|
55
|
+
* @param contentTypes - Array of produced content types
|
|
56
|
+
* @returns MethodDecorator
|
|
57
|
+
* @public API
|
|
58
|
+
*/
|
|
59
|
+
function Produces(...contentTypes) {
|
|
60
|
+
return Accept(...contentTypes);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* CsvOptions decorator to configure CSV formatting options for a route.
|
|
64
|
+
* @param options - CSV formatting options
|
|
65
|
+
* @returns MethodDecorator
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* @CsvOptions({ fields: ["id", "name"], includeHeaders: true })
|
|
69
|
+
* @Get("/users")
|
|
70
|
+
* getUsers() {
|
|
71
|
+
* return [{ id: 1, name: "John", email: "john@example.com" }];
|
|
72
|
+
* }
|
|
73
|
+
* ```
|
|
74
|
+
* @public API
|
|
75
|
+
*/
|
|
76
|
+
function CsvOptions(options) {
|
|
77
|
+
return (target, key) => {
|
|
78
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.csvOptions, options, target, key);
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* XmlOptions decorator to configure XML formatting options for a route.
|
|
83
|
+
* @param options - XML formatting options
|
|
84
|
+
* @returns MethodDecorator
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* @XmlOptions({ rootElement: "users", itemElement: "user", prettyPrint: true })
|
|
88
|
+
* @Get("/users")
|
|
89
|
+
* getUsers() {
|
|
90
|
+
* return [{ id: 1, name: "John" }];
|
|
91
|
+
* }
|
|
92
|
+
* ```
|
|
93
|
+
* @public API
|
|
94
|
+
*/
|
|
95
|
+
function XmlOptions(options) {
|
|
96
|
+
return (target, key) => {
|
|
97
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.xmlOptions, options, target, key);
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* YamlOptions decorator to configure YAML formatting options for a route.
|
|
102
|
+
* @param options - YAML formatting options
|
|
103
|
+
* @returns MethodDecorator
|
|
104
|
+
* @public API
|
|
105
|
+
*/
|
|
106
|
+
function YamlOptions(options) {
|
|
107
|
+
return (target, key) => {
|
|
108
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.yamlOptions, options, target, key);
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* StreamResponse decorator to indicate that the response should be streamed.
|
|
113
|
+
* Useful for large datasets.
|
|
114
|
+
* @returns MethodDecorator
|
|
115
|
+
* @example
|
|
116
|
+
* ```typescript
|
|
117
|
+
* @StreamResponse()
|
|
118
|
+
* @Get("/large-dataset")
|
|
119
|
+
* getLargeDataset() {
|
|
120
|
+
* return this.dataService.streamLargeDataset(); // Returns async iterator
|
|
121
|
+
* }
|
|
122
|
+
* ```
|
|
123
|
+
* @public API
|
|
124
|
+
*/
|
|
125
|
+
function StreamResponse() {
|
|
126
|
+
return (target, key) => {
|
|
127
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.streamResponse, true, target, key);
|
|
128
|
+
};
|
|
129
|
+
}
|
|
@@ -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,13 @@ 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
|
+
// Explicit type annotation: without this, the inferred type pulls a
|
|
25
|
+
// non-portable path from @expressots/core's internal decorator_utils,
|
|
26
|
+
// which TS2742 rejects under NodeNext when emitting .d.ts files.
|
|
27
|
+
exports.injectHttpContext = (0, core_1.inject)(constants_js_1.TYPE.HttpContext);
|
|
24
28
|
/**
|
|
25
29
|
* Controller decorator to define a new controller
|
|
26
30
|
* @param path route path
|
|
@@ -29,29 +33,46 @@ exports.injectHttpContext = (0, core_1.inject)(constants_1.TYPE.HttpContext);
|
|
|
29
33
|
*/
|
|
30
34
|
function controller(path, ...middleware) {
|
|
31
35
|
return (target) => {
|
|
36
|
+
// Check for version metadata on the controller class
|
|
37
|
+
const controllerVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target);
|
|
32
38
|
const currentMetadata = {
|
|
33
39
|
middleware,
|
|
34
40
|
path,
|
|
35
|
-
target,
|
|
41
|
+
target: target,
|
|
42
|
+
version: controllerVersion,
|
|
36
43
|
};
|
|
37
|
-
const pathMetadata = Reflect.getOwnMetadata(
|
|
38
|
-
const statusCodeMetadata = Reflect.getOwnMetadata(
|
|
39
|
-
const statusCodePathMapping = Reflect.getOwnMetadata(
|
|
44
|
+
const pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect) || {};
|
|
45
|
+
const statusCodeMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect) || {};
|
|
46
|
+
const statusCodePathMapping = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.httpCode, Reflect) || {};
|
|
40
47
|
for (const key in pathMetadata) {
|
|
41
48
|
if (statusCodeMetadata && statusCodeMetadata[key]) {
|
|
42
|
-
const
|
|
49
|
+
const methodPath = pathMetadata[key]["path"];
|
|
50
|
+
// Properly join controller and method paths
|
|
51
|
+
let realPath;
|
|
52
|
+
if (methodPath === "/" || methodPath === "") {
|
|
53
|
+
realPath = path;
|
|
54
|
+
}
|
|
55
|
+
else if (path === "/" || path === "") {
|
|
56
|
+
realPath = methodPath.startsWith("/") ? methodPath : `/${methodPath}`;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Normalize: remove trailing slash from controller, ensure method has leading slash
|
|
60
|
+
const basePath = path.endsWith("/") ? path.slice(0, -1) : path;
|
|
61
|
+
const subPath = methodPath.startsWith("/") ? methodPath : `/${methodPath}`;
|
|
62
|
+
realPath = `${basePath}${subPath}`;
|
|
63
|
+
}
|
|
43
64
|
statusCodePathMapping[`${realPath}/-${pathMetadata[key]["method"].toLowerCase()}`] =
|
|
44
65
|
statusCodeMetadata[key];
|
|
45
66
|
}
|
|
46
67
|
}
|
|
47
|
-
Reflect.defineMetadata(
|
|
48
|
-
Reflect.deleteMetadata(
|
|
49
|
-
Reflect.deleteMetadata(
|
|
68
|
+
Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.httpCode, statusCodePathMapping, Reflect);
|
|
69
|
+
Reflect.deleteMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect);
|
|
70
|
+
Reflect.deleteMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
|
|
50
71
|
(0, core_1.decorate)((0, core_1.injectable)(), target);
|
|
51
|
-
Reflect.defineMetadata(
|
|
52
|
-
const previousMetadata = Reflect.getMetadata(
|
|
72
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.controller, currentMetadata, target);
|
|
73
|
+
const previousMetadata = Reflect.getMetadata(constants_js_1.METADATA_KEY.controller, Reflect) || [];
|
|
53
74
|
const newMetadata = [currentMetadata, ...previousMetadata];
|
|
54
|
-
Reflect.defineMetadata(
|
|
75
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.controller, newMetadata, Reflect);
|
|
55
76
|
};
|
|
56
77
|
}
|
|
57
78
|
/**
|
|
@@ -70,7 +91,7 @@ function controller(path, ...middleware) {
|
|
|
70
91
|
function Http(code) {
|
|
71
92
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
|
|
72
93
|
return (target, key, descriptor) => {
|
|
73
|
-
let httpCodeMetadata = Reflect.getOwnMetadata(
|
|
94
|
+
let httpCodeMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect);
|
|
74
95
|
if (httpCodeMetadata) {
|
|
75
96
|
httpCodeMetadata[key] = code;
|
|
76
97
|
}
|
|
@@ -78,7 +99,55 @@ function Http(code) {
|
|
|
78
99
|
httpCodeMetadata = {};
|
|
79
100
|
httpCodeMetadata[key] = code;
|
|
80
101
|
}
|
|
81
|
-
Reflect.defineMetadata(
|
|
102
|
+
Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, httpCodeMetadata, Reflect);
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Version decorator to define the API version for a controller or route method
|
|
107
|
+
* @param version API version (e.g., "1", "1.0", "v1", or 1)
|
|
108
|
+
* @returns ClassDecorator | MethodDecorator
|
|
109
|
+
* @example ```typescript
|
|
110
|
+
* @Version("1")
|
|
111
|
+
* @controller("/users")
|
|
112
|
+
* class UserController {}
|
|
113
|
+
*
|
|
114
|
+
* // Or at method level:
|
|
115
|
+
* @Version("2")
|
|
116
|
+
* @Get("/")
|
|
117
|
+
* getUsers() {
|
|
118
|
+
* return "v2 users";
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
* @public API
|
|
122
|
+
*/
|
|
123
|
+
function Version(version) {
|
|
124
|
+
// Normalize version to string format (e.g., "v1" or "1" -> "v1")
|
|
125
|
+
const normalizedVersion = typeof version === "number" ? `v${version}` : version.startsWith("v") ? version : `v${version}`;
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
127
|
+
return (target, key, descriptor) => {
|
|
128
|
+
if (key !== undefined && descriptor !== undefined) {
|
|
129
|
+
// Method decorator - store version metadata for the method
|
|
130
|
+
// This will be read by enhancedHttpMethod/Method when they create metadata
|
|
131
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.version, normalizedVersion, target, key);
|
|
132
|
+
// Also update existing metadata if it exists
|
|
133
|
+
const metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
|
|
134
|
+
if (metadataList) {
|
|
135
|
+
const methodMetadata = metadataList.find((m) => m.key === key);
|
|
136
|
+
if (methodMetadata) {
|
|
137
|
+
methodMetadata.version = normalizedVersion;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Class decorator - store version metadata for the controller
|
|
143
|
+
// This will be read by controller decorator when it creates metadata
|
|
144
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.version, normalizedVersion, target);
|
|
145
|
+
// Also update existing metadata if it exists
|
|
146
|
+
const controllerMetadata = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controller, target);
|
|
147
|
+
if (controllerMetadata) {
|
|
148
|
+
controllerMetadata.version = normalizedVersion;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
82
151
|
};
|
|
83
152
|
}
|
|
84
153
|
/**
|
|
@@ -151,15 +220,18 @@ function Delete(path, ...middleware) {
|
|
|
151
220
|
*/
|
|
152
221
|
function enhancedHttpMethod(method, path, ...middleware) {
|
|
153
222
|
return (target, key) => {
|
|
223
|
+
// Check for version metadata on the method
|
|
224
|
+
const methodVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target, key);
|
|
154
225
|
const metadata = {
|
|
155
|
-
key,
|
|
226
|
+
key: String(key),
|
|
156
227
|
method,
|
|
157
228
|
middleware,
|
|
158
229
|
path,
|
|
159
|
-
target,
|
|
230
|
+
target: target,
|
|
231
|
+
version: methodVersion,
|
|
160
232
|
};
|
|
161
233
|
let metadataList = [];
|
|
162
|
-
let pathMetadata = Reflect.getOwnMetadata(
|
|
234
|
+
let pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
|
|
163
235
|
if (pathMetadata) {
|
|
164
236
|
pathMetadata[key] = {
|
|
165
237
|
path,
|
|
@@ -173,12 +245,12 @@ function enhancedHttpMethod(method, path, ...middleware) {
|
|
|
173
245
|
method,
|
|
174
246
|
};
|
|
175
247
|
}
|
|
176
|
-
Reflect.defineMetadata(
|
|
177
|
-
if (!Reflect.hasOwnMetadata(
|
|
178
|
-
Reflect.defineMetadata(
|
|
248
|
+
Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.path, pathMetadata, Reflect);
|
|
249
|
+
if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor)) {
|
|
250
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
|
|
179
251
|
}
|
|
180
252
|
else {
|
|
181
|
-
metadataList = Reflect.getOwnMetadata(
|
|
253
|
+
metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
|
|
182
254
|
}
|
|
183
255
|
metadataList.push(metadata);
|
|
184
256
|
const paramsInfo = Reflect.getMetadata("design:paramtypes", target, key) || [];
|
|
@@ -203,15 +275,18 @@ function enhancedHttpMethod(method, path, ...middleware) {
|
|
|
203
275
|
*/
|
|
204
276
|
function Method(method, path, ...middleware) {
|
|
205
277
|
return (target, key) => {
|
|
278
|
+
// Check for version metadata on the method
|
|
279
|
+
const methodVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target, key);
|
|
206
280
|
const metadata = {
|
|
207
|
-
key,
|
|
281
|
+
key: String(key),
|
|
208
282
|
method,
|
|
209
283
|
middleware,
|
|
210
284
|
path,
|
|
211
|
-
target,
|
|
285
|
+
target: target,
|
|
286
|
+
version: methodVersion,
|
|
212
287
|
};
|
|
213
288
|
let metadataList = [];
|
|
214
|
-
let pathMetadata = Reflect.getOwnMetadata(
|
|
289
|
+
let pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
|
|
215
290
|
if (pathMetadata) {
|
|
216
291
|
pathMetadata[key] = {
|
|
217
292
|
path,
|
|
@@ -225,12 +300,12 @@ function Method(method, path, ...middleware) {
|
|
|
225
300
|
method,
|
|
226
301
|
};
|
|
227
302
|
}
|
|
228
|
-
Reflect.defineMetadata(
|
|
229
|
-
if (!Reflect.hasOwnMetadata(
|
|
230
|
-
Reflect.defineMetadata(
|
|
303
|
+
Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.path, pathMetadata, Reflect);
|
|
304
|
+
if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor)) {
|
|
305
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
|
|
231
306
|
}
|
|
232
307
|
else {
|
|
233
|
-
metadataList = Reflect.getOwnMetadata(
|
|
308
|
+
metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
|
|
234
309
|
}
|
|
235
310
|
metadataList.push(metadata);
|
|
236
311
|
};
|
|
@@ -239,47 +314,47 @@ function Method(method, path, ...middleware) {
|
|
|
239
314
|
* Parameter decorator to inject the request object
|
|
240
315
|
* @returns ParameterDecorator
|
|
241
316
|
*/
|
|
242
|
-
exports.request = paramDecoratorFactory(
|
|
317
|
+
exports.request = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.REQUEST);
|
|
243
318
|
/**
|
|
244
319
|
* Parameter decorator to inject the response object
|
|
245
320
|
* @returns ParameterDecorator
|
|
246
321
|
*/
|
|
247
|
-
exports.response = paramDecoratorFactory(
|
|
322
|
+
exports.response = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.RESPONSE);
|
|
248
323
|
/**
|
|
249
324
|
* Parameter decorator to inject parameters from the route
|
|
250
325
|
* @returns ParameterDecorator
|
|
251
326
|
*/
|
|
252
|
-
exports.param = paramDecoratorFactory(
|
|
327
|
+
exports.param = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.PARAMS);
|
|
253
328
|
/**
|
|
254
329
|
* Parameter decorator to inject query parameters
|
|
255
330
|
* @returns ParameterDecorator
|
|
256
331
|
*/
|
|
257
|
-
exports.query = paramDecoratorFactory(
|
|
332
|
+
exports.query = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.QUERY);
|
|
258
333
|
/**
|
|
259
334
|
* Parameter decorator to inject the request body
|
|
260
335
|
* @returns ParameterDecorator
|
|
261
336
|
*/
|
|
262
|
-
exports.body = paramDecoratorFactory(
|
|
337
|
+
exports.body = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.BODY);
|
|
263
338
|
/**
|
|
264
339
|
* Parameter decorator to inject the request headers
|
|
265
340
|
* @returns ParameterDecorator
|
|
266
341
|
*/
|
|
267
|
-
exports.headers = paramDecoratorFactory(
|
|
342
|
+
exports.headers = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.HEADERS);
|
|
268
343
|
/**
|
|
269
344
|
* Parameter decorator to inject the request cookies
|
|
270
345
|
* @returns ParameterDecorator
|
|
271
346
|
*/
|
|
272
|
-
exports.cookies = paramDecoratorFactory(
|
|
347
|
+
exports.cookies = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.COOKIES);
|
|
273
348
|
/**
|
|
274
349
|
* Parameter decorator next function
|
|
275
350
|
* @returns ParameterDecorator
|
|
276
351
|
*/
|
|
277
|
-
exports.next = paramDecoratorFactory(
|
|
352
|
+
exports.next = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.NEXT);
|
|
278
353
|
/**
|
|
279
354
|
* Parameter decorator to inject the principal object obtained from AuthProvider
|
|
280
355
|
* @returns ParameterDecorator
|
|
281
356
|
*/
|
|
282
|
-
exports.principal = paramDecoratorFactory(
|
|
357
|
+
exports.principal = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.PRINCIPAL);
|
|
283
358
|
/**
|
|
284
359
|
* Parameter decorator to inject the request user object
|
|
285
360
|
* @returns ParameterDecorator
|
|
@@ -304,18 +379,18 @@ function params(type, parameterName) {
|
|
|
304
379
|
parameterName,
|
|
305
380
|
type,
|
|
306
381
|
};
|
|
307
|
-
if (!Reflect.hasOwnMetadata(
|
|
382
|
+
if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, target.constructor)) {
|
|
308
383
|
parameterMetadataList.unshift(parameterMetadata);
|
|
309
384
|
}
|
|
310
385
|
else {
|
|
311
|
-
metadataList = Reflect.getOwnMetadata(
|
|
386
|
+
metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, target.constructor);
|
|
312
387
|
if (metadataList[methodName]) {
|
|
313
388
|
parameterMetadataList = metadataList[methodName] || [];
|
|
314
389
|
}
|
|
315
390
|
parameterMetadataList.unshift(parameterMetadata);
|
|
316
391
|
}
|
|
317
392
|
metadataList[methodName] = parameterMetadataList;
|
|
318
|
-
Reflect.defineMetadata(
|
|
393
|
+
Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerParameter, metadataList, target.constructor);
|
|
319
394
|
};
|
|
320
395
|
}
|
|
321
396
|
/**
|
|
@@ -328,11 +403,11 @@ function params(type, parameterName) {
|
|
|
328
403
|
function Render(template, defaultData) {
|
|
329
404
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
330
405
|
return (target, propertyKey, descriptor) => {
|
|
331
|
-
Reflect.defineMetadata(
|
|
406
|
+
Reflect.defineMetadata(constants_js_1.RENDER_METADATA_KEY, { template, defaultData }, target, propertyKey);
|
|
332
407
|
};
|
|
333
408
|
}
|
|
334
409
|
function getRenderMetadata(target, propertyKey) {
|
|
335
|
-
return Reflect.getMetadata(
|
|
410
|
+
return Reflect.getMetadata(constants_js_1.RENDER_METADATA_KEY, target, propertyKey) || {};
|
|
336
411
|
}
|
|
337
412
|
/**
|
|
338
413
|
* Converts a string value to the specified type.
|
|
@@ -365,15 +440,44 @@ function isResponse(obj) {
|
|
|
365
440
|
return (typeof obj === "object" && obj !== null && "status" in obj && "json" in obj && "send" in obj);
|
|
366
441
|
}
|
|
367
442
|
/**
|
|
368
|
-
* File upload decorator to handle file uploads
|
|
369
|
-
*
|
|
370
|
-
*
|
|
443
|
+
* File upload decorator to handle file uploads.
|
|
444
|
+
*
|
|
445
|
+
* This decorator integrates with the global upload configuration
|
|
446
|
+
* set via `Middleware.upload()` in app.ts. If global config exists,
|
|
447
|
+
* it will be used as defaults, with local options taking precedence.
|
|
448
|
+
*
|
|
449
|
+
* @param options - Field configuration (fieldName, maxCount, none, any)
|
|
450
|
+
* @param multerOptions - Optional multer options (overrides global config)
|
|
371
451
|
* @default { none: true }
|
|
372
452
|
* @returns MethodDecorator
|
|
453
|
+
*
|
|
454
|
+
* @example
|
|
455
|
+
* ```typescript
|
|
456
|
+
* // In app.ts - configure globally (optional)
|
|
457
|
+
* this.Middleware.upload({
|
|
458
|
+
* destination: './uploads',
|
|
459
|
+
* limits: { fileSize: 10 * 1024 * 1024 }
|
|
460
|
+
* });
|
|
461
|
+
*
|
|
462
|
+
* // In controller - uses global config automatically
|
|
463
|
+
* @Post('avatar')
|
|
464
|
+
* @FileUpload({ fieldName: 'avatar' })
|
|
465
|
+
* uploadAvatar(req: Request) {
|
|
466
|
+
* return req.file;
|
|
467
|
+
* }
|
|
468
|
+
*
|
|
469
|
+
* // Override global config for specific endpoint
|
|
470
|
+
* @Post('document')
|
|
471
|
+
* @FileUpload({ fieldName: 'doc' }, { limits: { fileSize: 50 * 1024 * 1024 } })
|
|
472
|
+
* uploadDocument(req: Request) {
|
|
473
|
+
* return req.file;
|
|
474
|
+
* }
|
|
475
|
+
* ```
|
|
476
|
+
*
|
|
373
477
|
* @public API
|
|
374
478
|
*/
|
|
375
479
|
function FileUpload(options, multerOptions) {
|
|
376
|
-
const multer = (0,
|
|
480
|
+
const multer = (0, resolver_multer_js_1.packageResolver)("multer");
|
|
377
481
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
378
482
|
let upload;
|
|
379
483
|
let method = "none";
|
|
@@ -381,7 +485,40 @@ function FileUpload(options, multerOptions) {
|
|
|
381
485
|
if (options === undefined) {
|
|
382
486
|
options = { none: true };
|
|
383
487
|
}
|
|
384
|
-
upload
|
|
488
|
+
// Get global upload configuration (set via Middleware.upload())
|
|
489
|
+
const globalConfig = (0, core_1.getGlobalUploadConfig)();
|
|
490
|
+
// Build final multer options, merging global config with local options
|
|
491
|
+
// Local options always take precedence over global config
|
|
492
|
+
const finalMulterOptions = {};
|
|
493
|
+
// Apply global config as defaults
|
|
494
|
+
if (globalConfig) {
|
|
495
|
+
if (globalConfig.destination) {
|
|
496
|
+
finalMulterOptions.dest = globalConfig.destination;
|
|
497
|
+
}
|
|
498
|
+
if (globalConfig.limits) {
|
|
499
|
+
finalMulterOptions.limits = globalConfig.limits;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// Apply local options (overrides global)
|
|
503
|
+
if (multerOptions) {
|
|
504
|
+
if (multerOptions.dest) {
|
|
505
|
+
finalMulterOptions.dest = multerOptions.dest;
|
|
506
|
+
}
|
|
507
|
+
if (multerOptions.limits) {
|
|
508
|
+
// Merge limits - local takes precedence
|
|
509
|
+
finalMulterOptions.limits = {
|
|
510
|
+
...finalMulterOptions.limits,
|
|
511
|
+
...multerOptions.limits,
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
if (multerOptions.storage) {
|
|
515
|
+
finalMulterOptions.storage = multerOptions.storage;
|
|
516
|
+
}
|
|
517
|
+
if (multerOptions.fileFilter) {
|
|
518
|
+
finalMulterOptions.fileFilter = multerOptions.fileFilter;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
upload = multer(finalMulterOptions);
|
|
385
522
|
method = inferMulterMethod(options);
|
|
386
523
|
}
|
|
387
524
|
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; } });
|