zibri 2.4.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/application.d.ts.map +1 -1
- package/dist/cjs/application.js +8 -2
- package/dist/cjs/application.js.map +1 -1
- package/dist/cjs/auth/encryption/encryption-key.model.d.ts +5 -1
- package/dist/cjs/auth/encryption/encryption-key.model.d.ts.map +1 -1
- package/dist/cjs/auth/encryption/encryption-key.model.js +9 -1
- package/dist/cjs/auth/encryption/encryption-key.model.js.map +1 -1
- package/dist/cjs/auth/strategies/cookie/cookie-auth.auth-strategy.d.ts.map +1 -1
- package/dist/cjs/auth/strategies/cookie/cookie-auth.auth-strategy.js.map +1 -1
- package/dist/cjs/auth/strategies/jwt/jwt-credentials.model.d.ts +5 -1
- package/dist/cjs/auth/strategies/jwt/jwt-credentials.model.d.ts.map +1 -1
- package/dist/cjs/auth/strategies/jwt/jwt-credentials.model.js +9 -1
- package/dist/cjs/auth/strategies/jwt/jwt-credentials.model.js.map +1 -1
- package/dist/cjs/auth/strategies/jwt/jwt.auth-strategy.d.ts.map +1 -1
- package/dist/cjs/auth/strategies/jwt/jwt.auth-strategy.js +2 -1
- package/dist/cjs/auth/strategies/jwt/jwt.auth-strategy.js.map +1 -1
- package/dist/cjs/backup/backup-resource-entity.model.d.ts +5 -1
- package/dist/cjs/backup/backup-resource-entity.model.d.ts.map +1 -1
- package/dist/cjs/backup/backup-resource-entity.model.js +9 -1
- package/dist/cjs/backup/backup-resource-entity.model.js.map +1 -1
- package/dist/cjs/backup/backup.service.js +2 -2
- package/dist/cjs/backup/backup.service.js.map +1 -1
- package/dist/cjs/caching/cache/base-cache.model.js.map +1 -1
- package/dist/cjs/caching/cache/multi-tier.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-aside/read-aside.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-aside/write-around-read-aside.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-aside/write-behind-read-aside.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-aside/write-invalidate-read-aside-args-only.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-aside/write-invalidate-read-aside-with-result.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-aside/write-through-read-aside.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-through/read-through.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-through/write-around-read-through.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-through/write-behind-read-through.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-through/write-invalidate-read-through-args-only.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-through/write-invalidate-read-through-with-result.cache.js.map +1 -1
- package/dist/cjs/caching/cache/read-through/write-through-read-through.cache.js.map +1 -1
- package/dist/cjs/change-sets/change-set-repository.d.ts +5 -3
- package/dist/cjs/change-sets/change-set-repository.d.ts.map +1 -1
- package/dist/cjs/change-sets/change-set-repository.js +16 -16
- package/dist/cjs/change-sets/change-set-repository.js.map +1 -1
- package/dist/cjs/change-sets/models/change-set-entity.model.d.ts +2 -2
- package/dist/cjs/change-sets/models/change-set-entity.model.d.ts.map +1 -1
- package/dist/cjs/change-sets/models/change-set-entity.model.js +29 -1
- package/dist/cjs/change-sets/models/change-set-entity.model.js.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 +5 -1
- package/dist/cjs/change-sets/models/change.model.d.ts.map +1 -1
- package/dist/cjs/change-sets/models/change.model.js +9 -1
- package/dist/cjs/change-sets/models/change.model.js.map +1 -1
- package/dist/cjs/change-sets/models/soft-delete-entity.model.d.ts +2 -2
- package/dist/cjs/change-sets/models/soft-delete-entity.model.d.ts.map +1 -1
- package/dist/cjs/change-sets/models/soft-delete-entity.model.js +26 -0
- package/dist/cjs/change-sets/models/soft-delete-entity.model.js.map +1 -1
- package/dist/cjs/change-sets/soft-delete-repository.d.ts +6 -5
- package/dist/cjs/change-sets/soft-delete-repository.d.ts.map +1 -1
- package/dist/cjs/change-sets/soft-delete-repository.js +22 -6
- package/dist/cjs/change-sets/soft-delete-repository.js.map +1 -1
- package/dist/cjs/context/als.utilities.d.ts +3 -3
- package/dist/cjs/context/als.utilities.d.ts.map +1 -1
- package/dist/cjs/context/als.utilities.js.map +1 -1
- package/dist/cjs/context/cache/cache.context.d.ts +27 -0
- package/dist/cjs/context/cache/cache.context.d.ts.map +1 -0
- package/dist/cjs/context/cache/cache.context.js +61 -0
- package/dist/cjs/context/cache/cache.context.js.map +1 -0
- package/dist/cjs/data-source/data-sources/data-source-initialization.error.d.ts +7 -0
- package/dist/cjs/data-source/data-sources/data-source-initialization.error.d.ts.map +1 -0
- package/dist/cjs/data-source/data-sources/data-source-initialization.error.js +14 -0
- package/dist/cjs/data-source/data-sources/data-source-initialization.error.js.map +1 -0
- package/dist/cjs/data-source/data-sources/data-source.interface.d.ts +9 -1
- package/dist/cjs/data-source/data-sources/data-source.interface.d.ts.map +1 -1
- package/dist/cjs/data-source/data-sources/data-source.interface.js.map +1 -1
- package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.d.ts +44 -0
- package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.d.ts.map +1 -0
- package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.js +289 -0
- package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.js.map +1 -0
- package/dist/cjs/data-source/data-sources/sql-data-source.interface.d.ts +32 -0
- package/dist/cjs/data-source/data-sources/sql-data-source.interface.d.ts.map +1 -0
- package/dist/cjs/{entity/models/one-to-one-property-metadata.model.js → data-source/data-sources/sql-data-source.interface.js} +1 -1
- package/dist/cjs/data-source/data-sources/sql-data-source.interface.js.map +1 -0
- package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.d.ts +156 -0
- package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.d.ts.map +1 -0
- package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.js +378 -0
- package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.js.map +1 -0
- package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.d.ts +25 -0
- package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.d.ts.map +1 -0
- package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js +353 -0
- package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js.map +1 -0
- package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.d.ts +70 -0
- package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.d.ts.map +1 -0
- package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.js +248 -0
- package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.js.map +1 -0
- package/dist/cjs/data-source/models/options/count-options.model.d.ts +2 -7
- package/dist/cjs/data-source/models/options/count-options.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/options/delete-all-options.model.d.ts +2 -4
- package/dist/cjs/data-source/models/options/delete-all-options.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/options/find-all-options.model.d.ts +2 -2
- package/dist/cjs/data-source/models/options/find-all-options.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/options/find-by-id-options.model.d.ts +1 -6
- package/dist/cjs/data-source/models/options/find-by-id-options.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/options/find-one-options.model.d.ts +2 -11
- package/dist/cjs/data-source/models/options/find-one-options.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/options/update-all-options.model.d.ts +1 -7
- package/dist/cjs/data-source/models/options/update-all-options.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/options/update-by-id-options.model.d.ts +1 -7
- package/dist/cjs/data-source/models/options/update-by-id-options.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/array-where-filter.model.d.ts +142 -3
- package/dist/cjs/data-source/models/where/array-where-filter.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/base-where-filter.model.d.ts +18 -1
- package/dist/cjs/data-source/models/where/base-where-filter.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/boolean-where-filter.model.d.ts +4 -2
- package/dist/cjs/data-source/models/where/boolean-where-filter.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/date-where-filter.model.d.ts +8 -15
- package/dist/cjs/data-source/models/where/date-where-filter.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/number-where-filter.model.d.ts +8 -15
- package/dist/cjs/data-source/models/where/number-where-filter.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/object-where-filter.model.d.ts +52 -7
- package/dist/cjs/data-source/models/where/object-where-filter.model.d.ts.map +1 -1
- package/dist/cjs/data-source/models/where/string-where-filter.model.d.ts +8 -15
- 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 +46 -0
- package/dist/cjs/data-source/models/where/where-filter-keys.model.d.ts.map +1 -0
- package/dist/cjs/data-source/models/where/where-filter-keys.model.js +36 -0
- package/dist/cjs/data-source/models/where/where-filter-keys.model.js.map +1 -0
- package/dist/cjs/data-source/models/where/where-filter.model.d.ts +2 -2
- package/dist/cjs/data-source/models/where/where-filter.model.d.ts.map +1 -1
- package/dist/cjs/data-source/query-failed.error.js +27 -1
- package/dist/cjs/data-source/query-failed.error.js.map +1 -1
- package/dist/cjs/data-source/repository.d.ts +8 -3
- package/dist/cjs/data-source/repository.d.ts.map +1 -1
- package/dist/cjs/data-source/repository.js +42 -16
- package/dist/cjs/data-source/repository.js.map +1 -1
- package/dist/cjs/di/decorators/inject-repository.decorator.d.ts +2 -2
- package/dist/cjs/di/decorators/inject-repository.decorator.d.ts.map +1 -1
- package/dist/cjs/di/decorators/inject-repository.decorator.js.map +1 -1
- package/dist/cjs/di/default/zibri-di-tokens.default.d.ts +2 -2
- package/dist/cjs/di/default/zibri-di-tokens.default.d.ts.map +1 -1
- package/dist/cjs/di/default/zibri-di-tokens.default.js.map +1 -1
- package/dist/cjs/email/email.service.d.ts +2 -2
- package/dist/cjs/email/email.service.d.ts.map +1 -1
- package/dist/cjs/email/email.service.js +4 -6
- package/dist/cjs/email/email.service.js.map +1 -1
- package/dist/cjs/email/models/email.model.js +1 -1
- package/dist/cjs/email/models/email.model.js.map +1 -1
- package/dist/cjs/entity/decorators/entity.decorator.d.ts +28 -1
- package/dist/cjs/entity/decorators/entity.decorator.d.ts.map +1 -1
- package/dist/cjs/entity/decorators/entity.decorator.js +6 -3
- package/dist/cjs/entity/decorators/entity.decorator.js.map +1 -1
- package/dist/cjs/entity/decorators/property.decorator.d.ts +5 -8
- package/dist/cjs/entity/decorators/property.decorator.d.ts.map +1 -1
- package/dist/cjs/entity/decorators/property.decorator.js +34 -20
- package/dist/cjs/entity/decorators/property.decorator.js.map +1 -1
- package/dist/cjs/entity/entity-metadata-missing.error.d.ts +9 -0
- package/dist/cjs/entity/entity-metadata-missing.error.d.ts.map +1 -0
- package/dist/cjs/entity/entity-metadata-missing.error.js +17 -0
- package/dist/cjs/entity/entity-metadata-missing.error.js.map +1 -0
- package/dist/cjs/entity/models/base-relation-metadata.model.d.ts +1 -1
- package/dist/cjs/entity/models/belongs-to-one-property-metadata.model.d.ts +28 -0
- package/dist/cjs/entity/models/belongs-to-one-property-metadata.model.d.ts.map +1 -0
- package/dist/cjs/entity/models/belongs-to-one-property-metadata.model.js +3 -0
- package/dist/cjs/entity/models/belongs-to-one-property-metadata.model.js.map +1 -0
- package/dist/cjs/entity/models/has-one-property-metadata.model.d.ts +18 -0
- package/dist/cjs/entity/models/has-one-property-metadata.model.d.ts.map +1 -0
- package/dist/{esm/entity/models/one-to-one-property-metadata.model.js → cjs/entity/models/has-one-property-metadata.model.js} +1 -1
- package/dist/cjs/entity/models/has-one-property-metadata.model.js.map +1 -0
- package/dist/cjs/entity/models/many-to-many-property-metadata.model.d.ts +3 -3
- package/dist/cjs/entity/models/many-to-many-property-metadata.model.d.ts.map +1 -1
- package/dist/cjs/entity/models/many-to-one-property-metadata.model.d.ts +11 -1
- package/dist/cjs/entity/models/many-to-one-property-metadata.model.d.ts.map +1 -1
- package/dist/cjs/entity/models/relation.enum.d.ts +2 -1
- package/dist/cjs/entity/models/relation.enum.d.ts.map +1 -1
- package/dist/cjs/entity/models/relation.enum.js +2 -1
- package/dist/cjs/entity/models/relation.enum.js.map +1 -1
- package/dist/cjs/entity/partial-class.model.js +1 -1
- package/dist/cjs/entity/partial-class.model.js.map +1 -1
- package/dist/cjs/event/event-cleanup.cron-job.d.ts.map +1 -1
- package/dist/cjs/event/event-cleanup.cron-job.js +4 -6
- package/dist/cjs/event/event-cleanup.cron-job.js.map +1 -1
- package/dist/cjs/event/event-subscriber-run.model.d.ts +6 -8
- package/dist/cjs/event/event-subscriber-run.model.d.ts.map +1 -1
- package/dist/cjs/event/event-subscriber-run.model.js +10 -17
- package/dist/cjs/event/event-subscriber-run.model.js.map +1 -1
- package/dist/cjs/event/event.model.js +1 -1
- package/dist/cjs/event/event.model.js.map +1 -1
- package/dist/cjs/event/event.service.d.ts.map +1 -1
- package/dist/cjs/event/event.service.js +6 -3
- package/dist/cjs/event/event.service.js.map +1 -1
- package/dist/cjs/global/model-registry/default-descriptor.d.ts.map +1 -1
- package/dist/cjs/global/model-registry/default-descriptor.js +2 -1
- package/dist/cjs/global/model-registry/default-descriptor.js.map +1 -1
- package/dist/cjs/global/model-registry/encryption-descriptor.d.ts.map +1 -1
- package/dist/cjs/global/model-registry/encryption-descriptor.js +2 -1
- package/dist/cjs/global/model-registry/encryption-descriptor.js.map +1 -1
- package/dist/cjs/global/model-registry/exclude-descriptor.d.ts.map +1 -1
- package/dist/cjs/global/model-registry/exclude-descriptor.js +2 -1
- package/dist/cjs/global/model-registry/exclude-descriptor.js.map +1 -1
- package/dist/cjs/global/model-registry/hash-descriptor.d.ts.map +1 -1
- package/dist/cjs/global/model-registry/hash-descriptor.js +2 -1
- package/dist/cjs/global/model-registry/hash-descriptor.js.map +1 -1
- package/dist/cjs/index.d.ts +12 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +12 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/logging/log-context.model.d.ts +2 -27
- package/dist/cjs/logging/log-context.model.d.ts.map +1 -1
- package/dist/cjs/logging/log-context.model.js +3 -49
- package/dist/cjs/logging/log-context.model.js.map +1 -1
- package/dist/cjs/open-api/open-api.service.d.ts.map +1 -1
- package/dist/cjs/open-api/open-api.service.js +20 -11
- package/dist/cjs/open-api/open-api.service.js.map +1 -1
- package/dist/cjs/parsing/form-data/form-data.body-parser.d.ts.map +1 -1
- package/dist/cjs/parsing/form-data/form-data.body-parser.js +2 -1
- package/dist/cjs/parsing/form-data/form-data.body-parser.js.map +1 -1
- package/dist/cjs/parsing/functions/parse-boolean.function.d.ts.map +1 -1
- package/dist/cjs/parsing/functions/parse-boolean.function.js.map +1 -1
- package/dist/cjs/parsing/functions/parse-object.function.d.ts.map +1 -1
- package/dist/cjs/parsing/functions/parse-object.function.js +2 -1
- package/dist/cjs/parsing/functions/parse-object.function.js.map +1 -1
- package/dist/cjs/parsing/parser.d.ts.map +1 -1
- package/dist/cjs/parsing/parser.js +2 -1
- package/dist/cjs/parsing/parser.js.map +1 -1
- package/dist/cjs/routing/decorators/body.decorator.js +2 -1
- package/dist/cjs/routing/decorators/body.decorator.js.map +1 -1
- package/dist/cjs/routing/resolve-route-params.function.js +1 -1
- package/dist/cjs/routing/resolve-route-params.function.js.map +1 -1
- package/dist/cjs/routing/router.d.ts.map +1 -1
- package/dist/cjs/routing/router.js +38 -2
- package/dist/cjs/routing/router.js.map +1 -1
- package/dist/cjs/utilities/metadata-injection-keys.enum.d.ts +1 -0
- package/dist/cjs/utilities/metadata-injection-keys.enum.d.ts.map +1 -1
- package/dist/cjs/utilities/metadata-injection-keys.enum.js +1 -0
- package/dist/cjs/utilities/metadata-injection-keys.enum.js.map +1 -1
- package/dist/cjs/utilities/typeorm.utilities.d.ts +39 -0
- package/dist/cjs/utilities/typeorm.utilities.d.ts.map +1 -0
- package/dist/cjs/utilities/typeorm.utilities.js +47 -0
- package/dist/cjs/utilities/typeorm.utilities.js.map +1 -0
- package/dist/cjs/validation/validation-problem.model.d.ts.map +1 -1
- package/dist/cjs/validation/validation-problem.model.js +4 -7
- package/dist/cjs/validation/validation-problem.model.js.map +1 -1
- package/dist/cjs/validation/validation.service.d.ts.map +1 -1
- package/dist/cjs/validation/validation.service.js +6 -4
- package/dist/cjs/validation/validation.service.js.map +1 -1
- package/dist/cjs/websocket/models/websocket-message.model.js +1 -1
- package/dist/cjs/websocket/models/websocket-message.model.js.map +1 -1
- package/dist/cjs/websocket/models/websocket-request.model.d.ts +5 -11
- package/dist/cjs/websocket/models/websocket-request.model.d.ts.map +1 -1
- package/dist/cjs/websocket/models/websocket-request.model.js.map +1 -1
- package/dist/cjs/websocket/services/websocket.service.d.ts.map +1 -1
- package/dist/cjs/websocket/services/websocket.service.js +1 -2
- package/dist/cjs/websocket/services/websocket.service.js.map +1 -1
- package/dist/esm/application.js +8 -2
- package/dist/esm/application.js.map +1 -1
- package/dist/esm/auth/encryption/encryption-key.model.js +9 -1
- package/dist/esm/auth/encryption/encryption-key.model.js.map +1 -1
- package/dist/esm/auth/strategies/cookie/cookie-auth.auth-strategy.js.map +1 -1
- package/dist/esm/auth/strategies/jwt/jwt-credentials.model.js +9 -1
- package/dist/esm/auth/strategies/jwt/jwt-credentials.model.js.map +1 -1
- package/dist/esm/auth/strategies/jwt/jwt.auth-strategy.js +2 -1
- package/dist/esm/auth/strategies/jwt/jwt.auth-strategy.js.map +1 -1
- package/dist/esm/backup/backup-resource-entity.model.js +9 -1
- package/dist/esm/backup/backup-resource-entity.model.js.map +1 -1
- package/dist/esm/backup/backup.service.js +2 -2
- package/dist/esm/backup/backup.service.js.map +1 -1
- package/dist/esm/caching/cache/base-cache.model.js.map +1 -1
- package/dist/esm/caching/cache/multi-tier.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-aside/read-aside.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-aside/write-around-read-aside.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-aside/write-behind-read-aside.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-aside/write-invalidate-read-aside-args-only.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-aside/write-invalidate-read-aside-with-result.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-aside/write-through-read-aside.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-through/read-through.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-through/write-around-read-through.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-through/write-behind-read-through.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-through/write-invalidate-read-through-args-only.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-through/write-invalidate-read-through-with-result.cache.js.map +1 -1
- package/dist/esm/caching/cache/read-through/write-through-read-through.cache.js.map +1 -1
- package/dist/esm/change-sets/change-set-repository.js +16 -16
- package/dist/esm/change-sets/change-set-repository.js.map +1 -1
- package/dist/esm/change-sets/models/change-set-entity.model.js +29 -1
- package/dist/esm/change-sets/models/change-set-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 +9 -1
- package/dist/esm/change-sets/models/change.model.js.map +1 -1
- package/dist/esm/change-sets/models/soft-delete-entity.model.js +26 -0
- package/dist/esm/change-sets/models/soft-delete-entity.model.js.map +1 -1
- package/dist/esm/change-sets/soft-delete-repository.js +22 -6
- package/dist/esm/change-sets/soft-delete-repository.js.map +1 -1
- package/dist/esm/context/als.utilities.js.map +1 -1
- package/dist/esm/context/cache/cache.context.js +61 -0
- package/dist/esm/context/cache/cache.context.js.map +1 -0
- package/dist/esm/data-source/data-sources/data-source-initialization.error.js +14 -0
- package/dist/esm/data-source/data-sources/data-source-initialization.error.js.map +1 -0
- package/dist/esm/data-source/data-sources/data-source.interface.js.map +1 -1
- package/dist/esm/data-source/data-sources/postgres-typeorm-data-source.model.js +289 -0
- package/dist/esm/data-source/data-sources/postgres-typeorm-data-source.model.js.map +1 -0
- package/dist/esm/data-source/data-sources/sql-data-source.interface.js +3 -0
- package/dist/esm/data-source/data-sources/sql-data-source.interface.js.map +1 -0
- package/dist/esm/data-source/data-sources/typeorm-base-data-source.model.js +378 -0
- package/dist/esm/data-source/data-sources/typeorm-base-data-source.model.js.map +1 -0
- package/dist/esm/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js +353 -0
- package/dist/esm/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js.map +1 -0
- package/dist/esm/data-source/data-sources/where-converter/typeorm-where-filter.converter.js +248 -0
- package/dist/esm/data-source/data-sources/where-converter/typeorm-where-filter.converter.js.map +1 -0
- package/dist/esm/data-source/models/where/where-filter-keys.model.js +36 -0
- package/dist/esm/data-source/models/where/where-filter-keys.model.js.map +1 -0
- package/dist/esm/data-source/query-failed.error.js +27 -1
- package/dist/esm/data-source/query-failed.error.js.map +1 -1
- package/dist/esm/data-source/repository.js +42 -16
- package/dist/esm/data-source/repository.js.map +1 -1
- package/dist/esm/di/decorators/inject-repository.decorator.js.map +1 -1
- package/dist/esm/di/default/zibri-di-tokens.default.js.map +1 -1
- package/dist/esm/email/email.service.js +4 -6
- package/dist/esm/email/email.service.js.map +1 -1
- package/dist/esm/email/models/email.model.js +1 -1
- package/dist/esm/email/models/email.model.js.map +1 -1
- package/dist/esm/entity/decorators/entity.decorator.js +6 -3
- package/dist/esm/entity/decorators/entity.decorator.js.map +1 -1
- package/dist/esm/entity/decorators/property.decorator.js +34 -20
- package/dist/esm/entity/decorators/property.decorator.js.map +1 -1
- package/dist/esm/entity/entity-metadata-missing.error.js +17 -0
- package/dist/esm/entity/entity-metadata-missing.error.js.map +1 -0
- package/dist/esm/entity/models/belongs-to-one-property-metadata.model.js +3 -0
- package/dist/esm/entity/models/belongs-to-one-property-metadata.model.js.map +1 -0
- package/dist/esm/entity/models/has-one-property-metadata.model.js +3 -0
- package/dist/esm/entity/models/has-one-property-metadata.model.js.map +1 -0
- package/dist/esm/entity/models/relation.enum.js +2 -1
- package/dist/esm/entity/models/relation.enum.js.map +1 -1
- package/dist/esm/entity/partial-class.model.js +1 -1
- package/dist/esm/entity/partial-class.model.js.map +1 -1
- package/dist/esm/event/event-cleanup.cron-job.js +4 -6
- package/dist/esm/event/event-cleanup.cron-job.js.map +1 -1
- package/dist/esm/event/event-subscriber-run.model.js +10 -17
- package/dist/esm/event/event-subscriber-run.model.js.map +1 -1
- package/dist/esm/event/event.model.js +1 -1
- package/dist/esm/event/event.model.js.map +1 -1
- package/dist/esm/event/event.service.js +6 -3
- package/dist/esm/event/event.service.js.map +1 -1
- package/dist/esm/global/model-registry/default-descriptor.js +2 -1
- package/dist/esm/global/model-registry/default-descriptor.js.map +1 -1
- package/dist/esm/global/model-registry/encryption-descriptor.js +2 -1
- package/dist/esm/global/model-registry/encryption-descriptor.js.map +1 -1
- package/dist/esm/global/model-registry/exclude-descriptor.js +2 -1
- package/dist/esm/global/model-registry/exclude-descriptor.js.map +1 -1
- package/dist/esm/global/model-registry/hash-descriptor.js +2 -1
- package/dist/esm/global/model-registry/hash-descriptor.js.map +1 -1
- package/dist/esm/index.js +12 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/logging/log-context.model.js +3 -49
- package/dist/esm/logging/log-context.model.js.map +1 -1
- package/dist/esm/open-api/open-api.service.js +20 -11
- package/dist/esm/open-api/open-api.service.js.map +1 -1
- package/dist/esm/parsing/form-data/form-data.body-parser.js +2 -1
- package/dist/esm/parsing/form-data/form-data.body-parser.js.map +1 -1
- package/dist/esm/parsing/functions/parse-boolean.function.js.map +1 -1
- package/dist/esm/parsing/functions/parse-object.function.js +2 -1
- package/dist/esm/parsing/functions/parse-object.function.js.map +1 -1
- package/dist/esm/parsing/parser.js +2 -1
- package/dist/esm/parsing/parser.js.map +1 -1
- package/dist/esm/routing/decorators/body.decorator.js +2 -1
- package/dist/esm/routing/decorators/body.decorator.js.map +1 -1
- package/dist/esm/routing/resolve-route-params.function.js +1 -1
- package/dist/esm/routing/resolve-route-params.function.js.map +1 -1
- package/dist/esm/routing/router.js +38 -2
- package/dist/esm/routing/router.js.map +1 -1
- package/dist/esm/utilities/metadata-injection-keys.enum.js +1 -0
- package/dist/esm/utilities/metadata-injection-keys.enum.js.map +1 -1
- package/dist/esm/utilities/typeorm.utilities.js +47 -0
- package/dist/esm/utilities/typeorm.utilities.js.map +1 -0
- package/dist/esm/validation/validation-problem.model.js +4 -7
- package/dist/esm/validation/validation-problem.model.js.map +1 -1
- package/dist/esm/validation/validation.service.js +6 -4
- package/dist/esm/validation/validation.service.js.map +1 -1
- package/dist/esm/websocket/models/websocket-message.model.js +1 -1
- package/dist/esm/websocket/models/websocket-message.model.js.map +1 -1
- package/dist/esm/websocket/models/websocket-request.model.js.map +1 -1
- package/dist/esm/websocket/services/websocket.service.js +1 -2
- package/dist/esm/websocket/services/websocket.service.js.map +1 -1
- package/package.json +9 -9
- package/src/__testing__/mocks/entities/child.entity.ts +4 -1
- package/src/__testing__/mocks/entities/company.entity.ts +5 -2
- package/src/__testing__/mocks/entities/profile.entity.ts +5 -2
- package/src/__testing__/mocks/entities/role.entity.ts +1 -1
- package/src/__testing__/mocks/entities/user.entity.ts +1 -1
- package/src/__testing__/test-server/create-test-data-source.function.ts +5 -5
- package/src/__testing__/test-server/start-test-server.function.ts +8 -6
- package/src/__testing__/test-server/user-repository.ts +4 -3
- package/src/application.ts +8 -2
- package/src/auth/2fa/two-factor.service.test.ts +151 -0
- package/src/auth/auth.service.test.ts +381 -0
- package/src/auth/encryption/encryption-key.model.ts +7 -2
- package/src/auth/strategies/cookie/cookie-auth.auth-strategy.ts +3 -2
- package/src/auth/strategies/jwt/jwt-credentials.model.ts +7 -1
- package/src/auth/strategies/jwt/jwt.auth-strategy.ts +5 -3
- package/src/backup/backup-resource-entity.model.ts +7 -2
- package/src/backup/backup-service.test.ts +1 -1
- package/src/backup/backup.service.ts +1 -1
- package/src/caching/cache/base-cache.model.ts +3 -3
- package/src/caching/cache/multi-tier.cache.ts +3 -3
- package/src/caching/cache/read-aside/read-aside.cache.ts +2 -2
- package/src/caching/cache/read-aside/write-around-read-aside.cache.ts +2 -2
- package/src/caching/cache/read-aside/write-behind-read-aside.cache.ts +2 -2
- package/src/caching/cache/read-aside/write-invalidate-read-aside-args-only.cache.ts +2 -2
- package/src/caching/cache/read-aside/write-invalidate-read-aside-with-result.cache.ts +2 -2
- package/src/caching/cache/read-aside/write-through-read-aside.cache.ts +2 -2
- package/src/caching/cache/read-through/read-through.cache.ts +2 -2
- package/src/caching/cache/read-through/write-around-read-through.cache.ts +2 -2
- package/src/caching/cache/read-through/write-behind-read-through.cache.ts +2 -2
- package/src/caching/cache/read-through/write-invalidate-read-through-args-only.cache.ts +2 -2
- package/src/caching/cache/read-through/write-invalidate-read-through-with-result.cache.ts +2 -2
- package/src/caching/cache/read-through/write-through-read-through.cache.ts +2 -2
- package/src/change-sets/change-set-repository.test.ts +317 -0
- package/src/change-sets/change-set-repository.ts +17 -17
- package/src/change-sets/models/change-set-entity.model.ts +6 -4
- package/src/change-sets/models/change-set.model.ts +1 -1
- package/src/change-sets/models/change.model.ts +7 -2
- package/src/change-sets/models/soft-delete-entity.model.ts +5 -3
- package/src/change-sets/soft-delete-repository.test.ts +326 -0
- package/src/change-sets/soft-delete-repository.ts +29 -10
- package/src/context/als.utilities.ts +5 -5
- package/src/context/cache/cache.context.ts +33 -0
- package/src/cron/cron.test.ts +421 -0
- package/src/data-source/array-where-filter.test.ts +332 -0
- package/src/data-source/data-sources/data-source-initialization.error.ts +9 -0
- package/src/data-source/data-sources/data-source.interface.ts +14 -1
- package/src/data-source/data-sources/postgres-typeorm-data-source.model.ts +330 -0
- package/src/data-source/data-sources/sql-data-source.interface.ts +35 -0
- package/src/data-source/data-sources/typeorm-base-data-source.model.ts +544 -0
- package/src/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.ts +451 -0
- package/src/data-source/data-sources/where-converter/typeorm-where-filter.converter.ts +376 -0
- package/src/data-source/exclude-property.test.ts +4 -1
- package/src/data-source/hooks/hooks.test.ts +268 -0
- package/src/data-source/migration/migration.test.ts +4 -3
- package/src/data-source/models/options/count-options.model.ts +2 -7
- package/src/data-source/models/options/delete-all-options.model.ts +2 -4
- package/src/data-source/models/options/find-all-options.model.ts +2 -2
- package/src/data-source/models/options/find-by-id-options.model.ts +1 -6
- package/src/data-source/models/options/find-one-options.model.ts +2 -11
- package/src/data-source/models/options/update-all-options.model.ts +2 -5
- package/src/data-source/models/options/update-by-id-options.model.ts +2 -5
- package/src/data-source/models/where/array-where-filter.model.ts +147 -5
- package/src/data-source/models/where/base-where-filter.model.ts +19 -1
- package/src/data-source/models/where/boolean-where-filter.model.ts +7 -2
- package/src/data-source/models/where/date-where-filter.model.ts +9 -16
- package/src/data-source/models/where/number-where-filter.model.ts +9 -16
- package/src/data-source/models/where/object-where-filter.model.ts +66 -7
- package/src/data-source/models/where/string-where-filter.model.ts +9 -16
- package/src/data-source/models/where/where-filter-keys.model.ts +88 -0
- package/src/data-source/models/where/where-filter-to-find-options-where-function.test.ts +35 -13
- package/src/data-source/models/where/where-filter.model.ts +7 -4
- package/src/data-source/nested-where-filter.test.ts +344 -0
- package/src/data-source/query-failed.error.ts +38 -1
- package/src/data-source/repository-relation-pitfalls.test.ts +232 -0
- package/src/data-source/repository.test.ts +274 -37
- package/src/data-source/repository.ts +50 -16
- package/src/data-source/transaction/transaction.test.ts +1 -1
- package/src/data-source/where-filter.test.ts +479 -0
- package/src/di/decorators/inject-repository.decorator.ts +3 -2
- package/src/di/default/zibri-di-tokens.default.ts +2 -2
- package/src/email/email.service.test.ts +382 -0
- package/src/email/email.service.ts +4 -5
- package/src/email/models/email.model.ts +1 -1
- package/src/entity/decorators/entity.decorator.ts +44 -5
- package/src/entity/decorators/property.decorator.ts +54 -36
- package/src/entity/entity-metadata-missing.error.ts +15 -0
- package/src/entity/models/base-relation-metadata.model.ts +1 -1
- package/src/entity/models/belongs-to-one-property-metadata.model.ts +34 -0
- package/src/entity/models/has-one-property-metadata.model.ts +20 -0
- package/src/entity/models/many-to-many-property-metadata.model.ts +3 -3
- package/src/entity/models/many-to-one-property-metadata.model.ts +17 -3
- package/src/entity/models/relation.enum.ts +2 -1
- package/src/entity/partial-class.model.ts +1 -1
- package/src/event/event-cleanup.cron-job.ts +4 -6
- package/src/event/event-subscriber-run.model.ts +8 -9
- package/src/event/event.model.ts +1 -1
- package/src/event/event.service.ts +6 -3
- package/src/global/model-registry/default-descriptor.ts +2 -1
- package/src/global/model-registry/encryption-descriptor.ts +2 -1
- package/src/global/model-registry/exclude-descriptor.ts +2 -1
- package/src/global/model-registry/hash-descriptor.ts +2 -1
- package/src/index.ts +15 -3
- package/src/logging/log-context.model.ts +3 -34
- package/src/open-api/open-api.service.ts +32 -13
- package/src/parsing/form-data/form-data.body-parser.ts +2 -1
- package/src/parsing/functions/parse-boolean.function.ts +0 -1
- package/src/parsing/functions/parse-object.function.ts +2 -1
- package/src/parsing/parser.ts +2 -1
- package/src/routing/decorators/body.decorator.ts +2 -1
- package/src/routing/resolve-route-params.function.ts +1 -1
- package/src/routing/router.ts +41 -7
- package/src/utilities/metadata-injection-keys.enum.ts +1 -0
- package/src/utilities/typeorm.utilities.ts +75 -0
- package/src/validation/validation-problem.model.ts +7 -9
- package/src/validation/validation.service.ts +6 -4
- package/src/websocket/models/websocket-message.model.ts +1 -1
- package/src/websocket/models/websocket-request.model.ts +17 -9
- package/src/websocket/services/websocket.service.ts +1 -2
- package/dist/cjs/data-source/data-sources/postgres-data-source.model.d.ts +0 -129
- package/dist/cjs/data-source/data-sources/postgres-data-source.model.d.ts.map +0 -1
- package/dist/cjs/data-source/data-sources/postgres-data-source.model.js +0 -534
- package/dist/cjs/data-source/data-sources/postgres-data-source.model.js.map +0 -1
- package/dist/cjs/data-source/models/where/where-filter-to-find-options-where.function.d.ts +0 -11
- package/dist/cjs/data-source/models/where/where-filter-to-find-options-where.function.d.ts.map +0 -1
- package/dist/cjs/data-source/models/where/where-filter-to-find-options-where.function.js +0 -229
- package/dist/cjs/data-source/models/where/where-filter-to-find-options-where.function.js.map +0 -1
- package/dist/cjs/entity/models/one-to-one-property-metadata.model.d.ts +0 -30
- package/dist/cjs/entity/models/one-to-one-property-metadata.model.d.ts.map +0 -1
- package/dist/cjs/entity/models/one-to-one-property-metadata.model.js.map +0 -1
- package/dist/esm/data-source/data-sources/postgres-data-source.model.js +0 -534
- package/dist/esm/data-source/data-sources/postgres-data-source.model.js.map +0 -1
- package/dist/esm/data-source/models/where/where-filter-to-find-options-where.function.js +0 -229
- package/dist/esm/data-source/models/where/where-filter-to-find-options-where.function.js.map +0 -1
- package/dist/esm/entity/models/one-to-one-property-metadata.model.js.map +0 -1
- package/src/data-source/data-sources/postgres-data-source.model.ts +0 -675
- package/src/data-source/models/where/where-filter-to-find-options-where.function.ts +0 -307
- package/src/entity/models/one-to-one-property-metadata.model.ts +0 -35
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
import { Readable } from 'node:stream';
|
|
2
|
+
|
|
3
|
+
import { EntitySchema, EntitySchemaColumnOptions, EntitySchemaRelationOptions, QueryRunner, Table, TableColumn, TableColumnOptions, DataSource as TODataSource, EntityMetadata as TOEntityMetadata, Repository as TORepository, FindOptionsWhere as ToFindOptionsWhere } from 'typeorm';
|
|
4
|
+
import { ColumnMetadata } from 'typeorm/metadata/ColumnMetadata.js';
|
|
5
|
+
|
|
6
|
+
import { DataSourceInitializationError } from './data-source-initialization.error';
|
|
7
|
+
import { DataSourceInterface, IsolationLevel, RepositoryTypeForEntity } from './data-source.interface';
|
|
8
|
+
import { TypeOrmWhereFilterConverter } from './where-converter/typeorm-where-filter.converter';
|
|
9
|
+
import { type AuthServiceInterface } from '../../auth/auth-service.interface';
|
|
10
|
+
import { ChangeSetRepository } from '../../change-sets/change-set-repository';
|
|
11
|
+
import { ChangeSetEntity, isChangeSetEntityNewable } from '../../change-sets/models/change-set-entity.model';
|
|
12
|
+
import { ChangeSet } from '../../change-sets/models/change-set.model';
|
|
13
|
+
import { isSoftDeleteEntityNewable, SoftDeleteEntity } from '../../change-sets/models/soft-delete-entity.model';
|
|
14
|
+
import { SoftDeleteRepository } from '../../change-sets/soft-delete-repository';
|
|
15
|
+
import { repositoryTokenFor } from '../../di/decorators/inject-repository.decorator';
|
|
16
|
+
import { Inject } from '../../di/decorators/inject.decorator';
|
|
17
|
+
import { ZIBRI_DI_TOKENS } from '../../di/default/zibri-di-tokens.default';
|
|
18
|
+
import { inject } from '../../di/inject.function';
|
|
19
|
+
import { register } from '../../di/register.function';
|
|
20
|
+
import { BaseEntity } from '../../entity/base-entity.model';
|
|
21
|
+
import { EntityMetadata } from '../../entity/decorators/entity.decorator';
|
|
22
|
+
import { PropertyMetadata, PropertyMetadataInput, RelationMetadata } from '../../entity/decorators/property.decorator';
|
|
23
|
+
import { EntityMetadataMissingError } from '../../entity/entity-metadata-missing.error';
|
|
24
|
+
import { FilePropertyMetadata } from '../../entity/models/file-property-metadata.model';
|
|
25
|
+
import { Relation } from '../../entity/models/relation.enum';
|
|
26
|
+
import { GlobalRegistry } from '../../global/global-registry';
|
|
27
|
+
import { type LoggerInterface } from '../../logging/logger.interface';
|
|
28
|
+
import { ExcludeStrict } from '../../types/exclude-strict.type';
|
|
29
|
+
import { Newable } from '../../types/newable.type';
|
|
30
|
+
import { OmitStrict } from '../../types/omit-strict.type';
|
|
31
|
+
import { Version } from '../../types/version.type';
|
|
32
|
+
import { compareVersion } from '../../utilities/compare-versions.function';
|
|
33
|
+
import { MetadataUtilities } from '../../utilities/metadata.utilities';
|
|
34
|
+
import { ObjectUtilities } from '../../utilities/object.utilities';
|
|
35
|
+
import { TypeOrmUtilities } from '../../utilities/typeorm.utilities';
|
|
36
|
+
import { getDefaultBeforeReturnHook, getDefaultBeforeSaveHook } from '../hooks/hooks.default';
|
|
37
|
+
import { MigrationEntity } from '../migration/migration-entity.model';
|
|
38
|
+
import { Migration } from '../migration/migration.model';
|
|
39
|
+
import { ColumnType } from '../models/column-type.model';
|
|
40
|
+
import { DataSourceOptions } from '../models/data-source-options.model';
|
|
41
|
+
import { Where, WhereFilter } from '../models/where/where-filter.model';
|
|
42
|
+
import { Repository } from '../repository';
|
|
43
|
+
import { Transaction } from '../transaction/transaction.model';
|
|
44
|
+
import { TypeOrmTransaction } from '../transaction/typeorm-transaction.model';
|
|
45
|
+
|
|
46
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
47
|
+
export type MigrationWithName = { migration: Migration, name: string };
|
|
48
|
+
|
|
49
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
50
|
+
export type ToColumnMappableTypes = ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity>>['type'];
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Base data source implementation of zibri.
|
|
54
|
+
* Uses typeorm under the hood.
|
|
55
|
+
*/
|
|
56
|
+
export abstract class TypeOrmBaseDataSource<TOptions extends DataSourceOptions> implements DataSourceInterface {
|
|
57
|
+
abstract readonly entities: Newable<BaseEntity>[];
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The type of the data source.
|
|
61
|
+
*/
|
|
62
|
+
protected abstract readonly type: TOptions['type'];
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Converter responsible for transforming a Zibri WhereFilter into a TypeORM FindOptionsWhere.
|
|
66
|
+
*/
|
|
67
|
+
protected abstract whereFilterConverter: TypeOrmWhereFilterConverter | undefined;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The configuration options of the data source.
|
|
71
|
+
*/
|
|
72
|
+
readonly options: Partial<OmitStrict<TOptions, 'type' | 'entities'>> = {};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The default configuration options of the data source.
|
|
76
|
+
*/
|
|
77
|
+
protected abstract readonly defaultOptions: OmitStrict<TOptions, 'type' | 'entities' | 'synchronize'>;
|
|
78
|
+
|
|
79
|
+
// eslint-disable-next-line jsdoc/require-returns
|
|
80
|
+
/**
|
|
81
|
+
* Combination of the default and user provided options.
|
|
82
|
+
*/
|
|
83
|
+
protected get fullOptions(): OmitStrict<TOptions, 'type' | 'entities' | 'synchronize'> {
|
|
84
|
+
return {
|
|
85
|
+
...this.defaultOptions,
|
|
86
|
+
...this.options
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
91
|
+
readonly migrations: Newable<Migration>[] = [];
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The internal typeorm data source.
|
|
95
|
+
*/
|
|
96
|
+
protected ds?: TODataSource;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Mapping from a Zibri property type to a typeorm column type.
|
|
100
|
+
*/
|
|
101
|
+
protected readonly columnTypeMapping: Partial<Record<ToColumnMappableTypes, ColumnType>> = {};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Default mapping from a Zibri property type to a typeorm column type.
|
|
105
|
+
*/
|
|
106
|
+
protected abstract readonly defaultColumnTypeMapping: Record<ToColumnMappableTypes, ColumnType>;
|
|
107
|
+
|
|
108
|
+
// eslint-disable-next-line jsdoc/require-returns
|
|
109
|
+
/**
|
|
110
|
+
* Combination of the default and user provided column type mapping.
|
|
111
|
+
*/
|
|
112
|
+
protected get fullColumnTypeMapping(): Record<ToColumnMappableTypes, ColumnType> {
|
|
113
|
+
return {
|
|
114
|
+
...this.defaultColumnTypeMapping,
|
|
115
|
+
...this.columnTypeMapping
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private readonly repositories: Map<Newable<BaseEntity>, Repository<BaseEntity>> = new Map();
|
|
120
|
+
|
|
121
|
+
constructor(
|
|
122
|
+
@Inject(ZIBRI_DI_TOKENS.LOGGER)
|
|
123
|
+
protected readonly logger: LoggerInterface,
|
|
124
|
+
@Inject(ZIBRI_DI_TOKENS.AUTH_SERVICE)
|
|
125
|
+
protected readonly authService: AuthServiceInterface
|
|
126
|
+
) {}
|
|
127
|
+
|
|
128
|
+
abstract createBackupData(): Readable;
|
|
129
|
+
abstract restoreBackup(backupData: Readable): void | Promise<void>;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Transforms the given Zibri where filter to typeorm's FindOptionsWhere.
|
|
133
|
+
* @param filter - The filter to transform.
|
|
134
|
+
* @param entityClass - The entity class that the where filter is for.
|
|
135
|
+
* @returns TypeOrm's FindOptionsWhere.
|
|
136
|
+
* @throws When the data source hasn't been initialized yet.
|
|
137
|
+
*/
|
|
138
|
+
whereFilterToFindOptionsWhere<T extends object>(
|
|
139
|
+
filter: Where<T>,
|
|
140
|
+
entityClass: Newable<T>
|
|
141
|
+
): Where<T> extends WhereFilter<T>[] ? ToFindOptionsWhere<T>[] : ToFindOptionsWhere<T> {
|
|
142
|
+
if (!this.whereFilterConverter) {
|
|
143
|
+
throw new Error('The data source needs to be initialized before it can be used.');
|
|
144
|
+
}
|
|
145
|
+
return this.whereFilterConverter.convert(filter, entityClass) as Where<T> extends WhereFilter<T>[]
|
|
146
|
+
? ToFindOptionsWhere<T>[]
|
|
147
|
+
: ToFindOptionsWhere<T>;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
151
|
+
async init(): Promise<void> {
|
|
152
|
+
if (this.ds) {
|
|
153
|
+
throw new Error('The data source has already been initialized.');
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
await this.validateOptions(this.fullOptions);
|
|
157
|
+
|
|
158
|
+
for (const entityClass of this.entities) {
|
|
159
|
+
register({
|
|
160
|
+
token: repositoryTokenFor(entityClass),
|
|
161
|
+
useFactory: () => this.getRepository(entityClass)
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const schemas: EntitySchema[] = this.getEntitySchemas();
|
|
166
|
+
this.ds = new TODataSource({
|
|
167
|
+
...this.fullOptions,
|
|
168
|
+
entities: schemas,
|
|
169
|
+
type: this.type,
|
|
170
|
+
synchronize: false
|
|
171
|
+
} as DataSourceOptions);
|
|
172
|
+
await this.ds.initialize();
|
|
173
|
+
|
|
174
|
+
this.beforeMigrations();
|
|
175
|
+
|
|
176
|
+
await this.runMigrations();
|
|
177
|
+
|
|
178
|
+
// Only skip if synchronize has been explicitly set to false
|
|
179
|
+
if (this.options.synchronize === false) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
await this.ds.synchronize();
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
protected abstract beforeMigrations(): void;
|
|
187
|
+
|
|
188
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
189
|
+
async shutDown(): Promise<void> {
|
|
190
|
+
await this.ds?.destroy();
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
194
|
+
async startTransaction(isolationLevel?: IsolationLevel): Promise<Transaction> {
|
|
195
|
+
if (!this.ds) {
|
|
196
|
+
throw new DataSourceInitializationError();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const runner: QueryRunner = this.createQueryRunner();
|
|
200
|
+
try {
|
|
201
|
+
await runner.connect();
|
|
202
|
+
await runner.startTransaction(isolationLevel);
|
|
203
|
+
return new TypeOrmTransaction(runner);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
await runner.release();
|
|
207
|
+
throw error;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
212
|
+
async runMigrations(): Promise<void> {
|
|
213
|
+
await this.createMigrationTableIfNotExists();
|
|
214
|
+
|
|
215
|
+
// we need to dynamically inject here because the repositories aren't ready in the constructor.
|
|
216
|
+
const migrationsRepository: Repository<MigrationEntity> = inject(repositoryTokenFor(MigrationEntity));
|
|
217
|
+
const finishedMigrationVersions: string[] = (await migrationsRepository.findAll()).map(m => m.version);
|
|
218
|
+
const allMigrations: MigrationWithName[] = this.migrations.map(m => ({ migration: inject(m), name: m.name }));
|
|
219
|
+
|
|
220
|
+
const appVersion: Version | undefined = GlobalRegistry.getAppData('version');
|
|
221
|
+
if (!appVersion) {
|
|
222
|
+
throw new Error('Couldn\'t run migrations: No app version could be resolved');
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const migrationsToRunUp: MigrationWithName[] = allMigrations.filter(m => {
|
|
226
|
+
return !finishedMigrationVersions.includes(m.migration.version)
|
|
227
|
+
&& compareVersion(m.migration.version, appVersion) !== 'bigger';
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
const migrationsToRunDown: MigrationWithName[] = allMigrations.filter(m => {
|
|
231
|
+
return finishedMigrationVersions.includes(m.migration.version)
|
|
232
|
+
&& compareVersion(m.migration.version, appVersion) === 'bigger';
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
for (const migration of migrationsToRunUp) {
|
|
236
|
+
await this.logger.info(` > runs up migration ${migration.name}`);
|
|
237
|
+
await migration.migration.runUp();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
for (const migration of migrationsToRunDown) {
|
|
241
|
+
await this.logger.info(` > runs down migration ${migration.name}`);
|
|
242
|
+
await migration.migration.runDown();
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const skipped: number = allMigrations.length - migrationsToRunDown.length - migrationsToRunUp.length;
|
|
246
|
+
if (skipped) {
|
|
247
|
+
await this.logger.info(` > skipped ${skipped} migrations that have already been applied`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Creates a query runner.
|
|
253
|
+
* @returns A query runner.
|
|
254
|
+
* @throws When the data source has not been initialized yet.
|
|
255
|
+
*/
|
|
256
|
+
createQueryRunner(): QueryRunner {
|
|
257
|
+
if (!this.ds) {
|
|
258
|
+
throw new DataSourceInitializationError();
|
|
259
|
+
}
|
|
260
|
+
return this.ds.createQueryRunner();
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
264
|
+
getRepository<T extends BaseEntity>(cls: Newable<T>): RepositoryTypeForEntity<T> {
|
|
265
|
+
if (!this.ds) {
|
|
266
|
+
throw new DataSourceInitializationError();
|
|
267
|
+
}
|
|
268
|
+
if (!this.entities.find(e => e === cls)) {
|
|
269
|
+
throw new Error(`The entity "${cls.name}" is not in this database. Did you forget to include it in the entities array?`);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// eslint-disable-next-line stylistic/max-len
|
|
273
|
+
const existingRepository: RepositoryTypeForEntity<T> | undefined = this.repositories.get(cls) as RepositoryTypeForEntity<T> | undefined;
|
|
274
|
+
if (existingRepository) {
|
|
275
|
+
return existingRepository;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const repo: TORepository<T> = this.ds.getRepository(cls);
|
|
279
|
+
|
|
280
|
+
if (isSoftDeleteEntityNewable(cls)) {
|
|
281
|
+
const res: RepositoryTypeForEntity<T> = new SoftDeleteRepository(
|
|
282
|
+
cls,
|
|
283
|
+
repo as unknown as TORepository<SoftDeleteEntity>,
|
|
284
|
+
this.logger,
|
|
285
|
+
this,
|
|
286
|
+
getDefaultBeforeSaveHook(),
|
|
287
|
+
getDefaultBeforeReturnHook(),
|
|
288
|
+
this.authService,
|
|
289
|
+
this.getRepository(ChangeSet)
|
|
290
|
+
) as RepositoryTypeForEntity<T>;
|
|
291
|
+
this.repositories.set(cls, res as Repository<BaseEntity>);
|
|
292
|
+
return res;
|
|
293
|
+
}
|
|
294
|
+
if (isChangeSetEntityNewable(cls)) {
|
|
295
|
+
const res: RepositoryTypeForEntity<T> = new ChangeSetRepository(
|
|
296
|
+
cls,
|
|
297
|
+
repo as unknown as TORepository<ChangeSetEntity>,
|
|
298
|
+
this.logger,
|
|
299
|
+
this,
|
|
300
|
+
getDefaultBeforeSaveHook(),
|
|
301
|
+
getDefaultBeforeReturnHook(),
|
|
302
|
+
this.authService,
|
|
303
|
+
this.getRepository(ChangeSet)
|
|
304
|
+
) as RepositoryTypeForEntity<T>;
|
|
305
|
+
this.repositories.set(cls, res as Repository<BaseEntity>);
|
|
306
|
+
return res;
|
|
307
|
+
}
|
|
308
|
+
const res: RepositoryTypeForEntity<T> = new Repository<T>(
|
|
309
|
+
cls,
|
|
310
|
+
repo,
|
|
311
|
+
this.logger,
|
|
312
|
+
this,
|
|
313
|
+
getDefaultBeforeSaveHook(),
|
|
314
|
+
getDefaultBeforeReturnHook()
|
|
315
|
+
) as RepositoryTypeForEntity<T>;
|
|
316
|
+
this.repositories.set(cls, res as Repository<BaseEntity>);
|
|
317
|
+
return res;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
321
|
+
async addPropertyToEntity<T extends BaseEntity>(
|
|
322
|
+
entity: Newable<T>,
|
|
323
|
+
key: keyof T,
|
|
324
|
+
transaction: Transaction
|
|
325
|
+
): Promise<void> {
|
|
326
|
+
const col: TableColumnOptions = this.propertyToTableColumnOptions(entity, key);
|
|
327
|
+
await transaction.queryRunner.addColumn(
|
|
328
|
+
TypeOrmUtilities.getEntityMetadata(entity, transaction).tableName,
|
|
329
|
+
new TableColumn({ ...col, isNullable: true })
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
334
|
+
async changePropertyOfEntity<T extends BaseEntity>(
|
|
335
|
+
entity: Newable<T>,
|
|
336
|
+
oldColumn: keyof T | string & {},
|
|
337
|
+
newColumn: PropertyMetadataInput & {
|
|
338
|
+
/**
|
|
339
|
+
* The name of the new column.
|
|
340
|
+
*/
|
|
341
|
+
name?: keyof T,
|
|
342
|
+
/**
|
|
343
|
+
* The type of the new column.
|
|
344
|
+
*/
|
|
345
|
+
type: ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity> | FilePropertyMetadata>['type']
|
|
346
|
+
},
|
|
347
|
+
transaction: Transaction
|
|
348
|
+
): Promise<void> {
|
|
349
|
+
const entityMetadata: TOEntityMetadata = TypeOrmUtilities.getEntityMetadata(entity, transaction);
|
|
350
|
+
const columnMetadata: ColumnMetadata = TypeOrmUtilities.getColumnMetadata(entity, oldColumn, transaction);
|
|
351
|
+
|
|
352
|
+
const col: TableColumnOptions = {
|
|
353
|
+
...columnMetadata,
|
|
354
|
+
...newColumn,
|
|
355
|
+
enum: 'enum' in newColumn && newColumn.enum
|
|
356
|
+
? ObjectUtilities.values(newColumn.enum).map(v => String(v))
|
|
357
|
+
: columnMetadata.enum
|
|
358
|
+
? columnMetadata.enum.map(v => String(v))
|
|
359
|
+
: undefined,
|
|
360
|
+
name: String(newColumn.name ?? oldColumn),
|
|
361
|
+
type: TypeOrmUtilities.normalizeColumnType(
|
|
362
|
+
this.ds,
|
|
363
|
+
{
|
|
364
|
+
precision: undefined,
|
|
365
|
+
scale: undefined,
|
|
366
|
+
...columnMetadata,
|
|
367
|
+
...newColumn,
|
|
368
|
+
type: this.fullColumnTypeMapping[newColumn.type]
|
|
369
|
+
}
|
|
370
|
+
)
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
await transaction.queryRunner.changeColumn(entityMetadata.tableName, String(oldColumn), new TableColumn(col));
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Gets entity schemas for the entities of this data source.
|
|
378
|
+
* @returns TypeOrm entity schemas.
|
|
379
|
+
*/
|
|
380
|
+
protected getEntitySchemas(): EntitySchema[] {
|
|
381
|
+
const schemas: EntitySchema[] = this.entities.map(e => this.createSchemaForEntity(e));
|
|
382
|
+
return schemas;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Transforms the property on the given entity class to typeorm column options.
|
|
387
|
+
* @param entity - The entity class which property should be transformed.
|
|
388
|
+
* @param property - The key of the actual property that should be transformed.
|
|
389
|
+
* @returns TypeOrm column options.
|
|
390
|
+
* @throws When no data source has been provided or no column metadata could be found.
|
|
391
|
+
*/
|
|
392
|
+
protected propertyToTableColumnOptions<T extends BaseEntity>(entity: Newable<T>, property: keyof T): TableColumnOptions {
|
|
393
|
+
if (!this.ds) {
|
|
394
|
+
throw new DataSourceInitializationError();
|
|
395
|
+
}
|
|
396
|
+
const schema: EntitySchema = this.createSchemaForEntity(entity);
|
|
397
|
+
const metadata: TOEntityMetadata = this.ds.getMetadata(schema);
|
|
398
|
+
const col: ColumnMetadata | undefined = metadata.columns.find(c => c.propertyName === property);
|
|
399
|
+
|
|
400
|
+
if (!col) {
|
|
401
|
+
throw new Error(`Could not determine column metadata for ${entity.name}.${String(property)}`);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
return {
|
|
405
|
+
name: col.databaseName,
|
|
406
|
+
...col,
|
|
407
|
+
enum: col.enum ? col.enum?.map(v => String(v)) : undefined,
|
|
408
|
+
type: TypeOrmUtilities.normalizeColumnType(
|
|
409
|
+
this.ds,
|
|
410
|
+
{
|
|
411
|
+
isArray: col.isArray,
|
|
412
|
+
length: col.length,
|
|
413
|
+
precision: col.precision,
|
|
414
|
+
scale: col.scale,
|
|
415
|
+
type: col.type
|
|
416
|
+
}
|
|
417
|
+
)
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Creates a typeorm entity schema for a single entity.
|
|
423
|
+
* @param cls - The entity class to create the schema for.
|
|
424
|
+
* @returns A typeorm entity schema.
|
|
425
|
+
* @throws When the provided entity was configured incorrectly.
|
|
426
|
+
*/
|
|
427
|
+
protected createSchemaForEntity(cls: Newable<BaseEntity>): EntitySchema {
|
|
428
|
+
const entityMetadata: EntityMetadata | undefined = MetadataUtilities.getEntityMetadata(cls);
|
|
429
|
+
if (!entityMetadata) {
|
|
430
|
+
throw new EntityMetadataMissingError(cls);
|
|
431
|
+
}
|
|
432
|
+
const props: Record<string, PropertyMetadata> = MetadataUtilities.getModelProperties(cls);
|
|
433
|
+
|
|
434
|
+
this.validateEntityClassMetadata(entityMetadata, props);
|
|
435
|
+
|
|
436
|
+
const numberOfPrimaryKeys: number = ObjectUtilities
|
|
437
|
+
.values(props)
|
|
438
|
+
.filter(d => 'primary' in d && d.primary)
|
|
439
|
+
.length;
|
|
440
|
+
if (numberOfPrimaryKeys === 0) {
|
|
441
|
+
throw new Error(`no primary key specified for entity "${cls.name}".`);
|
|
442
|
+
}
|
|
443
|
+
if (numberOfPrimaryKeys > 1) {
|
|
444
|
+
throw new Error(`more than 1 primary key specified for entity "${cls.name}".`);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
const columns: Record<string, EntitySchemaColumnOptions> = {};
|
|
448
|
+
const relations: Record<string, EntitySchemaRelationOptions> = {};
|
|
449
|
+
for (const [key, m] of ObjectUtilities.entries(props)) {
|
|
450
|
+
if (
|
|
451
|
+
m.type === Relation.MANY_TO_ONE
|
|
452
|
+
|| m.type === Relation.ONE_TO_MANY
|
|
453
|
+
|| m.type === Relation.HAS_ONE
|
|
454
|
+
|| m.type === Relation.BELONGS_TO_ONE
|
|
455
|
+
|| m.type === Relation.MANY_TO_MANY
|
|
456
|
+
) {
|
|
457
|
+
relations[key] = this.propertyToRelationOptions(cls, key, m);
|
|
458
|
+
continue;
|
|
459
|
+
}
|
|
460
|
+
columns[key] = this.propertyToColumnOptions(m);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
return new EntitySchema({
|
|
464
|
+
name: cls.name,
|
|
465
|
+
target: cls,
|
|
466
|
+
tableName: entityMetadata.tableName,
|
|
467
|
+
columns,
|
|
468
|
+
relations
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Transforms the given relation metadata to typeorm relation options.
|
|
474
|
+
* @param cls
|
|
475
|
+
* @param key
|
|
476
|
+
* @param metadata - The relation metadata to transform.
|
|
477
|
+
* @returns TypeOrm relation options.
|
|
478
|
+
* @throws If a belongs to one or many to one relation hasn't specified a join column.
|
|
479
|
+
*/
|
|
480
|
+
protected abstract propertyToRelationOptions<T extends BaseEntity>(
|
|
481
|
+
cls: Newable<T>,
|
|
482
|
+
key: string,
|
|
483
|
+
metadata: RelationMetadata<T>
|
|
484
|
+
): EntitySchemaRelationOptions;
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Transforms the given property metadata to typeorm column options.
|
|
488
|
+
* @param metadata - The property metadata to transform.
|
|
489
|
+
* @returns TypeOrm column options.
|
|
490
|
+
* @throws When the metadata is incorrect.
|
|
491
|
+
*/
|
|
492
|
+
protected abstract propertyToColumnOptions(
|
|
493
|
+
metadata: ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity>>
|
|
494
|
+
): EntitySchemaColumnOptions;
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* Validates the entity class metadata and its properties.
|
|
498
|
+
* @param metadata - The entity class metadata.
|
|
499
|
+
* @param props - The properties of the entity class.
|
|
500
|
+
*/
|
|
501
|
+
// eslint-disable-next-line unusedImports/no-unused-vars
|
|
502
|
+
protected validateEntityClassMetadata(metadata: EntityMetadata, props: Record<string, PropertyMetadata>): void {
|
|
503
|
+
// do nothing by default.
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Validates the data source options.
|
|
508
|
+
* @param options - The full options to validate.
|
|
509
|
+
*/
|
|
510
|
+
// eslint-disable-next-line unusedImports/no-unused-vars
|
|
511
|
+
protected validateOptions(options: OmitStrict<TOptions, 'type' | 'entities' | 'synchronize'>): void | Promise<void> {
|
|
512
|
+
// do nothing by default.
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Creates a table for migrations if it does not exist already.
|
|
517
|
+
*/
|
|
518
|
+
protected async createMigrationTableIfNotExists(): Promise<void> {
|
|
519
|
+
if (!this.ds) {
|
|
520
|
+
throw new DataSourceInitializationError();
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
const runner: QueryRunner = this.createQueryRunner();
|
|
524
|
+
try {
|
|
525
|
+
await runner.connect();
|
|
526
|
+
const schema: EntitySchema = this.createSchemaForEntity(MigrationEntity);
|
|
527
|
+
const metadata: TOEntityMetadata = this.ds.getMetadata(schema);
|
|
528
|
+
const table: Table = new Table({
|
|
529
|
+
name: metadata.tablePath,
|
|
530
|
+
columns: metadata.columns.map(col => ({
|
|
531
|
+
name: col.databaseName,
|
|
532
|
+
...col,
|
|
533
|
+
enum: col.enum?.map(v => String(v)),
|
|
534
|
+
type: TypeOrmUtilities.normalizeColumnType(this.ds, col)
|
|
535
|
+
}))
|
|
536
|
+
});
|
|
537
|
+
await runner.createTable(table, true);
|
|
538
|
+
|
|
539
|
+
}
|
|
540
|
+
finally {
|
|
541
|
+
await runner.release();
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|