@venizia/ignis-kernel 0.4.7-0 → 0.4.7-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/LICENSE.md +1 -4
  2. package/dist/esm/base/applications/cors.d.ts +12 -10
  3. package/dist/esm/base/applications/cors.d.ts.map +1 -1
  4. package/dist/esm/base/applications/cors.js +37 -35
  5. package/dist/esm/base/applications/cors.js.map +1 -1
  6. package/dist/esm/base/applications/rest.js +11 -11
  7. package/dist/esm/base/applications/rest.js.map +1 -1
  8. package/dist/esm/base/auth/authenticate/common/codecs.js +2 -2
  9. package/dist/esm/base/auth/authenticate/common/codecs.js.map +1 -1
  10. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.d.ts +1 -1
  11. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.js +1 -1
  12. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.js.map +1 -1
  13. package/dist/esm/base/auth/authorize/providers/authorization.provider.js +7 -7
  14. package/dist/esm/base/auth/authorize/providers/authorization.provider.js.map +1 -1
  15. package/dist/esm/base/auth/authorize/providers/request-domain.d.ts +14 -11
  16. package/dist/esm/base/auth/authorize/providers/request-domain.d.ts.map +1 -1
  17. package/dist/esm/base/auth/authorize/providers/request-domain.js +42 -39
  18. package/dist/esm/base/auth/authorize/providers/request-domain.js.map +1 -1
  19. package/dist/esm/base/auth/base/abstract-auth-registry.js +2 -2
  20. package/dist/esm/base/auth/base/abstract-auth-registry.js.map +1 -1
  21. package/dist/esm/base/auth/models/requests/change-password.schema.js +3 -3
  22. package/dist/esm/base/auth/models/requests/change-password.schema.js.map +1 -1
  23. package/dist/esm/base/auth/models/requests/sign-in.schema.js +5 -5
  24. package/dist/esm/base/auth/models/requests/sign-in.schema.js.map +1 -1
  25. package/dist/esm/base/components/controller/rest/rest.component.js +2 -2
  26. package/dist/esm/base/components/controller/rest/rest.component.js.map +1 -1
  27. package/dist/esm/base/controllers/common/index.d.ts +0 -1
  28. package/dist/esm/base/controllers/common/index.d.ts.map +1 -1
  29. package/dist/esm/base/controllers/common/index.js +0 -1
  30. package/dist/esm/base/controllers/common/index.js.map +1 -1
  31. package/dist/esm/base/controllers/common/schema-builders.d.ts +0 -5
  32. package/dist/esm/base/controllers/common/schema-builders.d.ts.map +1 -1
  33. package/dist/esm/base/controllers/common/schema-builders.js +0 -14
  34. package/dist/esm/base/controllers/common/schema-builders.js.map +1 -1
  35. package/dist/esm/base/controllers/context.d.ts +7 -2
  36. package/dist/esm/base/controllers/context.d.ts.map +1 -1
  37. package/dist/esm/base/controllers/context.js +7 -4
  38. package/dist/esm/base/controllers/context.js.map +1 -1
  39. package/dist/esm/base/controllers/factory/controller.d.ts +33 -1
  40. package/dist/esm/base/controllers/factory/controller.d.ts.map +1 -1
  41. package/dist/esm/base/controllers/factory/controller.js +90 -6
  42. package/dist/esm/base/controllers/factory/controller.js.map +1 -1
  43. package/dist/esm/base/controllers/factory/definition.d.ts +1 -8
  44. package/dist/esm/base/controllers/factory/definition.d.ts.map +1 -1
  45. package/dist/esm/base/controllers/factory/definition.js +17 -24
  46. package/dist/esm/base/controllers/factory/definition.js.map +1 -1
  47. package/dist/esm/base/controllers/factory/index.d.ts +0 -1
  48. package/dist/esm/base/controllers/factory/index.d.ts.map +1 -1
  49. package/dist/esm/base/controllers/factory/index.js +0 -1
  50. package/dist/esm/base/controllers/factory/index.js.map +1 -1
  51. package/dist/esm/base/controllers/rest/abstract.d.ts.map +1 -1
  52. package/dist/esm/base/controllers/rest/abstract.js +6 -6
  53. package/dist/esm/base/controllers/rest/abstract.js.map +1 -1
  54. package/dist/esm/base/controllers/rest/base.d.ts +0 -5
  55. package/dist/esm/base/controllers/rest/base.d.ts.map +1 -1
  56. package/dist/esm/base/controllers/rest/base.js +14 -14
  57. package/dist/esm/base/controllers/rest/base.js.map +1 -1
  58. package/dist/esm/base/datasources/abstract.js +2 -2
  59. package/dist/esm/base/datasources/abstract.js.map +1 -1
  60. package/dist/esm/base/events/event-bus.js +4 -4
  61. package/dist/esm/base/events/event-bus.js.map +1 -1
  62. package/dist/esm/base/metadata/injectable.d.ts +7 -4
  63. package/dist/esm/base/metadata/injectable.d.ts.map +1 -1
  64. package/dist/esm/base/metadata/injectable.js +26 -23
  65. package/dist/esm/base/metadata/injectable.js.map +1 -1
  66. package/dist/esm/base/metadata/model-metadata.d.ts +27 -13
  67. package/dist/esm/base/metadata/model-metadata.d.ts.map +1 -1
  68. package/dist/esm/base/metadata/model-metadata.js +56 -26
  69. package/dist/esm/base/metadata/model-metadata.js.map +1 -1
  70. package/dist/esm/base/metadata/persistents.d.ts.map +1 -1
  71. package/dist/esm/base/metadata/persistents.js +21 -13
  72. package/dist/esm/base/metadata/persistents.js.map +1 -1
  73. package/dist/esm/base/metadata/routes/controller.d.ts.map +1 -1
  74. package/dist/esm/base/metadata/routes/controller.js +5 -2
  75. package/dist/esm/base/metadata/routes/controller.js.map +1 -1
  76. package/dist/esm/base/middlewares/app-error/app-error.middleware.js +7 -7
  77. package/dist/esm/base/middlewares/app-error/app-error.middleware.js.map +1 -1
  78. package/dist/esm/base/middlewares/app-error/database.handler.d.ts +14 -12
  79. package/dist/esm/base/middlewares/app-error/database.handler.d.ts.map +1 -1
  80. package/dist/esm/base/middlewares/app-error/database.handler.js +37 -35
  81. package/dist/esm/base/middlewares/app-error/database.handler.js.map +1 -1
  82. package/dist/esm/base/middlewares/app-error/zod.handler.d.ts +28 -23
  83. package/dist/esm/base/middlewares/app-error/zod.handler.d.ts.map +1 -1
  84. package/dist/esm/base/middlewares/app-error/zod.handler.js +56 -53
  85. package/dist/esm/base/middlewares/app-error/zod.handler.js.map +1 -1
  86. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.d.ts +6 -4
  87. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.d.ts.map +1 -1
  88. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.js +14 -12
  89. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.js.map +1 -1
  90. package/dist/esm/base/middlewares/form-body/form-body.middleware.d.ts +15 -11
  91. package/dist/esm/base/middlewares/form-body/form-body.middleware.d.ts.map +1 -1
  92. package/dist/esm/base/middlewares/form-body/form-body.middleware.js +25 -21
  93. package/dist/esm/base/middlewares/form-body/form-body.middleware.js.map +1 -1
  94. package/dist/esm/base/models/common/schemas.d.ts +184 -105
  95. package/dist/esm/base/models/common/schemas.d.ts.map +1 -1
  96. package/dist/esm/base/models/common/schemas.js +105 -54
  97. package/dist/esm/base/models/common/schemas.js.map +1 -1
  98. package/dist/esm/base/models/common/utilities.d.ts +10 -5
  99. package/dist/esm/base/models/common/utilities.d.ts.map +1 -1
  100. package/dist/esm/base/models/common/utilities.js +22 -16
  101. package/dist/esm/base/models/common/utilities.js.map +1 -1
  102. package/dist/esm/base/repositories/common/types/results.d.ts +15 -7
  103. package/dist/esm/base/repositories/common/types/results.d.ts.map +1 -1
  104. package/dist/esm/base/repositories/common/types/results.js +16 -7
  105. package/dist/esm/base/repositories/common/types/results.js.map +1 -1
  106. package/dist/esm/base/repositories/core/abstract.d.ts.map +1 -1
  107. package/dist/esm/base/repositories/core/abstract.js +5 -3
  108. package/dist/esm/base/repositories/core/abstract.js.map +1 -1
  109. package/dist/esm/base/repositories/query-schemas/index.d.ts +1 -1
  110. package/dist/esm/base/repositories/query-schemas/index.d.ts.map +1 -1
  111. package/dist/esm/base/repositories/query-schemas/index.js +3 -3
  112. package/dist/esm/base/repositories/query-schemas/index.js.map +1 -1
  113. package/dist/esm/helpers/inversion/common/relation-builder.js.map +1 -1
  114. package/dist/esm/helpers/inversion/index.d.ts +1 -1
  115. package/dist/esm/helpers/inversion/index.d.ts.map +1 -1
  116. package/dist/esm/helpers/inversion/index.js +1 -1
  117. package/dist/esm/helpers/inversion/index.js.map +1 -1
  118. package/dist/esm/helpers/inversion/mixins/repository.mixin.d.ts.map +1 -1
  119. package/dist/esm/helpers/inversion/mixins/repository.mixin.js +5 -5
  120. package/dist/esm/helpers/inversion/mixins/repository.mixin.js.map +1 -1
  121. package/dist/esm/metadata.d.ts +1 -1
  122. package/dist/esm/metadata.d.ts.map +1 -1
  123. package/dist/esm/metadata.js +1 -1
  124. package/dist/esm/metadata.js.map +1 -1
  125. package/dist/esm/repository.d.ts +2 -2
  126. package/dist/esm/repository.d.ts.map +1 -1
  127. package/dist/esm/repository.js +2 -2
  128. package/dist/esm/repository.js.map +1 -1
  129. package/dist/esm/utilities/index.d.ts +1 -1
  130. package/dist/esm/utilities/index.d.ts.map +1 -1
  131. package/dist/esm/utilities/index.js +1 -1
  132. package/dist/esm/utilities/index.js.map +1 -1
  133. package/dist/esm/utilities/not-supported.utility.d.ts +11 -0
  134. package/dist/esm/utilities/not-supported.utility.d.ts.map +1 -0
  135. package/dist/esm/utilities/not-supported.utility.js +19 -0
  136. package/dist/esm/utilities/not-supported.utility.js.map +1 -0
  137. package/package.json +6 -7
  138. package/dist/esm/base/controllers/common/html-response.d.ts +0 -70
  139. package/dist/esm/base/controllers/common/html-response.d.ts.map +0 -1
  140. package/dist/esm/base/controllers/common/html-response.js +0 -30
  141. package/dist/esm/base/controllers/common/html-response.js.map +0 -1
  142. package/dist/esm/base/controllers/factory/authorize-guard.d.ts +0 -19
  143. package/dist/esm/base/controllers/factory/authorize-guard.d.ts.map +0 -1
  144. package/dist/esm/base/controllers/factory/authorize-guard.js +0 -56
  145. package/dist/esm/base/controllers/factory/authorize-guard.js.map +0 -1
  146. package/dist/esm/base/controllers/factory/helper.d.ts +0 -2
  147. package/dist/esm/base/controllers/factory/helper.d.ts.map +0 -1
  148. package/dist/esm/base/controllers/factory/helper.js +0 -2
  149. package/dist/esm/base/controllers/factory/helper.js.map +0 -1
  150. package/dist/esm/base/controllers/factory/repository-injection.d.ts +0 -14
  151. package/dist/esm/base/controllers/factory/repository-injection.d.ts.map +0 -1
  152. package/dist/esm/base/controllers/factory/repository-injection.js +0 -27
  153. package/dist/esm/base/controllers/factory/repository-injection.js.map +0 -1
  154. package/dist/esm/base/metadata/model-settings.d.ts +0 -11
  155. package/dist/esm/base/metadata/model-settings.d.ts.map +0 -1
  156. package/dist/esm/base/metadata/model-settings.js +0 -30
  157. package/dist/esm/base/metadata/model-settings.js.map +0 -1
  158. package/dist/esm/utilities/error.utility.d.ts +0 -8
  159. package/dist/esm/utilities/error.utility.d.ts.map +0 -1
  160. package/dist/esm/utilities/error.utility.js +0 -14
  161. package/dist/esm/utilities/error.utility.js.map +0 -1
package/LICENSE.md CHANGED
@@ -38,7 +38,7 @@ This monorepo contains the following packages, all licensed under MIT:
38
38
  | `@venizia/ignis-helpers` | Utility helpers - logging, cron, Redis, queues, storage |
39
39
  | `@venizia/ignis-inversion` | Dependency Injection & IoC container |
40
40
  | `@venizia/dev-configs` | Shared oxlint, ESLint, TypeScript configurations |
41
- | `@venizia/ignis-docs` | Documentation and MCP Server |
41
+ | `@venizia/ignis-docs` | Documentation site content |
42
42
 
43
43
  ---
44
44
 
@@ -74,15 +74,12 @@ Ignis uses the following open-source libraries. We are grateful to the authors a
74
74
  | Library | License | Description |
75
75
  |---------|---------|-------------|
76
76
  | [reflect-metadata](https://github.com/rbuckton/reflect-metadata) | Apache-2.0 | Metadata reflection API |
77
- | [glob](https://github.com/isaacs/node-glob) | ISC | File pattern matching (used by boot) |
78
77
 
79
78
  ### Documentation Dependencies
80
79
 
81
80
  | Library | License | Description |
82
81
  |---------|---------|-------------|
83
82
  | [VitePress](https://github.com/vuejs/vitepress) | MIT | Static site generator |
84
- | [Fuse.js](https://github.com/krisk/fuse) | Apache-2.0 | Fuzzy search library |
85
- | [gray-matter](https://github.com/jonschlinkert/gray-matter) | MIT | Front-matter parser |
86
83
 
87
84
  ---
88
85
 
@@ -1,13 +1,15 @@
1
1
  import type { Hono } from 'hono';
2
2
  import type { ICORSOptions } from './common/index.js';
3
- /**
4
- * Installs `configs.middlewares.cors` on the server when it is set and not disabled; with no config
5
- * nothing is installed. Called first in the default stack, so every response the framework produces
6
- * on its own - a bodyLimit 413, a body the request spy cannot parse, the error envelope - leaves
7
- * with the headers a browser needs to read it.
8
- */
9
- export declare const registerCors: (opts: {
10
- server: Hono<any, any, any>;
11
- options?: ICORSOptions;
12
- }) => void;
3
+ export declare class CorsUtility {
4
+ /**
5
+ * Installs `configs.middlewares.cors` on the server when it is set and not disabled; with no config
6
+ * nothing is installed. Called first in the default stack, so every response the framework produces
7
+ * on its own - a bodyLimit 413, a body the request spy cannot parse, the error envelope - leaves
8
+ * with the headers a browser needs to read it.
9
+ */
10
+ static registerCors(opts: {
11
+ server: Hono<any, any, any>;
12
+ options?: ICORSOptions;
13
+ }): void;
14
+ }
13
15
  //# sourceMappingURL=cors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../../../src/base/applications/cors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM;IACjC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,KAAG,IAwCH,CAAC"}
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../../../src/base/applications/cors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,qBAAa,WAAW;IACtB;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,YAAY,CAAA;KAAE,GAAG,IAAI;CA0CzF"}
@@ -1,39 +1,41 @@
1
1
  import { getError } from '@venizia/ignis-helpers/core';
2
2
  import { cors } from 'hono/cors';
3
- /**
4
- * Installs `configs.middlewares.cors` on the server when it is set and not disabled; with no config
5
- * nothing is installed. Called first in the default stack, so every response the framework produces
6
- * on its own - a bodyLimit 413, a body the request spy cannot parse, the error envelope - leaves
7
- * with the headers a browser needs to read it.
8
- */
9
- export const registerCors = (opts) => {
10
- const { server, options } = opts;
11
- if (!options || options.enable === false) {
12
- return;
3
+ export class CorsUtility {
4
+ /**
5
+ * Installs `configs.middlewares.cors` on the server when it is set and not disabled; with no config
6
+ * nothing is installed. Called first in the default stack, so every response the framework produces
7
+ * on its own - a bodyLimit 413, a body the request spy cannot parse, the error envelope - leaves
8
+ * with the headers a browser needs to read it.
9
+ */
10
+ static registerCors(opts) {
11
+ const { server, options } = opts;
12
+ if (!options || options.enable === false) {
13
+ return;
14
+ }
15
+ const { origin, path, allowMethods, allowHeaders, maxAge, credentials, exposeHeaders } = options;
16
+ const hasOrigin = typeof origin === 'function' || (Array.isArray(origin) ? origin.length > 0 : !!origin);
17
+ if (!hasOrigin) {
18
+ throw getError({
19
+ message: '[registerCors] configs.middlewares.cors.origin is required | a string, a list of strings or a function',
20
+ });
21
+ }
22
+ const origins = Array.isArray(origin) ? origin : [origin];
23
+ if (credentials && origins.includes('*')) {
24
+ throw getError({
25
+ message: "[registerCors] configs.middlewares.cors.credentials cannot be combined with origin '*' | a browser refuses a wildcard origin on a credentialed request | list the origins instead",
26
+ });
27
+ }
28
+ // Only the keys that are set: hono spreads over its defaults, so an `undefined` would erase one
29
+ // (a missing `allowMethods` would then answer a preflight with no allowed methods).
30
+ const settings = Object.fromEntries(Object.entries({
31
+ origin,
32
+ allowMethods,
33
+ allowHeaders,
34
+ maxAge,
35
+ credentials,
36
+ exposeHeaders,
37
+ }).filter(([, value]) => value !== undefined));
38
+ server.use(path ?? '*', cors(settings));
13
39
  }
14
- const { origin, path, allowMethods, allowHeaders, maxAge, credentials, exposeHeaders } = options;
15
- const hasOrigin = typeof origin === 'function' || (Array.isArray(origin) ? origin.length > 0 : !!origin);
16
- if (!hasOrigin) {
17
- throw getError({
18
- message: '[registerCors] configs.middlewares.cors.origin is required | a string, a list of strings or a function',
19
- });
20
- }
21
- const origins = Array.isArray(origin) ? origin : [origin];
22
- if (credentials && origins.includes('*')) {
23
- throw getError({
24
- message: "[registerCors] configs.middlewares.cors.credentials cannot be combined with origin '*' | a browser refuses a wildcard origin on a credentialed request | list the origins instead",
25
- });
26
- }
27
- // Only the keys that are set: hono spreads over its defaults, so an `undefined` would erase one
28
- // (a missing `allowMethods` would then answer a preflight with no allowed methods).
29
- const settings = Object.fromEntries(Object.entries({
30
- origin,
31
- allowMethods,
32
- allowHeaders,
33
- maxAge,
34
- credentials,
35
- exposeHeaders,
36
- }).filter(([, value]) => value !== undefined));
37
- server.use(path ?? '*', cors(settings));
38
- };
40
+ }
39
41
  //# sourceMappingURL=cors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../../../src/base/applications/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAG5B,EAAQ,EAAE;IACT,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAEjC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAEjG,MAAM,SAAS,GACb,OAAO,MAAM,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACzF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,QAAQ,CAAC;YACb,OAAO,EACL,wGAAwG;SAC3G,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,QAAQ,CAAC;YACb,OAAO,EACL,mLAAmL;SACtL,CAAC,CAAC;IACL,CAAC;IAED,gGAAgG;IAChG,oFAAoF;IACpF,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC;QACb,MAAM;QACN,YAAY;QACZ,YAAY;QACZ,MAAM;QACN,WAAW;QACX,aAAa;KACd,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAC9C,CAAC;IAEF,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,QAAsC,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC","sourcesContent":["import { getError } from '@venizia/ignis-helpers/core';\nimport type { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport type { ICORSOptions } from './common';\n\n/**\n * Installs `configs.middlewares.cors` on the server when it is set and not disabled; with no config\n * nothing is installed. Called first in the default stack, so every response the framework produces\n * on its own - a bodyLimit 413, a body the request spy cannot parse, the error envelope - leaves\n * with the headers a browser needs to read it.\n */\nexport const registerCors = (opts: {\n server: Hono<any, any, any>;\n options?: ICORSOptions;\n}): void => {\n const { server, options } = opts;\n\n if (!options || options.enable === false) {\n return;\n }\n\n const { origin, path, allowMethods, allowHeaders, maxAge, credentials, exposeHeaders } = options;\n\n const hasOrigin =\n typeof origin === 'function' || (Array.isArray(origin) ? origin.length > 0 : !!origin);\n if (!hasOrigin) {\n throw getError({\n message:\n '[registerCors] configs.middlewares.cors.origin is required | a string, a list of strings or a function',\n });\n }\n\n const origins = Array.isArray(origin) ? origin : [origin];\n if (credentials && origins.includes('*')) {\n throw getError({\n message:\n \"[registerCors] configs.middlewares.cors.credentials cannot be combined with origin '*' | a browser refuses a wildcard origin on a credentialed request | list the origins instead\",\n });\n }\n\n // Only the keys that are set: hono spreads over its defaults, so an `undefined` would erase one\n // (a missing `allowMethods` would then answer a preflight with no allowed methods).\n const settings = Object.fromEntries(\n Object.entries({\n origin,\n allowMethods,\n allowHeaders,\n maxAge,\n credentials,\n exposeHeaders,\n }).filter(([, value]) => value !== undefined),\n );\n\n server.use(path ?? '*', cors(settings as Parameters<typeof cors>[0]));\n};\n"]}
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../../../src/base/applications/cors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,OAAO,WAAW;IACtB;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,IAA6D;QAC/E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEjC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GACpF,OAAO,CAAC;QAEV,MAAM,SAAS,GACb,OAAO,MAAM,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACzF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,QAAQ,CAAC;gBACb,OAAO,EACL,wGAAwG;aAC3G,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,QAAQ,CAAC;gBACb,OAAO,EACL,mLAAmL;aACtL,CAAC,CAAC;QACL,CAAC;QAED,gGAAgG;QAChG,oFAAoF;QACpF,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC;YACb,MAAM;YACN,YAAY;YACZ,YAAY;YACZ,MAAM;YACN,WAAW;YACX,aAAa;SACd,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAC9C,CAAC;QAEF,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,QAAsC,CAAC,CAAC,CAAC;IACxE,CAAC;CACF","sourcesContent":["import { getError } from '@venizia/ignis-helpers/core';\nimport type { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport type { ICORSOptions } from './common';\n\nexport class CorsUtility {\n /**\n * Installs `configs.middlewares.cors` on the server when it is set and not disabled; with no config\n * nothing is installed. Called first in the default stack, so every response the framework produces\n * on its own - a bodyLimit 413, a body the request spy cannot parse, the error envelope - leaves\n * with the headers a browser needs to read it.\n */\n static registerCors(opts: { server: Hono<any, any, any>; options?: ICORSOptions }): void {\n const { server, options } = opts;\n\n if (!options || options.enable === false) {\n return;\n }\n\n const { origin, path, allowMethods, allowHeaders, maxAge, credentials, exposeHeaders } =\n options;\n\n const hasOrigin =\n typeof origin === 'function' || (Array.isArray(origin) ? origin.length > 0 : !!origin);\n if (!hasOrigin) {\n throw getError({\n message:\n '[registerCors] configs.middlewares.cors.origin is required | a string, a list of strings or a function',\n });\n }\n\n const origins = Array.isArray(origin) ? origin : [origin];\n if (credentials && origins.includes('*')) {\n throw getError({\n message:\n \"[registerCors] configs.middlewares.cors.credentials cannot be combined with origin '*' | a browser refuses a wildcard origin on a credentialed request | list the origins instead\",\n });\n }\n\n // Only the keys that are set: hono spreads over its defaults, so an `undefined` would erase one\n // (a missing `allowMethods` would then answer a preflight with no allowed methods).\n const settings = Object.fromEntries(\n Object.entries({\n origin,\n allowMethods,\n allowHeaders,\n maxAge,\n credentials,\n exposeHeaders,\n }).filter(([, value]) => value !== undefined),\n );\n\n server.use(path ?? '*', cors(settings as Parameters<typeof cors>[0]));\n }\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  import { ArtifactNamespaces, BindingNamespaces, CoreBindings } from '../../common/bindings.js';
2
2
  import { BindingScopes, MetadataRegistry } from '../../helpers/inversion/index.js';
3
- import { assertBindingsResolve } from '@venizia/ignis-inversion';
3
+ import { BindingVerifier } from '@venizia/ignis-inversion';
4
4
  import { OpenAPIHono } from '@hono/zod-openapi';
5
- import { executeWithPerformanceMeasure, getError, RequestIdGenerator, RetryHelper, } from '@venizia/ignis-helpers/core';
5
+ import { PerformanceUtility, getError, RequestIdGenerator, RetryHelper, } from '@venizia/ignis-helpers/core';
6
6
  import { showRoutes as showApplicationRoutes } from 'hono/dev';
7
7
  import { bodyLimit } from 'hono/body-limit';
8
8
  import { requestId } from 'hono/request-id';
@@ -13,7 +13,7 @@ import { BaseAppErrorMiddleware } from '../middlewares/app-error/app-error.middl
13
13
  import { RequestErrors } from '../middlewares/common/errors.js';
14
14
  import { notFoundHandler } from '../middlewares/not-found/not-found.middleware.js';
15
15
  import { AbstractApplication } from './abstract.js';
16
- import { registerCors } from './cors.js';
16
+ import { CorsUtility } from './cors.js';
17
17
  import { ArtifactIndexHelper } from './artifact-index.js';
18
18
  import { BootSteps } from './boot-sequence.js';
19
19
  /** Adds the `OpenAPIHono` router surface on top of `AbstractApplication` - no listening server, so this is the layer a browser Worker or gRPC-only host can extend without pulling in `Bun.serve`. */
@@ -79,7 +79,7 @@ export class RestApplication extends AbstractApplication {
79
79
  const server = this.getServer();
80
80
  // First of all, so every response the framework produces on its own - a bodyLimit 413, a body the
81
81
  // request spy cannot parse, the error envelope - leaves with the headers a browser needs to read it.
82
- registerCors({ server, options: this.configs.middlewares?.cors });
82
+ CorsUtility.registerCors({ server, options: this.configs.middlewares?.cors });
83
83
  server.use(requestId({ generator: () => this.generateRequestId() }));
84
84
  // Ahead of every middleware a host adds after this one, so none of them buffers a body over it.
85
85
  const bodyLimitOptions = this.configs.middlewares?.bodyLimit;
@@ -242,7 +242,7 @@ export class RestApplication extends AbstractApplication {
242
242
  return;
243
243
  }
244
244
  const logger = this.logger.for(this.verifyBindings.name);
245
- const { verified } = assertBindingsResolve({
245
+ const { verified } = BindingVerifier.assertResolve({
246
246
  container: this,
247
247
  namespaces: [BindingNamespaces.SERVICE, BindingNamespaces.REPOSITORY],
248
248
  scope: this.verifyBindings.name,
@@ -257,7 +257,7 @@ export class RestApplication extends AbstractApplication {
257
257
  const stepsEntries = steps.entries();
258
258
  for (const [index, step] of stepsEntries) {
259
259
  try {
260
- await executeWithPerformanceMeasure({
260
+ await PerformanceUtility.executeWithMeasure({
261
261
  logger: this.logger,
262
262
  scope: this.initialize.name,
263
263
  description: `Boot step ${index + 1}/${steps.length} ${step.name}`,
@@ -395,7 +395,7 @@ export class RestApplication extends AbstractApplication {
395
395
  });
396
396
  }
397
397
  async registerConfigurations() {
398
- await executeWithPerformanceMeasure({
398
+ await PerformanceUtility.executeWithMeasure({
399
399
  logger: this.logger,
400
400
  scope: this.registerConfigurations.name,
401
401
  description: 'Register application configurations',
@@ -414,7 +414,7 @@ export class RestApplication extends AbstractApplication {
414
414
  });
415
415
  }
416
416
  async registerComponents() {
417
- await executeWithPerformanceMeasure({
417
+ await PerformanceUtility.executeWithMeasure({
418
418
  logger: this.logger,
419
419
  scope: this.registerComponents.name,
420
420
  description: 'Register application components',
@@ -429,7 +429,7 @@ export class RestApplication extends AbstractApplication {
429
429
  * would run twice. Runs after every component, so a component a datasource registers is never configured.
430
430
  */
431
431
  async registerContributedDataSources() {
432
- await executeWithPerformanceMeasure({
432
+ await PerformanceUtility.executeWithMeasure({
433
433
  logger: this.logger,
434
434
  scope: this.registerContributedDataSources.name,
435
435
  description: 'Register application contributed data sources',
@@ -440,7 +440,7 @@ export class RestApplication extends AbstractApplication {
440
440
  }
441
441
  /** REST only - the kernel has no gRPC (it reaches `node:module`). `BaseApplication` adds the gRPC branch on top. */
442
442
  async registerControllers() {
443
- await executeWithPerformanceMeasure({
443
+ await PerformanceUtility.executeWithMeasure({
444
444
  logger: this.logger,
445
445
  description: 'Register application REST controllers',
446
446
  scope: this.registerControllers.name,
@@ -597,7 +597,7 @@ export class RestApplication extends AbstractApplication {
597
597
  }
598
598
  }
599
599
  async registerDataSources() {
600
- await executeWithPerformanceMeasure({
600
+ await PerformanceUtility.executeWithMeasure({
601
601
  logger: this.logger,
602
602
  scope: this.registerDataSources.name,
603
603
  description: 'Register application data sources',
@@ -1 +1 @@
1
- {"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../../src/base/applications/rest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAExF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,6BAA6B,EAC7B,QAAQ,EACR,kBAAkB,EAClB,WAAW,GACZ,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,UAAU,IAAI,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAE7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AAIhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU5C,sMAAsM;AACtM,MAAM,OAAgB,eAIpB,SAAQ,mBAAmB;IAa3B,YAAY,IAAoD;QAC9D,KAAK,CAAC,IAAI,CAAC,CAAC;QAbN,uBAAkB,GAAgC,EAAE,CAAC;QACrD,oBAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;QAclD,+JAA+J;QAC/J,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,iDAAiD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,uDAAuD;aAC/J,CAAC,CAAC;QACL,CAAC;QAED,gGAAgG;QAChG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,6CAA6C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,8BAA8B;aAClI,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAExE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;QAClD,MAAM,UAAU,GAAG,IAAI,WAAW,CAA8B,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACrC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAEkB,oBAAoB;QACrC,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAE7B,IAAI,CAAC,IAAI,CAAqB;YAC5B,GAAG,EAAE,YAAY,CAAC,kBAAkB;SACrC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAyB;YAChC,GAAG,EAAE,YAAY,CAAC,uBAAuB;SAC1C,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,oHAAoH;IAC1G,iBAAiB;QACzB,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,sLAAsL;IAC5K,oBAAoB;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC;QAEpD,OAAO,IAAI,sBAAsB,CAAC;YAChC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,SAAS;YACjD,+FAA+F;YAC/F,8EAA8E;YAC9E,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;SACzE,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACO,0BAA0B;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,kGAAkG;QAClG,qGAAqG;QACrG,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAElE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC;QAErE,gGAAgG;QAChG,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC;QAC7D,IAAI,CAAC,kBAAkB,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;QAEhG,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC;YAEpD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAC5E,MAAM,QAAQ,CAAC;oBACb,OAAO,EAAE,sHAAsH,MAAM,CAAC,OAAO,CAAC,EAAE;iBACjJ,CAAC,CAAC;YACL,CAAC;YAED,MAAM,OAAO,GAAG,SAAS,CAAC;gBACxB,OAAO;gBACP,OAAO,EACL,OAAO;oBACP,CAAC,GAAG,EAAE;wBACJ,MAAM,QAAQ,CAAC;4BACb,KAAK,EAAE,aAAa,CAAC,cAAc;4BACnC,OAAO,EAAE,uCAAuC,OAAO,QAAQ;yBAChE,CAAC,CAAC;oBACL,CAAC,CAAC;aACL,CAAC,CAAC;YAEH,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,wHAAwH;IAChH,oBAAoB,CAAC,IAE5B;QACC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEzB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACzC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,CAAC;IAEO,eAAe,CAAC,IAA6D;QACnF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAE7B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,IAAI,KAAK,KAAK,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,wBAAwB,CAAC,IAAsB;QACrD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,CAAC;YACb,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,gHAAgH,SAAS,EAAE,OAAO,IAAI,MAAM,mBAAmB,OAAO,EAAE,OAAO,IAAI,MAAM,wGAAwG;SACxT,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACO,eAAe;QACvB,OAAO;YACL;gBACE,IAAI,EAAE,SAAS,CAAC,gBAAgB;gBAChC,GAAG,EAAE,KAAK,IAAI,EAAE;oBACd,mFAAmF;oBACnF,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;oBAC9C,IAAI,CAAC,wBAAwB,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACtE,CAAC;aACF;YACD,EAAE,IAAI,EAAE,SAAS,CAAC,kBAAkB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE;YACrF;gBACE,IAAI,EAAE,SAAS,CAAC,aAAa;gBAC7B,GAAG,EAAE,KAAK,IAAI,EAAE;oBACd,MAAM,IAAI,CAAC,kBAAkB,CAAC;wBAC5B,IAAI,EAAE,SAAS,CAAC,aAAa;wBAC7B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE;qBAChC,CAAC,CAAC;oBACH,IAAI,CAAC,wBAAwB,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;gBACnE,CAAC;aACF;YACD;gBACE,IAAI,EAAE,SAAS,CAAC,uBAAuB;gBACvC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE;aACzC;YACD,EAAE,IAAI,EAAE,SAAS,CAAC,qBAAqB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;YAChF,EAAE,IAAI,EAAE,SAAS,CAAC,mBAAmB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC7E;gBACE,IAAI,EAAE,SAAS,CAAC,iCAAiC;gBACjD,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,8BAA8B,EAAE;aACjD;YACD,EAAE,IAAI,EAAE,SAAS,CAAC,oBAAoB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;YAC/E;gBACE,IAAI,EAAE,SAAS,CAAC,cAAc;gBAC9B,GAAG,EAAE,GAAG,EAAE,CACR,IAAI,CAAC,kBAAkB,CAAC;oBACtB,IAAI,EAAE,SAAS,CAAC,cAAc;oBAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE;iBACjC,CAAC;aACL;YACD,EAAE,IAAI,EAAE,SAAS,CAAC,eAAe,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;SACtE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAKO,KAAK,CAAC,kBAAkB,CAAC,IAGhC;QACC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,IAAI,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QAC1C,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,qBAAqB,CAAC,IAA0B;QAC9C,IAAI,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACvC,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,iNAAiN;aAC9P,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,SAAS;gBACX,CAAC;gBAED,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,8OAA8O;IACpO,cAAc;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,EAAE,QAAQ,EAAE,GAAG,qBAAqB,CAAC;YACzC,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC;YACrE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI;SAChC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,8DAA8D,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/F,CAAC;IAED,6JAA6J;IACnJ,KAAK,CAAC,eAAe,CAAC,IAAoC;QAClE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAE5B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,6BAA6B,CAAC;oBAClC,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;oBAC3B,WAAW,EAAE,aAAa,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE;oBAClE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;iBACvB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CACV,iDAAiD,EACjD,IAAI,CAAC,IAAI,EACT,KAAK,GAAG,CAAC,EACT,KAAK,CAAC,MAAM,EACZ,KAAK,CACN,CAAC;gBACF,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CACT,0DAA0D,EAC1D,KAAK,CAAC,MAAM,EACZ,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EACrB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAC5C,CAAC;IACJ,CAAC;IAES,aAAa;QACrB,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,IAAI,KAAK,CAAC;QAExE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC1F,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;aACR,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;aAC5B,IAAI,CAAC,yDAAyD,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAI,IAInB;QACC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAEzC,6FAA6F;QAC7F,2FAA2F;QAC3F,yEAAyE;QACzE,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAI,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAE/D,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,yEAAyE;gBACzE,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC1B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;YAED,8EAA8E;YAC9E,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAI,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAES,KAAK,CAAC,uBAAuB,CACrC,IAAwC;QAExC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;QAEhE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,EAAU,CAAC;QACzD,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEtD,MAAM,IAAI,CAAC,UAAU,CAAI;YACvB,GAAG,EAAE,SAAS;YACd,UAAU;YACV,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC5B,IAAI,iBAAiB,EAAE,CAAC;oBACtB,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;gBACvC,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;oBACtF,OAAO;gBACT,CAAC;gBAED,IAAI,OAAQ,QAAmC,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;oBAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACtD,MAAO,QAA0B,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACvD,CAAC;gBAED,qFAAqF;gBACrF,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAE5B,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,gBAAgB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,6UAA6U;IACnU,wBAAwB,CAAC,IAIlC;QACC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC7B,MAAM,aAAa,GACjB,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,IAAI,IAAI,CAAC;QAEhF,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GACV,IAAI,CAAC,aAAa,KAAK,KAAK;YAC1B,CAAC,CAAC,gLAAgL;YAClL,CAAC,CAAC,gNAAgN,CAAC;QAEvN,MAAM,QAAQ,CAAC;YACb,OAAO,EAAE,IAAI,MAAM,sCAAsC,GAAG,OAAO,MAAM,EAAE;SAC5E,CAAC,CAAC;IACL,CAAC;IAED,uNAAuN;IAC/M,gBAAgB,CAAO,IAM9B;QACC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACzD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAEhF,IACE,IAAI,CAAC,sBAAsB;YAC3B,IAAI,CAAC,OAAO,CAAC,SAAS;YACtB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,KAAK,KAAK,EACvD,CAAC;YACD,MAAM,QAAQ,CAAC;gBACb,OAAO,EAAE,IAAI,MAAM,MAAM,MAAM,CAAC,IAAI,kCAAkC,IAAI,CAAC,sBAAsB,yMAAyM;aAC3S,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,CAAC;QACvD,iBAAiB,CAAC,uBAAuB,CAAC;YACxC,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,SAAS;YACzC,QAAQ,EAAE,MAAM,CAAC,IAAI;YACrB,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAEpF,0FAA0F;QAC1F,0EAA0E;QAC1E,gBAAgB,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAE9D,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,wBAAwB,CAAC;YAC5B,GAAG;YACH,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,IAAI,QAAQ,EAAE,aAAa;YAClE,MAAM;SACP,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,IAAI,CAAO,EAAE,GAAG,EAAE,CAAC;aAC5B,OAAO,CAAC,MAAM,CAAC;aACf,QAAQ,CAAC,QAAQ,EAAE,KAAK,IAAI,YAAY,CAAC,CAAC;IAC/C,CAAC;IAED,aAAa,CACX,MAAoB,EACpB,IAA0B;QAE1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,MAAM;YACN,SAAS,EAAE,iBAAiB,CAAC,aAAa;YAC1C,YAAY,EAAE,aAAa,CAAC,SAAS;YACrC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI;YAC/B,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,MAAM,6BAA6B,CAAC;YAClC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI;YACvC,WAAW,EAAE,qCAAqC;YAClD,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,aAAa,EAAE,CAAC,CAAC;YACrF,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CACP,MAAoB,EACpB,IAA0B;QAE1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,MAAM;YACN,SAAS,EAAE,iBAAiB,CAAC,SAAS;YACtC,YAAY,EAAE,aAAa,CAAC,SAAS;YACrC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;YAC3B,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,6BAA6B,CAAC;YAClC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI;YACnC,WAAW,EAAE,iCAAiC;YAC9C,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC;YACjF,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,8BAA8B;QAClC,MAAM,6BAA6B,CAAC;YAClC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,8BAA8B,CAAC,IAAI;YAC/C,WAAW,EAAE,+CAA+C;YAC5D,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;YAClF,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,oHAAoH;IACpH,KAAK,CAAC,mBAAmB;QACvB,MAAM,6BAA6B,CAAC;YAClC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,uCAAuC;YACpD,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI;YACpC,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBAC1E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpD,OAAO;gBACT,CAAC;gBAED,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC9C,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;YAClC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,8JAA8J;IAC9J,UAAU,CAAO,MAAoB,EAAE,IAAiB;QACtD,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,MAAM;YACN,SAAS,EAAE,iBAAiB,CAAC,UAAU;YACvC,YAAY,EAAE,aAAa,CAAC,SAAS;YACrC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAC5B,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAwB,MAAoB,EAAE,IAAiB;QACpE,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,MAAM;YACN,SAAS,EAAE,iBAAiB,CAAC,OAAO;YACpC,YAAY,EAAE,aAAa,CAAC,SAAS;YACrC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YACzB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAA2B,MAAoB,EAAE,IAAiB;QAC1E,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,MAAM;YACN,SAAS,EAAE,iBAAiB,CAAC,UAAU;YACvC,YAAY,EAAE,aAAa,CAAC,SAAS;YACrC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAC5B,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CACR,MAAoB,EACpB,IAA0B;QAE1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,MAAM;YACN,SAAS,EAAE,iBAAiB,CAAC,UAAU;YACvC,YAAY,EAAE,aAAa,CAAC,SAAS;YACrC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAC5B,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,+IAA+I;IAC/I,KAAK,CAAC,iBAAiB,CAAC,KAA0B;QAChD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC;YAC/D,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,KAAK,GAA+D;YACxE,CAAC,QAAQ,CAAC,cAAc,EAAE,iBAAiB,CAAC,aAAa,CAAC;YAC1D,CAAC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC,UAAU,CAAC;YACpD,CAAC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC,SAAS,CAAC;YAClD,CAAC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC,UAAU,CAAC;YACrD,CAAC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC;YAC9C,CAAC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC,UAAU,CAAC;SACrD,CAAC;QACF,MAAM,UAAU,GAAG,mBAAmB,CAAC,qBAAqB,CAAC;YAC3D,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,CAC9C,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACvB,MAAM;gBACN,SAAS;gBACT,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO;aAC3D,CAAC,CAAC,CACJ;SACF,CAAC,CAAC;QAEH,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAE5F,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,wBAAwB,EAAE,CAAC;gBACvD,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9B,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC7C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,0OAA0O;IAC1O,KAAK,CAAC,2BAA2B;QAC/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACzF,CAAC;IAED;;;;;;;OAOG;IACO,KAAK,CAAC,2BAA2B;QACzC,MAAM,MAAM,GAA0B,EAAE,CAAC;QAEzC,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,uOAAuO;IAC/N,gBAAgB,CAAC,IAA6B;QACpD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACxB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,gBAAgB,GAAG,QAAQ,EAAE,IAAI;YACrC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrD,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAChC,2EAA2E;QAC3E,MAAM,YAAY,GAChB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;YAClC,mBAAmB,CAAC,OAAO,CAAC;gBAC1B,MAAM;gBACN,SAAS,EAAE,gBAAgB;gBAC3B,OAAO,EAAE,QAAQ,EAAE,OAAO;aAC3B,CAAC,CAAC,GAAG,CAAC;QACT,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;iBAC1B,UAAU,CAAC,CAAC,SAAS,EAAE,EAAE;gBACxB,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAyC;oBACrE,GAAG,EAAE,YAAY;iBAClB,CAAC,CAAC;gBACH,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,CAAC,CAAC;iBACD,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,6BAA6B,CAAC;YAClC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI;YACpC,WAAW,EAAE,mCAAmC;YAChD,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;YAClF,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACO,KAAK,CAAC,gBAAgB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACxF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,IAAI,MAAM,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE3D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAc,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;oBACvB,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;oBAChD,SAAS;gBACX,CAAC;gBAED,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnC,MAAM,WAAW,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5F,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC3C,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;oBAC1E,SAAS;gBACX,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC7E,SAAS;YACX,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;CACF","sourcesContent":["import type { TBindingNamespace } from '@/common/bindings';\nimport { ArtifactNamespaces, BindingNamespaces, CoreBindings } from '@/common/bindings';\nimport type { Binding, TBindingScope } from '@/helpers/inversion';\nimport { BindingScopes, MetadataRegistry } from '@/helpers/inversion';\nimport { assertBindingsResolve } from '@venizia/ignis-inversion';\nimport { OpenAPIHono } from '@hono/zod-openapi';\nimport type { AnyType, IConfigurable, TClass, ValueOrPromise } from '@venizia/ignis-helpers/common';\nimport {\n executeWithPerformanceMeasure,\n getError,\n RequestIdGenerator,\n RetryHelper,\n} from '@venizia/ignis-helpers/core';\nimport type { Env, Schema } from 'hono';\nimport { showRoutes as showApplicationRoutes } from 'hono/dev';\nimport { bodyLimit } from 'hono/body-limit';\nimport { requestId } from 'hono/request-id';\nimport type { BaseComponent } from '../components';\nimport { ArtifactBindingKeys } from '../metadata/artifact-keys';\nimport { RestComponent } from '../components/controller/rest/rest.component';\nimport type { BaseConfiguration } from '../configurations';\nimport { ControllerTransports } from '../controllers/common/constants';\nimport type { IDataSource } from '../datasources';\nimport { BaseAppErrorMiddleware } from '../middlewares/app-error/app-error.middleware';\nimport { RequestErrors } from '../middlewares/common/errors';\nimport { notFoundHandler } from '../middlewares/not-found/not-found.middleware';\nimport type { TMixinOpts } from '../mixins/common';\nimport type { IRepository } from '../repositories';\nimport type { IService } from '../services';\nimport { AbstractApplication } from './abstract';\nimport { registerCors } from './cors';\nimport { ArtifactIndexHelper } from './artifact-index';\nimport type { IBootSequenceStep } from './boot-sequence';\nimport { BootSteps } from './boot-sequence';\nimport type { IApplicationConfigs, IBodyLimitOptions, TArtifactIndexInput } from './common';\n\ninterface IRegisterDynamicBindingsOptions<T extends IConfigurable = IConfigurable> {\n namespace: TBindingNamespace;\n\n onBeforeConfigure?: (opts: { binding: Binding<T> }) => Promise<void>;\n onAfterConfigure?: (opts: { binding: Binding<T>; instance: T }) => Promise<void>;\n}\n\n/** Adds the `OpenAPIHono` router surface on top of `AbstractApplication` - no listening server, so this is the layer a browser Worker or gRPC-only host can extend without pulling in `Bun.serve`. */\nexport abstract class RestApplication<\n AppEnv extends Env = Env,\n AppSchema extends Schema = {},\n BasePath extends string = '/',\n> extends AbstractApplication {\n private registeredBindings: Record<string, Set<string>> = {};\n private artifactOptions = new Map<string, object>();\n\n /** The router, and nothing else. What runtime is underneath and what socket is bound are `ServerApplication`'s to know - a browser Worker has neither, and carrying the union here made `RuntimeModules.detect()` answer `'node'` inside a Worker. */\n protected server: { hono: OpenAPIHono<AppEnv, AppSchema, BasePath> };\n\n protected rootRouter: OpenAPIHono<AppEnv, AppSchema, BasePath>;\n protected readonly requestIdGenerator: RequestIdGenerator;\n\n /** A copy of the `bodyLimit` the default stack installed, absent until `registerDefaultMiddlewares()` ran. */\n private installedBodyLimit?: { options?: IBodyLimitOptions };\n\n constructor(opts: { scope: string; config: IApplicationConfigs }) {\n super(opts);\n\n // A config built from the environment can lose `path.base` at run time; the router would only fail later, inside `route()`, with a message that names nothing.\n if (typeof this.configs.path?.base !== 'string') {\n throw getError({\n message: `[${opts.scope}] configs.path.base must be a string | value: ${String(this.configs.path?.base)} | an empty string mounts the application at the root`,\n });\n }\n\n // The index signature accepts any key, so a leftover `strictPath` would compile and be ignored.\n if (this.configs.strictPath !== undefined) {\n throw getError({\n message: `[${opts.scope}] configs.strictPath was removed | value: ${String(this.configs.strictPath)} | Use configs.path.isStrict`,\n });\n }\n\n this.requestIdGenerator = new RequestIdGenerator({ scope: opts.scope });\n\n const strict = this.configs.path.isStrict ?? true;\n const honoServer = new OpenAPIHono<AppEnv, AppSchema, BasePath>({ strict });\n this.rootRouter = new OpenAPIHono({ strict });\n\n this.server = { hono: honoServer };\n }\n\n getRootRouter(): OpenAPIHono<AppEnv, AppSchema, BasePath> {\n return this.rootRouter;\n }\n\n getServer(): OpenAPIHono<AppEnv, AppSchema, BasePath> {\n return this.server.hono;\n }\n\n protected override registerCoreBindings() {\n super.registerCoreBindings();\n\n this.bind<typeof this.server>({\n key: CoreBindings.APPLICATION_SERVER,\n }).toProvider((_) => this.server);\n this.bind<typeof this.rootRouter>({\n key: CoreBindings.APPLICATION_ROOT_ROUTER,\n }).toProvider((_) => this.rootRouter);\n }\n\n /** The correlation id every host stamps - see {@link RequestIdGenerator} for why `crypto.randomUUID` is refused. */\n protected generateRequestId(): string {\n return this.requestIdGenerator.nextId();\n }\n\n /** The error handler the default stack installs. `@venizia/ignis` overrides it to swap in the `ErrorPrettier`-backed formatter, which reaches `node:util` and so cannot live here. */\n protected buildErrorMiddleware(): BaseAppErrorMiddleware {\n const environment = this.configs.error?.environment;\n\n return new BaseAppErrorMiddleware({\n logger: this.logger,\n rootKey: this.configs.error?.rootKey ?? undefined,\n // Spread, not `environment: () => environment`: the option's PRESENCE is what claims this host\n // has an ambient environment at all, so an unset config must leave it absent.\n ...(environment === undefined ? {} : { environment: () => environment }),\n });\n }\n\n /**\n * The three registrations every host needs: request id, error envelope, JSON 404 - without them a\n * thrown `ApplicationError` is a generic 500, a 404 is `text/plain`, and no response carries a request id.\n * Registered before `initialize()`, so an application's own handlers still win.\n */\n protected registerDefaultMiddlewares(): ValueOrPromise<void> {\n const server = this.getServer();\n\n // First of all, so every response the framework produces on its own - a bodyLimit 413, a body the\n // request spy cannot parse, the error envelope - leaves with the headers a browser needs to read it.\n registerCors({ server, options: this.configs.middlewares?.cors });\n\n server.use(requestId({ generator: () => this.generateRequestId() }));\n\n // Ahead of every middleware a host adds after this one, so none of them buffers a body over it.\n const bodyLimitOptions = this.configs.middlewares?.bodyLimit;\n this.installedBodyLimit = { options: this.toInstalledBodyLimit({ options: bodyLimitOptions }) };\n\n if (bodyLimitOptions && bodyLimitOptions.enable !== false) {\n const { maxSize, path, onError } = bodyLimitOptions;\n\n if (typeof maxSize !== 'number' || !Number.isFinite(maxSize) || maxSize < 0) {\n throw getError({\n message: `[registerDefaultMiddlewares] configs.middlewares.bodyLimit.maxSize must be a non-negative number of bytes | value: ${String(maxSize)}`,\n });\n }\n\n const limiter = bodyLimit({\n maxSize,\n onError:\n onError ??\n (() => {\n throw getError({\n error: RequestErrors.BODY_TOO_LARGE,\n message: `Request body exceeds the maximum of ${maxSize} bytes`,\n });\n }),\n });\n\n if (path) {\n server.use(path, limiter);\n } else {\n server.use(limiter);\n }\n }\n\n server.onError(this.buildErrorMiddleware().value());\n server.notFound(notFoundHandler({ logger: this.logger }));\n }\n\n /** What a `bodyLimit` config installs: nothing when absent or disabled, else a copy, so a later in-place edit shows. */\n private toInstalledBodyLimit(opts: {\n options?: IBodyLimitOptions;\n }): IBodyLimitOptions | undefined {\n const { options } = opts;\n\n if (!options || options.enable === false) {\n return undefined;\n }\n\n return { ...options };\n }\n\n private isSameBodyLimit(opts: { left?: IBodyLimitOptions; right?: IBodyLimitOptions }): boolean {\n const { left, right } = opts;\n\n if (!left || !right) {\n return left === right;\n }\n\n const keys = new Set([...Object.keys(left), ...Object.keys(right)]);\n for (const key of keys) {\n if (!Object.is(left[key], right[key])) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * `configs.middlewares` is read by `registerDefaultMiddlewares()`, which runs before `staticConfigure()`.\n * A limit assigned in a boot hook would read back as configured while every request ran unlimited.\n */\n private assertBodyLimitUnchanged(opts: { step: string }): void {\n if (!this.installedBodyLimit) {\n return;\n }\n\n const installed = this.installedBodyLimit.options;\n const current = this.toInstalledBodyLimit({ options: this.configs.middlewares?.bodyLimit });\n\n if (this.isSameBodyLimit({ left: installed, right: current })) {\n return;\n }\n\n throw getError({\n message: `[${opts.step}] configs.middlewares.bodyLimit changed after registerDefaultMiddlewares() installed it | installed maxSize: ${installed?.maxSize ?? 'none'} | now maxSize: ${current?.maxSize ?? 'none'} | Pass it through the constructor config: new Application({ config: { middlewares: { bodyLimit } } })`,\n });\n }\n\n /**\n * The artifact order, stated once: datasources before the repositories that auto-resolve them,\n * components before the controllers they may contribute. `BaseApplication` splices its server-only\n * steps around these by name instead of rewriting the list.\n */\n protected getBootSequence(): IBootSequenceStep[] {\n return [\n {\n name: BootSteps.STATIC_CONFIGURE,\n run: async () => {\n // Declared `void`, but an override may be async; the step has always waited on it.\n await Promise.resolve(this.staticConfigure());\n this.assertBodyLimitUnchanged({ step: BootSteps.STATIC_CONFIGURE });\n },\n },\n { name: BootSteps.REGISTER_ARTIFACTS, run: () => this.registerConfiguredArtifacts() },\n {\n name: BootSteps.PRE_CONFIGURE,\n run: async () => {\n await this.runApplicationHook({\n name: BootSteps.PRE_CONFIGURE,\n hook: () => this.preConfigure(),\n });\n this.assertBodyLimitUnchanged({ step: BootSteps.PRE_CONFIGURE });\n },\n },\n {\n name: BootSteps.REGISTER_CONFIGURATIONS,\n run: () => this.registerConfigurations(),\n },\n { name: BootSteps.REGISTER_DATA_SOURCES, run: () => this.registerDataSources() },\n { name: BootSteps.REGISTER_COMPONENTS, run: () => this.registerComponents() },\n {\n name: BootSteps.REGISTER_CONTRIBUTED_DATA_SOURCES,\n run: () => this.registerContributedDataSources(),\n },\n { name: BootSteps.REGISTER_CONTROLLERS, run: () => this.registerControllers() },\n {\n name: BootSteps.POST_CONFIGURE,\n run: () =>\n this.runApplicationHook({\n name: BootSteps.POST_CONFIGURE,\n hook: () => this.postConfigure(),\n }),\n },\n { name: BootSteps.VERIFY_BINDINGS, run: () => this.verifyBindings() },\n ];\n }\n\n async initialize(): Promise<void> {\n await this.runBootSequence({ steps: this.getBootSequence() });\n }\n\n /** The application hook currently running, so `registerArtifact` can tell a hand registration inside `preConfigure`/`postConfigure` from one the index step made. */\n private runningApplicationHook: string | undefined;\n\n private async runApplicationHook(opts: {\n name: string;\n hook: () => ValueOrPromise<void>;\n }): Promise<void> {\n this.runningApplicationHook = opts.name;\n try {\n await opts.hook();\n } finally {\n this.runningApplicationHook = undefined;\n }\n }\n\n /**\n * Bound keys carrying one of `tags` that nothing has resolved since the counts were last reset.\n * The counter answers \"who was read\", never \"who is dead\" - an unread binding may be an\n * allow-list entry or a technical floor, and only the application can tell those apart.\n *\n * Counting is off by default. Call `startResolutionCounting()` after `initialize()` and run the\n * traffic that exercises the application, then read this.\n */\n getUnresolvedBindings(opts?: { tags?: string[] }): string[] {\n if (!this.hasStartedResolutionCounting) {\n throw getError({\n message: `[${this.getUnresolvedBindings.name}] Resolution counting never started | Call startResolutionCounting() after initialize(), run the traffic that exercises the application, then read this - without it every binding would be reported unresolved`,\n });\n }\n\n const tags = opts?.tags ?? [BindingNamespaces.SERVICE, BindingNamespaces.REPOSITORY];\n const counts = this.getResolutionCounts();\n const unresolved: string[] = [];\n\n for (const tag of tags) {\n const bindings = this.findByTag({ tag });\n for (const binding of bindings) {\n if (counts.has(binding.key)) {\n continue;\n }\n\n unresolved.push(binding.key);\n }\n }\n\n return unresolved;\n }\n\n /** `bootChecks.binding.doVerify`: resolve every service and repository once, collect every failure, throw once with the whole list - a made-up `@inject` key or a dependency a `when` excluded then fails the boot, not the first request. */\n protected verifyBindings(): void {\n if (!this.configs.bootChecks?.binding?.doVerify) {\n return;\n }\n\n const logger = this.logger.for(this.verifyBindings.name);\n const { verified } = assertBindingsResolve({\n container: this,\n namespaces: [BindingNamespaces.SERVICE, BindingNamespaces.REPOSITORY],\n scope: this.verifyBindings.name,\n });\n\n logger.info('Every service and repository binding resolves | verified: %d', verified.length);\n }\n\n /** One measured log line per step, and a failure names its step before rethrowing, so a hung or failed boot is attributable without reading the sequence. */\n protected async runBootSequence(opts: { steps: IBootSequenceStep[] }): Promise<void> {\n const { steps } = opts;\n const logger = this.logger.for(this.initialize.name);\n const t = performance.now();\n\n const stepsEntries = steps.entries();\n for (const [index, step] of stepsEntries) {\n try {\n await executeWithPerformanceMeasure({\n logger: this.logger,\n scope: this.initialize.name,\n description: `Boot step ${index + 1}/${steps.length} ${step.name}`,\n task: () => step.run(),\n });\n } catch (error) {\n logger.error(\n 'Boot step failed | step: %s (%d/%d) | error: %s',\n step.name,\n index + 1,\n steps.length,\n error,\n );\n throw error;\n }\n }\n\n logger.info(\n 'Boot sequence complete | %d step(s) | Took: %s (ms) | %s',\n steps.length,\n performance.now() - t,\n steps.map((step) => step.name).join(' -> '),\n );\n }\n\n protected inspectRoutes() {\n const t = performance.now();\n const shouldShowRoutes = this.configs?.debug?.shouldShowRoutes ?? false;\n\n if (!shouldShowRoutes) {\n return;\n }\n\n this.logger.for(this.inspectRoutes.name).info('START | Inspect all application route(s)');\n showApplicationRoutes(this.getServer());\n this.logger\n .for(this.inspectRoutes.name)\n .info('DONE | Inspect all application route(s) | Took: %s (ms)', performance.now() - t);\n }\n\n /**\n * `configured` is the drain's state, mutated in place: a fresh `Set` gives a one-shot complete\n * drain (`RestComponent`); `registerDynamicBindings` passes its persistent per-namespace `Set`,\n * which is why a second sweep touches only what the first one missed.\n */\n async drainByTag<T>(opts: {\n tag: string;\n configured: Set<string>;\n onEach: (opts: { binding: Binding<T> }) => Promise<void>;\n }): Promise<void> {\n const { tag, configured, onEach } = opts;\n\n // A whole batch is drained before re-scanning: the re-scan exists only to pick up bindings a\n // `configure()` added, and asking after every single item makes boot N+1 full scans of the\n // binding map - 3.5ms at 200 controllers, against 0.04ms for this shape.\n let bindings = this.findByTag<T>({ tag, exclude: configured });\n\n while (bindings.length > 0) {\n for (const binding of bindings) {\n // Within a batch a nested `configure()` may already have taken this one.\n if (configured.has(binding.key)) {\n continue;\n }\n\n await onEach({ binding });\n configured.add(binding.key);\n }\n\n // Re-fetch excluding already configured - picks up dynamically added bindings\n bindings = this.findByTag<T>({ tag, exclude: configured });\n }\n }\n\n protected async registerDynamicBindings<T extends IConfigurable = IConfigurable>(\n opts: IRegisterDynamicBindingsOptions<T>,\n ): Promise<void> {\n const logger = this.logger.for(this.registerDynamicBindings.name);\n const { namespace, onBeforeConfigure, onAfterConfigure } = opts;\n\n if (!this.registeredBindings[namespace]) {\n this.registeredBindings[namespace] = new Set<string>();\n }\n const configured = this.registeredBindings[namespace];\n\n await this.drainByTag<T>({\n tag: namespace,\n configured,\n onEach: async ({ binding }) => {\n if (onBeforeConfigure) {\n await onBeforeConfigure({ binding });\n }\n\n const instance = this.get<T>({ key: binding.key, isOptional: false });\n if (!instance) {\n logger.debug('No binding instance | namespace: %s | key: %s', namespace, binding.key);\n return;\n }\n\n if (typeof (instance as Partial<IConfigurable>)?.configure === 'function') {\n const options = this.artifactOptions.get(binding.key);\n await (instance as IConfigurable).configure(options);\n }\n\n // Marked before the after-hook runs, so the hook sees its own binding as configured.\n configured.add(binding.key);\n\n if (onAfterConfigure) {\n await onAfterConfigure({ binding, instance });\n }\n },\n });\n }\n\n /** The same-key guard behind every artifact registration (`component`/`controller`/`service`/`repository`/`dataSource`). `allowOverride` defaults true to match `bind()`'s overwrite behavior; `allowOverride: false` on one registration, or `bootChecks.binding.allowOverride: false` for the whole application, opts into strict mode. */\n protected assertNoBindingCollision(opts: {\n key: string;\n allowOverride?: boolean;\n caller: string;\n }): void {\n const { key, caller } = opts;\n const allowOverride =\n opts.allowOverride ?? this.configs.bootChecks?.binding?.allowOverride ?? true;\n\n if (allowOverride || !this.isBound({ key })) {\n return;\n }\n\n const reason =\n opts.allowOverride === false\n ? `'allowOverride: false' was set and this key collides with an existing binding | Use a distinct 'opts.binding' key, or drop 'allowOverride: false' if overriding is intentional`\n : `'bootChecks.binding.allowOverride' is false and this key collides with an existing binding | Use a distinct 'opts.binding' key, or set 'allowOverride: true' on this registration if overriding is intentional`;\n\n throw getError({\n message: `[${caller}] Binding key already registered: '${key}' | ${reason}`,\n });\n }\n\n /** Resolution order for every registration: explicit `opts` > the class's `@injectable` defaults > the derived key and the kind's default scope. `order` and `when` are `registerArtifacts`' concern, not this one. */\n private registerArtifact<Base>(opts: {\n target: TClass<Base>;\n namespace: TBindingNamespace;\n defaultScope: TBindingScope;\n caller: string;\n opts?: TMixinOpts;\n }): Binding<Base> {\n const { target, namespace, defaultScope, caller } = opts;\n const declared = MetadataRegistry.getInstance().getArtifactMetadata({ target });\n\n if (\n this.runningApplicationHook &&\n this.configs.artifacts &&\n this.configs.bootChecks?.binding?.allowManual === false\n ) {\n throw getError({\n message: `[${caller}] '${target.name}' is registered by hand inside ${this.runningApplicationHook}() while 'configs.artifacts' is set and 'bootChecks.binding.allowManual' is false | Move the class into the generated index (or an explicit entry of 'configs.artifacts'), or allow manual registration`,\n });\n }\n\n const pinned = opts.opts?.binding ?? declared?.binding;\n BindingNamespaces.assertArtifactNamespace({\n namespace: pinned?.namespace ?? namespace,\n artifact: target.name,\n caller,\n });\n\n const { key } = ArtifactBindingKeys.resolve({ target, namespace, binding: pinned });\n\n // What `@inject({ target })` reads back. Only here knows the call site's `binding`, and a\n // class registered by hand has no stereotype metadata to derive one from.\n MetadataRegistry.getInstance().setBindingKey({ target, key });\n\n if (opts.opts?.options !== undefined) {\n this.artifactOptions.set(key, opts.opts.options);\n }\n\n this.assertNoBindingCollision({\n key,\n allowOverride: opts.opts?.allowOverride ?? declared?.allowOverride,\n caller,\n });\n\n return this.bind<Base>({ key })\n .toClass(target)\n .setScope(declared?.scope ?? defaultScope);\n }\n\n configuration<Base extends BaseConfiguration<Options>, Options extends object = {}>(\n target: TClass<Base>,\n opts?: TMixinOpts<Options>,\n ): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.CONFIGURATION,\n defaultScope: BindingScopes.SINGLETON,\n caller: this.configuration.name,\n opts,\n });\n }\n\n async registerConfigurations(): Promise<void> {\n await executeWithPerformanceMeasure({\n logger: this.logger,\n scope: this.registerConfigurations.name,\n description: 'Register application configurations',\n task: async () => {\n await this.registerDynamicBindings({ namespace: BindingNamespaces.CONFIGURATION });\n },\n });\n }\n\n component<Base extends BaseComponent<Options>, Options extends object = {}>(\n target: TClass<Base>,\n opts?: TMixinOpts<Options>,\n ): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.COMPONENT,\n defaultScope: BindingScopes.SINGLETON,\n caller: this.component.name,\n opts,\n });\n }\n\n async registerComponents(): Promise<void> {\n await executeWithPerformanceMeasure({\n logger: this.logger,\n scope: this.registerComponents.name,\n description: 'Register application components',\n task: async () => {\n await this.registerDynamicBindings({ namespace: BindingNamespaces.COMPONENT });\n },\n });\n }\n\n /**\n * Second DATASOURCE sweep, for datasources components contributed at any depth. Calls\n * `registerDynamicBindings` directly: `this.registerDataSources()` is polymorphic and an override\n * would run twice. Runs after every component, so a component a datasource registers is never configured.\n */\n async registerContributedDataSources(): Promise<void> {\n await executeWithPerformanceMeasure({\n logger: this.logger,\n scope: this.registerContributedDataSources.name,\n description: 'Register application contributed data sources',\n task: async () => {\n await this.registerDynamicBindings({ namespace: BindingNamespaces.DATASOURCE });\n },\n });\n }\n\n /** REST only - the kernel has no gRPC (it reaches `node:module`). `BaseApplication` adds the gRPC branch on top. */\n async registerControllers(): Promise<void> {\n await executeWithPerformanceMeasure({\n logger: this.logger,\n description: 'Register application REST controllers',\n scope: this.registerControllers.name,\n task: async () => {\n const transports = this.configs.transports ?? [ControllerTransports.REST];\n if (!transports.includes(ControllerTransports.REST)) {\n return;\n }\n\n const restComponent = new RestComponent(this);\n await restComponent.configure();\n },\n });\n }\n\n /** SINGLETON like `component()`: `RestComponent` mounts the one instance it resolves, so a second resolution must be that instance, not an unmounted twin. */\n controller<Base>(target: TClass<Base>, opts?: TMixinOpts): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.CONTROLLER,\n defaultScope: BindingScopes.SINGLETON,\n caller: this.controller.name,\n opts,\n });\n }\n\n service<Base extends IService>(target: TClass<Base>, opts?: TMixinOpts): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.SERVICE,\n defaultScope: BindingScopes.TRANSIENT,\n caller: this.service.name,\n opts,\n });\n }\n\n repository<Base extends IRepository>(target: TClass<Base>, opts?: TMixinOpts): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.REPOSITORY,\n defaultScope: BindingScopes.TRANSIENT,\n caller: this.repository.name,\n opts,\n });\n }\n\n dataSource<Base extends IDataSource<Options>, Options extends object = {}>(\n target: TClass<Base>,\n opts?: TMixinOpts<Options>,\n ): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.DATASOURCE,\n defaultScope: BindingScopes.SINGLETON,\n caller: this.dataSource.name,\n opts,\n });\n }\n\n /** The boot step body behind `configs.artifacts`, also callable by hand: registers every kind in dependency order across the given indexes. */\n async registerArtifacts(index: TArtifactIndexInput): Promise<void> {\n const resolved = await ArtifactIndexHelper.getInstance().resolve({\n input: index,\n application: this,\n });\n\n const registry = MetadataRegistry.getInstance();\n const kinds: Array<[ReadonlyArray<TClass<AnyType>>, TBindingNamespace]> = [\n [resolved.configurations, BindingNamespaces.CONFIGURATION],\n [resolved.dataSources, BindingNamespaces.DATASOURCE],\n [resolved.components, BindingNamespaces.COMPONENT],\n [resolved.repositories, BindingNamespaces.REPOSITORY],\n [resolved.services, BindingNamespaces.SERVICE],\n [resolved.controllers, BindingNamespaces.CONTROLLER],\n ];\n const collisions = ArtifactBindingKeys.findDerivedCollisions({\n entries: kinds.flatMap(([targets, namespace]) =>\n targets.map((target) => ({\n target,\n namespace,\n binding: registry.getArtifactMetadata({ target })?.binding,\n })),\n ),\n });\n\n for (const key of collisions) {\n const message = ArtifactBindingKeys.describeCollision({ key, caller: 'registerArtifacts' });\n\n if (!this.configs.bootChecks?.allowDerivedKeyCollision) {\n throw getError({ message });\n }\n\n this.logger.warn('%s', message);\n }\n\n for (const target of resolved.configurations) {\n this.configuration(target);\n this.bindProvidedKeys({ target });\n }\n\n for (const target of resolved.dataSources) {\n this.dataSource(target);\n }\n\n for (const target of resolved.components) {\n this.component(target);\n this.bindProvidedKeys({ target });\n }\n\n for (const target of resolved.repositories) {\n this.repository(target);\n }\n\n for (const target of resolved.services) {\n this.service(target);\n }\n\n for (const target of resolved.controllers) {\n this.controller(target);\n }\n }\n\n /** Registers every class a stereotype decorated, with no `configs.artifacts` entry anywhere. `when` and `order` apply exactly as they do to a declared index - which is how one process running several applications keeps them apart. */\n async registerDiscoveredArtifacts(): Promise<void> {\n await this.registerArtifacts(ArtifactIndexHelper.getInstance().buildDiscoveredIndex());\n }\n\n /**\n * The artifact boot step. `configs.discoverArtifacts` adds every decorated class in the import\n * graph; `configs.artifacts` adds exactly what it lists. Both together register the union.\n *\n * An absent `artifacts` still registers nothing. Reading it as \"register everything\" would change\n * what an existing application boots with, silently, and the failure would surface as ten times\n * the bindings rather than as an error.\n */\n protected async registerConfiguredArtifacts(): Promise<void> {\n const inputs: TArtifactIndexInput[] = [];\n\n if (this.configs.discoverArtifacts) {\n inputs.push(ArtifactIndexHelper.getInstance().buildDiscoveredIndex());\n }\n\n if (this.configs.artifacts) {\n inputs.push(this.configs.artifacts);\n }\n\n if (inputs.length === 0) {\n return;\n }\n\n await this.registerArtifacts(inputs);\n }\n\n /** Each `@provide` method becomes a lazy provider: the component is resolved (SINGLETON) and the method called on first `get`, so a provided value may depend on datasources or secrets that do not exist yet at registration time. */\n private bindProvidedKeys(opts: { target: TClass<any> }): void {\n const { target } = opts;\n const registry = MetadataRegistry.getInstance();\n const provides = registry.getProvideMetadata({ target });\n if (provides.length === 0) {\n return;\n }\n\n const declared = registry.getArtifactMetadata({ target });\n const defaultNamespace = declared?.type\n ? ArtifactNamespaces.resolve({ type: declared.type })\n : BindingNamespaces.COMPONENT;\n // The key the registration actually bound - a call-site override included.\n const componentKey =\n registry.getBindingKey({ target }) ??\n ArtifactBindingKeys.resolve({\n target,\n namespace: defaultNamespace,\n binding: declared?.binding,\n }).key;\n for (const entry of provides) {\n this.bind({ key: entry.key })\n .toProvider((container) => {\n const instance = container.get<Record<string | symbol, () => unknown>>({\n key: componentKey,\n });\n return instance[entry.methodName]();\n })\n .setScope(entry.scope ?? BindingScopes.SINGLETON);\n }\n }\n\n async registerDataSources(): Promise<void> {\n await executeWithPerformanceMeasure({\n logger: this.logger,\n scope: this.registerDataSources.name,\n description: 'Register application data sources',\n task: async () => {\n await this.registerDynamicBindings({ namespace: BindingNamespaces.DATASOURCE });\n },\n });\n }\n\n /**\n * Closes every datasource the boot configured, so a stopped application holds no pool, socket or\n * WASM instance. A failure, or a `close()` still pending after `dataSourceCloseTimeoutMs`, is logged\n * and never stops the rest. A datasource configured by hand is closed by whoever configured it.\n */\n protected async closeDataSources(): Promise<void> {\n const keys = this.registeredBindings[BindingNamespaces.DATASOURCE] ?? new Set<string>();\n const timeoutMs = this.configs.dataSourceCloseTimeoutMs ?? 10_000;\n const logger = this.logger.for(this.closeDataSources.name);\n\n for (const key of keys) {\n try {\n const dataSource = this.get<IDataSource>({ key, isOptional: true });\n if (!dataSource?.close) {\n logger.debug('Nothing to close | key: %s', key);\n continue;\n }\n\n const closing = dataSource.close();\n await RetryHelper.runWithTimeout({ operation: key, timeoutMs, execution: () => closing });\n } catch (error) {\n if (RetryHelper.isRetryTimeoutError(error)) {\n logger.error('Close timed out | key: %s | timeoutMs: %d', key, timeoutMs);\n continue;\n }\n\n logger.error('Failed to close datasource | key: %s | error: %s', key, error);\n continue;\n }\n\n logger.info('Closed datasource | key: %s', key);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../../src/base/applications/rest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TBindingNamespace } from '@/common/bindings';\nimport { ArtifactNamespaces, BindingNamespaces, CoreBindings } from '@/common/bindings';\nimport type { Binding, TBindingScope } from '@/helpers/inversion';\nimport { BindingScopes, MetadataRegistry } from '@/helpers/inversion';\nimport { BindingVerifier } from '@venizia/ignis-inversion';\nimport { OpenAPIHono } from '@hono/zod-openapi';\nimport type { AnyType, IConfigurable, TClass, ValueOrPromise } from '@venizia/ignis-helpers/common';\nimport {\n PerformanceUtility,\n getError,\n RequestIdGenerator,\n RetryHelper,\n} from '@venizia/ignis-helpers/core';\nimport type { Env, Schema } from 'hono';\nimport { showRoutes as showApplicationRoutes } from 'hono/dev';\nimport { bodyLimit } from 'hono/body-limit';\nimport { requestId } from 'hono/request-id';\nimport type { BaseComponent } from '../components';\nimport { ArtifactBindingKeys } from '../metadata/artifact-keys';\nimport { RestComponent } from '../components/controller/rest/rest.component';\nimport type { BaseConfiguration } from '../configurations';\nimport { ControllerTransports } from '../controllers/common/constants';\nimport type { IDataSource } from '../datasources';\nimport { BaseAppErrorMiddleware } from '../middlewares/app-error/app-error.middleware';\nimport { RequestErrors } from '../middlewares/common/errors';\nimport { notFoundHandler } from '../middlewares/not-found/not-found.middleware';\nimport type { TMixinOpts } from '../mixins/common';\nimport type { IRepository } from '../repositories';\nimport type { IService } from '../services';\nimport { AbstractApplication } from './abstract';\nimport { CorsUtility } from './cors';\nimport { ArtifactIndexHelper } from './artifact-index';\nimport type { IBootSequenceStep } from './boot-sequence';\nimport { BootSteps } from './boot-sequence';\nimport type { IApplicationConfigs, IBodyLimitOptions, TArtifactIndexInput } from './common';\n\ninterface IRegisterDynamicBindingsOptions<T extends IConfigurable = IConfigurable> {\n namespace: TBindingNamespace;\n\n onBeforeConfigure?: (opts: { binding: Binding<T> }) => Promise<void>;\n onAfterConfigure?: (opts: { binding: Binding<T>; instance: T }) => Promise<void>;\n}\n\n/** Adds the `OpenAPIHono` router surface on top of `AbstractApplication` - no listening server, so this is the layer a browser Worker or gRPC-only host can extend without pulling in `Bun.serve`. */\nexport abstract class RestApplication<\n AppEnv extends Env = Env,\n AppSchema extends Schema = {},\n BasePath extends string = '/',\n> extends AbstractApplication {\n private registeredBindings: Record<string, Set<string>> = {};\n private artifactOptions = new Map<string, object>();\n\n /** The router, and nothing else. What runtime is underneath and what socket is bound are `ServerApplication`'s to know - a browser Worker has neither, and carrying the union here made `RuntimeModules.detect()` answer `'node'` inside a Worker. */\n protected server: { hono: OpenAPIHono<AppEnv, AppSchema, BasePath> };\n\n protected rootRouter: OpenAPIHono<AppEnv, AppSchema, BasePath>;\n protected readonly requestIdGenerator: RequestIdGenerator;\n\n /** A copy of the `bodyLimit` the default stack installed, absent until `registerDefaultMiddlewares()` ran. */\n private installedBodyLimit?: { options?: IBodyLimitOptions };\n\n constructor(opts: { scope: string; config: IApplicationConfigs }) {\n super(opts);\n\n // A config built from the environment can lose `path.base` at run time; the router would only fail later, inside `route()`, with a message that names nothing.\n if (typeof this.configs.path?.base !== 'string') {\n throw getError({\n message: `[${opts.scope}] configs.path.base must be a string | value: ${String(this.configs.path?.base)} | an empty string mounts the application at the root`,\n });\n }\n\n // The index signature accepts any key, so a leftover `strictPath` would compile and be ignored.\n if (this.configs.strictPath !== undefined) {\n throw getError({\n message: `[${opts.scope}] configs.strictPath was removed | value: ${String(this.configs.strictPath)} | Use configs.path.isStrict`,\n });\n }\n\n this.requestIdGenerator = new RequestIdGenerator({ scope: opts.scope });\n\n const strict = this.configs.path.isStrict ?? true;\n const honoServer = new OpenAPIHono<AppEnv, AppSchema, BasePath>({ strict });\n this.rootRouter = new OpenAPIHono({ strict });\n\n this.server = { hono: honoServer };\n }\n\n getRootRouter(): OpenAPIHono<AppEnv, AppSchema, BasePath> {\n return this.rootRouter;\n }\n\n getServer(): OpenAPIHono<AppEnv, AppSchema, BasePath> {\n return this.server.hono;\n }\n\n protected override registerCoreBindings() {\n super.registerCoreBindings();\n\n this.bind<typeof this.server>({\n key: CoreBindings.APPLICATION_SERVER,\n }).toProvider((_) => this.server);\n this.bind<typeof this.rootRouter>({\n key: CoreBindings.APPLICATION_ROOT_ROUTER,\n }).toProvider((_) => this.rootRouter);\n }\n\n /** The correlation id every host stamps - see {@link RequestIdGenerator} for why `crypto.randomUUID` is refused. */\n protected generateRequestId(): string {\n return this.requestIdGenerator.nextId();\n }\n\n /** The error handler the default stack installs. `@venizia/ignis` overrides it to swap in the `ErrorPrettier`-backed formatter, which reaches `node:util` and so cannot live here. */\n protected buildErrorMiddleware(): BaseAppErrorMiddleware {\n const environment = this.configs.error?.environment;\n\n return new BaseAppErrorMiddleware({\n logger: this.logger,\n rootKey: this.configs.error?.rootKey ?? undefined,\n // Spread, not `environment: () => environment`: the option's PRESENCE is what claims this host\n // has an ambient environment at all, so an unset config must leave it absent.\n ...(environment === undefined ? {} : { environment: () => environment }),\n });\n }\n\n /**\n * The three registrations every host needs: request id, error envelope, JSON 404 - without them a\n * thrown `ApplicationError` is a generic 500, a 404 is `text/plain`, and no response carries a request id.\n * Registered before `initialize()`, so an application's own handlers still win.\n */\n protected registerDefaultMiddlewares(): ValueOrPromise<void> {\n const server = this.getServer();\n\n // First of all, so every response the framework produces on its own - a bodyLimit 413, a body the\n // request spy cannot parse, the error envelope - leaves with the headers a browser needs to read it.\n CorsUtility.registerCors({ server, options: this.configs.middlewares?.cors });\n\n server.use(requestId({ generator: () => this.generateRequestId() }));\n\n // Ahead of every middleware a host adds after this one, so none of them buffers a body over it.\n const bodyLimitOptions = this.configs.middlewares?.bodyLimit;\n this.installedBodyLimit = { options: this.toInstalledBodyLimit({ options: bodyLimitOptions }) };\n\n if (bodyLimitOptions && bodyLimitOptions.enable !== false) {\n const { maxSize, path, onError } = bodyLimitOptions;\n\n if (typeof maxSize !== 'number' || !Number.isFinite(maxSize) || maxSize < 0) {\n throw getError({\n message: `[registerDefaultMiddlewares] configs.middlewares.bodyLimit.maxSize must be a non-negative number of bytes | value: ${String(maxSize)}`,\n });\n }\n\n const limiter = bodyLimit({\n maxSize,\n onError:\n onError ??\n (() => {\n throw getError({\n error: RequestErrors.BODY_TOO_LARGE,\n message: `Request body exceeds the maximum of ${maxSize} bytes`,\n });\n }),\n });\n\n if (path) {\n server.use(path, limiter);\n } else {\n server.use(limiter);\n }\n }\n\n server.onError(this.buildErrorMiddleware().value());\n server.notFound(notFoundHandler({ logger: this.logger }));\n }\n\n /** What a `bodyLimit` config installs: nothing when absent or disabled, else a copy, so a later in-place edit shows. */\n private toInstalledBodyLimit(opts: {\n options?: IBodyLimitOptions;\n }): IBodyLimitOptions | undefined {\n const { options } = opts;\n\n if (!options || options.enable === false) {\n return undefined;\n }\n\n return { ...options };\n }\n\n private isSameBodyLimit(opts: { left?: IBodyLimitOptions; right?: IBodyLimitOptions }): boolean {\n const { left, right } = opts;\n\n if (!left || !right) {\n return left === right;\n }\n\n const keys = new Set([...Object.keys(left), ...Object.keys(right)]);\n for (const key of keys) {\n if (!Object.is(left[key], right[key])) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * `configs.middlewares` is read by `registerDefaultMiddlewares()`, which runs before `staticConfigure()`.\n * A limit assigned in a boot hook would read back as configured while every request ran unlimited.\n */\n private assertBodyLimitUnchanged(opts: { step: string }): void {\n if (!this.installedBodyLimit) {\n return;\n }\n\n const installed = this.installedBodyLimit.options;\n const current = this.toInstalledBodyLimit({ options: this.configs.middlewares?.bodyLimit });\n\n if (this.isSameBodyLimit({ left: installed, right: current })) {\n return;\n }\n\n throw getError({\n message: `[${opts.step}] configs.middlewares.bodyLimit changed after registerDefaultMiddlewares() installed it | installed maxSize: ${installed?.maxSize ?? 'none'} | now maxSize: ${current?.maxSize ?? 'none'} | Pass it through the constructor config: new Application({ config: { middlewares: { bodyLimit } } })`,\n });\n }\n\n /**\n * The artifact order, stated once: datasources before the repositories that auto-resolve them,\n * components before the controllers they may contribute. `BaseApplication` splices its server-only\n * steps around these by name instead of rewriting the list.\n */\n protected getBootSequence(): IBootSequenceStep[] {\n return [\n {\n name: BootSteps.STATIC_CONFIGURE,\n run: async () => {\n // Declared `void`, but an override may be async; the step has always waited on it.\n await Promise.resolve(this.staticConfigure());\n this.assertBodyLimitUnchanged({ step: BootSteps.STATIC_CONFIGURE });\n },\n },\n { name: BootSteps.REGISTER_ARTIFACTS, run: () => this.registerConfiguredArtifacts() },\n {\n name: BootSteps.PRE_CONFIGURE,\n run: async () => {\n await this.runApplicationHook({\n name: BootSteps.PRE_CONFIGURE,\n hook: () => this.preConfigure(),\n });\n this.assertBodyLimitUnchanged({ step: BootSteps.PRE_CONFIGURE });\n },\n },\n {\n name: BootSteps.REGISTER_CONFIGURATIONS,\n run: () => this.registerConfigurations(),\n },\n { name: BootSteps.REGISTER_DATA_SOURCES, run: () => this.registerDataSources() },\n { name: BootSteps.REGISTER_COMPONENTS, run: () => this.registerComponents() },\n {\n name: BootSteps.REGISTER_CONTRIBUTED_DATA_SOURCES,\n run: () => this.registerContributedDataSources(),\n },\n { name: BootSteps.REGISTER_CONTROLLERS, run: () => this.registerControllers() },\n {\n name: BootSteps.POST_CONFIGURE,\n run: () =>\n this.runApplicationHook({\n name: BootSteps.POST_CONFIGURE,\n hook: () => this.postConfigure(),\n }),\n },\n { name: BootSteps.VERIFY_BINDINGS, run: () => this.verifyBindings() },\n ];\n }\n\n async initialize(): Promise<void> {\n await this.runBootSequence({ steps: this.getBootSequence() });\n }\n\n /** The application hook currently running, so `registerArtifact` can tell a hand registration inside `preConfigure`/`postConfigure` from one the index step made. */\n private runningApplicationHook: string | undefined;\n\n private async runApplicationHook(opts: {\n name: string;\n hook: () => ValueOrPromise<void>;\n }): Promise<void> {\n this.runningApplicationHook = opts.name;\n try {\n await opts.hook();\n } finally {\n this.runningApplicationHook = undefined;\n }\n }\n\n /**\n * Bound keys carrying one of `tags` that nothing has resolved since the counts were last reset.\n * The counter answers \"who was read\", never \"who is dead\" - an unread binding may be an\n * allow-list entry or a technical floor, and only the application can tell those apart.\n *\n * Counting is off by default. Call `startResolutionCounting()` after `initialize()` and run the\n * traffic that exercises the application, then read this.\n */\n getUnresolvedBindings(opts?: { tags?: string[] }): string[] {\n if (!this.hasStartedResolutionCounting) {\n throw getError({\n message: `[${this.getUnresolvedBindings.name}] Resolution counting never started | Call startResolutionCounting() after initialize(), run the traffic that exercises the application, then read this - without it every binding would be reported unresolved`,\n });\n }\n\n const tags = opts?.tags ?? [BindingNamespaces.SERVICE, BindingNamespaces.REPOSITORY];\n const counts = this.getResolutionCounts();\n const unresolved: string[] = [];\n\n for (const tag of tags) {\n const bindings = this.findByTag({ tag });\n for (const binding of bindings) {\n if (counts.has(binding.key)) {\n continue;\n }\n\n unresolved.push(binding.key);\n }\n }\n\n return unresolved;\n }\n\n /** `bootChecks.binding.doVerify`: resolve every service and repository once, collect every failure, throw once with the whole list - a made-up `@inject` key or a dependency a `when` excluded then fails the boot, not the first request. */\n protected verifyBindings(): void {\n if (!this.configs.bootChecks?.binding?.doVerify) {\n return;\n }\n\n const logger = this.logger.for(this.verifyBindings.name);\n const { verified } = BindingVerifier.assertResolve({\n container: this,\n namespaces: [BindingNamespaces.SERVICE, BindingNamespaces.REPOSITORY],\n scope: this.verifyBindings.name,\n });\n\n logger.info('Every service and repository binding resolves | verified: %d', verified.length);\n }\n\n /** One measured log line per step, and a failure names its step before rethrowing, so a hung or failed boot is attributable without reading the sequence. */\n protected async runBootSequence(opts: { steps: IBootSequenceStep[] }): Promise<void> {\n const { steps } = opts;\n const logger = this.logger.for(this.initialize.name);\n const t = performance.now();\n\n const stepsEntries = steps.entries();\n for (const [index, step] of stepsEntries) {\n try {\n await PerformanceUtility.executeWithMeasure({\n logger: this.logger,\n scope: this.initialize.name,\n description: `Boot step ${index + 1}/${steps.length} ${step.name}`,\n task: () => step.run(),\n });\n } catch (error) {\n logger.error(\n 'Boot step failed | step: %s (%d/%d) | error: %s',\n step.name,\n index + 1,\n steps.length,\n error,\n );\n throw error;\n }\n }\n\n logger.info(\n 'Boot sequence complete | %d step(s) | Took: %s (ms) | %s',\n steps.length,\n performance.now() - t,\n steps.map((step) => step.name).join(' -> '),\n );\n }\n\n protected inspectRoutes() {\n const t = performance.now();\n const shouldShowRoutes = this.configs?.debug?.shouldShowRoutes ?? false;\n\n if (!shouldShowRoutes) {\n return;\n }\n\n this.logger.for(this.inspectRoutes.name).info('START | Inspect all application route(s)');\n showApplicationRoutes(this.getServer());\n this.logger\n .for(this.inspectRoutes.name)\n .info('DONE | Inspect all application route(s) | Took: %s (ms)', performance.now() - t);\n }\n\n /**\n * `configured` is the drain's state, mutated in place: a fresh `Set` gives a one-shot complete\n * drain (`RestComponent`); `registerDynamicBindings` passes its persistent per-namespace `Set`,\n * which is why a second sweep touches only what the first one missed.\n */\n async drainByTag<T>(opts: {\n tag: string;\n configured: Set<string>;\n onEach: (opts: { binding: Binding<T> }) => Promise<void>;\n }): Promise<void> {\n const { tag, configured, onEach } = opts;\n\n // A whole batch is drained before re-scanning: the re-scan exists only to pick up bindings a\n // `configure()` added, and asking after every single item makes boot N+1 full scans of the\n // binding map - 3.5ms at 200 controllers, against 0.04ms for this shape.\n let bindings = this.findByTag<T>({ tag, exclude: configured });\n\n while (bindings.length > 0) {\n for (const binding of bindings) {\n // Within a batch a nested `configure()` may already have taken this one.\n if (configured.has(binding.key)) {\n continue;\n }\n\n await onEach({ binding });\n configured.add(binding.key);\n }\n\n // Re-fetch excluding already configured - picks up dynamically added bindings\n bindings = this.findByTag<T>({ tag, exclude: configured });\n }\n }\n\n protected async registerDynamicBindings<T extends IConfigurable = IConfigurable>(\n opts: IRegisterDynamicBindingsOptions<T>,\n ): Promise<void> {\n const logger = this.logger.for(this.registerDynamicBindings.name);\n const { namespace, onBeforeConfigure, onAfterConfigure } = opts;\n\n if (!this.registeredBindings[namespace]) {\n this.registeredBindings[namespace] = new Set<string>();\n }\n const configured = this.registeredBindings[namespace];\n\n await this.drainByTag<T>({\n tag: namespace,\n configured,\n onEach: async ({ binding }) => {\n if (onBeforeConfigure) {\n await onBeforeConfigure({ binding });\n }\n\n const instance = this.get<T>({ key: binding.key, isOptional: false });\n if (!instance) {\n logger.debug('No binding instance | namespace: %s | key: %s', namespace, binding.key);\n return;\n }\n\n if (typeof (instance as Partial<IConfigurable>)?.configure === 'function') {\n const options = this.artifactOptions.get(binding.key);\n await (instance as IConfigurable).configure(options);\n }\n\n // Marked before the after-hook runs, so the hook sees its own binding as configured.\n configured.add(binding.key);\n\n if (onAfterConfigure) {\n await onAfterConfigure({ binding, instance });\n }\n },\n });\n }\n\n /** The same-key guard behind every artifact registration (`component`/`controller`/`service`/`repository`/`dataSource`). `allowOverride` defaults true to match `bind()`'s overwrite behavior; `allowOverride: false` on one registration, or `bootChecks.binding.allowOverride: false` for the whole application, opts into strict mode. */\n protected assertNoBindingCollision(opts: {\n key: string;\n allowOverride?: boolean;\n caller: string;\n }): void {\n const { key, caller } = opts;\n const allowOverride =\n opts.allowOverride ?? this.configs.bootChecks?.binding?.allowOverride ?? true;\n\n if (allowOverride || !this.isBound({ key })) {\n return;\n }\n\n const reason =\n opts.allowOverride === false\n ? `'allowOverride: false' was set and this key collides with an existing binding | Use a distinct 'opts.binding' key, or drop 'allowOverride: false' if overriding is intentional`\n : `'bootChecks.binding.allowOverride' is false and this key collides with an existing binding | Use a distinct 'opts.binding' key, or set 'allowOverride: true' on this registration if overriding is intentional`;\n\n throw getError({\n message: `[${caller}] Binding key already registered: '${key}' | ${reason}`,\n });\n }\n\n /** Resolution order for every registration: explicit `opts` > the class's `@injectable` defaults > the derived key and the kind's default scope. `order` and `when` are `registerArtifacts`' concern, not this one. */\n private registerArtifact<Base>(opts: {\n target: TClass<Base>;\n namespace: TBindingNamespace;\n defaultScope: TBindingScope;\n caller: string;\n opts?: TMixinOpts;\n }): Binding<Base> {\n const { target, namespace, defaultScope, caller } = opts;\n const declared = MetadataRegistry.getInstance().getArtifactMetadata({ target });\n\n if (\n this.runningApplicationHook &&\n this.configs.artifacts &&\n this.configs.bootChecks?.binding?.allowManual === false\n ) {\n throw getError({\n message: `[${caller}] '${target.name}' is registered by hand inside ${this.runningApplicationHook}() while 'configs.artifacts' is set and 'bootChecks.binding.allowManual' is false | Move the class into the generated index (or an explicit entry of 'configs.artifacts'), or allow manual registration`,\n });\n }\n\n const pinned = opts.opts?.binding ?? declared?.binding;\n BindingNamespaces.assertArtifactNamespace({\n namespace: pinned?.namespace ?? namespace,\n artifact: target.name,\n caller,\n });\n\n const { key } = ArtifactBindingKeys.resolve({ target, namespace, binding: pinned });\n\n // What `@inject({ target })` reads back. Only here knows the call site's `binding`, and a\n // class registered by hand has no stereotype metadata to derive one from.\n MetadataRegistry.getInstance().setBindingKey({ target, key });\n\n if (opts.opts?.options !== undefined) {\n this.artifactOptions.set(key, opts.opts.options);\n }\n\n this.assertNoBindingCollision({\n key,\n allowOverride: opts.opts?.allowOverride ?? declared?.allowOverride,\n caller,\n });\n\n return this.bind<Base>({ key })\n .toClass(target)\n .setScope(declared?.scope ?? defaultScope);\n }\n\n configuration<Base extends BaseConfiguration<Options>, Options extends object = {}>(\n target: TClass<Base>,\n opts?: TMixinOpts<Options>,\n ): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.CONFIGURATION,\n defaultScope: BindingScopes.SINGLETON,\n caller: this.configuration.name,\n opts,\n });\n }\n\n async registerConfigurations(): Promise<void> {\n await PerformanceUtility.executeWithMeasure({\n logger: this.logger,\n scope: this.registerConfigurations.name,\n description: 'Register application configurations',\n task: async () => {\n await this.registerDynamicBindings({ namespace: BindingNamespaces.CONFIGURATION });\n },\n });\n }\n\n component<Base extends BaseComponent<Options>, Options extends object = {}>(\n target: TClass<Base>,\n opts?: TMixinOpts<Options>,\n ): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.COMPONENT,\n defaultScope: BindingScopes.SINGLETON,\n caller: this.component.name,\n opts,\n });\n }\n\n async registerComponents(): Promise<void> {\n await PerformanceUtility.executeWithMeasure({\n logger: this.logger,\n scope: this.registerComponents.name,\n description: 'Register application components',\n task: async () => {\n await this.registerDynamicBindings({ namespace: BindingNamespaces.COMPONENT });\n },\n });\n }\n\n /**\n * Second DATASOURCE sweep, for datasources components contributed at any depth. Calls\n * `registerDynamicBindings` directly: `this.registerDataSources()` is polymorphic and an override\n * would run twice. Runs after every component, so a component a datasource registers is never configured.\n */\n async registerContributedDataSources(): Promise<void> {\n await PerformanceUtility.executeWithMeasure({\n logger: this.logger,\n scope: this.registerContributedDataSources.name,\n description: 'Register application contributed data sources',\n task: async () => {\n await this.registerDynamicBindings({ namespace: BindingNamespaces.DATASOURCE });\n },\n });\n }\n\n /** REST only - the kernel has no gRPC (it reaches `node:module`). `BaseApplication` adds the gRPC branch on top. */\n async registerControllers(): Promise<void> {\n await PerformanceUtility.executeWithMeasure({\n logger: this.logger,\n description: 'Register application REST controllers',\n scope: this.registerControllers.name,\n task: async () => {\n const transports = this.configs.transports ?? [ControllerTransports.REST];\n if (!transports.includes(ControllerTransports.REST)) {\n return;\n }\n\n const restComponent = new RestComponent(this);\n await restComponent.configure();\n },\n });\n }\n\n /** SINGLETON like `component()`: `RestComponent` mounts the one instance it resolves, so a second resolution must be that instance, not an unmounted twin. */\n controller<Base>(target: TClass<Base>, opts?: TMixinOpts): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.CONTROLLER,\n defaultScope: BindingScopes.SINGLETON,\n caller: this.controller.name,\n opts,\n });\n }\n\n service<Base extends IService>(target: TClass<Base>, opts?: TMixinOpts): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.SERVICE,\n defaultScope: BindingScopes.TRANSIENT,\n caller: this.service.name,\n opts,\n });\n }\n\n repository<Base extends IRepository>(target: TClass<Base>, opts?: TMixinOpts): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.REPOSITORY,\n defaultScope: BindingScopes.TRANSIENT,\n caller: this.repository.name,\n opts,\n });\n }\n\n dataSource<Base extends IDataSource<Options>, Options extends object = {}>(\n target: TClass<Base>,\n opts?: TMixinOpts<Options>,\n ): Binding<Base> {\n return this.registerArtifact({\n target,\n namespace: BindingNamespaces.DATASOURCE,\n defaultScope: BindingScopes.SINGLETON,\n caller: this.dataSource.name,\n opts,\n });\n }\n\n /** The boot step body behind `configs.artifacts`, also callable by hand: registers every kind in dependency order across the given indexes. */\n async registerArtifacts(index: TArtifactIndexInput): Promise<void> {\n const resolved = await ArtifactIndexHelper.getInstance().resolve({\n input: index,\n application: this,\n });\n\n const registry = MetadataRegistry.getInstance();\n const kinds: Array<[ReadonlyArray<TClass<AnyType>>, TBindingNamespace]> = [\n [resolved.configurations, BindingNamespaces.CONFIGURATION],\n [resolved.dataSources, BindingNamespaces.DATASOURCE],\n [resolved.components, BindingNamespaces.COMPONENT],\n [resolved.repositories, BindingNamespaces.REPOSITORY],\n [resolved.services, BindingNamespaces.SERVICE],\n [resolved.controllers, BindingNamespaces.CONTROLLER],\n ];\n const collisions = ArtifactBindingKeys.findDerivedCollisions({\n entries: kinds.flatMap(([targets, namespace]) =>\n targets.map((target) => ({\n target,\n namespace,\n binding: registry.getArtifactMetadata({ target })?.binding,\n })),\n ),\n });\n\n for (const key of collisions) {\n const message = ArtifactBindingKeys.describeCollision({ key, caller: 'registerArtifacts' });\n\n if (!this.configs.bootChecks?.allowDerivedKeyCollision) {\n throw getError({ message });\n }\n\n this.logger.warn('%s', message);\n }\n\n for (const target of resolved.configurations) {\n this.configuration(target);\n this.bindProvidedKeys({ target });\n }\n\n for (const target of resolved.dataSources) {\n this.dataSource(target);\n }\n\n for (const target of resolved.components) {\n this.component(target);\n this.bindProvidedKeys({ target });\n }\n\n for (const target of resolved.repositories) {\n this.repository(target);\n }\n\n for (const target of resolved.services) {\n this.service(target);\n }\n\n for (const target of resolved.controllers) {\n this.controller(target);\n }\n }\n\n /** Registers every class a stereotype decorated, with no `configs.artifacts` entry anywhere. `when` and `order` apply exactly as they do to a declared index - which is how one process running several applications keeps them apart. */\n async registerDiscoveredArtifacts(): Promise<void> {\n await this.registerArtifacts(ArtifactIndexHelper.getInstance().buildDiscoveredIndex());\n }\n\n /**\n * The artifact boot step. `configs.discoverArtifacts` adds every decorated class in the import\n * graph; `configs.artifacts` adds exactly what it lists. Both together register the union.\n *\n * An absent `artifacts` still registers nothing. Reading it as \"register everything\" would change\n * what an existing application boots with, silently, and the failure would surface as ten times\n * the bindings rather than as an error.\n */\n protected async registerConfiguredArtifacts(): Promise<void> {\n const inputs: TArtifactIndexInput[] = [];\n\n if (this.configs.discoverArtifacts) {\n inputs.push(ArtifactIndexHelper.getInstance().buildDiscoveredIndex());\n }\n\n if (this.configs.artifacts) {\n inputs.push(this.configs.artifacts);\n }\n\n if (inputs.length === 0) {\n return;\n }\n\n await this.registerArtifacts(inputs);\n }\n\n /** Each `@provide` method becomes a lazy provider: the component is resolved (SINGLETON) and the method called on first `get`, so a provided value may depend on datasources or secrets that do not exist yet at registration time. */\n private bindProvidedKeys(opts: { target: TClass<any> }): void {\n const { target } = opts;\n const registry = MetadataRegistry.getInstance();\n const provides = registry.getProvideMetadata({ target });\n if (provides.length === 0) {\n return;\n }\n\n const declared = registry.getArtifactMetadata({ target });\n const defaultNamespace = declared?.type\n ? ArtifactNamespaces.resolve({ type: declared.type })\n : BindingNamespaces.COMPONENT;\n // The key the registration actually bound - a call-site override included.\n const componentKey =\n registry.getBindingKey({ target }) ??\n ArtifactBindingKeys.resolve({\n target,\n namespace: defaultNamespace,\n binding: declared?.binding,\n }).key;\n for (const entry of provides) {\n this.bind({ key: entry.key })\n .toProvider((container) => {\n const instance = container.get<Record<string | symbol, () => unknown>>({\n key: componentKey,\n });\n return instance[entry.methodName]();\n })\n .setScope(entry.scope ?? BindingScopes.SINGLETON);\n }\n }\n\n async registerDataSources(): Promise<void> {\n await PerformanceUtility.executeWithMeasure({\n logger: this.logger,\n scope: this.registerDataSources.name,\n description: 'Register application data sources',\n task: async () => {\n await this.registerDynamicBindings({ namespace: BindingNamespaces.DATASOURCE });\n },\n });\n }\n\n /**\n * Closes every datasource the boot configured, so a stopped application holds no pool, socket or\n * WASM instance. A failure, or a `close()` still pending after `dataSourceCloseTimeoutMs`, is logged\n * and never stops the rest. A datasource configured by hand is closed by whoever configured it.\n */\n protected async closeDataSources(): Promise<void> {\n const keys = this.registeredBindings[BindingNamespaces.DATASOURCE] ?? new Set<string>();\n const timeoutMs = this.configs.dataSourceCloseTimeoutMs ?? 10_000;\n const logger = this.logger.for(this.closeDataSources.name);\n\n for (const key of keys) {\n try {\n const dataSource = this.get<IDataSource>({ key, isOptional: true });\n if (!dataSource?.close) {\n logger.debug('Nothing to close | key: %s', key);\n continue;\n }\n\n const closing = dataSource.close();\n await RetryHelper.runWithTimeout({ operation: key, timeoutMs, execution: () => closing });\n } catch (error) {\n if (RetryHelper.isRetryTimeoutError(error)) {\n logger.error('Close timed out | key: %s | timeoutMs: %d', key, timeoutMs);\n continue;\n }\n\n logger.error('Failed to close datasource | key: %s | error: %s', key, error);\n continue;\n }\n\n logger.info('Closed datasource | key: %s', key);\n }\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { int } from '@venizia/ignis-helpers/core';
1
+ import { ParseUtility } from '@venizia/ignis-helpers/core';
2
2
  export class AuthenticationFieldCodecs {
3
3
  static { this.ROLES_CODEC = {
4
4
  key: 'roles',
@@ -8,7 +8,7 @@ export class AuthenticationFieldCodecs {
8
8
  deserialize(opts) {
9
9
  return JSON.parse(opts.raw).map((el) => {
10
10
  const [id, identifier, priority] = el.split('|');
11
- return { id, identifier, priority: int(priority) };
11
+ return { id, identifier, priority: ParseUtility.toInt({ input: priority }) };
12
12
  });
13
13
  },
14
14
  }; }
@@ -1 +1 @@
1
- {"version":3,"file":"codecs.js","sourceRoot":"","sources":["../../../../../../src/base/auth/authenticate/common/codecs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAGlD,MAAM,OAAO,yBAAyB;aACpB,gBAAW,GAAkD;QAC3E,GAAG,EAAE,OAAO;QACZ,SAAS,CAAC,IAAI;YACZ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,WAAW,CAAC,IAAI;YACd,OAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAc,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACnD,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjD,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;IAEF,2CAA2C;IAC3C,MAAM,CAAC,KAAK,CAAc,IAIzB;QACC,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC","sourcesContent":["import { int } from '@venizia/ignis-helpers/core';\nimport type { IJWTTokenPayload, IPayloadFieldCodec } from './types';\n\nexport class AuthenticationFieldCodecs {\n static readonly ROLES_CODEC: IPayloadFieldCodec<IJWTTokenPayload['roles']> = {\n key: 'roles',\n serialize(opts) {\n return JSON.stringify(opts.value.map((el) => `${el.id}|${el.identifier}|${el.priority}`));\n },\n deserialize(opts) {\n return (JSON.parse(opts.raw) as string[]).map((el) => {\n const [id, identifier, priority] = el.split('|');\n return { id, identifier, priority: int(priority) };\n });\n },\n };\n\n /** Builds a single payload field codec. */\n static build<T = unknown>(opts: {\n key: string;\n serialize: IPayloadFieldCodec<T>['serialize'];\n deserialize: IPayloadFieldCodec<T>['deserialize'];\n }): IPayloadFieldCodec<T> {\n return {\n key: opts.key,\n serialize: opts.serialize,\n deserialize: opts.deserialize,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"codecs.js","sourceRoot":"","sources":["../../../../../../src/base/auth/authenticate/common/codecs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,MAAM,OAAO,yBAAyB;aACpB,gBAAW,GAAkD;QAC3E,GAAG,EAAE,OAAO;QACZ,SAAS,CAAC,IAAI;YACZ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,WAAW,CAAC,IAAI;YACd,OAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAc,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACnD,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjD,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC/E,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;IAEF,2CAA2C;IAC3C,MAAM,CAAC,KAAK,CAAc,IAIzB;QACC,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;IACJ,CAAC","sourcesContent":["import { ParseUtility } from '@venizia/ignis-helpers/core';\nimport type { IJWTTokenPayload, IPayloadFieldCodec } from './types';\n\nexport class AuthenticationFieldCodecs {\n static readonly ROLES_CODEC: IPayloadFieldCodec<IJWTTokenPayload['roles']> = {\n key: 'roles',\n serialize(opts) {\n return JSON.stringify(opts.value.map((el) => `${el.id}|${el.identifier}|${el.priority}`));\n },\n deserialize(opts) {\n return (JSON.parse(opts.raw) as string[]).map((el) => {\n const [id, identifier, priority] = el.split('|');\n return { id, identifier, priority: ParseUtility.toInt({ input: priority }) };\n });\n },\n };\n\n /** Builds a single payload field codec. */\n static build<T = unknown>(opts: {\n key: string;\n serialize: IPayloadFieldCodec<T>['serialize'];\n deserialize: IPayloadFieldCodec<T>['deserialize'];\n }): IPayloadFieldCodec<T> {\n return {\n key: opts.key,\n serialize: opts.serialize,\n deserialize: opts.deserialize,\n };\n }\n}\n"]}
@@ -36,7 +36,7 @@ export declare class AuthenticationStrategyRegistry extends AbstractAuthRegistry
36
36
  *
37
37
  * The framework does NOT call this - it reports instead. A hard failure cannot be the default
38
38
  * here: a route listing several strategies in ANY mode tolerates one that does not resolve, and
39
- * `defineAuthController` hard-codes `'jwt'` on four of its routes, so an application that
39
+ * `AuthControllerFactory.define` hard-codes `'jwt'` on four of its routes, so an application that
40
40
  * registers its JWT strategy under a different name works today and would stop booting.
41
41
  */
42
42
  assertRegistered(opts: {
@@ -49,7 +49,7 @@ export class AuthenticationStrategyRegistry extends AbstractAuthRegistry {
49
49
  *
50
50
  * The framework does NOT call this - it reports instead. A hard failure cannot be the default
51
51
  * here: a route listing several strategies in ANY mode tolerates one that does not resolve, and
52
- * `defineAuthController` hard-codes `'jwt'` on four of its routes, so an application that
52
+ * `AuthControllerFactory.define` hard-codes `'jwt'` on four of its routes, so an application that
53
53
  * registers its JWT strategy under a different name works today and would stop booting.
54
54
  */
55
55
  assertRegistered(opts) {
@@ -1 +1 @@
1
- {"version":3,"file":"strategy-registry.js","sourceRoot":"","sources":["../../../../../../src/base/auth/authenticate/strategies/strategy-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Container } from '@/helpers/inversion/container';\nimport { SingletonRealm } from '@/helpers/singleton-realm';\nimport type { TClass } from '@venizia/ignis-helpers/common';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport { AbstractAuthRegistry } from '../../base';\nimport type { IAuthenticationStrategy } from '../common';\nimport { Authentication } from '../common';\n\nexport class AuthenticationStrategyRegistry extends AbstractAuthRegistry<IAuthenticationStrategy> {\n static readonly SINGLETON_REAL_KEY = 'authentication-strategy-registry';\n\n constructor() {\n super({ scope: AuthenticationStrategyRegistry.name });\n }\n\n static getInstance() {\n return SingletonRealm.resolve({\n key: AuthenticationStrategyRegistry.SINGLETON_REAL_KEY,\n create: () => new AuthenticationStrategyRegistry(),\n });\n }\n\n protected getBindingPrefix(): string {\n return Authentication.AUTHENTICATION_STRATEGY;\n }\n\n register(opts: {\n container: Container;\n strategies: { strategy: TClass<IAuthenticationStrategy>; name: string }[];\n }) {\n const { container, strategies } = opts;\n\n for (const { strategy, name } of strategies) {\n this.registerDescriptor({ container, target: strategy, name });\n }\n\n return this;\n }\n\n resolveStrategy(opts: { name: string }): IAuthenticationStrategy {\n return this.resolveDescriptor(opts);\n }\n\n /**\n * The names on this list that no registered strategy answers to.\n *\n * An EMPTY list yields nothing - it is the framework's own encoding of\n * `authenticate: { skip: true }`, so treating it as a problem would flag every public route.\n *\n * Nothing is reported while the registry is empty. Route configs are built during\n * `registerControllers()`, after `preConfigure()` and `registerComponents()`, so a real\n * application has registered by then; an empty registry means this is running outside that\n * lifecycle - a unit test on a controller - where no name could resolve either way.\n */\n findUnregistered(opts: { names: string[] }): string[] {\n const { names } = opts;\n\n if (names.length === 0 || this.descriptors.size === 0) {\n return [];\n }\n\n return names.filter((name) => !this.has({ name }));\n }\n\n /**\n * Refuses to continue past an unregistered name. For an APPLICATION's own startup check.\n *\n * The framework does NOT call this - it reports instead. A hard failure cannot be the default\n * here: a route listing several strategies in ANY mode tolerates one that does not resolve, and\n * `defineAuthController` hard-codes `'jwt'` on four of its routes, so an application that\n * registers its JWT strategy under a different name works today and would stop booting.\n */\n assertRegistered(opts: { names: string[]; scope?: string }): void {\n const { names, scope = 'route' } = opts;\n\n const unregistered = this.findUnregistered({ names });\n if (unregistered.length === 0) {\n return;\n }\n\n throw getError({\n message: `[${scope}] Unknown authentication strategy | unregistered: ${unregistered.join(', ')} | registered: ${this.getNames().join(', ')} | register it with AuthenticationStrategyRegistry.register() before controllers are bound`,\n });\n }\n\n /**\n * Names an unregistered strategy at boot, at a level someone sees. Never throws.\n *\n * This is what replaces the guard the open `TAuthStrategy` gave up: `resolveStrategy` throws at\n * request time, the provider's ANY mode swallows it at DEBUG, and the route 401s with nothing to\n * explain why.\n */\n reportUnregistered(opts: { names: string[]; scope?: string }): void {\n const { names, scope = 'route' } = opts;\n\n const unregistered = this.findUnregistered({ names });\n if (unregistered.length === 0) {\n return;\n }\n\n this.logger\n .for(this.reportUnregistered.name)\n .error(\n '[%s] Unknown authentication strategy - requests relying on it cannot authenticate | unregistered: %s | registered: %s',\n scope,\n unregistered.join(', '),\n this.getNames().join(', '),\n );\n }\n}\n"]}
1
+ {"version":3,"file":"strategy-registry.js","sourceRoot":"","sources":["../../../../../../src/base/auth/authenticate/strategies/strategy-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,OAAO,8BAA+B,SAAQ,oBAA6C;aAC/E,uBAAkB,GAAG,kCAAkC,CAAC;IAExE;QACE,KAAK,CAAC,EAAE,KAAK,EAAE,8BAA8B,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,cAAc,CAAC,OAAO,CAAC;YAC5B,GAAG,EAAE,8BAA8B,CAAC,kBAAkB;YACtD,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,8BAA8B,EAAE;SACnD,CAAC,CAAC;IACL,CAAC;IAES,gBAAgB;QACxB,OAAO,cAAc,CAAC,uBAAuB,CAAC;IAChD,CAAC;IAED,QAAQ,CAAC,IAGR;QACC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAEvC,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5C,IAAI,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CAAC,IAAsB;QACpC,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,IAAyB;QACxC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAEvB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;;OAOG;IACH,gBAAgB,CAAC,IAAyC;QACxD,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;QAExC,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,CAAC;YACb,OAAO,EAAE,IAAI,KAAK,qDAAqD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,4FAA4F;SACvO,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,kBAAkB,CAAC,IAAyC;QAC1D,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;QAExC,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM;aACR,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;aACjC,KAAK,CACJ,uHAAuH,EACvH,KAAK,EACL,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EACvB,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3B,CAAC;IACN,CAAC","sourcesContent":["import type { Container } from '@/helpers/inversion/container';\nimport { SingletonRealm } from '@/helpers/singleton-realm';\nimport type { TClass } from '@venizia/ignis-helpers/common';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport { AbstractAuthRegistry } from '../../base';\nimport type { IAuthenticationStrategy } from '../common';\nimport { Authentication } from '../common';\n\nexport class AuthenticationStrategyRegistry extends AbstractAuthRegistry<IAuthenticationStrategy> {\n static readonly SINGLETON_REAL_KEY = 'authentication-strategy-registry';\n\n constructor() {\n super({ scope: AuthenticationStrategyRegistry.name });\n }\n\n static getInstance() {\n return SingletonRealm.resolve({\n key: AuthenticationStrategyRegistry.SINGLETON_REAL_KEY,\n create: () => new AuthenticationStrategyRegistry(),\n });\n }\n\n protected getBindingPrefix(): string {\n return Authentication.AUTHENTICATION_STRATEGY;\n }\n\n register(opts: {\n container: Container;\n strategies: { strategy: TClass<IAuthenticationStrategy>; name: string }[];\n }) {\n const { container, strategies } = opts;\n\n for (const { strategy, name } of strategies) {\n this.registerDescriptor({ container, target: strategy, name });\n }\n\n return this;\n }\n\n resolveStrategy(opts: { name: string }): IAuthenticationStrategy {\n return this.resolveDescriptor(opts);\n }\n\n /**\n * The names on this list that no registered strategy answers to.\n *\n * An EMPTY list yields nothing - it is the framework's own encoding of\n * `authenticate: { skip: true }`, so treating it as a problem would flag every public route.\n *\n * Nothing is reported while the registry is empty. Route configs are built during\n * `registerControllers()`, after `preConfigure()` and `registerComponents()`, so a real\n * application has registered by then; an empty registry means this is running outside that\n * lifecycle - a unit test on a controller - where no name could resolve either way.\n */\n findUnregistered(opts: { names: string[] }): string[] {\n const { names } = opts;\n\n if (names.length === 0 || this.descriptors.size === 0) {\n return [];\n }\n\n return names.filter((name) => !this.has({ name }));\n }\n\n /**\n * Refuses to continue past an unregistered name. For an APPLICATION's own startup check.\n *\n * The framework does NOT call this - it reports instead. A hard failure cannot be the default\n * here: a route listing several strategies in ANY mode tolerates one that does not resolve, and\n * `AuthControllerFactory.define` hard-codes `'jwt'` on four of its routes, so an application that\n * registers its JWT strategy under a different name works today and would stop booting.\n */\n assertRegistered(opts: { names: string[]; scope?: string }): void {\n const { names, scope = 'route' } = opts;\n\n const unregistered = this.findUnregistered({ names });\n if (unregistered.length === 0) {\n return;\n }\n\n throw getError({\n message: `[${scope}] Unknown authentication strategy | unregistered: ${unregistered.join(', ')} | registered: ${this.getNames().join(', ')} | register it with AuthenticationStrategyRegistry.register() before controllers are bound`,\n });\n }\n\n /**\n * Names an unregistered strategy at boot, at a level someone sees. Never throws.\n *\n * This is what replaces the guard the open `TAuthStrategy` gave up: `resolveStrategy` throws at\n * request time, the provider's ANY mode swallows it at DEBUG, and the route 401s with nothing to\n * explain why.\n */\n reportUnregistered(opts: { names: string[]; scope?: string }): void {\n const { names, scope = 'route' } = opts;\n\n const unregistered = this.findUnregistered({ names });\n if (unregistered.length === 0) {\n return;\n }\n\n this.logger\n .for(this.reportUnregistered.name)\n .error(\n '[%s] Unknown authentication strategy - requests relying on it cannot authenticate | unregistered: %s | registered: %s',\n scope,\n unregistered.join(', '),\n this.getNames().join(', '),\n );\n }\n}\n"]}