@venizia/ignis-kernel 0.4.6 → 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 (174) hide show
  1. package/LICENSE.md +1 -4
  2. package/dist/esm/base/applications/artifact-group.d.ts.map +1 -1
  3. package/dist/esm/base/applications/artifact-group.js +4 -1
  4. package/dist/esm/base/applications/artifact-group.js.map +1 -1
  5. package/dist/esm/base/applications/artifact-index.d.ts.map +1 -1
  6. package/dist/esm/base/applications/artifact-index.js +2 -1
  7. package/dist/esm/base/applications/artifact-index.js.map +1 -1
  8. package/dist/esm/base/applications/cors.d.ts +12 -10
  9. package/dist/esm/base/applications/cors.d.ts.map +1 -1
  10. package/dist/esm/base/applications/cors.js +37 -35
  11. package/dist/esm/base/applications/cors.js.map +1 -1
  12. package/dist/esm/base/applications/rest.js +11 -11
  13. package/dist/esm/base/applications/rest.js.map +1 -1
  14. package/dist/esm/base/auth/authenticate/common/codecs.js +2 -2
  15. package/dist/esm/base/auth/authenticate/common/codecs.js.map +1 -1
  16. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.d.ts +1 -1
  17. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.js +1 -1
  18. package/dist/esm/base/auth/authenticate/strategies/strategy-registry.js.map +1 -1
  19. package/dist/esm/base/auth/authorize/providers/authorization.provider.d.ts.map +1 -1
  20. package/dist/esm/base/auth/authorize/providers/authorization.provider.js +14 -11
  21. package/dist/esm/base/auth/authorize/providers/authorization.provider.js.map +1 -1
  22. package/dist/esm/base/auth/authorize/providers/request-domain.d.ts +14 -11
  23. package/dist/esm/base/auth/authorize/providers/request-domain.d.ts.map +1 -1
  24. package/dist/esm/base/auth/authorize/providers/request-domain.js +42 -39
  25. package/dist/esm/base/auth/authorize/providers/request-domain.js.map +1 -1
  26. package/dist/esm/base/auth/base/abstract-auth-registry.js +2 -2
  27. package/dist/esm/base/auth/base/abstract-auth-registry.js.map +1 -1
  28. package/dist/esm/base/auth/models/requests/change-password.schema.js +3 -3
  29. package/dist/esm/base/auth/models/requests/change-password.schema.js.map +1 -1
  30. package/dist/esm/base/auth/models/requests/sign-in.schema.js +5 -5
  31. package/dist/esm/base/auth/models/requests/sign-in.schema.js.map +1 -1
  32. package/dist/esm/base/components/controller/rest/rest.component.js +2 -2
  33. package/dist/esm/base/components/controller/rest/rest.component.js.map +1 -1
  34. package/dist/esm/base/controllers/common/index.d.ts +0 -1
  35. package/dist/esm/base/controllers/common/index.d.ts.map +1 -1
  36. package/dist/esm/base/controllers/common/index.js +0 -1
  37. package/dist/esm/base/controllers/common/index.js.map +1 -1
  38. package/dist/esm/base/controllers/common/schema-builders.d.ts +0 -5
  39. package/dist/esm/base/controllers/common/schema-builders.d.ts.map +1 -1
  40. package/dist/esm/base/controllers/common/schema-builders.js +0 -14
  41. package/dist/esm/base/controllers/common/schema-builders.js.map +1 -1
  42. package/dist/esm/base/controllers/context.d.ts +7 -2
  43. package/dist/esm/base/controllers/context.d.ts.map +1 -1
  44. package/dist/esm/base/controllers/context.js +7 -4
  45. package/dist/esm/base/controllers/context.js.map +1 -1
  46. package/dist/esm/base/controllers/factory/controller.d.ts +33 -1
  47. package/dist/esm/base/controllers/factory/controller.d.ts.map +1 -1
  48. package/dist/esm/base/controllers/factory/controller.js +90 -6
  49. package/dist/esm/base/controllers/factory/controller.js.map +1 -1
  50. package/dist/esm/base/controllers/factory/crud/persistable.d.ts.map +1 -1
  51. package/dist/esm/base/controllers/factory/crud/persistable.js +40 -25
  52. package/dist/esm/base/controllers/factory/crud/persistable.js.map +1 -1
  53. package/dist/esm/base/controllers/factory/crud/readable.d.ts.map +1 -1
  54. package/dist/esm/base/controllers/factory/crud/readable.js +4 -3
  55. package/dist/esm/base/controllers/factory/crud/readable.js.map +1 -1
  56. package/dist/esm/base/controllers/factory/definition.d.ts +1 -8
  57. package/dist/esm/base/controllers/factory/definition.d.ts.map +1 -1
  58. package/dist/esm/base/controllers/factory/definition.js +17 -24
  59. package/dist/esm/base/controllers/factory/definition.js.map +1 -1
  60. package/dist/esm/base/controllers/factory/index.d.ts +0 -1
  61. package/dist/esm/base/controllers/factory/index.d.ts.map +1 -1
  62. package/dist/esm/base/controllers/factory/index.js +0 -1
  63. package/dist/esm/base/controllers/factory/index.js.map +1 -1
  64. package/dist/esm/base/controllers/rest/abstract.d.ts.map +1 -1
  65. package/dist/esm/base/controllers/rest/abstract.js +6 -6
  66. package/dist/esm/base/controllers/rest/abstract.js.map +1 -1
  67. package/dist/esm/base/controllers/rest/base.d.ts +0 -5
  68. package/dist/esm/base/controllers/rest/base.d.ts.map +1 -1
  69. package/dist/esm/base/controllers/rest/base.js +14 -14
  70. package/dist/esm/base/controllers/rest/base.js.map +1 -1
  71. package/dist/esm/base/datasources/abstract.js +2 -2
  72. package/dist/esm/base/datasources/abstract.js.map +1 -1
  73. package/dist/esm/base/events/event-bus.js +4 -4
  74. package/dist/esm/base/events/event-bus.js.map +1 -1
  75. package/dist/esm/base/metadata/injectable.d.ts +7 -4
  76. package/dist/esm/base/metadata/injectable.d.ts.map +1 -1
  77. package/dist/esm/base/metadata/injectable.js +26 -23
  78. package/dist/esm/base/metadata/injectable.js.map +1 -1
  79. package/dist/esm/base/metadata/model-metadata.d.ts +27 -13
  80. package/dist/esm/base/metadata/model-metadata.d.ts.map +1 -1
  81. package/dist/esm/base/metadata/model-metadata.js +56 -26
  82. package/dist/esm/base/metadata/model-metadata.js.map +1 -1
  83. package/dist/esm/base/metadata/persistents.d.ts.map +1 -1
  84. package/dist/esm/base/metadata/persistents.js +21 -13
  85. package/dist/esm/base/metadata/persistents.js.map +1 -1
  86. package/dist/esm/base/metadata/routes/controller.d.ts.map +1 -1
  87. package/dist/esm/base/metadata/routes/controller.js +5 -2
  88. package/dist/esm/base/metadata/routes/controller.js.map +1 -1
  89. package/dist/esm/base/middlewares/app-error/app-error.middleware.js +7 -7
  90. package/dist/esm/base/middlewares/app-error/app-error.middleware.js.map +1 -1
  91. package/dist/esm/base/middlewares/app-error/database.handler.d.ts +14 -12
  92. package/dist/esm/base/middlewares/app-error/database.handler.d.ts.map +1 -1
  93. package/dist/esm/base/middlewares/app-error/database.handler.js +37 -35
  94. package/dist/esm/base/middlewares/app-error/database.handler.js.map +1 -1
  95. package/dist/esm/base/middlewares/app-error/zod.handler.d.ts +28 -23
  96. package/dist/esm/base/middlewares/app-error/zod.handler.d.ts.map +1 -1
  97. package/dist/esm/base/middlewares/app-error/zod.handler.js +56 -53
  98. package/dist/esm/base/middlewares/app-error/zod.handler.js.map +1 -1
  99. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.d.ts +6 -4
  100. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.d.ts.map +1 -1
  101. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.js +14 -12
  102. package/dist/esm/base/middlewares/emoji-favicon/emoji-favicon.middleware.js.map +1 -1
  103. package/dist/esm/base/middlewares/form-body/form-body.middleware.d.ts +15 -11
  104. package/dist/esm/base/middlewares/form-body/form-body.middleware.d.ts.map +1 -1
  105. package/dist/esm/base/middlewares/form-body/form-body.middleware.js +25 -21
  106. package/dist/esm/base/middlewares/form-body/form-body.middleware.js.map +1 -1
  107. package/dist/esm/base/models/common/schemas.d.ts +184 -105
  108. package/dist/esm/base/models/common/schemas.d.ts.map +1 -1
  109. package/dist/esm/base/models/common/schemas.js +105 -54
  110. package/dist/esm/base/models/common/schemas.js.map +1 -1
  111. package/dist/esm/base/models/common/utilities.d.ts +10 -5
  112. package/dist/esm/base/models/common/utilities.d.ts.map +1 -1
  113. package/dist/esm/base/models/common/utilities.js +22 -16
  114. package/dist/esm/base/models/common/utilities.js.map +1 -1
  115. package/dist/esm/base/repositories/common/types/results.d.ts +15 -7
  116. package/dist/esm/base/repositories/common/types/results.d.ts.map +1 -1
  117. package/dist/esm/base/repositories/common/types/results.js +16 -7
  118. package/dist/esm/base/repositories/common/types/results.js.map +1 -1
  119. package/dist/esm/base/repositories/core/abstract.d.ts.map +1 -1
  120. package/dist/esm/base/repositories/core/abstract.js +5 -3
  121. package/dist/esm/base/repositories/core/abstract.js.map +1 -1
  122. package/dist/esm/base/repositories/query-schemas/index.d.ts +1 -1
  123. package/dist/esm/base/repositories/query-schemas/index.d.ts.map +1 -1
  124. package/dist/esm/base/repositories/query-schemas/index.js +3 -3
  125. package/dist/esm/base/repositories/query-schemas/index.js.map +1 -1
  126. package/dist/esm/helpers/inversion/common/relation-builder.js.map +1 -1
  127. package/dist/esm/helpers/inversion/index.d.ts +1 -1
  128. package/dist/esm/helpers/inversion/index.d.ts.map +1 -1
  129. package/dist/esm/helpers/inversion/index.js +1 -1
  130. package/dist/esm/helpers/inversion/index.js.map +1 -1
  131. package/dist/esm/helpers/inversion/mixins/repository.mixin.d.ts.map +1 -1
  132. package/dist/esm/helpers/inversion/mixins/repository.mixin.js +5 -5
  133. package/dist/esm/helpers/inversion/mixins/repository.mixin.js.map +1 -1
  134. package/dist/esm/metadata.d.ts +1 -1
  135. package/dist/esm/metadata.d.ts.map +1 -1
  136. package/dist/esm/metadata.js +1 -1
  137. package/dist/esm/metadata.js.map +1 -1
  138. package/dist/esm/repository.d.ts +2 -2
  139. package/dist/esm/repository.d.ts.map +1 -1
  140. package/dist/esm/repository.js +2 -2
  141. package/dist/esm/repository.js.map +1 -1
  142. package/dist/esm/utilities/index.d.ts +1 -1
  143. package/dist/esm/utilities/index.d.ts.map +1 -1
  144. package/dist/esm/utilities/index.js +1 -1
  145. package/dist/esm/utilities/index.js.map +1 -1
  146. package/dist/esm/utilities/not-supported.utility.d.ts +11 -0
  147. package/dist/esm/utilities/not-supported.utility.d.ts.map +1 -0
  148. package/dist/esm/utilities/not-supported.utility.js +19 -0
  149. package/dist/esm/utilities/not-supported.utility.js.map +1 -0
  150. package/package.json +6 -7
  151. package/dist/esm/base/controllers/common/html-response.d.ts +0 -70
  152. package/dist/esm/base/controllers/common/html-response.d.ts.map +0 -1
  153. package/dist/esm/base/controllers/common/html-response.js +0 -30
  154. package/dist/esm/base/controllers/common/html-response.js.map +0 -1
  155. package/dist/esm/base/controllers/factory/authorize-guard.d.ts +0 -19
  156. package/dist/esm/base/controllers/factory/authorize-guard.d.ts.map +0 -1
  157. package/dist/esm/base/controllers/factory/authorize-guard.js +0 -56
  158. package/dist/esm/base/controllers/factory/authorize-guard.js.map +0 -1
  159. package/dist/esm/base/controllers/factory/helper.d.ts +0 -2
  160. package/dist/esm/base/controllers/factory/helper.d.ts.map +0 -1
  161. package/dist/esm/base/controllers/factory/helper.js +0 -2
  162. package/dist/esm/base/controllers/factory/helper.js.map +0 -1
  163. package/dist/esm/base/controllers/factory/repository-injection.d.ts +0 -14
  164. package/dist/esm/base/controllers/factory/repository-injection.d.ts.map +0 -1
  165. package/dist/esm/base/controllers/factory/repository-injection.js +0 -27
  166. package/dist/esm/base/controllers/factory/repository-injection.js.map +0 -1
  167. package/dist/esm/base/metadata/model-settings.d.ts +0 -11
  168. package/dist/esm/base/metadata/model-settings.d.ts.map +0 -1
  169. package/dist/esm/base/metadata/model-settings.js +0 -30
  170. package/dist/esm/base/metadata/model-settings.js.map +0 -1
  171. package/dist/esm/utilities/error.utility.d.ts +0 -8
  172. package/dist/esm/utilities/error.utility.d.ts.map +0 -1
  173. package/dist/esm/utilities/error.utility.js +0 -14
  174. 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 +1 @@
1
- {"version":3,"file":"artifact-group.d.ts","sourceRoot":"","sources":["../../../../src/base/applications/artifact-group.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/D,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAEnF,sXAAsX;AACtX,qBAAa,aAAc,YAAW,cAAc;IAClD,kIAAkI;IAClI,MAAM,CAAC,QAAQ,CAAC,SAAS,qBAAqB;IAC9C,uGAAuG;IACvG,MAAM,CAAC,QAAQ,CAAC,mBAAmB,6BAA6B;IAEhE,QAAQ,CAAC,eAAe,EAAG,IAAI,CAAU;IACzC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9D,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,cAAc,CAAC,GAAG,SAAS,CAAC;IAEhE,OAAO;IAgBP,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAEnD,2FAA2F;IAC3F,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,aAAa;IAQhF,6SAA6S;IAC7S,MAAM,CAAC,WAAW,CAChB,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,cAAc,CAAA;KAAO,GACtE,aAAa;IAShB,wKAAwK;IACxK,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;QAChB,KAAK,EAAE,cAAc,CAAC;QACtB,KAAK,EAAE,aAAa,CAAC,MAAM,cAAc,CAAC,CAAC;KAC5C,GAAG,aAAa;IAiBjB,8HAA8H;WACjH,cAAc,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAiBrF,4IAA4I;IAC5I,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc;IASvD,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,cAAc,GAAG,SAAS,CAAA;KAAE,GAAG,IAAI;IAIvE,MAAM,CAAC,WAAW,IAAI,cAAc,GAAG,SAAS;IAIhD,mHAAmH;IACnH,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,KAAK;IAMnE,IAAI,cAAc,IAAI,KAAK,CAE1B;IAED,IAAI,WAAW,IAAI,KAAK,CAEvB;IAED,IAAI,UAAU,IAAI,KAAK,CAEtB;IAED,IAAI,YAAY,IAAI,KAAK,CAExB;IAED,IAAI,QAAQ,IAAI,KAAK,CAEpB;IAED,IAAI,WAAW,IAAI,KAAK,CAEvB;IAED,OAAO,CAAC,MAAM,CAAC,MAAM;IAOrB,oEAAoE;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ;IAMvB,gKAAgK;IAChK,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,SAAS;CAgBlE"}
1
+ {"version":3,"file":"artifact-group.d.ts","sourceRoot":"","sources":["../../../../src/base/applications/artifact-group.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/D,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAEnF,sXAAsX;AACtX,qBAAa,aAAc,YAAW,cAAc;IAClD,kIAAkI;IAClI,MAAM,CAAC,QAAQ,CAAC,SAAS,qBAAqB;IAC9C,uGAAuG;IACvG,MAAM,CAAC,QAAQ,CAAC,mBAAmB,6BAA6B;IAEhE,QAAQ,CAAC,eAAe,EAAG,IAAI,CAAU;IACzC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,SAAS,CAAC;IAC9D,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,cAAc,CAAC,GAAG,SAAS,CAAC;IAEhE,OAAO;IAgBP,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAEnD,2FAA2F;IAC3F,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,aAAa;IAQhF,6SAA6S;IAC7S,MAAM,CAAC,WAAW,CAChB,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,cAAc,CAAA;KAAO,GACtE,aAAa;IAShB,wKAAwK;IACxK,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;QAChB,KAAK,EAAE,cAAc,CAAC;QACtB,KAAK,EAAE,aAAa,CAAC,MAAM,cAAc,CAAC,CAAC;KAC5C,GAAG,aAAa;IAoBjB,8HAA8H;WACjH,cAAc,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAiBrF,4IAA4I;IAC5I,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc;IASvD,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,cAAc,GAAG,SAAS,CAAA;KAAE,GAAG,IAAI;IAIvE,MAAM,CAAC,WAAW,IAAI,cAAc,GAAG,SAAS;IAIhD,mHAAmH;IACnH,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,KAAK;IAMnE,IAAI,cAAc,IAAI,KAAK,CAE1B;IAED,IAAI,WAAW,IAAI,KAAK,CAEvB;IAED,IAAI,UAAU,IAAI,KAAK,CAEtB;IAED,IAAI,YAAY,IAAI,KAAK,CAExB;IAED,IAAI,QAAQ,IAAI,KAAK,CAEpB;IAED,IAAI,WAAW,IAAI,KAAK,CAEvB;IAED,OAAO,CAAC,MAAM,CAAC,MAAM;IAOrB,oEAAoE;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ;IAMvB,gKAAgK;IAChK,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,SAAS;CAgBlE"}
@@ -40,7 +40,10 @@ export class ArtifactGroup {
40
40
  folder: group.folder,
41
41
  site: group.site,
42
42
  content: group.content ? slice(group.content) : undefined,
43
- resolve: async () => slice(await ArtifactGroup.resolveContent({ group })),
43
+ resolve: async () => {
44
+ const content = await ArtifactGroup.resolveContent({ group });
45
+ return slice(content);
46
+ },
44
47
  kinds,
45
48
  ignore: group.ignore,
46
49
  });
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-group.js","sourceRoot":"","sources":["../../../../src/base/applications/artifact-group.ts"],"names":[],"mappings":"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","sourcesContent":["import { SingletonRealm } from '@/helpers/singleton-realm';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport type { IArtifactGroup, IArtifactIndex } from './common';\n\ntype TGroupResolver = (opts: { group: IArtifactGroup }) => Promise<IArtifactIndex>;\n\n/** A typed slice of a shared package's artifacts - every decorated class under a directory named `folder` in the package that defined it. A package declares one per domain, once; an application borrows it in `configs.artifacts`. The content is filled by `@venizia/ignis-boot`: inlined when the application is built, or resolved from source when artifacts are registered. */\nexport class ArtifactGroup implements IArtifactGroup {\n /** A string brand, so the group protocol is structural: `@venizia/ignis-boot/auto` builds one without depending on the kernel. */\n static readonly BRAND_KEY = 'isArtifactGroup';\n /** The realm slot `@venizia/ignis-boot` fills with the resolver for groups defined without content. */\n static readonly SINGLETON_REALM_KEY = 'artifact-group-resolver';\n\n readonly isArtifactGroup = true as const;\n readonly resolve: (() => Promise<IArtifactIndex>) | undefined;\n readonly kinds: ReadonlyArray<keyof IArtifactIndex> | undefined;\n\n private constructor(opts: {\n folder: string | undefined;\n site: string | undefined;\n content: IArtifactIndex | undefined;\n resolve?: () => Promise<IArtifactIndex>;\n kinds?: ReadonlyArray<keyof IArtifactIndex>;\n ignore?: ReadonlyArray<string>;\n }) {\n this.folder = opts.folder;\n this.site = opts.site;\n this.content = opts.content;\n this.resolve = opts.resolve;\n this.kinds = opts.kinds;\n this.ignore = opts.ignore;\n }\n\n readonly folder: string | undefined;\n readonly site: string | undefined;\n readonly content: IArtifactIndex | undefined;\n readonly ignore: ReadonlyArray<string> | undefined;\n\n /** `content` is written by the build plugin; a hand-written group passes only `folder`. */\n static define(opts: { folder: string; content?: IArtifactIndex }): ArtifactGroup {\n return new ArtifactGroup({\n folder: opts.folder,\n site: ArtifactGroup.callSite(),\n content: opts.content,\n });\n }\n\n /** Every decorated class of the calling package - an application's own artifacts, picked by its call site, so several applications in one process each get their own. `ignore` takes the globs `ignis-artifacts --ignore` takes, relative to the package `src`. `content` is written by the build plugin. */\n static application(\n opts: { ignore?: ReadonlyArray<string>; content?: IArtifactIndex } = {},\n ): ArtifactGroup {\n return new ArtifactGroup({\n folder: undefined,\n site: ArtifactGroup.callSite(),\n content: opts.content,\n ignore: opts.ignore,\n });\n }\n\n /** A group carrying only `kinds` - for a slicer that splits `configs.artifacts` by run mode. The source group is resolved when artifacts are registered, never here. */\n static pick(opts: {\n group: IArtifactGroup;\n kinds: ReadonlyArray<keyof IArtifactIndex>;\n }): ArtifactGroup {\n const { group, kinds } = opts;\n const slice = (index: IArtifactIndex): IArtifactIndex =>\n Object.fromEntries(\n kinds.filter((kind) => index[kind] !== undefined).map((kind) => [kind, index[kind]]),\n );\n\n return new ArtifactGroup({\n folder: group.folder,\n site: group.site,\n content: group.content ? slice(group.content) : undefined,\n resolve: async () => slice(await ArtifactGroup.resolveContent({ group })),\n kinds,\n ignore: group.ignore,\n });\n }\n\n /** A group's classes: inlined by a build, else its own `resolve()`, else the resolver `@venizia/ignis-boot/auto` installs. */\n static async resolveContent(opts: { group: IArtifactGroup }): Promise<IArtifactIndex> {\n const { group } = opts;\n if (group.content) {\n return group.content;\n }\n if (group.resolve) {\n return group.resolve();\n }\n const resolve = ArtifactGroup.getResolver();\n if (!resolve) {\n throw getError({\n message: `[ArtifactGroup] '${group.folder ?? '<application>'}' has no content | Import @venizia/ignis-boot/auto in the application (it resolves groups from source), or add IgnisArtifactsPlugin to the build's plugins`,\n });\n }\n return resolve({ group });\n }\n\n /** Positional on purpose: a type predicate narrows its own parameter, and an options object would narrow the wrapper instead of `value`. */\n static isGroup(value: unknown): value is IArtifactGroup {\n return (\n typeof value === 'object' &&\n value !== null &&\n ArtifactGroup.BRAND_KEY in value &&\n value[ArtifactGroup.BRAND_KEY] === true\n );\n }\n\n static setResolver(opts: { resolve: TGroupResolver | undefined }): void {\n ArtifactGroup.holder().resolve = opts.resolve;\n }\n\n static getResolver(): TGroupResolver | undefined {\n return ArtifactGroup.holder().resolve;\n }\n\n /** The error a walker over `configs.artifacts` gets for reading a kind off a group - loud, never an empty list. */\n static unreadKindError(opts: { folder: string | undefined }): Error {\n return getError({\n message: `[ArtifactGroup] '${opts.folder ?? '<application>'}' is resolved when artifacts are registered | A function that walks configs.artifacts must pass a group through untouched (ArtifactGroup.isGroup) instead of reading its kinds`,\n });\n }\n\n get configurations(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get dataSources(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get components(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get repositories(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get services(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get controllers(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n private static holder(): { resolve: TGroupResolver | undefined } {\n return SingletonRealm.resolve({\n key: ArtifactGroup.SINGLETON_REALM_KEY,\n create: () => ({ resolve: undefined }),\n });\n }\n\n /** The module that declared the group, read from the call stack. */\n private static callSite(): string | undefined {\n // A stack trace, not a failure: reading the call site needs an Error object, and nothing is thrown.\n // eslint-disable-next-line venizia/no-new-error\n return ArtifactGroup.siteFromStack({ stack: new Error().stack ?? '' });\n }\n\n /** The first frame outside the kernel's own `artifact-group` file: POSIX and Windows paths, `file://` URLs (decoded, drive kept), parentheses inside a path. */\n static siteFromStack(opts: { stack: string }): string | undefined {\n for (const raw of opts.stack.split('\\n').slice(1)) {\n const frame = raw.trim().replace(/^at\\s+/, '');\n const opening = frame.indexOf(' (');\n const location = frame.endsWith(')') && opening >= 0 ? frame.slice(opening + 2, -1) : frame;\n let file = location.replace(/:\\d+:\\d+$/, '');\n if (file.startsWith('file://')) {\n file = decodeURIComponent(file.slice('file://'.length)).replace(/^\\/([A-Za-z]:\\/)/, '$1');\n }\n const isPath = file.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(file);\n if (isPath && !/(?:^|[\\\\/])artifact-group\\.(?:ts|js)$/.test(file)) {\n return file;\n }\n }\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"artifact-group.js","sourceRoot":"","sources":["../../../../src/base/applications/artifact-group.ts"],"names":[],"mappings":"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","sourcesContent":["import { SingletonRealm } from '@/helpers/singleton-realm';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport type { IArtifactGroup, IArtifactIndex } from './common';\n\ntype TGroupResolver = (opts: { group: IArtifactGroup }) => Promise<IArtifactIndex>;\n\n/** A typed slice of a shared package's artifacts - every decorated class under a directory named `folder` in the package that defined it. A package declares one per domain, once; an application borrows it in `configs.artifacts`. The content is filled by `@venizia/ignis-boot`: inlined when the application is built, or resolved from source when artifacts are registered. */\nexport class ArtifactGroup implements IArtifactGroup {\n /** A string brand, so the group protocol is structural: `@venizia/ignis-boot/auto` builds one without depending on the kernel. */\n static readonly BRAND_KEY = 'isArtifactGroup';\n /** The realm slot `@venizia/ignis-boot` fills with the resolver for groups defined without content. */\n static readonly SINGLETON_REALM_KEY = 'artifact-group-resolver';\n\n readonly isArtifactGroup = true as const;\n readonly resolve: (() => Promise<IArtifactIndex>) | undefined;\n readonly kinds: ReadonlyArray<keyof IArtifactIndex> | undefined;\n\n private constructor(opts: {\n folder: string | undefined;\n site: string | undefined;\n content: IArtifactIndex | undefined;\n resolve?: () => Promise<IArtifactIndex>;\n kinds?: ReadonlyArray<keyof IArtifactIndex>;\n ignore?: ReadonlyArray<string>;\n }) {\n this.folder = opts.folder;\n this.site = opts.site;\n this.content = opts.content;\n this.resolve = opts.resolve;\n this.kinds = opts.kinds;\n this.ignore = opts.ignore;\n }\n\n readonly folder: string | undefined;\n readonly site: string | undefined;\n readonly content: IArtifactIndex | undefined;\n readonly ignore: ReadonlyArray<string> | undefined;\n\n /** `content` is written by the build plugin; a hand-written group passes only `folder`. */\n static define(opts: { folder: string; content?: IArtifactIndex }): ArtifactGroup {\n return new ArtifactGroup({\n folder: opts.folder,\n site: ArtifactGroup.callSite(),\n content: opts.content,\n });\n }\n\n /** Every decorated class of the calling package - an application's own artifacts, picked by its call site, so several applications in one process each get their own. `ignore` takes the globs `ignis-artifacts --ignore` takes, relative to the package `src`. `content` is written by the build plugin. */\n static application(\n opts: { ignore?: ReadonlyArray<string>; content?: IArtifactIndex } = {},\n ): ArtifactGroup {\n return new ArtifactGroup({\n folder: undefined,\n site: ArtifactGroup.callSite(),\n content: opts.content,\n ignore: opts.ignore,\n });\n }\n\n /** A group carrying only `kinds` - for a slicer that splits `configs.artifacts` by run mode. The source group is resolved when artifacts are registered, never here. */\n static pick(opts: {\n group: IArtifactGroup;\n kinds: ReadonlyArray<keyof IArtifactIndex>;\n }): ArtifactGroup {\n const { group, kinds } = opts;\n const slice = (index: IArtifactIndex): IArtifactIndex =>\n Object.fromEntries(\n kinds.filter((kind) => index[kind] !== undefined).map((kind) => [kind, index[kind]]),\n );\n\n return new ArtifactGroup({\n folder: group.folder,\n site: group.site,\n content: group.content ? slice(group.content) : undefined,\n resolve: async () => {\n const content = await ArtifactGroup.resolveContent({ group });\n return slice(content);\n },\n kinds,\n ignore: group.ignore,\n });\n }\n\n /** A group's classes: inlined by a build, else its own `resolve()`, else the resolver `@venizia/ignis-boot/auto` installs. */\n static async resolveContent(opts: { group: IArtifactGroup }): Promise<IArtifactIndex> {\n const { group } = opts;\n if (group.content) {\n return group.content;\n }\n if (group.resolve) {\n return group.resolve();\n }\n const resolve = ArtifactGroup.getResolver();\n if (!resolve) {\n throw getError({\n message: `[ArtifactGroup] '${group.folder ?? '<application>'}' has no content | Import @venizia/ignis-boot/auto in the application (it resolves groups from source), or add IgnisArtifactsPlugin to the build's plugins`,\n });\n }\n return resolve({ group });\n }\n\n /** Positional on purpose: a type predicate narrows its own parameter, and an options object would narrow the wrapper instead of `value`. */\n static isGroup(value: unknown): value is IArtifactGroup {\n return (\n typeof value === 'object' &&\n value !== null &&\n ArtifactGroup.BRAND_KEY in value &&\n value[ArtifactGroup.BRAND_KEY] === true\n );\n }\n\n static setResolver(opts: { resolve: TGroupResolver | undefined }): void {\n ArtifactGroup.holder().resolve = opts.resolve;\n }\n\n static getResolver(): TGroupResolver | undefined {\n return ArtifactGroup.holder().resolve;\n }\n\n /** The error a walker over `configs.artifacts` gets for reading a kind off a group - loud, never an empty list. */\n static unreadKindError(opts: { folder: string | undefined }): Error {\n return getError({\n message: `[ArtifactGroup] '${opts.folder ?? '<application>'}' is resolved when artifacts are registered | A function that walks configs.artifacts must pass a group through untouched (ArtifactGroup.isGroup) instead of reading its kinds`,\n });\n }\n\n get configurations(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get dataSources(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get components(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get repositories(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get services(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get controllers(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n private static holder(): { resolve: TGroupResolver | undefined } {\n return SingletonRealm.resolve({\n key: ArtifactGroup.SINGLETON_REALM_KEY,\n create: () => ({ resolve: undefined }),\n });\n }\n\n /** The module that declared the group, read from the call stack. */\n private static callSite(): string | undefined {\n // A stack trace, not a failure: reading the call site needs an Error object, and nothing is thrown.\n // eslint-disable-next-line venizia/no-new-error\n return ArtifactGroup.siteFromStack({ stack: new Error().stack ?? '' });\n }\n\n /** The first frame outside the kernel's own `artifact-group` file: POSIX and Windows paths, `file://` URLs (decoded, drive kept), parentheses inside a path. */\n static siteFromStack(opts: { stack: string }): string | undefined {\n for (const raw of opts.stack.split('\\n').slice(1)) {\n const frame = raw.trim().replace(/^at\\s+/, '');\n const opening = frame.indexOf(' (');\n const location = frame.endsWith(')') && opening >= 0 ? frame.slice(opening + 2, -1) : frame;\n let file = location.replace(/:\\d+:\\d+$/, '');\n if (file.startsWith('file://')) {\n file = decodeURIComponent(file.slice('file://'.length)).replace(/^\\/([A-Za-z]:\\/)/, '$1');\n }\n const isPath = file.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(file);\n if (isPath && !/(?:^|[\\\\/])artifact-group\\.(?:ts|js)$/.test(file)) {\n return file;\n }\n }\n return undefined;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-index.d.ts","sourceRoot":"","sources":["../../../../src/base/applications/artifact-index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAW,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,UAAU,EAAY,MAAM,6BAA6B,CAAC;AAEnE,OAAO,KAAK,EAEV,cAAc,EAEd,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAGlB,+NAA+N;AAC/N,qBAAa,mBAAoB,SAAQ,UAAU;IACjD,MAAM,CAAC,QAAQ,CAAC,mBAAmB,2BAA2B;IAE9D,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC,uMAAuM;IACvM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAOzC;IAEF,oNAAoN;IACpN,oBAAoB,IAAI,cAAc;IAsBtC,yHAAyH;IACnH,OAAO,CAAC,IAAI,EAAE;QAClB,KAAK,EAAE,mBAAmB,CAAC;QAC3B,WAAW,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IA0CrC;;;;OAIG;IACH,+BAA+B,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;KAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE;IAyE7F,iOAAiO;IACjO,OAAO,CAAC,aAAa;IAYrB,8JAA8J;IACxJ,OAAO,CAAC,IAAI,EAAE;QAClB,KAAK,EAAE,mBAAmB,CAAC;QAC3B,WAAW,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAyB7B,6KAA6K;YAC/J,SAAS;IAmBvB,4IAA4I;IAC5I,OAAO,CAAC,aAAa;IAMrB,mNAAmN;IAC7M,MAAM,CAAC,KAAK,SAAS,MAAM,cAAc,EAAE,IAAI,EAAE;QACrD,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,KAAK,EAAE,KAAK,CAAC;QACb,WAAW,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YA+B3C,UAAU;CAWzB"}
1
+ {"version":3,"file":"artifact-index.d.ts","sourceRoot":"","sources":["../../../../src/base/applications/artifact-index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAW,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,UAAU,EAAY,MAAM,6BAA6B,CAAC;AAEnE,OAAO,KAAK,EAEV,cAAc,EAEd,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAGlB,+NAA+N;AAC/N,qBAAa,mBAAoB,SAAQ,UAAU;IACjD,MAAM,CAAC,QAAQ,CAAC,mBAAmB,2BAA2B;IAE9D,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC,uMAAuM;IACvM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAOzC;IAEF,oNAAoN;IACpN,oBAAoB,IAAI,cAAc;IAsBtC,yHAAyH;IACnH,OAAO,CAAC,IAAI,EAAE;QAClB,KAAK,EAAE,mBAAmB,CAAC;QAC3B,WAAW,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IA0CrC;;;;OAIG;IACH,+BAA+B,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;KAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE;IAyE7F,iOAAiO;IACjO,OAAO,CAAC,aAAa;IAYrB,8JAA8J;IACxJ,OAAO,CAAC,IAAI,EAAE;QAClB,KAAK,EAAE,mBAAmB,CAAC;QAC3B,WAAW,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA0B7B,6KAA6K;YAC/J,SAAS;IAmBvB,4IAA4I;IAC5I,OAAO,CAAC,aAAa;IAMrB,mNAAmN;IAC7M,MAAM,CAAC,KAAK,SAAS,MAAM,cAAc,EAAE,IAAI,EAAE;QACrD,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,KAAK,EAAE,KAAK,CAAC;QACb,WAAW,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YA+B3C,UAAU;CAWzB"}
@@ -159,7 +159,8 @@ export class ArtifactIndexHelper extends BaseHelper {
159
159
  async flatten(opts) {
160
160
  const { input, application } = opts;
161
161
  if (ArtifactGroup.isGroup(input)) {
162
- return this.flatten({ input: await this.contentOf({ group: input }), application });
162
+ const result = await this.contentOf({ group: input });
163
+ return this.flatten({ input: result, application });
163
164
  }
164
165
  if (Array.isArray(input)) {
165
166
  const nested = await Promise.all(input.map((entry) => this.flatten({ input: entry, application })));
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-index.js","sourceRoot":"","sources":["../../../../src/base/applications/artifact-index.ts"],"names":[],"mappings":"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","sourcesContent":["import { MetadataRegistry } from '@/helpers/inversion';\nimport { SingletonRealm } from '@/helpers/singleton-realm';\nimport type { AnyType, TClass } from '@venizia/ignis-helpers/common';\nimport { ArtifactTypes, isClass } from '@/helpers/inversion';\nimport { BaseHelper, getError } from '@venizia/ignis-helpers/core';\nimport { ArtifactGroup } from './artifact-group';\nimport type {\n IArtifactGroup,\n IArtifactIndex,\n IConditionalArtifactIndex,\n TArtifactIndexInput,\n} from './common';\nimport { ArtifactIndexFields } from './common';\n\n/** Turns a `configs.artifacts` input into the classes to register: flattens nested indexes, drops the classes whose `when` says no, orders the rest. It never touches the container - `registerArtifacts` does the binding. */\nexport class ArtifactIndexHelper extends BaseHelper {\n static readonly SINGLETON_REALM_KEY = 'artifact-index-helper';\n\n private constructor() {\n super({ scope: ArtifactIndexHelper.name });\n }\n\n static getInstance(): ArtifactIndexHelper {\n return SingletonRealm.resolve({\n key: ArtifactIndexHelper.SINGLETON_REALM_KEY,\n create: () => new ArtifactIndexHelper(),\n });\n }\n\n /** Maps an artifact type to the index field that carries it. `ArtifactTypes.MODEL` is deliberately absent: a model has a binding namespace but no index field, because its repository registers it. */\n private static readonly INDEX_FIELD_BY_TYPE: Record<string, string> = {\n [ArtifactTypes.CONFIGURATION]: ArtifactIndexFields.CONFIGURATIONS,\n [ArtifactTypes.DATASOURCE]: ArtifactIndexFields.DATA_SOURCES,\n [ArtifactTypes.COMPONENT]: ArtifactIndexFields.COMPONENTS,\n [ArtifactTypes.REPOSITORY]: ArtifactIndexFields.REPOSITORIES,\n [ArtifactTypes.SERVICE]: ArtifactIndexFields.SERVICES,\n [ArtifactTypes.CONTROLLER]: ArtifactIndexFields.CONTROLLERS,\n };\n\n /** The index a decorator-only application has: every class a stereotype saw at import time, bucketed by its type. `when` and `order` still apply - `resolve` does that, exactly as it does for a declared index. */\n buildDiscoveredIndex(): IArtifactIndex {\n const registry = MetadataRegistry.getInstance();\n const index: Record<string, TClass<AnyType>[]> = {};\n\n const discoveredArtifacts = registry.getDiscoveredArtifacts();\n for (const target of discoveredArtifacts) {\n if (!isClass<AnyType>(target)) {\n continue;\n }\n\n const type = registry.getArtifactMetadata({ target })?.type;\n const field = type ? ArtifactIndexHelper.INDEX_FIELD_BY_TYPE[type] : undefined;\n if (!field) {\n continue;\n }\n\n index[field] = [...(index[field] ?? []), target];\n }\n\n return index;\n }\n\n /** Every kind of the input, each already filtered by `when` and sorted by `order`, keyed the way `IArtifactIndex` is. */\n async resolve(opts: {\n input: TArtifactIndexInput;\n application: unknown;\n }): Promise<Required<IArtifactIndex>> {\n const { input, application } = opts;\n const indexes = await this.flatten({ input, application });\n\n const rawConfigurations = await this.select({\n indexes,\n field: ArtifactIndexFields.CONFIGURATIONS,\n application,\n });\n const configurations = this.sortConfigurationsTopologically({\n classes: rawConfigurations,\n });\n\n const dataSources = await this.select({\n indexes,\n field: ArtifactIndexFields.DATA_SOURCES,\n application,\n });\n const components = await this.select({\n indexes,\n field: ArtifactIndexFields.COMPONENTS,\n application,\n });\n const repositories = await this.select({\n indexes,\n field: ArtifactIndexFields.REPOSITORIES,\n application,\n });\n const services = await this.select({\n indexes,\n field: ArtifactIndexFields.SERVICES,\n application,\n });\n const controllers = await this.select({\n indexes,\n field: ArtifactIndexFields.CONTROLLERS,\n application,\n });\n\n return { configurations, dataSources, components, repositories, services, controllers };\n }\n\n /**\n * Topologically sort configurations based on `after` dependencies.\n * Siblings with no dependency relation are sorted deterministically by class name.\n * Throws if an unknown `after` dependency is referenced or if a dependency cycle is detected.\n */\n sortConfigurationsTopologically(opts: { classes: ReadonlyArray<TClass<any>> }): TClass<any>[] {\n const { classes } = opts;\n if (classes.length === 0) {\n return [];\n }\n\n const registry = MetadataRegistry.getInstance();\n\n // Keyed by the class itself: two configurations may share a name (a minified build renames them),\n // and a name-keyed graph silently drops one of them.\n const inDegree = new Map<TClass<any>, number>();\n const adjacency = new Map<TClass<any>, TClass<any>[]>();\n\n for (const target of classes) {\n inDegree.set(target, 0);\n adjacency.set(target, []);\n }\n\n for (const target of classes) {\n const metadata = registry.getArtifactMetadata({ target });\n const afterList = metadata?.after ?? [];\n\n for (const prereq of afterList) {\n // A string names a class, the only form that can; a class is matched by identity.\n const prereqClass =\n typeof prereq === 'function'\n ? classes.find((candidate) => candidate === prereq)\n : classes.find((candidate) => candidate.name === String(prereq));\n\n if (!prereqClass) {\n const prereqName = typeof prereq === 'function' ? prereq.name : String(prereq);\n throw getError({\n message: `[sortConfigurationsTopologically][${target.name}] Declared 'after' dependency '${prereqName}' is not registered as a configuration`,\n });\n }\n\n adjacency.get(prereqClass)!.push(target);\n inDegree.set(target, (inDegree.get(target) ?? 0) + 1);\n }\n }\n\n // Kahn's algorithm. Siblings run in class-name order; a minified build renames classes, so an\n // order that matters belongs in `after`.\n const byName = (a: TClass<any>, b: TClass<any>) => a.name.localeCompare(b.name);\n const available = classes.filter((target) => inDegree.get(target) === 0).sort(byName);\n const sorted: TClass<any>[] = [];\n\n while (available.length > 0) {\n const current = available.shift()!;\n sorted.push(current);\n\n for (const dependent of adjacency.get(current) ?? []) {\n const newDeg = inDegree.get(dependent)! - 1;\n inDegree.set(dependent, newDeg);\n if (newDeg === 0) {\n available.push(dependent);\n available.sort(byName);\n }\n }\n }\n\n if (sorted.length !== classes.length) {\n const unvisited = classes\n .filter((target) => !sorted.includes(target))\n .map((target) => target.name);\n throw getError({\n message: `[sortConfigurationsTopologically] Dependency cycle detected in configurations: ${unvisited.join(', ')}`,\n });\n }\n\n return sorted;\n }\n\n /** Every entry of a kind must be a class. `undefined` is what an import cycle leaves - the index was read before a class's module finished loading - so it gets a message that names the cause instead of a crash on `.name`. */\n private assertClasses(opts: {\n field: string;\n classes: ReadonlyArray<unknown> | undefined;\n }): void {\n const position = (opts.classes ?? []).findIndex((target) => typeof target !== 'function');\n if (position >= 0) {\n throw getError({\n message: `[ArtifactIndex] '${opts.field}' lists an entry that is not a class (position ${position}) | Usually an import cycle: the index was read before that class's module finished loading. The module that imports the index (or @venizia/ignis-boot/auto) must not define decorated classes or be imported by them`,\n });\n }\n }\n\n /** One index, or arrays nested to any depth, as a flat list in input order; a conditional entry contributes its subtree only when its `when` answers true. */\n async flatten(opts: {\n input: TArtifactIndexInput;\n application: unknown;\n }): Promise<IArtifactIndex[]> {\n const { input, application } = opts;\n if (ArtifactGroup.isGroup(input)) {\n return this.flatten({ input: await this.contentOf({ group: input }), application });\n }\n if (Array.isArray(input)) {\n const nested = await Promise.all(\n input.map((entry) => this.flatten({ input: entry, application })),\n );\n return nested.flat();\n }\n\n if (this.isConditional(input)) {\n const isSelected = await input.when({ application });\n if (!isSelected) {\n this.logger.debug('Skipped by condition | conditional index entry');\n return [];\n }\n\n return this.flatten({ input: input.index, application });\n }\n\n return [input];\n }\n\n /** A group's classes: inlined at build time, else the resolver `@venizia/ignis-boot/auto` installs. Never empty - a group that names nothing is a typo or a moved folder. */\n private async contentOf(opts: { group: IArtifactGroup }): Promise<IArtifactIndex> {\n const { group } = opts;\n const content = await ArtifactGroup.resolveContent({ group });\n\n // One element type for the six kinds, so `.map` is callable on every member of the union.\n for (const [field, classes] of Object.entries(content)) {\n this.assertClasses({ field, classes });\n }\n const kinds: Array<ReadonlyArray<TClass<unknown>> | undefined> = Object.values(content);\n const names = kinds.flatMap((classes) => (classes ?? []).map((target) => target.name));\n if (names.length === 0 && !group.kinds) {\n throw getError({\n message: `[ArtifactGroup] '${group.folder ?? '<application>'}' resolved to no class | Defined in ${group.site ?? 'an unknown module'} - check the folder name and that its classes carry a stereotype decorator`,\n });\n }\n this.logger.info('[ArtifactGroup] %s -> %s', group.folder ?? '<application>', names.join(', '));\n return content;\n }\n\n /** Positional on purpose: a type predicate narrows its own parameter, and an options object would narrow the wrapper instead of `input`. */\n private isConditional(\n entry: IArtifactIndex | IConditionalArtifactIndex,\n ): entry is IConditionalArtifactIndex {\n return 'when' in entry && 'index' in entry;\n }\n\n /** The classes of one kind across every index, minus those whose `when` says no, sorted by `order` (stable). The `when` conditions run concurrently: each reads config and environment, never another artifact. */\n async select<Field extends keyof IArtifactIndex>(opts: {\n indexes: IArtifactIndex[];\n field: Field;\n application: unknown;\n }): Promise<NonNullable<IArtifactIndex[Field]>[number][]> {\n const { indexes, field, application } = opts;\n const registry = MetadataRegistry.getInstance();\n\n // De-duplicated: discovery and a declared index can name the same class, and registering it\n // twice trips `bootChecks.binding.allowOverride: false`. First mention wins its position.\n const listed = [...new Set(indexes.flatMap((index) => [...(index[field] ?? [])]))];\n this.assertClasses({ field, classes: listed });\n const decisions = await Promise.all(\n listed.map((target) => this.isSelected({ target, application })),\n );\n\n const kept = listed.filter((target, position) => {\n if (decisions[position]) {\n return true;\n }\n\n this.logger.debug('Skipped by condition | kind: %s | class: %s', field, target.name);\n return false;\n });\n\n return kept\n .map((target, position) => ({\n target,\n position,\n order: registry.getArtifactMetadata({ target })?.order ?? 0,\n }))\n .sort((a, b) => a.order - b.order || a.position - b.position)\n .map((entry) => entry.target);\n }\n\n private async isSelected(opts: {\n target: TClass<unknown>;\n application: unknown;\n }): Promise<boolean> {\n const { target, application } = opts;\n const when = MetadataRegistry.getInstance().getArtifactMetadata({ target })?.when;\n if (!when) {\n return true;\n }\n return when({ application });\n }\n}\n"]}
1
+ {"version":3,"file":"artifact-index.js","sourceRoot":"","sources":["../../../../src/base/applications/artifact-index.ts"],"names":[],"mappings":"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","sourcesContent":["import { MetadataRegistry } from '@/helpers/inversion';\nimport { SingletonRealm } from '@/helpers/singleton-realm';\nimport type { AnyType, TClass } from '@venizia/ignis-helpers/common';\nimport { ArtifactTypes, isClass } from '@/helpers/inversion';\nimport { BaseHelper, getError } from '@venizia/ignis-helpers/core';\nimport { ArtifactGroup } from './artifact-group';\nimport type {\n IArtifactGroup,\n IArtifactIndex,\n IConditionalArtifactIndex,\n TArtifactIndexInput,\n} from './common';\nimport { ArtifactIndexFields } from './common';\n\n/** Turns a `configs.artifacts` input into the classes to register: flattens nested indexes, drops the classes whose `when` says no, orders the rest. It never touches the container - `registerArtifacts` does the binding. */\nexport class ArtifactIndexHelper extends BaseHelper {\n static readonly SINGLETON_REALM_KEY = 'artifact-index-helper';\n\n private constructor() {\n super({ scope: ArtifactIndexHelper.name });\n }\n\n static getInstance(): ArtifactIndexHelper {\n return SingletonRealm.resolve({\n key: ArtifactIndexHelper.SINGLETON_REALM_KEY,\n create: () => new ArtifactIndexHelper(),\n });\n }\n\n /** Maps an artifact type to the index field that carries it. `ArtifactTypes.MODEL` is deliberately absent: a model has a binding namespace but no index field, because its repository registers it. */\n private static readonly INDEX_FIELD_BY_TYPE: Record<string, string> = {\n [ArtifactTypes.CONFIGURATION]: ArtifactIndexFields.CONFIGURATIONS,\n [ArtifactTypes.DATASOURCE]: ArtifactIndexFields.DATA_SOURCES,\n [ArtifactTypes.COMPONENT]: ArtifactIndexFields.COMPONENTS,\n [ArtifactTypes.REPOSITORY]: ArtifactIndexFields.REPOSITORIES,\n [ArtifactTypes.SERVICE]: ArtifactIndexFields.SERVICES,\n [ArtifactTypes.CONTROLLER]: ArtifactIndexFields.CONTROLLERS,\n };\n\n /** The index a decorator-only application has: every class a stereotype saw at import time, bucketed by its type. `when` and `order` still apply - `resolve` does that, exactly as it does for a declared index. */\n buildDiscoveredIndex(): IArtifactIndex {\n const registry = MetadataRegistry.getInstance();\n const index: Record<string, TClass<AnyType>[]> = {};\n\n const discoveredArtifacts = registry.getDiscoveredArtifacts();\n for (const target of discoveredArtifacts) {\n if (!isClass<AnyType>(target)) {\n continue;\n }\n\n const type = registry.getArtifactMetadata({ target })?.type;\n const field = type ? ArtifactIndexHelper.INDEX_FIELD_BY_TYPE[type] : undefined;\n if (!field) {\n continue;\n }\n\n index[field] = [...(index[field] ?? []), target];\n }\n\n return index;\n }\n\n /** Every kind of the input, each already filtered by `when` and sorted by `order`, keyed the way `IArtifactIndex` is. */\n async resolve(opts: {\n input: TArtifactIndexInput;\n application: unknown;\n }): Promise<Required<IArtifactIndex>> {\n const { input, application } = opts;\n const indexes = await this.flatten({ input, application });\n\n const rawConfigurations = await this.select({\n indexes,\n field: ArtifactIndexFields.CONFIGURATIONS,\n application,\n });\n const configurations = this.sortConfigurationsTopologically({\n classes: rawConfigurations,\n });\n\n const dataSources = await this.select({\n indexes,\n field: ArtifactIndexFields.DATA_SOURCES,\n application,\n });\n const components = await this.select({\n indexes,\n field: ArtifactIndexFields.COMPONENTS,\n application,\n });\n const repositories = await this.select({\n indexes,\n field: ArtifactIndexFields.REPOSITORIES,\n application,\n });\n const services = await this.select({\n indexes,\n field: ArtifactIndexFields.SERVICES,\n application,\n });\n const controllers = await this.select({\n indexes,\n field: ArtifactIndexFields.CONTROLLERS,\n application,\n });\n\n return { configurations, dataSources, components, repositories, services, controllers };\n }\n\n /**\n * Topologically sort configurations based on `after` dependencies.\n * Siblings with no dependency relation are sorted deterministically by class name.\n * Throws if an unknown `after` dependency is referenced or if a dependency cycle is detected.\n */\n sortConfigurationsTopologically(opts: { classes: ReadonlyArray<TClass<any>> }): TClass<any>[] {\n const { classes } = opts;\n if (classes.length === 0) {\n return [];\n }\n\n const registry = MetadataRegistry.getInstance();\n\n // Keyed by the class itself: two configurations may share a name (a minified build renames them),\n // and a name-keyed graph silently drops one of them.\n const inDegree = new Map<TClass<any>, number>();\n const adjacency = new Map<TClass<any>, TClass<any>[]>();\n\n for (const target of classes) {\n inDegree.set(target, 0);\n adjacency.set(target, []);\n }\n\n for (const target of classes) {\n const metadata = registry.getArtifactMetadata({ target });\n const afterList = metadata?.after ?? [];\n\n for (const prereq of afterList) {\n // A string names a class, the only form that can; a class is matched by identity.\n const prereqClass =\n typeof prereq === 'function'\n ? classes.find((candidate) => candidate === prereq)\n : classes.find((candidate) => candidate.name === String(prereq));\n\n if (!prereqClass) {\n const prereqName = typeof prereq === 'function' ? prereq.name : String(prereq);\n throw getError({\n message: `[sortConfigurationsTopologically][${target.name}] Declared 'after' dependency '${prereqName}' is not registered as a configuration`,\n });\n }\n\n adjacency.get(prereqClass)!.push(target);\n inDegree.set(target, (inDegree.get(target) ?? 0) + 1);\n }\n }\n\n // Kahn's algorithm. Siblings run in class-name order; a minified build renames classes, so an\n // order that matters belongs in `after`.\n const byName = (a: TClass<any>, b: TClass<any>) => a.name.localeCompare(b.name);\n const available = classes.filter((target) => inDegree.get(target) === 0).sort(byName);\n const sorted: TClass<any>[] = [];\n\n while (available.length > 0) {\n const current = available.shift()!;\n sorted.push(current);\n\n for (const dependent of adjacency.get(current) ?? []) {\n const newDeg = inDegree.get(dependent)! - 1;\n inDegree.set(dependent, newDeg);\n if (newDeg === 0) {\n available.push(dependent);\n available.sort(byName);\n }\n }\n }\n\n if (sorted.length !== classes.length) {\n const unvisited = classes\n .filter((target) => !sorted.includes(target))\n .map((target) => target.name);\n throw getError({\n message: `[sortConfigurationsTopologically] Dependency cycle detected in configurations: ${unvisited.join(', ')}`,\n });\n }\n\n return sorted;\n }\n\n /** Every entry of a kind must be a class. `undefined` is what an import cycle leaves - the index was read before a class's module finished loading - so it gets a message that names the cause instead of a crash on `.name`. */\n private assertClasses(opts: {\n field: string;\n classes: ReadonlyArray<unknown> | undefined;\n }): void {\n const position = (opts.classes ?? []).findIndex((target) => typeof target !== 'function');\n if (position >= 0) {\n throw getError({\n message: `[ArtifactIndex] '${opts.field}' lists an entry that is not a class (position ${position}) | Usually an import cycle: the index was read before that class's module finished loading. The module that imports the index (or @venizia/ignis-boot/auto) must not define decorated classes or be imported by them`,\n });\n }\n }\n\n /** One index, or arrays nested to any depth, as a flat list in input order; a conditional entry contributes its subtree only when its `when` answers true. */\n async flatten(opts: {\n input: TArtifactIndexInput;\n application: unknown;\n }): Promise<IArtifactIndex[]> {\n const { input, application } = opts;\n if (ArtifactGroup.isGroup(input)) {\n const result = await this.contentOf({ group: input });\n return this.flatten({ input: result, application });\n }\n if (Array.isArray(input)) {\n const nested = await Promise.all(\n input.map((entry) => this.flatten({ input: entry, application })),\n );\n return nested.flat();\n }\n\n if (this.isConditional(input)) {\n const isSelected = await input.when({ application });\n if (!isSelected) {\n this.logger.debug('Skipped by condition | conditional index entry');\n return [];\n }\n\n return this.flatten({ input: input.index, application });\n }\n\n return [input];\n }\n\n /** A group's classes: inlined at build time, else the resolver `@venizia/ignis-boot/auto` installs. Never empty - a group that names nothing is a typo or a moved folder. */\n private async contentOf(opts: { group: IArtifactGroup }): Promise<IArtifactIndex> {\n const { group } = opts;\n const content = await ArtifactGroup.resolveContent({ group });\n\n // One element type for the six kinds, so `.map` is callable on every member of the union.\n for (const [field, classes] of Object.entries(content)) {\n this.assertClasses({ field, classes });\n }\n const kinds: Array<ReadonlyArray<TClass<unknown>> | undefined> = Object.values(content);\n const names = kinds.flatMap((classes) => (classes ?? []).map((target) => target.name));\n if (names.length === 0 && !group.kinds) {\n throw getError({\n message: `[ArtifactGroup] '${group.folder ?? '<application>'}' resolved to no class | Defined in ${group.site ?? 'an unknown module'} - check the folder name and that its classes carry a stereotype decorator`,\n });\n }\n this.logger.info('[ArtifactGroup] %s -> %s', group.folder ?? '<application>', names.join(', '));\n return content;\n }\n\n /** Positional on purpose: a type predicate narrows its own parameter, and an options object would narrow the wrapper instead of `input`. */\n private isConditional(\n entry: IArtifactIndex | IConditionalArtifactIndex,\n ): entry is IConditionalArtifactIndex {\n return 'when' in entry && 'index' in entry;\n }\n\n /** The classes of one kind across every index, minus those whose `when` says no, sorted by `order` (stable). The `when` conditions run concurrently: each reads config and environment, never another artifact. */\n async select<Field extends keyof IArtifactIndex>(opts: {\n indexes: IArtifactIndex[];\n field: Field;\n application: unknown;\n }): Promise<NonNullable<IArtifactIndex[Field]>[number][]> {\n const { indexes, field, application } = opts;\n const registry = MetadataRegistry.getInstance();\n\n // De-duplicated: discovery and a declared index can name the same class, and registering it\n // twice trips `bootChecks.binding.allowOverride: false`. First mention wins its position.\n const listed = [...new Set(indexes.flatMap((index) => [...(index[field] ?? [])]))];\n this.assertClasses({ field, classes: listed });\n const decisions = await Promise.all(\n listed.map((target) => this.isSelected({ target, application })),\n );\n\n const kept = listed.filter((target, position) => {\n if (decisions[position]) {\n return true;\n }\n\n this.logger.debug('Skipped by condition | kind: %s | class: %s', field, target.name);\n return false;\n });\n\n return kept\n .map((target, position) => ({\n target,\n position,\n order: registry.getArtifactMetadata({ target })?.order ?? 0,\n }))\n .sort((a, b) => a.order - b.order || a.position - b.position)\n .map((entry) => entry.target);\n }\n\n private async isSelected(opts: {\n target: TClass<unknown>;\n application: unknown;\n }): Promise<boolean> {\n const { target, application } = opts;\n const when = MetadataRegistry.getInstance().getArtifactMetadata({ target })?.when;\n if (!when) {\n return true;\n }\n return when({ application });\n }\n}\n"]}
@@ -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',