quidproquo-webserver 0.1.19 → 0.1.21
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/README.md +1 -2
- package/lib/commonjs/actionProcessor/api/getHttpApiEventAutoRespondActionProcessor.js +7 -5
- package/lib/commonjs/actionProcessor/api/getHttpApiEventAutoRespondActionProcessor.js.map +1 -1
- package/lib/commonjs/actions/dns/DnsActionType.d.ts +3 -1
- package/lib/commonjs/actions/dns/DnsActionType.js +2 -0
- package/lib/commonjs/actions/dns/DnsActionType.js.map +1 -1
- package/lib/commonjs/actions/dns/askDnsList.d.ts +2 -1
- package/lib/commonjs/actions/dns/askDnsList.js +1 -0
- package/lib/commonjs/actions/dns/askDnsList.js.map +1 -1
- package/lib/commonjs/actions/dns/askDnsResolveHosts.d.ts +9 -0
- package/lib/commonjs/actions/dns/askDnsResolveHosts.js +11 -0
- package/lib/commonjs/actions/dns/askDnsResolveHosts.js.map +1 -0
- package/lib/commonjs/actions/dns/index.d.ts +1 -0
- package/lib/commonjs/actions/dns/index.js +1 -0
- package/lib/commonjs/actions/dns/index.js.map +1 -1
- package/lib/commonjs/actions/index.d.ts +1 -1
- package/lib/commonjs/actions/index.js +1 -1
- package/lib/commonjs/actions/index.js.map +1 -1
- package/lib/commonjs/actions/openApi/OpenApiActionType.d.ts +3 -0
- package/lib/commonjs/actions/openApi/OpenApiActionType.js +8 -0
- package/lib/commonjs/actions/openApi/OpenApiActionType.js.map +1 -0
- package/lib/commonjs/actions/openApi/askOpenApiGetDocument.d.ts +9 -0
- package/lib/commonjs/actions/openApi/askOpenApiGetDocument.js +12 -0
- package/lib/commonjs/actions/openApi/askOpenApiGetDocument.js.map +1 -0
- package/lib/commonjs/actions/openApi/index.d.ts +2 -0
- package/lib/commonjs/actions/{openApiSpec → openApi}/index.js +2 -2
- package/lib/commonjs/actions/openApi/index.js.map +1 -0
- package/lib/commonjs/config/QPQConfig.d.ts +0 -1
- package/lib/commonjs/config/QPQConfig.js +0 -1
- package/lib/commonjs/config/QPQConfig.js.map +1 -1
- package/lib/commonjs/config/settings/api.d.ts +1 -2
- package/lib/commonjs/config/settings/api.js +1 -2
- package/lib/commonjs/config/settings/api.js.map +1 -1
- package/lib/commonjs/config/settings/dns.d.ts +15 -5
- package/lib/commonjs/config/settings/dns.js +10 -5
- package/lib/commonjs/config/settings/dns.js.map +1 -1
- package/lib/commonjs/config/settings/domainProxy.d.ts +0 -1
- package/lib/commonjs/config/settings/domainProxy.js.map +1 -1
- package/lib/commonjs/config/settings/emailSender.d.ts +3 -4
- package/lib/commonjs/config/settings/emailSender.js +5 -7
- package/lib/commonjs/config/settings/emailSender.js.map +1 -1
- package/lib/commonjs/config/settings/index.d.ts +0 -1
- package/lib/commonjs/config/settings/index.js +0 -1
- package/lib/commonjs/config/settings/index.js.map +1 -1
- package/lib/commonjs/config/settings/route.d.ts +2 -0
- package/lib/commonjs/config/settings/route.js.map +1 -1
- package/lib/commonjs/config/settings/webEntry.d.ts +0 -1
- package/lib/commonjs/config/settings/webEntry.js.map +1 -1
- package/lib/commonjs/config/settings/websocket.d.ts +1 -2
- package/lib/commonjs/config/settings/websocket.js +3 -12
- package/lib/commonjs/config/settings/websocket.js.map +1 -1
- package/lib/commonjs/config/types/JsonSchema.d.ts +1 -0
- package/lib/commonjs/config/types/JsonSchema.js +3 -0
- package/lib/commonjs/config/types/JsonSchema.js.map +1 -0
- package/lib/commonjs/config/types/RouteSchema.d.ts +10 -0
- package/lib/commonjs/config/types/RouteSchema.js +3 -0
- package/lib/commonjs/config/types/RouteSchema.js.map +1 -0
- package/lib/commonjs/config/types/index.d.ts +2 -0
- package/lib/commonjs/config/types/index.js +2 -0
- package/lib/commonjs/config/types/index.js.map +1 -1
- package/lib/commonjs/configUtils/dns/getDnsConfig.d.ts +4 -0
- package/lib/commonjs/configUtils/dns/getDnsConfig.js +16 -0
- package/lib/commonjs/configUtils/dns/getDnsConfig.js.map +1 -0
- package/lib/commonjs/configUtils/dns/getPrimaryRootDomain.d.ts +3 -0
- package/lib/commonjs/configUtils/dns/getPrimaryRootDomain.js +8 -0
- package/lib/commonjs/configUtils/dns/getPrimaryRootDomain.js.map +1 -0
- package/lib/commonjs/configUtils/dns/getRootDomains.d.ts +3 -0
- package/lib/commonjs/configUtils/dns/getRootDomains.js +8 -0
- package/lib/commonjs/configUtils/dns/getRootDomains.js.map +1 -0
- package/lib/commonjs/configUtils/dns/index.d.ts +3 -0
- package/lib/commonjs/configUtils/dns/index.js +20 -0
- package/lib/commonjs/configUtils/dns/index.js.map +1 -0
- package/lib/commonjs/configUtils/index.d.ts +2 -0
- package/lib/commonjs/configUtils/index.js +19 -0
- package/lib/commonjs/configUtils/index.js.map +1 -0
- package/lib/commonjs/configUtils/storageDrive/getStorageDriveCorsSettingsByName.d.ts +4 -0
- package/lib/commonjs/configUtils/storageDrive/getStorageDriveCorsSettingsByName.js +14 -0
- package/lib/commonjs/configUtils/storageDrive/getStorageDriveCorsSettingsByName.js.map +1 -0
- package/lib/commonjs/configUtils/storageDrive/index.d.ts +1 -0
- package/lib/commonjs/configUtils/storageDrive/index.js +18 -0
- package/lib/commonjs/configUtils/storageDrive/index.js.map +1 -0
- package/lib/commonjs/domain/index.d.ts +2 -0
- package/lib/commonjs/domain/index.js +19 -0
- package/lib/commonjs/domain/index.js.map +1 -0
- package/lib/commonjs/domain/logic/host/findRootDomainForHost.d.ts +6 -0
- package/lib/commonjs/domain/logic/host/findRootDomainForHost.js +19 -0
- package/lib/commonjs/domain/logic/host/findRootDomainForHost.js.map +1 -0
- package/lib/commonjs/domain/logic/host/getDomainTargetKey.d.ts +3 -0
- package/lib/commonjs/domain/logic/host/getDomainTargetKey.js +7 -0
- package/lib/commonjs/domain/logic/host/getDomainTargetKey.js.map +1 -0
- package/lib/commonjs/domain/logic/host/index.d.ts +6 -0
- package/lib/commonjs/domain/logic/host/index.js +23 -0
- package/lib/commonjs/domain/logic/host/index.js.map +1 -0
- package/lib/commonjs/domain/logic/host/resolveHostForRequestHost.d.ts +9 -0
- package/lib/commonjs/domain/logic/host/resolveHostForRequestHost.js +21 -0
- package/lib/commonjs/domain/logic/host/resolveHostForRequestHost.js.map +1 -0
- package/lib/commonjs/domain/logic/host/resolveHostForRoot.d.ts +5 -0
- package/lib/commonjs/domain/logic/host/resolveHostForRoot.js +15 -0
- package/lib/commonjs/domain/logic/host/resolveHostForRoot.js.map +1 -0
- package/lib/commonjs/domain/logic/host/resolveHosts.d.ts +9 -0
- package/lib/commonjs/domain/logic/host/resolveHosts.js +27 -0
- package/lib/commonjs/domain/logic/host/resolveHosts.js.map +1 -0
- package/lib/commonjs/domain/logic/host/resolvePrimaryHost.d.ts +5 -0
- package/lib/commonjs/domain/logic/host/resolvePrimaryHost.js +14 -0
- package/lib/commonjs/domain/logic/host/resolvePrimaryHost.js.map +1 -0
- package/lib/commonjs/domain/logic/index.d.ts +3 -0
- package/lib/commonjs/domain/logic/index.js +20 -0
- package/lib/commonjs/domain/logic/index.js.map +1 -0
- package/lib/commonjs/domain/logic/origin/getStorageDriveCorsAllowedOrigins.d.ts +4 -0
- package/lib/commonjs/domain/logic/origin/getStorageDriveCorsAllowedOrigins.js +9 -0
- package/lib/commonjs/domain/logic/origin/getStorageDriveCorsAllowedOrigins.js.map +1 -0
- package/lib/commonjs/domain/logic/origin/index.d.ts +4 -0
- package/lib/commonjs/domain/logic/origin/index.js +21 -0
- package/lib/commonjs/domain/logic/origin/index.js.map +1 -0
- package/lib/commonjs/domain/logic/origin/resolveContentSecurityPolicyEntry.d.ts +9 -0
- package/lib/commonjs/domain/logic/origin/resolveContentSecurityPolicyEntry.js +20 -0
- package/lib/commonjs/domain/logic/origin/resolveContentSecurityPolicyEntry.js.map +1 -0
- package/lib/commonjs/domain/logic/origin/resolveOrigins.d.ts +8 -0
- package/lib/commonjs/domain/logic/origin/resolveOrigins.js +20 -0
- package/lib/commonjs/domain/logic/origin/resolveOrigins.js.map +1 -0
- package/lib/commonjs/domain/logic/origin/resolveServiceScopedCorsAllowedOrigins.d.ts +8 -0
- package/lib/commonjs/domain/logic/origin/resolveServiceScopedCorsAllowedOrigins.js +21 -0
- package/lib/commonjs/domain/logic/origin/resolveServiceScopedCorsAllowedOrigins.js.map +1 -0
- package/lib/commonjs/domain/logic/resolver/getDomainResolver.d.ts +4 -0
- package/lib/commonjs/domain/logic/resolver/getDomainResolver.js +20 -0
- package/lib/commonjs/domain/logic/resolver/getDomainResolver.js.map +1 -0
- package/lib/commonjs/domain/logic/resolver/index.d.ts +4 -0
- package/lib/commonjs/domain/logic/resolver/index.js +21 -0
- package/lib/commonjs/domain/logic/resolver/index.js.map +1 -0
- package/lib/commonjs/domain/logic/resolver/isLocalhostRootDomain.d.ts +2 -0
- package/lib/commonjs/domain/logic/resolver/isLocalhostRootDomain.js +7 -0
- package/lib/commonjs/domain/logic/resolver/isLocalhostRootDomain.js.map +1 -0
- package/lib/commonjs/domain/logic/resolver/loadDomainResolver.d.ts +8 -0
- package/lib/commonjs/domain/logic/resolver/loadDomainResolver.js +33 -0
- package/lib/commonjs/domain/logic/resolver/loadDomainResolver.js.map +1 -0
- package/lib/commonjs/domain/logic/resolver/validateResolvedHost.d.ts +3 -0
- package/lib/commonjs/domain/logic/resolver/validateResolvedHost.js +13 -0
- package/lib/commonjs/domain/logic/resolver/validateResolvedHost.js.map +1 -0
- package/lib/commonjs/domain/resolvers/defaultDomainResolver.d.ts +3 -0
- package/lib/commonjs/domain/resolvers/defaultDomainResolver.js +11 -0
- package/lib/commonjs/domain/resolvers/defaultDomainResolver.js.map +1 -0
- package/lib/commonjs/domain/resolvers/index.d.ts +2 -0
- package/lib/commonjs/domain/resolvers/index.js +19 -0
- package/lib/commonjs/domain/resolvers/index.js.map +1 -0
- package/lib/commonjs/domain/resolvers/localhostDomainResolver.d.ts +3 -0
- package/lib/commonjs/domain/resolvers/localhostDomainResolver.js +8 -0
- package/lib/commonjs/domain/resolvers/localhostDomainResolver.js.map +1 -0
- package/lib/commonjs/domain/types/DomainResolver.d.ts +10 -0
- package/lib/commonjs/domain/types/DomainResolver.js +3 -0
- package/lib/commonjs/domain/types/DomainResolver.js.map +1 -0
- package/lib/commonjs/domain/types/DomainScope.d.ts +13 -0
- package/lib/commonjs/domain/types/DomainScope.js +3 -0
- package/lib/commonjs/domain/types/DomainScope.js.map +1 -0
- package/lib/commonjs/domain/types/DomainTarget.d.ts +5 -0
- package/lib/commonjs/domain/types/DomainTarget.js +3 -0
- package/lib/commonjs/domain/types/DomainTarget.js.map +1 -0
- package/lib/commonjs/domain/types/index.d.ts +3 -0
- package/lib/commonjs/domain/types/index.js +20 -0
- package/lib/commonjs/domain/types/index.js.map +1 -0
- package/lib/commonjs/index.d.ts +1 -0
- package/lib/commonjs/index.js +1 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/stories/index.d.ts +0 -1
- package/lib/commonjs/stories/index.js +0 -1
- package/lib/commonjs/stories/index.js.map +1 -1
- package/lib/commonjs/types/OpenApiDocument.d.ts +60 -0
- package/lib/commonjs/types/OpenApiDocument.js +3 -0
- package/lib/commonjs/types/OpenApiDocument.js.map +1 -0
- package/lib/commonjs/types/index.d.ts +1 -0
- package/lib/commonjs/types/index.js +1 -0
- package/lib/commonjs/types/index.js.map +1 -1
- package/lib/commonjs/utils/headerUtils.d.ts +5 -4
- package/lib/commonjs/utils/headerUtils.js +16 -29
- package/lib/commonjs/utils/headerUtils.js.map +1 -1
- package/lib/commonjs/utils/index.d.ts +3 -0
- package/lib/commonjs/utils/index.js +3 -0
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/utils/mergeRouteUtils.js +3 -0
- package/lib/commonjs/utils/mergeRouteUtils.js.map +1 -1
- package/lib/commonjs/utils/openApi/OpenApiDocumentOptions.d.ts +2 -0
- package/lib/commonjs/utils/openApi/OpenApiDocumentOptions.js +3 -0
- package/lib/commonjs/utils/openApi/OpenApiDocumentOptions.js.map +1 -0
- package/lib/commonjs/utils/openApi/buildOpenApiDocument.d.ts +5 -0
- package/lib/commonjs/utils/openApi/buildOpenApiDocument.js +55 -0
- package/lib/commonjs/utils/openApi/buildOpenApiDocument.js.map +1 -0
- package/lib/commonjs/utils/openApi/buildOpenApiOperation.d.ts +4 -0
- package/lib/commonjs/utils/openApi/buildOpenApiOperation.js +45 -0
- package/lib/commonjs/utils/openApi/buildOpenApiOperation.js.map +1 -0
- package/lib/commonjs/utils/openApi/buildOpenApiPathParameters.d.ts +2 -0
- package/lib/commonjs/utils/openApi/buildOpenApiPathParameters.js +13 -0
- package/lib/commonjs/utils/openApi/buildOpenApiPathParameters.js.map +1 -0
- package/lib/commonjs/utils/openApi/buildOpenApiQueryParameters.d.ts +3 -0
- package/lib/commonjs/utils/openApi/buildOpenApiQueryParameters.js +25 -0
- package/lib/commonjs/utils/openApi/buildOpenApiQueryParameters.js.map +1 -0
- package/lib/commonjs/utils/openApi/buildOpenApiSecurity.d.ts +4 -0
- package/lib/commonjs/utils/openApi/buildOpenApiSecurity.js +24 -0
- package/lib/commonjs/utils/openApi/buildOpenApiSecurity.js.map +1 -0
- package/lib/commonjs/utils/openApi/index.d.ts +7 -0
- package/lib/commonjs/utils/openApi/index.js +24 -0
- package/lib/commonjs/utils/openApi/index.js.map +1 -0
- package/lib/commonjs/utils/openApi/openApiSecuritySchemeNames.d.ts +2 -0
- package/lib/commonjs/utils/openApi/openApiSecuritySchemeNames.js +7 -0
- package/lib/commonjs/utils/openApi/openApiSecuritySchemeNames.js.map +1 -0
- package/lib/commonjs/utils/qpqConfigAccessorsUtils.d.ts +1 -34
- package/lib/commonjs/utils/qpqConfigAccessorsUtils.js +7 -114
- package/lib/commonjs/utils/qpqConfigAccessorsUtils.js.map +1 -1
- package/lib/esm/actionProcessor/api/getHttpApiEventAutoRespondActionProcessor.js +6 -4
- package/lib/esm/actionProcessor/api/getHttpApiEventAutoRespondActionProcessor.js.map +1 -1
- package/lib/esm/actions/dns/DnsActionType.d.ts +3 -1
- package/lib/esm/actions/dns/DnsActionType.js +2 -0
- package/lib/esm/actions/dns/DnsActionType.js.map +1 -1
- package/lib/esm/actions/dns/askDnsList.d.ts +2 -1
- package/lib/esm/actions/dns/askDnsList.js +1 -0
- package/lib/esm/actions/dns/askDnsList.js.map +1 -1
- package/lib/esm/actions/dns/askDnsResolveHosts.d.ts +9 -0
- package/lib/esm/actions/dns/askDnsResolveHosts.js +8 -0
- package/lib/esm/actions/dns/askDnsResolveHosts.js.map +1 -0
- package/lib/esm/actions/dns/index.d.ts +1 -0
- package/lib/esm/actions/dns/index.js +1 -0
- package/lib/esm/actions/dns/index.js.map +1 -1
- package/lib/esm/actions/index.d.ts +1 -1
- package/lib/esm/actions/index.js +1 -1
- package/lib/esm/actions/index.js.map +1 -1
- package/lib/esm/actions/openApi/OpenApiActionType.d.ts +3 -0
- package/lib/esm/actions/openApi/OpenApiActionType.js +5 -0
- package/lib/esm/actions/openApi/OpenApiActionType.js.map +1 -0
- package/lib/esm/actions/openApi/askOpenApiGetDocument.d.ts +9 -0
- package/lib/esm/actions/openApi/askOpenApiGetDocument.js +9 -0
- package/lib/esm/actions/openApi/askOpenApiGetDocument.js.map +1 -0
- package/lib/esm/actions/openApi/index.d.ts +2 -0
- package/lib/esm/actions/openApi/index.js +3 -0
- package/lib/esm/actions/openApi/index.js.map +1 -0
- package/lib/esm/config/QPQConfig.d.ts +0 -1
- package/lib/esm/config/QPQConfig.js +0 -1
- package/lib/esm/config/QPQConfig.js.map +1 -1
- package/lib/esm/config/settings/api.d.ts +1 -2
- package/lib/esm/config/settings/api.js +1 -2
- package/lib/esm/config/settings/api.js.map +1 -1
- package/lib/esm/config/settings/dns.d.ts +15 -5
- package/lib/esm/config/settings/dns.js +10 -5
- package/lib/esm/config/settings/dns.js.map +1 -1
- package/lib/esm/config/settings/domainProxy.d.ts +0 -1
- package/lib/esm/config/settings/domainProxy.js.map +1 -1
- package/lib/esm/config/settings/emailSender.d.ts +3 -4
- package/lib/esm/config/settings/emailSender.js +5 -7
- package/lib/esm/config/settings/emailSender.js.map +1 -1
- package/lib/esm/config/settings/index.d.ts +0 -1
- package/lib/esm/config/settings/index.js +0 -1
- package/lib/esm/config/settings/index.js.map +1 -1
- package/lib/esm/config/settings/route.d.ts +2 -0
- package/lib/esm/config/settings/route.js.map +1 -1
- package/lib/esm/config/settings/webEntry.d.ts +0 -1
- package/lib/esm/config/settings/webEntry.js.map +1 -1
- package/lib/esm/config/settings/websocket.d.ts +1 -2
- package/lib/esm/config/settings/websocket.js +3 -12
- package/lib/esm/config/settings/websocket.js.map +1 -1
- package/lib/esm/config/types/JsonSchema.d.ts +1 -0
- package/lib/esm/config/types/JsonSchema.js +2 -0
- package/lib/esm/config/types/JsonSchema.js.map +1 -0
- package/lib/esm/config/types/RouteSchema.d.ts +10 -0
- package/lib/esm/config/types/RouteSchema.js +2 -0
- package/lib/esm/config/types/RouteSchema.js.map +1 -0
- package/lib/esm/config/types/index.d.ts +2 -0
- package/lib/esm/config/types/index.js +2 -0
- package/lib/esm/config/types/index.js.map +1 -1
- package/lib/esm/configUtils/dns/getDnsConfig.d.ts +4 -0
- package/lib/esm/configUtils/dns/getDnsConfig.js +11 -0
- package/lib/esm/configUtils/dns/getDnsConfig.js.map +1 -0
- package/lib/esm/configUtils/dns/getPrimaryRootDomain.d.ts +3 -0
- package/lib/esm/configUtils/dns/getPrimaryRootDomain.js +4 -0
- package/lib/esm/configUtils/dns/getPrimaryRootDomain.js.map +1 -0
- package/lib/esm/configUtils/dns/getRootDomains.d.ts +3 -0
- package/lib/esm/configUtils/dns/getRootDomains.js +4 -0
- package/lib/esm/configUtils/dns/getRootDomains.js.map +1 -0
- package/lib/esm/configUtils/dns/index.d.ts +3 -0
- package/lib/esm/configUtils/dns/index.js +4 -0
- package/lib/esm/configUtils/dns/index.js.map +1 -0
- package/lib/esm/configUtils/index.d.ts +2 -0
- package/lib/esm/configUtils/index.js +3 -0
- package/lib/esm/configUtils/index.js.map +1 -0
- package/lib/esm/configUtils/storageDrive/getStorageDriveCorsSettingsByName.d.ts +4 -0
- package/lib/esm/configUtils/storageDrive/getStorageDriveCorsSettingsByName.js +7 -0
- package/lib/esm/configUtils/storageDrive/getStorageDriveCorsSettingsByName.js.map +1 -0
- package/lib/esm/configUtils/storageDrive/index.d.ts +1 -0
- package/lib/esm/configUtils/storageDrive/index.js +2 -0
- package/lib/esm/configUtils/storageDrive/index.js.map +1 -0
- package/lib/esm/domain/index.d.ts +2 -0
- package/lib/esm/domain/index.js +3 -0
- package/lib/esm/domain/index.js.map +1 -0
- package/lib/esm/domain/logic/host/findRootDomainForHost.d.ts +6 -0
- package/lib/esm/domain/logic/host/findRootDomainForHost.js +14 -0
- package/lib/esm/domain/logic/host/findRootDomainForHost.js.map +1 -0
- package/lib/esm/domain/logic/host/getDomainTargetKey.d.ts +3 -0
- package/lib/esm/domain/logic/host/getDomainTargetKey.js +3 -0
- package/lib/esm/domain/logic/host/getDomainTargetKey.js.map +1 -0
- package/lib/esm/domain/logic/host/index.d.ts +6 -0
- package/lib/esm/domain/logic/host/index.js +7 -0
- package/lib/esm/domain/logic/host/index.js.map +1 -0
- package/lib/esm/domain/logic/host/resolveHostForRequestHost.d.ts +9 -0
- package/lib/esm/domain/logic/host/resolveHostForRequestHost.js +16 -0
- package/lib/esm/domain/logic/host/resolveHostForRequestHost.js.map +1 -0
- package/lib/esm/domain/logic/host/resolveHostForRoot.d.ts +5 -0
- package/lib/esm/domain/logic/host/resolveHostForRoot.js +11 -0
- package/lib/esm/domain/logic/host/resolveHostForRoot.js.map +1 -0
- package/lib/esm/domain/logic/host/resolveHosts.d.ts +9 -0
- package/lib/esm/domain/logic/host/resolveHosts.js +23 -0
- package/lib/esm/domain/logic/host/resolveHosts.js.map +1 -0
- package/lib/esm/domain/logic/host/resolvePrimaryHost.d.ts +5 -0
- package/lib/esm/domain/logic/host/resolvePrimaryHost.js +10 -0
- package/lib/esm/domain/logic/host/resolvePrimaryHost.js.map +1 -0
- package/lib/esm/domain/logic/index.d.ts +3 -0
- package/lib/esm/domain/logic/index.js +4 -0
- package/lib/esm/domain/logic/index.js.map +1 -0
- package/lib/esm/domain/logic/origin/getStorageDriveCorsAllowedOrigins.d.ts +4 -0
- package/lib/esm/domain/logic/origin/getStorageDriveCorsAllowedOrigins.js +5 -0
- package/lib/esm/domain/logic/origin/getStorageDriveCorsAllowedOrigins.js.map +1 -0
- package/lib/esm/domain/logic/origin/index.d.ts +4 -0
- package/lib/esm/domain/logic/origin/index.js +5 -0
- package/lib/esm/domain/logic/origin/index.js.map +1 -0
- package/lib/esm/domain/logic/origin/resolveContentSecurityPolicyEntry.d.ts +9 -0
- package/lib/esm/domain/logic/origin/resolveContentSecurityPolicyEntry.js +16 -0
- package/lib/esm/domain/logic/origin/resolveContentSecurityPolicyEntry.js.map +1 -0
- package/lib/esm/domain/logic/origin/resolveOrigins.d.ts +8 -0
- package/lib/esm/domain/logic/origin/resolveOrigins.js +16 -0
- package/lib/esm/domain/logic/origin/resolveOrigins.js.map +1 -0
- package/lib/esm/domain/logic/origin/resolveServiceScopedCorsAllowedOrigins.d.ts +8 -0
- package/lib/esm/domain/logic/origin/resolveServiceScopedCorsAllowedOrigins.js +17 -0
- package/lib/esm/domain/logic/origin/resolveServiceScopedCorsAllowedOrigins.js.map +1 -0
- package/lib/esm/domain/logic/resolver/getDomainResolver.d.ts +4 -0
- package/lib/esm/domain/logic/resolver/getDomainResolver.js +16 -0
- package/lib/esm/domain/logic/resolver/getDomainResolver.js.map +1 -0
- package/lib/esm/domain/logic/resolver/index.d.ts +4 -0
- package/lib/esm/domain/logic/resolver/index.js +5 -0
- package/lib/esm/domain/logic/resolver/index.js.map +1 -0
- package/lib/esm/domain/logic/resolver/isLocalhostRootDomain.d.ts +2 -0
- package/lib/esm/domain/logic/resolver/isLocalhostRootDomain.js +3 -0
- package/lib/esm/domain/logic/resolver/isLocalhostRootDomain.js.map +1 -0
- package/lib/esm/domain/logic/resolver/loadDomainResolver.d.ts +8 -0
- package/lib/esm/domain/logic/resolver/loadDomainResolver.js +19 -0
- package/lib/esm/domain/logic/resolver/loadDomainResolver.js.map +1 -0
- package/lib/esm/domain/logic/resolver/validateResolvedHost.d.ts +3 -0
- package/lib/esm/domain/logic/resolver/validateResolvedHost.js +9 -0
- package/lib/esm/domain/logic/resolver/validateResolvedHost.js.map +1 -0
- package/lib/esm/domain/resolvers/defaultDomainResolver.d.ts +3 -0
- package/lib/esm/domain/resolvers/defaultDomainResolver.js +8 -0
- package/lib/esm/domain/resolvers/defaultDomainResolver.js.map +1 -0
- package/lib/esm/domain/resolvers/index.d.ts +2 -0
- package/lib/esm/domain/resolvers/index.js +3 -0
- package/lib/esm/domain/resolvers/index.js.map +1 -0
- package/lib/esm/domain/resolvers/localhostDomainResolver.d.ts +3 -0
- package/lib/esm/domain/resolvers/localhostDomainResolver.js +5 -0
- package/lib/esm/domain/resolvers/localhostDomainResolver.js.map +1 -0
- package/lib/esm/domain/types/DomainResolver.d.ts +10 -0
- package/lib/esm/domain/types/DomainResolver.js +2 -0
- package/lib/esm/domain/types/DomainResolver.js.map +1 -0
- package/lib/esm/domain/types/DomainScope.d.ts +13 -0
- package/lib/esm/domain/types/DomainScope.js +2 -0
- package/lib/esm/domain/types/DomainScope.js.map +1 -0
- package/lib/esm/domain/types/DomainTarget.d.ts +5 -0
- package/lib/esm/domain/types/DomainTarget.js +2 -0
- package/lib/esm/domain/types/DomainTarget.js.map +1 -0
- package/lib/esm/domain/types/index.d.ts +3 -0
- package/lib/esm/domain/types/index.js +4 -0
- package/lib/esm/domain/types/index.js.map +1 -0
- package/lib/esm/index.d.ts +1 -0
- package/lib/esm/index.js +1 -0
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/stories/index.d.ts +0 -1
- package/lib/esm/stories/index.js +0 -1
- package/lib/esm/stories/index.js.map +1 -1
- package/lib/esm/types/OpenApiDocument.d.ts +60 -0
- package/lib/esm/types/OpenApiDocument.js +2 -0
- package/lib/esm/types/OpenApiDocument.js.map +1 -0
- package/lib/esm/types/index.d.ts +1 -0
- package/lib/esm/types/index.js +1 -0
- package/lib/esm/types/index.js.map +1 -1
- package/lib/esm/utils/headerUtils.d.ts +5 -4
- package/lib/esm/utils/headerUtils.js +16 -28
- package/lib/esm/utils/headerUtils.js.map +1 -1
- package/lib/esm/utils/index.d.ts +3 -0
- package/lib/esm/utils/index.js +3 -0
- package/lib/esm/utils/index.js.map +1 -1
- package/lib/esm/utils/mergeRouteUtils.js +2 -0
- package/lib/esm/utils/mergeRouteUtils.js.map +1 -1
- package/lib/esm/utils/openApi/OpenApiDocumentOptions.d.ts +2 -0
- package/lib/esm/utils/openApi/OpenApiDocumentOptions.js +2 -0
- package/lib/esm/utils/openApi/OpenApiDocumentOptions.js.map +1 -0
- package/lib/esm/utils/openApi/buildOpenApiDocument.d.ts +5 -0
- package/lib/esm/utils/openApi/buildOpenApiDocument.js +50 -0
- package/lib/esm/utils/openApi/buildOpenApiDocument.js.map +1 -0
- package/lib/esm/utils/openApi/buildOpenApiOperation.d.ts +4 -0
- package/lib/esm/utils/openApi/buildOpenApiOperation.js +40 -0
- package/lib/esm/utils/openApi/buildOpenApiOperation.js.map +1 -0
- package/lib/esm/utils/openApi/buildOpenApiPathParameters.d.ts +2 -0
- package/lib/esm/utils/openApi/buildOpenApiPathParameters.js +9 -0
- package/lib/esm/utils/openApi/buildOpenApiPathParameters.js.map +1 -0
- package/lib/esm/utils/openApi/buildOpenApiQueryParameters.d.ts +3 -0
- package/lib/esm/utils/openApi/buildOpenApiQueryParameters.js +21 -0
- package/lib/esm/utils/openApi/buildOpenApiQueryParameters.js.map +1 -0
- package/lib/esm/utils/openApi/buildOpenApiSecurity.d.ts +4 -0
- package/lib/esm/utils/openApi/buildOpenApiSecurity.js +19 -0
- package/lib/esm/utils/openApi/buildOpenApiSecurity.js.map +1 -0
- package/lib/esm/utils/openApi/index.d.ts +7 -0
- package/lib/esm/utils/openApi/index.js +8 -0
- package/lib/esm/utils/openApi/index.js.map +1 -0
- package/lib/esm/utils/openApi/openApiSecuritySchemeNames.d.ts +2 -0
- package/lib/esm/utils/openApi/openApiSecuritySchemeNames.js +4 -0
- package/lib/esm/utils/openApi/openApiSecuritySchemeNames.js.map +1 -0
- package/lib/esm/utils/qpqConfigAccessorsUtils.d.ts +1 -34
- package/lib/esm/utils/qpqConfigAccessorsUtils.js +5 -100
- package/lib/esm/utils/qpqConfigAccessorsUtils.js.map +1 -1
- package/package.json +3 -3
- package/lib/commonjs/actions/openApiSpec/OpenApiSpecActionType.d.ts +0 -3
- package/lib/commonjs/actions/openApiSpec/OpenApiSpecActionType.js +0 -8
- package/lib/commonjs/actions/openApiSpec/OpenApiSpecActionType.js.map +0 -1
- package/lib/commonjs/actions/openApiSpec/askGetOpenApiSpec.d.ts +0 -2
- package/lib/commonjs/actions/openApiSpec/askGetOpenApiSpec.js +0 -9
- package/lib/commonjs/actions/openApiSpec/askGetOpenApiSpec.js.map +0 -1
- package/lib/commonjs/actions/openApiSpec/index.d.ts +0 -2
- package/lib/commonjs/actions/openApiSpec/index.js.map +0 -1
- package/lib/commonjs/config/settings/openApi.d.ts +0 -5
- package/lib/commonjs/config/settings/openApi.js +0 -13
- package/lib/commonjs/config/settings/openApi.js.map +0 -1
- package/lib/commonjs/stories/askGetDomainRoot.d.ts +0 -2
- package/lib/commonjs/stories/askGetDomainRoot.js +0 -22
- package/lib/commonjs/stories/askGetDomainRoot.js.map +0 -1
- package/lib/esm/actions/openApiSpec/OpenApiSpecActionType.d.ts +0 -3
- package/lib/esm/actions/openApiSpec/OpenApiSpecActionType.js +0 -5
- package/lib/esm/actions/openApiSpec/OpenApiSpecActionType.js.map +0 -1
- package/lib/esm/actions/openApiSpec/askGetOpenApiSpec.d.ts +0 -2
- package/lib/esm/actions/openApiSpec/askGetOpenApiSpec.js +0 -6
- package/lib/esm/actions/openApiSpec/askGetOpenApiSpec.js.map +0 -1
- package/lib/esm/actions/openApiSpec/index.d.ts +0 -2
- package/lib/esm/actions/openApiSpec/index.js +0 -3
- package/lib/esm/actions/openApiSpec/index.js.map +0 -1
- package/lib/esm/config/settings/openApi.d.ts +0 -5
- package/lib/esm/config/settings/openApi.js +0 -9
- package/lib/esm/config/settings/openApi.js.map +0 -1
- package/lib/esm/stories/askGetDomainRoot.d.ts +0 -2
- package/lib/esm/stories/askGetDomainRoot.js +0 -18
- package/lib/esm/stories/askGetDomainRoot.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenApiDocument.js","sourceRoot":"","sources":["../../../src/types/OpenApiDocument.ts"],"names":[],"mappings":"","sourcesContent":["import { JsonSchema } from '../config/types/JsonSchema';\n\n// The slice of OpenAPI 3.1 this framework emits. Anything the generator does not\n// produce (callbacks, links, examples) is deliberately absent rather than typed loosely.\nexport type OpenApiParameter = {\n name: string;\n in: 'path' | 'query';\n required: boolean;\n schema: JsonSchema;\n description?: string;\n};\n\nexport type OpenApiMediaType = { schema: JsonSchema };\n\nexport type OpenApiRequestBody = {\n required: boolean;\n content: { 'application/json': OpenApiMediaType };\n};\n\nexport type OpenApiResponse = {\n description: string;\n content?: { 'application/json': OpenApiMediaType };\n};\n\nexport type OpenApiSecurityRequirement = Record<string, string[]>;\n\nexport type OpenApiOperation = {\n operationId: string;\n summary?: string;\n description?: string;\n tags?: string[];\n parameters?: OpenApiParameter[];\n requestBody?: OpenApiRequestBody;\n responses: Record<string, OpenApiResponse>;\n security?: OpenApiSecurityRequirement[];\n};\n\nexport type OpenApiPathItem = Partial<Record<'get' | 'post' | 'put' | 'patch' | 'delete' | 'options' | 'head', OpenApiOperation>>;\n\nexport type OpenApiSecurityScheme = { type: 'http'; scheme: 'bearer'; bearerFormat: 'JWT' } | { type: 'apiKey'; in: 'header'; name: string };\n\nexport type OpenApiInfo = {\n title: string;\n version: string;\n description?: string;\n};\n\nexport type OpenApiDocument = {\n openapi: '3.1.0';\n info: OpenApiInfo;\n servers: { url: string }[];\n paths: Record<string, OpenApiPathItem>;\n components: {\n securitySchemes: Record<string, OpenApiSecurityScheme>;\n };\n};\n"]}
|
|
@@ -3,6 +3,7 @@ export * from './constants';
|
|
|
3
3
|
export * from './EmailSendEvent';
|
|
4
4
|
export * from './ExecuteServiceFunctionEvent';
|
|
5
5
|
export * from './HTTPEvent';
|
|
6
|
+
export * from './OpenApiDocument';
|
|
6
7
|
export * from './SEOEvent';
|
|
7
8
|
export * from './StorageDriveEvent';
|
|
8
9
|
export * from './WebsocketEvent';
|
|
@@ -19,6 +19,7 @@ __exportStar(require("./constants"), exports);
|
|
|
19
19
|
__exportStar(require("./EmailSendEvent"), exports);
|
|
20
20
|
__exportStar(require("./ExecuteServiceFunctionEvent"), exports);
|
|
21
21
|
__exportStar(require("./HTTPEvent"), exports);
|
|
22
|
+
__exportStar(require("./OpenApiDocument"), exports);
|
|
22
23
|
__exportStar(require("./SEOEvent"), exports);
|
|
23
24
|
__exportStar(require("./StorageDriveEvent"), exports);
|
|
24
25
|
__exportStar(require("./WebsocketEvent"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C;AAC3C,8CAA4B;AAC5B,mDAAiC;AACjC,gEAA8C;AAC9C,8CAA4B;AAC5B,6CAA2B;AAC3B,sDAAoC;AACpC,mDAAiC","sourcesContent":["export * from './CloudflareDnsDeployEvent';\nexport * from './constants';\nexport * from './EmailSendEvent';\nexport * from './ExecuteServiceFunctionEvent';\nexport * from './HTTPEvent';\nexport * from './SEOEvent';\nexport * from './StorageDriveEvent';\nexport * from './WebsocketEvent';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C;AAC3C,8CAA4B;AAC5B,mDAAiC;AACjC,gEAA8C;AAC9C,8CAA4B;AAC5B,oDAAkC;AAClC,6CAA2B;AAC3B,sDAAoC;AACpC,mDAAiC","sourcesContent":["export * from './CloudflareDnsDeployEvent';\nexport * from './constants';\nexport * from './EmailSendEvent';\nexport * from './ExecuteServiceFunctionEvent';\nexport * from './HTTPEvent';\nexport * from './OpenApiDocument';\nexport * from './SEOEvent';\nexport * from './StorageDriveEvent';\nexport * from './WebsocketEvent';\n"]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { AskResponse, QPQConfig } from 'quidproquo-core';
|
|
2
|
-
import { RouteOptions
|
|
2
|
+
import { RouteOptions } from '../config/settings/route';
|
|
3
|
+
import { DomainResolver } from '../domain/types/DomainResolver';
|
|
3
4
|
import { SeoEvent } from '../types';
|
|
4
5
|
import { HTTPEvent, HttpEventHeaders } from '../types/HTTPEvent';
|
|
5
6
|
export declare const getHeaderValue: (header: string, headers: HttpEventHeaders) => string | null;
|
|
6
7
|
export declare function askReadRequiredHeader(event: HTTPEvent, requiredHeader: string): AskResponse<string>;
|
|
7
8
|
export declare function askReadRequiredHeaders(event: HTTPEvent, requiredHeaders: string[]): AskResponse<string[]>;
|
|
8
9
|
export declare const getAccessTokenFromHeaders: (headers: HttpEventHeaders) => string | undefined;
|
|
9
|
-
|
|
10
|
-
export declare const getAllowedOrigins: (qpqConfig: QPQConfig, route: RouteOptions) => string[];
|
|
11
|
-
export declare const getCorsHeaders: (qpqConfig: QPQConfig, route: RouteOptions, reqHeaders: HttpEventHeaders) => HttpEventHeaders;
|
|
10
|
+
/** Site roots first (primary leads, so it is the fallback origin), then default and route entries, all lowercased. */
|
|
11
|
+
export declare const getAllowedOrigins: (qpqConfig: QPQConfig, route: RouteOptions, resolver?: DomainResolver) => string[];
|
|
12
|
+
export declare const getCorsHeaders: (qpqConfig: QPQConfig, route: RouteOptions, reqHeaders: HttpEventHeaders, resolver?: DomainResolver) => HttpEventHeaders;
|
|
12
13
|
export declare const isBot: (event: HTTPEvent | SeoEvent<any>) => boolean;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isBot = exports.getCorsHeaders = exports.getAllowedOrigins = exports.
|
|
3
|
+
exports.isBot = exports.getCorsHeaders = exports.getAllowedOrigins = exports.getAccessTokenFromHeaders = exports.getHeaderValue = void 0;
|
|
4
4
|
exports.askReadRequiredHeader = askReadRequiredHeader;
|
|
5
5
|
exports.askReadRequiredHeaders = askReadRequiredHeaders;
|
|
6
6
|
const quidproquo_core_1 = require("quidproquo-core");
|
|
7
|
+
const resolveHosts_1 = require("../domain/logic/host/resolveHosts");
|
|
8
|
+
const resolveOrigins_1 = require("../domain/logic/origin/resolveOrigins");
|
|
7
9
|
const types_1 = require("../types");
|
|
8
10
|
const qpqConfigAccessorsUtils_1 = require("./qpqConfigAccessorsUtils");
|
|
9
11
|
const getHeaderValue = (header, headers) => {
|
|
@@ -33,40 +35,25 @@ const getAccessTokenFromHeaders = (headers) => {
|
|
|
33
35
|
return authToken;
|
|
34
36
|
};
|
|
35
37
|
exports.getAccessTokenFromHeaders = getAccessTokenFromHeaders;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const protocol = allowedOrigin.protocol || 'https';
|
|
43
|
-
if (allowedOrigin.service) {
|
|
44
|
-
return `${protocol}://${allowedOrigin.api}.${allowedOrigin.service}.${domain}`;
|
|
45
|
-
}
|
|
46
|
-
return `${protocol}://${allowedOrigin.api}.${domain}`;
|
|
47
|
-
};
|
|
48
|
-
exports.convertContentSecurityPolicyEntryToString = convertContentSecurityPolicyEntryToString;
|
|
49
|
-
const getAllowedOrigins = (qpqConfig, route) => {
|
|
50
|
-
const baseDomain = (0, qpqConfigAccessorsUtils_1.getBaseDomainName)(qpqConfig);
|
|
51
|
-
// Root domain
|
|
52
|
-
const rootDomain = `https://${baseDomain}`;
|
|
53
|
-
// generic settings
|
|
54
|
-
const defaultRouteSettings = (0, qpqConfigAccessorsUtils_1.getDefaultRouteSettings)(qpqConfig);
|
|
55
|
-
const defaultAllowedOrigins = defaultRouteSettings.reduce((acc, cur) => [...acc, ...(cur.routeOptions.allowedOrigins || []).map((ao) => (0, exports.convertContentSecurityPolicyEntryToString)(baseDomain, ao))], []);
|
|
56
|
-
// Route specific
|
|
57
|
-
const routeAllowedOrigins = (route.allowedOrigins || []).map((ao) => (0, exports.convertContentSecurityPolicyEntryToString)(baseDomain, ao));
|
|
58
|
-
// Return the allowed origins
|
|
59
|
-
const allAllowedOrigins = [rootDomain, ...defaultAllowedOrigins, ...routeAllowedOrigins].map((o) => o.toLowerCase());
|
|
60
|
-
return allAllowedOrigins;
|
|
38
|
+
/** Site roots first (primary leads, so it is the fallback origin), then default and route entries, all lowercased. */
|
|
39
|
+
const getAllowedOrigins = (qpqConfig, route, resolver) => {
|
|
40
|
+
const rootOrigins = (0, resolveHosts_1.resolveHosts)(qpqConfig, {}, resolver).map((host) => `https://${host}`);
|
|
41
|
+
const defaultAllowedOrigins = (0, qpqConfigAccessorsUtils_1.getDefaultRouteSettings)(qpqConfig).flatMap((setting) => (setting.routeOptions.allowedOrigins || []).flatMap((entry) => (0, resolveOrigins_1.resolveOrigins)(qpqConfig, entry, resolver)));
|
|
42
|
+
const routeAllowedOrigins = (route.allowedOrigins || []).flatMap((entry) => (0, resolveOrigins_1.resolveOrigins)(qpqConfig, entry, resolver));
|
|
43
|
+
return [...rootOrigins, ...defaultAllowedOrigins, ...routeAllowedOrigins].map((origin) => origin.toLowerCase());
|
|
61
44
|
};
|
|
62
45
|
exports.getAllowedOrigins = getAllowedOrigins;
|
|
63
|
-
const getCorsHeaders = (qpqConfig, route, reqHeaders) => {
|
|
46
|
+
const getCorsHeaders = (qpqConfig, route, reqHeaders, resolver) => {
|
|
64
47
|
var _a;
|
|
65
48
|
const origin = (0, exports.getHeaderValue)('origin', reqHeaders) || '';
|
|
66
|
-
const allowedOrigins = (0, exports.getAllowedOrigins)(qpqConfig, route);
|
|
49
|
+
const allowedOrigins = (0, exports.getAllowedOrigins)(qpqConfig, route, resolver);
|
|
67
50
|
const allowCredentials = !!((_a = route.routeAuthSettings) === null || _a === void 0 ? void 0 : _a.userDirectoryName);
|
|
68
51
|
// If we have an auth endpoint, then we don't let wildcard origins access the API for security reasons
|
|
69
|
-
|
|
52
|
+
// A service with no domain declares nothing browser-facing, so an open origin is the
|
|
53
|
+
// only sensible fallback (the storage-drive cors default makes the same call).
|
|
54
|
+
const allowOrigin = (!allowCredentials ? allowedOrigins.find((ao) => origin === ao || ao === '*') : allowedOrigins.find((ao) => origin === ao)) ||
|
|
55
|
+
allowedOrigins[0] ||
|
|
56
|
+
'*';
|
|
70
57
|
// Reflect exactly what the preflight asks for instead of a blanket '*'. A
|
|
71
58
|
// literal '*' is invalid once credentials are allowed (browsers reject it),
|
|
72
59
|
// so echoing the requested headers/method keeps authenticated routes working
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headerUtils.js","sourceRoot":"","sources":["../../../src/utils/headerUtils.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"headerUtils.js","sourceRoot":"","sources":["../../../src/utils/headerUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { askMap, AskResponse, askThrowError, ErrorTypeEnum, QPQConfig } from 'quidproquo-core';\n\nimport { RouteOptions } from '../config/settings/route';\nimport { resolveHosts } from '../domain/logic/host/resolveHosts';\nimport { resolveOrigins } from '../domain/logic/origin/resolveOrigins';\nimport { DomainResolver } from '../domain/types/DomainResolver';\nimport { qpqHeaderIsBot, SeoEvent } from '../types';\nimport { HTTPEvent, HttpEventHeaders } from '../types/HTTPEvent';\nimport { getDefaultRouteSettings } from './qpqConfigAccessorsUtils';\n\nexport const getHeaderValue = (header: string, headers: HttpEventHeaders): string | null => {\n const headerAsLower = header.toLowerCase();\n const realHeaderKey = Object.keys(headers).find((k) => k.toLowerCase() === headerAsLower);\n\n if (!realHeaderKey) {\n return null;\n }\n\n return headers[realHeaderKey] || null;\n};\n\nexport function* askReadRequiredHeader(event: HTTPEvent, requiredHeader: string): AskResponse<string> {\n const header = getHeaderValue(requiredHeader, event.headers);\n if (!header) {\n return yield* askThrowError(ErrorTypeEnum.NotFound, `Header ${requiredHeader} not found`);\n }\n\n return header;\n}\n\nexport function* askReadRequiredHeaders(event: HTTPEvent, requiredHeaders: string[]): AskResponse<string[]> {\n return yield* askMap(requiredHeaders, function* (header: string) {\n return yield* askReadRequiredHeader(event, header);\n });\n}\n\nexport const getAccessTokenFromHeaders = (headers: HttpEventHeaders): string | undefined => {\n const authorizationHeader = getHeaderValue('authorization', headers) || '';\n const [authType, authToken] = authorizationHeader.split(' ');\n\n return authToken;\n};\n\n/** Site roots first (primary leads, so it is the fallback origin), then default and route entries, all lowercased. */\nexport const getAllowedOrigins = (qpqConfig: QPQConfig, route: RouteOptions, resolver?: DomainResolver): string[] => {\n const rootOrigins = resolveHosts(qpqConfig, {}, resolver).map((host) => `https://${host}`);\n\n const defaultAllowedOrigins = getDefaultRouteSettings(qpqConfig).flatMap((setting) =>\n (setting.routeOptions.allowedOrigins || []).flatMap((entry) => resolveOrigins(qpqConfig, entry, resolver)),\n );\n\n const routeAllowedOrigins = (route.allowedOrigins || []).flatMap((entry) => resolveOrigins(qpqConfig, entry, resolver));\n\n return [...rootOrigins, ...defaultAllowedOrigins, ...routeAllowedOrigins].map((origin) => origin.toLowerCase());\n};\n\nexport const getCorsHeaders = (\n qpqConfig: QPQConfig,\n route: RouteOptions,\n reqHeaders: HttpEventHeaders,\n resolver?: DomainResolver,\n): HttpEventHeaders => {\n const origin = getHeaderValue('origin', reqHeaders) || '';\n\n const allowedOrigins = getAllowedOrigins(qpqConfig, route, resolver);\n\n const allowCredentials = !!route.routeAuthSettings?.userDirectoryName;\n\n // If we have an auth endpoint, then we don't let wildcard origins access the API for security reasons\n // A service with no domain declares nothing browser-facing, so an open origin is the\n // only sensible fallback (the storage-drive cors default makes the same call).\n const allowOrigin =\n (!allowCredentials ? allowedOrigins.find((ao) => origin === ao || ao === '*') : allowedOrigins.find((ao) => origin === ao)) ||\n allowedOrigins[0] ||\n '*';\n\n // Reflect exactly what the preflight asks for instead of a blanket '*'. A\n // literal '*' is invalid once credentials are allowed (browsers reject it),\n // so echoing the requested headers/method keeps authenticated routes working\n // while staying scoped to the real request. The security boundary is the\n // origin check above; these two just describe what that trusted origin may send.\n const requestedHeaders = getHeaderValue('access-control-request-headers', reqHeaders);\n const requestedMethod = getHeaderValue('access-control-request-method', reqHeaders);\n\n return {\n 'Access-Control-Allow-Headers': requestedHeaders || 'Authorization, Content-Type',\n 'Access-Control-Allow-Methods': requestedMethod || 'GET, POST, PUT, PATCH, DELETE, OPTIONS',\n 'Access-Control-Allow-Origin': allowOrigin,\n 'Access-Control-Allow-Credentials': `${allowCredentials}`,\n Vary: 'Origin, Access-Control-Request-Headers, Access-Control-Request-Method',\n };\n};\n\nexport const isBot = (event: HTTPEvent | SeoEvent<any>): boolean => {\n return event.headers[qpqHeaderIsBot] === 'true';\n};\n"]}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
export * from '../configUtils';
|
|
2
|
+
export * from '../domain/logic';
|
|
1
3
|
export * from './headerUtils';
|
|
2
4
|
export * from './httpEventUtils';
|
|
3
5
|
export * from './jwtUtils';
|
|
4
6
|
export * from './mergeRouteUtils';
|
|
5
7
|
export * from './networkRequestUtils';
|
|
8
|
+
export * from './openApi';
|
|
6
9
|
export * from './pathUtils';
|
|
7
10
|
export * from './preformNetworkRequest';
|
|
8
11
|
export * from './qpqConfigAccessorsUtils';
|
|
@@ -14,11 +14,14 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("../configUtils"), exports);
|
|
18
|
+
__exportStar(require("../domain/logic"), exports);
|
|
17
19
|
__exportStar(require("./headerUtils"), exports);
|
|
18
20
|
__exportStar(require("./httpEventUtils"), exports);
|
|
19
21
|
__exportStar(require("./jwtUtils"), exports);
|
|
20
22
|
__exportStar(require("./mergeRouteUtils"), exports);
|
|
21
23
|
__exportStar(require("./networkRequestUtils"), exports);
|
|
24
|
+
__exportStar(require("./openApi"), exports);
|
|
22
25
|
__exportStar(require("./pathUtils"), exports);
|
|
23
26
|
__exportStar(require("./preformNetworkRequest"), exports);
|
|
24
27
|
__exportStar(require("./qpqConfigAccessorsUtils"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,mDAAiC;AACjC,6CAA2B;AAC3B,oDAAkC;AAClC,wDAAsC;AACtC,8CAA4B;AAC5B,0DAAwC;AACxC,4DAA0C;AAC1C,6CAA2B;AAC3B,wDAAsC","sourcesContent":["export * from './headerUtils';\nexport * from './httpEventUtils';\nexport * from './jwtUtils';\nexport * from './mergeRouteUtils';\nexport * from './networkRequestUtils';\nexport * from './pathUtils';\nexport * from './preformNetworkRequest';\nexport * from './qpqConfigAccessorsUtils';\nexport * from './urlUtils';\nexport * from './websocketEventUtils';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,kDAAgC;AAChC,gDAA8B;AAC9B,mDAAiC;AACjC,6CAA2B;AAC3B,oDAAkC;AAClC,wDAAsC;AACtC,4CAA0B;AAC1B,8CAA4B;AAC5B,0DAAwC;AACxC,4DAA0C;AAC1C,6CAA2B;AAC3B,wDAAsC","sourcesContent":["export * from '../configUtils';\nexport * from '../domain/logic';\nexport * from './headerUtils';\nexport * from './httpEventUtils';\nexport * from './jwtUtils';\nexport * from './mergeRouteUtils';\nexport * from './networkRequestUtils';\nexport * from './openApi';\nexport * from './pathUtils';\nexport * from './preformNetworkRequest';\nexport * from './qpqConfigAccessorsUtils';\nexport * from './urlUtils';\nexport * from './websocketEventUtils';\n"]}
|
|
@@ -11,9 +11,12 @@ const mergeRouteAuthSettings = (routeAuthSettingsA, routeAuthSettingsB) => {
|
|
|
11
11
|
};
|
|
12
12
|
exports.mergeRouteAuthSettings = mergeRouteAuthSettings;
|
|
13
13
|
const mergeRouteOptions = (routeOptionsA, routeOptionsB) => {
|
|
14
|
+
var _a;
|
|
14
15
|
return {
|
|
15
16
|
allowedOrigins: [...new Set([...(routeOptionsB.allowedOrigins || []), ...(routeOptionsA.allowedOrigins || [])])],
|
|
16
17
|
routeAuthSettings: (0, exports.mergeRouteAuthSettings)(routeOptionsA.routeAuthSettings, routeOptionsB.routeAuthSettings),
|
|
18
|
+
// Schemas describe one route, they are never shared defaults, so the more specific side wins outright
|
|
19
|
+
schema: (_a = routeOptionsB.schema) !== null && _a !== void 0 ? _a : routeOptionsA.schema,
|
|
17
20
|
};
|
|
18
21
|
};
|
|
19
22
|
exports.mergeRouteOptions = mergeRouteOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeRouteUtils.js","sourceRoot":"","sources":["../../../src/utils/mergeRouteUtils.ts"],"names":[],"mappings":";;;AAIA,uEAAoE;AAE7D,MAAM,sBAAsB,GAAG,CAAC,kBAAsC,EAAE,kBAAsC,EAAqB,EAAE;IAC1I,OAAO;QACL,iBAAiB,EAAE,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,iBAAiB,MAAI,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,iBAAiB,CAAA;QACjG,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,MAAM,KAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,MAAM,KAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEpG,OAAO,EAAE,CAAC,GAAG,CAAC,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAO,KAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAO,KAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAC9F,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CACxB,GAAG,CAAC,SAAS,CACX,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,WAAW,CAC3I,KAAK,KAAK,CACd;KACF,CAAC;AACJ,CAAC,CAAC;AAZW,QAAA,sBAAsB,0BAYjC;AAEK,MAAM,iBAAiB,GAAG,CAAC,aAA2B,EAAE,aAA2B,EAAgB,EAAE
|
|
1
|
+
{"version":3,"file":"mergeRouteUtils.js","sourceRoot":"","sources":["../../../src/utils/mergeRouteUtils.ts"],"names":[],"mappings":";;;AAIA,uEAAoE;AAE7D,MAAM,sBAAsB,GAAG,CAAC,kBAAsC,EAAE,kBAAsC,EAAqB,EAAE;IAC1I,OAAO;QACL,iBAAiB,EAAE,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,iBAAiB,MAAI,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,iBAAiB,CAAA;QACjG,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,MAAM,KAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,MAAM,KAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEpG,OAAO,EAAE,CAAC,GAAG,CAAC,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAO,KAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,OAAO,KAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAC9F,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CACxB,GAAG,CAAC,SAAS,CACX,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,WAAW,CAC3I,KAAK,KAAK,CACd;KACF,CAAC;AACJ,CAAC,CAAC;AAZW,QAAA,sBAAsB,0BAYjC;AAEK,MAAM,iBAAiB,GAAG,CAAC,aAA2B,EAAE,aAA2B,EAAgB,EAAE;;IAC1G,OAAO;QACL,cAAc,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChH,iBAAiB,EAAE,IAAA,8BAAsB,EAAC,aAAa,CAAC,iBAAiB,EAAE,aAAa,CAAC,iBAAiB,CAAC;QAE3G,sGAAsG;QACtG,MAAM,EAAE,MAAA,aAAa,CAAC,MAAM,mCAAI,aAAa,CAAC,MAAM;KACrD,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,iBAAiB,qBAQ5B;AAEK,MAAM,oBAAoB,GAAG,CAAC,SAAiB,EAAE,WAA2C,EAAE,SAAoB,EAAgB,EAAE;IACzI,sEAAsE;IACtE,YAAY;IACZ,MAAM,cAAc,GAAG,IAAA,iDAAuB,EAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACrF,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC;IAEzC,OAAO,CAAC,GAAG,cAAc,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAA,yBAAiB,EAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAkB,CAAC,CAAC;AACjH,CAAC,CAAC;AAPW,QAAA,oBAAoB,wBAO/B","sourcesContent":["import { QPQConfig } from 'quidproquo-core';\n\nimport { RouteAuthSettings, RouteQPQWebServerConfigSetting } from '../config/settings/route';\nimport { RouteOptions } from '../config/settings/route';\nimport { getDefaultRouteSettings } from './qpqConfigAccessorsUtils';\n\nexport const mergeRouteAuthSettings = (routeAuthSettingsA?: RouteAuthSettings, routeAuthSettingsB?: RouteAuthSettings): RouteAuthSettings => {\n return {\n userDirectoryName: routeAuthSettingsB?.userDirectoryName || routeAuthSettingsA?.userDirectoryName,\n scopes: [...new Set([...(routeAuthSettingsB?.scopes || []), ...(routeAuthSettingsA?.scopes || [])])],\n\n apiKeys: [...(routeAuthSettingsB?.apiKeys || []), ...(routeAuthSettingsA?.apiKeys || [])].filter(\n (apiKeyRef, index, arr) =>\n arr.findIndex(\n (item) => item.name === apiKeyRef.name && item.applicationName === apiKeyRef.applicationName && item.serviceName === apiKeyRef.serviceName,\n ) === index,\n ),\n };\n};\n\nexport const mergeRouteOptions = (routeOptionsA: RouteOptions, routeOptionsB: RouteOptions): RouteOptions => {\n return {\n allowedOrigins: [...new Set([...(routeOptionsB.allowedOrigins || []), ...(routeOptionsA.allowedOrigins || [])])],\n routeAuthSettings: mergeRouteAuthSettings(routeOptionsA.routeAuthSettings, routeOptionsB.routeAuthSettings),\n\n // Schemas describe one route, they are never shared defaults, so the more specific side wins outright\n schema: routeOptionsB.schema ?? routeOptionsA.schema,\n };\n};\n\nexport const mergeAllRouteOptions = (activeApi: string, routeConfig: RouteQPQWebServerConfigSetting, qpqConfig: QPQConfig): RouteOptions => {\n // TODO: This needs to filter active route on the current route Config\n // activeApi\n const defaultOptions = getDefaultRouteSettings(qpqConfig).map((o) => o.routeOptions);\n const routeOptions = routeConfig.options;\n\n return [...defaultOptions, routeOptions].reduce((acc, opt) => mergeRouteOptions(acc, opt), {} as RouteOptions);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenApiDocumentOptions.js","sourceRoot":"","sources":["../../../../src/utils/openApi/OpenApiDocumentOptions.ts"],"names":[],"mappings":"","sourcesContent":["import { OpenApiInfo } from '../../types/OpenApiDocument';\n\n// The parts of the document that are prose rather than derived from the routes.\n// Every field falls back to something sensible taken from the service config.\nexport type OpenApiDocumentOptions = Partial<OpenApiInfo>;\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { QPQConfig } from 'quidproquo-core';
|
|
2
|
+
import { DomainResolver } from '../../domain/types/DomainResolver';
|
|
3
|
+
import { OpenApiDocument } from '../../types/OpenApiDocument';
|
|
4
|
+
import { OpenApiDocumentOptions } from './OpenApiDocumentOptions';
|
|
5
|
+
export declare const buildOpenApiDocument: (qpqConfig: QPQConfig, options?: OpenApiDocumentOptions, resolver?: DomainResolver) => OpenApiDocument;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildOpenApiDocument = void 0;
|
|
4
|
+
const quidproquo_core_1 = require("quidproquo-core");
|
|
5
|
+
const resolveHosts_1 = require("../../domain/logic/host/resolveHosts");
|
|
6
|
+
const mergeRouteUtils_1 = require("../mergeRouteUtils");
|
|
7
|
+
const qpqConfigAccessorsUtils_1 = require("../qpqConfigAccessorsUtils");
|
|
8
|
+
const buildOpenApiOperation_1 = require("./buildOpenApiOperation");
|
|
9
|
+
const buildOpenApiSecurity_1 = require("./buildOpenApiSecurity");
|
|
10
|
+
// Every live api on every root is a server the operations can be called on. Deployed, an
|
|
11
|
+
// api domain is shared by every service in the application and each service is mounted
|
|
12
|
+
// under its module name (the api gateway base path mapping), so the url carries that path.
|
|
13
|
+
// A service with no domain (nothing browser-facing, local only) lists none.
|
|
14
|
+
const buildServers = (qpqConfig, resolver) => {
|
|
15
|
+
const serviceName = quidproquo_core_1.qpqCoreUtils.getApplicationModuleName(qpqConfig);
|
|
16
|
+
return (0, qpqConfigAccessorsUtils_1.getApiConfigs)(qpqConfig)
|
|
17
|
+
.filter((api) => !api.deprecated)
|
|
18
|
+
.flatMap((api) => (0, resolveHosts_1.resolveHosts)(qpqConfig, { subdomain: api.apiSubdomain }, resolver).map((host) => ({ url: `https://${host}/${serviceName}` })));
|
|
19
|
+
};
|
|
20
|
+
// Only schemes some operation actually references make it into components, so a
|
|
21
|
+
// service with no auth publishes no dangling security definitions.
|
|
22
|
+
const buildSecuritySchemes = (paths) => {
|
|
23
|
+
const used = new Set(Object.values(paths)
|
|
24
|
+
.flatMap((pathItem) => Object.values(pathItem))
|
|
25
|
+
.flatMap((operation) => { var _a; return (_a = operation.security) !== null && _a !== void 0 ? _a : []; })
|
|
26
|
+
.flatMap((requirement) => Object.keys(requirement)));
|
|
27
|
+
return Object.fromEntries(Object.entries(buildOpenApiSecurity_1.openApiSecuritySchemes).filter(([name]) => used.has(name)));
|
|
28
|
+
};
|
|
29
|
+
// Walk every route in the config and describe it. Routes are plain data, so this
|
|
30
|
+
// runs anywhere the config does: at deploy time, in a processor, or in a test.
|
|
31
|
+
const buildOpenApiDocument = (qpqConfig, options = {}, resolver) => {
|
|
32
|
+
var _a, _b, _c;
|
|
33
|
+
const paths = {};
|
|
34
|
+
for (const route of (0, qpqConfigAccessorsUtils_1.getAllRoutes)(qpqConfig)) {
|
|
35
|
+
const routeOptions = (0, mergeRouteUtils_1.mergeAllRouteOptions)('', route, qpqConfig);
|
|
36
|
+
if ((_a = routeOptions.schema) === null || _a === void 0 ? void 0 : _a.hidden) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const verb = route.method.toLowerCase();
|
|
40
|
+
paths[route.path] = Object.assign(Object.assign({}, paths[route.path]), { [verb]: (0, buildOpenApiOperation_1.buildOpenApiOperation)(route, routeOptions) });
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
openapi: '3.1.0',
|
|
44
|
+
info: {
|
|
45
|
+
title: (_b = options.title) !== null && _b !== void 0 ? _b : `${quidproquo_core_1.qpqCoreUtils.getApplicationName(qpqConfig)} ${quidproquo_core_1.qpqCoreUtils.getApplicationModuleName(qpqConfig)}`,
|
|
46
|
+
version: (_c = options.version) !== null && _c !== void 0 ? _c : '1.0.0',
|
|
47
|
+
description: options.description,
|
|
48
|
+
},
|
|
49
|
+
servers: buildServers(qpqConfig, resolver),
|
|
50
|
+
paths,
|
|
51
|
+
components: { securitySchemes: buildSecuritySchemes(paths) },
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
exports.buildOpenApiDocument = buildOpenApiDocument;
|
|
55
|
+
//# sourceMappingURL=buildOpenApiDocument.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildOpenApiDocument.js","sourceRoot":"","sources":["../../../../src/utils/openApi/buildOpenApiDocument.ts"],"names":[],"mappings":"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","sourcesContent":["import { QPQConfig, qpqCoreUtils } from 'quidproquo-core';\n\nimport { resolveHosts } from '../../domain/logic/host/resolveHosts';\nimport { DomainResolver } from '../../domain/types/DomainResolver';\nimport { OpenApiDocument, OpenApiPathItem, OpenApiSecurityScheme } from '../../types/OpenApiDocument';\nimport { mergeAllRouteOptions } from '../mergeRouteUtils';\nimport { getAllRoutes, getApiConfigs } from '../qpqConfigAccessorsUtils';\nimport { buildOpenApiOperation } from './buildOpenApiOperation';\nimport { openApiSecuritySchemes } from './buildOpenApiSecurity';\nimport { OpenApiDocumentOptions } from './OpenApiDocumentOptions';\n\ntype HttpVerb = keyof OpenApiPathItem;\n\n// Every live api on every root is a server the operations can be called on. Deployed, an\n// api domain is shared by every service in the application and each service is mounted\n// under its module name (the api gateway base path mapping), so the url carries that path.\n// A service with no domain (nothing browser-facing, local only) lists none.\nconst buildServers = (qpqConfig: QPQConfig, resolver?: DomainResolver): { url: string }[] => {\n const serviceName = qpqCoreUtils.getApplicationModuleName(qpqConfig);\n\n return getApiConfigs(qpqConfig)\n .filter((api) => !api.deprecated)\n .flatMap((api) => resolveHosts(qpqConfig, { subdomain: api.apiSubdomain }, resolver).map((host) => ({ url: `https://${host}/${serviceName}` })));\n};\n\n// Only schemes some operation actually references make it into components, so a\n// service with no auth publishes no dangling security definitions.\nconst buildSecuritySchemes = (paths: Record<string, OpenApiPathItem>): Record<string, OpenApiSecurityScheme> => {\n const used = new Set(\n Object.values(paths)\n .flatMap((pathItem) => Object.values(pathItem))\n .flatMap((operation) => operation.security ?? [])\n .flatMap((requirement) => Object.keys(requirement)),\n );\n\n return Object.fromEntries(Object.entries(openApiSecuritySchemes).filter(([name]) => used.has(name)));\n};\n\n// Walk every route in the config and describe it. Routes are plain data, so this\n// runs anywhere the config does: at deploy time, in a processor, or in a test.\nexport const buildOpenApiDocument = (qpqConfig: QPQConfig, options: OpenApiDocumentOptions = {}, resolver?: DomainResolver): OpenApiDocument => {\n const paths: Record<string, OpenApiPathItem> = {};\n\n for (const route of getAllRoutes(qpqConfig)) {\n const routeOptions = mergeAllRouteOptions('', route, qpqConfig);\n if (routeOptions.schema?.hidden) {\n continue;\n }\n\n const verb = route.method.toLowerCase() as HttpVerb;\n paths[route.path] = { ...paths[route.path], [verb]: buildOpenApiOperation(route, routeOptions) };\n }\n\n return {\n openapi: '3.1.0',\n info: {\n title: options.title ?? `${qpqCoreUtils.getApplicationName(qpqConfig)} ${qpqCoreUtils.getApplicationModuleName(qpqConfig)}`,\n version: options.version ?? '1.0.0',\n description: options.description,\n },\n servers: buildServers(qpqConfig, resolver),\n paths,\n components: { securitySchemes: buildSecuritySchemes(paths) },\n };\n};\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { RouteOptions } from '../../config/settings/route';
|
|
2
|
+
import { RouteQPQWebServerConfigSetting } from '../../config/settings/route';
|
|
3
|
+
import { OpenApiOperation } from '../../types/OpenApiDocument';
|
|
4
|
+
export declare const buildOpenApiOperation: (route: RouteQPQWebServerConfigSetting, options: RouteOptions) => OpenApiOperation;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildOpenApiOperation = void 0;
|
|
4
|
+
const buildOpenApiPathParameters_1 = require("./buildOpenApiPathParameters");
|
|
5
|
+
const buildOpenApiQueryParameters_1 = require("./buildOpenApiQueryParameters");
|
|
6
|
+
const buildOpenApiSecurity_1 = require("./buildOpenApiSecurity");
|
|
7
|
+
// `get_v1_widgets_id` style: stable across deploys and unique per method+path,
|
|
8
|
+
// which is all client generators need from it.
|
|
9
|
+
const toOperationId = (method, path) => [method.toLowerCase(), ...path.replace(/[{}]/g, '').split('/').filter(Boolean)].join('_');
|
|
10
|
+
const buildResponses = (options) => {
|
|
11
|
+
var _a;
|
|
12
|
+
const { schema, routeAuthSettings } = options;
|
|
13
|
+
const responses = {
|
|
14
|
+
'200': (schema === null || schema === void 0 ? void 0 : schema.responseJsonSchema)
|
|
15
|
+
? { description: 'Success', content: { 'application/json': { schema: schema.responseJsonSchema } } }
|
|
16
|
+
: { description: 'Success' },
|
|
17
|
+
};
|
|
18
|
+
if ((routeAuthSettings === null || routeAuthSettings === void 0 ? void 0 : routeAuthSettings.userDirectoryName) || ((_a = routeAuthSettings === null || routeAuthSettings === void 0 ? void 0 : routeAuthSettings.apiKeys) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
19
|
+
responses['401'] = { description: 'Missing or invalid credentials' };
|
|
20
|
+
}
|
|
21
|
+
// Only routes that validate input can reject it; a plain route has no 422 path
|
|
22
|
+
if ((schema === null || schema === void 0 ? void 0 : schema.bodyJsonSchema) || (schema === null || schema === void 0 ? void 0 : schema.queryJsonSchema)) {
|
|
23
|
+
responses['422'] = { description: 'Request failed validation' };
|
|
24
|
+
}
|
|
25
|
+
return responses;
|
|
26
|
+
};
|
|
27
|
+
// One route becomes one operation. `options` is the route's options after the
|
|
28
|
+
// service defaults have been merged in, so auth requirements are the real ones.
|
|
29
|
+
const buildOpenApiOperation = (route, options) => {
|
|
30
|
+
const { schema } = options;
|
|
31
|
+
const parameters = [...(0, buildOpenApiPathParameters_1.buildOpenApiPathParameters)(route.path), ...(0, buildOpenApiQueryParameters_1.buildOpenApiQueryParameters)(schema === null || schema === void 0 ? void 0 : schema.queryJsonSchema)];
|
|
32
|
+
const security = (0, buildOpenApiSecurity_1.buildOpenApiSecurity)(options.routeAuthSettings);
|
|
33
|
+
return {
|
|
34
|
+
operationId: toOperationId(route.method, route.path),
|
|
35
|
+
summary: schema === null || schema === void 0 ? void 0 : schema.summary,
|
|
36
|
+
description: schema === null || schema === void 0 ? void 0 : schema.description,
|
|
37
|
+
tags: schema === null || schema === void 0 ? void 0 : schema.tags,
|
|
38
|
+
parameters: parameters.length ? parameters : undefined,
|
|
39
|
+
requestBody: (schema === null || schema === void 0 ? void 0 : schema.bodyJsonSchema) ? { required: true, content: { 'application/json': { schema: schema.bodyJsonSchema } } } : undefined,
|
|
40
|
+
responses: buildResponses(options),
|
|
41
|
+
security: security.length ? security : undefined,
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
exports.buildOpenApiOperation = buildOpenApiOperation;
|
|
45
|
+
//# sourceMappingURL=buildOpenApiOperation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildOpenApiOperation.js","sourceRoot":"","sources":["../../../../src/utils/openApi/buildOpenApiOperation.ts"],"names":[],"mappings":"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","sourcesContent":["import { RouteOptions } from '../../config/settings/route';\nimport { RouteQPQWebServerConfigSetting } from '../../config/settings/route';\nimport { OpenApiOperation, OpenApiResponse } from '../../types/OpenApiDocument';\nimport { buildOpenApiPathParameters } from './buildOpenApiPathParameters';\nimport { buildOpenApiQueryParameters } from './buildOpenApiQueryParameters';\nimport { buildOpenApiSecurity } from './buildOpenApiSecurity';\n\n// `get_v1_widgets_id` style: stable across deploys and unique per method+path,\n// which is all client generators need from it.\nconst toOperationId = (method: string, path: string): string =>\n [method.toLowerCase(), ...path.replace(/[{}]/g, '').split('/').filter(Boolean)].join('_');\n\nconst buildResponses = (options: RouteOptions): Record<string, OpenApiResponse> => {\n const { schema, routeAuthSettings } = options;\n\n const responses: Record<string, OpenApiResponse> = {\n '200': schema?.responseJsonSchema\n ? { description: 'Success', content: { 'application/json': { schema: schema.responseJsonSchema } } }\n : { description: 'Success' },\n };\n\n if (routeAuthSettings?.userDirectoryName || routeAuthSettings?.apiKeys?.length) {\n responses['401'] = { description: 'Missing or invalid credentials' };\n }\n\n // Only routes that validate input can reject it; a plain route has no 422 path\n if (schema?.bodyJsonSchema || schema?.queryJsonSchema) {\n responses['422'] = { description: 'Request failed validation' };\n }\n\n return responses;\n};\n\n// One route becomes one operation. `options` is the route's options after the\n// service defaults have been merged in, so auth requirements are the real ones.\nexport const buildOpenApiOperation = (route: RouteQPQWebServerConfigSetting, options: RouteOptions): OpenApiOperation => {\n const { schema } = options;\n const parameters = [...buildOpenApiPathParameters(route.path), ...buildOpenApiQueryParameters(schema?.queryJsonSchema)];\n const security = buildOpenApiSecurity(options.routeAuthSettings);\n\n return {\n operationId: toOperationId(route.method, route.path),\n summary: schema?.summary,\n description: schema?.description,\n tags: schema?.tags,\n parameters: parameters.length ? parameters : undefined,\n requestBody: schema?.bodyJsonSchema ? { required: true, content: { 'application/json': { schema: schema.bodyJsonSchema } } } : undefined,\n responses: buildResponses(options),\n security: security.length ? security : undefined,\n };\n};\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildOpenApiPathParameters = void 0;
|
|
4
|
+
// Route paths already use OpenAPI's `{param}` template syntax, so the path itself
|
|
5
|
+
// is the source of truth for path parameters. They are always strings on the wire.
|
|
6
|
+
const buildOpenApiPathParameters = (path) => [...path.matchAll(/\{([^}]+)\}/g)].map(([, name]) => ({
|
|
7
|
+
name,
|
|
8
|
+
in: 'path',
|
|
9
|
+
required: true,
|
|
10
|
+
schema: { type: 'string' },
|
|
11
|
+
}));
|
|
12
|
+
exports.buildOpenApiPathParameters = buildOpenApiPathParameters;
|
|
13
|
+
//# sourceMappingURL=buildOpenApiPathParameters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildOpenApiPathParameters.js","sourceRoot":"","sources":["../../../../src/utils/openApi/buildOpenApiPathParameters.ts"],"names":[],"mappings":";;;AAEA,kFAAkF;AAClF,mFAAmF;AAC5E,MAAM,0BAA0B,GAAG,CAAC,IAAY,EAAsB,EAAE,CAC7E,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI;IACJ,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;CAC3B,CAAC,CAAC,CAAC;AANO,QAAA,0BAA0B,8BAMjC","sourcesContent":["import { OpenApiParameter } from '../../types/OpenApiDocument';\n\n// Route paths already use OpenAPI's `{param}` template syntax, so the path itself\n// is the source of truth for path parameters. They are always strings on the wire.\nexport const buildOpenApiPathParameters = (path: string): OpenApiParameter[] =>\n [...path.matchAll(/\\{([^}]+)\\}/g)].map(([, name]) => ({\n name,\n in: 'path',\n required: true,\n schema: { type: 'string' },\n }));\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildOpenApiQueryParameters = void 0;
|
|
4
|
+
const isJsonSchema = (value) => typeof value === 'object' && value !== null;
|
|
5
|
+
// A query schema is declared as one object schema, but OpenAPI wants one parameter
|
|
6
|
+
// per key. Only the top-level properties can be unpacked; a query schema that is
|
|
7
|
+
// not an object (or has none) contributes nothing rather than something wrong.
|
|
8
|
+
const buildOpenApiQueryParameters = (querySchema) => {
|
|
9
|
+
const properties = querySchema === null || querySchema === void 0 ? void 0 : querySchema.properties;
|
|
10
|
+
if (!isJsonSchema(properties)) {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
const required = Array.isArray(querySchema === null || querySchema === void 0 ? void 0 : querySchema.required) ? querySchema.required : [];
|
|
14
|
+
return Object.entries(properties)
|
|
15
|
+
.filter((entry) => isJsonSchema(entry[1]))
|
|
16
|
+
.map(([name, schema]) => ({
|
|
17
|
+
name,
|
|
18
|
+
in: 'query',
|
|
19
|
+
required: required.includes(name),
|
|
20
|
+
schema,
|
|
21
|
+
description: typeof schema.description === 'string' ? schema.description : undefined,
|
|
22
|
+
}));
|
|
23
|
+
};
|
|
24
|
+
exports.buildOpenApiQueryParameters = buildOpenApiQueryParameters;
|
|
25
|
+
//# sourceMappingURL=buildOpenApiQueryParameters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildOpenApiQueryParameters.js","sourceRoot":"","sources":["../../../../src/utils/openApi/buildOpenApiQueryParameters.ts"],"names":[],"mappings":";;;AAGA,MAAM,YAAY,GAAG,CAAC,KAAc,EAAuB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAE1G,mFAAmF;AACnF,iFAAiF;AACjF,+EAA+E;AACxE,MAAM,2BAA2B,GAAG,CAAC,WAAwB,EAAsB,EAAE;IAC1F,MAAM,UAAU,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,UAAU,CAAC;IAC3C,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,CAAC,CAAC,CAAC,CAAE,WAAW,CAAC,QAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhG,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;SAC9B,MAAM,CAAC,CAAC,KAAK,EAAiC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACxE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACxB,IAAI;QACJ,EAAE,EAAE,OAAO;QACX,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjC,MAAM;QACN,WAAW,EAAE,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KACrF,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AAjBW,QAAA,2BAA2B,+BAiBtC","sourcesContent":["import { JsonSchema } from '../../config/types/JsonSchema';\nimport { OpenApiParameter } from '../../types/OpenApiDocument';\n\nconst isJsonSchema = (value: unknown): value is JsonSchema => typeof value === 'object' && value !== null;\n\n// A query schema is declared as one object schema, but OpenAPI wants one parameter\n// per key. Only the top-level properties can be unpacked; a query schema that is\n// not an object (or has none) contributes nothing rather than something wrong.\nexport const buildOpenApiQueryParameters = (querySchema?: JsonSchema): OpenApiParameter[] => {\n const properties = querySchema?.properties;\n if (!isJsonSchema(properties)) {\n return [];\n }\n\n const required = Array.isArray(querySchema?.required) ? (querySchema.required as string[]) : [];\n\n return Object.entries(properties)\n .filter((entry): entry is [string, JsonSchema] => isJsonSchema(entry[1]))\n .map(([name, schema]) => ({\n name,\n in: 'query',\n required: required.includes(name),\n schema,\n description: typeof schema.description === 'string' ? schema.description : undefined,\n }));\n};\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { RouteAuthSettings } from '../../config/settings/route';
|
|
2
|
+
import { OpenApiSecurityRequirement, OpenApiSecurityScheme } from '../../types/OpenApiDocument';
|
|
3
|
+
export declare const buildOpenApiSecurity: (routeAuthSettings?: RouteAuthSettings) => OpenApiSecurityRequirement[];
|
|
4
|
+
export declare const openApiSecuritySchemes: Record<string, OpenApiSecurityScheme>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openApiSecuritySchemes = exports.buildOpenApiSecurity = void 0;
|
|
4
|
+
const openApiSecuritySchemeNames_1 = require("./openApiSecuritySchemeNames");
|
|
5
|
+
// Mirrors what askValidateRouteAuth actually checks: a user directory means a JWT in
|
|
6
|
+
// the Authorization header, api keys mean the x-api-key header. Either satisfies the
|
|
7
|
+
// route, so they are listed as alternatives rather than both required.
|
|
8
|
+
const buildOpenApiSecurity = (routeAuthSettings) => {
|
|
9
|
+
var _a, _b;
|
|
10
|
+
const requirements = [];
|
|
11
|
+
if (routeAuthSettings === null || routeAuthSettings === void 0 ? void 0 : routeAuthSettings.userDirectoryName) {
|
|
12
|
+
requirements.push({ [openApiSecuritySchemeNames_1.OPEN_API_BEARER_AUTH]: (_a = routeAuthSettings.scopes) !== null && _a !== void 0 ? _a : [] });
|
|
13
|
+
}
|
|
14
|
+
if ((_b = routeAuthSettings === null || routeAuthSettings === void 0 ? void 0 : routeAuthSettings.apiKeys) === null || _b === void 0 ? void 0 : _b.length) {
|
|
15
|
+
requirements.push({ [openApiSecuritySchemeNames_1.OPEN_API_API_KEY_AUTH]: [] });
|
|
16
|
+
}
|
|
17
|
+
return requirements;
|
|
18
|
+
};
|
|
19
|
+
exports.buildOpenApiSecurity = buildOpenApiSecurity;
|
|
20
|
+
exports.openApiSecuritySchemes = {
|
|
21
|
+
[openApiSecuritySchemeNames_1.OPEN_API_BEARER_AUTH]: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
|
|
22
|
+
[openApiSecuritySchemeNames_1.OPEN_API_API_KEY_AUTH]: { type: 'apiKey', in: 'header', name: 'x-api-key' },
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=buildOpenApiSecurity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildOpenApiSecurity.js","sourceRoot":"","sources":["../../../../src/utils/openApi/buildOpenApiSecurity.ts"],"names":[],"mappings":";;;AAEA,6EAA2F;AAE3F,qFAAqF;AACrF,qFAAqF;AACrF,uEAAuE;AAChE,MAAM,oBAAoB,GAAG,CAAC,iBAAqC,EAAgC,EAAE;;IAC1G,MAAM,YAAY,GAAiC,EAAE,CAAC;IAEtD,IAAI,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,iBAAiB,EAAE,CAAC;QACzC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,iDAAoB,CAAC,EAAE,MAAA,iBAAiB,CAAC,MAAM,mCAAI,EAAE,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,MAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,OAAO,0CAAE,MAAM,EAAE,CAAC;QACvC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,kDAAqB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAZW,QAAA,oBAAoB,wBAY/B;AAEW,QAAA,sBAAsB,GAA0C;IAC3E,CAAC,iDAAoB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE;IAC/E,CAAC,kDAAqB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;CAC7E,CAAC","sourcesContent":["import { RouteAuthSettings } from '../../config/settings/route';\nimport { OpenApiSecurityRequirement, OpenApiSecurityScheme } from '../../types/OpenApiDocument';\nimport { OPEN_API_API_KEY_AUTH, OPEN_API_BEARER_AUTH } from './openApiSecuritySchemeNames';\n\n// Mirrors what askValidateRouteAuth actually checks: a user directory means a JWT in\n// the Authorization header, api keys mean the x-api-key header. Either satisfies the\n// route, so they are listed as alternatives rather than both required.\nexport const buildOpenApiSecurity = (routeAuthSettings?: RouteAuthSettings): OpenApiSecurityRequirement[] => {\n const requirements: OpenApiSecurityRequirement[] = [];\n\n if (routeAuthSettings?.userDirectoryName) {\n requirements.push({ [OPEN_API_BEARER_AUTH]: routeAuthSettings.scopes ?? [] });\n }\n\n if (routeAuthSettings?.apiKeys?.length) {\n requirements.push({ [OPEN_API_API_KEY_AUTH]: [] });\n }\n\n return requirements;\n};\n\nexport const openApiSecuritySchemes: Record<string, OpenApiSecurityScheme> = {\n [OPEN_API_BEARER_AUTH]: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },\n [OPEN_API_API_KEY_AUTH]: { type: 'apiKey', in: 'header', name: 'x-api-key' },\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './buildOpenApiDocument';
|
|
2
|
+
export * from './buildOpenApiOperation';
|
|
3
|
+
export * from './buildOpenApiPathParameters';
|
|
4
|
+
export * from './buildOpenApiQueryParameters';
|
|
5
|
+
export * from './buildOpenApiSecurity';
|
|
6
|
+
export * from './OpenApiDocumentOptions';
|
|
7
|
+
export * from './openApiSecuritySchemeNames';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./buildOpenApiDocument"), exports);
|
|
18
|
+
__exportStar(require("./buildOpenApiOperation"), exports);
|
|
19
|
+
__exportStar(require("./buildOpenApiPathParameters"), exports);
|
|
20
|
+
__exportStar(require("./buildOpenApiQueryParameters"), exports);
|
|
21
|
+
__exportStar(require("./buildOpenApiSecurity"), exports);
|
|
22
|
+
__exportStar(require("./OpenApiDocumentOptions"), exports);
|
|
23
|
+
__exportStar(require("./openApiSecuritySchemeNames"), exports);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/openApi/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,0DAAwC;AACxC,+DAA6C;AAC7C,gEAA8C;AAC9C,yDAAuC;AACvC,2DAAyC;AACzC,+DAA6C","sourcesContent":["export * from './buildOpenApiDocument';\nexport * from './buildOpenApiOperation';\nexport * from './buildOpenApiPathParameters';\nexport * from './buildOpenApiQueryParameters';\nexport * from './buildOpenApiSecurity';\nexport * from './OpenApiDocumentOptions';\nexport * from './openApiSecuritySchemeNames';\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OPEN_API_API_KEY_AUTH = exports.OPEN_API_BEARER_AUTH = void 0;
|
|
4
|
+
// Keys under components.securitySchemes; operations reference them by name.
|
|
5
|
+
exports.OPEN_API_BEARER_AUTH = 'bearerAuth';
|
|
6
|
+
exports.OPEN_API_API_KEY_AUTH = 'apiKeyAuth';
|
|
7
|
+
//# sourceMappingURL=openApiSecuritySchemeNames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openApiSecuritySchemeNames.js","sourceRoot":"","sources":["../../../../src/utils/openApi/openApiSecuritySchemeNames.ts"],"names":[],"mappings":";;;AAAA,4EAA4E;AAC/D,QAAA,oBAAoB,GAAG,YAAY,CAAC;AACpC,QAAA,qBAAqB,GAAG,YAAY,CAAC","sourcesContent":["// Keys under components.securitySchemes; operations reference them by name.\nexport const OPEN_API_BEARER_AUTH = 'bearerAuth';\nexport const OPEN_API_API_KEY_AUTH = 'apiKeyAuth';\n"]}
|