@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.
- package/LICENSE +21 -0
- package/README.md +830 -0
- package/coverage/cobertura-coverage.xml +3482 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/context/forked-invocation-context.ts.html +127 -0
- package/coverage/lcov-report/context/index.html +191 -0
- package/coverage/lcov-report/context/index.ts.html +97 -0
- package/coverage/lcov-report/context/platform-context.manager.ts.html +193 -0
- package/coverage/lcov-report/context/platform-context.model.ts.html +262 -0
- package/coverage/lcov-report/context/platform-context.provider.ts.html +196 -0
- package/coverage/lcov-report/context/platform.execution.context.ts.html +217 -0
- package/coverage/lcov-report/context/wrapped-invocation-context.ts.html +163 -0
- package/coverage/lcov-report/event-hub-handler/azure-event-hub-trigger.model.ts.html +187 -0
- package/coverage/lcov-report/event-hub-handler/azure-event-hub-trigger.service.ts.html +760 -0
- package/coverage/lcov-report/event-hub-handler/decorators/decorators.model.ts.html +292 -0
- package/coverage/lcov-report/event-hub-handler/decorators/decorators.ts.html +778 -0
- package/coverage/lcov-report/event-hub-handler/decorators/index.html +146 -0
- package/coverage/lcov-report/event-hub-handler/decorators/index.ts.html +91 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-handle-method-args-metadata.service.ts.html +130 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-handler-metadata.reader.ts.html +199 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-handler-registration.service.ts.html +220 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-handler.factory.ts.html +283 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-handler.model.ts.html +421 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-handler.provider.ts.html +187 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-trigger-support.factory.ts.html +787 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-trigger-support.service.ts.html +829 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-trigger.model.ts.html +193 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-trigger.service.ts.html +859 -0
- package/coverage/lcov-report/event-hub-handler/event-hub-triggers-registration.service.ts.html +307 -0
- package/coverage/lcov-report/event-hub-handler/index.html +221 -0
- package/coverage/lcov-report/event-hub-handler/index.ts.html +142 -0
- package/coverage/lcov-report/eventhub-handler/decorators/decorators.model.ts.html +277 -0
- package/coverage/lcov-report/eventhub-handler/decorators/decorators.ts.html +679 -0
- package/coverage/lcov-report/eventhub-handler/decorators/index.html +131 -0
- package/coverage/lcov-report/eventhub-handler/eventhub-handler-metadata.reader.ts.html +196 -0
- package/coverage/lcov-report/eventhub-handler/eventhub-handler-registration.service.ts.html +220 -0
- package/coverage/lcov-report/eventhub-handler/eventhub-handler.factory.ts.html +193 -0
- package/coverage/lcov-report/eventhub-handler/eventhub-handler.model.ts.html +406 -0
- package/coverage/lcov-report/eventhub-handler/eventhub-trigger.model.ts.html +187 -0
- package/coverage/lcov-report/eventhub-handler/eventhub-trigger.service.ts.html +760 -0
- package/coverage/lcov-report/eventhub-handler/eventhub-triggers-registration.service.ts.html +304 -0
- package/coverage/lcov-report/eventhub-handler/index.html +206 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/forked-invocation-context.ts.html +127 -0
- package/coverage/lcov-report/function-handler-metadata.reader.ts.html +172 -0
- package/coverage/lcov-report/http-controller/authentication.provider.ts.html +481 -0
- package/coverage/lcov-report/http-controller/authenticator.provider.ts.html +460 -0
- package/coverage/lcov-report/http-controller/azure-http-trigger.service.ts.html +1045 -0
- package/coverage/lcov-report/http-controller/decorators/decorators.model.ts.html +388 -0
- package/coverage/lcov-report/http-controller/decorators/decorators.ts.html +1627 -0
- package/coverage/lcov-report/http-controller/decorators/index.html +146 -0
- package/coverage/lcov-report/http-controller/decorators/index.ts.html +94 -0
- package/coverage/lcov-report/http-controller/http-controller-metadata.reader.ts.html +271 -0
- package/coverage/lcov-report/http-controller/http-controller-metadata.service.ts.html +130 -0
- package/coverage/lcov-report/http-controller/http-controller-platform.model.ts.html +187 -0
- package/coverage/lcov-report/http-controller/http-controller-registration.service.ts.html +241 -0
- package/coverage/lcov-report/http-controller/http-controller.model.ts.html +745 -0
- package/coverage/lcov-report/http-controller/http-handler-support.factory.ts.html +499 -0
- package/coverage/lcov-report/http-controller/http-handler.factory.ts.html +415 -0
- package/coverage/lcov-report/http-controller/http-operation-registration.service.ts.html +328 -0
- package/coverage/lcov-report/http-controller/http-operations-registration.service.ts.html +328 -0
- package/coverage/lcov-report/http-controller/http-request-arg-provider.factory.ts.html +580 -0
- package/coverage/lcov-report/http-controller/http-request-handler.provider.ts.html +388 -0
- package/coverage/lcov-report/http-controller/http-response-processor.factory.ts.html +316 -0
- package/coverage/lcov-report/http-controller/index.html +311 -0
- package/coverage/lcov-report/http-controller/index.ts.html +226 -0
- package/coverage/lcov-report/http-controller/open-api-definition.service.ts.html +568 -0
- package/coverage/lcov-report/http-controller/open-api-metadata.service.ts.html +373 -0
- package/coverage/lcov-report/http-controller/open-api-print.service.ts.html +232 -0
- package/coverage/lcov-report/http-controller/open-api-registration.service.ts.html +220 -0
- package/coverage/lcov-report/http-controller/rest-open-api.regstry.ts.html +262 -0
- package/coverage/lcov-report/http-controller/security/authentication-service.factory.ts.html +280 -0
- package/coverage/lcov-report/http-controller/security/authentication-service.ts.html +115 -0
- package/coverage/lcov-report/http-controller/security/authenticator.provider.ts.html +799 -0
- package/coverage/lcov-report/http-controller/security/bearer-security-authentication.service.ts.html +133 -0
- package/coverage/lcov-report/http-controller/security/index.html +206 -0
- package/coverage/lcov-report/http-controller/security/index.ts.html +94 -0
- package/coverage/lcov-report/http-controller/security/model.ts.html +133 -0
- package/coverage/lcov-report/http-controller/security/operation-authentication.resolver.ts.html +418 -0
- package/coverage/lcov-report/http-controller/security/principal-merge.service.ts.html +163 -0
- package/coverage/lcov-report/http-controller/security/strict-principal-merge.servce.ts.html +154 -0
- package/coverage/lcov-report/http-controller/swagger-handling.service.ts.html +463 -0
- package/coverage/lcov-report/index.html +281 -0
- package/coverage/lcov-report/init.ts.html +97 -0
- package/coverage/lcov-report/ioc-container.utils.ts.html +100 -0
- package/coverage/lcov-report/logger/azure-log-transport.service.ts.html +433 -0
- package/coverage/lcov-report/logger/bindings.ts.html +253 -0
- package/coverage/lcov-report/logger/index.html +221 -0
- package/coverage/lcov-report/logger/index.ts.html +163 -0
- package/coverage/lcov-report/logger/log-level.service.ts.html +127 -0
- package/coverage/lcov-report/logger/log-transport.service.ts.html +571 -0
- package/coverage/lcov-report/logger/logger-factory.provider.ts.html +142 -0
- package/coverage/lcov-report/logger/logger.factory.ts.html +172 -0
- package/coverage/lcov-report/logger/logger.model.ts.html +868 -0
- package/coverage/lcov-report/logger/logger.utils.ts.html +877 -0
- package/coverage/lcov-report/logger/model.ts.html +172 -0
- package/coverage/lcov-report/logger/otel.logger.ts.html +358 -0
- package/coverage/lcov-report/logger/platform.logger.ts.html +229 -0
- package/coverage/lcov-report/logger/trie-search.service.ts.html +616 -0
- package/coverage/lcov-report/platform/azure-platform.ts.html +256 -0
- package/coverage/lcov-report/platform/index.html +176 -0
- package/coverage/lcov-report/platform/index.ts.html +139 -0
- package/coverage/lcov-report/platform/platform-component-metadata.service.ts.html +115 -0
- package/coverage/lcov-report/platform/register-function.factory.ts.html +145 -0
- package/coverage/lcov-report/platform/register-trigger-handler.factory.ts.html +214 -0
- package/coverage/lcov-report/platform/security-context.ts.html +127 -0
- package/coverage/lcov-report/platform/startup.service.ts.html +106 -0
- package/coverage/lcov-report/platform/system-logger-name.provider.ts.html +145 -0
- package/coverage/lcov-report/platform/system.container.ts.html +169 -0
- package/coverage/lcov-report/platform-context.model.ts.html +124 -0
- package/coverage/lcov-report/platform.logger.ts.html +316 -0
- package/coverage/lcov-report/platform.model.ts.html +292 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/security/index.html +146 -0
- package/coverage/lcov-report/security/index.ts.html +91 -0
- package/coverage/lcov-report/security/security-context.ts.html +130 -0
- package/coverage/lcov-report/security/security.model.ts.html +169 -0
- package/coverage/lcov-report/shared/all-settled.util.ts.html +118 -0
- package/coverage/lcov-report/shared/decorators/decorators.model.ts.html +136 -0
- package/coverage/lcov-report/shared/decorators/decorators.ts.html +346 -0
- package/coverage/lcov-report/shared/decorators/index.html +146 -0
- package/coverage/lcov-report/shared/decorators/index.ts.html +91 -0
- package/coverage/lcov-report/shared/function-handler-metadata.reader.ts.html +172 -0
- package/coverage/lcov-report/shared/index.html +176 -0
- package/coverage/lcov-report/shared/index.ts.html +133 -0
- package/coverage/lcov-report/shared/ioc-container.utils.ts.html +115 -0
- package/coverage/lcov-report/shared/platform-context-local-storage.ts.html +133 -0
- package/coverage/lcov-report/shared/platform-context.manager.ts.html +253 -0
- package/coverage/lcov-report/shared/platform.context.provider.ts.html +136 -0
- package/coverage/lcov-report/shared/platform.model.ts.html +298 -0
- package/coverage/lcov-report/shared/security.model.ts.html +142 -0
- package/coverage/lcov-report/shared/trie-search.service.ts.html +337 -0
- package/coverage/lcov-report/shared/trigger-handler-metadata.reader.ts.html +166 -0
- package/coverage/lcov-report/shared/zod-parser-wrapper.service.ts.html +217 -0
- package/coverage/lcov-report/shared/zod-parser-wrapper.ts.html +232 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/context/index.html +191 -0
- package/coverage/lcov-report/src/context/index.ts.html +97 -0
- package/coverage/lcov-report/src/context/platform-context.manager.ts.html +193 -0
- package/coverage/lcov-report/src/context/platform-context.model.ts.html +262 -0
- package/coverage/lcov-report/src/context/platform-context.provider.ts.html +196 -0
- package/coverage/lcov-report/src/context/platform.execution.context.ts.html +217 -0
- package/coverage/lcov-report/src/context/wrapped-invocation-context.ts.html +163 -0
- package/coverage/lcov-report/src/event-hub-handler/azure-event-hub-trigger.model.ts.html +187 -0
- package/coverage/lcov-report/src/event-hub-handler/azure-event-hub-trigger.service.ts.html +769 -0
- package/coverage/lcov-report/src/event-hub-handler/decorators/decorators.model.ts.html +313 -0
- package/coverage/lcov-report/src/event-hub-handler/decorators/decorators.ts.html +778 -0
- package/coverage/lcov-report/src/event-hub-handler/decorators/index.html +146 -0
- package/coverage/lcov-report/src/event-hub-handler/decorators/index.ts.html +91 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-handle-method-args-metadata.service.ts.html +130 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-handler-metadata.reader.ts.html +199 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-handler-registration.service.ts.html +220 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-handler.factory.ts.html +283 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-handler.model.ts.html +421 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-handler.provider.ts.html +187 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-trigger-support.factory.ts.html +787 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-trigger-support.service.ts.html +832 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-trigger.model.ts.html +193 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-trigger.service.ts.html +859 -0
- package/coverage/lcov-report/src/event-hub-handler/event-hub-triggers-registration.service.ts.html +307 -0
- package/coverage/lcov-report/src/event-hub-handler/index.html +221 -0
- package/coverage/lcov-report/src/event-hub-handler/index.ts.html +142 -0
- package/coverage/lcov-report/src/framework.container.ts.html +157 -0
- package/coverage/lcov-report/src/http-controller/authentication.provider.ts.html +481 -0
- package/coverage/lcov-report/src/http-controller/authenticator.provider.ts.html +460 -0
- package/coverage/lcov-report/src/http-controller/azure-http-trigger.service.ts.html +865 -0
- package/coverage/lcov-report/src/http-controller/decorators/decorators.model.ts.html +553 -0
- package/coverage/lcov-report/src/http-controller/decorators/decorators.ts.html +1633 -0
- package/coverage/lcov-report/src/http-controller/decorators/index.html +146 -0
- package/coverage/lcov-report/src/http-controller/decorators/index.ts.html +94 -0
- package/coverage/lcov-report/src/http-controller/http-controller-metadata.reader.ts.html +271 -0
- package/coverage/lcov-report/src/http-controller/http-controller-metadata.service.ts.html +121 -0
- package/coverage/lcov-report/src/http-controller/http-controller-platform.model.ts.html +187 -0
- package/coverage/lcov-report/src/http-controller/http-controller-registration.service.ts.html +241 -0
- package/coverage/lcov-report/src/http-controller/http-controller.model.ts.html +784 -0
- package/coverage/lcov-report/src/http-controller/http-handler-support.factory.ts.html +481 -0
- package/coverage/lcov-report/src/http-controller/http-handler.factory.ts.html +406 -0
- package/coverage/lcov-report/src/http-controller/http-operation-registration.service.ts.html +328 -0
- package/coverage/lcov-report/src/http-controller/http-operations-registration.service.ts.html +328 -0
- package/coverage/lcov-report/src/http-controller/http-request-arg-provider.factory.ts.html +580 -0
- package/coverage/lcov-report/src/http-controller/http-request-handler.provider.ts.html +388 -0
- package/coverage/lcov-report/src/http-controller/http-response-processor.factory.ts.html +316 -0
- package/coverage/lcov-report/src/http-controller/index.html +311 -0
- package/coverage/lcov-report/src/http-controller/index.ts.html +226 -0
- package/coverage/lcov-report/src/http-controller/open-api-definition.service.ts.html +550 -0
- package/coverage/lcov-report/src/http-controller/open-api-metadata.service.ts.html +373 -0
- package/coverage/lcov-report/src/http-controller/open-api-print.service.ts.html +232 -0
- package/coverage/lcov-report/src/http-controller/open-api-registration.service.ts.html +220 -0
- package/coverage/lcov-report/src/http-controller/rest-open-api.regstry.ts.html +262 -0
- package/coverage/lcov-report/src/http-controller/security/authentication-service.factory.ts.html +280 -0
- package/coverage/lcov-report/src/http-controller/security/authentication-service.ts.html +139 -0
- package/coverage/lcov-report/src/http-controller/security/authenticator.provider.ts.html +799 -0
- package/coverage/lcov-report/src/http-controller/security/bearer-security-authentication.service.ts.html +133 -0
- package/coverage/lcov-report/src/http-controller/security/index.html +206 -0
- package/coverage/lcov-report/src/http-controller/security/index.ts.html +94 -0
- package/coverage/lcov-report/src/http-controller/security/model.ts.html +133 -0
- package/coverage/lcov-report/src/http-controller/security/operation-authentication.resolver.ts.html +418 -0
- package/coverage/lcov-report/src/http-controller/security/principal-merge.service.ts.html +163 -0
- package/coverage/lcov-report/src/http-controller/security/strict-principal-merge.servce.ts.html +154 -0
- package/coverage/lcov-report/src/http-controller/swagger-handling.service.ts.html +463 -0
- package/coverage/lcov-report/src/index.html +161 -0
- package/coverage/lcov-report/src/init.ts.html +97 -0
- package/coverage/lcov-report/src/logger/azure-log-transport.service.ts.html +433 -0
- package/coverage/lcov-report/src/logger/bindings.ts.html +253 -0
- package/coverage/lcov-report/src/logger/index.html +221 -0
- package/coverage/lcov-report/src/logger/index.ts.html +163 -0
- package/coverage/lcov-report/src/logger/log-level.service.ts.html +127 -0
- package/coverage/lcov-report/src/logger/log-transport.service.ts.html +571 -0
- package/coverage/lcov-report/src/logger/logger-factory.provider.ts.html +142 -0
- package/coverage/lcov-report/src/logger/logger.factory.ts.html +172 -0
- package/coverage/lcov-report/src/logger/logger.model.ts.html +868 -0
- package/coverage/lcov-report/src/logger/logger.utils.ts.html +877 -0
- package/coverage/lcov-report/src/logger/otel.logger.ts.html +358 -0
- package/coverage/lcov-report/src/logger/platform.logger.ts.html +229 -0
- package/coverage/lcov-report/src/logger/trie-search.service.ts.html +616 -0
- package/coverage/lcov-report/src/middleware.ts.html +232 -0
- package/coverage/lcov-report/src/platform/azure-platform.ts.html +256 -0
- package/coverage/lcov-report/src/platform/index.html +176 -0
- package/coverage/lcov-report/src/platform/index.ts.html +139 -0
- package/coverage/lcov-report/src/platform/platform-component-metadata.service.ts.html +115 -0
- package/coverage/lcov-report/src/platform/register-function.factory.ts.html +145 -0
- package/coverage/lcov-report/src/platform/register-trigger-handler.factory.ts.html +214 -0
- package/coverage/lcov-report/src/platform/security-context.ts.html +127 -0
- package/coverage/lcov-report/src/platform/startup.service.ts.html +202 -0
- package/coverage/lcov-report/src/platform/system-logger-name.provider.ts.html +145 -0
- package/coverage/lcov-report/src/platform/system.container.ts.html +172 -0
- package/coverage/lcov-report/src/platform.container.ts.html +148 -0
- package/coverage/lcov-report/src/security/index.html +146 -0
- package/coverage/lcov-report/src/security/index.ts.html +91 -0
- package/coverage/lcov-report/src/security/security-context.ts.html +175 -0
- package/coverage/lcov-report/src/security/security.model.ts.html +223 -0
- package/coverage/lcov-report/src/shared/decorators/decorators.model.ts.html +136 -0
- package/coverage/lcov-report/src/shared/decorators/decorators.ts.html +346 -0
- package/coverage/lcov-report/src/shared/decorators/index.html +146 -0
- package/coverage/lcov-report/src/shared/decorators/index.ts.html +91 -0
- package/coverage/lcov-report/src/shared/index.html +176 -0
- package/coverage/lcov-report/src/shared/index.ts.html +133 -0
- package/coverage/lcov-report/src/shared/ioc-container.utils.ts.html +115 -0
- package/coverage/lcov-report/src/shared/platform-context-local-storage.ts.html +133 -0
- package/coverage/lcov-report/src/shared/platform.model.ts.html +298 -0
- package/coverage/lcov-report/src/shared/security.model.ts.html +139 -0
- package/coverage/lcov-report/src/shared/trie-search.service.ts.html +337 -0
- package/coverage/lcov-report/src/shared/trigger-handler-metadata.reader.ts.html +166 -0
- package/coverage/lcov-report/src/shared/zod-parser-wrapper.ts.html +232 -0
- package/coverage/lcov-report/test/index.html +116 -0
- package/coverage/lcov-report/test/utils.ts.html +100 -0
- package/coverage/lcov-report/test-utils/index.html +116 -0
- package/coverage/lcov-report/test-utils/utils.ts.html +100 -0
- package/coverage/lcov-report/trie-search.service.ts.html +469 -0
- package/coverage/lcov-report/trigger-handler-metadata.reader.ts.html +187 -0
- package/coverage/lcov-report/wrapped-invocation-context.ts.html +163 -0
- package/coverage/lcov-report/zod-parser-wrapper.ts.html +232 -0
- package/coverage/lcov.info +3220 -0
- package/dist/assets/swagger-ui/LICENSE +202 -0
- package/dist/assets/swagger-ui/NOTICE +2 -0
- package/dist/assets/swagger-ui/README.md +40 -0
- package/dist/assets/swagger-ui/absolute-path.js +1 -0
- package/dist/assets/swagger-ui/favicon-16x16.png +0 -0
- package/dist/assets/swagger-ui/favicon-32x32.png +0 -0
- package/dist/assets/swagger-ui/index.css +16 -0
- package/dist/assets/swagger-ui/index.html +19 -0
- package/dist/assets/swagger-ui/index.js +1 -0
- package/dist/assets/swagger-ui/log.bundle-sizes.swagger-ui.txt +114 -0
- package/dist/assets/swagger-ui/log.es-bundle-core-sizes.swagger-ui.txt +14 -0
- package/dist/assets/swagger-ui/log.es-bundle-sizes.swagger-ui.txt +114 -0
- package/dist/assets/swagger-ui/oauth2-redirect.html +6 -0
- package/dist/assets/swagger-ui/oauth2-redirect.js +1 -0
- package/dist/assets/swagger-ui/package.json +20 -0
- package/dist/assets/swagger-ui/swagger-initializer.js +1 -0
- package/dist/assets/swagger-ui/swagger-ui-bundle.js +2 -0
- package/dist/assets/swagger-ui/swagger-ui-bundle.js.LICENSE.txt +106 -0
- package/dist/assets/swagger-ui/swagger-ui-bundle.js.map +1 -0
- package/dist/assets/swagger-ui/swagger-ui-es-bundle-core.js +2 -0
- package/dist/assets/swagger-ui/swagger-ui-es-bundle-core.js.LICENSE.txt +35 -0
- package/dist/assets/swagger-ui/swagger-ui-es-bundle-core.js.map +1 -0
- package/dist/assets/swagger-ui/swagger-ui-es-bundle.js +2 -0
- package/dist/assets/swagger-ui/swagger-ui-es-bundle.js.LICENSE.txt +106 -0
- package/dist/assets/swagger-ui/swagger-ui-es-bundle.js.map +1 -0
- package/dist/assets/swagger-ui/swagger-ui-standalone-preset.js +2 -0
- package/dist/assets/swagger-ui/swagger-ui-standalone-preset.js.LICENSE.txt +22 -0
- package/dist/assets/swagger-ui/swagger-ui-standalone-preset.js.map +1 -0
- package/dist/assets/swagger-ui/swagger-ui.css +3 -0
- package/dist/assets/swagger-ui/swagger-ui.css.map +1 -0
- package/dist/assets/swagger-ui/swagger-ui.js +1 -0
- package/dist/assets/swagger-ui/swagger-ui.js.map +1 -0
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.LICENSE.txt +24 -0
- package/dist/src/context/index.d.ts +4 -0
- package/dist/src/context/platform-context.manager.d.ts +23 -0
- package/dist/src/context/platform-context.model.d.ts +56 -0
- package/dist/src/context/platform-context.provider.d.ts +23 -0
- package/dist/src/context/platform.execution.context.d.ts +13 -0
- package/dist/src/context/wrapped-invocation-context.d.ts +5 -0
- package/dist/src/event-hub-handler/decorators/decorators.d.ts +161 -0
- package/dist/src/event-hub-handler/decorators/decorators.model.d.ts +62 -0
- package/dist/src/event-hub-handler/decorators/index.d.ts +2 -0
- package/dist/src/event-hub-handler/event-hub-handler-metadata.reader.d.ts +8 -0
- package/dist/src/event-hub-handler/event-hub-handler-registration.service.d.ts +12 -0
- package/dist/src/event-hub-handler/event-hub-handler.factory.d.ts +13 -0
- package/dist/src/event-hub-handler/event-hub-handler.model.d.ts +101 -0
- package/dist/src/event-hub-handler/event-hub-trigger-support.factory.d.ts +10 -0
- package/dist/src/event-hub-handler/event-hub-trigger.model.d.ts +39 -0
- package/dist/src/event-hub-handler/event-hub-triggers-registration.service.d.ts +18 -0
- package/dist/src/event-hub-handler/index.d.ts +4 -0
- package/dist/src/framework.container.d.ts +6 -0
- package/dist/src/http-controller/decorators/decorators.d.ts +410 -0
- package/dist/src/http-controller/decorators/decorators.model.d.ts +123 -0
- package/dist/src/http-controller/decorators/index.d.ts +3 -0
- package/dist/src/http-controller/http-controller-metadata.reader.d.ts +8 -0
- package/dist/src/http-controller/http-controller-registration.service.d.ts +12 -0
- package/dist/src/http-controller/http-controller.model.d.ts +131 -0
- package/dist/src/http-controller/http-handler-support.factory.d.ts +26 -0
- package/dist/src/http-controller/http-handler.factory.d.ts +16 -0
- package/dist/src/http-controller/http-operations-registration.service.d.ts +22 -0
- package/dist/src/http-controller/http-request-arg-provider.factory.d.ts +12 -0
- package/dist/src/http-controller/http-response-processor.factory.d.ts +10 -0
- package/dist/src/http-controller/index.d.ts +11 -0
- package/dist/src/http-controller/open-api-definition.service.d.ts +29 -0
- package/dist/src/http-controller/open-api-metadata.service.d.ts +11 -0
- package/dist/src/http-controller/open-api-print.service.d.ts +8 -0
- package/dist/src/http-controller/open-api-registration.service.d.ts +17 -0
- package/dist/src/http-controller/security/authentication-service.d.ts +15 -0
- package/dist/src/http-controller/security/authenticator.provider.d.ts +31 -0
- package/dist/src/http-controller/security/bearer-security-authentication.service.d.ts +9 -0
- package/dist/src/http-controller/security/bearer-token.service.d.ts +5 -0
- package/dist/src/http-controller/security/index.d.ts +3 -0
- package/dist/src/http-controller/security/operation-authentication.resolver.d.ts +18 -0
- package/dist/src/http-controller/security/principal-merge.service.d.ts +11 -0
- package/dist/src/http-controller/security/strict-principal-merge.servce.d.ts +5 -0
- package/dist/src/http-controller/swagger-handling.service.d.ts +11 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/init.d.ts +1 -0
- package/dist/src/logger/bindings.d.ts +7 -0
- package/dist/src/logger/index.d.ts +6 -0
- package/dist/src/logger/log-level.service.d.ts +7 -0
- package/dist/src/logger/log-transport.service.d.ts +19 -0
- package/dist/src/logger/logger.model.d.ts +241 -0
- package/dist/src/logger/logger.utils.d.ts +17 -0
- package/dist/src/logger/otel.logger.d.ts +9 -0
- package/dist/src/logger/trie-search.service.d.ts +65 -0
- package/dist/src/middleware.d.ts +10 -0
- package/dist/src/platform/azure-platform.d.ts +15 -0
- package/dist/src/platform/index.d.ts +5 -0
- package/dist/src/platform/model.d.ts +18 -0
- package/dist/src/platform/register-trigger-handler.factory.d.ts +5 -0
- package/dist/src/platform/startup.service.d.ts +36 -0
- package/dist/src/platform/system-logger-name.provider.d.ts +1 -0
- package/dist/src/platform.container.d.ts +3 -0
- package/dist/src/security/index.d.ts +2 -0
- package/dist/src/security/security-context.d.ts +22 -0
- package/dist/src/security/security.model.d.ts +37 -0
- package/dist/src/shared/decorators/decorators.d.ts +37 -0
- package/dist/src/shared/decorators/decorators.model.d.ts +13 -0
- package/dist/src/shared/decorators/index.d.ts +2 -0
- package/dist/src/shared/index.d.ts +8 -0
- package/dist/src/shared/ioc-container.utils.d.ts +7 -0
- package/dist/src/shared/platform.model.d.ts +44 -0
- package/dist/src/shared/trigger-handler-metadata.reader.d.ts +6 -0
- package/dist/src/shared/zod-parser-wrapper.d.ts +5 -0
- package/docs/logging.md +805 -0
- package/package.json +87 -0
- package/src/context/index.ts +4 -0
- package/src/context/platform-context.manager.ts +36 -0
- package/src/context/platform-context.model.ts +59 -0
- package/src/context/platform-context.provider.ts +37 -0
- package/src/context/platform.execution.context.ts +44 -0
- package/src/context/wrapped-invocation-context.ts +26 -0
- package/src/event-hub-handler/decorators/decorators.model.ts +76 -0
- package/src/event-hub-handler/decorators/decorators.ts +231 -0
- package/src/event-hub-handler/decorators/index.ts +2 -0
- package/src/event-hub-handler/event-hub-handler-metadata.reader.ts +38 -0
- package/src/event-hub-handler/event-hub-handler-registration.service.ts +45 -0
- package/src/event-hub-handler/event-hub-handler.factory.ts +66 -0
- package/src/event-hub-handler/event-hub-handler.model.ts +112 -0
- package/src/event-hub-handler/event-hub-trigger-support.factory.ts +234 -0
- package/src/event-hub-handler/event-hub-trigger.model.ts +36 -0
- package/src/event-hub-handler/event-hub-triggers-registration.service.ts +74 -0
- package/src/event-hub-handler/index.ts +19 -0
- package/src/framework.container.ts +24 -0
- package/src/http-controller/decorators/decorators.model.ts +156 -0
- package/src/http-controller/decorators/decorators.ts +516 -0
- package/src/http-controller/decorators/index.ts +3 -0
- package/src/http-controller/http-controller-metadata.reader.ts +62 -0
- package/src/http-controller/http-controller-registration.service.ts +52 -0
- package/src/http-controller/http-controller.model.ts +233 -0
- package/src/http-controller/http-handler-support.factory.ts +132 -0
- package/src/http-controller/http-handler.factory.ts +107 -0
- package/src/http-controller/http-operations-registration.service.ts +81 -0
- package/src/http-controller/http-request-arg-provider.factory.ts +165 -0
- package/src/http-controller/http-response-processor.factory.ts +77 -0
- package/src/http-controller/index.ts +47 -0
- package/src/http-controller/open-api-definition.service.ts +155 -0
- package/src/http-controller/open-api-metadata.service.ts +96 -0
- package/src/http-controller/open-api-print.service.ts +49 -0
- package/src/http-controller/open-api-registration.service.ts +45 -0
- package/src/http-controller/security/authentication-service.ts +18 -0
- package/src/http-controller/security/authenticator.provider.ts +238 -0
- package/src/http-controller/security/bearer-security-authentication.service.ts +16 -0
- package/src/http-controller/security/bearer-token.service.ts +6 -0
- package/src/http-controller/security/index.ts +3 -0
- package/src/http-controller/security/operation-authentication.resolver.ts +111 -0
- package/src/http-controller/security/principal-merge.service.ts +26 -0
- package/src/http-controller/security/strict-principal-merge.servce.ts +23 -0
- package/src/http-controller/swagger-handling.service.ts +126 -0
- package/src/index.ts +80 -0
- package/src/init.ts +4 -0
- package/src/logger/bindings.ts +56 -0
- package/src/logger/index.ts +26 -0
- package/src/logger/log-level.service.ts +14 -0
- package/src/logger/log-transport.service.ts +162 -0
- package/src/logger/logger.model.ts +261 -0
- package/src/logger/logger.utils.ts +264 -0
- package/src/logger/otel.logger.ts +91 -0
- package/src/logger/trie-search.service.ts +177 -0
- package/src/middleware.ts +49 -0
- package/src/platform/azure-platform.ts +57 -0
- package/src/platform/index.ts +18 -0
- package/src/platform/model.ts +19 -0
- package/src/platform/register-trigger-handler.factory.ts +43 -0
- package/src/platform/startup.service.ts +39 -0
- package/src/platform/system-logger-name.provider.ts +20 -0
- package/src/platform.container.ts +21 -0
- package/src/security/index.ts +2 -0
- package/src/security/security-context.ts +30 -0
- package/src/security/security.model.ts +46 -0
- package/src/shared/decorators/decorators.model.ts +17 -0
- package/src/shared/decorators/decorators.ts +87 -0
- package/src/shared/decorators/index.ts +2 -0
- package/src/shared/index.ts +16 -0
- package/src/shared/ioc-container.utils.ts +10 -0
- package/src/shared/platform.model.ts +71 -0
- package/src/shared/trigger-handler-metadata.reader.ts +27 -0
- package/src/shared/zod-parser-wrapper.ts +49 -0
- package/src/test-utilities/index.ts +1 -0
- package/src/test-utilities/utils.ts +5 -0
- 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
|
+
}
|