zibri 2.4.1 → 2.5.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/dist/cjs/application-options.model.d.ts +2 -2
- package/dist/cjs/application-options.model.d.ts.map +1 -1
- package/dist/cjs/application.d.ts.map +1 -1
- package/dist/cjs/application.js +0 -1
- package/dist/cjs/application.js.map +1 -1
- package/dist/cjs/assets/asset.service.d.ts.map +1 -1
- package/dist/cjs/assets/asset.service.js +3 -1
- package/dist/cjs/assets/asset.service.js.map +1 -1
- package/dist/cjs/auth/2fa/methods/otp/otp-credentials.model.d.ts +1 -1
- package/dist/cjs/auth/2fa/methods/otp/otp-credentials.model.d.ts.map +1 -1
- package/dist/cjs/auth/2fa/methods/otp/otp-credentials.model.js.map +1 -1
- package/dist/cjs/auth/2fa/methods/otp/otp.two-factor-method.js +1 -1
- package/dist/cjs/auth/2fa/methods/otp/otp.two-factor-method.js.map +1 -1
- package/dist/cjs/auth/strategies/cookie/cookie-auth.controller.js +1 -1
- package/dist/cjs/auth/strategies/cookie/cookie-auth.controller.js.map +1 -1
- package/dist/cjs/auth/strategies/jwt/jwt-auth.controller.js +1 -1
- package/dist/cjs/auth/strategies/jwt/jwt-auth.controller.js.map +1 -1
- package/dist/cjs/auth/strategies/jwt/jwt.auth-strategy.js +1 -1
- package/dist/cjs/auth/strategies/jwt/jwt.auth-strategy.js.map +1 -1
- package/dist/cjs/backup/backup-resource-entity.model.d.ts +1 -1
- package/dist/cjs/backup/backup-resource-entity.model.d.ts.map +1 -1
- package/dist/cjs/backup/backup-resource-entity.model.js.map +1 -1
- package/dist/cjs/change-sets/models/change-set.model.d.ts +1 -1
- package/dist/cjs/change-sets/models/change-set.model.d.ts.map +1 -1
- package/dist/cjs/change-sets/models/change-set.model.js +1 -1
- package/dist/cjs/change-sets/models/change-set.model.js.map +1 -1
- package/dist/cjs/change-sets/models/change.model.d.ts +2 -2
- package/dist/cjs/change-sets/models/change.model.d.ts.map +1 -1
- package/dist/cjs/change-sets/models/change.model.js.map +1 -1
- package/dist/cjs/context/cache/cache.context.d.ts +2 -2
- package/dist/cjs/context/cache/cache.context.d.ts.map +1 -1
- package/dist/cjs/context/cache/cache.context.js +2 -2
- package/dist/cjs/context/cache/cache.context.js.map +1 -1
- package/dist/cjs/context/request/request-context-token.model.js +1 -1
- package/dist/cjs/context/request/request-context-token.model.js.map +1 -1
- package/dist/cjs/cron/cron-job-entity.model.d.ts +2 -2
- package/dist/cjs/cron/cron-job-entity.model.d.ts.map +1 -1
- package/dist/cjs/cron/cron-job-entity.model.js.map +1 -1
- package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.d.ts +1 -0
- package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.d.ts.map +1 -1
- package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.js +9 -0
- package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.js.map +1 -1
- package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.d.ts.map +1 -1
- package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.js +3 -3
- package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.js.map +1 -1
- package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.d.ts +2 -1
- package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.d.ts.map +1 -1
- package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js +20 -0
- package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js.map +1 -1
- package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.d.ts +4 -0
- package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.d.ts.map +1 -1
- package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.js +3 -1
- package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.js.map +1 -1
- package/dist/cjs/data-source/migration/migration-entity.model.d.ts +2 -2
- package/dist/cjs/data-source/migration/migration-entity.model.d.ts.map +1 -1
- package/dist/cjs/data-source/migration/migration-entity.model.js.map +1 -1
- package/dist/cjs/data-source/migration/migration.model.d.ts +2 -2
- package/dist/cjs/data-source/migration/migration.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/date-where-filter.model.d.ts +10 -2
- package/dist/cjs/data-source/models/where/date-where-filter.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/string-where-filter.model.d.ts +17 -0
- package/dist/cjs/data-source/models/where/string-where-filter.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/where-filter-keys.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/where-filter-keys.model.js +3 -0
- package/dist/cjs/data-source/models/where/where-filter-keys.model.js.map +1 -1
- package/dist/cjs/di/default/zibri-di-providers.default.d.ts.map +1 -1
- package/dist/cjs/di/default/zibri-di-providers.default.js +4 -0
- package/dist/cjs/di/default/zibri-di-providers.default.js.map +1 -1
- package/dist/cjs/di/default/zibri-di-tokens.default.d.ts +3 -0
- package/dist/cjs/di/default/zibri-di-tokens.default.d.ts.map +1 -1
- package/dist/cjs/di/default/zibri-di-tokens.default.js +2 -0
- package/dist/cjs/di/default/zibri-di-tokens.default.js.map +1 -1
- package/dist/cjs/email/email.service.d.ts +1 -1
- package/dist/cjs/email/email.service.d.ts.map +1 -1
- package/dist/cjs/email/email.service.js +4 -4
- package/dist/cjs/email/email.service.js.map +1 -1
- package/dist/cjs/email/models/email.model.d.ts +4 -4
- package/dist/cjs/email/models/email.model.d.ts.map +1 -1
- package/dist/cjs/email/models/email.model.js +4 -4
- package/dist/cjs/email/models/email.model.js.map +1 -1
- package/dist/cjs/entity/generation/generate-entity-file.function.js +1 -1
- package/dist/cjs/entity/generation/generate-entity-file.function.js.map +1 -1
- package/dist/cjs/event/event-subscriber-run.model.d.ts +1 -1
- package/dist/cjs/event/event-subscriber-run.model.d.ts.map +1 -1
- package/dist/cjs/event/event-subscriber-run.model.js +1 -1
- package/dist/cjs/event/event-subscriber-run.model.js.map +1 -1
- package/dist/cjs/global/global-registry.d.ts +2 -2
- package/dist/cjs/global/global-registry.d.ts.map +1 -1
- package/dist/cjs/http/http-request.model.d.ts +2 -2
- package/dist/cjs/http/http-request.model.d.ts.map +1 -1
- package/dist/cjs/http/known-header.enum.d.ts +1 -0
- package/dist/cjs/http/known-header.enum.d.ts.map +1 -1
- package/dist/cjs/http/known-header.enum.js +1 -0
- package/dist/cjs/http/known-header.enum.js.map +1 -1
- package/dist/cjs/http-client/http-client.d.ts.map +1 -1
- package/dist/cjs/http-client/http-client.js.map +1 -1
- package/dist/cjs/index.d.ts +7 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/localization/formatting/format-price.function.d.ts.map +1 -1
- package/dist/cjs/localization/formatting/format-price.function.js.map +1 -1
- package/dist/cjs/logging/log-context.model.d.ts +6 -6
- package/dist/cjs/logging/log-context.model.d.ts.map +1 -1
- package/dist/cjs/logging/log-context.model.js +6 -6
- package/dist/cjs/logging/log-context.model.js.map +1 -1
- package/dist/cjs/logging/logger.js +1 -1
- package/dist/cjs/logging/logger.js.map +1 -1
- package/dist/cjs/multithreading/models/thread-job-entity.model.d.ts +5 -5
- package/dist/cjs/multithreading/models/thread-job-entity.model.d.ts.map +1 -1
- package/dist/cjs/multithreading/models/thread-job-entity.model.js +4 -4
- package/dist/cjs/multithreading/models/thread-job-entity.model.js.map +1 -1
- package/dist/cjs/multithreading/services/thread-job.d.ts +4 -4
- package/dist/cjs/multithreading/services/thread-job.d.ts.map +1 -1
- package/dist/cjs/multithreading/services/thread-job.js.map +1 -1
- package/dist/cjs/open-api/open-api-service.interface.d.ts +2 -1
- package/dist/cjs/open-api/open-api-service.interface.d.ts.map +1 -1
- package/dist/cjs/open-api/open-api.service.d.ts +5 -2
- package/dist/cjs/open-api/open-api.service.d.ts.map +1 -1
- package/dist/cjs/open-api/open-api.service.js +256 -139
- package/dist/cjs/open-api/open-api.service.js.map +1 -1
- package/dist/cjs/parsing/html/csp-options.model.d.ts +1 -1
- package/dist/cjs/parsing/html/csp-options.model.d.ts.map +1 -1
- package/dist/cjs/parsing/html/csp-options.model.js.map +1 -1
- package/dist/cjs/parsing/parser.js +3 -3
- package/dist/cjs/parsing/parser.js.map +1 -1
- package/dist/cjs/plugin/invoicing/models/invoice-address.model.d.ts +2 -2
- package/dist/cjs/plugin/invoicing/models/invoice-address.model.d.ts.map +1 -1
- package/dist/cjs/plugin/invoicing/models/invoice-address.model.js +2 -2
- package/dist/cjs/plugin/invoicing/models/invoice-address.model.js.map +1 -1
- package/dist/cjs/plugin/invoicing/models/vat.model.d.ts +1 -1
- package/dist/cjs/plugin/invoicing/models/vat.model.d.ts.map +1 -1
- package/dist/cjs/plugin/invoicing/models/vat.model.js +1 -1
- package/dist/cjs/plugin/invoicing/models/vat.model.js.map +1 -1
- package/dist/cjs/plugin/mailing-list/mailing-list.controller.js +1 -1
- package/dist/cjs/plugin/mailing-list/mailing-list.controller.js.map +1 -1
- package/dist/cjs/plugin/mailing-list/models/mailing-list-subscriber.model.d.ts +1 -1
- package/dist/cjs/plugin/mailing-list/models/mailing-list-subscriber.model.d.ts.map +1 -1
- package/dist/cjs/plugin/mailing-list/models/mailing-list-subscriber.model.js +1 -1
- package/dist/cjs/plugin/mailing-list/models/mailing-list-subscriber.model.js.map +1 -1
- package/dist/cjs/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.d.ts +1 -1
- package/dist/cjs/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.d.ts.map +1 -1
- package/dist/cjs/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.js +1 -1
- package/dist/cjs/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.js.map +1 -1
- package/dist/cjs/plugin/payment/models/payment.model.d.ts +2 -2
- package/dist/cjs/plugin/payment/models/payment.model.d.ts.map +1 -1
- package/dist/cjs/plugin/payment/models/payment.model.js +1 -1
- package/dist/cjs/plugin/payment/models/payment.model.js.map +1 -1
- package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal-client.d.ts +17 -17
- package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal-client.d.ts.map +1 -1
- package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal-client.js +17 -17
- package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal-client.js.map +1 -1
- package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal.payment-provider.js +1 -1
- package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal.payment-provider.js.map +1 -1
- package/dist/cjs/preact/preact.utilities.js +1 -1
- package/dist/cjs/preact/preact.utilities.js.map +1 -1
- package/dist/cjs/preact/validate-email-templates.function.js +1 -1
- package/dist/cjs/preact/validate-email-templates.function.js.map +1 -1
- package/dist/cjs/rate-limiting/rate-limiter.d.ts +10 -5
- package/dist/cjs/rate-limiting/rate-limiter.d.ts.map +1 -1
- package/dist/cjs/rate-limiting/rate-limiter.js +22 -12
- package/dist/cjs/rate-limiting/rate-limiter.js.map +1 -1
- package/dist/cjs/routing/controller-route-configuration.model.d.ts +5 -0
- package/dist/cjs/routing/controller-route-configuration.model.d.ts.map +1 -1
- package/dist/cjs/routing/decorators/controller.decorator.d.ts +5 -0
- package/dist/cjs/routing/decorators/controller.decorator.d.ts.map +1 -1
- package/dist/cjs/routing/decorators/controller.decorator.js +3 -2
- package/dist/cjs/routing/decorators/controller.decorator.js.map +1 -1
- package/dist/cjs/routing/decorators/create-http-decorator.function.d.ts +2 -1
- package/dist/cjs/routing/decorators/create-http-decorator.function.d.ts.map +1 -1
- package/dist/cjs/routing/decorators/create-http-decorator.function.js +2 -2
- package/dist/cjs/routing/decorators/create-http-decorator.function.js.map +1 -1
- package/dist/cjs/routing/decorators/delete.decorator.d.ts +3 -1
- package/dist/cjs/routing/decorators/delete.decorator.d.ts.map +1 -1
- package/dist/cjs/routing/decorators/delete.decorator.js +3 -2
- package/dist/cjs/routing/decorators/delete.decorator.js.map +1 -1
- package/dist/cjs/routing/decorators/get.decorator.d.ts +3 -1
- package/dist/cjs/routing/decorators/get.decorator.d.ts.map +1 -1
- package/dist/cjs/routing/decorators/get.decorator.js +3 -2
- package/dist/cjs/routing/decorators/get.decorator.js.map +1 -1
- package/dist/cjs/routing/decorators/http-decorator-option-input.model.d.ts +11 -0
- package/dist/cjs/routing/decorators/http-decorator-option-input.model.d.ts.map +1 -0
- package/dist/cjs/routing/decorators/http-decorator-option-input.model.js +3 -0
- package/dist/cjs/routing/decorators/http-decorator-option-input.model.js.map +1 -0
- package/dist/cjs/routing/decorators/patch.decorator.d.ts +3 -1
- package/dist/cjs/routing/decorators/patch.decorator.d.ts.map +1 -1
- package/dist/cjs/routing/decorators/patch.decorator.js +3 -2
- package/dist/cjs/routing/decorators/patch.decorator.js.map +1 -1
- package/dist/cjs/routing/decorators/post.decorator.d.ts +3 -1
- package/dist/cjs/routing/decorators/post.decorator.d.ts.map +1 -1
- package/dist/cjs/routing/decorators/post.decorator.js +3 -2
- package/dist/cjs/routing/decorators/post.decorator.js.map +1 -1
- package/dist/cjs/routing/resolve-route-params.function.js +1 -0
- package/dist/cjs/routing/resolve-route-params.function.js.map +1 -1
- package/dist/cjs/routing/route-configuration.model.d.ts +11 -1
- package/dist/cjs/routing/route-configuration.model.d.ts.map +1 -1
- package/dist/cjs/routing/router.d.ts +6 -2
- package/dist/cjs/routing/router.d.ts.map +1 -1
- package/dist/cjs/routing/router.js +173 -88
- package/dist/cjs/routing/router.js.map +1 -1
- package/dist/cjs/utilities/fs.utilities.d.ts +1 -1
- package/dist/cjs/utilities/fs.utilities.js +1 -1
- package/dist/cjs/utilities/sem-ver.utilities.d.ts +46 -0
- package/dist/cjs/utilities/sem-ver.utilities.d.ts.map +1 -0
- package/dist/cjs/utilities/sem-ver.utilities.js +204 -0
- package/dist/cjs/utilities/sem-ver.utilities.js.map +1 -0
- package/dist/cjs/utilities/uuid.utilities.js +2 -2
- package/dist/cjs/utilities/uuid.utilities.js.map +1 -1
- package/dist/cjs/versioning/route-with-version-data.model.d.ts +15 -0
- package/dist/cjs/versioning/route-with-version-data.model.d.ts.map +1 -0
- package/dist/cjs/versioning/route-with-version-data.model.js +3 -0
- package/dist/cjs/versioning/route-with-version-data.model.js.map +1 -0
- package/dist/cjs/versioning/supported-versions-options.model.d.ts +17 -0
- package/dist/cjs/versioning/supported-versions-options.model.d.ts.map +1 -0
- package/dist/cjs/versioning/supported-versions-options.model.js +3 -0
- package/dist/cjs/versioning/supported-versions-options.model.js.map +1 -0
- package/dist/cjs/versioning/version.model.d.ts +29 -0
- package/dist/cjs/versioning/version.model.d.ts.map +1 -0
- package/dist/{esm/types/version.type.js → cjs/versioning/version.model.js} +1 -1
- package/dist/cjs/versioning/version.model.js.map +1 -0
- package/dist/cjs/versioning/versioning-service.interface.d.ts +31 -0
- package/dist/cjs/versioning/versioning-service.interface.d.ts.map +1 -0
- package/dist/cjs/versioning/versioning-service.interface.js +3 -0
- package/dist/cjs/versioning/versioning-service.interface.js.map +1 -0
- package/dist/cjs/versioning/versioning.service.d.ts +41 -0
- package/dist/cjs/versioning/versioning.service.d.ts.map +1 -0
- package/dist/cjs/versioning/versioning.service.js +366 -0
- package/dist/cjs/versioning/versioning.service.js.map +1 -0
- package/dist/cjs/websocket/decorators/websocket-controller.decorator.d.ts +10 -0
- package/dist/cjs/websocket/decorators/websocket-controller.decorator.d.ts.map +1 -1
- package/dist/cjs/websocket/decorators/websocket-controller.decorator.js +2 -2
- package/dist/cjs/websocket/decorators/websocket-controller.decorator.js.map +1 -1
- package/dist/cjs/websocket/decorators/websocket-route.decorator.d.ts +13 -1
- package/dist/cjs/websocket/decorators/websocket-route.decorator.d.ts.map +1 -1
- package/dist/cjs/websocket/decorators/websocket-route.decorator.js +3 -2
- package/dist/cjs/websocket/decorators/websocket-route.decorator.js.map +1 -1
- package/dist/cjs/websocket/models/connection/base-websocket-connection.model.d.ts +5 -0
- package/dist/cjs/websocket/models/connection/base-websocket-connection.model.d.ts.map +1 -1
- package/dist/cjs/websocket/models/connection/socket-io-websocket-connection.model.d.ts +3 -1
- package/dist/cjs/websocket/models/connection/socket-io-websocket-connection.model.d.ts.map +1 -1
- package/dist/cjs/websocket/models/connection/socket-io-websocket-connection.model.js +3 -1
- package/dist/cjs/websocket/models/connection/socket-io-websocket-connection.model.js.map +1 -1
- package/dist/cjs/websocket/models/websocket-controller-route-configuration.model.d.ts +6 -0
- package/dist/cjs/websocket/models/websocket-controller-route-configuration.model.d.ts.map +1 -1
- package/dist/cjs/websocket/models/websocket-message.model.d.ts +2 -2
- package/dist/cjs/websocket/models/websocket-message.model.d.ts.map +1 -1
- package/dist/cjs/websocket/models/websocket-message.model.js.map +1 -1
- package/dist/cjs/websocket/models/websocket-request.model.d.ts +3 -3
- package/dist/cjs/websocket/models/websocket-request.model.d.ts.map +1 -1
- package/dist/cjs/websocket/models/websocket-request.model.js +1 -1
- package/dist/cjs/websocket/models/websocket-request.model.js.map +1 -1
- package/dist/cjs/websocket/services/websocket.service.d.ts +6 -4
- package/dist/cjs/websocket/services/websocket.service.d.ts.map +1 -1
- package/dist/cjs/websocket/services/websocket.service.js +121 -33
- package/dist/cjs/websocket/services/websocket.service.js.map +1 -1
- package/dist/esm/application.js +0 -1
- package/dist/esm/application.js.map +1 -1
- package/dist/esm/assets/asset.service.js +3 -1
- package/dist/esm/assets/asset.service.js.map +1 -1
- package/dist/esm/auth/2fa/methods/otp/otp-credentials.model.js.map +1 -1
- package/dist/esm/auth/2fa/methods/otp/otp.two-factor-method.js +1 -1
- package/dist/esm/auth/2fa/methods/otp/otp.two-factor-method.js.map +1 -1
- package/dist/esm/auth/strategies/cookie/cookie-auth.controller.js +1 -1
- package/dist/esm/auth/strategies/cookie/cookie-auth.controller.js.map +1 -1
- package/dist/esm/auth/strategies/jwt/jwt-auth.controller.js +1 -1
- package/dist/esm/auth/strategies/jwt/jwt-auth.controller.js.map +1 -1
- package/dist/esm/auth/strategies/jwt/jwt.auth-strategy.js +1 -1
- package/dist/esm/auth/strategies/jwt/jwt.auth-strategy.js.map +1 -1
- package/dist/esm/backup/backup-resource-entity.model.js.map +1 -1
- package/dist/esm/change-sets/models/change-set.model.js +1 -1
- package/dist/esm/change-sets/models/change-set.model.js.map +1 -1
- package/dist/esm/change-sets/models/change.model.js.map +1 -1
- package/dist/esm/context/cache/cache.context.js +2 -2
- package/dist/esm/context/cache/cache.context.js.map +1 -1
- package/dist/esm/context/request/request-context-token.model.js +1 -1
- package/dist/esm/context/request/request-context-token.model.js.map +1 -1
- package/dist/esm/cron/cron-job-entity.model.js.map +1 -1
- package/dist/esm/data-source/data-sources/postgres-typeorm-data-source.model.js +9 -0
- package/dist/esm/data-source/data-sources/postgres-typeorm-data-source.model.js.map +1 -1
- package/dist/esm/data-source/data-sources/typeorm-base-data-source.model.js +3 -3
- package/dist/esm/data-source/data-sources/typeorm-base-data-source.model.js.map +1 -1
- package/dist/esm/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js +20 -0
- package/dist/esm/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js.map +1 -1
- package/dist/esm/data-source/data-sources/where-converter/typeorm-where-filter.converter.js +3 -1
- package/dist/esm/data-source/data-sources/where-converter/typeorm-where-filter.converter.js.map +1 -1
- package/dist/esm/data-source/migration/migration-entity.model.js.map +1 -1
- package/dist/esm/data-source/models/where/where-filter-keys.model.js +3 -0
- package/dist/esm/data-source/models/where/where-filter-keys.model.js.map +1 -1
- package/dist/esm/di/default/zibri-di-providers.default.js +4 -0
- package/dist/esm/di/default/zibri-di-providers.default.js.map +1 -1
- package/dist/esm/di/default/zibri-di-tokens.default.js +2 -0
- package/dist/esm/di/default/zibri-di-tokens.default.js.map +1 -1
- package/dist/esm/email/email.service.js +4 -4
- package/dist/esm/email/email.service.js.map +1 -1
- package/dist/esm/email/models/email.model.js +4 -4
- package/dist/esm/email/models/email.model.js.map +1 -1
- package/dist/esm/entity/generation/generate-entity-file.function.js +1 -1
- package/dist/esm/entity/generation/generate-entity-file.function.js.map +1 -1
- package/dist/esm/event/event-subscriber-run.model.js +1 -1
- package/dist/esm/event/event-subscriber-run.model.js.map +1 -1
- package/dist/esm/http/known-header.enum.js +1 -0
- package/dist/esm/http/known-header.enum.js.map +1 -1
- package/dist/esm/http-client/http-client.js.map +1 -1
- package/dist/esm/index.js +8 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/localization/formatting/format-price.function.js.map +1 -1
- package/dist/esm/logging/log-context.model.js +6 -6
- package/dist/esm/logging/log-context.model.js.map +1 -1
- package/dist/esm/logging/logger.js +1 -1
- package/dist/esm/logging/logger.js.map +1 -1
- package/dist/esm/multithreading/models/thread-job-entity.model.js +4 -4
- package/dist/esm/multithreading/models/thread-job-entity.model.js.map +1 -1
- package/dist/esm/multithreading/services/thread-job.js.map +1 -1
- package/dist/esm/open-api/open-api.service.js +256 -139
- package/dist/esm/open-api/open-api.service.js.map +1 -1
- package/dist/esm/parsing/html/csp-options.model.js.map +1 -1
- package/dist/esm/parsing/parser.js +3 -3
- package/dist/esm/parsing/parser.js.map +1 -1
- package/dist/esm/plugin/invoicing/models/invoice-address.model.js +2 -2
- package/dist/esm/plugin/invoicing/models/invoice-address.model.js.map +1 -1
- package/dist/esm/plugin/invoicing/models/vat.model.js +1 -1
- package/dist/esm/plugin/invoicing/models/vat.model.js.map +1 -1
- package/dist/esm/plugin/mailing-list/mailing-list.controller.js +1 -1
- package/dist/esm/plugin/mailing-list/mailing-list.controller.js.map +1 -1
- package/dist/esm/plugin/mailing-list/models/mailing-list-subscriber.model.js +1 -1
- package/dist/esm/plugin/mailing-list/models/mailing-list-subscriber.model.js.map +1 -1
- package/dist/esm/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.js +1 -1
- package/dist/esm/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.js.map +1 -1
- package/dist/esm/plugin/payment/models/payment.model.js +1 -1
- package/dist/esm/plugin/payment/models/payment.model.js.map +1 -1
- package/dist/esm/plugin/payment/providers/pay-pal/pay-pal-client.js +17 -17
- package/dist/esm/plugin/payment/providers/pay-pal/pay-pal-client.js.map +1 -1
- package/dist/esm/plugin/payment/providers/pay-pal/pay-pal.payment-provider.js +1 -1
- package/dist/esm/plugin/payment/providers/pay-pal/pay-pal.payment-provider.js.map +1 -1
- package/dist/esm/preact/preact.utilities.js +1 -1
- package/dist/esm/preact/preact.utilities.js.map +1 -1
- package/dist/esm/preact/validate-email-templates.function.js +1 -1
- package/dist/esm/preact/validate-email-templates.function.js.map +1 -1
- package/dist/esm/rate-limiting/rate-limiter.js +22 -12
- package/dist/esm/rate-limiting/rate-limiter.js.map +1 -1
- package/dist/esm/routing/decorators/controller.decorator.js +3 -2
- package/dist/esm/routing/decorators/controller.decorator.js.map +1 -1
- package/dist/esm/routing/decorators/create-http-decorator.function.js +2 -2
- package/dist/esm/routing/decorators/create-http-decorator.function.js.map +1 -1
- package/dist/esm/routing/decorators/delete.decorator.js +3 -2
- package/dist/esm/routing/decorators/delete.decorator.js.map +1 -1
- package/dist/esm/routing/decorators/get.decorator.js +3 -2
- package/dist/esm/routing/decorators/get.decorator.js.map +1 -1
- package/dist/esm/routing/decorators/http-decorator-option-input.model.js +3 -0
- package/dist/esm/routing/decorators/http-decorator-option-input.model.js.map +1 -0
- package/dist/esm/routing/decorators/patch.decorator.js +3 -2
- package/dist/esm/routing/decorators/patch.decorator.js.map +1 -1
- package/dist/esm/routing/decorators/post.decorator.js +3 -2
- package/dist/esm/routing/decorators/post.decorator.js.map +1 -1
- package/dist/esm/routing/resolve-route-params.function.js +1 -0
- package/dist/esm/routing/resolve-route-params.function.js.map +1 -1
- package/dist/esm/routing/router.js +173 -88
- package/dist/esm/routing/router.js.map +1 -1
- package/dist/esm/utilities/fs.utilities.js +1 -1
- package/dist/esm/utilities/sem-ver.utilities.js +204 -0
- package/dist/esm/utilities/sem-ver.utilities.js.map +1 -0
- package/dist/esm/utilities/uuid.utilities.js +2 -2
- package/dist/esm/utilities/uuid.utilities.js.map +1 -1
- package/dist/esm/versioning/route-with-version-data.model.js +3 -0
- package/dist/esm/versioning/route-with-version-data.model.js.map +1 -0
- package/dist/esm/versioning/supported-versions-options.model.js +3 -0
- package/dist/esm/versioning/supported-versions-options.model.js.map +1 -0
- package/dist/{cjs/types/version.type.js → esm/versioning/version.model.js} +1 -1
- package/dist/esm/versioning/version.model.js.map +1 -0
- package/dist/esm/versioning/versioning-service.interface.js +3 -0
- package/dist/esm/versioning/versioning-service.interface.js.map +1 -0
- package/dist/esm/versioning/versioning.service.js +366 -0
- package/dist/esm/versioning/versioning.service.js.map +1 -0
- package/dist/esm/websocket/decorators/websocket-controller.decorator.js +2 -2
- package/dist/esm/websocket/decorators/websocket-controller.decorator.js.map +1 -1
- package/dist/esm/websocket/decorators/websocket-route.decorator.js +3 -2
- package/dist/esm/websocket/decorators/websocket-route.decorator.js.map +1 -1
- package/dist/esm/websocket/models/connection/socket-io-websocket-connection.model.js +3 -1
- package/dist/esm/websocket/models/connection/socket-io-websocket-connection.model.js.map +1 -1
- package/dist/esm/websocket/models/websocket-message.model.js.map +1 -1
- package/dist/esm/websocket/models/websocket-request.model.js +1 -1
- package/dist/esm/websocket/models/websocket-request.model.js.map +1 -1
- package/dist/esm/websocket/services/websocket.service.js +121 -33
- package/dist/esm/websocket/services/websocket.service.js.map +1 -1
- package/package.json +17 -19
- package/src/__testing__/test-server/providers.ts +25 -1
- package/src/__testing__/test-server/start-test-server.function.ts +76 -8
- package/src/application-options.model.ts +2 -2
- package/src/application.ts +0 -1
- package/src/assets/asset.service.ts +3 -1
- package/src/auth/2fa/methods/otp/otp-credentials.model.ts +1 -1
- package/src/auth/2fa/methods/otp/otp.two-factor-method.ts +1 -1
- package/src/auth/strategies/cookie/cookie-auth.controller.ts +1 -1
- package/src/auth/strategies/jwt/jwt-auth.controller.ts +1 -1
- package/src/auth/strategies/jwt/jwt.auth-strategy.ts +1 -1
- package/src/backup/backup-resource-entity.model.ts +1 -1
- package/src/backup/backup-service.test.ts +2 -1
- package/src/change-sets/models/change-set.model.ts +1 -1
- package/src/change-sets/models/change.model.ts +2 -2
- package/src/context/cache/cache.context.ts +2 -2
- package/src/context/request/request-context-token.model.ts +1 -1
- package/src/cron/cron-job-entity.model.ts +2 -2
- package/src/data-source/data-sources/postgres-typeorm-data-source.model.ts +10 -0
- package/src/data-source/data-sources/typeorm-base-data-source.model.ts +4 -5
- package/src/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.ts +35 -2
- package/src/data-source/data-sources/where-converter/typeorm-where-filter.converter.ts +14 -1
- package/src/data-source/hooks/hooks.test.ts +1 -1
- package/src/data-source/migration/migration-entity.model.ts +2 -2
- package/src/data-source/migration/migration.model.ts +2 -2
- package/src/data-source/migration/migration.test.ts +2 -2
- package/src/data-source/models/where/date-where-filter.model.ts +11 -3
- package/src/data-source/models/where/string-where-filter.model.ts +18 -1
- package/src/data-source/models/where/where-filter-keys.model.ts +3 -0
- package/src/data-source/nested-where-filter.test.ts +8 -3
- package/src/data-source/repository.test.ts +2 -2
- package/src/data-source/where-filter.test.ts +17 -7
- package/src/di/default/zibri-di-providers.default.ts +4 -0
- package/src/di/default/zibri-di-tokens.default.ts +3 -0
- package/src/email/email.service.ts +5 -5
- package/src/email/models/email.model.ts +4 -4
- package/src/entity/generation/generate-entity-file.function.ts +1 -1
- package/src/event/event-subscriber-run.model.ts +1 -1
- package/src/global/global-registry.ts +2 -2
- package/src/http/http-request.model.ts +2 -2
- package/src/http/known-header.enum.ts +1 -0
- package/src/http-client/http-client.ts +0 -1
- package/src/index.ts +9 -3
- package/src/localization/formatting/format-price.function.ts +2 -3
- package/src/logging/log-context.model.ts +6 -6
- package/src/logging/logger.ts +1 -1
- package/src/multithreading/models/thread-job-entity.model.ts +5 -5
- package/src/multithreading/services/thread-job.ts +4 -4
- package/src/open-api/open-api-service.interface.ts +2 -1
- package/src/open-api/open-api.service.ts +263 -141
- package/src/parsing/html/csp-options.model.ts +3 -0
- package/src/parsing/parser.ts +3 -3
- package/src/plugin/invoicing/models/invoice-address.model.ts +2 -2
- package/src/plugin/invoicing/models/vat.model.ts +1 -1
- package/src/plugin/mailing-list/mailing-list.controller.ts +1 -1
- package/src/plugin/mailing-list/models/mailing-list-subscriber.model.ts +1 -1
- package/src/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.ts +1 -1
- package/src/plugin/payment/models/payment.model.ts +2 -2
- package/src/plugin/payment/providers/pay-pal/pay-pal-client.ts +17 -17
- package/src/plugin/payment/providers/pay-pal/pay-pal.payment-provider.test.ts +1 -1
- package/src/plugin/payment/providers/pay-pal/pay-pal.payment-provider.ts +1 -1
- package/src/preact/preact.utilities.ts +1 -1
- package/src/preact/validate-email-templates.function.ts +1 -1
- package/src/rate-limiting/rate-limiter.ts +23 -12
- package/src/routing/controller-route-configuration.model.ts +6 -1
- package/src/routing/decorators/controller.decorator.ts +8 -2
- package/src/routing/decorators/create-http-decorator.function.ts +3 -2
- package/src/routing/decorators/delete.decorator.ts +4 -2
- package/src/routing/decorators/get.decorator.ts +4 -2
- package/src/routing/decorators/http-decorator-option-input.model.ts +11 -0
- package/src/routing/decorators/patch.decorator.ts +4 -2
- package/src/routing/decorators/post.decorator.ts +4 -2
- package/src/routing/resolve-route-params.function.ts +1 -0
- package/src/routing/route-configuration.model.ts +13 -3
- package/src/routing/router.ts +265 -134
- package/src/utilities/fs.utilities.ts +1 -1
- package/src/utilities/sem-ver.utilities.ts +270 -0
- package/src/utilities/uuid.utilities.ts +2 -2
- package/src/versioning/route-with-version-data.model.ts +15 -0
- package/src/versioning/supported-versions-options.model.ts +25 -0
- package/src/versioning/version.model.ts +30 -0
- package/src/versioning/versioning-service.interface.ts +39 -0
- package/src/versioning/versioning-websocket.test.ts +351 -0
- package/src/versioning/versioning.service.test.ts +582 -0
- package/src/versioning/versioning.service.ts +496 -0
- package/src/websocket/decorators/websocket-controller.decorator.ts +13 -3
- package/src/websocket/decorators/websocket-route.decorator.ts +15 -2
- package/src/websocket/models/connection/base-websocket-connection.model.ts +6 -0
- package/src/websocket/models/connection/socket-io-websocket-connection.model.ts +8 -1
- package/src/websocket/models/websocket-controller-route-configuration.model.ts +8 -1
- package/src/websocket/models/websocket-message.model.ts +2 -2
- package/src/websocket/models/websocket-request.model.ts +4 -3
- package/src/websocket/services/websocket.service.ts +143 -38
- package/dist/cjs/types/version.type.d.ts +0 -5
- package/dist/cjs/types/version.type.d.ts.map +0 -1
- package/dist/cjs/types/version.type.js.map +0 -1
- package/dist/cjs/utilities/compare-versions.function.d.ts +0 -9
- package/dist/cjs/utilities/compare-versions.function.d.ts.map +0 -1
- package/dist/cjs/utilities/compare-versions.function.js +0 -33
- package/dist/cjs/utilities/compare-versions.function.js.map +0 -1
- package/dist/cjs/utilities/is-version.function.d.ts +0 -7
- package/dist/cjs/utilities/is-version.function.d.ts.map +0 -1
- package/dist/cjs/utilities/is-version.function.js +0 -18
- package/dist/cjs/utilities/is-version.function.js.map +0 -1
- package/dist/esm/types/version.type.js.map +0 -1
- package/dist/esm/utilities/compare-versions.function.js +0 -33
- package/dist/esm/utilities/compare-versions.function.js.map +0 -1
- package/dist/esm/utilities/is-version.function.js +0 -18
- package/dist/esm/utilities/is-version.function.js.map +0 -1
- package/src/types/version.type.ts +0 -4
- package/src/utilities/compare-versions.function.ts +0 -33
- package/src/utilities/is-version.function.ts +0 -16
package/src/routing/router.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
1
2
|
import { Readable } from 'stream';
|
|
2
3
|
|
|
3
4
|
import { NextFunction, RequestHandler, Router as ExpressRouter } from 'express';
|
|
@@ -16,6 +17,7 @@ import { Inject } from '../di/decorators/inject.decorator';
|
|
|
16
17
|
import { Injectable } from '../di/decorators/injectable.decorator';
|
|
17
18
|
import { ZIBRI_DI_TOKENS } from '../di/default/zibri-di-tokens.default';
|
|
18
19
|
import { inject } from '../di/inject.function';
|
|
20
|
+
import { NotFoundError } from '../error-handling/errors/not-found.error';
|
|
19
21
|
import { GlobalRegistry } from '../global/global-registry';
|
|
20
22
|
import { OnAppInit } from '../global/on-app-init.interface';
|
|
21
23
|
import { OnAppStart } from '../global/on-app-start.interface';
|
|
@@ -33,12 +35,22 @@ import type { ParserInterface } from '../parsing/parser.interface';
|
|
|
33
35
|
import { Newable } from '../types/newable.type';
|
|
34
36
|
import { MetadataUtilities } from '../utilities/metadata.utilities';
|
|
35
37
|
import { Ms } from '../utilities/ms';
|
|
38
|
+
import { SemVerVersion } from '../utilities/sem-ver.utilities';
|
|
36
39
|
import type { ValidationServiceInterface } from '../validation/validation-service.interface';
|
|
37
40
|
import { ControllerData } from './decorators/controller.decorator';
|
|
38
41
|
import { AlsUtilities } from '../context/als.utilities';
|
|
39
42
|
import { HttpRequestContext } from '../context/request/http-request.context';
|
|
40
43
|
import { JsonUtilities } from '../utilities/json.utilities';
|
|
41
44
|
import { ObjectUtilities } from '../utilities/object.utilities';
|
|
45
|
+
import { RouteWithVersionData } from '../versioning/route-with-version-data.model';
|
|
46
|
+
import { SupportedVersionsOptions } from '../versioning/supported-versions-options.model';
|
|
47
|
+
import { Version } from '../versioning/version.model';
|
|
48
|
+
import { type VersioningServiceInterface } from '../versioning/versioning-service.interface';
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Handler for a specific route and version.
|
|
52
|
+
*/
|
|
53
|
+
type ControllerInnerHandler = (context: HttpRequestContext, next: NextFunction) => Promise<void>;
|
|
42
54
|
|
|
43
55
|
/**
|
|
44
56
|
* Default router implementation of Zibri.
|
|
@@ -46,8 +58,9 @@ import { ObjectUtilities } from '../utilities/object.utilities';
|
|
|
46
58
|
@Injectable({ register: 'onUse' })
|
|
47
59
|
export class Router implements RouterInterface, OnAppInit, OnAppStart {
|
|
48
60
|
private readonly expressRouter: ExpressRouter = ExpressRouter();
|
|
49
|
-
private readonly allBaseRoutes:
|
|
50
|
-
private readonly allFinalRoutes:
|
|
61
|
+
private readonly allBaseRoutes: RouteWithVersionData[] = [];
|
|
62
|
+
private readonly allFinalRoutes: RouteWithVersionData[] = [];
|
|
63
|
+
private initComplete: boolean = false;
|
|
51
64
|
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
52
65
|
readonly manuallyRegisteredRoutes: RouteConfiguration<
|
|
53
66
|
BodyMetadata,
|
|
@@ -55,6 +68,18 @@ export class Router implements RouterInterface, OnAppInit, OnAppStart {
|
|
|
55
68
|
Record<string, QueryParamMetadata>,
|
|
56
69
|
Record<string, HeaderParamMetadata>
|
|
57
70
|
>[] = [];
|
|
71
|
+
private readonly pendingRouteGroups: Map<string, {
|
|
72
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
73
|
+
httpMethod: HttpMethod,
|
|
74
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
75
|
+
finalRoute: string,
|
|
76
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
77
|
+
entries: { versions: SupportedVersionsOptions, innerHandler: ControllerInnerHandler }[]
|
|
78
|
+
}> = new Map();
|
|
79
|
+
|
|
80
|
+
private get versioningService(): VersioningServiceInterface {
|
|
81
|
+
return inject(ZIBRI_DI_TOKENS.VERSIONING_SERVICE);
|
|
82
|
+
}
|
|
58
83
|
|
|
59
84
|
constructor(
|
|
60
85
|
@Inject(ZIBRI_DI_TOKENS.LOGGER)
|
|
@@ -76,6 +101,13 @@ export class Router implements RouterInterface, OnAppInit, OnAppStart {
|
|
|
76
101
|
await this.registerController(controller);
|
|
77
102
|
}
|
|
78
103
|
this.checkForOrphanedControllers(app.options.controllers);
|
|
104
|
+
|
|
105
|
+
for (const group of this.pendingRouteGroups.values()) {
|
|
106
|
+
const dispatchHandler: RequestHandler = this.createDispatchHandler(group.entries);
|
|
107
|
+
await this.logger.debug(`- mounting ${group.httpMethod.toUpperCase()} ${group.finalRoute}`);
|
|
108
|
+
this.expressRouter[group.httpMethod](group.finalRoute, dispatchHandler);
|
|
109
|
+
}
|
|
110
|
+
this.initComplete = true;
|
|
79
111
|
}
|
|
80
112
|
|
|
81
113
|
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
@@ -107,10 +139,37 @@ export class Router implements RouterInterface, OnAppInit, OnAppStart {
|
|
|
107
139
|
>(
|
|
108
140
|
input: RouteConfigurationInput<BodyMetaInputObject, PathMetaInputObject, QueryMetaInputObject, HeaderMetaInputObject>
|
|
109
141
|
): Promise<void> {
|
|
110
|
-
|
|
111
|
-
|
|
142
|
+
const key: string = `${input.httpMethod.toUpperCase()} ${input.route}`;
|
|
143
|
+
const versions: SupportedVersionsOptions = input.versions ?? ['^latest'];
|
|
144
|
+
const currentLatest: SemVerVersion | undefined = GlobalRegistry.getAppData('version');
|
|
145
|
+
assert(currentLatest);
|
|
146
|
+
|
|
147
|
+
const overlappingRoute: RouteWithVersionData | undefined = this.allFinalRoutes.find(
|
|
148
|
+
r => r.key === key && this.versioningService.hasOverlappingVersions(r.versions, versions, currentLatest)
|
|
149
|
+
);
|
|
150
|
+
if (overlappingRoute) {
|
|
151
|
+
const overlappingVersions: SupportedVersionsOptions = this.versioningService.findOverlappingVersions(
|
|
152
|
+
overlappingRoute.versions,
|
|
153
|
+
versions,
|
|
154
|
+
currentLatest
|
|
155
|
+
);
|
|
156
|
+
if (overlappingVersions === 'all') {
|
|
157
|
+
throw new Error([
|
|
158
|
+
`The route "${key}"`,
|
|
159
|
+
// eslint-disable-next-line sonar/no-duplicate-string
|
|
160
|
+
'has been defined more than once.',
|
|
161
|
+
// eslint-disable-next-line sonar/no-duplicate-string
|
|
162
|
+
'(versions: \'all\' has been used)'
|
|
163
|
+
].join(' '));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
throw new Error([
|
|
167
|
+
`The route "${key}"`,
|
|
168
|
+
`for the ${overlappingVersions.length > 1 ? 'versions' : 'version'} "${overlappingVersions.join(', ')}"`,
|
|
169
|
+
'has been defined more than once.'
|
|
170
|
+
].join(' '));
|
|
112
171
|
}
|
|
113
|
-
this.allFinalRoutes.push(
|
|
172
|
+
this.allFinalRoutes.push({ key, versions });
|
|
114
173
|
|
|
115
174
|
const pathParams: Record<string, PathParamMetadata> = {};
|
|
116
175
|
for (const key in input.pathParams) {
|
|
@@ -127,6 +186,7 @@ export class Router implements RouterInterface, OnAppInit, OnAppStart {
|
|
|
127
186
|
|
|
128
187
|
// eslint-disable-next-line typescript/no-explicit-any
|
|
129
188
|
const route: RouteConfiguration<any, any, any, any> = {
|
|
189
|
+
versions: ['^latest'],
|
|
130
190
|
...input,
|
|
131
191
|
openApi: this.createOpenApiRouteConfiguration(input.openApi, input.httpMethod),
|
|
132
192
|
bodyMetadata: input.bodyMetadata
|
|
@@ -146,8 +206,8 @@ export class Router implements RouterInterface, OnAppInit, OnAppStart {
|
|
|
146
206
|
queryParams,
|
|
147
207
|
headerParams
|
|
148
208
|
};
|
|
149
|
-
|
|
150
|
-
await this.logger.debug(`- mounting ${
|
|
209
|
+
|
|
210
|
+
await this.logger.debug(`- mounting ${key}`);
|
|
151
211
|
this.manuallyRegisteredRoutes.push(
|
|
152
212
|
route as RouteConfiguration<
|
|
153
213
|
BodyMetadata,
|
|
@@ -156,7 +216,69 @@ export class Router implements RouterInterface, OnAppInit, OnAppStart {
|
|
|
156
216
|
Record<string, HeaderParamMetadata>
|
|
157
217
|
>
|
|
158
218
|
);
|
|
159
|
-
|
|
219
|
+
|
|
220
|
+
const innerHandler: ControllerInnerHandler = this.createManualRouteInnerHandler(route);
|
|
221
|
+
// eslint-disable-next-line typescript/typedef
|
|
222
|
+
const existing = this.pendingRouteGroups.get(key);
|
|
223
|
+
if (existing) {
|
|
224
|
+
existing.entries.push({ versions, innerHandler });
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
this.pendingRouteGroups.set(key, {
|
|
228
|
+
httpMethod: input.httpMethod,
|
|
229
|
+
finalRoute: input.route,
|
|
230
|
+
entries: [{ versions, innerHandler }]
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// If init has already completed, mount immediately since the deferred loop has already run
|
|
235
|
+
if (this.initComplete) {
|
|
236
|
+
// eslint-disable-next-line typescript/typedef, typescript/no-non-null-assertion
|
|
237
|
+
const group = this.pendingRouteGroups.get(key)!;
|
|
238
|
+
this.expressRouter[input.httpMethod](input.route, this.createDispatchHandler(group.entries));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private createManualRouteInnerHandler<
|
|
243
|
+
BodyMetaObject extends BodyMetadata,
|
|
244
|
+
PathMetaObject extends Record<string, PathParamMetadata>,
|
|
245
|
+
QueryMetaObject extends Record<string, QueryParamMetadata>,
|
|
246
|
+
HeaderMetaObject extends Record<string, HeaderParamMetadata>
|
|
247
|
+
>(route: RouteConfiguration<BodyMetaObject, PathMetaObject, QueryMetaObject, HeaderMetaObject>): ControllerInnerHandler {
|
|
248
|
+
return async (context: HttpRequestContext, next: NextFunction) => {
|
|
249
|
+
try {
|
|
250
|
+
for (const key of ObjectUtilities.keys(route.pathParams)) {
|
|
251
|
+
(context.request.params[key] as unknown) = this.parser.parsePathParam(context.request, route.pathParams[key]);
|
|
252
|
+
}
|
|
253
|
+
for (const key of ObjectUtilities.keys(route.queryParams)) {
|
|
254
|
+
(context.request.query[key] as unknown) = this.parser.parseQueryParam(context.request, route.queryParams[key]);
|
|
255
|
+
}
|
|
256
|
+
for (const key of ObjectUtilities.keys(route.headerParams)) {
|
|
257
|
+
(context.request.headers[key] as unknown) = this.parser.parseHeaderParam(context.request, route.headerParams[key]);
|
|
258
|
+
}
|
|
259
|
+
if (route.bodyMetadata) {
|
|
260
|
+
context.request.body = await this.parser.parseBody(context.request, route.bodyMetadata);
|
|
261
|
+
}
|
|
262
|
+
await Promise.all([
|
|
263
|
+
...ObjectUtilities.keys(route.pathParams).map(async key => {
|
|
264
|
+
await this.validationService.validatePathParam(context.request.params[key], route.pathParams[key]);
|
|
265
|
+
}),
|
|
266
|
+
...ObjectUtilities.keys(route.queryParams).map(async key => {
|
|
267
|
+
await this.validationService.validateQueryParam(context.request.query[key], route.queryParams[key]);
|
|
268
|
+
}),
|
|
269
|
+
...ObjectUtilities.keys(route.headerParams).map(async key => {
|
|
270
|
+
await this.validationService.validateHeaderParam(context.request.headers[key], route.headerParams[key]);
|
|
271
|
+
}),
|
|
272
|
+
...route.bodyMetadata ? [this.validationService.validateBody(context.request.body, route.bodyMetadata)] : []
|
|
273
|
+
]);
|
|
274
|
+
// eslint-disable-next-line typescript/no-explicit-any
|
|
275
|
+
const result: unknown = await route.handler(context.request as HttpRequest<any, any, any, any>, context.response, next);
|
|
276
|
+
await this.returnResult(context.response, result, next, []);
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
next(error);
|
|
280
|
+
}
|
|
281
|
+
};
|
|
160
282
|
}
|
|
161
283
|
|
|
162
284
|
private createOpenApiRouteConfiguration(
|
|
@@ -178,14 +300,14 @@ export class Router implements RouterInterface, OnAppInit, OnAppStart {
|
|
|
178
300
|
switch (httpMethod) {
|
|
179
301
|
case HttpMethod.HEAD:
|
|
180
302
|
case HttpMethod.OPTIONS:
|
|
181
|
-
case HttpMethod.TRACE:
|
|
182
|
-
case HttpMethod.GET: {
|
|
303
|
+
case HttpMethod.TRACE: {
|
|
183
304
|
return { useInOpenApi: false };
|
|
184
305
|
}
|
|
185
306
|
case HttpMethod.POST:
|
|
186
307
|
case HttpMethod.PUT:
|
|
187
308
|
case HttpMethod.PATCH:
|
|
188
|
-
case HttpMethod.DELETE:
|
|
309
|
+
case HttpMethod.DELETE:
|
|
310
|
+
case HttpMethod.GET: {
|
|
189
311
|
return {
|
|
190
312
|
responses: [],
|
|
191
313
|
tags: [],
|
|
@@ -195,163 +317,172 @@ export class Router implements RouterInterface, OnAppInit, OnAppStart {
|
|
|
195
317
|
}
|
|
196
318
|
}
|
|
197
319
|
|
|
198
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
320
|
+
// eslint-disable-next-line jsdoc/require-jsdoc, sonar/cognitive-complexity
|
|
199
321
|
async registerController(controllerClass: Newable<unknown>): Promise<void> {
|
|
200
322
|
const controllerData: ControllerData | undefined = MetadataUtilities.getControllerData(controllerClass);
|
|
201
323
|
if (controllerData == undefined) {
|
|
202
324
|
throw new MissingBaseRouteError(controllerClass);
|
|
203
325
|
}
|
|
204
|
-
|
|
205
|
-
|
|
326
|
+
const currentLatest: SemVerVersion | undefined = GlobalRegistry.getAppData('version');
|
|
327
|
+
assert(currentLatest);
|
|
328
|
+
|
|
329
|
+
const overlappingBaseRoute: RouteWithVersionData | undefined = this.allBaseRoutes.find(
|
|
330
|
+
r => r.key === controllerData.baseRoute && this.versioningService.hasOverlappingVersions(
|
|
331
|
+
r.versions,
|
|
332
|
+
controllerData.versions,
|
|
333
|
+
currentLatest
|
|
334
|
+
)
|
|
335
|
+
);
|
|
336
|
+
if (overlappingBaseRoute) {
|
|
337
|
+
const overlappingVersions: SupportedVersionsOptions = this.versioningService.findOverlappingVersions(
|
|
338
|
+
overlappingBaseRoute.versions,
|
|
339
|
+
controllerData.versions,
|
|
340
|
+
currentLatest
|
|
341
|
+
);
|
|
342
|
+
if (overlappingVersions === 'all') {
|
|
343
|
+
throw new Error([
|
|
344
|
+
`The base route "${controllerData.baseRoute}"`,
|
|
345
|
+
'has been defined on more than one controller.',
|
|
346
|
+
'(versions: \'all\' has been used)'
|
|
347
|
+
].join(' '));
|
|
348
|
+
}
|
|
349
|
+
throw new Error([
|
|
350
|
+
`The base route "${controllerData.baseRoute}"`,
|
|
351
|
+
`for the ${overlappingVersions.length > 1 ? 'versions' : 'version'} "${overlappingVersions.join(', ')}"`,
|
|
352
|
+
'has been defined on more than one controller.'
|
|
353
|
+
].join(' '));
|
|
206
354
|
}
|
|
207
|
-
this.allBaseRoutes.push(controllerData.baseRoute);
|
|
355
|
+
this.allBaseRoutes.push({ key: controllerData.baseRoute, versions: controllerData.versions });
|
|
208
356
|
const routes: ControllerRouteConfiguration[] = MetadataUtilities.getControllerRoutes(controllerClass);
|
|
209
357
|
|
|
210
358
|
for (const route of routes) {
|
|
211
|
-
const handler: RequestHandler = await this.controllerRouteToRequestHandler(controllerClass, route);
|
|
212
359
|
const finalRoute: string = controllerData.baseRoute === '/' ? route.route : `${controllerData.baseRoute}${route.route}`;
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
360
|
+
const key: string = `${route.httpMethod.toUpperCase()} ${finalRoute}`;
|
|
361
|
+
const versions: SupportedVersionsOptions = route.versions ?? controllerData.versions;
|
|
362
|
+
|
|
363
|
+
const overlappingRoute: RouteWithVersionData | undefined = this.allFinalRoutes.find(
|
|
364
|
+
r => r.key === key && this.versioningService.hasOverlappingVersions(r.versions, versions, currentLatest)
|
|
365
|
+
);
|
|
366
|
+
if (overlappingRoute) {
|
|
367
|
+
const overlappingVersions: SupportedVersionsOptions = this.versioningService.findOverlappingVersions(
|
|
368
|
+
overlappingRoute.versions,
|
|
369
|
+
versions,
|
|
370
|
+
currentLatest
|
|
217
371
|
);
|
|
372
|
+
if (overlappingVersions === 'all') {
|
|
373
|
+
throw new Error([
|
|
374
|
+
`The route "${key}"`,
|
|
375
|
+
'has been defined more than once.',
|
|
376
|
+
'(versions: \'all\' has been used)'
|
|
377
|
+
].join(' '));
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
throw new Error([
|
|
381
|
+
`The route "${key}"`,
|
|
382
|
+
`for the ${overlappingVersions.length > 1 ? 'versions' : 'version'} "${overlappingVersions.join(', ')}"`,
|
|
383
|
+
'has been defined more than once.'
|
|
384
|
+
].join(' '));
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
this.allFinalRoutes.push({ key, versions });
|
|
388
|
+
|
|
389
|
+
const innerHandler: ControllerInnerHandler = await this.createControllerInnerHandler(controllerClass, route);
|
|
390
|
+
// eslint-disable-next-line typescript/typedef
|
|
391
|
+
const existing = this.pendingRouteGroups.get(key);
|
|
392
|
+
if (existing) {
|
|
393
|
+
existing.entries.push({ versions, innerHandler });
|
|
394
|
+
continue;
|
|
218
395
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
396
|
+
|
|
397
|
+
this.pendingRouteGroups.set(key, {
|
|
398
|
+
httpMethod: route.httpMethod,
|
|
399
|
+
finalRoute,
|
|
400
|
+
entries: [{ versions, innerHandler }]
|
|
401
|
+
});
|
|
222
402
|
}
|
|
223
403
|
}
|
|
224
404
|
|
|
225
|
-
private
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
405
|
+
private createDispatchHandler(
|
|
406
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
407
|
+
entries: { versions: SupportedVersionsOptions, innerHandler: ControllerInnerHandler }[]
|
|
408
|
+
): RequestHandler {
|
|
409
|
+
return (async (request: HttpRequest, res, next) => {
|
|
410
|
+
Object.defineProperty(
|
|
411
|
+
request,
|
|
412
|
+
'params',
|
|
413
|
+
{
|
|
414
|
+
value: { ...request.params },
|
|
415
|
+
writable: true,
|
|
416
|
+
configurable: true,
|
|
417
|
+
enumerable: true
|
|
418
|
+
}
|
|
419
|
+
);
|
|
420
|
+
Object.defineProperty(
|
|
421
|
+
request,
|
|
422
|
+
'query',
|
|
423
|
+
{
|
|
424
|
+
value: { ...request.query },
|
|
425
|
+
writable: true,
|
|
426
|
+
configurable: true,
|
|
427
|
+
enumerable: true
|
|
428
|
+
}
|
|
429
|
+
);
|
|
430
|
+
Object.defineProperty(
|
|
431
|
+
request,
|
|
432
|
+
'headers',
|
|
433
|
+
{
|
|
434
|
+
value: { ...request.headers },
|
|
435
|
+
writable: true,
|
|
436
|
+
configurable: true,
|
|
437
|
+
enumerable: true
|
|
438
|
+
}
|
|
439
|
+
);
|
|
250
440
|
|
|
251
441
|
const context: HttpRequestContext = new HttpRequestContext(request, res, undefined, undefined);
|
|
252
442
|
await AlsUtilities.runWithHttpRequestContext(context, async () => {
|
|
253
443
|
try {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
(context.request.query[key] as unknown) = this.parser.parseQueryParam(
|
|
260
|
-
context.request,
|
|
261
|
-
route.queryParams[key]
|
|
262
|
-
);
|
|
263
|
-
}
|
|
264
|
-
for (const key of ObjectUtilities.keys(route.headerParams)) {
|
|
265
|
-
(context.request.headers[key] as unknown) = this.parser.parseHeaderParam(
|
|
266
|
-
context.request,
|
|
267
|
-
route.headerParams[key]
|
|
268
|
-
);
|
|
444
|
+
const version: Version = await this.versioningService.resolveVersion(context);
|
|
445
|
+
// eslint-disable-next-line typescript/typedef
|
|
446
|
+
const match = entries.find(e => this.versioningService.matchesVersion(e.versions, version));
|
|
447
|
+
if (!match) {
|
|
448
|
+
throw new NotFoundError(`Could not find route "${request.url}" for version "${version.value}"`);
|
|
269
449
|
}
|
|
270
|
-
|
|
271
|
-
context.request.body = await this.parser.parseBody(context.request, route.bodyMetadata);
|
|
272
|
-
}
|
|
273
|
-
// validate
|
|
274
|
-
await Promise.all([
|
|
275
|
-
...ObjectUtilities.keys(route.pathParams).map(async key => {
|
|
276
|
-
await this.validationService.validatePathParam(context.request.params[key], route.pathParams[key]);
|
|
277
|
-
}),
|
|
278
|
-
...ObjectUtilities.keys(route.queryParams).map(async key => {
|
|
279
|
-
await this.validationService.validateQueryParam(context.request.query[key], route.queryParams[key]);
|
|
280
|
-
}),
|
|
281
|
-
...ObjectUtilities.keys(route.headerParams).map(async key => {
|
|
282
|
-
await this.validationService.validateHeaderParam(context.request.headers[key], route.headerParams[key]);
|
|
283
|
-
}),
|
|
284
|
-
...route.bodyMetadata ? [this.validationService.validateBody(context.request.body, route.bodyMetadata)] : []
|
|
285
|
-
]);
|
|
286
|
-
|
|
287
|
-
// eslint-disable-next-line typescript/no-explicit-any
|
|
288
|
-
const result: unknown = await route.handler(context.request as HttpRequest<any, any, any, any>, context.response, next);
|
|
289
|
-
await this.returnResult(context.response, result, next, []);
|
|
450
|
+
await match.innerHandler(context, next);
|
|
290
451
|
}
|
|
291
452
|
catch (error) {
|
|
292
453
|
next(error);
|
|
293
454
|
}
|
|
294
455
|
});
|
|
295
456
|
}) as RequestHandler;
|
|
296
|
-
return handler;
|
|
297
457
|
}
|
|
298
458
|
|
|
299
|
-
private async
|
|
459
|
+
private async createControllerInnerHandler(
|
|
300
460
|
controllerClass: Newable<unknown>,
|
|
301
461
|
route: ControllerRouteConfiguration
|
|
302
|
-
): Promise<
|
|
462
|
+
): Promise<ControllerInnerHandler> {
|
|
303
463
|
const responses: OpenApiResponse[] = MetadataUtilities.getRouteResponses(controllerClass, route.controllerMethod);
|
|
304
464
|
if (!responses.length) {
|
|
305
465
|
await this.logger.warn(`No responses defined on route ${controllerClass.name}.${route.controllerMethod}`);
|
|
306
466
|
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
const context: HttpRequestContext = new HttpRequestContext(
|
|
328
|
-
request,
|
|
329
|
-
res,
|
|
330
|
-
controllerClass,
|
|
331
|
-
route.controllerMethod
|
|
332
|
-
);
|
|
333
|
-
await AlsUtilities.runWithHttpRequestContext(context, async () => {
|
|
334
|
-
try {
|
|
335
|
-
await this.authService.checkAccess(controllerClass, route.controllerMethod, context);
|
|
336
|
-
const controller: unknown = inject(controllerClass);
|
|
337
|
-
const params: unknown[] = await resolveRouteParams(
|
|
338
|
-
controllerClass,
|
|
339
|
-
route.controllerMethod,
|
|
340
|
-
// eslint-disable-next-line typescript/no-unsafe-member-access, typescript/no-explicit-any
|
|
341
|
-
((controller as any)[route.controllerMethod] as Function).length,
|
|
342
|
-
context
|
|
343
|
-
);
|
|
344
|
-
|
|
345
|
-
// eslint-disable-next-line typescript/no-unsafe-call, typescript/no-explicit-any, typescript/no-unsafe-member-access
|
|
346
|
-
const result: unknown = await ((controller as any)[route.controllerMethod] as Function)(...params);
|
|
347
|
-
await this.returnResult(context.response, result, next, responses);
|
|
348
|
-
}
|
|
349
|
-
catch (error) {
|
|
350
|
-
next(error);
|
|
351
|
-
}
|
|
352
|
-
});
|
|
353
|
-
}) as RequestHandler;
|
|
354
|
-
return handler;
|
|
467
|
+
return async (context: HttpRequestContext, next: NextFunction) => {
|
|
468
|
+
try {
|
|
469
|
+
await this.authService.checkAccess(controllerClass, route.controllerMethod, context);
|
|
470
|
+
const controller: unknown = inject(controllerClass);
|
|
471
|
+
const params: unknown[] = await resolveRouteParams(
|
|
472
|
+
controllerClass,
|
|
473
|
+
route.controllerMethod,
|
|
474
|
+
// eslint-disable-next-line typescript/no-unsafe-member-access, typescript/no-explicit-any
|
|
475
|
+
((controller as any)[route.controllerMethod] as Function).length,
|
|
476
|
+
context
|
|
477
|
+
);
|
|
478
|
+
// eslint-disable-next-line typescript/no-unsafe-call, typescript/no-explicit-any, typescript/no-unsafe-member-access
|
|
479
|
+
const result: unknown = await ((controller as any)[route.controllerMethod] as Function)(...params);
|
|
480
|
+
await this.returnResult(context.response, result, next, responses);
|
|
481
|
+
}
|
|
482
|
+
catch (error) {
|
|
483
|
+
next(error);
|
|
484
|
+
}
|
|
485
|
+
};
|
|
355
486
|
}
|
|
356
487
|
|
|
357
488
|
private async returnResult(res: HttpResponse, result: unknown, next: NextFunction, responses: OpenApiResponse[]): Promise<void> {
|
|
@@ -173,7 +173,7 @@ export abstract class FsUtilities {
|
|
|
173
173
|
* Creates a file at the given path.
|
|
174
174
|
* @param p - The path of the new file to create.
|
|
175
175
|
* @param data - The data to write into the file. Can be a raw data string or an array of lines, which are joined by \n.
|
|
176
|
-
* @param recursive - Whether or not to recursively create the file.
|
|
176
|
+
* @param recursive - Whether or not to recursively create the file. Defaults to true.
|
|
177
177
|
*/
|
|
178
178
|
static async createFile(p: FsPath, data: string | string[], recursive: boolean = true): Promise<void> {
|
|
179
179
|
if (await this.exists(p)) {
|