@spinajs/http 2.0.485 → 2.0.487
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 +370 -5
- package/lib/cjs/base-controller.d.ts +35 -0
- package/lib/cjs/base-controller.d.ts.map +1 -0
- package/lib/cjs/base-controller.js +100 -0
- package/lib/cjs/base-controller.js.map +1 -0
- package/lib/cjs/cache.d.ts +25 -3
- package/lib/cjs/cache.d.ts.map +1 -1
- package/lib/cjs/cache.js +26 -9
- package/lib/cjs/cache.js.map +1 -1
- package/lib/cjs/cli/GenerateControllerCache.d.ts +13 -4
- package/lib/cjs/cli/GenerateControllerCache.d.ts.map +1 -1
- package/lib/cjs/cli/GenerateControllerCache.js +37 -10
- package/lib/cjs/cli/GenerateControllerCache.js.map +1 -1
- package/lib/cjs/controller-sources.d.ts +36 -0
- package/lib/cjs/controller-sources.d.ts.map +1 -0
- package/lib/cjs/controller-sources.js +73 -0
- package/lib/cjs/controller-sources.js.map +1 -0
- package/lib/cjs/controllers.d.ts +19 -36
- package/lib/cjs/controllers.d.ts.map +1 -1
- package/lib/cjs/controllers.js +98 -302
- package/lib/cjs/controllers.js.map +1 -1
- package/lib/cjs/exceptions.d.ts +12 -0
- package/lib/cjs/exceptions.d.ts.map +1 -1
- package/lib/cjs/exceptions.js +15 -1
- package/lib/cjs/exceptions.js.map +1 -1
- package/lib/cjs/index.d.ts +4 -0
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +4 -0
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/middlewares/RequestId.d.ts.map +1 -1
- package/lib/cjs/middlewares/RequestId.js +4 -0
- package/lib/cjs/middlewares/RequestId.js.map +1 -1
- package/lib/cjs/route-builder.d.ts +61 -0
- package/lib/cjs/route-builder.d.ts.map +1 -0
- package/lib/cjs/route-builder.js +228 -0
- package/lib/cjs/route-builder.js.map +1 -0
- package/lib/mjs/base-controller.d.ts +35 -0
- package/lib/mjs/base-controller.d.ts.map +1 -0
- package/lib/mjs/base-controller.js +93 -0
- package/lib/mjs/base-controller.js.map +1 -0
- package/lib/mjs/cache.d.ts +25 -3
- package/lib/mjs/cache.d.ts.map +1 -1
- package/lib/mjs/cache.js +25 -10
- package/lib/mjs/cache.js.map +1 -1
- package/lib/mjs/cli/GenerateControllerCache.d.ts +13 -4
- package/lib/mjs/cli/GenerateControllerCache.d.ts.map +1 -1
- package/lib/mjs/cli/GenerateControllerCache.js +39 -12
- package/lib/mjs/cli/GenerateControllerCache.js.map +1 -1
- package/lib/mjs/controller-sources.d.ts +36 -0
- package/lib/mjs/controller-sources.d.ts.map +1 -0
- package/lib/mjs/controller-sources.js +69 -0
- package/lib/mjs/controller-sources.js.map +1 -0
- package/lib/mjs/controllers.d.ts +19 -36
- package/lib/mjs/controllers.d.ts.map +1 -1
- package/lib/mjs/controllers.js +95 -298
- package/lib/mjs/controllers.js.map +1 -1
- package/lib/mjs/exceptions.d.ts +12 -0
- package/lib/mjs/exceptions.d.ts.map +1 -1
- package/lib/mjs/exceptions.js +12 -0
- package/lib/mjs/exceptions.js.map +1 -1
- package/lib/mjs/index.d.ts +4 -0
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +4 -0
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/middlewares/RequestId.d.ts.map +1 -1
- package/lib/mjs/middlewares/RequestId.js +4 -0
- package/lib/mjs/middlewares/RequestId.js.map +1 -1
- package/lib/mjs/route-builder.d.ts +61 -0
- package/lib/mjs/route-builder.d.ts.map +1 -0
- package/lib/mjs/route-builder.js +216 -0
- package/lib/mjs/route-builder.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +12 -12
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import Express from 'express';
|
|
3
|
+
import { IContainer } from '@spinajs/di';
|
|
4
|
+
import { Log } from '@spinajs/log';
|
|
5
|
+
import { Configuration } from '@spinajs/configuration';
|
|
6
|
+
import { Request as sRequest, IController, IControllerDescriptor, RouteMiddleware, IRoute, BasePolicy, IActionLocalStoregeContext } from './interfaces.js';
|
|
7
|
+
/**
|
|
8
|
+
* Controller shape needed by the route wiring helpers: the IController
|
|
9
|
+
* surface plus indexed access to action methods. Structural on purpose —
|
|
10
|
+
* avoids importing BaseController and creating a module cycle.
|
|
11
|
+
*/
|
|
12
|
+
export type ControllerActionHost = IController & {
|
|
13
|
+
[action: string]: any;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Computes the final express path for a route: `/BasePath/Path`, falling back
|
|
17
|
+
* to the method name when the route has no explicit path, with optional
|
|
18
|
+
* global route prefix (`http.controllers.route.prefix`).
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildRoutePath(basePath: string, route: IRoute, globalPrefix?: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Resolves controller-wise + route-wise middleware descriptors into instances.
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveRouteMiddlewares(descriptor: IControllerDescriptor, route: IRoute, container: IContainer): Promise<RouteMiddleware[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Resolves controller-wise + route-wise policy descriptors into instances.
|
|
27
|
+
*
|
|
28
|
+
* String policy descriptors are configuration keys pointing at a policy type
|
|
29
|
+
* name. A key that does not resolve to a registered BasePolicy type throws
|
|
30
|
+
* {@link RouteRegistrationException} — a silently dropped policy would leave
|
|
31
|
+
* the route unprotected.
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveRoutePolicies(descriptor: IControllerDescriptor, route: IRoute, container: IContainer, cfg: Configuration, log: Log, controllerName: string, path: string): Promise<BasePolicy[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Express handler gating a route behind its policies.
|
|
36
|
+
*
|
|
37
|
+
* Executes all policies enabled for the route; if at least ONE policy resolves
|
|
38
|
+
* without error the route is allowed to execute. This allows multiple access
|
|
39
|
+
* paths to a resource, e.g. token access & session.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createPolicyGate(policies: BasePolicy[], route: IRoute, controller: IController, log: Log): Express.RequestHandler;
|
|
42
|
+
/**
|
|
43
|
+
* Wraps a middleware onBefore/onAfter action into an express handler that
|
|
44
|
+
* forwards both resolution and rejection to `next`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function wrapMiddlewareAction(source: object, action: (req: Express.Request, res: Express.Response, route: IRoute, controller: IController) => Promise<void>, route: IRoute, controller: IController): Express.RequestHandler;
|
|
47
|
+
/**
|
|
48
|
+
* Express handler invoking the controller action: extracts route arguments,
|
|
49
|
+
* runs the action inside the request-scoped AsyncLocalStorage context, lets
|
|
50
|
+
* middlewares inspect the produced Response and stores it in
|
|
51
|
+
* `res.locals.response` for the response pipeline. All sync and async errors
|
|
52
|
+
* are forwarded to `next`.
|
|
53
|
+
*/
|
|
54
|
+
export declare function createActionHandler(controller: ControllerActionHost, route: IRoute, enabledMiddlewares: RouteMiddleware[], storage: AsyncLocalStorage<IActionLocalStoregeContext>): Express.RequestHandler;
|
|
55
|
+
/**
|
|
56
|
+
* Extracts route argument values for an action call. Route-arg handlers are
|
|
57
|
+
* resolved from DI by parameter type and executed in Priority order
|
|
58
|
+
* (higher first).
|
|
59
|
+
*/
|
|
60
|
+
export declare function extractRouteArgs(route: IRoute, req: sRequest, res: Express.Response, controllerName: string): Promise<any[]>;
|
|
61
|
+
//# sourceMappingURL=route-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-builder.d.ts","sourceRoot":"","sources":["../../src/route-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,OAAO,MAAM,SAAS,CAAC;AAI9B,OAAO,EAAM,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAY,WAAW,EAAE,qBAAqB,EAAqB,eAAe,EAAE,MAAM,EAAyB,UAAU,EAAiB,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAG9N;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAAE,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAmB7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAM3I;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,qBAAqB,EACjC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,UAAU,EACrB,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,EAAE,CAAC,CAkBvB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,cAAc,CAiDjI;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,EAC9G,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,WAAW,GACtB,OAAO,CAAC,cAAc,CAgBxB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,oBAAoB,EAChC,KAAK,EAAE,MAAM,EACb,kBAAkB,EAAE,eAAe,EAAE,EACrC,OAAO,EAAE,iBAAiB,CAAC,0BAA0B,CAAC,GACrD,OAAO,CAAC,cAAc,CA2CxB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAkClI"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { isPromise, tryGetHash } from '@spinajs/util';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import { DI } from '@spinajs/di';
|
|
4
|
+
import { UnexpectedServerError } from '@spinajs/exceptions';
|
|
5
|
+
import { Response, BasePolicy } from './interfaces.js';
|
|
6
|
+
import { RouteRegistrationException } from './exceptions.js';
|
|
7
|
+
/**
|
|
8
|
+
* Computes the final express path for a route: `/BasePath/Path`, falling back
|
|
9
|
+
* to the method name when the route has no explicit path, with optional
|
|
10
|
+
* global route prefix (`http.controllers.route.prefix`).
|
|
11
|
+
*/
|
|
12
|
+
export function buildRoutePath(basePath, route, globalPrefix) {
|
|
13
|
+
let path = '';
|
|
14
|
+
if (route.Path) {
|
|
15
|
+
if (route.Path === '/') {
|
|
16
|
+
path = `/${basePath}`;
|
|
17
|
+
}
|
|
18
|
+
else if (basePath === '/') {
|
|
19
|
+
path = `/${route.Path}`;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
path = `/${basePath}/${route.Path}`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
path = `/${basePath}/${String(route.Method)}`;
|
|
27
|
+
}
|
|
28
|
+
if (globalPrefix) {
|
|
29
|
+
path = `/${globalPrefix}${path}`;
|
|
30
|
+
}
|
|
31
|
+
return path;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolves controller-wise + route-wise middleware descriptors into instances.
|
|
35
|
+
*/
|
|
36
|
+
export function resolveRouteMiddlewares(descriptor, route, container) {
|
|
37
|
+
return Promise.all(descriptor.Middlewares.concat(route.Middlewares || []).map((m) => {
|
|
38
|
+
return container.resolve(m.Type, m.Options);
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Resolves controller-wise + route-wise policy descriptors into instances.
|
|
43
|
+
*
|
|
44
|
+
* String policy descriptors are configuration keys pointing at a policy type
|
|
45
|
+
* name. A key that does not resolve to a registered BasePolicy type throws
|
|
46
|
+
* {@link RouteRegistrationException} — a silently dropped policy would leave
|
|
47
|
+
* the route unprotected.
|
|
48
|
+
*/
|
|
49
|
+
export function resolveRoutePolicies(descriptor, route, container, cfg, log, controllerName, path) {
|
|
50
|
+
return Promise.all(descriptor.Policies.concat(route.Policies || []).map((m) => {
|
|
51
|
+
if (_.isString(m.Type)) {
|
|
52
|
+
const policyType = cfg.get(m.Type);
|
|
53
|
+
if (!policyType || !DI.checkType(BasePolicy, policyType)) {
|
|
54
|
+
throw new RouteRegistrationException(`No policy named ${policyType ?? '<undefined>'} is registered for route ${controllerName}::${String(route.Method)} at path ${path} ( check your configuration at ${m.Type} )`);
|
|
55
|
+
}
|
|
56
|
+
log.trace(`Policy ${policyType} is used in controller ${controllerName}::${String(route.Method)} at path ${path}`);
|
|
57
|
+
return container.resolve(policyType, m.Options);
|
|
58
|
+
}
|
|
59
|
+
log.trace(`Policy ${m.Type.name} is used in controller ${controllerName}::${String(route.Method)} at path ${path}`);
|
|
60
|
+
return container.resolve(m.Type, m.Options);
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Express handler gating a route behind its policies.
|
|
65
|
+
*
|
|
66
|
+
* Executes all policies enabled for the route; if at least ONE policy resolves
|
|
67
|
+
* without error the route is allowed to execute. This allows multiple access
|
|
68
|
+
* paths to a resource, e.g. token access & session.
|
|
69
|
+
*/
|
|
70
|
+
export function createPolicyGate(policies, route, controller, log) {
|
|
71
|
+
const routeName = `${controller.constructor.name}:${String(route.Method)} ${controller.BasePath}/${String(route.Path || route.Method)}`;
|
|
72
|
+
return (req, _res, next) => {
|
|
73
|
+
// Only policies enabled for this concrete route participate in the gate.
|
|
74
|
+
// A route whose policies are ALL disabled has no active authorization
|
|
75
|
+
// check, so it is allowed through — same semantics as having no policies
|
|
76
|
+
// at all. Computing this up front is what prevents the request from
|
|
77
|
+
// hanging: `Promise.allSettled([])` resolves to `[]`, which matches
|
|
78
|
+
// neither the fulfilled nor the rejected branch below, so `next` would
|
|
79
|
+
// never be called.
|
|
80
|
+
const enabledPolicies = policies.filter((p) => p.isEnabled(route, controller));
|
|
81
|
+
if (enabledPolicies.length === 0) {
|
|
82
|
+
next();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
Promise.allSettled(enabledPolicies.map((p) => {
|
|
86
|
+
return p
|
|
87
|
+
.execute(req, route, controller)
|
|
88
|
+
.then(() => {
|
|
89
|
+
log.trace(`Policy succeded for route ${routeName}, policy: ${p.constructor.name}`);
|
|
90
|
+
})
|
|
91
|
+
.catch((err) => {
|
|
92
|
+
log.trace(`Policy failed for route ${routeName} error ${err}, policy: ${p.constructor.name}`);
|
|
93
|
+
throw err;
|
|
94
|
+
});
|
|
95
|
+
}))
|
|
96
|
+
.then((results) => {
|
|
97
|
+
const fullfilled = results.find((r) => r.status === 'fulfilled');
|
|
98
|
+
if (fullfilled) {
|
|
99
|
+
log.trace(`Policy for route ${routeName} succeded, continue execution`);
|
|
100
|
+
next();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Every policy rejected — forward the first failure to the express
|
|
104
|
+
// error handler. Use next(err) directly (not `throw next(...)`,
|
|
105
|
+
// which would reject this .then() with `undefined` as an unhandled
|
|
106
|
+
// rejection while the error was already forwarded).
|
|
107
|
+
const failed = results.find((r) => r.status === 'rejected');
|
|
108
|
+
next(failed ? failed.reason : new UnexpectedServerError('Policy evaluation produced no result'));
|
|
109
|
+
})
|
|
110
|
+
// Guard against unexpected throws in the settle/handler chain so the
|
|
111
|
+
// request can never stall without a response.
|
|
112
|
+
.catch((err) => next(err));
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Wraps a middleware onBefore/onAfter action into an express handler that
|
|
117
|
+
* forwards both resolution and rejection to `next`.
|
|
118
|
+
*/
|
|
119
|
+
export function wrapMiddlewareAction(source, action, route, controller) {
|
|
120
|
+
const wrapper = (req, res, next) => {
|
|
121
|
+
action(req, res, route, controller)
|
|
122
|
+
.then(() => {
|
|
123
|
+
next();
|
|
124
|
+
})
|
|
125
|
+
.catch((err) => {
|
|
126
|
+
next(err);
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
Object.defineProperty(wrapper, 'name', {
|
|
130
|
+
value: source.constructor.name,
|
|
131
|
+
writable: true,
|
|
132
|
+
});
|
|
133
|
+
return wrapper;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Express handler invoking the controller action: extracts route arguments,
|
|
137
|
+
* runs the action inside the request-scoped AsyncLocalStorage context, lets
|
|
138
|
+
* middlewares inspect the produced Response and stores it in
|
|
139
|
+
* `res.locals.response` for the response pipeline. All sync and async errors
|
|
140
|
+
* are forwarded to `next`.
|
|
141
|
+
*/
|
|
142
|
+
export function createActionHandler(controller, route, enabledMiddlewares, storage) {
|
|
143
|
+
const actionHandler = async (req, res, next) => {
|
|
144
|
+
try {
|
|
145
|
+
await storage.run(req.storage, async () => {
|
|
146
|
+
const args = (await extractRouteArgs(route, req, res, controller.constructor.name)).concat([req, res, next]);
|
|
147
|
+
try {
|
|
148
|
+
const result = controller[route.Method].call(controller, ...args);
|
|
149
|
+
if (isPromise(result)) {
|
|
150
|
+
result
|
|
151
|
+
.then((r) => {
|
|
152
|
+
if (r instanceof Response) {
|
|
153
|
+
enabledMiddlewares.forEach((x) => x.onResponse(r, route, controller));
|
|
154
|
+
}
|
|
155
|
+
res.locals.response = r;
|
|
156
|
+
next();
|
|
157
|
+
})
|
|
158
|
+
.catch((err) => {
|
|
159
|
+
next(err);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
if (result instanceof Response) {
|
|
164
|
+
enabledMiddlewares.forEach((x) => x.onResponse(result, route, controller));
|
|
165
|
+
}
|
|
166
|
+
res.locals.response = result;
|
|
167
|
+
next();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
next(err);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
next(err);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
Object.defineProperty(actionHandler, 'name', {
|
|
180
|
+
value: controller.constructor.name,
|
|
181
|
+
writable: true,
|
|
182
|
+
});
|
|
183
|
+
return actionHandler;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Extracts route argument values for an action call. Route-arg handlers are
|
|
187
|
+
* resolved from DI by parameter type and executed in Priority order
|
|
188
|
+
* (higher first).
|
|
189
|
+
*/
|
|
190
|
+
export async function extractRouteArgs(route, req, res, controllerName) {
|
|
191
|
+
const callArgs = new Array(route.Parameters.size);
|
|
192
|
+
const argsCache = new Map();
|
|
193
|
+
let callData = {
|
|
194
|
+
Payload: {},
|
|
195
|
+
};
|
|
196
|
+
// Sort parameters by priority (higher priority first)
|
|
197
|
+
// Get all parameters as array, resolve their handlers to check priority, then sort
|
|
198
|
+
const paramsWithPriority = await Promise.all(Array.from(route.Parameters.values()).map(async (param) => {
|
|
199
|
+
const handler = await tryGetHash(argsCache, param.Type, () => DI.resolve(param.Type));
|
|
200
|
+
return { param, handler, priority: handler?.Priority ?? 0 };
|
|
201
|
+
}));
|
|
202
|
+
// Sort by priority descending (higher priority first)
|
|
203
|
+
const sortedParams = paramsWithPriority.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
204
|
+
for (const { param, handler: routeArgsHandler } of sortedParams) {
|
|
205
|
+
if (!routeArgsHandler) {
|
|
206
|
+
throw new UnexpectedServerError(`Route parameter not registered for parameter: ${param.Name},
|
|
207
|
+
in method: ${String(route.Method)},
|
|
208
|
+
in controller: ${controllerName}. Check if you have registered it in DI container.`);
|
|
209
|
+
}
|
|
210
|
+
const { Args, CallData } = await routeArgsHandler.extract(callData, callArgs, param, req, res, route);
|
|
211
|
+
callData = CallData;
|
|
212
|
+
callArgs[param.Index] = Args;
|
|
213
|
+
}
|
|
214
|
+
return callArgs;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=route-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-builder.js","sourceRoot":"","sources":["../../src/route-builder.ts"],"names":[],"mappings":"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"}
|