@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.
Files changed (35) hide show
  1. package/README.md +115 -17
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/decorator/authorize-scope.decorator.js +2 -2
  4. package/dist/decorator/authorize-scope.decorator.js.map +1 -1
  5. package/dist/decorator/controller.decorator.d.ts +1 -0
  6. package/dist/decorator/controller.decorator.d.ts.map +1 -1
  7. package/dist/decorator/controller.decorator.js +2 -1
  8. package/dist/decorator/controller.decorator.js.map +1 -1
  9. package/dist/decorator/method.decorators.d.ts +1 -0
  10. package/dist/decorator/method.decorators.d.ts.map +1 -1
  11. package/dist/decorator/method.decorators.js +1 -0
  12. package/dist/decorator/method.decorators.js.map +1 -1
  13. package/dist/decorator/route.metadata.d.ts +10 -1
  14. package/dist/decorator/route.metadata.d.ts.map +1 -1
  15. package/dist/decorator/route.metadata.js +68 -31
  16. package/dist/decorator/route.metadata.js.map +1 -1
  17. package/dist/decorator/validate-request.decorator.js +2 -2
  18. package/dist/decorator/validate-request.decorator.js.map +1 -1
  19. package/dist/request/http-attributes.d.ts +6 -0
  20. package/dist/request/http-attributes.d.ts.map +1 -1
  21. package/dist/request/http-attributes.js +6 -0
  22. package/dist/request/http-attributes.js.map +1 -1
  23. package/dist/router/auth-middleware-stack.type.d.ts +21 -5
  24. package/dist/router/auth-middleware-stack.type.d.ts.map +1 -1
  25. package/dist/router/http-module-meta.type.d.ts +5 -0
  26. package/dist/router/http-module-meta.type.d.ts.map +1 -1
  27. package/dist/router/normalized-route.type.d.ts +6 -1
  28. package/dist/router/normalized-route.type.d.ts.map +1 -1
  29. package/dist/router/router-options.type.d.ts +28 -8
  30. package/dist/router/router-options.type.d.ts.map +1 -1
  31. package/dist/router/router.d.ts +2 -2
  32. package/dist/router/router.d.ts.map +1 -1
  33. package/dist/router/router.js +92 -16
  34. package/dist/router/router.js.map +1 -1
  35. 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;CAC3B,CAAC;AAmBF,eAAO,MAAM,GAAG,SAhBA,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAef,CAAC;AACvD,eAAO,MAAM,IAAI,SAjBD,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAgBb,CAAC;AACzD,eAAO,MAAM,GAAG,SAlBA,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAiBf,CAAC;AACvD,eAAO,MAAM,KAAK,SAnBF,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAkBX,CAAC;AAC3D,eAAO,MAAM,MAAM,SApBH,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAmBT,CAAC;AAE7D,eAAO,MAAM,SAAS,SAtBN,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAqBV,CAAC;AAC5D,eAAO,MAAM,UAAU,SAvBP,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAsBR,CAAC;AAC9D,eAAO,MAAM,SAAS,SAxBN,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAuBV,CAAC;AAC5D,eAAO,MAAM,WAAW,SAzBR,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAwBN,CAAC;AAChE,eAAO,MAAM,YAAY,SA1BT,MAAM,YAAY,YAAY,MAClC,SAAS,OAAO,EAAE,SAAS,2BAA2B,KAAG,IAyBJ,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"}
@@ -11,6 +11,7 @@ function createMethodDecorator(httpMethod, isPublic) {
11
11
  path,
12
12
  public: isPublic,
13
13
  ...(options?.version !== undefined ? { version: options.version } : {}),
14
+ ...(options?.authStack !== undefined ? { authStack: options.authStack } : {}),
14
15
  });
15
16
  };
16
17
  };
@@ -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;AAShE,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;aACxE,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"}
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 updateLastRoute(metadata: MetadataBag, methodName: string, patch: Partial<RouteDefinition>): void;
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;AAMF,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;AAKD,wBAAgB,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAOtE;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,CAOnF;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAI5E;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,GAC9B,IAAI,CAUN;AAED,wBAAgB,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,eAAe,EAAE,CAO1F"}
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
- for (const metadata of walkMetadata(controllerInstance)) {
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
- for (const metadata of walkMetadata(controllerInstance)) {
37
- if (typeof metadata[CONTROLLER_VERSION_KEY] === 'string') {
38
- return metadata[CONTROLLER_VERSION_KEY];
39
- }
40
- }
41
- return undefined;
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[ROUTES_KEY] ?? [];
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
- export function updateLastRoute(metadata, methodName, patch) {
49
- const routes = metadata[ROUTES_KEY];
50
- if (!routes)
51
- return;
52
- for (let i = routes.length - 1; i >= 0; i--) {
53
- const route = routes[i];
54
- if (route && route.handlerMethodName === methodName) {
55
- routes[i] = { ...route, ...patch };
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
- const routes = metadata[ROUTES_KEY];
64
- if (routes)
65
- collected.unshift(...routes);
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
- return collected;
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 metadata = ctor[Symbol.metadata];
74
- if (metadata)
75
- yield metadata;
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":"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"}
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 { updateLastRoute } from './route.metadata.js';
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
- updateLastRoute(context.metadata, context.name, {
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,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAItD,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,eAAe,CAAC,OAAO,CAAC,QAA4C,EAAE,OAAO,CAAC,IAAc,EAAE;YAC5F,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
+ {"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;;;;CAIjB,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 of key declaration —
4
- * `tokenVerification` first, then `sessionLoad` if present. Phase
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 tokenVerification: HttpMiddleware;
10
- /** Optional — omit for services that verify tokens but don't load sessions. */
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;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,gEAAgE;IAChE,QAAQ,CAAC,iBAAiB,EAAE,cAAc,CAAC;IAC3C,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC;CACvC,CAAC"}
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;CAC3B,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 ? [] : authMiddlewares) → moduleMiddlewares → registrationMiddlewares]`.
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
- export type RouterOptions = {
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 `authMiddlewares` is set (Router
24
- * throws at construction otherwise). Handlers that never read
25
- * `ExecutionContext` can skip this.
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
- * Typed, phase-ordered auth stack. Runs only on non-public routes, after
32
- * `globalMiddlewares`. `tokenVerification` always runs first, then
33
- * `sessionLoad` if present.
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 authMiddlewares?: AuthMiddlewareStack;
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;IAC1B,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;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,mBAAmB,CAAC;CAChD,CAAC"}
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"}
@@ -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;AAYjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAiC,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAQ7F,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAuC;gBAEpE,OAAO,EAAE,aAAa;IA4ClC,SAAS,IAAI,SAAS,eAAe,EAAE;IAIvC,2BAA2B,IAAI,wBAAwB,GAAG,SAAS;CAGpE"}
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"}