@herrromich/az-functions 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +830 -0
  3. package/coverage/cobertura-coverage.xml +3482 -0
  4. package/coverage/lcov-report/base.css +224 -0
  5. package/coverage/lcov-report/block-navigation.js +87 -0
  6. package/coverage/lcov-report/context/forked-invocation-context.ts.html +127 -0
  7. package/coverage/lcov-report/context/index.html +191 -0
  8. package/coverage/lcov-report/context/index.ts.html +97 -0
  9. package/coverage/lcov-report/context/platform-context.manager.ts.html +193 -0
  10. package/coverage/lcov-report/context/platform-context.model.ts.html +262 -0
  11. package/coverage/lcov-report/context/platform-context.provider.ts.html +196 -0
  12. package/coverage/lcov-report/context/platform.execution.context.ts.html +217 -0
  13. package/coverage/lcov-report/context/wrapped-invocation-context.ts.html +163 -0
  14. package/coverage/lcov-report/event-hub-handler/azure-event-hub-trigger.model.ts.html +187 -0
  15. package/coverage/lcov-report/event-hub-handler/azure-event-hub-trigger.service.ts.html +760 -0
  16. package/coverage/lcov-report/event-hub-handler/decorators/decorators.model.ts.html +292 -0
  17. package/coverage/lcov-report/event-hub-handler/decorators/decorators.ts.html +778 -0
  18. package/coverage/lcov-report/event-hub-handler/decorators/index.html +146 -0
  19. package/coverage/lcov-report/event-hub-handler/decorators/index.ts.html +91 -0
  20. package/coverage/lcov-report/event-hub-handler/event-hub-handle-method-args-metadata.service.ts.html +130 -0
  21. package/coverage/lcov-report/event-hub-handler/event-hub-handler-metadata.reader.ts.html +199 -0
  22. package/coverage/lcov-report/event-hub-handler/event-hub-handler-registration.service.ts.html +220 -0
  23. package/coverage/lcov-report/event-hub-handler/event-hub-handler.factory.ts.html +283 -0
  24. package/coverage/lcov-report/event-hub-handler/event-hub-handler.model.ts.html +421 -0
  25. package/coverage/lcov-report/event-hub-handler/event-hub-handler.provider.ts.html +187 -0
  26. package/coverage/lcov-report/event-hub-handler/event-hub-trigger-support.factory.ts.html +787 -0
  27. package/coverage/lcov-report/event-hub-handler/event-hub-trigger-support.service.ts.html +829 -0
  28. package/coverage/lcov-report/event-hub-handler/event-hub-trigger.model.ts.html +193 -0
  29. package/coverage/lcov-report/event-hub-handler/event-hub-trigger.service.ts.html +859 -0
  30. package/coverage/lcov-report/event-hub-handler/event-hub-triggers-registration.service.ts.html +307 -0
  31. package/coverage/lcov-report/event-hub-handler/index.html +221 -0
  32. package/coverage/lcov-report/event-hub-handler/index.ts.html +142 -0
  33. package/coverage/lcov-report/eventhub-handler/decorators/decorators.model.ts.html +277 -0
  34. package/coverage/lcov-report/eventhub-handler/decorators/decorators.ts.html +679 -0
  35. package/coverage/lcov-report/eventhub-handler/decorators/index.html +131 -0
  36. package/coverage/lcov-report/eventhub-handler/eventhub-handler-metadata.reader.ts.html +196 -0
  37. package/coverage/lcov-report/eventhub-handler/eventhub-handler-registration.service.ts.html +220 -0
  38. package/coverage/lcov-report/eventhub-handler/eventhub-handler.factory.ts.html +193 -0
  39. package/coverage/lcov-report/eventhub-handler/eventhub-handler.model.ts.html +406 -0
  40. package/coverage/lcov-report/eventhub-handler/eventhub-trigger.model.ts.html +187 -0
  41. package/coverage/lcov-report/eventhub-handler/eventhub-trigger.service.ts.html +760 -0
  42. package/coverage/lcov-report/eventhub-handler/eventhub-triggers-registration.service.ts.html +304 -0
  43. package/coverage/lcov-report/eventhub-handler/index.html +206 -0
  44. package/coverage/lcov-report/favicon.png +0 -0
  45. package/coverage/lcov-report/forked-invocation-context.ts.html +127 -0
  46. package/coverage/lcov-report/function-handler-metadata.reader.ts.html +172 -0
  47. package/coverage/lcov-report/http-controller/authentication.provider.ts.html +481 -0
  48. package/coverage/lcov-report/http-controller/authenticator.provider.ts.html +460 -0
  49. package/coverage/lcov-report/http-controller/azure-http-trigger.service.ts.html +1045 -0
  50. package/coverage/lcov-report/http-controller/decorators/decorators.model.ts.html +388 -0
  51. package/coverage/lcov-report/http-controller/decorators/decorators.ts.html +1627 -0
  52. package/coverage/lcov-report/http-controller/decorators/index.html +146 -0
  53. package/coverage/lcov-report/http-controller/decorators/index.ts.html +94 -0
  54. package/coverage/lcov-report/http-controller/http-controller-metadata.reader.ts.html +271 -0
  55. package/coverage/lcov-report/http-controller/http-controller-metadata.service.ts.html +130 -0
  56. package/coverage/lcov-report/http-controller/http-controller-platform.model.ts.html +187 -0
  57. package/coverage/lcov-report/http-controller/http-controller-registration.service.ts.html +241 -0
  58. package/coverage/lcov-report/http-controller/http-controller.model.ts.html +745 -0
  59. package/coverage/lcov-report/http-controller/http-handler-support.factory.ts.html +499 -0
  60. package/coverage/lcov-report/http-controller/http-handler.factory.ts.html +415 -0
  61. package/coverage/lcov-report/http-controller/http-operation-registration.service.ts.html +328 -0
  62. package/coverage/lcov-report/http-controller/http-operations-registration.service.ts.html +328 -0
  63. package/coverage/lcov-report/http-controller/http-request-arg-provider.factory.ts.html +580 -0
  64. package/coverage/lcov-report/http-controller/http-request-handler.provider.ts.html +388 -0
  65. package/coverage/lcov-report/http-controller/http-response-processor.factory.ts.html +316 -0
  66. package/coverage/lcov-report/http-controller/index.html +311 -0
  67. package/coverage/lcov-report/http-controller/index.ts.html +226 -0
  68. package/coverage/lcov-report/http-controller/open-api-definition.service.ts.html +568 -0
  69. package/coverage/lcov-report/http-controller/open-api-metadata.service.ts.html +373 -0
  70. package/coverage/lcov-report/http-controller/open-api-print.service.ts.html +232 -0
  71. package/coverage/lcov-report/http-controller/open-api-registration.service.ts.html +220 -0
  72. package/coverage/lcov-report/http-controller/rest-open-api.regstry.ts.html +262 -0
  73. package/coverage/lcov-report/http-controller/security/authentication-service.factory.ts.html +280 -0
  74. package/coverage/lcov-report/http-controller/security/authentication-service.ts.html +115 -0
  75. package/coverage/lcov-report/http-controller/security/authenticator.provider.ts.html +799 -0
  76. package/coverage/lcov-report/http-controller/security/bearer-security-authentication.service.ts.html +133 -0
  77. package/coverage/lcov-report/http-controller/security/index.html +206 -0
  78. package/coverage/lcov-report/http-controller/security/index.ts.html +94 -0
  79. package/coverage/lcov-report/http-controller/security/model.ts.html +133 -0
  80. package/coverage/lcov-report/http-controller/security/operation-authentication.resolver.ts.html +418 -0
  81. package/coverage/lcov-report/http-controller/security/principal-merge.service.ts.html +163 -0
  82. package/coverage/lcov-report/http-controller/security/strict-principal-merge.servce.ts.html +154 -0
  83. package/coverage/lcov-report/http-controller/swagger-handling.service.ts.html +463 -0
  84. package/coverage/lcov-report/index.html +281 -0
  85. package/coverage/lcov-report/init.ts.html +97 -0
  86. package/coverage/lcov-report/ioc-container.utils.ts.html +100 -0
  87. package/coverage/lcov-report/logger/azure-log-transport.service.ts.html +433 -0
  88. package/coverage/lcov-report/logger/bindings.ts.html +253 -0
  89. package/coverage/lcov-report/logger/index.html +221 -0
  90. package/coverage/lcov-report/logger/index.ts.html +163 -0
  91. package/coverage/lcov-report/logger/log-level.service.ts.html +127 -0
  92. package/coverage/lcov-report/logger/log-transport.service.ts.html +571 -0
  93. package/coverage/lcov-report/logger/logger-factory.provider.ts.html +142 -0
  94. package/coverage/lcov-report/logger/logger.factory.ts.html +172 -0
  95. package/coverage/lcov-report/logger/logger.model.ts.html +868 -0
  96. package/coverage/lcov-report/logger/logger.utils.ts.html +877 -0
  97. package/coverage/lcov-report/logger/model.ts.html +172 -0
  98. package/coverage/lcov-report/logger/otel.logger.ts.html +358 -0
  99. package/coverage/lcov-report/logger/platform.logger.ts.html +229 -0
  100. package/coverage/lcov-report/logger/trie-search.service.ts.html +616 -0
  101. package/coverage/lcov-report/platform/azure-platform.ts.html +256 -0
  102. package/coverage/lcov-report/platform/index.html +176 -0
  103. package/coverage/lcov-report/platform/index.ts.html +139 -0
  104. package/coverage/lcov-report/platform/platform-component-metadata.service.ts.html +115 -0
  105. package/coverage/lcov-report/platform/register-function.factory.ts.html +145 -0
  106. package/coverage/lcov-report/platform/register-trigger-handler.factory.ts.html +214 -0
  107. package/coverage/lcov-report/platform/security-context.ts.html +127 -0
  108. package/coverage/lcov-report/platform/startup.service.ts.html +106 -0
  109. package/coverage/lcov-report/platform/system-logger-name.provider.ts.html +145 -0
  110. package/coverage/lcov-report/platform/system.container.ts.html +169 -0
  111. package/coverage/lcov-report/platform-context.model.ts.html +124 -0
  112. package/coverage/lcov-report/platform.logger.ts.html +316 -0
  113. package/coverage/lcov-report/platform.model.ts.html +292 -0
  114. package/coverage/lcov-report/prettify.css +1 -0
  115. package/coverage/lcov-report/prettify.js +2 -0
  116. package/coverage/lcov-report/security/index.html +146 -0
  117. package/coverage/lcov-report/security/index.ts.html +91 -0
  118. package/coverage/lcov-report/security/security-context.ts.html +130 -0
  119. package/coverage/lcov-report/security/security.model.ts.html +169 -0
  120. package/coverage/lcov-report/shared/all-settled.util.ts.html +118 -0
  121. package/coverage/lcov-report/shared/decorators/decorators.model.ts.html +136 -0
  122. package/coverage/lcov-report/shared/decorators/decorators.ts.html +346 -0
  123. package/coverage/lcov-report/shared/decorators/index.html +146 -0
  124. package/coverage/lcov-report/shared/decorators/index.ts.html +91 -0
  125. package/coverage/lcov-report/shared/function-handler-metadata.reader.ts.html +172 -0
  126. package/coverage/lcov-report/shared/index.html +176 -0
  127. package/coverage/lcov-report/shared/index.ts.html +133 -0
  128. package/coverage/lcov-report/shared/ioc-container.utils.ts.html +115 -0
  129. package/coverage/lcov-report/shared/platform-context-local-storage.ts.html +133 -0
  130. package/coverage/lcov-report/shared/platform-context.manager.ts.html +253 -0
  131. package/coverage/lcov-report/shared/platform.context.provider.ts.html +136 -0
  132. package/coverage/lcov-report/shared/platform.model.ts.html +298 -0
  133. package/coverage/lcov-report/shared/security.model.ts.html +142 -0
  134. package/coverage/lcov-report/shared/trie-search.service.ts.html +337 -0
  135. package/coverage/lcov-report/shared/trigger-handler-metadata.reader.ts.html +166 -0
  136. package/coverage/lcov-report/shared/zod-parser-wrapper.service.ts.html +217 -0
  137. package/coverage/lcov-report/shared/zod-parser-wrapper.ts.html +232 -0
  138. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  139. package/coverage/lcov-report/sorter.js +210 -0
  140. package/coverage/lcov-report/src/context/index.html +191 -0
  141. package/coverage/lcov-report/src/context/index.ts.html +97 -0
  142. package/coverage/lcov-report/src/context/platform-context.manager.ts.html +193 -0
  143. package/coverage/lcov-report/src/context/platform-context.model.ts.html +262 -0
  144. package/coverage/lcov-report/src/context/platform-context.provider.ts.html +196 -0
  145. package/coverage/lcov-report/src/context/platform.execution.context.ts.html +217 -0
  146. package/coverage/lcov-report/src/context/wrapped-invocation-context.ts.html +163 -0
  147. package/coverage/lcov-report/src/event-hub-handler/azure-event-hub-trigger.model.ts.html +187 -0
  148. package/coverage/lcov-report/src/event-hub-handler/azure-event-hub-trigger.service.ts.html +769 -0
  149. package/coverage/lcov-report/src/event-hub-handler/decorators/decorators.model.ts.html +313 -0
  150. package/coverage/lcov-report/src/event-hub-handler/decorators/decorators.ts.html +778 -0
  151. package/coverage/lcov-report/src/event-hub-handler/decorators/index.html +146 -0
  152. package/coverage/lcov-report/src/event-hub-handler/decorators/index.ts.html +91 -0
  153. package/coverage/lcov-report/src/event-hub-handler/event-hub-handle-method-args-metadata.service.ts.html +130 -0
  154. package/coverage/lcov-report/src/event-hub-handler/event-hub-handler-metadata.reader.ts.html +199 -0
  155. package/coverage/lcov-report/src/event-hub-handler/event-hub-handler-registration.service.ts.html +220 -0
  156. package/coverage/lcov-report/src/event-hub-handler/event-hub-handler.factory.ts.html +283 -0
  157. package/coverage/lcov-report/src/event-hub-handler/event-hub-handler.model.ts.html +421 -0
  158. package/coverage/lcov-report/src/event-hub-handler/event-hub-handler.provider.ts.html +187 -0
  159. package/coverage/lcov-report/src/event-hub-handler/event-hub-trigger-support.factory.ts.html +787 -0
  160. package/coverage/lcov-report/src/event-hub-handler/event-hub-trigger-support.service.ts.html +832 -0
  161. package/coverage/lcov-report/src/event-hub-handler/event-hub-trigger.model.ts.html +193 -0
  162. package/coverage/lcov-report/src/event-hub-handler/event-hub-trigger.service.ts.html +859 -0
  163. package/coverage/lcov-report/src/event-hub-handler/event-hub-triggers-registration.service.ts.html +307 -0
  164. package/coverage/lcov-report/src/event-hub-handler/index.html +221 -0
  165. package/coverage/lcov-report/src/event-hub-handler/index.ts.html +142 -0
  166. package/coverage/lcov-report/src/framework.container.ts.html +157 -0
  167. package/coverage/lcov-report/src/http-controller/authentication.provider.ts.html +481 -0
  168. package/coverage/lcov-report/src/http-controller/authenticator.provider.ts.html +460 -0
  169. package/coverage/lcov-report/src/http-controller/azure-http-trigger.service.ts.html +865 -0
  170. package/coverage/lcov-report/src/http-controller/decorators/decorators.model.ts.html +553 -0
  171. package/coverage/lcov-report/src/http-controller/decorators/decorators.ts.html +1633 -0
  172. package/coverage/lcov-report/src/http-controller/decorators/index.html +146 -0
  173. package/coverage/lcov-report/src/http-controller/decorators/index.ts.html +94 -0
  174. package/coverage/lcov-report/src/http-controller/http-controller-metadata.reader.ts.html +271 -0
  175. package/coverage/lcov-report/src/http-controller/http-controller-metadata.service.ts.html +121 -0
  176. package/coverage/lcov-report/src/http-controller/http-controller-platform.model.ts.html +187 -0
  177. package/coverage/lcov-report/src/http-controller/http-controller-registration.service.ts.html +241 -0
  178. package/coverage/lcov-report/src/http-controller/http-controller.model.ts.html +784 -0
  179. package/coverage/lcov-report/src/http-controller/http-handler-support.factory.ts.html +481 -0
  180. package/coverage/lcov-report/src/http-controller/http-handler.factory.ts.html +406 -0
  181. package/coverage/lcov-report/src/http-controller/http-operation-registration.service.ts.html +328 -0
  182. package/coverage/lcov-report/src/http-controller/http-operations-registration.service.ts.html +328 -0
  183. package/coverage/lcov-report/src/http-controller/http-request-arg-provider.factory.ts.html +580 -0
  184. package/coverage/lcov-report/src/http-controller/http-request-handler.provider.ts.html +388 -0
  185. package/coverage/lcov-report/src/http-controller/http-response-processor.factory.ts.html +316 -0
  186. package/coverage/lcov-report/src/http-controller/index.html +311 -0
  187. package/coverage/lcov-report/src/http-controller/index.ts.html +226 -0
  188. package/coverage/lcov-report/src/http-controller/open-api-definition.service.ts.html +550 -0
  189. package/coverage/lcov-report/src/http-controller/open-api-metadata.service.ts.html +373 -0
  190. package/coverage/lcov-report/src/http-controller/open-api-print.service.ts.html +232 -0
  191. package/coverage/lcov-report/src/http-controller/open-api-registration.service.ts.html +220 -0
  192. package/coverage/lcov-report/src/http-controller/rest-open-api.regstry.ts.html +262 -0
  193. package/coverage/lcov-report/src/http-controller/security/authentication-service.factory.ts.html +280 -0
  194. package/coverage/lcov-report/src/http-controller/security/authentication-service.ts.html +139 -0
  195. package/coverage/lcov-report/src/http-controller/security/authenticator.provider.ts.html +799 -0
  196. package/coverage/lcov-report/src/http-controller/security/bearer-security-authentication.service.ts.html +133 -0
  197. package/coverage/lcov-report/src/http-controller/security/index.html +206 -0
  198. package/coverage/lcov-report/src/http-controller/security/index.ts.html +94 -0
  199. package/coverage/lcov-report/src/http-controller/security/model.ts.html +133 -0
  200. package/coverage/lcov-report/src/http-controller/security/operation-authentication.resolver.ts.html +418 -0
  201. package/coverage/lcov-report/src/http-controller/security/principal-merge.service.ts.html +163 -0
  202. package/coverage/lcov-report/src/http-controller/security/strict-principal-merge.servce.ts.html +154 -0
  203. package/coverage/lcov-report/src/http-controller/swagger-handling.service.ts.html +463 -0
  204. package/coverage/lcov-report/src/index.html +161 -0
  205. package/coverage/lcov-report/src/init.ts.html +97 -0
  206. package/coverage/lcov-report/src/logger/azure-log-transport.service.ts.html +433 -0
  207. package/coverage/lcov-report/src/logger/bindings.ts.html +253 -0
  208. package/coverage/lcov-report/src/logger/index.html +221 -0
  209. package/coverage/lcov-report/src/logger/index.ts.html +163 -0
  210. package/coverage/lcov-report/src/logger/log-level.service.ts.html +127 -0
  211. package/coverage/lcov-report/src/logger/log-transport.service.ts.html +571 -0
  212. package/coverage/lcov-report/src/logger/logger-factory.provider.ts.html +142 -0
  213. package/coverage/lcov-report/src/logger/logger.factory.ts.html +172 -0
  214. package/coverage/lcov-report/src/logger/logger.model.ts.html +868 -0
  215. package/coverage/lcov-report/src/logger/logger.utils.ts.html +877 -0
  216. package/coverage/lcov-report/src/logger/otel.logger.ts.html +358 -0
  217. package/coverage/lcov-report/src/logger/platform.logger.ts.html +229 -0
  218. package/coverage/lcov-report/src/logger/trie-search.service.ts.html +616 -0
  219. package/coverage/lcov-report/src/middleware.ts.html +232 -0
  220. package/coverage/lcov-report/src/platform/azure-platform.ts.html +256 -0
  221. package/coverage/lcov-report/src/platform/index.html +176 -0
  222. package/coverage/lcov-report/src/platform/index.ts.html +139 -0
  223. package/coverage/lcov-report/src/platform/platform-component-metadata.service.ts.html +115 -0
  224. package/coverage/lcov-report/src/platform/register-function.factory.ts.html +145 -0
  225. package/coverage/lcov-report/src/platform/register-trigger-handler.factory.ts.html +214 -0
  226. package/coverage/lcov-report/src/platform/security-context.ts.html +127 -0
  227. package/coverage/lcov-report/src/platform/startup.service.ts.html +202 -0
  228. package/coverage/lcov-report/src/platform/system-logger-name.provider.ts.html +145 -0
  229. package/coverage/lcov-report/src/platform/system.container.ts.html +172 -0
  230. package/coverage/lcov-report/src/platform.container.ts.html +148 -0
  231. package/coverage/lcov-report/src/security/index.html +146 -0
  232. package/coverage/lcov-report/src/security/index.ts.html +91 -0
  233. package/coverage/lcov-report/src/security/security-context.ts.html +175 -0
  234. package/coverage/lcov-report/src/security/security.model.ts.html +223 -0
  235. package/coverage/lcov-report/src/shared/decorators/decorators.model.ts.html +136 -0
  236. package/coverage/lcov-report/src/shared/decorators/decorators.ts.html +346 -0
  237. package/coverage/lcov-report/src/shared/decorators/index.html +146 -0
  238. package/coverage/lcov-report/src/shared/decorators/index.ts.html +91 -0
  239. package/coverage/lcov-report/src/shared/index.html +176 -0
  240. package/coverage/lcov-report/src/shared/index.ts.html +133 -0
  241. package/coverage/lcov-report/src/shared/ioc-container.utils.ts.html +115 -0
  242. package/coverage/lcov-report/src/shared/platform-context-local-storage.ts.html +133 -0
  243. package/coverage/lcov-report/src/shared/platform.model.ts.html +298 -0
  244. package/coverage/lcov-report/src/shared/security.model.ts.html +139 -0
  245. package/coverage/lcov-report/src/shared/trie-search.service.ts.html +337 -0
  246. package/coverage/lcov-report/src/shared/trigger-handler-metadata.reader.ts.html +166 -0
  247. package/coverage/lcov-report/src/shared/zod-parser-wrapper.ts.html +232 -0
  248. package/coverage/lcov-report/test/index.html +116 -0
  249. package/coverage/lcov-report/test/utils.ts.html +100 -0
  250. package/coverage/lcov-report/test-utils/index.html +116 -0
  251. package/coverage/lcov-report/test-utils/utils.ts.html +100 -0
  252. package/coverage/lcov-report/trie-search.service.ts.html +469 -0
  253. package/coverage/lcov-report/trigger-handler-metadata.reader.ts.html +187 -0
  254. package/coverage/lcov-report/wrapped-invocation-context.ts.html +163 -0
  255. package/coverage/lcov-report/zod-parser-wrapper.ts.html +232 -0
  256. package/coverage/lcov.info +3220 -0
  257. package/dist/assets/swagger-ui/LICENSE +202 -0
  258. package/dist/assets/swagger-ui/NOTICE +2 -0
  259. package/dist/assets/swagger-ui/README.md +40 -0
  260. package/dist/assets/swagger-ui/absolute-path.js +1 -0
  261. package/dist/assets/swagger-ui/favicon-16x16.png +0 -0
  262. package/dist/assets/swagger-ui/favicon-32x32.png +0 -0
  263. package/dist/assets/swagger-ui/index.css +16 -0
  264. package/dist/assets/swagger-ui/index.html +19 -0
  265. package/dist/assets/swagger-ui/index.js +1 -0
  266. package/dist/assets/swagger-ui/log.bundle-sizes.swagger-ui.txt +114 -0
  267. package/dist/assets/swagger-ui/log.es-bundle-core-sizes.swagger-ui.txt +14 -0
  268. package/dist/assets/swagger-ui/log.es-bundle-sizes.swagger-ui.txt +114 -0
  269. package/dist/assets/swagger-ui/oauth2-redirect.html +6 -0
  270. package/dist/assets/swagger-ui/oauth2-redirect.js +1 -0
  271. package/dist/assets/swagger-ui/package.json +20 -0
  272. package/dist/assets/swagger-ui/swagger-initializer.js +1 -0
  273. package/dist/assets/swagger-ui/swagger-ui-bundle.js +2 -0
  274. package/dist/assets/swagger-ui/swagger-ui-bundle.js.LICENSE.txt +106 -0
  275. package/dist/assets/swagger-ui/swagger-ui-bundle.js.map +1 -0
  276. package/dist/assets/swagger-ui/swagger-ui-es-bundle-core.js +2 -0
  277. package/dist/assets/swagger-ui/swagger-ui-es-bundle-core.js.LICENSE.txt +35 -0
  278. package/dist/assets/swagger-ui/swagger-ui-es-bundle-core.js.map +1 -0
  279. package/dist/assets/swagger-ui/swagger-ui-es-bundle.js +2 -0
  280. package/dist/assets/swagger-ui/swagger-ui-es-bundle.js.LICENSE.txt +106 -0
  281. package/dist/assets/swagger-ui/swagger-ui-es-bundle.js.map +1 -0
  282. package/dist/assets/swagger-ui/swagger-ui-standalone-preset.js +2 -0
  283. package/dist/assets/swagger-ui/swagger-ui-standalone-preset.js.LICENSE.txt +22 -0
  284. package/dist/assets/swagger-ui/swagger-ui-standalone-preset.js.map +1 -0
  285. package/dist/assets/swagger-ui/swagger-ui.css +3 -0
  286. package/dist/assets/swagger-ui/swagger-ui.css.map +1 -0
  287. package/dist/assets/swagger-ui/swagger-ui.js +1 -0
  288. package/dist/assets/swagger-ui/swagger-ui.js.map +1 -0
  289. package/dist/index.cjs +3 -0
  290. package/dist/index.cjs.LICENSE.txt +24 -0
  291. package/dist/src/context/index.d.ts +4 -0
  292. package/dist/src/context/platform-context.manager.d.ts +23 -0
  293. package/dist/src/context/platform-context.model.d.ts +56 -0
  294. package/dist/src/context/platform-context.provider.d.ts +23 -0
  295. package/dist/src/context/platform.execution.context.d.ts +13 -0
  296. package/dist/src/context/wrapped-invocation-context.d.ts +5 -0
  297. package/dist/src/event-hub-handler/decorators/decorators.d.ts +161 -0
  298. package/dist/src/event-hub-handler/decorators/decorators.model.d.ts +62 -0
  299. package/dist/src/event-hub-handler/decorators/index.d.ts +2 -0
  300. package/dist/src/event-hub-handler/event-hub-handler-metadata.reader.d.ts +8 -0
  301. package/dist/src/event-hub-handler/event-hub-handler-registration.service.d.ts +12 -0
  302. package/dist/src/event-hub-handler/event-hub-handler.factory.d.ts +13 -0
  303. package/dist/src/event-hub-handler/event-hub-handler.model.d.ts +101 -0
  304. package/dist/src/event-hub-handler/event-hub-trigger-support.factory.d.ts +10 -0
  305. package/dist/src/event-hub-handler/event-hub-trigger.model.d.ts +39 -0
  306. package/dist/src/event-hub-handler/event-hub-triggers-registration.service.d.ts +18 -0
  307. package/dist/src/event-hub-handler/index.d.ts +4 -0
  308. package/dist/src/framework.container.d.ts +6 -0
  309. package/dist/src/http-controller/decorators/decorators.d.ts +410 -0
  310. package/dist/src/http-controller/decorators/decorators.model.d.ts +123 -0
  311. package/dist/src/http-controller/decorators/index.d.ts +3 -0
  312. package/dist/src/http-controller/http-controller-metadata.reader.d.ts +8 -0
  313. package/dist/src/http-controller/http-controller-registration.service.d.ts +12 -0
  314. package/dist/src/http-controller/http-controller.model.d.ts +131 -0
  315. package/dist/src/http-controller/http-handler-support.factory.d.ts +26 -0
  316. package/dist/src/http-controller/http-handler.factory.d.ts +16 -0
  317. package/dist/src/http-controller/http-operations-registration.service.d.ts +22 -0
  318. package/dist/src/http-controller/http-request-arg-provider.factory.d.ts +12 -0
  319. package/dist/src/http-controller/http-response-processor.factory.d.ts +10 -0
  320. package/dist/src/http-controller/index.d.ts +11 -0
  321. package/dist/src/http-controller/open-api-definition.service.d.ts +29 -0
  322. package/dist/src/http-controller/open-api-metadata.service.d.ts +11 -0
  323. package/dist/src/http-controller/open-api-print.service.d.ts +8 -0
  324. package/dist/src/http-controller/open-api-registration.service.d.ts +17 -0
  325. package/dist/src/http-controller/security/authentication-service.d.ts +15 -0
  326. package/dist/src/http-controller/security/authenticator.provider.d.ts +31 -0
  327. package/dist/src/http-controller/security/bearer-security-authentication.service.d.ts +9 -0
  328. package/dist/src/http-controller/security/bearer-token.service.d.ts +5 -0
  329. package/dist/src/http-controller/security/index.d.ts +3 -0
  330. package/dist/src/http-controller/security/operation-authentication.resolver.d.ts +18 -0
  331. package/dist/src/http-controller/security/principal-merge.service.d.ts +11 -0
  332. package/dist/src/http-controller/security/strict-principal-merge.servce.d.ts +5 -0
  333. package/dist/src/http-controller/swagger-handling.service.d.ts +11 -0
  334. package/dist/src/index.d.ts +9 -0
  335. package/dist/src/init.d.ts +1 -0
  336. package/dist/src/logger/bindings.d.ts +7 -0
  337. package/dist/src/logger/index.d.ts +6 -0
  338. package/dist/src/logger/log-level.service.d.ts +7 -0
  339. package/dist/src/logger/log-transport.service.d.ts +19 -0
  340. package/dist/src/logger/logger.model.d.ts +241 -0
  341. package/dist/src/logger/logger.utils.d.ts +17 -0
  342. package/dist/src/logger/otel.logger.d.ts +9 -0
  343. package/dist/src/logger/trie-search.service.d.ts +65 -0
  344. package/dist/src/middleware.d.ts +10 -0
  345. package/dist/src/platform/azure-platform.d.ts +15 -0
  346. package/dist/src/platform/index.d.ts +5 -0
  347. package/dist/src/platform/model.d.ts +18 -0
  348. package/dist/src/platform/register-trigger-handler.factory.d.ts +5 -0
  349. package/dist/src/platform/startup.service.d.ts +36 -0
  350. package/dist/src/platform/system-logger-name.provider.d.ts +1 -0
  351. package/dist/src/platform.container.d.ts +3 -0
  352. package/dist/src/security/index.d.ts +2 -0
  353. package/dist/src/security/security-context.d.ts +22 -0
  354. package/dist/src/security/security.model.d.ts +37 -0
  355. package/dist/src/shared/decorators/decorators.d.ts +37 -0
  356. package/dist/src/shared/decorators/decorators.model.d.ts +13 -0
  357. package/dist/src/shared/decorators/index.d.ts +2 -0
  358. package/dist/src/shared/index.d.ts +8 -0
  359. package/dist/src/shared/ioc-container.utils.d.ts +7 -0
  360. package/dist/src/shared/platform.model.d.ts +44 -0
  361. package/dist/src/shared/trigger-handler-metadata.reader.d.ts +6 -0
  362. package/dist/src/shared/zod-parser-wrapper.d.ts +5 -0
  363. package/docs/logging.md +805 -0
  364. package/package.json +87 -0
  365. package/src/context/index.ts +4 -0
  366. package/src/context/platform-context.manager.ts +36 -0
  367. package/src/context/platform-context.model.ts +59 -0
  368. package/src/context/platform-context.provider.ts +37 -0
  369. package/src/context/platform.execution.context.ts +44 -0
  370. package/src/context/wrapped-invocation-context.ts +26 -0
  371. package/src/event-hub-handler/decorators/decorators.model.ts +76 -0
  372. package/src/event-hub-handler/decorators/decorators.ts +231 -0
  373. package/src/event-hub-handler/decorators/index.ts +2 -0
  374. package/src/event-hub-handler/event-hub-handler-metadata.reader.ts +38 -0
  375. package/src/event-hub-handler/event-hub-handler-registration.service.ts +45 -0
  376. package/src/event-hub-handler/event-hub-handler.factory.ts +66 -0
  377. package/src/event-hub-handler/event-hub-handler.model.ts +112 -0
  378. package/src/event-hub-handler/event-hub-trigger-support.factory.ts +234 -0
  379. package/src/event-hub-handler/event-hub-trigger.model.ts +36 -0
  380. package/src/event-hub-handler/event-hub-triggers-registration.service.ts +74 -0
  381. package/src/event-hub-handler/index.ts +19 -0
  382. package/src/framework.container.ts +24 -0
  383. package/src/http-controller/decorators/decorators.model.ts +156 -0
  384. package/src/http-controller/decorators/decorators.ts +516 -0
  385. package/src/http-controller/decorators/index.ts +3 -0
  386. package/src/http-controller/http-controller-metadata.reader.ts +62 -0
  387. package/src/http-controller/http-controller-registration.service.ts +52 -0
  388. package/src/http-controller/http-controller.model.ts +233 -0
  389. package/src/http-controller/http-handler-support.factory.ts +132 -0
  390. package/src/http-controller/http-handler.factory.ts +107 -0
  391. package/src/http-controller/http-operations-registration.service.ts +81 -0
  392. package/src/http-controller/http-request-arg-provider.factory.ts +165 -0
  393. package/src/http-controller/http-response-processor.factory.ts +77 -0
  394. package/src/http-controller/index.ts +47 -0
  395. package/src/http-controller/open-api-definition.service.ts +155 -0
  396. package/src/http-controller/open-api-metadata.service.ts +96 -0
  397. package/src/http-controller/open-api-print.service.ts +49 -0
  398. package/src/http-controller/open-api-registration.service.ts +45 -0
  399. package/src/http-controller/security/authentication-service.ts +18 -0
  400. package/src/http-controller/security/authenticator.provider.ts +238 -0
  401. package/src/http-controller/security/bearer-security-authentication.service.ts +16 -0
  402. package/src/http-controller/security/bearer-token.service.ts +6 -0
  403. package/src/http-controller/security/index.ts +3 -0
  404. package/src/http-controller/security/operation-authentication.resolver.ts +111 -0
  405. package/src/http-controller/security/principal-merge.service.ts +26 -0
  406. package/src/http-controller/security/strict-principal-merge.servce.ts +23 -0
  407. package/src/http-controller/swagger-handling.service.ts +126 -0
  408. package/src/index.ts +80 -0
  409. package/src/init.ts +4 -0
  410. package/src/logger/bindings.ts +56 -0
  411. package/src/logger/index.ts +26 -0
  412. package/src/logger/log-level.service.ts +14 -0
  413. package/src/logger/log-transport.service.ts +162 -0
  414. package/src/logger/logger.model.ts +261 -0
  415. package/src/logger/logger.utils.ts +264 -0
  416. package/src/logger/otel.logger.ts +91 -0
  417. package/src/logger/trie-search.service.ts +177 -0
  418. package/src/middleware.ts +49 -0
  419. package/src/platform/azure-platform.ts +57 -0
  420. package/src/platform/index.ts +18 -0
  421. package/src/platform/model.ts +19 -0
  422. package/src/platform/register-trigger-handler.factory.ts +43 -0
  423. package/src/platform/startup.service.ts +39 -0
  424. package/src/platform/system-logger-name.provider.ts +20 -0
  425. package/src/platform.container.ts +21 -0
  426. package/src/security/index.ts +2 -0
  427. package/src/security/security-context.ts +30 -0
  428. package/src/security/security.model.ts +46 -0
  429. package/src/shared/decorators/decorators.model.ts +17 -0
  430. package/src/shared/decorators/decorators.ts +87 -0
  431. package/src/shared/decorators/index.ts +2 -0
  432. package/src/shared/index.ts +16 -0
  433. package/src/shared/ioc-container.utils.ts +10 -0
  434. package/src/shared/platform.model.ts +71 -0
  435. package/src/shared/trigger-handler-metadata.reader.ts +27 -0
  436. package/src/shared/zod-parser-wrapper.ts +49 -0
  437. package/src/test-utilities/index.ts +1 -0
  438. package/src/test-utilities/utils.ts +5 -0
  439. package/tsconfig.test.json +8 -0
@@ -0,0 +1,165 @@
1
+ import { injectable } from 'inversify';
2
+ import * as _ from 'lodash';
3
+ import { HandlerArgsParseError, parseWithZod, ZodParserError } from 'shared';
4
+ import { z, ZodArray, ZodPipe, ZodType } from 'zod';
5
+ import { ControllerOperationPathArgMetadata, ControllerOperationQueryArgMetadata, QueryItemType } from './decorators';
6
+ import { BadRequestError, OptionalStringSchema, StringSchema } from './http-controller.model';
7
+ import { HttpRequestArgProvider, HttpRequestArgsProvider } from './http-handler-support.factory';
8
+
9
+ @injectable()
10
+ export class HttpRequestArgProviderFactory {
11
+ createBodyArgProvider<T>(bodySchema: ZodType<T>): HttpRequestArgProvider {
12
+ return async ({ request }): Promise<T> => {
13
+ try {
14
+ const data = await request.json();
15
+ return parseWithZod(bodySchema, data);
16
+ } catch (e) {
17
+ if (e instanceof ZodParserError) {
18
+ throw new HandlerArgsParseError('Failed parsing request body', {
19
+ cause: e,
20
+ });
21
+ } else {
22
+ throw e;
23
+ }
24
+ }
25
+ };
26
+ }
27
+
28
+ createPathParamArgProvider(arg: ControllerOperationPathArgMetadata): HttpRequestArgProvider {
29
+ const paramSchema = arg.schema ?? StringSchema;
30
+ const coercePathParamSchema = this.getCoercedSchema(paramSchema);
31
+ const pathParamName = arg.name;
32
+ return ({ request }): string | number => {
33
+ const pathParam = request.params[pathParamName];
34
+ try {
35
+ return parseWithZod(coercePathParamSchema, pathParam);
36
+ } catch (e) {
37
+ throw new HandlerArgsParseError(`Failed parsing path parameter ${pathParamName}`, {
38
+ cause: e,
39
+ details: {
40
+ pathParam: {
41
+ name: pathParamName,
42
+ value: pathParam,
43
+ },
44
+ },
45
+ });
46
+ }
47
+ };
48
+ }
49
+
50
+ createHeaderProvider(headerItemName: string, headerSchema: ZodType<string | undefined>): HttpRequestArgProvider {
51
+ return ({ request }): string | undefined => {
52
+ const headerElement = request.headers.get(headerItemName) ?? undefined;
53
+ try {
54
+ return parseWithZod(headerSchema, headerElement);
55
+ } catch (e) {
56
+ throw new HandlerArgsParseError(`Failed parsing header parameter ${headerItemName}`, {
57
+ cause: e,
58
+ details: {
59
+ header: {
60
+ name: headerItemName,
61
+ value: headerElement,
62
+ },
63
+ },
64
+ });
65
+ }
66
+ };
67
+ }
68
+
69
+ createQueryItemArgProvider(arg: ControllerOperationQueryArgMetadata): HttpRequestArgProvider {
70
+ const querySchema = arg.schema ?? OptionalStringSchema;
71
+ const isArray = querySchema instanceof ZodArray;
72
+ const coercedQuerySchema = this.getCoercedSchema(querySchema);
73
+ const queryItemName = arg.name;
74
+ return ({ request }): QueryItemType => {
75
+ /* There is a Bug in request.query
76
+ new URL(request.url).searchParams will be used instead for query parameters,
77
+ */
78
+ const queryItems = new URL(request.url).searchParams;
79
+ let queryItemValue: unknown;
80
+ if (isArray) {
81
+ queryItemValue = queryItems.getAll(queryItemName);
82
+ } else {
83
+ queryItemValue = queryItems.get(queryItemName) ?? undefined;
84
+ }
85
+ try {
86
+ return parseWithZod(coercedQuerySchema, queryItemValue);
87
+ } catch (e) {
88
+ throw new HandlerArgsParseError(`Failed parsing query parameter ${queryItemName}`, {
89
+ cause: e,
90
+ details: {
91
+ query: {
92
+ name: queryItemName,
93
+ value: queryItemValue,
94
+ },
95
+ },
96
+ });
97
+ }
98
+ };
99
+ }
100
+
101
+ private getCoercedSchema<T extends ZodType>(schema: T): ZodPipe<ZodType, T> {
102
+ let isArray: boolean;
103
+ let singleSchema: ZodType;
104
+ if (schema instanceof ZodArray) {
105
+ singleSchema = schema.unwrap() as ZodType;
106
+ isArray = true;
107
+ } else {
108
+ isArray = false;
109
+ singleSchema = schema;
110
+ }
111
+ let coercedSchema = this.getCoercedSingleSchema(singleSchema);
112
+ if (isArray) {
113
+ coercedSchema = coercedSchema.array();
114
+ }
115
+ return coercedSchema.pipe(schema);
116
+ }
117
+
118
+ private getCoercedSingleSchema(singleType: ZodType): ZodType {
119
+ return z
120
+ .string()
121
+ .optional()
122
+ .transform(val => {
123
+ const singleTypeName = singleType.type;
124
+ if (singleTypeName === 'boolean') {
125
+ if (val === 'true') {
126
+ return true;
127
+ } else if (val === 'false') {
128
+ return false;
129
+ } else {
130
+ return val;
131
+ }
132
+ } else if (singleTypeName === 'number') {
133
+ const numVal = Number(val).valueOf();
134
+ return Number.isNaN(numVal) ? val : numVal;
135
+ } else {
136
+ return val;
137
+ }
138
+ });
139
+ }
140
+
141
+ createArgsProvider(argProviders: HttpRequestArgProvider[]): HttpRequestArgsProvider {
142
+ return async (requestInput): Promise<unknown[]> => {
143
+ const parsingResults = await Promise.allSettled(
144
+ argProviders.map(
145
+ argProvider =>
146
+ new Promise((resolve, reject) => {
147
+ try {
148
+ resolve(argProvider(requestInput));
149
+ } catch (e) {
150
+ reject(e);
151
+ }
152
+ }),
153
+ ),
154
+ );
155
+ const [fulfilled, rejected] = _.partition(parsingResults, result => result.status === 'fulfilled');
156
+ if (rejected.length > 0) {
157
+ const errors = rejected.map(({ reason }) => reason);
158
+ throw new BadRequestError('Failed parsing request arguments', {
159
+ details: { errors: errors },
160
+ });
161
+ }
162
+ return fulfilled.map(({ value }) => value);
163
+ };
164
+ }
165
+ }
@@ -0,0 +1,77 @@
1
+ import { HttpHeadersInit } from '@azure/functions';
2
+ import { HttpResponseInit } from '@azure/functions/types/http';
3
+ import { StatusCodes } from 'http-status-codes';
4
+ import { injectable } from 'inversify';
5
+ import { parseWithZod } from 'shared';
6
+ import { ZodType } from 'zod';
7
+ import { DirectResponseObject } from './decorators';
8
+ import { InternalServerError } from './http-controller.model';
9
+
10
+ export type ResponsePartialProcessor = (input: HttpResponseInit) => Promise<HttpResponseInit>;
11
+
12
+ @injectable()
13
+ export class HttpResponseProcessorFactory {
14
+ provideStatusProcessor(directResponse?: DirectResponseObject): ResponsePartialProcessor {
15
+ const directStatus = directResponse?.status ?? StatusCodes.OK;
16
+ return async input => {
17
+ if (input.status === undefined) {
18
+ return { status: directStatus };
19
+ } else if (input.status !== directStatus) {
20
+ throw new InternalServerError(
21
+ `Response status code ${input.status} does not match direct response status code ${directStatus}.`,
22
+ );
23
+ } else {
24
+ return input;
25
+ }
26
+ };
27
+ }
28
+
29
+ provideJsonBodyProcessor(directResponse?: DirectResponseObject): ResponsePartialProcessor | undefined {
30
+ const contentSchema = directResponse?.jsonContent?.schema;
31
+ if (contentSchema instanceof ZodType) {
32
+ return async input => {
33
+ return {
34
+ jsonBody: this.parseJsonBody(contentSchema, input.jsonBody),
35
+ };
36
+ };
37
+ }
38
+ }
39
+
40
+ private parseJsonBody(schema: ZodType<unknown>, data: unknown): unknown {
41
+ try {
42
+ return parseWithZod(schema, data);
43
+ } catch (e) {
44
+ throw new InternalServerError('Failed to parse response body', { cause: e, details: { responseBody: data } });
45
+ }
46
+ }
47
+
48
+ provideHeaderProcessor(directResponse?: DirectResponseObject): ResponsePartialProcessor | undefined {
49
+ const responseHeader = directResponse?.headers;
50
+ if (responseHeader instanceof ZodType) {
51
+ return async input => {
52
+ const parsedHeaders = this.parseDirectResponseHeaders(responseHeader, input.headers);
53
+ return {
54
+ headers: parsedHeaders,
55
+ };
56
+ };
57
+ }
58
+ }
59
+
60
+ private parseDirectResponseHeaders(
61
+ schema: ZodType<Record<string, string>>,
62
+ headers?: HttpHeadersInit,
63
+ ): Record<string, string> {
64
+ const headersRecord: Record<string, string> = {};
65
+ new Headers(headers).forEach((value, key) => {
66
+ headersRecord[key] = value;
67
+ });
68
+ try {
69
+ return parseWithZod(schema, headersRecord);
70
+ } catch (e) {
71
+ throw new InternalServerError('Response headers do not match direct response headers schema', {
72
+ cause: e,
73
+ details: { headers: headersRecord },
74
+ });
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,47 @@
1
+ import { ContainerModule } from 'inversify';
2
+ import { TRIGGER_HANDLER_REGISTRATION_SERVICE } from 'shared';
3
+ import { HTTP_CONTROLLER_TYPE, HttpControllerMetadataReader } from './decorators';
4
+ import { HttpControllerRegistrationService } from './http-controller-registration.service';
5
+ import { HttpHandlerSupportFactory } from './http-handler-support.factory';
6
+ import { HttpHandlerFactory } from './http-handler.factory';
7
+ import { HttpOperationsRegistrationService } from './http-operations-registration.service';
8
+ import { HttpRequestArgProviderFactory } from './http-request-arg-provider.factory';
9
+ import { HttpResponseProcessorFactory } from './http-response-processor.factory';
10
+ import { OpenApiDefinitionService } from './open-api-definition.service';
11
+ import { OpenApiMetadataService } from './open-api-metadata.service';
12
+ import { OpenApiPrintService } from './open-api-print.service';
13
+ import { OpenApiRegistrationService } from './open-api-registration.service';
14
+ import { AuthenticatorProvider } from './security/authenticator.provider';
15
+ import { OperationAuthenticationResolver } from './security/operation-authentication.resolver';
16
+ import { FallbackPrincipalMergeService } from './security/principal-merge.service';
17
+ import { StrictPrincipalMergeService } from './security/strict-principal-merge.servce';
18
+ import { SwaggerHandlingService } from './swagger-handling.service';
19
+
20
+ export * from './decorators';
21
+ export * from './http-controller-registration.service';
22
+ export * from './http-controller.model';
23
+ export * from './http-handler-support.factory';
24
+ export * from './open-api-definition.service';
25
+ export * from './open-api-print.service';
26
+ export * from './open-api-registration.service';
27
+ export * from './security';
28
+ export * from './swagger-handling.service';
29
+
30
+ export const HttpControllerModule = new ContainerModule(({ bind }) => {
31
+ bind(HttpControllerMetadataReader).toSelf();
32
+ bind(HttpHandlerFactory).toSelf();
33
+ bind(TRIGGER_HANDLER_REGISTRATION_SERVICE).to(HttpControllerRegistrationService).whenNamed(HTTP_CONTROLLER_TYPE);
34
+ bind(SwaggerHandlingService).toSelf();
35
+ bind(HttpHandlerSupportFactory).toSelf();
36
+ bind(HttpRequestArgProviderFactory).toSelf();
37
+ bind(HttpResponseProcessorFactory).toSelf();
38
+ bind(OpenApiMetadataService).toSelf();
39
+ bind(AuthenticatorProvider).toSelf();
40
+ bind(OperationAuthenticationResolver).toSelf();
41
+ bind(OpenApiRegistrationService).toSelf();
42
+ bind(OpenApiDefinitionService).toSelf();
43
+ bind(HttpOperationsRegistrationService).toSelf();
44
+ bind(OpenApiPrintService).toSelf();
45
+ bind(FallbackPrincipalMergeService).toSelf();
46
+ bind(StrictPrincipalMergeService).toSelf();
47
+ });
@@ -0,0 +1,155 @@
1
+ import { OpenApiGeneratorV3, OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
2
+ import { ComponentTypeKey } from '@asteasolutions/zod-to-openapi/dist/openapi-registry';
3
+ import { inject, injectable } from 'inversify';
4
+ import { LOGGER_FACTORY, LoggerFactory } from 'logger';
5
+ import { ComponentsObject, OpenAPIObject } from 'openapi3-ts/oas30';
6
+ import { AzFunctionsSystemError } from 'shared';
7
+ import { RestApplication } from './http-controller.model';
8
+ import { HttpOperationRegistration } from './http-operations-registration.service';
9
+ import { OpenApiMetadataService } from './open-api-metadata.service';
10
+
11
+ export interface RestOpenApiEntry {
12
+ application: RestApplication;
13
+ registry: OpenAPIRegistry;
14
+ }
15
+ export type RestOpenApiEntries = Record<string, RestOpenApiEntry>;
16
+
17
+ export class OpenApiDefinitionError extends AzFunctionsSystemError {}
18
+
19
+ const DEFAULT_APPLICATION = 'default';
20
+ const defaultRestApplication: RestApplication = {
21
+ name: DEFAULT_APPLICATION,
22
+ context: DEFAULT_APPLICATION,
23
+ openApiConfig: {
24
+ openapi: '3.0.1',
25
+ info: {
26
+ version: '1.0.0',
27
+ title: 'unknown',
28
+ },
29
+ },
30
+ };
31
+
32
+ @injectable()
33
+ export class OpenApiDefinitionService {
34
+ private readonly logger;
35
+ private readonly restOpenApiEntries: RestOpenApiEntries = {};
36
+
37
+ constructor(
38
+ @inject(LOGGER_FACTORY) private readonly loggerFactory: LoggerFactory,
39
+ private readonly openApiMetadataService: OpenApiMetadataService,
40
+ ) {
41
+ this.logger = this.loggerFactory();
42
+ }
43
+
44
+ addApplication(application: RestApplication) {
45
+ if (this.restOpenApiEntries[application.name]) {
46
+ throw new OpenApiDefinitionError(`OpenAPI definition for application ${application.name} already exists`);
47
+ }
48
+ const registry = new OpenAPIRegistry();
49
+ const components = application.openApiConfig.components ?? {};
50
+ for (const [componentType, component] of Object.entries(components) as [
51
+ ComponentTypeKey,
52
+ ComponentsObject[ComponentTypeKey],
53
+ ][]) {
54
+ for (const [name, componentEntry] of Object.entries(component)) {
55
+ registry.registerComponent(componentType, name, componentEntry);
56
+ }
57
+ }
58
+ this.restOpenApiEntries[application.name] = { application, registry };
59
+ this.logger.debug(`OpenAPI definition for application ${application.name} added`);
60
+ }
61
+
62
+ getApplications(): string[] {
63
+ return Object.keys(this.restOpenApiEntries);
64
+ }
65
+
66
+ getApplication(applicationName?: string): RestApplication {
67
+ const dataEntry = this.getApiDataEntry(applicationName);
68
+ return dataEntry.application;
69
+ }
70
+
71
+ getRegistry(applicationName?: string): OpenAPIRegistry {
72
+ const dataEntry = this.getApiDataEntry(applicationName);
73
+ return dataEntry.registry;
74
+ }
75
+
76
+ private getApiDataEntry(applicationName?: string): RestOpenApiEntry {
77
+ const dataEntry =
78
+ applicationName === undefined ? this.getDefaultDataEntry() : this.restOpenApiEntries[applicationName];
79
+ if (dataEntry === undefined) {
80
+ throw new OpenApiDefinitionError(`Unknown OpenAPI definition for application ${applicationName}`);
81
+ }
82
+ return dataEntry;
83
+ }
84
+
85
+ generateDocument(applicationName: string, apiUrl?: string): OpenAPIObject {
86
+ const { application, registry } = this.getApiDataEntry(applicationName);
87
+ let openApiConfig = application.openApiConfig;
88
+ if (apiUrl !== undefined) {
89
+ openApiConfig = {
90
+ ...openApiConfig,
91
+ servers: [
92
+ {
93
+ url: apiUrl + '/' + application.context,
94
+ },
95
+ ],
96
+ };
97
+ }
98
+ const openApiGenerator = new OpenApiGeneratorV3(registry.definitions);
99
+ return openApiGenerator.generateDocument(openApiConfig);
100
+ }
101
+
102
+ private getDefaultDataEntry(): RestOpenApiEntry {
103
+ let defaultDataEntry = this.restOpenApiEntries[DEFAULT_APPLICATION];
104
+ if (defaultDataEntry === undefined) {
105
+ defaultDataEntry = { application: defaultRestApplication, registry: new OpenAPIRegistry() };
106
+ this.restOpenApiEntries[DEFAULT_APPLICATION] = defaultDataEntry;
107
+ }
108
+ return defaultDataEntry;
109
+ }
110
+
111
+ registerOperation(operationRegistration: HttpOperationRegistration) {
112
+ const {
113
+ operationId,
114
+ controllerMetadata,
115
+ operationMetadata,
116
+ application: { name: applicationName },
117
+ route,
118
+ } = operationRegistration;
119
+ this.logger.debug('Registering OpenAPI operation', {
120
+ operationRegistration,
121
+ });
122
+ const tags = this.openApiMetadataService.getTags(controllerMetadata, operationMetadata);
123
+ const request = this.openApiMetadataService.getRequest(operationMetadata);
124
+ const responses = this.openApiMetadataService.getResponses(operationMetadata);
125
+ const openAPIRegistry = this.getRegistry(applicationName);
126
+ this.logger.silly('Registering OpenAPI operation', {
127
+ operationId,
128
+ applicationName,
129
+ route,
130
+ method: operationMetadata.method,
131
+ description: operationMetadata.description,
132
+ security: operationMetadata.security,
133
+ summary: operationMetadata.summary,
134
+ tags,
135
+ parameters: operationMetadata.parameters,
136
+ request,
137
+ responses,
138
+ });
139
+ openAPIRegistry.registerPath({
140
+ method: operationMetadata.method,
141
+ operationId,
142
+ description: operationMetadata.description,
143
+ security: operationMetadata.security,
144
+ summary: operationMetadata.summary,
145
+ path: '/' + route,
146
+ tags,
147
+ parameters: operationMetadata.parameters,
148
+ request,
149
+ responses,
150
+ });
151
+ this.logger.debug('Registered OpenAPI operation', {
152
+ operationRegistration,
153
+ });
154
+ }
155
+ }
@@ -0,0 +1,96 @@
1
+ import { ResponseConfig, RouteConfig, ZodRequestBody } from '@asteasolutions/zod-to-openapi';
2
+ import { injectable } from 'inversify';
3
+ import { z, ZodArray, ZodType } from 'zod';
4
+ import {
5
+ ControllerOperationMetadata,
6
+ ControllerOperationQueryArgMetadata,
7
+ HttpControllerMetadata,
8
+ QueryItemType,
9
+ } from './decorators';
10
+ import { OptionalStringSchema, StringSchema } from './http-controller.model';
11
+
12
+ type RouteConfigRequest = RouteConfig['request'];
13
+
14
+ type Responses = Record<string, ResponseConfig>;
15
+
16
+ @injectable()
17
+ export class OpenApiMetadataService {
18
+ getTags(
19
+ controllerMetadata: HttpControllerMetadata,
20
+ operationMetadata: ControllerOperationMetadata,
21
+ ): string[] | undefined {
22
+ const tags = [...new Set([...(controllerMetadata.tags ?? []), ...(operationMetadata.tags ?? [])])];
23
+ return tags.length ? tags : undefined;
24
+ }
25
+
26
+ getRequest(operationMetadata: ControllerOperationMetadata): RouteConfigRequest {
27
+ const paramsShape: Record<string, ZodType> = {};
28
+ const headersShape: Record<string, ZodType> = {};
29
+ const queriesShape: Record<string, ZodType> = {};
30
+ let requestBody: ZodRequestBody | undefined = undefined;
31
+ for (const arg of operationMetadata.args) {
32
+ switch (arg.type) {
33
+ case 'path':
34
+ paramsShape[arg.name] = arg.schema ?? StringSchema;
35
+ break;
36
+ case 'header':
37
+ headersShape[arg.name] = arg.schema ?? OptionalStringSchema;
38
+ break;
39
+ case 'query':
40
+ queriesShape[arg.name] = OpenApiMetadataService.getQueryType(arg);
41
+ break;
42
+ case 'body':
43
+ requestBody = {
44
+ description: arg.description,
45
+ content: {
46
+ ['application/json']: {
47
+ example: arg.example,
48
+ schema: arg.schema,
49
+ },
50
+ },
51
+ };
52
+ break;
53
+ case 'undefined':
54
+ case 'request':
55
+ case 'authContext':
56
+ case 'invocationContext':
57
+ break;
58
+ }
59
+ }
60
+
61
+ return {
62
+ params: z.object(paramsShape),
63
+ headers: z.object(headersShape),
64
+ query: z.object(queriesShape),
65
+ body: requestBody,
66
+ };
67
+ }
68
+
69
+ getResponses(operationMetadata: ControllerOperationMetadata): Responses {
70
+ const responses = { ...operationMetadata.responses };
71
+ const directResponse = operationMetadata.directResponse;
72
+ if (directResponse) {
73
+ const customStatus = directResponse.status ?? 200;
74
+ responses[customStatus] = {
75
+ description: directResponse.description,
76
+ content: directResponse.jsonContent ? { ['application/json']: directResponse.jsonContent } : undefined,
77
+ headers: directResponse.headers,
78
+ };
79
+ }
80
+ return Object.getOwnPropertyNames(responses).length
81
+ ? responses
82
+ : {
83
+ '204': {
84
+ description: 'Default no jsonContent',
85
+ },
86
+ };
87
+ }
88
+
89
+ private static getQueryType(arg: ControllerOperationQueryArgMetadata): ZodType<QueryItemType> {
90
+ let querySchema = arg.schema;
91
+ if (querySchema instanceof ZodArray) {
92
+ querySchema = (querySchema as ZodType<string[] | number[]>).optional();
93
+ }
94
+ return querySchema ?? OptionalStringSchema;
95
+ }
96
+ }
@@ -0,0 +1,49 @@
1
+ import { inject, injectable } from 'inversify';
2
+ import { LOGGER_FACTORY, LoggerFactory } from 'logger';
3
+ import * as fs from 'node:fs';
4
+ import * as path from 'node:path';
5
+ import * as process from 'node:process';
6
+ import * as YAML from 'yaml';
7
+ import { OpenApiDefinitionService } from './open-api-definition.service';
8
+
9
+ @injectable()
10
+ export class OpenApiPrintService {
11
+ private readonly logger;
12
+
13
+ constructor(
14
+ private readonly openApiDefinitionService: OpenApiDefinitionService,
15
+ @inject(LOGGER_FACTORY) loggerFactory: LoggerFactory,
16
+ ) {
17
+ this.logger = loggerFactory();
18
+ }
19
+
20
+ printOpenApi(): void {
21
+ const applications = this.openApiDefinitionService.getApplications();
22
+ this.logger.info('Printing OpenAPI definitions started');
23
+
24
+ const printPath = process.env.OPEN_API_PRINT_PATH ?? path.resolve(process.cwd(), 'dist/open-api-definitions');
25
+ this.logger.verbose('Printing OpenAPI definitions started', {
26
+ applications,
27
+ printPath,
28
+ });
29
+ const printPathStat = fs.statSync(printPath, {
30
+ throwIfNoEntry: false,
31
+ });
32
+ if (printPathStat === undefined) {
33
+ fs.mkdirSync(printPath);
34
+ }
35
+ for (const application of applications) {
36
+ try {
37
+ this.logger.debug(`Printing OpenAPI definition for application ${application}`);
38
+ const definition = this.openApiDefinitionService.generateDocument(application);
39
+ let filePath = path.resolve(printPath, `${application}.json`);
40
+ fs.writeFileSync(filePath, JSON.stringify(definition, null, 2));
41
+ filePath = path.resolve(printPath, `${application}.yaml`);
42
+ fs.writeFileSync(filePath, YAML.stringify(definition));
43
+ this.logger.debug(`OpenAPI definition for application ${application} printed`);
44
+ } catch (e) {
45
+ this.logger.error(`Failed to print OpenAPI definition for application ${application}`, e);
46
+ }
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,45 @@
1
+ import { inject, injectable } from 'inversify';
2
+ import { LOGGER_FACTORY, LoggerFactory } from 'logger';
3
+ import { TriggerHandlerClass, TriggerHandlerMetadataReader } from 'shared';
4
+ import { RestApplication } from './http-controller.model';
5
+ import { HttpOperationsRegistrationService } from './http-operations-registration.service';
6
+ import { OpenApiDefinitionService } from './open-api-definition.service';
7
+
8
+ @injectable()
9
+ export class OpenApiRegistrationService {
10
+ private readonly logger;
11
+
12
+ constructor(
13
+ private readonly metadataReader: TriggerHandlerMetadataReader,
14
+ private readonly definitionService: OpenApiDefinitionService,
15
+ private readonly operationRegistrationService: HttpOperationsRegistrationService,
16
+ @inject(LOGGER_FACTORY) private readonly loggerFactory: LoggerFactory,
17
+ ) {
18
+ this.logger = this.loggerFactory();
19
+ }
20
+
21
+ register(config: { triggerHandlerClasses: TriggerHandlerClass[]; restApplications?: RestApplication[] }): void {
22
+ const { restApplications } = config;
23
+ const httpTriggerHandlerClasses = config.triggerHandlerClasses.filter(handlerClass => {
24
+ const metadata = this.metadataReader.getHandlerClassMetadata(handlerClass);
25
+ return metadata.type === 'http-controller';
26
+ });
27
+ this.logger.info('Registering OpenAPI definitions for Azure Functions started', {
28
+ triggerHandlerClasses: httpTriggerHandlerClasses.length,
29
+ restApplications: restApplications?.length || 'none',
30
+ });
31
+ this.logger.debug('Registering OpenAPI definitions for Azure Functions started', {
32
+ triggerHandlerClasses: httpTriggerHandlerClasses.map(cls => cls.name),
33
+ restApplications: restApplications?.map(app => app.name) || 'none',
34
+ });
35
+ for (const application of restApplications ?? []) {
36
+ this.definitionService.addApplication(application);
37
+ }
38
+ for (const triggerHandlerClass of httpTriggerHandlerClasses) {
39
+ this.operationRegistrationService.registerOperations(triggerHandlerClass, operationRegistrationData => {
40
+ this.definitionService.registerOperation(operationRegistrationData);
41
+ });
42
+ }
43
+ this.logger.info(`${httpTriggerHandlerClasses.length} OpenAPI definition(s) registered`);
44
+ }
45
+ }
@@ -0,0 +1,18 @@
1
+ import { HttpRequest } from '@azure/functions';
2
+ import { Principal } from 'security';
3
+ import { serviceIdentifier } from 'shared';
4
+
5
+ /**
6
+ * Service identifier for the AuthenticationService. This service is responsible for authenticating incoming HTTP requests and returning a Principal object representing the authenticated user.
7
+ * It can be used to implement custom authentication logic, such as validating JWT tokens, API keys, or other authentication mechanisms.
8
+ */
9
+ export const AUTHENTICATION_SERVICE = serviceIdentifier<AuthenticationService>('AzFunctions.AuthenticationService');
10
+ export const REST_APPLICATION_TAG_KEY = Symbol.for('AzFunctions.RestApplicationTagKey');
11
+
12
+ /**
13
+ * Interface representing an authentication service that can authenticate incoming HTTP requests.
14
+ * The service should implement the `authenticate` method, which takes an HttpRequest and returns a Promise that resolves to a Principal object representing the authenticated user.
15
+ */
16
+ export interface AuthenticationService {
17
+ authenticate(request: HttpRequest): Promise<Principal>;
18
+ }