@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
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express 5 / path-to-regexp v8 compatibility for the `:name(regex)`
|
|
3
|
+
* inline-constraint syntax.
|
|
4
|
+
*
|
|
5
|
+
* `path-to-regexp` v8 (the parser Express 5 ships with) removed the
|
|
6
|
+
* inline regex form entirely — `/users/:id(\\d+)` now throws
|
|
7
|
+
*
|
|
8
|
+
* Unexpected ( at index 10: /users/:id(\\d+)
|
|
9
|
+
*
|
|
10
|
+
* That breaks two things we ship as public API:
|
|
11
|
+
*
|
|
12
|
+
* 1. The {@link Patterns} / {@link pattern} helpers in
|
|
13
|
+
* `route-constraints.ts`, which were introduced specifically to
|
|
14
|
+
* encourage that pattern.
|
|
15
|
+
* 2. Hand-written controller routes upgraded from v3, where users
|
|
16
|
+
* relied on Express 4 inline regex.
|
|
17
|
+
*
|
|
18
|
+
* Rather than break those at the surface of preview-3, we keep the
|
|
19
|
+
* authoring-time syntax and translate it at decorator time:
|
|
20
|
+
*
|
|
21
|
+
* - {@link splitPathConstraints} parses the path into a
|
|
22
|
+
* plain-`:name`-only form plus a list of `(name, regex)` pairs.
|
|
23
|
+
* - {@link createPathConstraintMiddleware} returns a middleware that
|
|
24
|
+
* runs at request time and 404s when any captured `req.params[name]`
|
|
25
|
+
* fails to match its constraint.
|
|
26
|
+
*
|
|
27
|
+
* The middleware emits an HTTP 404 (not 400) so the behaviour matches
|
|
28
|
+
* Express 4's "no route matched" semantics — under v6 of path-to-regexp,
|
|
29
|
+
* a non-matching `:id(\\d+)` simply meant the route wasn't selected and
|
|
30
|
+
* the request fell through to the framework's NotFound handler.
|
|
31
|
+
*/
|
|
32
|
+
import type { RequestHandler } from "express";
|
|
33
|
+
export interface PathConstraint {
|
|
34
|
+
/** The `:name` placeholder, without the leading colon. */
|
|
35
|
+
paramName: string;
|
|
36
|
+
/** Compiled regex. Anchored with `^...$` to match the whole segment. */
|
|
37
|
+
regex: RegExp;
|
|
38
|
+
/** The original raw regex text, for diagnostics. */
|
|
39
|
+
rawPattern: string;
|
|
40
|
+
}
|
|
41
|
+
export interface SplitPath {
|
|
42
|
+
/** Path string ready to hand to Express 5 / path-to-regexp v8. */
|
|
43
|
+
path: string;
|
|
44
|
+
/** Param-level regex constraints, in path declaration order. */
|
|
45
|
+
constraints: Array<PathConstraint>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Split `:name(regex)` segments out of an Express-style route path.
|
|
49
|
+
*
|
|
50
|
+
* The walker honours balanced parens inside the regex (e.g.
|
|
51
|
+
* `(\\d{4})` or `((a|b)+)`), which is more forgiving than a naive
|
|
52
|
+
* single-pass regex match would be. Returns the original path and an
|
|
53
|
+
* empty constraints list when no inline patterns are found, so this is
|
|
54
|
+
* a no-op for the common case.
|
|
55
|
+
*/
|
|
56
|
+
export declare function splitPathConstraints(path: string): SplitPath;
|
|
57
|
+
/**
|
|
58
|
+
* Build a middleware that enforces the given param-level regex
|
|
59
|
+
* constraints on `req.params`. Returns `null` when the list is empty
|
|
60
|
+
* (so callers can avoid wiring an unnecessary middleware).
|
|
61
|
+
*
|
|
62
|
+
* When a constraint fails, the middleware delegates to `next()` without
|
|
63
|
+
* a value; the framework's NotFound handler then converts that into a
|
|
64
|
+
* 404 — same observable behaviour as Express 4's "no route matched".
|
|
65
|
+
*/
|
|
66
|
+
export declare function createPathConstraintMiddleware(constraints: Array<PathConstraint>): RequestHandler | null;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from "express";
|
|
2
|
+
import { BaseMiddleware } from "./base-middleware.js";
|
|
3
|
+
/**
|
|
4
|
+
* Middleware that preloads permissions for authenticated users
|
|
5
|
+
* Caches permissions in request-scoped SecurityContext
|
|
6
|
+
*/
|
|
7
|
+
export declare class PermissionPreloaderMiddleware extends BaseMiddleware {
|
|
8
|
+
private securityContext?;
|
|
9
|
+
handler(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route parameter patterns for common use cases.
|
|
3
|
+
*
|
|
4
|
+
* Express 5 / path-to-regexp v8 dropped the inline-regex form
|
|
5
|
+
* (`:id(\\d+)`), so the framework no longer hands these patterns to
|
|
6
|
+
* the underlying matcher verbatim. Instead, the HTTP-method decorators
|
|
7
|
+
* (`@Get`, `@Post`, …) parse the constraint out of the path at decorator
|
|
8
|
+
* time, register the route under a plain `:id` placeholder, and inject
|
|
9
|
+
* a small validator middleware that 404s when the captured value
|
|
10
|
+
* doesn't match. The user-facing semantics are unchanged: a path that
|
|
11
|
+
* uses `Patterns.NUMERIC_ID` still rejects `/users/abc` and only
|
|
12
|
+
* dispatches the handler for matches like `/users/123`.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { Patterns, pattern } from "@expressots/adapter-express";
|
|
17
|
+
*
|
|
18
|
+
* @Get(`/users/${pattern("id", Patterns.NUMERIC_ID)}`)
|
|
19
|
+
* getUserById(@param("id") id: number) {
|
|
20
|
+
* // Only dispatches for numeric IDs like /users/123
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* @Get(`/documents/${pattern("uuid", Patterns.UUID)}`)
|
|
24
|
+
* getDocument(@param("uuid") uuid: string) {
|
|
25
|
+
* // Only dispatches for valid UUIDs
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @public API
|
|
30
|
+
*/
|
|
31
|
+
export declare const Patterns: {
|
|
32
|
+
/**
|
|
33
|
+
* Matches one or more digits (numeric ID)
|
|
34
|
+
* Example: /users/123 ✅, /users/abc ❌
|
|
35
|
+
*/
|
|
36
|
+
readonly NUMERIC_ID: "(\\d+)";
|
|
37
|
+
/**
|
|
38
|
+
* Matches a valid UUID v4 format
|
|
39
|
+
* Example: /documents/550e8400-e29b-41d4-a716-446655440000 ✅
|
|
40
|
+
*/
|
|
41
|
+
readonly UUID: "([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})";
|
|
42
|
+
/**
|
|
43
|
+
* Matches lowercase letters, numbers, and hyphens (URL-friendly slug)
|
|
44
|
+
* Example: /posts/my-awesome-post ✅, /posts/My_Post ❌
|
|
45
|
+
*/
|
|
46
|
+
readonly SLUG: "([a-z0-9-]+)";
|
|
47
|
+
/**
|
|
48
|
+
* Matches alphanumeric characters (letters and numbers only)
|
|
49
|
+
* Example: /codes/ABC123 ✅, /codes/ABC-123 ❌
|
|
50
|
+
*/
|
|
51
|
+
readonly ALPHANUMERIC: "([a-zA-Z0-9]+)";
|
|
52
|
+
/**
|
|
53
|
+
* Matches lowercase letters only
|
|
54
|
+
* Example: /tags/javascript ✅, /tags/JavaScript ❌
|
|
55
|
+
*/
|
|
56
|
+
readonly LOWERCASE: "([a-z]+)";
|
|
57
|
+
/**
|
|
58
|
+
* Matches uppercase letters only
|
|
59
|
+
* Example: /codes/USD ✅, /codes/usd ❌
|
|
60
|
+
*/
|
|
61
|
+
readonly UPPERCASE: "([A-Z]+)";
|
|
62
|
+
/**
|
|
63
|
+
* Matches email format (basic validation)
|
|
64
|
+
* Example: /users/user@example.com ✅
|
|
65
|
+
*/
|
|
66
|
+
readonly EMAIL: "([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})";
|
|
67
|
+
/**
|
|
68
|
+
* Matches hexadecimal string (e.g., color codes, hash)
|
|
69
|
+
* Example: /colors/ff5733 ✅, /colors/xyz ❌
|
|
70
|
+
*/
|
|
71
|
+
readonly HEXADECIMAL: "([0-9a-fA-F]+)";
|
|
72
|
+
/**
|
|
73
|
+
* Matches MongoDB ObjectId format (24 hex characters)
|
|
74
|
+
* Example: /documents/507f1f77bcf86cd799439011 ✅
|
|
75
|
+
*/
|
|
76
|
+
readonly MONGO_ID: "([0-9a-fA-F]{24})";
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Helper function to build route parameter patterns.
|
|
80
|
+
* This is optional - you can also use Patterns directly in template strings.
|
|
81
|
+
*
|
|
82
|
+
* @param paramName - The parameter name (e.g., "id", "uuid")
|
|
83
|
+
* @param pattern - The pattern from Patterns
|
|
84
|
+
* @returns The formatted route parameter with pattern
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* import { pattern, Patterns } from "@expressots/adapter-express";
|
|
89
|
+
*
|
|
90
|
+
* @Get(`/users/${pattern("id", Patterns.NUMERIC_ID)}`)
|
|
91
|
+
* getUserById(@param("id") id: number) {
|
|
92
|
+
* // Route: /users/:id(\\d+)
|
|
93
|
+
* }
|
|
94
|
+
* ```
|
|
95
|
+
*
|
|
96
|
+
* @public API
|
|
97
|
+
*/
|
|
98
|
+
export declare function pattern(paramName: string, patternValue: string): string;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Request } from "express";
|
|
2
|
+
import type { GuardScope } from "@expressots/core";
|
|
3
|
+
import type { IScopeExtractor } from "./scope-extractor.interface.js";
|
|
4
|
+
/**
|
|
5
|
+
* Extracts scope information from requests
|
|
6
|
+
* Supports tenant extraction from subdomain, header, or param
|
|
7
|
+
* Note: This is bound manually in setupAuthorizationForExpress() to allow user overrides
|
|
8
|
+
*/
|
|
9
|
+
export declare class ScopeExtractor implements IScopeExtractor {
|
|
10
|
+
extract(req: Request): Promise<GuardScope>;
|
|
11
|
+
/**
|
|
12
|
+
* Extract tenant ID from multiple sources
|
|
13
|
+
* @private
|
|
14
|
+
*/
|
|
15
|
+
private extractTenant;
|
|
16
|
+
/**
|
|
17
|
+
* Generate or retrieve request ID
|
|
18
|
+
* @private
|
|
19
|
+
*/
|
|
20
|
+
private generateRequestId;
|
|
21
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Request } from "express";
|
|
2
|
+
import type { GuardScope } from "@expressots/core";
|
|
3
|
+
/**
|
|
4
|
+
* Interface for extracting scope information from requests
|
|
5
|
+
*/
|
|
6
|
+
export interface IScopeExtractor {
|
|
7
|
+
/**
|
|
8
|
+
* Extract scope information from request
|
|
9
|
+
* @param req - Express request
|
|
10
|
+
*/
|
|
11
|
+
extract(req: Request): Promise<GuardScope>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { interfaces } from "@expressots/core";
|
|
2
|
+
import { type AuthorizationConfig } from "@expressots/core";
|
|
3
|
+
import type { AuthProvider } from "./interfaces.js";
|
|
4
|
+
import type { IMiddleware } from "@expressots/core";
|
|
5
|
+
/**
|
|
6
|
+
* Express-specific authorization setup
|
|
7
|
+
* Automatically registers all adapter-specific services and middleware
|
|
8
|
+
*
|
|
9
|
+
* @param container - DI container
|
|
10
|
+
* @param config - Authorization configuration
|
|
11
|
+
* @param middleware - Optional middleware manager to add PermissionPreloaderMiddleware
|
|
12
|
+
* @param authProvider - Optional AuthProvider class (if not already bound)
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* export class App extends AppExpress {
|
|
17
|
+
* async configureServices(): Promise<void> {
|
|
18
|
+
* setupAuthorizationForExpress(
|
|
19
|
+
* this.config.Container,
|
|
20
|
+
* {
|
|
21
|
+
* enablePreloading: true,
|
|
22
|
+
* enableCaching: true,
|
|
23
|
+
* permissionHierarchy: {
|
|
24
|
+
* admin: ["moderator", "user"],
|
|
25
|
+
* moderator: ["user"],
|
|
26
|
+
* },
|
|
27
|
+
* },
|
|
28
|
+
* this.Middleware,
|
|
29
|
+
* );
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function setupAuthorizationForExpress(container: interfaces.Container, config?: AuthorizationConfig, middleware?: IMiddleware, authProvider?: new () => AuthProvider): void;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { interfaces, EventRegistry, EventEmitter, EventRecorder, EventFlowTracker } from "@expressots/core";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration options for the event system setup.
|
|
4
|
+
*
|
|
5
|
+
* @public API
|
|
6
|
+
*/
|
|
7
|
+
export interface EventSystemOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Enable event recording for debugging.
|
|
10
|
+
* When true, all emitted events are recorded for later inspection or replay.
|
|
11
|
+
* @default true in development, false in production
|
|
12
|
+
*/
|
|
13
|
+
enableRecording?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Enable flow tracking for event visualization.
|
|
16
|
+
* When true, tracks the flow of events through handlers.
|
|
17
|
+
* @default true in development, false in production
|
|
18
|
+
*/
|
|
19
|
+
enableFlowTracking?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Maximum number of events to keep in the recording buffer.
|
|
22
|
+
* @default 1000
|
|
23
|
+
*/
|
|
24
|
+
maxRecordedEvents?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Default timeout for handler execution in milliseconds.
|
|
27
|
+
* @default 30000
|
|
28
|
+
*/
|
|
29
|
+
defaultTimeout?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Auto-discover event handlers from the container.
|
|
32
|
+
* When true, scans the container for @OnEvent decorated handlers.
|
|
33
|
+
* @default true
|
|
34
|
+
*/
|
|
35
|
+
autoDiscover?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Callback when an event is emitted.
|
|
38
|
+
*/
|
|
39
|
+
onEmit?: (event: unknown) => void;
|
|
40
|
+
/**
|
|
41
|
+
* Callback when a handler completes execution.
|
|
42
|
+
*/
|
|
43
|
+
onHandlerComplete?: (result: {
|
|
44
|
+
handler: string;
|
|
45
|
+
success: boolean;
|
|
46
|
+
duration: number;
|
|
47
|
+
}) => void;
|
|
48
|
+
/**
|
|
49
|
+
* Custom error handler for handler failures.
|
|
50
|
+
*/
|
|
51
|
+
onError?: (error: Error, event: unknown, handlerName: string) => void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Result of event system setup.
|
|
55
|
+
*
|
|
56
|
+
* @public API
|
|
57
|
+
*/
|
|
58
|
+
export interface EventSystemSetupResult {
|
|
59
|
+
/**
|
|
60
|
+
* The event registry instance.
|
|
61
|
+
*/
|
|
62
|
+
registry: EventRegistry;
|
|
63
|
+
/**
|
|
64
|
+
* The event emitter instance.
|
|
65
|
+
*/
|
|
66
|
+
emitter: EventEmitter;
|
|
67
|
+
/**
|
|
68
|
+
* The event recorder instance (if recording is enabled).
|
|
69
|
+
*/
|
|
70
|
+
recorder: EventRecorder;
|
|
71
|
+
/**
|
|
72
|
+
* The flow tracker instance (if flow tracking is enabled).
|
|
73
|
+
*/
|
|
74
|
+
flowTracker: EventFlowTracker;
|
|
75
|
+
/**
|
|
76
|
+
* Number of event handlers discovered.
|
|
77
|
+
*/
|
|
78
|
+
handlersDiscovered: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set up the ExpressoTS Event System with zero boilerplate.
|
|
82
|
+
*
|
|
83
|
+
* This function:
|
|
84
|
+
* 1. Registers all event system services (EventRegistry, EventEmitter, EventRecorder, EventFlowTracker)
|
|
85
|
+
* 2. Auto-discovers and registers all @OnEvent decorated handlers
|
|
86
|
+
* 3. Configures recording and flow tracking based on environment
|
|
87
|
+
* 4. Sets up replay emitter for development debugging
|
|
88
|
+
*
|
|
89
|
+
* @param container - The DI container
|
|
90
|
+
* @param options - Configuration options for the event system
|
|
91
|
+
* @returns Setup result with references to all event system services
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* export class App extends AppExpress {
|
|
96
|
+
* async configureServices(): Promise<void> {
|
|
97
|
+
* // Simple setup with defaults (recommended)
|
|
98
|
+
* const { handlersDiscovered } = setupEventSystemForExpress(
|
|
99
|
+
* this.config.Container
|
|
100
|
+
* );
|
|
101
|
+
* console.log(`Discovered ${handlersDiscovered} event handlers`);
|
|
102
|
+
*
|
|
103
|
+
* // Or with custom options
|
|
104
|
+
* setupEventSystemForExpress(this.config.Container, {
|
|
105
|
+
* enableRecording: true,
|
|
106
|
+
* maxRecordedEvents: 500,
|
|
107
|
+
* defaultTimeout: 10000,
|
|
108
|
+
* onError: (error, event, handler) => {
|
|
109
|
+
* console.error(`Handler ${handler} failed:`, error);
|
|
110
|
+
* }
|
|
111
|
+
* });
|
|
112
|
+
* }
|
|
113
|
+
* }
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @public API
|
|
117
|
+
*/
|
|
118
|
+
export declare function setupEventSystemForExpress(container: interfaces.Container, options?: EventSystemOptions): EventSystemSetupResult;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { interfaces } from "@expressots/core";
|
|
2
|
+
import { InterceptorRegistry, InterceptorExecutor, IInterceptor } from "@expressots/core";
|
|
3
|
+
/**
|
|
4
|
+
* Type for interceptor classes that can be registered.
|
|
5
|
+
* Accepts any class constructor, including those with DI-injected dependencies.
|
|
6
|
+
* The DI container resolves constructor parameters at runtime.
|
|
7
|
+
*/
|
|
8
|
+
export type InterceptorClass = new (...args: Array<any>) => IInterceptor;
|
|
9
|
+
/**
|
|
10
|
+
* Built-in interceptor types that can be enabled via configuration.
|
|
11
|
+
*
|
|
12
|
+
* @public API
|
|
13
|
+
*/
|
|
14
|
+
export type BuiltInInterceptor = "performance" | "logging" | "timeout";
|
|
15
|
+
/**
|
|
16
|
+
* Configuration options for the interceptor system setup.
|
|
17
|
+
*
|
|
18
|
+
* @public API
|
|
19
|
+
*/
|
|
20
|
+
export interface InterceptorSystemOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Enable and configure built-in interceptors.
|
|
23
|
+
* Set to true to enable with defaults, or provide configuration object.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* {
|
|
28
|
+
* performance: true, // Enable with defaults
|
|
29
|
+
* logging: { logResponse: true }, // Enable with custom config
|
|
30
|
+
* timeout: { defaultTimeout: 5000 }
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
builtIn?: {
|
|
35
|
+
performance?: boolean;
|
|
36
|
+
logging?: boolean;
|
|
37
|
+
timeout?: boolean | {
|
|
38
|
+
defaultTimeout?: number;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Custom interceptor classes to register.
|
|
43
|
+
* These will be bound as singletons and auto-discovered.
|
|
44
|
+
* Supports classes with DI-injected constructor dependencies.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* customInterceptors: [CacheInterceptor, AuditInterceptor]
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
customInterceptors?: Array<InterceptorClass>;
|
|
52
|
+
/**
|
|
53
|
+
* Auto-discover interceptors from the container.
|
|
54
|
+
* When true, scans the container for @UseInterceptor decorated controllers/methods.
|
|
55
|
+
* @default true
|
|
56
|
+
*/
|
|
57
|
+
autoDiscover?: boolean;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Result of interceptor system setup.
|
|
61
|
+
*
|
|
62
|
+
* @public API
|
|
63
|
+
*/
|
|
64
|
+
export interface InterceptorSystemSetupResult {
|
|
65
|
+
/**
|
|
66
|
+
* The interceptor registry instance.
|
|
67
|
+
*/
|
|
68
|
+
registry: InterceptorRegistry;
|
|
69
|
+
/**
|
|
70
|
+
* The interceptor executor instance.
|
|
71
|
+
*/
|
|
72
|
+
executor: InterceptorExecutor;
|
|
73
|
+
/**
|
|
74
|
+
* Number of interceptors registered.
|
|
75
|
+
*/
|
|
76
|
+
interceptorsRegistered: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Set up the ExpressoTS Interceptor System with zero boilerplate.
|
|
80
|
+
*
|
|
81
|
+
* This function:
|
|
82
|
+
* 1. Registers all interceptor infrastructure (InterceptorRegistry, InterceptorExecutor)
|
|
83
|
+
* 2. Optionally enables built-in interceptors (Performance, Logging, Timeout)
|
|
84
|
+
* 3. Registers custom interceptor classes
|
|
85
|
+
* 4. Initializes the interceptor registry
|
|
86
|
+
*
|
|
87
|
+
* @param container - The DI container
|
|
88
|
+
* @param options - Configuration options for the interceptor system
|
|
89
|
+
* @returns Setup result with references to interceptor services
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* export class App extends AppExpress {
|
|
94
|
+
* async configureServices(): Promise<void> {
|
|
95
|
+
* // Simple setup with performance interceptor
|
|
96
|
+
* setupInterceptorsForExpress(this.config.Container, {
|
|
97
|
+
* builtIn: { performance: true }
|
|
98
|
+
* });
|
|
99
|
+
*
|
|
100
|
+
* // Full setup with custom interceptors
|
|
101
|
+
* setupInterceptorsForExpress(this.config.Container, {
|
|
102
|
+
* builtIn: {
|
|
103
|
+
* performance: true,
|
|
104
|
+
* logging: true,
|
|
105
|
+
* timeout: { defaultTimeout: 5000 }
|
|
106
|
+
* },
|
|
107
|
+
* customInterceptors: [CacheInterceptor, AuditInterceptor]
|
|
108
|
+
* });
|
|
109
|
+
* }
|
|
110
|
+
* }
|
|
111
|
+
* ```
|
|
112
|
+
*
|
|
113
|
+
* @public API
|
|
114
|
+
*/
|
|
115
|
+
export declare function setupInterceptorsForExpress(container: interfaces.Container, options?: InterceptorSystemOptions): InterceptorSystemSetupResult;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup Lazy Loading for Express
|
|
3
|
+
*
|
|
4
|
+
* One-liner helper function to configure the lazy loading system.
|
|
5
|
+
*
|
|
6
|
+
* @module adapter-express
|
|
7
|
+
*/
|
|
8
|
+
import { RequestHandler } from "express";
|
|
9
|
+
import { Container } from "@expressots/core";
|
|
10
|
+
import { ILazyModule, LazyLoadingOptions, LazyLoadingSetupResult } from "@expressots/core";
|
|
11
|
+
import { LazyRouteMapping } from "./lazy-module-middleware.js";
|
|
12
|
+
/**
|
|
13
|
+
* Set up the lazy loading system with one function call.
|
|
14
|
+
*
|
|
15
|
+
* @layer public
|
|
16
|
+
* @audience application-developers
|
|
17
|
+
* @concept lazy-loading
|
|
18
|
+
*
|
|
19
|
+
* UNIQUE: Zero-configuration lazy loading!
|
|
20
|
+
* - Auto-detects routes from @controller() decorators
|
|
21
|
+
* - Creates middleware for automatic module loading
|
|
22
|
+
* - Optional metrics and background warmup
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* // 1. Define lazy modules (routes auto-detected from @controller)
|
|
27
|
+
* // lazy-modules.ts
|
|
28
|
+
* export const AdminModule = CreateLazyModule([AdminController]);
|
|
29
|
+
* // Routes auto-detected: ["/admin"] from @controller("/admin")
|
|
30
|
+
*
|
|
31
|
+
* export const ReportsModule = CreateLazyModule([ReportsController]);
|
|
32
|
+
* // Routes auto-detected: ["/reports"] from @controller("/reports")
|
|
33
|
+
*
|
|
34
|
+
* // 2. Setup in app.ts (just pass the modules!)
|
|
35
|
+
* export class App extends AppExpress {
|
|
36
|
+
* async configureServices(): Promise<void> {
|
|
37
|
+
* const { middleware } = setupLazyLoadingForExpress(
|
|
38
|
+
* this.config.Container,
|
|
39
|
+
* {
|
|
40
|
+
* lazyModules: [AdminModule, ReportsModule],
|
|
41
|
+
* globalPrefix: "/api" // Optional
|
|
42
|
+
* }
|
|
43
|
+
* );
|
|
44
|
+
*
|
|
45
|
+
* // Add middleware - that's it!
|
|
46
|
+
* if (middleware) {
|
|
47
|
+
* this.Middleware.addMiddleware(middleware);
|
|
48
|
+
* }
|
|
49
|
+
* }
|
|
50
|
+
* }
|
|
51
|
+
*
|
|
52
|
+
* // Now:
|
|
53
|
+
* // - GET /api/admin/* → AdminModule auto-loads
|
|
54
|
+
* // - GET /api/reports/* → ReportsModule auto-loads
|
|
55
|
+
* // - No manual route mapping needed!
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @param container - The DI container
|
|
59
|
+
* @param options - Configuration options
|
|
60
|
+
* @returns Setup result with loader, manager, and middleware
|
|
61
|
+
*
|
|
62
|
+
* @public API
|
|
63
|
+
*/
|
|
64
|
+
export declare function setupLazyLoadingForExpress(container: Container, options?: LazyLoadingExpressOptions): LazyLoadingExpressResult;
|
|
65
|
+
/**
|
|
66
|
+
* Extended lazy loading options for Express.
|
|
67
|
+
*
|
|
68
|
+
* @public API
|
|
69
|
+
*/
|
|
70
|
+
export interface LazyLoadingExpressOptions extends LazyLoadingOptions {
|
|
71
|
+
/** Lazy modules to register */
|
|
72
|
+
lazyModules?: Array<ILazyModule>;
|
|
73
|
+
/**
|
|
74
|
+
* Manual route prefix mappings.
|
|
75
|
+
* Maps module names to route prefixes for auto-loading.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* routePrefixes: {
|
|
80
|
+
* "AdminModule": "/admin",
|
|
81
|
+
* "ReportsModule": "/reports"
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
routePrefixes?: Record<string, string>;
|
|
86
|
+
/**
|
|
87
|
+
* Global route prefix (e.g., "/api").
|
|
88
|
+
* Used when determining if a request matches a lazy module route.
|
|
89
|
+
*/
|
|
90
|
+
globalPrefix?: string;
|
|
91
|
+
/**
|
|
92
|
+
* Enable automatic module loading when routes are accessed.
|
|
93
|
+
* When enabled, accessing a lazy module's route will trigger loading.
|
|
94
|
+
* @default true
|
|
95
|
+
*/
|
|
96
|
+
enableAutoLoad?: boolean;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Extended result of lazy loading setup for Express.
|
|
100
|
+
*
|
|
101
|
+
* @public API
|
|
102
|
+
*/
|
|
103
|
+
export interface LazyLoadingExpressResult extends LazyLoadingSetupResult {
|
|
104
|
+
/**
|
|
105
|
+
* Middleware for auto-loading lazy modules.
|
|
106
|
+
* Add this to your Express app to enable auto-loading.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const { middleware } = setupLazyLoadingForExpress(container, options);
|
|
111
|
+
* if (middleware) {
|
|
112
|
+
* this.Middleware.addMiddleware(middleware);
|
|
113
|
+
* }
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
middleware?: RequestHandler;
|
|
117
|
+
/**
|
|
118
|
+
* Route mappings used by the middleware.
|
|
119
|
+
*/
|
|
120
|
+
routeMappings: Array<LazyRouteMapping>;
|
|
121
|
+
}
|
|
122
|
+
export type { LazyLoadingOptions, LazyLoadingSetupResult } from "@expressots/core";
|
|
123
|
+
export type { LazyRouteMapping } from "./lazy-module-middleware.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { interfaces } from "
|
|
2
|
-
import type { BaseController, ControllerMetadata, ControllerMethodMetadata, ControllerParameterMetadata, DecoratorTarget, IHttpActionResult } from "./interfaces";
|
|
1
|
+
import { interfaces } from "@expressots/core";
|
|
2
|
+
import type { BaseController, ControllerMetadata, ControllerMethodMetadata, ControllerParameterMetadata, DecoratorTarget, IHttpActionResult } from "./interfaces.js";
|
|
3
3
|
export declare function getControllersFromContainer(container: interfaces.Container, forceControllers: boolean): Array<BaseController>;
|
|
4
4
|
export declare function getControllersFromMetadata(): Array<DecoratorTarget>;
|
|
5
5
|
export declare function getControllerMetadata(constructor: NewableFunction): ControllerMetadata;
|
|
@@ -7,3 +7,18 @@ export declare function getControllerMethodMetadata(constructor: NewableFunction
|
|
|
7
7
|
export declare function getControllerParameterMetadata(constructor: NewableFunction): ControllerParameterMetadata;
|
|
8
8
|
export declare function cleanUpMetadata(): void;
|
|
9
9
|
export declare function instanceOfIHttpActionResult(value: unknown): value is IHttpActionResult;
|
|
10
|
+
/**
|
|
11
|
+
* Gets content negotiation metadata from a controller method.
|
|
12
|
+
* @param target - Controller instance
|
|
13
|
+
* @param propertyKey - Method name
|
|
14
|
+
* @returns Content negotiation metadata
|
|
15
|
+
*/
|
|
16
|
+
export declare function getContentNegotiationMetadata(target: object, propertyKey: string | symbol): {
|
|
17
|
+
accept?: Array<string>;
|
|
18
|
+
consumes?: Array<string>;
|
|
19
|
+
produces?: Array<string>;
|
|
20
|
+
csvOptions?: import("@expressots/core").CsvFormatOptions;
|
|
21
|
+
xmlOptions?: import("@expressots/core").XmlFormatOptions;
|
|
22
|
+
yamlOptions?: import("@expressots/core").YamlFormatOptions;
|
|
23
|
+
streamResponse?: boolean;
|
|
24
|
+
};
|