@quilla-be-kit/http 0.7.0 → 0.8.0
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 +115 -17
- package/dist/.tsbuildinfo +1 -1
- package/dist/decorator/authorize-scope.decorator.js +2 -2
- package/dist/decorator/authorize-scope.decorator.js.map +1 -1
- package/dist/decorator/controller.decorator.d.ts +1 -0
- package/dist/decorator/controller.decorator.d.ts.map +1 -1
- package/dist/decorator/controller.decorator.js +2 -1
- package/dist/decorator/controller.decorator.js.map +1 -1
- package/dist/decorator/method.decorators.d.ts +1 -0
- package/dist/decorator/method.decorators.d.ts.map +1 -1
- package/dist/decorator/method.decorators.js +1 -0
- package/dist/decorator/method.decorators.js.map +1 -1
- package/dist/decorator/route.metadata.d.ts +10 -1
- package/dist/decorator/route.metadata.d.ts.map +1 -1
- package/dist/decorator/route.metadata.js +68 -31
- package/dist/decorator/route.metadata.js.map +1 -1
- package/dist/decorator/validate-request.decorator.js +2 -2
- package/dist/decorator/validate-request.decorator.js.map +1 -1
- package/dist/request/http-attributes.d.ts +6 -0
- package/dist/request/http-attributes.d.ts.map +1 -1
- package/dist/request/http-attributes.js +6 -0
- package/dist/request/http-attributes.js.map +1 -1
- package/dist/router/auth-middleware-stack.type.d.ts +21 -5
- package/dist/router/auth-middleware-stack.type.d.ts.map +1 -1
- package/dist/router/http-module-meta.type.d.ts +5 -0
- package/dist/router/http-module-meta.type.d.ts.map +1 -1
- package/dist/router/normalized-route.type.d.ts +6 -1
- package/dist/router/normalized-route.type.d.ts.map +1 -1
- package/dist/router/router-options.type.d.ts +28 -8
- package/dist/router/router-options.type.d.ts.map +1 -1
- package/dist/router/router.d.ts +2 -2
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +92 -16
- package/dist/router/router.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"method.decorators.d.ts","sourceRoot":"","sources":["../../src/decorator/method.decorators.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IAIzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"method.decorators.d.ts","sourceRoot":"","sources":["../../src/decorator/method.decorators.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IAIzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAM1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAoBF,eAAO,MAAM,GAAG,SAjBA,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAgBf,CAAC;AACvD,eAAO,MAAM,IAAI,SAlBD,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAiBb,CAAC;AACzD,eAAO,MAAM,GAAG,SAnBA,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAkBf,CAAC;AACvD,eAAO,MAAM,KAAK,SApBF,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAmBX,CAAC;AAC3D,eAAO,MAAM,MAAM,SArBH,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAoBT,CAAC;AAE7D,eAAO,MAAM,SAAS,SAvBN,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAsBV,CAAC;AAC5D,eAAO,MAAM,UAAU,SAxBP,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAuBR,CAAC;AAC9D,eAAO,MAAM,SAAS,SAzBN,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAwBV,CAAC;AAC5D,eAAO,MAAM,WAAW,SA1BR,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAyBN,CAAC;AAChE,eAAO,MAAM,YAAY,SA3BT,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IA0BJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"method.decorators.js","sourceRoot":"","sources":["../../src/decorator/method.decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"method.decorators.js","sourceRoot":"","sources":["../../src/decorator/method.decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAehE,SAAS,qBAAqB,CAAC,UAAsB,EAAE,QAAiB;IACtE,OAAO,CAAC,IAAY,EAAE,OAAsB,EAAE,EAAE;QAC9C,OAAO,CAAC,OAAgB,EAAE,OAAoC,EAAQ,EAAE;YACtE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,IAAI,UAAU,iCAAiC,CAAC,CAAC;YACnE,CAAC;YACD,QAAQ,CAAC,OAAO,CAAC,QAA4C,EAAE;gBAC7D,iBAAiB,EAAE,OAAO,CAAC,IAAc;gBACzC,UAAU;gBACV,IAAI;gBACJ,MAAM,EAAE,QAAQ;gBAChB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,GAAG,CAAC,OAAO,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9E,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAE7D,MAAM,CAAC,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,WAAW,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC"}
|
|
@@ -6,6 +6,7 @@ export type RouteDefinition = {
|
|
|
6
6
|
readonly path: string;
|
|
7
7
|
readonly public: boolean;
|
|
8
8
|
readonly version?: string;
|
|
9
|
+
readonly authStack?: string;
|
|
9
10
|
readonly scopes?: readonly string[];
|
|
10
11
|
readonly scopeMode?: 'any' | 'all';
|
|
11
12
|
readonly validation?: {
|
|
@@ -13,13 +14,21 @@ export type RouteDefinition = {
|
|
|
13
14
|
readonly sources: readonly RequestSource[];
|
|
14
15
|
};
|
|
15
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* Fields a patch decorator (`@AuthorizeScope`, `@ValidateRequest`) may set.
|
|
19
|
+
* Narrowed deliberately: path, method, `public`, and `authStack` are decided by
|
|
20
|
+
* the method decorator and must not be rewritable from a patch.
|
|
21
|
+
*/
|
|
22
|
+
export type RoutePatch = Pick<RouteDefinition, 'scopes' | 'scopeMode' | 'validation'>;
|
|
16
23
|
type MetadataBag = Record<string | symbol, unknown>;
|
|
17
24
|
export declare function setControllerPrefix(metadata: MetadataBag, prefix: string): void;
|
|
18
25
|
export declare function getControllerPrefix(controllerInstance: object): string;
|
|
19
26
|
export declare function setControllerVersion(metadata: MetadataBag, version: string | undefined): void;
|
|
20
27
|
export declare function getControllerVersion(controllerInstance: object): string | undefined;
|
|
28
|
+
export declare function setControllerAuthStack(metadata: MetadataBag, authStack: string | undefined): void;
|
|
29
|
+
export declare function getControllerAuthStack(controllerInstance: object): string | undefined;
|
|
21
30
|
export declare function addRoute(metadata: MetadataBag, route: RouteDefinition): void;
|
|
22
|
-
export declare function
|
|
31
|
+
export declare function addRoutePatch(metadata: MetadataBag, methodName: string, patch: RoutePatch): void;
|
|
23
32
|
export declare function getControllerRoutes(controllerInstance: object): readonly RouteDefinition[];
|
|
24
33
|
export {};
|
|
25
34
|
//# sourceMappingURL=route.metadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.metadata.d.ts","sourceRoot":"","sources":["../../src/decorator/route.metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAazE,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;KAC5C,CAAC;CACH,CAAC;
|
|
1
|
+
{"version":3,"file":"route.metadata.d.ts","sourceRoot":"","sources":["../../src/decorator/route.metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAazE,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;KAC5C,CAAC;CACH,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC;AAQtF,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/E;AAkBD,wBAAgB,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAG7F;AAID,wBAAgB,oBAAoB,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAGjG;AAGD,wBAAgB,sBAAsB,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAErF;AAMD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAM5E;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAMhG;AAED,wBAAgB,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,eAAe,EAAE,CAuB1F"}
|
|
@@ -10,20 +10,30 @@ if (Symbol.metadata === undefined) {
|
|
|
10
10
|
}
|
|
11
11
|
const CONTROLLER_PREFIX_KEY = Symbol.for('quilla-be-kit.http.controller-prefix');
|
|
12
12
|
const CONTROLLER_VERSION_KEY = Symbol.for('quilla-be-kit.http.controller-version');
|
|
13
|
+
const CONTROLLER_AUTH_STACK_KEY = Symbol.for('quilla-be-kit.http.controller-auth-stack');
|
|
13
14
|
const ROUTES_KEY = Symbol.for('quilla-be-kit.http.routes');
|
|
15
|
+
const ROUTE_PATCHES_KEY = Symbol.for('quilla-be-kit.http.route-patches');
|
|
14
16
|
export function setControllerPrefix(metadata, prefix) {
|
|
15
17
|
metadata[CONTROLLER_PREFIX_KEY] = prefix;
|
|
16
18
|
}
|
|
19
|
+
// Class-level settings OVERRIDE down the hierarchy: the nearest declaration
|
|
20
|
+
// wins. Read WITHOUT `Object.hasOwn`, unlike the route bag below — a subclass's
|
|
21
|
+
// metadata is prototype-linked to its parent's, so an undecorated subclass
|
|
22
|
+
// resolves the parent's value on the first walk step, which is exactly the
|
|
23
|
+
// child-wins-else-inherit precedence we want. Routes need the opposite
|
|
24
|
+
// (own-property) semantics because they ACCUMULATE rather than override.
|
|
25
|
+
function readInherited(controllerInstance, key) {
|
|
26
|
+
for (const metadata of walkMetadata(controllerInstance)) {
|
|
27
|
+
if (typeof metadata[key] === 'string')
|
|
28
|
+
return metadata[key];
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
17
32
|
// Returns `''` (not `undefined`) when unset: prefixes from every level are
|
|
18
33
|
// concatenated, so an absent level just contributes nothing — unlike version
|
|
19
34
|
// (see getControllerVersion), where one level wins by precedence.
|
|
20
35
|
export function getControllerPrefix(controllerInstance) {
|
|
21
|
-
|
|
22
|
-
if (typeof metadata[CONTROLLER_PREFIX_KEY] === 'string') {
|
|
23
|
-
return metadata[CONTROLLER_PREFIX_KEY];
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return '';
|
|
36
|
+
return readInherited(controllerInstance, CONTROLLER_PREFIX_KEY) ?? '';
|
|
27
37
|
}
|
|
28
38
|
export function setControllerVersion(metadata, version) {
|
|
29
39
|
if (version === undefined)
|
|
@@ -33,46 +43,73 @@ export function setControllerVersion(metadata, version) {
|
|
|
33
43
|
// Returns `undefined` (not `''`) when unset so the router's nullish-coalescing
|
|
34
44
|
// precedence chain (route ?? controller ?? module) falls through correctly.
|
|
35
45
|
export function getControllerVersion(controllerInstance) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
46
|
+
return readInherited(controllerInstance, CONTROLLER_VERSION_KEY);
|
|
47
|
+
}
|
|
48
|
+
export function setControllerAuthStack(metadata, authStack) {
|
|
49
|
+
if (authStack === undefined)
|
|
50
|
+
return;
|
|
51
|
+
metadata[CONTROLLER_AUTH_STACK_KEY] = authStack;
|
|
42
52
|
}
|
|
53
|
+
// Same precedence semantics as getControllerVersion.
|
|
54
|
+
export function getControllerAuthStack(controllerInstance) {
|
|
55
|
+
return readInherited(controllerInstance, CONTROLLER_AUTH_STACK_KEY);
|
|
56
|
+
}
|
|
57
|
+
// `Object.hasOwn`, not `??`: a subclass's metadata bag is prototype-linked to
|
|
58
|
+
// its parent's, so a bare read would resolve the parent's array and push the
|
|
59
|
+
// subclass's routes into it — leaking child routes onto the parent and making
|
|
60
|
+
// every inherited route collect twice.
|
|
43
61
|
export function addRoute(metadata, route) {
|
|
44
|
-
const existing = metadata
|
|
62
|
+
const existing = Object.hasOwn(metadata, ROUTES_KEY)
|
|
63
|
+
? metadata[ROUTES_KEY]
|
|
64
|
+
: [];
|
|
45
65
|
existing.push(route);
|
|
46
66
|
metadata[ROUTES_KEY] = existing;
|
|
47
67
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
68
|
+
// Patches are accumulated per class and merged at read time so decorator order
|
|
69
|
+
// relative to the method decorator does not matter.
|
|
70
|
+
export function addRoutePatch(metadata, methodName, patch) {
|
|
71
|
+
const bucket = Object.hasOwn(metadata, ROUTE_PATCHES_KEY)
|
|
72
|
+
? metadata[ROUTE_PATCHES_KEY]
|
|
73
|
+
: new Map();
|
|
74
|
+
bucket.set(methodName, { ...bucket.get(methodName), ...patch });
|
|
75
|
+
metadata[ROUTE_PATCHES_KEY] = bucket;
|
|
59
76
|
}
|
|
60
77
|
export function getControllerRoutes(controllerInstance) {
|
|
61
78
|
const collected = [];
|
|
79
|
+
const patches = new Map();
|
|
62
80
|
for (const metadata of walkMetadata(controllerInstance)) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
81
|
+
if (Object.hasOwn(metadata, ROUTES_KEY)) {
|
|
82
|
+
collected.unshift(...metadata[ROUTES_KEY]);
|
|
83
|
+
}
|
|
84
|
+
if (Object.hasOwn(metadata, ROUTE_PATCHES_KEY)) {
|
|
85
|
+
for (const [name, patch] of metadata[ROUTE_PATCHES_KEY]) {
|
|
86
|
+
// walkMetadata yields child-first, so anything already collected came
|
|
87
|
+
// from the subclass and must win field-by-field over this parent's.
|
|
88
|
+
const fromSubclass = patches.get(name);
|
|
89
|
+
patches.set(name, { ...patch, ...fromSubclass });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
66
92
|
}
|
|
67
|
-
|
|
93
|
+
if (patches.size === 0)
|
|
94
|
+
return collected;
|
|
95
|
+
return collected.map((def) => {
|
|
96
|
+
const patch = patches.get(def.handlerMethodName);
|
|
97
|
+
return patch ? { ...def, ...patch } : def;
|
|
98
|
+
});
|
|
68
99
|
}
|
|
100
|
+
// Yields each class's OWN metadata bag, nearest class first.
|
|
101
|
+
//
|
|
102
|
+
// `Symbol.metadata` is inherited down the static constructor chain, so a class
|
|
103
|
+
// with no decorators of its own exposes its parent's bag. Reading the own
|
|
104
|
+
// property descriptor skips those classes entirely, which makes yielding the
|
|
105
|
+
// same bag twice impossible by construction rather than by bookkeeping.
|
|
69
106
|
function* walkMetadata(instance) {
|
|
70
107
|
// biome-ignore lint/suspicious/noExplicitAny: prototype reflection is inherently untyped
|
|
71
108
|
let ctor = instance.constructor;
|
|
72
109
|
while (ctor && ctor !== Object) {
|
|
73
|
-
const
|
|
74
|
-
if (
|
|
75
|
-
yield
|
|
110
|
+
const own = Object.getOwnPropertyDescriptor(ctor, Symbol.metadata);
|
|
111
|
+
if (own?.value)
|
|
112
|
+
yield own.value;
|
|
76
113
|
const proto = ctor.prototype;
|
|
77
114
|
ctor = proto ? Object.getPrototypeOf(proto)?.constructor : null;
|
|
78
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.metadata.js","sourceRoot":"","sources":["../../src/decorator/route.metadata.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,8EAA8E;AAC9E,8CAA8C;AAC9C,IAAK,MAAgC,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;IAC7D,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE;QACxC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACpC,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;AACL,CAAC;
|
|
1
|
+
{"version":3,"file":"route.metadata.js","sourceRoot":"","sources":["../../src/decorator/route.metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ValidationError } from '@quilla-be-kit/errors';
|
|
2
2
|
import { HttpAttributes } from '../request/http-attributes.js';
|
|
3
|
-
import {
|
|
3
|
+
import { addRoutePatch } from './route.metadata.js';
|
|
4
4
|
const SOURCE_READERS = {
|
|
5
5
|
body: (req) => {
|
|
6
6
|
const body = req.getBody();
|
|
@@ -14,7 +14,7 @@ export function ValidateRequest(schema, sources) {
|
|
|
14
14
|
if (context.kind !== 'method') {
|
|
15
15
|
throw new Error('@ValidateRequest can only be applied to methods');
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
addRoutePatch(context.metadata, context.name, {
|
|
18
18
|
validation: { schema, sources },
|
|
19
19
|
});
|
|
20
20
|
return function (request) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-request.decorator.js","sourceRoot":"","sources":["../../src/decorator/validate-request.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAK/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"validate-request.decorator.js","sourceRoot":"","sources":["../../src/decorator/validate-request.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAK/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,MAAM,cAAc,GAAwD;IAC1E,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;QACZ,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE;IAChC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE;CAC/B,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,MAAe,EAAE,OAAiC;IAChF,OAAO,CACL,cAAgC,EAChC,OAAoC,EAClB,EAAE;QACpB,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,aAAa,CAAC,OAAO,CAAC,QAA4C,EAAE,OAAO,CAAC,IAAc,EAAE;YAC1F,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;SAChC,CAAC,CAAC;QAEH,OAAO,UAAyB,OAAoB;YAClD,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAmB,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAC3F,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACtD,CAAC;YAED,uEAAuE;YACvE,mEAAmE;YACnE,mEAAmE;YACnE,sEAAsE;YACtE,qEAAqE;YACrE,gBAAgB;YAChB,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,OAAO,CAAC;gBACtD,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;wBAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;oBACxE,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBAAE,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBACvE,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,eAAe,CAAC;oBACxB,OAAO,EAAE,2BAA2B;oBACpC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE;iBAClC,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAClE,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
export declare const HttpAttributes: {
|
|
2
2
|
readonly VERIFIED_TOKEN: "verifiedToken";
|
|
3
|
+
/**
|
|
4
|
+
* Name of the auth stack that authenticated the request. Set by Router before
|
|
5
|
+
* the stack runs, so guards can assert *which* stack authenticated the caller
|
|
6
|
+
* — `scopes` share one flat namespace across stacks and cannot carry that.
|
|
7
|
+
*/
|
|
8
|
+
readonly AUTH_STACK: "authStack";
|
|
3
9
|
readonly VALIDATED_INPUT: "__validated_input__";
|
|
4
10
|
readonly REQUEST_VALIDATOR: "__request_validator__";
|
|
5
11
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-attributes.d.ts","sourceRoot":"","sources":["../../src/request/http-attributes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;
|
|
1
|
+
{"version":3,"file":"http-attributes.d.ts","sourceRoot":"","sources":["../../src/request/http-attributes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;IAEzB;;;;OAIG;;;;CAIK,CAAC"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
export const HttpAttributes = {
|
|
2
2
|
VERIFIED_TOKEN: 'verifiedToken',
|
|
3
|
+
/**
|
|
4
|
+
* Name of the auth stack that authenticated the request. Set by Router before
|
|
5
|
+
* the stack runs, so guards can assert *which* stack authenticated the caller
|
|
6
|
+
* — `scopes` share one flat namespace across stacks and cannot carry that.
|
|
7
|
+
*/
|
|
8
|
+
AUTH_STACK: 'authStack',
|
|
3
9
|
VALIDATED_INPUT: '__validated_input__',
|
|
4
10
|
REQUEST_VALIDATOR: '__request_validator__',
|
|
5
11
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-attributes.js","sourceRoot":"","sources":["../../src/request/http-attributes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,eAAe;IAC/B,eAAe,EAAE,qBAAqB;IACtC,iBAAiB,EAAE,uBAAuB;CAClC,CAAC"}
|
|
1
|
+
{"version":3,"file":"http-attributes.js","sourceRoot":"","sources":["../../src/request/http-attributes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,eAAe;IAC/B;;;;OAIG;IACH,UAAU,EAAE,WAAW;IACvB,eAAe,EAAE,qBAAqB;IACtC,iBAAiB,EAAE,uBAAuB;CAClC,CAAC"}
|
|
@@ -1,13 +1,29 @@
|
|
|
1
1
|
import type { HttpMiddleware } from '../request/http-middleware.type.js';
|
|
2
2
|
/**
|
|
3
|
-
* Router runs phases in fixed order regardless
|
|
4
|
-
* `
|
|
5
|
-
* misordering is a type error, not a runtime bug.
|
|
3
|
+
* One named authentication stack. Router runs phases in fixed order regardless
|
|
4
|
+
* of key declaration — `credentialVerification` first, then `sessionLoad` if
|
|
5
|
+
* present. Phase misordering is a type error, not a runtime bug.
|
|
6
|
+
*
|
|
7
|
+
* The phase is named for the credential rather than the token because a stack
|
|
8
|
+
* may verify a JWT, an opaque token, an API key, or a client certificate. The
|
|
9
|
+
* attribute it populates keeps the `VERIFIED_TOKEN` name, which is the
|
|
10
|
+
* long-standing contract with `@quilla-be-kit/security`'s `Token`.
|
|
6
11
|
*/
|
|
7
12
|
export type AuthMiddlewareStack = {
|
|
8
13
|
/** Must populate `HttpAttributes.VERIFIED_TOKEN` on success. */
|
|
9
|
-
readonly
|
|
10
|
-
/**
|
|
14
|
+
readonly credentialVerification: HttpMiddleware;
|
|
15
|
+
/**
|
|
16
|
+
* Optional — omit for services that verify credentials but don't load
|
|
17
|
+
* sessions.
|
|
18
|
+
*
|
|
19
|
+
* When present it must populate `ExecutionContext.session` (`scopeId` +
|
|
20
|
+
* `userId`) and set `actorType`, via a nested `runWithContext`. Downstream
|
|
21
|
+
* toolkit surfaces treat session presence as the single source of truth for
|
|
22
|
+
* auth-derived identity: `@ValidateRequest` injects `scopeId`/`userId` into
|
|
23
|
+
* validated input only when `session` is set, so a stack that sets
|
|
24
|
+
* `actorType` but omits `session` fails open — the handler runs with an
|
|
25
|
+
* undefined scope instead of being rejected.
|
|
26
|
+
*/
|
|
11
27
|
readonly sessionLoad?: HttpMiddleware;
|
|
12
28
|
};
|
|
13
29
|
//# sourceMappingURL=auth-middleware-stack.type.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-middleware-stack.type.d.ts","sourceRoot":"","sources":["../../src/router/auth-middleware-stack.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE
|
|
1
|
+
{"version":3,"file":"auth-middleware-stack.type.d.ts","sourceRoot":"","sources":["../../src/router/auth-middleware-stack.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,gEAAgE;IAChE,QAAQ,CAAC,sBAAsB,EAAE,cAAc,CAAC;IAChD;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC;CACvC,CAAC"}
|
|
@@ -5,5 +5,10 @@ export type HttpModuleMeta = {
|
|
|
5
5
|
readonly middlewares?: readonly HttpMiddleware[];
|
|
6
6
|
readonly prefix?: string;
|
|
7
7
|
readonly version?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Module-level default auth stack, overridden by a controller- or route-level
|
|
10
|
+
* `authStack`. Must name a stack declared in `RouterOptions.authStacks`.
|
|
11
|
+
*/
|
|
12
|
+
readonly authStack?: string;
|
|
8
13
|
};
|
|
9
14
|
//# sourceMappingURL=http-module-meta.type.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-module-meta.type.d.ts","sourceRoot":"","sources":["../../src/router/http-module-meta.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,sBAAsB,CAAC,EAAE,CAAC;IACpE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"http-module-meta.type.d.ts","sourceRoot":"","sources":["../../src/router/http-module-meta.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,sBAAsB,CAAC,EAAE,CAAC;IACpE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC"}
|
|
@@ -6,9 +6,14 @@ export type NormalizedRoute = {
|
|
|
6
6
|
readonly httpMethod: HttpMethod;
|
|
7
7
|
readonly fullPath: string;
|
|
8
8
|
readonly public: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Resolved auth stack name. `undefined` on public routes, and on every route
|
|
11
|
+
* when no `authStacks` are configured.
|
|
12
|
+
*/
|
|
13
|
+
readonly authStack: string | undefined;
|
|
9
14
|
/**
|
|
10
15
|
* Complete ordered middleware chain for this route:
|
|
11
|
-
* `[system? → globalMiddlewares → (public ? [] :
|
|
16
|
+
* `[system? → globalMiddlewares → (public ? [] : resolved auth stack) → moduleMiddlewares → registrationMiddlewares]`.
|
|
12
17
|
* Adapters iterate and wrap each entry; they do not re-compose the chain.
|
|
13
18
|
*/
|
|
14
19
|
readonly middlewareChain: readonly HttpMiddleware[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalized-route.type.d.ts","sourceRoot":"","sources":["../../src/router/normalized-route.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAClE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"normalized-route.type.d.ts","sourceRoot":"","sources":["../../src/router/normalized-route.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAClE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC"}
|
|
@@ -15,23 +15,43 @@ export type RouterExecutionContextOptions = {
|
|
|
15
15
|
/** Header name to read the inbound correlation id from. Default: `x-correlation-id`. */
|
|
16
16
|
readonly correlationIdHeader?: string;
|
|
17
17
|
};
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* `S` is inferred from the keys of `authStacks`, which constrains
|
|
20
|
+
* `defaultAuthStack` to a declared name. Route-, controller-, and module-level
|
|
21
|
+
* `authStack` cannot be typed this way — decorators and module metadata are
|
|
22
|
+
* evaluated independently of Router construction — so those are validated at
|
|
23
|
+
* construction instead.
|
|
24
|
+
*
|
|
25
|
+
* Defaults to `string`, not `never`: inference from an inline `authStacks`
|
|
26
|
+
* literal still narrows `S` to the declared keys, while a consumer who names
|
|
27
|
+
* the type (`const options: RouterOptions = ...`) degrades to "any name"
|
|
28
|
+
* rather than "no name is valid".
|
|
29
|
+
*/
|
|
30
|
+
export type RouterOptions<S extends string = string> = {
|
|
19
31
|
readonly controllers?: readonly (object | ControllerRegistration)[];
|
|
20
32
|
readonly modules?: readonly Component<HttpModuleMeta>[];
|
|
21
33
|
/**
|
|
22
34
|
* Optional — when provided, Router installs a system-owned bootstrap that
|
|
23
|
-
* runs on every route. Required iff `
|
|
24
|
-
*
|
|
25
|
-
*
|
|
35
|
+
* runs on every route. Required iff `authStacks` is set (Router throws at
|
|
36
|
+
* construction otherwise). Handlers that never read `ExecutionContext` can
|
|
37
|
+
* skip this.
|
|
26
38
|
*/
|
|
27
39
|
readonly executionContext?: RouterExecutionContextOptions;
|
|
28
40
|
/** Custom middlewares that run on every route after the system bootstrap. */
|
|
29
41
|
readonly globalMiddlewares?: readonly HttpMiddleware[];
|
|
30
42
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
43
|
+
* Named, phase-ordered auth stacks. A route resolves to exactly one stack,
|
|
44
|
+
* which runs only when the route is non-public, after `globalMiddlewares`.
|
|
45
|
+
*
|
|
46
|
+
* Omit entirely for a service with no authentication. An empty record throws
|
|
47
|
+
* at construction — it would leave every non-public route unauthenticated
|
|
48
|
+
* while looking configured.
|
|
49
|
+
*/
|
|
50
|
+
readonly authStacks?: Readonly<Record<S, AuthMiddlewareStack>>;
|
|
51
|
+
/**
|
|
52
|
+
* Stack applied to routes that declare none. Required whenever `authStacks`
|
|
53
|
+
* is present, and constrained to its keys.
|
|
34
54
|
*/
|
|
35
|
-
readonly
|
|
55
|
+
readonly defaultAuthStack?: NoInfer<S>;
|
|
36
56
|
};
|
|
37
57
|
//# sourceMappingURL=router-options.type.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-options.type.d.ts","sourceRoot":"","sources":["../../src/router/router-options.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAC5C,wFAAwF;IACxF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;
|
|
1
|
+
{"version":3,"file":"router-options.type.d.ts","sourceRoot":"","sources":["../../src/router/router-options.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAC5C,wFAAwF;IACxF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,sBAAsB,CAAC,EAAE,CAAC;IACpE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;IAExD;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,6BAA6B,CAAC;IAE1D,6EAA6E;IAC7E,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAEvD;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE/D;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACxC,CAAC"}
|
package/dist/router/router.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { ExecutionContextProvider } from '@quilla-be-kit/execution-context';
|
|
2
2
|
import type { NormalizedRoute } from './normalized-route.type.js';
|
|
3
3
|
import type { RouterOptions } from './router-options.type.js';
|
|
4
|
-
export declare class Router {
|
|
4
|
+
export declare class Router<S extends string = string> {
|
|
5
5
|
private readonly routes;
|
|
6
6
|
private readonly executionContextProvider;
|
|
7
|
-
constructor(options: RouterOptions);
|
|
7
|
+
constructor(options: RouterOptions<S>);
|
|
8
8
|
getRoutes(): readonly NormalizedRoute[];
|
|
9
9
|
getExecutionContextProvider(): ExecutionContextProvider | undefined;
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAcjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAiC,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAS7F,qBAAa,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAuC;gBAEpE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAoErC,SAAS,IAAI,SAAS,eAAe,EAAE;IAIvC,2BAA2B,IAAI,wBAAwB,GAAG,SAAS;CAGpE"}
|