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
|
@@ -1,675 +0,0 @@
|
|
|
1
|
-
import { ChildProcessByStdio, spawn } from 'node:child_process';
|
|
2
|
-
import { PassThrough, Readable, Writable } from 'node:stream';
|
|
3
|
-
|
|
4
|
-
import { DataSource as TODataSource, Repository as TORepository, EntityMetadata as TOEntityMetadata, EntitySchema, EntitySchemaColumnOptions, QueryRunner, EntitySchemaRelationOptions, Table, TableColumnOptions, TableColumn, EntityTarget } from 'typeorm';
|
|
5
|
-
import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';
|
|
6
|
-
import { ColumnMetadata } from 'typeorm/metadata/ColumnMetadata.js';
|
|
7
|
-
import { OnDeleteType } from 'typeorm/metadata/types/OnDeleteType.js';
|
|
8
|
-
import { OnUpdateType } from 'typeorm/metadata/types/OnUpdateType.js';
|
|
9
|
-
|
|
10
|
-
import { DataSourceInterface, IsolationLevel } from './data-source.interface';
|
|
11
|
-
import { ChangeSetRepository } from '../../change-sets/change-set-repository';
|
|
12
|
-
import { isChangeSetEntityNewable, ChangeSetEntity } from '../../change-sets/models/change-set-entity.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 { FilePropertyMetadata } from '../../entity/models/file-property-metadata.model';
|
|
24
|
-
import { Relation } from '../../entity/models/relation.enum';
|
|
25
|
-
import { StringPropertyMetadata } from '../../entity/models/string-property-metadata.model';
|
|
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 { getDefaultBeforeReturnHook, getDefaultBeforeSaveHook } from '../hooks/hooks.default';
|
|
36
|
-
import { MigrationEntity } from '../migration/migration-entity.model';
|
|
37
|
-
import { Migration } from '../migration/migration.model';
|
|
38
|
-
import { ColumnType } from '../models/column-type.model';
|
|
39
|
-
import { DataSourceOptions } from '../models/data-source-options.model';
|
|
40
|
-
import { Repository } from '../repository';
|
|
41
|
-
import { Transaction } from '../transaction/transaction.model';
|
|
42
|
-
import { TypeOrmTransaction } from '../transaction/typeorm-transaction.model';
|
|
43
|
-
|
|
44
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
45
|
-
type ToColumnMappableTypes = ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity>>['type'];
|
|
46
|
-
|
|
47
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
48
|
-
type MigrationWithName = { migration: Migration, name: string };
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Postgres-specific connection options.
|
|
52
|
-
*/
|
|
53
|
-
export type PostgresOptions = OmitStrict<PostgresConnectionOptions, 'entities' | 'type'>;
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* A base postgres data source definition.
|
|
57
|
-
*/
|
|
58
|
-
export abstract class PostgresDataSource implements DataSourceInterface {
|
|
59
|
-
/**
|
|
60
|
-
* Mapping from a Zibri property type to a typeorm column type.
|
|
61
|
-
*/
|
|
62
|
-
protected readonly columnTypeMappingOverride: Partial<Record<ToColumnMappableTypes, ColumnType>> = {};
|
|
63
|
-
|
|
64
|
-
private get columnTypeMapping(): Record<ToColumnMappableTypes, ColumnType> {
|
|
65
|
-
return {
|
|
66
|
-
array: 'array',
|
|
67
|
-
number: 'decimal',
|
|
68
|
-
string: 'varchar',
|
|
69
|
-
object: 'jsonb',
|
|
70
|
-
date: 'timestamptz',
|
|
71
|
-
boolean: 'boolean',
|
|
72
|
-
unknown: 'jsonb',
|
|
73
|
-
file: 'bytea',
|
|
74
|
-
...this.columnTypeMappingOverride
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
abstract readonly options: PostgresOptions;
|
|
79
|
-
abstract readonly entities: Newable<BaseEntity>[];
|
|
80
|
-
/**
|
|
81
|
-
* The optional root password.
|
|
82
|
-
*/
|
|
83
|
-
readonly rootPw: string | undefined;
|
|
84
|
-
/**
|
|
85
|
-
* The optional root username.
|
|
86
|
-
*/
|
|
87
|
-
readonly rootUsername: string | undefined;
|
|
88
|
-
|
|
89
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
90
|
-
readonly migrations: Newable<Migration>[] = [];
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* The internal typeorm data source.
|
|
94
|
-
*/
|
|
95
|
-
protected ds?: TODataSource;
|
|
96
|
-
|
|
97
|
-
constructor(
|
|
98
|
-
@Inject(ZIBRI_DI_TOKENS.LOGGER)
|
|
99
|
-
private readonly logger: LoggerInterface
|
|
100
|
-
) { }
|
|
101
|
-
|
|
102
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
103
|
-
createBackupData(): Readable {
|
|
104
|
-
const dumpCommand: string = 'pg_dumpall';
|
|
105
|
-
const { host, port } = this.options;
|
|
106
|
-
if (!this.rootUsername || !host || !port) {
|
|
107
|
-
throw new Error('Could not create a backup, missing this.rootUsername, this.options.host or this.options.port');
|
|
108
|
-
}
|
|
109
|
-
const args: string[] = ['-U', this.rootUsername, '-h', host, '-p', port.toString()];
|
|
110
|
-
|
|
111
|
-
const child: ChildProcessByStdio<null, Readable, null> = spawn(dumpCommand, args, {
|
|
112
|
-
stdio: ['ignore', 'pipe', 'inherit'],
|
|
113
|
-
env: { ...process.env, PGPASSWORD: this.rootPw }
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
const out: PassThrough = new PassThrough();
|
|
117
|
-
child.stdout.pipe(out);
|
|
118
|
-
child.on('error', err => {
|
|
119
|
-
out.destroy(err);
|
|
120
|
-
});
|
|
121
|
-
child.on('exit', code => {
|
|
122
|
-
if (code !== 0) {
|
|
123
|
-
out.destroy(new Error(`${dumpCommand} exited with code ${code}`));
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
out.end();
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
return out;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
134
|
-
async restoreBackup(backupData: Readable): Promise<void> {
|
|
135
|
-
const { host, port, database } = this.options;
|
|
136
|
-
if (!this.rootUsername || !host || !port || !database) {
|
|
137
|
-
throw new Error('Missing rootUsername, host, port, or database for restore');
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const args: string[] = ['-U', this.rootUsername, '-h', host, '-p', port.toString(), '-d', database];
|
|
141
|
-
const child: ChildProcessByStdio<Writable, null, null> = spawn('psql', args, {
|
|
142
|
-
stdio: ['pipe', 'inherit', 'inherit'],
|
|
143
|
-
env: { ...process.env, PGPASSWORD: this.rootPw }
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
return new Promise((resolve, reject) => {
|
|
147
|
-
backupData.pipe(child.stdin);
|
|
148
|
-
|
|
149
|
-
child.on('error', reject);
|
|
150
|
-
child.on('close', code => {
|
|
151
|
-
if (code !== 0) {
|
|
152
|
-
reject(new Error(`psql exited with code ${code}`));
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
resolve();
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
162
|
-
async init(): Promise<void> {
|
|
163
|
-
if (this.ds) {
|
|
164
|
-
throw new Error('The postgres data source has already been initialized.');
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
if (this.options.username === 'postgres' && this.options.password === 'password') {
|
|
168
|
-
await this.logger.warn(
|
|
169
|
-
`The data source "${this.constructor.name}" uses the default credentials, you probably want to change that.`
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
for (const entityClass of this.entities) {
|
|
174
|
-
register({
|
|
175
|
-
token: repositoryTokenFor(entityClass),
|
|
176
|
-
useFactory: () => this.getRepository(entityClass)
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const schemas: EntitySchema[] = this.getEntitySchemas();
|
|
181
|
-
this.ds = new TODataSource({
|
|
182
|
-
entities: schemas,
|
|
183
|
-
poolSize: 100,
|
|
184
|
-
type: 'postgres',
|
|
185
|
-
...this.options,
|
|
186
|
-
synchronize: false
|
|
187
|
-
} as DataSourceOptions);
|
|
188
|
-
await this.ds.initialize();
|
|
189
|
-
|
|
190
|
-
await this.runMigrations();
|
|
191
|
-
|
|
192
|
-
if (this.options.synchronize !== false) {
|
|
193
|
-
await this.ds.synchronize();
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
198
|
-
async shutDown(): Promise<void> {
|
|
199
|
-
await this.ds?.destroy();
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Gets entity schemas for the entities of this data source.
|
|
204
|
-
* @returns Typeorm entity schemas.
|
|
205
|
-
*/
|
|
206
|
-
protected getEntitySchemas(): EntitySchema[] {
|
|
207
|
-
const schemas: EntitySchema[] = this.entities.map(e => this.createSchemaForEntity(e));
|
|
208
|
-
return schemas;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Creates a typeorm entity schema for a single entity.
|
|
213
|
-
* @param cls - The entity class to create the schema for.
|
|
214
|
-
* @returns A typeorm entity schema.
|
|
215
|
-
* @throws When the provided entity was configured incorrectly.
|
|
216
|
-
*/
|
|
217
|
-
protected createSchemaForEntity(cls: Newable<BaseEntity>): EntitySchema {
|
|
218
|
-
const entityMetadata: EntityMetadata | undefined = MetadataUtilities.getEntityMetadata(cls);
|
|
219
|
-
if (!entityMetadata) {
|
|
220
|
-
throw new Error(`Could not find metadata for entity "${cls.name}". Did you forget to decorate it with @Entity?`);
|
|
221
|
-
}
|
|
222
|
-
const props: Record<string, PropertyMetadata> = MetadataUtilities.getModelProperties(cls);
|
|
223
|
-
|
|
224
|
-
const numberOfPrimaryKeys: number = ObjectUtilities
|
|
225
|
-
.values(props)
|
|
226
|
-
// eslint-disable-next-line typescript/no-explicit-any
|
|
227
|
-
.filter(d => (d as StringPropertyMetadata<any, any, any, any, any>).primary)
|
|
228
|
-
.length;
|
|
229
|
-
if (numberOfPrimaryKeys === 0) {
|
|
230
|
-
throw new Error(`no primary key specified for entity "${cls.name}".`);
|
|
231
|
-
}
|
|
232
|
-
if (numberOfPrimaryKeys > 1) {
|
|
233
|
-
throw new Error(`more than 1 primary key specified for entity "${cls.name}".`);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
const columns: Record<string, EntitySchemaColumnOptions> = {};
|
|
237
|
-
const relations: Record<string, EntitySchemaRelationOptions> = {};
|
|
238
|
-
for (const [key, m] of ObjectUtilities.entries(props)) {
|
|
239
|
-
if (
|
|
240
|
-
m.type === Relation.MANY_TO_ONE
|
|
241
|
-
|| m.type === Relation.ONE_TO_MANY
|
|
242
|
-
|| m.type === Relation.ONE_TO_ONE
|
|
243
|
-
|| m.type === Relation.MANY_TO_MANY
|
|
244
|
-
) {
|
|
245
|
-
relations[key] = this.propertyToRelationOptions(m);
|
|
246
|
-
continue;
|
|
247
|
-
}
|
|
248
|
-
columns[key] = this.propertyToColumnOptions(m);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
return new EntitySchema({
|
|
252
|
-
name: cls.name,
|
|
253
|
-
target: cls,
|
|
254
|
-
tableName: entityMetadata.tableName,
|
|
255
|
-
columns,
|
|
256
|
-
relations
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Transforms the given relation metadata to typeorm relation options.
|
|
262
|
-
* @param metadata - The relation metadata to transform.
|
|
263
|
-
* @returns Typeorm relation options.
|
|
264
|
-
*/
|
|
265
|
-
protected propertyToRelationOptions<T extends BaseEntity>(metadata: RelationMetadata<T>): EntitySchemaRelationOptions {
|
|
266
|
-
const thisHasRemove: boolean = this.hasCascadeFlag(metadata.cascade, 'remove');
|
|
267
|
-
const thisHasUpdate: boolean = this.hasCascadeFlag(metadata.cascade, 'update');
|
|
268
|
-
const thisHasInsert: boolean = this.hasCascadeFlag(metadata.cascade, 'insert');
|
|
269
|
-
|
|
270
|
-
// try to inspect inverse property's cascade (if inverseSide provided)
|
|
271
|
-
const targetClass: Newable<T> = metadata.target();
|
|
272
|
-
const targetProps: Record<string, PropertyMetadata> = MetadataUtilities.getModelProperties(targetClass);
|
|
273
|
-
const inv: RelationMetadata<BaseEntity> = targetProps[metadata.inverseSide] as RelationMetadata<BaseEntity>;
|
|
274
|
-
const inverseHasRemove: boolean = this.hasCascadeFlag(inv.cascade, 'remove');
|
|
275
|
-
const inverseHasUpdate: boolean = this.hasCascadeFlag(inv.cascade, 'update');
|
|
276
|
-
const inverseHasInsert: boolean = this.hasCascadeFlag(inv.cascade, 'insert');
|
|
277
|
-
|
|
278
|
-
const onDelete: OnDeleteType | undefined = thisHasRemove || inverseHasRemove ? 'CASCADE' : undefined;
|
|
279
|
-
const onUpdate: OnUpdateType | undefined = thisHasUpdate || inverseHasUpdate ? 'CASCADE' : undefined;
|
|
280
|
-
const persistence: boolean = 'persistence' in metadata ? metadata.persistence : thisHasInsert || inverseHasInsert;
|
|
281
|
-
const nullable: boolean = typeof metadata.required === 'boolean' ? !metadata.required : true;
|
|
282
|
-
|
|
283
|
-
switch (metadata.type) {
|
|
284
|
-
case Relation.ONE_TO_ONE:
|
|
285
|
-
case Relation.ONE_TO_MANY:
|
|
286
|
-
case Relation.MANY_TO_MANY: {
|
|
287
|
-
return {
|
|
288
|
-
nullable,
|
|
289
|
-
...metadata,
|
|
290
|
-
inverseSide: metadata.inverseSide as string,
|
|
291
|
-
onDelete,
|
|
292
|
-
onUpdate,
|
|
293
|
-
persistence
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
case Relation.MANY_TO_ONE: {
|
|
297
|
-
return {
|
|
298
|
-
nullable,
|
|
299
|
-
joinColumn: true,
|
|
300
|
-
...metadata,
|
|
301
|
-
inverseSide: metadata.inverseSide as string,
|
|
302
|
-
onDelete,
|
|
303
|
-
onUpdate,
|
|
304
|
-
persistence
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
private hasCascadeFlag(c: RelationMetadata<BaseEntity>['cascade'], flag: 'remove' | 'update' | 'insert'): boolean {
|
|
311
|
-
if (c === true) {
|
|
312
|
-
return true;
|
|
313
|
-
}
|
|
314
|
-
if (Array.isArray(c)) {
|
|
315
|
-
return c.includes(flag);
|
|
316
|
-
}
|
|
317
|
-
return false;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
/**
|
|
321
|
-
* Transforms the given property metadata to typeorm column options.
|
|
322
|
-
* @param metadata - The property metadata to transform.
|
|
323
|
-
* @returns Typeorm column options.
|
|
324
|
-
* @throws When the metadata is incorrect.
|
|
325
|
-
*/
|
|
326
|
-
protected propertyToColumnOptions(
|
|
327
|
-
metadata: ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity>>
|
|
328
|
-
): EntitySchemaColumnOptions {
|
|
329
|
-
const nullable: boolean = typeof metadata.required === 'boolean' ? !metadata.required : true;
|
|
330
|
-
switch (metadata.type) {
|
|
331
|
-
case 'file':
|
|
332
|
-
case 'boolean':
|
|
333
|
-
case 'object':
|
|
334
|
-
case 'unknown':
|
|
335
|
-
case 'date': {
|
|
336
|
-
return {
|
|
337
|
-
nullable,
|
|
338
|
-
...metadata,
|
|
339
|
-
type: this.columnTypeMapping[metadata.type],
|
|
340
|
-
default: undefined
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
case 'array': {
|
|
344
|
-
if (metadata.items.type === 'object') {
|
|
345
|
-
return {
|
|
346
|
-
nullable,
|
|
347
|
-
...metadata,
|
|
348
|
-
type: this.columnTypeMapping[metadata.items.type],
|
|
349
|
-
default: undefined
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
return {
|
|
353
|
-
nullable,
|
|
354
|
-
...metadata,
|
|
355
|
-
type: this.columnTypeMapping[metadata.items.type],
|
|
356
|
-
array: true,
|
|
357
|
-
default: undefined
|
|
358
|
-
};
|
|
359
|
-
}
|
|
360
|
-
case 'number': {
|
|
361
|
-
return {
|
|
362
|
-
nullable,
|
|
363
|
-
generated: metadata.primary ? 'increment' : undefined,
|
|
364
|
-
...metadata,
|
|
365
|
-
type: metadata.format ?? this.columnTypeMapping[metadata.type],
|
|
366
|
-
default: undefined,
|
|
367
|
-
transformer: {
|
|
368
|
-
// eslint-disable-next-line unicorn/no-null
|
|
369
|
-
to: (v: number | bigint | null) => v != null ? String(v) : null,
|
|
370
|
-
from: (v: string | null) => {
|
|
371
|
-
if (v == undefined) {
|
|
372
|
-
return v;
|
|
373
|
-
}
|
|
374
|
-
if (metadata.format === 'bigint') {
|
|
375
|
-
return BigInt(v);
|
|
376
|
-
}
|
|
377
|
-
return Number(v);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
};
|
|
381
|
-
}
|
|
382
|
-
case 'string': {
|
|
383
|
-
return {
|
|
384
|
-
nullable,
|
|
385
|
-
generated: metadata.primary ? 'uuid' : undefined,
|
|
386
|
-
...metadata,
|
|
387
|
-
type: metadata.format === 'uuid' || metadata.primary ? 'uuid' : this.columnTypeMapping[metadata.type],
|
|
388
|
-
length: metadata.maxLength,
|
|
389
|
-
enum: metadata.enum ? ObjectUtilities.values(metadata.enum) : undefined,
|
|
390
|
-
default: undefined
|
|
391
|
-
};
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
397
|
-
getRepository<T extends BaseEntity>(cls: Newable<T>): Repository<T> {
|
|
398
|
-
if (!this.ds) {
|
|
399
|
-
// eslint-disable-next-line sonar/no-duplicate-string
|
|
400
|
-
throw new Error('The postgres data source needs to be initialized before it can be used.');
|
|
401
|
-
}
|
|
402
|
-
if (!this.entities.find(e => e === cls)) {
|
|
403
|
-
throw new Error(`The entity "${cls.name}" is not in this database. Did you forget to include it in the entities array?`);
|
|
404
|
-
}
|
|
405
|
-
const repo: TORepository<T> = this.ds.getRepository(cls);
|
|
406
|
-
|
|
407
|
-
if (isSoftDeleteEntityNewable(cls)) {
|
|
408
|
-
return new SoftDeleteRepository(
|
|
409
|
-
cls,
|
|
410
|
-
repo as unknown as TORepository<SoftDeleteEntity>,
|
|
411
|
-
this.logger,
|
|
412
|
-
this,
|
|
413
|
-
getDefaultBeforeSaveHook(),
|
|
414
|
-
getDefaultBeforeReturnHook()
|
|
415
|
-
) as unknown as Repository<T>;
|
|
416
|
-
}
|
|
417
|
-
if (isChangeSetEntityNewable(cls)) {
|
|
418
|
-
return new ChangeSetRepository(
|
|
419
|
-
cls,
|
|
420
|
-
repo as unknown as TORepository<ChangeSetEntity>,
|
|
421
|
-
this.logger,
|
|
422
|
-
this,
|
|
423
|
-
getDefaultBeforeSaveHook(),
|
|
424
|
-
getDefaultBeforeReturnHook()
|
|
425
|
-
) as unknown as Repository<T>;
|
|
426
|
-
}
|
|
427
|
-
return new Repository<T>(
|
|
428
|
-
cls,
|
|
429
|
-
repo,
|
|
430
|
-
this.logger,
|
|
431
|
-
this,
|
|
432
|
-
getDefaultBeforeSaveHook(),
|
|
433
|
-
getDefaultBeforeReturnHook()
|
|
434
|
-
);
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
438
|
-
async startTransaction(isolationLevel?: IsolationLevel): Promise<Transaction> {
|
|
439
|
-
if (!this.ds) {
|
|
440
|
-
throw new Error('The postgres data source needs to be initialized before it can be used.');
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
const runner: QueryRunner = this.createQueryRunner();
|
|
444
|
-
try {
|
|
445
|
-
await runner.connect();
|
|
446
|
-
await runner.startTransaction(isolationLevel);
|
|
447
|
-
return new TypeOrmTransaction(runner);
|
|
448
|
-
}
|
|
449
|
-
catch (error) {
|
|
450
|
-
await runner.release();
|
|
451
|
-
throw error;
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
/**
|
|
456
|
-
* Creates a query runner.
|
|
457
|
-
* @returns A query runner.
|
|
458
|
-
* @throws When the data source has not been initialized yet.
|
|
459
|
-
*/
|
|
460
|
-
createQueryRunner(): QueryRunner {
|
|
461
|
-
if (!this.ds) {
|
|
462
|
-
throw new Error('The postgres data source needs to be initialized before it can be used.');
|
|
463
|
-
}
|
|
464
|
-
return this.ds.createQueryRunner();
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
468
|
-
async runMigrations(): Promise<void> {
|
|
469
|
-
await this.createMigrationTableIfNotExists();
|
|
470
|
-
|
|
471
|
-
// we need to dynamically inject here because the repositories aren't ready in the constructor.
|
|
472
|
-
const migrationsRepository: Repository<MigrationEntity> = inject(repositoryTokenFor(MigrationEntity));
|
|
473
|
-
const finishedMigrationVersions: string[] = (await migrationsRepository.findAll()).map(m => m.version);
|
|
474
|
-
const allMigrations: MigrationWithName[] = this.migrations.map(m => ({ migration: inject(m), name: m.name }));
|
|
475
|
-
|
|
476
|
-
const migrationsToRunUp: MigrationWithName[] = allMigrations.filter(m => {
|
|
477
|
-
return !finishedMigrationVersions.includes(m.migration.version)
|
|
478
|
-
&& compareVersion(m.migration.version, GlobalRegistry.getAppData('version') as Version) !== 'bigger';
|
|
479
|
-
});
|
|
480
|
-
|
|
481
|
-
const migrationsToRunDown: MigrationWithName[] = allMigrations.filter(m => {
|
|
482
|
-
return finishedMigrationVersions.includes(m.migration.version)
|
|
483
|
-
&& compareVersion(m.migration.version, GlobalRegistry.getAppData('version') as Version) === 'bigger';
|
|
484
|
-
});
|
|
485
|
-
|
|
486
|
-
for (const migration of migrationsToRunUp) {
|
|
487
|
-
await this.logger.info(` > runs up migration ${migration.name}`);
|
|
488
|
-
await migration.migration.runUp();
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
for (const migration of migrationsToRunDown) {
|
|
492
|
-
await this.logger.info(` > runs down migration ${migration.name}`);
|
|
493
|
-
await migration.migration.runDown();
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
const skipped: number = allMigrations.length - migrationsToRunDown.length - migrationsToRunUp.length;
|
|
497
|
-
if (skipped) {
|
|
498
|
-
await this.logger.info(` > skipped ${skipped} migrations that have already been applied`);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
503
|
-
async addPropertyToEntity<T extends BaseEntity>(
|
|
504
|
-
entity: Newable<T>,
|
|
505
|
-
key: keyof T,
|
|
506
|
-
transaction: Transaction
|
|
507
|
-
): Promise<void> {
|
|
508
|
-
const col: TableColumnOptions = this.propertyToTableColumnOptions(entity, key);
|
|
509
|
-
await transaction.queryRunner.addColumn(
|
|
510
|
-
this.getEntityMetadata(entity, transaction).tableName,
|
|
511
|
-
new TableColumn({ ...col, isNullable: true })
|
|
512
|
-
);
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
516
|
-
async changePropertyOfEntity<T extends BaseEntity>(
|
|
517
|
-
entity: Newable<T>,
|
|
518
|
-
oldColumn: keyof T | string & {},
|
|
519
|
-
newColumn: PropertyMetadataInput & {
|
|
520
|
-
/**
|
|
521
|
-
* The name of the new column.
|
|
522
|
-
*/
|
|
523
|
-
name?: keyof T,
|
|
524
|
-
/**
|
|
525
|
-
* The type of the new column.
|
|
526
|
-
*/
|
|
527
|
-
type: ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity> | FilePropertyMetadata>['type']
|
|
528
|
-
},
|
|
529
|
-
transaction: Transaction
|
|
530
|
-
): Promise<void> {
|
|
531
|
-
const entityMetadata: TOEntityMetadata = this.getEntityMetadata(entity, transaction);
|
|
532
|
-
const columnMetadata: ColumnMetadata = this.getColumnMetadata(entity, oldColumn, transaction);
|
|
533
|
-
|
|
534
|
-
const col: TableColumnOptions = {
|
|
535
|
-
...columnMetadata,
|
|
536
|
-
...newColumn,
|
|
537
|
-
enum: 'enum' in newColumn && newColumn.enum
|
|
538
|
-
? ObjectUtilities.values(newColumn.enum).map(v => String(v))
|
|
539
|
-
: columnMetadata.enum
|
|
540
|
-
? columnMetadata.enum.map(v => String(v))
|
|
541
|
-
: undefined,
|
|
542
|
-
name: String(newColumn.name ?? oldColumn),
|
|
543
|
-
type: this.normalizeColumnType({
|
|
544
|
-
precision: undefined,
|
|
545
|
-
scale: undefined,
|
|
546
|
-
...columnMetadata,
|
|
547
|
-
...newColumn,
|
|
548
|
-
type: this.columnTypeMapping[newColumn.type]
|
|
549
|
-
})
|
|
550
|
-
};
|
|
551
|
-
|
|
552
|
-
await transaction.queryRunner.changeColumn(entityMetadata.tableName, String(oldColumn), new TableColumn(col));
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
/**
|
|
556
|
-
* Gets the typeorm metadata for a given entity.
|
|
557
|
-
* @param target - The target entity.
|
|
558
|
-
* @param transaction - The transaction to run this command with.
|
|
559
|
-
* @returns The typeorm metadata.
|
|
560
|
-
*/
|
|
561
|
-
protected getEntityMetadata<T extends BaseEntity>(target: EntityTarget<T>, transaction: Transaction): TOEntityMetadata {
|
|
562
|
-
return transaction.queryRunner.connection.getMetadata(target);
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
/**
|
|
566
|
-
* Gets the metadata for a typeorm column.
|
|
567
|
-
* @param target - The entity.
|
|
568
|
-
* @param propertyName - The name of the property to get the column metadata for.
|
|
569
|
-
* @param transaction - The transaction to use to get the column metadata.
|
|
570
|
-
* @returns The typeorm column metadata.
|
|
571
|
-
* @throws When the provided propertyName could not be found as a column.
|
|
572
|
-
*/
|
|
573
|
-
protected getColumnMetadata<T extends BaseEntity>(
|
|
574
|
-
target: EntityTarget<T>,
|
|
575
|
-
propertyName: keyof T | string & {},
|
|
576
|
-
transaction: Transaction
|
|
577
|
-
): ColumnMetadata {
|
|
578
|
-
const metadata: TOEntityMetadata = this.getEntityMetadata(target, transaction);
|
|
579
|
-
const column: ColumnMetadata | undefined = metadata.columns.find(
|
|
580
|
-
(col) => col.propertyName === propertyName
|
|
581
|
-
);
|
|
582
|
-
|
|
583
|
-
if (!column) {
|
|
584
|
-
throw new Error(
|
|
585
|
-
`Column ${propertyName.toString()} not found in model`
|
|
586
|
-
);
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
return column;
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
/**
|
|
593
|
-
* Creates a table for migrations if it does not exist already.
|
|
594
|
-
*/
|
|
595
|
-
protected async createMigrationTableIfNotExists(): Promise<void> {
|
|
596
|
-
if (!this.ds) {
|
|
597
|
-
throw new Error('The postgres data source needs to be initialized before it can be used.');
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
const runner: QueryRunner = this.createQueryRunner();
|
|
601
|
-
try {
|
|
602
|
-
await runner.connect();
|
|
603
|
-
const schema: EntitySchema = this.createSchemaForEntity(MigrationEntity);
|
|
604
|
-
const metadata: TOEntityMetadata = this.ds.getMetadata(schema);
|
|
605
|
-
const table: Table = new Table({
|
|
606
|
-
name: metadata.tablePath,
|
|
607
|
-
columns: metadata.columns.map(col => ({
|
|
608
|
-
name: col.databaseName,
|
|
609
|
-
...col,
|
|
610
|
-
enum: col.enum?.map(v => String(v)),
|
|
611
|
-
// eslint-disable-next-line typescript/no-non-null-assertion
|
|
612
|
-
type: this.ds!.driver.normalizeType(col)
|
|
613
|
-
}))
|
|
614
|
-
});
|
|
615
|
-
await runner.createTable(table, true);
|
|
616
|
-
|
|
617
|
-
}
|
|
618
|
-
finally {
|
|
619
|
-
await runner.release();
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
/**
|
|
624
|
-
* Transforms the property on the given entity class to typeorm column options.
|
|
625
|
-
* @param entity - The entity class which property should be transformed.
|
|
626
|
-
* @param property - The key of the actual property that should be transformed.
|
|
627
|
-
* @returns Typeorm column options.
|
|
628
|
-
* @throws When no data source has been provided or no column metadata could be found.
|
|
629
|
-
*/
|
|
630
|
-
protected propertyToTableColumnOptions<T extends BaseEntity>(entity: Newable<T>, property: keyof T): TableColumnOptions {
|
|
631
|
-
if (!this.ds) {
|
|
632
|
-
throw new Error('The postgres data source needs to be initialized before it can be used.');
|
|
633
|
-
}
|
|
634
|
-
const schema: EntitySchema = this.createSchemaForEntity(entity);
|
|
635
|
-
const metadata: TOEntityMetadata = this.ds.getMetadata(schema);
|
|
636
|
-
const col: ColumnMetadata | undefined = metadata.columns.find(c => c.propertyName === property);
|
|
637
|
-
|
|
638
|
-
if (!col) {
|
|
639
|
-
throw new Error(`Could not determine column metadata for ${entity.name}.${String(property)}`);
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
return {
|
|
643
|
-
name: col.databaseName,
|
|
644
|
-
...col,
|
|
645
|
-
enum: col.enum ? col.enum?.map(v => String(v)) : undefined,
|
|
646
|
-
type: this.normalizeColumnType({
|
|
647
|
-
isArray: col.isArray,
|
|
648
|
-
length: col.length,
|
|
649
|
-
precision: col.precision,
|
|
650
|
-
scale: col.scale,
|
|
651
|
-
type: col.type
|
|
652
|
-
})
|
|
653
|
-
};
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
private normalizeColumnType(
|
|
657
|
-
column: {
|
|
658
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
659
|
-
type: ColumnType | string & {} | undefined,
|
|
660
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
661
|
-
length: number | string | undefined,
|
|
662
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
663
|
-
precision: number | null | undefined,
|
|
664
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
665
|
-
scale: number | undefined,
|
|
666
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
667
|
-
isArray: boolean | undefined
|
|
668
|
-
}
|
|
669
|
-
): string {
|
|
670
|
-
if (!this.ds) {
|
|
671
|
-
throw new Error('The postgres data source needs to be initialized before it can be used.');
|
|
672
|
-
}
|
|
673
|
-
return this.ds.driver.normalizeType(column);
|
|
674
|
-
}
|
|
675
|
-
}
|