mongodb-dynamic-api 4.24.1 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +154 -0
- package/README.md +79 -2
- package/codemods/migrate-v5/cli.d.ts +3 -0
- package/codemods/migrate-v5/cli.js +38 -0
- package/codemods/migrate-v5/cli.js.map +1 -0
- package/codemods/migrate-v5/migrate-v5.d.ts +18 -0
- package/codemods/migrate-v5/migrate-v5.js +263 -0
- package/codemods/migrate-v5/migrate-v5.js.map +1 -0
- package/codemods/migrate-v5/removed-symbols.d.ts +7 -0
- package/codemods/migrate-v5/removed-symbols.js +122 -0
- package/codemods/migrate-v5/removed-symbols.js.map +1 -0
- package/package.json +44 -55
- package/schematics/resource/files/__name@dasherize__.entity.ts.template +3 -3
- package/schematics.tsbuildinfo +1 -1
- package/src/adapters/socket-adapter.js +5 -6
- package/src/adapters/socket-adapter.js.map +1 -1
- package/src/builders/route-decorators/auth-decorators.builder.d.ts +1 -1
- package/src/builders/route-decorators/route-decorators.builder.d.ts +2 -1
- package/src/builders/route-decorators/route-decorators.builder.js +5 -4
- package/src/builders/route-decorators/route-decorators.builder.js.map +1 -1
- package/src/decorators/entity-exists.decorator.js +2 -2
- package/src/decorators/entity-exists.decorator.js.map +1 -1
- package/src/decorators/index.d.ts +2 -5
- package/src/decorators/index.js +4 -5
- package/src/decorators/index.js.map +1 -1
- package/src/decorators/is-unique.decorator.js +2 -2
- package/src/decorators/is-unique.decorator.js.map +1 -1
- package/src/decorators/schema.decorator.d.ts +5 -0
- package/src/decorators/schema.decorator.js +15 -0
- package/src/decorators/schema.decorator.js.map +1 -0
- package/src/dtos/index.d.ts +0 -4
- package/src/dtos/index.js +0 -4
- package/src/dtos/index.js.map +1 -1
- package/src/dynamic-api.module.d.ts +1 -1
- package/src/dynamic-api.module.js +25 -20
- package/src/dynamic-api.module.js.map +1 -1
- package/src/gateways/base.gateway.js +9 -8
- package/src/gateways/base.gateway.js.map +1 -1
- package/src/gateways/dynamic-api-broadcast.gateway.d.ts +2 -2
- package/src/gateways/dynamic-api-broadcast.gateway.js +5 -5
- package/src/gateways/dynamic-api-broadcast.gateway.js.map +1 -1
- package/src/guards/base-policies.guard.d.ts +1 -1
- package/src/guards/base-policies.guard.js +5 -5
- package/src/guards/base-policies.guard.js.map +1 -1
- package/src/guards/dynamic-api-jwt-auth.guard.d.ts +1 -1
- package/src/guards/dynamic-api-jwt-auth.guard.js +7 -4
- package/src/guards/dynamic-api-jwt-auth.guard.js.map +1 -1
- package/src/guards/jwt-socket.guard.d.ts +1 -1
- package/src/guards/jwt-socket.guard.js +9 -10
- package/src/guards/jwt-socket.guard.js.map +1 -1
- package/src/helpers/event-registry.store.js +2 -2
- package/src/helpers/event-registry.store.js.map +1 -1
- package/src/helpers/index-sync.helper.js +4 -4
- package/src/helpers/index-sync.helper.js.map +1 -1
- package/src/helpers/index.d.ts +4 -21
- package/src/helpers/index.js +8 -21
- package/src/helpers/index.js.map +1 -1
- package/src/helpers/mint-token-pair.helper.js +12 -12
- package/src/helpers/mint-token-pair.helper.js.map +1 -1
- package/src/helpers/mixin-data.helper.d.ts +2 -2
- package/src/helpers/mixin-data.helper.js +2 -2
- package/src/helpers/mixin-data.helper.js.map +1 -1
- package/src/helpers/mongo-transaction.helper.js.map +1 -1
- package/src/helpers/paging-presenter-warning.helper.js +2 -2
- package/src/helpers/paging-presenter-warning.helper.js.map +1 -1
- package/src/helpers/repository.helper.js +2 -2
- package/src/helpers/repository.helper.js.map +1 -1
- package/src/helpers/route-decorators.helper.d.ts +1 -1
- package/src/helpers/schema.helper.js.map +1 -1
- package/src/helpers/socket-config.helper.d.ts +0 -1
- package/src/helpers/socket-config.helper.js +9 -19
- package/src/helpers/socket-config.helper.js.map +1 -1
- package/src/helpers/swagger-config.helper.d.ts +2 -2
- package/src/helpers/swagger-config.helper.js.map +1 -1
- package/src/helpers/validation-config.helper.js.map +1 -1
- package/src/helpers/versioning-config.helper.js.map +1 -1
- package/src/index.d.ts +0 -9
- package/src/index.js +0 -9
- package/src/index.js.map +1 -1
- package/src/interceptors/dynamic-api-cache.interceptor.d.ts +1 -1
- package/src/interceptors/dynamic-api-cache.interceptor.js +4 -0
- package/src/interceptors/dynamic-api-cache.interceptor.js.map +1 -1
- package/src/interfaces/dynamic-api-options.interface.d.ts +2 -2
- package/src/interfaces/dynamic-api-presence.interface.d.ts +1 -0
- package/src/interfaces/dynamic-api-presence.interface.js.map +1 -1
- package/src/interfaces/dynamic-api-route-config.interface.d.ts +1 -2
- package/src/interfaces/dynamic-api-route-config.interface.js.map +1 -1
- package/src/interfaces/dynamic-api-schema-options.interface.d.ts +2 -3
- package/src/interfaces/dynamic-api-service-before-save-callback.interface.d.ts +1 -15
- package/src/interfaces/dynamic-api-service-callback.interface.d.ts +1 -3
- package/src/interfaces/dynamic-api-service-provider.interface.d.ts +1 -2
- package/src/interfaces/dynamic-api-swagger-options.type.d.ts +1 -3
- package/src/interfaces/index.d.ts +4 -7
- package/src/interfaces/index.js +0 -7
- package/src/interfaces/index.js.map +1 -1
- package/src/logger/index.d.ts +1 -1
- package/src/logger/index.js +0 -15
- package/src/logger/index.js.map +1 -1
- package/src/mixins/policies-guard.mixin.d.ts +2 -1
- package/src/mixins/policies-guard.mixin.js +3 -3
- package/src/mixins/policies-guard.mixin.js.map +1 -1
- package/src/models/base-entity.model.js.map +1 -1
- package/src/models/soft-deletable-entity.model.js.map +1 -1
- package/src/modules/auth/auth-broadcast.helper.js +2 -2
- package/src/modules/auth/auth-broadcast.helper.js.map +1 -1
- package/src/modules/auth/auth.helper.d.ts +3 -3
- package/src/modules/auth/auth.helper.js +12 -11
- package/src/modules/auth/auth.helper.js.map +1 -1
- package/src/modules/auth/auth.module.js +15 -11
- package/src/modules/auth/auth.module.js.map +1 -1
- package/src/modules/auth/guards/jwt-socket-auth/jwt-socket-auth.guard.d.ts +1 -1
- package/src/modules/auth/guards/jwt-socket-auth/jwt-socket-auth.guard.js +7 -8
- package/src/modules/auth/guards/jwt-socket-auth/jwt-socket-auth.guard.js.map +1 -1
- package/src/modules/auth/guards/jwt-socket-refresh/jwt-socket-refresh.guard.js +4 -4
- package/src/modules/auth/guards/jwt-socket-refresh/jwt-socket-refresh.guard.js.map +1 -1
- package/src/modules/auth/interfaces/auth-controller.interface.d.ts +1 -1
- package/src/modules/auth/interfaces/auth-gateway.interface.d.ts +2 -1
- package/src/modules/auth/mixins/auth-controller.mixin.js +23 -17
- package/src/modules/auth/mixins/auth-controller.mixin.js.map +1 -1
- package/src/modules/auth/mixins/auth-gateway.mixin.js +8 -6
- package/src/modules/auth/mixins/auth-gateway.mixin.js.map +1 -1
- package/src/modules/auth/mixins/auth-policies-guard.mixin.d.ts +2 -1
- package/src/modules/auth/mixins/auth-policies-guard.mixin.js +1 -1
- package/src/modules/auth/mixins/auth-policies-guard.mixin.js.map +1 -1
- package/src/modules/auth/models/otp-code.model.d.ts +4 -4
- package/src/modules/auth/services/base-auth.service.d.ts +2 -1
- package/src/modules/auth/services/base-auth.service.js +8 -6
- package/src/modules/auth/services/base-auth.service.js.map +1 -1
- package/src/modules/dynamic-api-config/dynamic-api-config.module.d.ts +1 -1
- package/src/modules/dynamic-api-config/dynamic-api-config.module.js +3 -3
- package/src/modules/dynamic-api-config/dynamic-api-config.module.js.map +1 -1
- package/src/modules/health/index.d.ts +1 -2
- package/src/modules/health/index.js +3 -16
- package/src/modules/health/index.js.map +1 -1
- package/src/modules/presence/index.d.ts +1 -5
- package/src/modules/presence/index.js +3 -19
- package/src/modules/presence/index.js.map +1 -1
- package/src/modules/presence/presence.gateway.d.ts +1 -1
- package/src/modules/presence/presence.gateway.js +5 -5
- package/src/modules/presence/presence.gateway.js.map +1 -1
- package/src/modules/presence/presence.module.js +10 -9
- package/src/modules/presence/presence.module.js.map +1 -1
- package/src/routes/aggregate/aggregate-controller.mixin.d.ts +2 -2
- package/src/routes/aggregate/aggregate-controller.mixin.js +12 -8
- package/src/routes/aggregate/aggregate-controller.mixin.js.map +1 -1
- package/src/routes/aggregate/aggregate-gateway.interface.d.ts +2 -1
- package/src/routes/aggregate/aggregate-gateway.mixin.d.ts +2 -2
- package/src/routes/aggregate/aggregate-gateway.mixin.js +10 -7
- package/src/routes/aggregate/aggregate-gateway.mixin.js.map +1 -1
- package/src/routes/aggregate/aggregate.helper.d.ts +5 -4
- package/src/routes/aggregate/aggregate.helper.js +10 -10
- package/src/routes/aggregate/aggregate.helper.js.map +1 -1
- package/src/routes/aggregate/aggregate.module.d.ts +2 -2
- package/src/routes/aggregate/aggregate.module.js +4 -3
- package/src/routes/aggregate/aggregate.module.js.map +1 -1
- package/src/routes/aggregate/base-aggregate.service.d.ts +1 -1
- package/src/routes/aggregate/base-aggregate.service.js +2 -2
- package/src/routes/aggregate/base-aggregate.service.js.map +1 -1
- package/src/routes/create-many/base-create-many.service.d.ts +1 -1
- package/src/routes/create-many/base-create-many.service.js +5 -5
- package/src/routes/create-many/base-create-many.service.js.map +1 -1
- package/src/routes/create-many/create-many-controller.interface.d.ts +1 -1
- package/src/routes/create-many/create-many-controller.mixin.d.ts +2 -2
- package/src/routes/create-many/create-many-controller.mixin.js +16 -11
- package/src/routes/create-many/create-many-controller.mixin.js.map +1 -1
- package/src/routes/create-many/create-many-gateway.interface.d.ts +2 -1
- package/src/routes/create-many/create-many-gateway.mixin.d.ts +2 -2
- package/src/routes/create-many/create-many-gateway.mixin.js +10 -7
- package/src/routes/create-many/create-many-gateway.mixin.js.map +1 -1
- package/src/routes/create-many/create-many.helper.d.ts +5 -4
- package/src/routes/create-many/create-many.helper.js +13 -13
- package/src/routes/create-many/create-many.helper.js.map +1 -1
- package/src/routes/create-many/create-many.module.js +6 -5
- package/src/routes/create-many/create-many.module.js.map +1 -1
- package/src/routes/create-one/base-create-one.service.d.ts +1 -1
- package/src/routes/create-one/base-create-one.service.js +5 -5
- package/src/routes/create-one/base-create-one.service.js.map +1 -1
- package/src/routes/create-one/create-one-controller.interface.d.ts +1 -1
- package/src/routes/create-one/create-one-controller.mixin.d.ts +2 -2
- package/src/routes/create-one/create-one-controller.mixin.js +14 -10
- package/src/routes/create-one/create-one-controller.mixin.js.map +1 -1
- package/src/routes/create-one/create-one-gateway.interface.d.ts +2 -1
- package/src/routes/create-one/create-one-gateway.mixin.d.ts +2 -2
- package/src/routes/create-one/create-one-gateway.mixin.js +10 -7
- package/src/routes/create-one/create-one-gateway.mixin.js.map +1 -1
- package/src/routes/create-one/create-one.helper.d.ts +5 -4
- package/src/routes/create-one/create-one.helper.js +13 -13
- package/src/routes/create-one/create-one.helper.js.map +1 -1
- package/src/routes/create-one/create-one.module.js +6 -5
- package/src/routes/create-one/create-one.module.js.map +1 -1
- package/src/routes/custom/create-custom-route-controller.js +15 -13
- package/src/routes/custom/create-custom-route-controller.js.map +1 -1
- package/src/routes/custom/create-custom-route-gateway.js +12 -10
- package/src/routes/custom/create-custom-route-gateway.js.map +1 -1
- package/src/routes/custom/custom-route-callback.service.d.ts +1 -1
- package/src/routes/custom/custom-route-callback.service.js +2 -2
- package/src/routes/custom/custom-route-callback.service.js.map +1 -1
- package/src/routes/delete-many/base-delete-many.service.d.ts +2 -2
- package/src/routes/delete-many/base-delete-many.service.js +5 -5
- package/src/routes/delete-many/base-delete-many.service.js.map +1 -1
- package/src/routes/delete-many/delete-many-controller.interface.d.ts +2 -2
- package/src/routes/delete-many/delete-many-controller.mixin.d.ts +2 -2
- package/src/routes/delete-many/delete-many-controller.mixin.js +14 -10
- package/src/routes/delete-many/delete-many-controller.mixin.js.map +1 -1
- package/src/routes/delete-many/delete-many-gateway.interface.d.ts +3 -2
- package/src/routes/delete-many/delete-many-gateway.mixin.d.ts +2 -2
- package/src/routes/delete-many/delete-many-gateway.mixin.js +10 -7
- package/src/routes/delete-many/delete-many-gateway.mixin.js.map +1 -1
- package/src/routes/delete-many/delete-many.helper.d.ts +5 -4
- package/src/routes/delete-many/delete-many.helper.js +13 -13
- package/src/routes/delete-many/delete-many.helper.js.map +1 -1
- package/src/routes/delete-many/delete-many.module.js +6 -5
- package/src/routes/delete-many/delete-many.module.js.map +1 -1
- package/src/routes/delete-one/base-delete-one.service.d.ts +2 -2
- package/src/routes/delete-one/base-delete-one.service.js +5 -5
- package/src/routes/delete-one/base-delete-one.service.js.map +1 -1
- package/src/routes/delete-one/delete-one-controller.interface.d.ts +1 -1
- package/src/routes/delete-one/delete-one-controller.mixin.d.ts +2 -2
- package/src/routes/delete-one/delete-one-controller.mixin.js +14 -10
- package/src/routes/delete-one/delete-one-controller.mixin.js.map +1 -1
- package/src/routes/delete-one/delete-one-gateway.interface.d.ts +3 -2
- package/src/routes/delete-one/delete-one-gateway.mixin.d.ts +2 -2
- package/src/routes/delete-one/delete-one-gateway.mixin.js +10 -7
- package/src/routes/delete-one/delete-one-gateway.mixin.js.map +1 -1
- package/src/routes/delete-one/delete-one.helper.d.ts +5 -4
- package/src/routes/delete-one/delete-one.helper.js +13 -13
- package/src/routes/delete-one/delete-one.helper.js.map +1 -1
- package/src/routes/delete-one/delete-one.module.js +6 -5
- package/src/routes/delete-one/delete-one.module.js.map +1 -1
- package/src/routes/duplicate-many/base-duplicate-many.service.d.ts +1 -1
- package/src/routes/duplicate-many/base-duplicate-many.service.js +4 -4
- package/src/routes/duplicate-many/base-duplicate-many.service.js.map +1 -1
- package/src/routes/duplicate-many/duplicate-many-controller.interface.d.ts +1 -1
- package/src/routes/duplicate-many/duplicate-many-controller.mixin.d.ts +2 -2
- package/src/routes/duplicate-many/duplicate-many-controller.mixin.js +16 -11
- package/src/routes/duplicate-many/duplicate-many-controller.mixin.js.map +1 -1
- package/src/routes/duplicate-many/duplicate-many-gateway.interface.d.ts +3 -2
- package/src/routes/duplicate-many/duplicate-many-gateway.mixin.d.ts +2 -2
- package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js +10 -7
- package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js.map +1 -1
- package/src/routes/duplicate-many/duplicate-many.helper.d.ts +5 -4
- package/src/routes/duplicate-many/duplicate-many.helper.js +13 -13
- package/src/routes/duplicate-many/duplicate-many.helper.js.map +1 -1
- package/src/routes/duplicate-many/duplicate-many.module.js +6 -5
- package/src/routes/duplicate-many/duplicate-many.module.js.map +1 -1
- package/src/routes/duplicate-one/base-duplicate-one.service.d.ts +1 -1
- package/src/routes/duplicate-one/base-duplicate-one.service.js +4 -4
- package/src/routes/duplicate-one/base-duplicate-one.service.js.map +1 -1
- package/src/routes/duplicate-one/duplicate-one-controller.interface.d.ts +1 -1
- package/src/routes/duplicate-one/duplicate-one-controller.mixin.d.ts +2 -2
- package/src/routes/duplicate-one/duplicate-one-controller.mixin.js +18 -13
- package/src/routes/duplicate-one/duplicate-one-controller.mixin.js.map +1 -1
- package/src/routes/duplicate-one/duplicate-one-gateway.interface.d.ts +3 -2
- package/src/routes/duplicate-one/duplicate-one-gateway.mixin.d.ts +2 -2
- package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js +10 -7
- package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js.map +1 -1
- package/src/routes/duplicate-one/duplicate-one.helper.d.ts +5 -4
- package/src/routes/duplicate-one/duplicate-one.helper.js +13 -13
- package/src/routes/duplicate-one/duplicate-one.helper.js.map +1 -1
- package/src/routes/duplicate-one/duplicate-one.module.js +6 -5
- package/src/routes/duplicate-one/duplicate-one.module.js.map +1 -1
- package/src/routes/get-many/base-get-many.service.d.ts +1 -1
- package/src/routes/get-many/base-get-many.service.js +2 -2
- package/src/routes/get-many/base-get-many.service.js.map +1 -1
- package/src/routes/get-many/get-many-controller.mixin.d.ts +2 -2
- package/src/routes/get-many/get-many-controller.mixin.js +13 -10
- package/src/routes/get-many/get-many-controller.mixin.js.map +1 -1
- package/src/routes/get-many/get-many-gateway.interface.d.ts +2 -1
- package/src/routes/get-many/get-many-gateway.mixin.d.ts +2 -2
- package/src/routes/get-many/get-many-gateway.mixin.js +10 -8
- package/src/routes/get-many/get-many-gateway.mixin.js.map +1 -1
- package/src/routes/get-many/get-many.helper.d.ts +5 -4
- package/src/routes/get-many/get-many.helper.js +10 -10
- package/src/routes/get-many/get-many.helper.js.map +1 -1
- package/src/routes/get-many/get-many.module.js +4 -3
- package/src/routes/get-many/get-many.module.js.map +1 -1
- package/src/routes/get-one/base-get-one.service.d.ts +1 -1
- package/src/routes/get-one/base-get-one.service.js +2 -2
- package/src/routes/get-one/base-get-one.service.js.map +1 -1
- package/src/routes/get-one/get-one-controller.mixin.d.ts +2 -2
- package/src/routes/get-one/get-one-controller.mixin.js +11 -8
- package/src/routes/get-one/get-one-controller.mixin.js.map +1 -1
- package/src/routes/get-one/get-one-gateway.interface.d.ts +3 -2
- package/src/routes/get-one/get-one-gateway.mixin.d.ts +2 -2
- package/src/routes/get-one/get-one-gateway.mixin.js +9 -7
- package/src/routes/get-one/get-one-gateway.mixin.js.map +1 -1
- package/src/routes/get-one/get-one.helper.d.ts +5 -4
- package/src/routes/get-one/get-one.helper.js +10 -10
- package/src/routes/get-one/get-one.helper.js.map +1 -1
- package/src/routes/get-one/get-one.module.js +4 -3
- package/src/routes/get-one/get-one.module.js.map +1 -1
- package/src/routes/replace-one/base-replace-one.service.d.ts +1 -1
- package/src/routes/replace-one/base-replace-one.service.js +5 -5
- package/src/routes/replace-one/base-replace-one.service.js.map +1 -1
- package/src/routes/replace-one/replace-one-controller.interface.d.ts +1 -1
- package/src/routes/replace-one/replace-one-controller.mixin.d.ts +2 -2
- package/src/routes/replace-one/replace-one-controller.mixin.js +16 -12
- package/src/routes/replace-one/replace-one-controller.mixin.js.map +1 -1
- package/src/routes/replace-one/replace-one-gateway.interface.d.ts +3 -2
- package/src/routes/replace-one/replace-one-gateway.mixin.d.ts +2 -2
- package/src/routes/replace-one/replace-one-gateway.mixin.js +8 -6
- package/src/routes/replace-one/replace-one-gateway.mixin.js.map +1 -1
- package/src/routes/replace-one/replace-one.helper.d.ts +5 -4
- package/src/routes/replace-one/replace-one.helper.js +13 -13
- package/src/routes/replace-one/replace-one.helper.js.map +1 -1
- package/src/routes/replace-one/replace-one.module.js +6 -5
- package/src/routes/replace-one/replace-one.module.js.map +1 -1
- package/src/routes/update-many/base-update-many.service.d.ts +1 -1
- package/src/routes/update-many/base-update-many.service.js +4 -4
- package/src/routes/update-many/base-update-many.service.js.map +1 -1
- package/src/routes/update-many/update-many-controller.interface.d.ts +1 -1
- package/src/routes/update-many/update-many-controller.mixin.d.ts +2 -2
- package/src/routes/update-many/update-many-controller.mixin.js +16 -11
- package/src/routes/update-many/update-many-controller.mixin.js.map +1 -1
- package/src/routes/update-many/update-many-gateway.interface.d.ts +3 -2
- package/src/routes/update-many/update-many-gateway.mixin.d.ts +2 -2
- package/src/routes/update-many/update-many-gateway.mixin.js +10 -7
- package/src/routes/update-many/update-many-gateway.mixin.js.map +1 -1
- package/src/routes/update-many/update-many.helper.d.ts +5 -4
- package/src/routes/update-many/update-many.helper.js +13 -13
- package/src/routes/update-many/update-many.helper.js.map +1 -1
- package/src/routes/update-many/update-many.module.js +6 -5
- package/src/routes/update-many/update-many.module.js.map +1 -1
- package/src/routes/update-one/base-update-one.service.d.ts +1 -1
- package/src/routes/update-one/base-update-one.service.js +5 -5
- package/src/routes/update-one/base-update-one.service.js.map +1 -1
- package/src/routes/update-one/update-one-controller.interface.d.ts +1 -1
- package/src/routes/update-one/update-one-controller.mixin.d.ts +2 -2
- package/src/routes/update-one/update-one-controller.mixin.js +18 -13
- package/src/routes/update-one/update-one-controller.mixin.js.map +1 -1
- package/src/routes/update-one/update-one-gateway.interface.d.ts +3 -2
- package/src/routes/update-one/update-one-gateway.mixin.d.ts +2 -2
- package/src/routes/update-one/update-one-gateway.mixin.js +8 -6
- package/src/routes/update-one/update-one-gateway.mixin.js.map +1 -1
- package/src/routes/update-one/update-one.helper.d.ts +5 -4
- package/src/routes/update-one/update-one.helper.js +13 -13
- package/src/routes/update-one/update-one.helper.js.map +1 -1
- package/src/routes/update-one/update-one.module.js +6 -5
- package/src/routes/update-one/update-one.module.js.map +1 -1
- package/src/services/base/base.service.js +3 -4
- package/src/services/base/base.service.js.map +1 -1
- package/src/services/bcrypt/bcrypt.service.js.map +1 -1
- package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.js +4 -4
- package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.js.map +1 -1
- package/src/services/dynamic-api-cache/dynamic-api-cache.service.js +2 -2
- package/src/services/dynamic-api-cache/dynamic-api-cache.service.js.map +1 -1
- package/src/services/dynamic-api-entity/dynamic-api-entity.service.d.ts +6 -0
- package/src/services/dynamic-api-entity/dynamic-api-entity.service.js +11 -0
- package/src/services/dynamic-api-entity/dynamic-api-entity.service.js.map +1 -0
- package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.d.ts +6 -2
- package/src/services/index.d.ts +1 -2
- package/src/services/index.js +1 -2
- package/src/services/index.js.map +1 -1
- package/src/testing/create-dynamic-api-testing-app.js +1 -1
- package/src/testing/create-dynamic-api-testing-app.js.map +1 -1
- package/src/utils/index.d.ts +0 -1
- package/src/utils/index.js +0 -1
- package/src/utils/index.js.map +1 -1
- package/src/version.json +1 -1
- package/test/e2e.setup.d.ts +3 -3
- package/test/e2e.setup.js +8 -7
- package/test/e2e.setup.js.map +1 -1
- package/test/for-feature/ability-predicate-filter.e2e-spec.js +20 -20
- package/test/for-feature/ability-predicate-filter.e2e-spec.js.map +1 -1
- package/test/for-feature/ability-predicates.e2e-spec.js +28 -27
- package/test/for-feature/ability-predicates.e2e-spec.js.map +1 -1
- package/test/for-feature/after-save-callback-reliability.e2e-spec.js +35 -34
- package/test/for-feature/after-save-callback-reliability.e2e-spec.js.map +1 -1
- package/test/for-feature/aggregate-ability-predicate-paging.e2e-spec.js +20 -19
- package/test/for-feature/aggregate-ability-predicate-paging.e2e-spec.js.map +1 -1
- package/test/for-feature/aggregate-paging-without-from-aggregate.e2e-spec.js +11 -10
- package/test/for-feature/aggregate-paging-without-from-aggregate.e2e-spec.js.map +1 -1
- package/test/for-feature/aggregate-swagger-paginated-response.e2e-spec.js +18 -17
- package/test/for-feature/aggregate-swagger-paginated-response.e2e-spec.js.map +1 -1
- package/test/for-feature/audit-log.e2e-spec.js +26 -25
- package/test/for-feature/audit-log.e2e-spec.js.map +1 -1
- package/test/for-feature/base-entity.e2e-spec.js +126 -125
- package/test/for-feature/base-entity.e2e-spec.js.map +1 -1
- package/test/for-feature/broadcast-event-registry.e2e-spec.js +20 -19
- package/test/for-feature/broadcast-event-registry.e2e-spec.js.map +1 -1
- package/test/for-feature/cache-identity-key.e2e-spec.js +22 -21
- package/test/for-feature/cache-identity-key.e2e-spec.js.map +1 -1
- package/test/for-feature/cache-scoped-invalidation.e2e-spec.js +33 -32
- package/test/for-feature/cache-scoped-invalidation.e2e-spec.js.map +1 -1
- package/test/for-feature/callbacks-user.e2e-spec.js +159 -158
- package/test/for-feature/callbacks-user.e2e-spec.js.map +1 -1
- package/test/for-feature/cascade-and-before-delete.e2e-spec.js +47 -46
- package/test/for-feature/cascade-and-before-delete.e2e-spec.js.map +1 -1
- package/test/for-feature/cascade-transaction-atomicity.e2e-spec.js +17 -16
- package/test/for-feature/cascade-transaction-atomicity.e2e-spec.js.map +1 -1
- package/test/for-feature/custom-route-auth-ability-predicate.e2e-spec.js +17 -16
- package/test/for-feature/custom-route-auth-ability-predicate.e2e-spec.js.map +1 -1
- package/test/for-feature/custom-route-inject.e2e-spec.js +9 -8
- package/test/for-feature/custom-route-inject.e2e-spec.js.map +1 -1
- package/test/for-feature/custom-route-params-openapi.e2e-spec.js +10 -9
- package/test/for-feature/custom-route-params-openapi.e2e-spec.js.map +1 -1
- package/test/for-feature/custom-route-target-param.e2e-spec.js +14 -13
- package/test/for-feature/custom-route-target-param.e2e-spec.js.map +1 -1
- package/test/for-feature/custom-routes.e2e-spec.js +38 -38
- package/test/for-feature/custom-routes.e2e-spec.js.map +1 -1
- package/test/for-feature/db-aware-validators.e2e-spec.js +40 -39
- package/test/for-feature/db-aware-validators.e2e-spec.js.map +1 -1
- package/test/for-feature/derived-fields-protected-from-user.e2e-spec.js +39 -38
- package/test/for-feature/derived-fields-protected-from-user.e2e-spec.js.map +1 -1
- package/test/for-feature/derived-fields-raw-write-recompute.e2e-spec.js +25 -24
- package/test/for-feature/derived-fields-raw-write-recompute.e2e-spec.js.map +1 -1
- package/test/for-feature/exclude-from-response.e2e-spec.js +21 -20
- package/test/for-feature/exclude-from-response.e2e-spec.js.map +1 -1
- package/test/for-feature/http-broadcast.e2e-spec.js +62 -61
- package/test/for-feature/http-broadcast.e2e-spec.js.map +1 -1
- package/test/for-feature/index-sync.e2e-spec.js +39 -28
- package/test/for-feature/index-sync.e2e-spec.js.map +1 -1
- package/test/for-feature/paging-query-helper.e2e-spec.js +21 -20
- package/test/for-feature/paging-query-helper.e2e-spec.js.map +1 -1
- package/test/for-feature/populate.e2e-spec.js +18 -17
- package/test/for-feature/populate.e2e-spec.js.map +1 -1
- package/test/for-feature/presence.e2e-spec.js +40 -18
- package/test/for-feature/presence.e2e-spec.js.map +1 -1
- package/test/for-feature/raw-update-callback-methods.e2e-spec.js +49 -48
- package/test/for-feature/raw-update-callback-methods.e2e-spec.js.map +1 -1
- package/test/for-feature/room-broadcast.e2e-spec.js +61 -60
- package/test/for-feature/room-broadcast.e2e-spec.js.map +1 -1
- package/test/for-feature/soft-deletable-entity.e2e-spec.js +136 -135
- package/test/for-feature/soft-deletable-entity.e2e-spec.js.map +1 -1
- package/test/for-feature/websockets.e2e-spec.js +54 -53
- package/test/for-feature/websockets.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-basic.e2e-spec.js +94 -93
- package/test/for-root/auth-api-basic.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-broadcast.e2e-spec.js +24 -23
- package/test/for-root/auth-api-broadcast.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-login.e2e-spec.js +99 -97
- package/test/for-root/auth-api-login.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-logout.e2e-spec.js +18 -17
- package/test/for-root/auth-api-logout.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-mint-token-pair.e2e-spec.js +17 -16
- package/test/for-root/auth-api-mint-token-pair.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-passwordless.e2e-spec.js +37 -36
- package/test/for-root/auth-api-passwordless.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-rate-limit.e2e-spec.js +14 -13
- package/test/for-root/auth-api-rate-limit.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-refresh-token-cookie.e2e-spec.js +27 -26
- package/test/for-root/auth-api-refresh-token-cookie.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-refresh-token.e2e-spec.js +93 -54
- package/test/for-root/auth-api-refresh-token.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-register.e2e-spec.js +29 -27
- package/test/for-root/auth-api-register.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-reset-password.e2e-spec.js +50 -48
- package/test/for-root/auth-api-reset-password.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-update-account-derived-field.e2e-spec.js +9 -8
- package/test/for-root/auth-api-update-account-derived-field.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-update-account.e2e-spec.js +38 -37
- package/test/for-root/auth-api-update-account.e2e-spec.js.map +1 -1
- package/test/for-root/health-check.e2e-spec.js +21 -20
- package/test/for-root/health-check.e2e-spec.js.map +1 -1
- package/test/for-root/initialization.e2e-spec.js +10 -9
- package/test/for-root/initialization.e2e-spec.js.map +1 -1
- package/test/for-root/websockets-auth-basic.e2e-spec.js +115 -114
- package/test/for-root/websockets-auth-basic.e2e-spec.js.map +1 -1
- package/test/for-root/websockets-auth-broadcast.e2e-spec.js +26 -25
- package/test/for-root/websockets-auth-broadcast.e2e-spec.js.map +1 -1
- package/test/for-root/websockets-auth-login.e2e-spec.js +40 -38
- package/test/for-root/websockets-auth-login.e2e-spec.js.map +1 -1
- package/test/for-root/websockets-auth-refresh-token.e2e-spec.js +22 -21
- package/test/for-root/websockets-auth-refresh-token.e2e-spec.js.map +1 -1
- package/test/for-root/websockets-auth-register.e2e-spec.js +36 -34
- package/test/for-root/websockets-auth-register.e2e-spec.js.map +1 -1
- package/test/for-root/websockets-auth-reset-password.e2e-spec.js +56 -54
- package/test/for-root/websockets-auth-reset-password.e2e-spec.js.map +1 -1
- package/test/helpers/create-mock.helper.d.ts +12 -0
- package/test/helpers/create-mock.helper.js +58 -0
- package/test/helpers/create-mock.helper.js.map +1 -0
- package/test/helpers/index.d.ts +1 -0
- package/test/helpers/index.js +18 -0
- package/test/helpers/index.js.map +1 -0
- package/test/helpers/register-ts-require-hook.d.ts +1 -0
- package/test/helpers/register-ts-require-hook.js +20 -0
- package/test/helpers/register-ts-require-hook.js.map +1 -0
- package/test/shared/entities/refresh-token-user.factory.d.ts +1 -0
- package/test/shared/entities/refresh-token-user.factory.js +4 -0
- package/test/shared/entities/refresh-token-user.factory.js.map +1 -1
- package/test/testing/create-dynamic-api-testing-app.e2e-spec.js +17 -15
- package/test/testing/create-dynamic-api-testing-app.e2e-spec.js.map +1 -1
- package/test/utils.d.ts +5 -1
- package/test/utils.js +2 -2
- package/test/utils.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/src/decorators/schema-options.decorator.d.ts +0 -5
- package/src/decorators/schema-options.decorator.js +0 -14
- package/src/decorators/schema-options.decorator.js.map +0 -1
- package/src/utils/deep-patial.d.ts +0 -1
- package/src/utils/deep-patial.js +0 -3
- package/src/utils/deep-patial.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,159 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
|
|
3
|
+
## [5.1.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v5.0.0...v5.1.0) (2026-09-03)
|
|
4
|
+
|
|
5
|
+
### ci
|
|
6
|
+
|
|
7
|
+
* **ci:** stop rebasing develop onto main for every release — fast-forward only ([5071caa](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/5071caad5b509c2c507d2b059971375462a590cb)), closes [#2681](https://github.com/MikeDev75015/mongodb-dynamic-api/issues/2681) [#2703](https://github.com/MikeDev75015/mongodb-dynamic-api/issues/2703)
|
|
8
|
+
|
|
9
|
+
### quality
|
|
10
|
+
|
|
11
|
+
* **quality:** avoid implicit ObjectId stringification in refreshToken (S6551) ([32dd5c2](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/32dd5c2f291e556678c75ce52095e46d9a7bc7ad))
|
|
12
|
+
|
|
13
|
+
### presence
|
|
14
|
+
|
|
15
|
+
* **presence:** add enableGateway option; export isTransactionsUnsupportedError ([65e3074](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/65e3074645fe4beca3bfcbd15f46127e259fb3b7))
|
|
16
|
+
|
|
17
|
+
### mint-token-pair
|
|
18
|
+
|
|
19
|
+
* **mint-token-pair:** resolve the entity model via the public DynamicApiEntityService ([c1110bd](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/c1110bd2e28858177e81a7496d2ad59d81f6ece9))
|
|
20
|
+
|
|
21
|
+
### migrate-v5
|
|
22
|
+
|
|
23
|
+
* **migrate-v5:** search every import declaration for a module, not just the first ([b24dee4](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/b24dee4dc189ca5a15fbfaa18e3c21d3e27b323d))
|
|
24
|
+
|
|
25
|
+
### auth
|
|
26
|
+
|
|
27
|
+
* **auth:** rebuild refresh-token claims from the DB, not the stale JWT payload ([866df26](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/866df26332101b7830a94168c5c3e5ef23671187))
|
|
28
|
+
|
|
29
|
+
## [5.0.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.24.1...v5.0.0) (2026-09-03)
|
|
30
|
+
|
|
31
|
+
### ⚠ BREAKING CHANGES
|
|
32
|
+
|
|
33
|
+
* **websockets:** WebSocket clients connecting with `io(url, { query: {
|
|
34
|
+
accessToken } })` are no longer authenticated — switch to `io(url, { auth: {
|
|
35
|
+
token } })`.
|
|
36
|
+
|
|
37
|
+
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
38
|
+
Claude-Session: https://claude.ai/code/session_012Rfw85JqCRePDfX9utkEou
|
|
39
|
+
* **interfaces:** the following deprecated aliases are removed:
|
|
40
|
+
DynamicAPIRouteConfig (use DynamicApiRouteConfig), AnyBeforeSaveCallback
|
|
41
|
+
(use the per-route-typed beforeSaveCallback directly),
|
|
42
|
+
DynamicApiServiceBeforeSaveCreateContext/CreateManyContext/UpdateContext/
|
|
43
|
+
UpdateManyContext/ReplaceContext/DeleteContext/DeleteManyContext/
|
|
44
|
+
DuplicateContext/DuplicateManyContext (use the matching
|
|
45
|
+
BeforeSave*Context), DynamicApiServiceBeforeSaveCallback/ListCallback/
|
|
46
|
+
DeleteCallback/DeleteManyCallback (use the matching BeforeSave*Callback),
|
|
47
|
+
DynamicApiCallbackMethods (use CallbackMethods), DynamicApiServiceCallback
|
|
48
|
+
(use AfterSaveCallback), DynamicAPIServiceProvider (use
|
|
49
|
+
DynamicApiServiceProvider), DynamicAPISwaggerExtraConfig (use
|
|
50
|
+
DynamicApiSwaggerExtraConfig), DynamicAPISwaggerOptions (use
|
|
51
|
+
DynamicApiSwaggerOptions).
|
|
52
|
+
|
|
53
|
+
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
54
|
+
Claude-Session: https://claude.ai/code/session_012Rfw85JqCRePDfX9utkEou
|
|
55
|
+
* **websockets:** `enableDynamicAPIWebSockets(app, 50)` no longer works.
|
|
56
|
+
Use `enableDynamicAPIWebSockets(app, { maxListeners: 50 })` instead.
|
|
57
|
+
|
|
58
|
+
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
59
|
+
Claude-Session: https://claude.ai/code/session_012Rfw85JqCRePDfX9utkEou
|
|
60
|
+
* **schema:** the `DynamicApiSchemaOptions`/`DynamicAPISchemaOptions`
|
|
61
|
+
decorator and the `DynamicApiSchemaOptionsInterface`/`DynamicAPISchemaOptionsInterface`
|
|
62
|
+
type aliases are gone. Use `@DynamicApiSchema({ ...mongooseOptions, ...mdaOptions })`
|
|
63
|
+
instead of stacking `@Schema()` + the old decorator; `DynamicApiSchemaOptions` is
|
|
64
|
+
now the type name for just the MDA-specific options.
|
|
65
|
+
|
|
66
|
+
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
67
|
+
Claude-Session: https://claude.ai/code/session_012Rfw85JqCRePDfX9utkEou
|
|
68
|
+
* **services:** restore BcryptService and DynamicApiBroadcastService to the public API
|
|
69
|
+
* **utils:** `utils/deep-patial.ts` no longer exists. Nothing publicly
|
|
70
|
+
exported changes shape or name — `DeepPartial` continues to be exported the
|
|
71
|
+
same way it always has been.
|
|
72
|
+
|
|
73
|
+
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
74
|
+
Claude-Session: https://claude.ai/code/session_012Rfw85JqCRePDfX9utkEou
|
|
75
|
+
* **api:** the following are no longer exported from
|
|
76
|
+
`mongodb-dynamic-api`: `ApiEndpointVisibility`, `RateLimit`, `ValidatorPipe`,
|
|
77
|
+
`IS_PUBLIC_KEY`, `ManyEntityQuery`, `DeletePresenter`, `EntityParam`,
|
|
78
|
+
`EntityQuery`, `DynamicApiDecoratorBuilder`, `PoliciesGuard`,
|
|
79
|
+
`PoliciesGuardConstructor`, `AuthPoliciesGuardConstructor`, `RouteModule`,
|
|
80
|
+
`DYNAMIC_API_GLOBAL_STATE`, `Credentials`, `EntitySchemas`,
|
|
81
|
+
`DynamicApiGlobalState`, `AfterSaveCallbackConfig`, `GatewayResponse`, every
|
|
82
|
+
internal helper under `helpers/**` other than the `enableDynamicAPI*`
|
|
83
|
+
functions/`mintTokenPair`/`parsePagingParams`, `MongoDBDynamicApiLogger`,
|
|
84
|
+
`createHealthController`, `PresenceController`, `InMemoryPresenceAdapter`,
|
|
85
|
+
`RedisPresenceAdapter` and `createPresenceGateway`. None of these were ever
|
|
86
|
+
documented; none has a supported replacement.
|
|
87
|
+
|
|
88
|
+
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
89
|
+
Claude-Session: https://claude.ai/code/session_012Rfw85JqCRePDfX9utkEou
|
|
90
|
+
* **services:** `DynamicApiGlobalStateService` is no longer exported from
|
|
91
|
+
`mongodb-dynamic-api`. Use `DynamicApiEntityService.getModel(Entity)` instead
|
|
92
|
+
of `DynamicApiGlobalStateService.getEntityModel(Entity)` to resolve a
|
|
93
|
+
registered entity's Mongoose model outside the HTTP request cycle.
|
|
94
|
+
|
|
95
|
+
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|
96
|
+
Claude-Session: https://claude.ai/code/session_012Rfw85JqCRePDfX9utkEou
|
|
97
|
+
|
|
98
|
+
### schematics
|
|
99
|
+
|
|
100
|
+
* **schematics:** scaffold new entities with @DynamicApiSchema ([eec767f](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/eec767fcd9a3fc8e2521aeaff5b282ae379b8f6c))
|
|
101
|
+
|
|
102
|
+
### migrate-v5
|
|
103
|
+
|
|
104
|
+
* **migrate-v5:** add a codemod + CLI for the v4 to v5 upgrade ([85bddc6](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/85bddc6f83958b0e7dd9474801fb2e3ed1cbfbb1))
|
|
105
|
+
* **migrate-v5:** catch up the codemod with the deprecated-alias sweep ([313e790](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/313e7909dbebd1c03c068f00d7e6d0f342bfcd31))
|
|
106
|
+
|
|
107
|
+
### websockets
|
|
108
|
+
|
|
109
|
+
* **websockets:** remove deprecated numeric overload from enableDynamicAPIWebSockets ([3feb38f](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/3feb38f4f6b240c010bd7318f07cf23f01a00509))
|
|
110
|
+
* **websockets:** remove the deprecated query.accessToken auth fallback ([6e7de96](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/6e7de964e7260b87c767f5e4ae1bb016652dd343))
|
|
111
|
+
|
|
112
|
+
### interfaces
|
|
113
|
+
|
|
114
|
+
* **interfaces:** remove deprecated verbose/all-caps type aliases ([33ab1bf](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/33ab1bfdc180d58e3d51949503ee17333c0411f6))
|
|
115
|
+
|
|
116
|
+
### schema
|
|
117
|
+
|
|
118
|
+
* **schema:** add DynamicApiSchema decorator, replace @Schema + DynamicApiSchemaOptions ([ff49b49](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/ff49b49e0831d74423c574ea035ca62d165781a1))
|
|
119
|
+
|
|
120
|
+
### services
|
|
121
|
+
|
|
122
|
+
* **services:** expose DynamicApiEntityService.getModel instead of the internal DynamicApiGlobalStateService ([925c0c0](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/925c0c0aebee8aa62924ce54f3b8cd27333f5c58))
|
|
123
|
+
* **services:** restore BcryptService and DynamicApiBroadcastService to the public API ([89c317d](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/89c317d65bc8939c656481deb57b29735c596b94))
|
|
124
|
+
|
|
125
|
+
### utils
|
|
126
|
+
|
|
127
|
+
* **utils:** remove deep-patial typo alias ([b547822](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/b54782225377eeb3ac795cdfba3f8a5d83f50639))
|
|
128
|
+
|
|
129
|
+
### api
|
|
130
|
+
|
|
131
|
+
* **api:** curate decorators, dtos, interfaces, helpers, logger and health/presence exports ([4a62b79](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/4a62b79ee5efa076d13b4189f9f28374ba40ef2e))
|
|
132
|
+
|
|
133
|
+
### test
|
|
134
|
+
|
|
135
|
+
* **test:** Vitest codemod for 154 unit specs + 2 shared mock fixtures (migration Phase 3, partial) ([3f06e33](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/3f06e3317c6dd0cf7171c7c8040d5fa3f854fc03)), closes [#2](https://github.com/MikeDev75015/mongodb-dynamic-api/issues/2)
|
|
136
|
+
* **test:** Vitest codemod for 154 unit specs + 2 shared mock fixtures (migration Phase 3, partial) ([c3727df](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/c3727df5bb5ba4e7756c8c4b0a8ddab6b3cfa9a2)), closes [#2](https://github.com/MikeDev75015/mongodb-dynamic-api/issues/2)
|
|
137
|
+
* **test:** wire SWC into Vitest, convert 2 pilot unit specs (migration Phase 2) ([d8908dc](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/d8908dc7e01fe606842ea510e556684169c79a53))
|
|
138
|
+
|
|
139
|
+
### guards,cache
|
|
140
|
+
|
|
141
|
+
* **guards,cache:** bypass global HTTP-only guard/interceptor for websocket contexts under Nest 12 ([a2b078c](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a2b078c8c3419067a1ce484699fa894ace4aa91f))
|
|
142
|
+
|
|
143
|
+
### auth
|
|
144
|
+
|
|
145
|
+
* **auth:** register AuthModuleOptions to fix Nest 12 AuthGuard() DI regression ([64a0852](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/64a08523f62266733caee79fadff0e7201e9bd45))
|
|
146
|
+
|
|
147
|
+
### vitest
|
|
148
|
+
|
|
149
|
+
* **vitest:** 3 real production bugs surfaced by the e2e Vitest batch conversion ([684b6eb](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/684b6eba05a527958bbbea96d82a2ee82f370acb))
|
|
150
|
+
* **vitest:** convert all 53 e2e-spec files + shared e2e.setup.ts (Phase 3 complete) ([fc6bd55](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/fc6bd55c5b379954f2d8042930057c29e31382fd))
|
|
151
|
+
* **vitest:** convert the last 6 jest.requireActual unit specs (Phase 3 unit specs done) ([3f48c8b](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/3f48c8b098f5a86d060f6310df4a824d554f738d)), closes [#2](https://github.com/MikeDev75015/mongodb-dynamic-api/issues/2)
|
|
152
|
+
* **vitest:** cut CI over from Jest to Vitest (Phase 4) ([ed758b9](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/ed758b9fb5ebea569d7fb51a4cfb0f4859693d1e))
|
|
153
|
+
* **vitest:** register a native require() hook for .ts, closing the schematics gap ([f6b2340](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f6b23403bf1c8533ae811e4f04deccbb630ba4b5))
|
|
154
|
+
* **vitest:** repair 22 spec files after switching to a real vitest run (Phase 3) ([7af1830](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/7af1830c1fe74b3943a487c6ee263d89559446b7))
|
|
155
|
+
* **vitest:** stop mint-token-pair from resetting global state on every call ([50e5ddb](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/50e5ddb9d3bf4227b832576c3cdc7446b87e2a4f))
|
|
156
|
+
|
|
3
157
|
## [4.24.1](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.24.0...v4.24.1) (2026-09-01)
|
|
4
158
|
|
|
5
159
|
### aggregate
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<p align="center">
|
|
2
2
|
<h1 align="center">mongodb-dynamic-api</h1>
|
|
3
3
|
<p align="center">
|
|
4
|
-
A production-ready <strong>NestJS
|
|
4
|
+
A production-ready <strong>NestJS 12</strong> module that instantly generates fully typed REST APIs + WebSockets<br/>
|
|
5
5
|
for any MongoDB collection — zero boilerplate, enterprise features included.
|
|
6
6
|
</p>
|
|
7
7
|
</p>
|
|
@@ -25,6 +25,82 @@
|
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
28
|
+
> [!WARNING]
|
|
29
|
+
> **v5 — Breaking changes.** The package's public export surface was curated: internal implementation classes, mixins, builders and helpers that were never meant to be imported directly are no longer exported from `mongodb-dynamic-api`. Everything documented in this README and in `README/*.md` is unaffected.
|
|
30
|
+
>
|
|
31
|
+
> 🚚 **`npx mongodb-dynamic-api migrate-v5 <path>`** applies every mechanical rename below (`DynamicApiGlobalStateService` → `DynamicApiEntityService`, `@Schema`+`@DynamicApiSchemaOptions` → `@DynamicApiSchema`, every verbose/all-caps alias → its short name, `enableDynamicAPIWebSockets`'s numeric overload → the options-object form) across your codebase automatically, and flags anything else it can't safely fix — including a note on the `query.accessToken` client-side change it cannot detect. See [migration-v5.md](./README/migration-v5.md).
|
|
32
|
+
>
|
|
33
|
+
> <details>
|
|
34
|
+
> <summary>📋 Full list of removed public exports (v4 → v5)</summary>
|
|
35
|
+
>
|
|
36
|
+
> ### Why
|
|
37
|
+
> Since v1, every internal file was re-exported through `export *` barrels, so essentially every class/function/type under `libs/dynamic-api/src/**` leaked into the package's public API — including plumbing that only exists to build the auto-generated routes internally. None of it was ever documented, and importing it directly was never a supported usage. v5 curates the barrel down to what real consumers actually use.
|
|
38
|
+
>
|
|
39
|
+
> ### Removed — routes internals
|
|
40
|
+
> Every `Base*Service`, controller/gateway/presenter/body mixin, controller/gateway/service interface, route `*Module` class and route `*.helper.ts` factory function for all 12 route types (`Aggregate`, `CreateOne`/`CreateMany`, `UpdateOne`/`UpdateMany`, `ReplaceOne`, `DuplicateOne`/`DuplicateMany`, `DeleteOne`/`DeleteMany`, `GetOne`/`GetMany`), plus `createCustomRouteController`/`createCustomRouteGateway` and `createCachePurgeController`.
|
|
41
|
+
>
|
|
42
|
+
> ### Removed — base services
|
|
43
|
+
> `BaseService`, `DynamicApiGlobalStateService`.
|
|
44
|
+
> `DynamicApiGlobalStateService.getEntityModel()` — the one capability consumers actually relied on (resolving a registered entity's Mongoose model outside the HTTP cycle) — is now exposed through a new, narrow **`DynamicApiEntityService.getModel(Entity)`**, a `static` method (no DI required — callable from a bootstrap function, a cron job, or any plain utility) . See [caching.md](./README/caching.md) for the updated example.
|
|
45
|
+
>
|
|
46
|
+
> `BcryptService` and `DynamicApiBroadcastService` were briefly removed in an earlier draft of this cleanup and are **kept public** — both are small, self-contained utilities real consumers reach for directly (password hashing outside `useAuth`; broadcasting from a custom route with the same room-resolution and error-isolation guarantees as the auto-generated routes). See the [Unaffected](#unaffected) list below.
|
|
47
|
+
>
|
|
48
|
+
> ### Removed — mixins & builders
|
|
49
|
+
> `RoutePoliciesGuardMixin`, `SocketPoliciesGuardMixin`, `EntityBodyMixin`, `EntityPresenterMixin`, `AuthDecoratorsBuilder`, `RouteDecoratorsBuilder`.
|
|
50
|
+
>
|
|
51
|
+
> ### Removed — guards, gateways, interceptors, filters, logger
|
|
52
|
+
> `BasePoliciesGuard`, `BaseSocketPoliciesGuard`, `DynamicApiJwtAuthGuard`, `JwtSocketGuard` and every internal auth guard (`JwtAuthGuard`, `JwtRefreshGuard`, `JwtSocketAuthGuard`, `JwtSocketRefreshGuard`, `LocalAuthGuard`, `PasswordlessGuard`, `ResetPasswordGuard`); `BaseGateway`, `createDynamicApiBroadcastGateway`; `DynamicApiCacheInterceptor`, `MergeIdParamInterceptor`; `DynamicAPIWsExceptionFilter`; `MongoDBDynamicApiLogger`.
|
|
53
|
+
>
|
|
54
|
+
> ### Removed — internal DTOs & decorators
|
|
55
|
+
> `ManyEntityQuery`, `DeletePresenter`, `EntityParam`, `EntityQuery`; `ApiEndpointVisibility`, `RateLimit`, `ValidatorPipe`, `IS_PUBLIC_KEY`.
|
|
56
|
+
>
|
|
57
|
+
> ### Removed — internal interfaces
|
|
58
|
+
> `DynamicApiDecoratorBuilder`, `PoliciesGuard`, `PoliciesGuardConstructor`, `AuthPoliciesGuardConstructor`, `RouteModule`, `DYNAMIC_API_GLOBAL_STATE`, `Credentials`, `EntitySchemas`, `DynamicApiGlobalState`, `AfterSaveCallbackConfig`, `GatewayResponse`.
|
|
59
|
+
>
|
|
60
|
+
> ### Removed — internal modules & helpers
|
|
61
|
+
> `AuthModule`, `DynamicApiConfigModule`, and every internal auth controller/gateway/policies-guard mixin, `BaseAuthService`, `JwtStrategy`, `JwtRefreshStrategy`; `HealthController`/`createHealthController`; `PresenceController`, `InMemoryPresenceAdapter`, `RedisPresenceAdapter`, `createPresenceGateway`. Most of `helpers/**` (internal wiring only — the documented `enableDynamicAPI*` functions, `mintTokenPair`, `parsePagingParams` and `isTransactionsUnsupportedError` are unaffected).
|
|
62
|
+
>
|
|
63
|
+
> ### Removed — `DeepPartial` typo alias
|
|
64
|
+
> `utils/deep-patial.ts` (a typo'd duplicate of `deep-partial.ts`, already marked "will be removed in v5") is deleted. `DeepPartial` itself is still exported — import it as before, from the main package.
|
|
65
|
+
>
|
|
66
|
+
> ### Changed — `@DynamicApiSchema` replaces `@Schema` + `@DynamicApiSchemaOptions`
|
|
67
|
+
> The old stacked pattern:
|
|
68
|
+
> ```typescript
|
|
69
|
+
> @DynamicApiSchemaOptions({ indexes: [...] })
|
|
70
|
+
> @Schema({ collection: 'users' })
|
|
71
|
+
> export class User extends BaseEntity {}
|
|
72
|
+
> ```
|
|
73
|
+
> is now a single decorator taking the union of mongoose's own `SchemaOptions` and DynamicAPI's extras:
|
|
74
|
+
> ```typescript
|
|
75
|
+
> @DynamicApiSchema({
|
|
76
|
+
> collection: 'users',
|
|
77
|
+
> indexes: [{ fields: { email: 1 }, options: { unique: true } }],
|
|
78
|
+
> })
|
|
79
|
+
> export class User extends BaseEntity {}
|
|
80
|
+
> ```
|
|
81
|
+
> `DynamicApiSchemaOptions`/`DynamicAPISchemaOptions` (the old decorator) and `DynamicApiSchemaOptionsInterface`/`DynamicAPISchemaOptionsInterface` are gone — `DynamicApiSchemaOptions` is now the type name for just the MDA-specific options (`indexes`/`hooks`/`customInit`). Mongoose's own `@Schema()` still works standalone if you want to call it yourself. See [schema-options.md](./README/schema-options.md).
|
|
82
|
+
>
|
|
83
|
+
> ### Removed — deprecated verbose/all-caps aliases
|
|
84
|
+
> **Route config:** `DynamicAPIRouteConfig` (all-caps) — use `DynamicApiRouteConfig`.
|
|
85
|
+
>
|
|
86
|
+
> **Before-save callback aliases:** `AnyBeforeSaveCallback` — no longer needed, use the discriminated union's per-route narrowing directly. `DynamicApiServiceBeforeSaveCreateContext`, `...CreateManyContext`, `...UpdateContext`, `...UpdateManyContext`, `...ReplaceContext`, `...DeleteContext`, `...DeleteManyContext`, `...DuplicateContext`, `...DuplicateManyContext` — use the matching `BeforeSave*Context` type. `DynamicApiServiceBeforeSaveCallback`, `...ListCallback`, `...DeleteCallback`, `...DeleteManyCallback` — use the matching `BeforeSave*Callback` type.
|
|
87
|
+
>
|
|
88
|
+
> **Service callback aliases:** `DynamicApiCallbackMethods` — use `CallbackMethods`. `DynamicApiServiceCallback` — use `AfterSaveCallback`.
|
|
89
|
+
>
|
|
90
|
+
> **Service provider alias:** `DynamicAPIServiceProvider` (all-caps) — use `DynamicApiServiceProvider`.
|
|
91
|
+
>
|
|
92
|
+
> **Swagger options aliases:** `DynamicAPISwaggerExtraConfig`/`DynamicAPISwaggerOptions` (all-caps) — use `DynamicApiSwaggerExtraConfig`/`DynamicApiSwaggerOptions`.
|
|
93
|
+
>
|
|
94
|
+
> **WebSockets:** `enableDynamicAPIWebSockets(app, maxListeners: number)` — the numeric second-argument overload is gone, pass `enableDynamicAPIWebSockets(app, { maxListeners })` instead.
|
|
95
|
+
>
|
|
96
|
+
> ### Removed — `query.accessToken` WebSocket authentication
|
|
97
|
+
> The server only reads `socket.handshake.auth.token` now. The `query.accessToken` (query string) transport — deprecated since it exposes the token in URLs and server logs — is gone. Update any client still connecting with `io(url, { query: { accessToken } })` to `io(url, { auth: { token } })` instead. See [Authenticating WebSocket Connections](./README/websockets.md#authenticating-websocket-connections).
|
|
98
|
+
>
|
|
99
|
+
> ### Unaffected
|
|
100
|
+
> `DynamicApiCacheService`, `DynamicApiEntityService`, `BcryptService`, `DynamicApiBroadcastService`, `DynamicApiModule`, `DynamicApiHealthModule`, `DynamicApiPresenceModule`, all `decorators/`, all `predicates/`, `BaseEntity`/`SoftDeletableEntity`, every documented route-config/callback/auth/websocket/caching/authorization/validation/schema-options interface and type, and everything else shown in this README and `README/*.md` — none of it moved or changed shape. `DynamicApiPresenceModule`'s DI token `DYNAMIC_API_PRESENCE_ADAPTER` and the `PresenceAdapter` interface are also unaffected — only the internal `InMemoryPresenceAdapter`/`RedisPresenceAdapter` concrete classes are gone, since [Presence](./README/presence.md) was always meant to be consumed through the module's `register()` options and the `PresenceAdapter` DI token, never by importing a concrete adapter class directly.
|
|
101
|
+
>
|
|
102
|
+
> </details>
|
|
103
|
+
|
|
28
104
|
> [!WARNING]
|
|
29
105
|
> **v4 — Breaking changes.** Dual-token auth (`accessToken` + `refreshToken`), new default expiry (`expiresIn: '15m'`), 2 new endpoints (`/auth/refresh-token`, `/auth/logout`).
|
|
30
106
|
>
|
|
@@ -271,10 +347,11 @@ Register `UsersModule` in `AppModule`, run `npm run start:dev` — your API is l
|
|
|
271
347
|
| 🩺 **Health Check** | `GET /health` readiness probe, `DynamicApiHealthModule` ⭐ *New* | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/health-check.md) |
|
|
272
348
|
| 🧪 **Testing** | `createDynamicApiTestingApp`, in-memory MongoDB, zero Docker ⭐ *New* | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/testing.md) |
|
|
273
349
|
| 🏗️ **Schematics** | `nest g -c mongodb-dynamic-api resource <name>` — scaffold entity + module in one command ⭐ *New* | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/schematics.md) |
|
|
350
|
+
| 🚚 **Migrating to v5** | `npx mongodb-dynamic-api migrate-v5 <path>` — codemod for the mechanical v5 renames ⭐ *New* | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/migration-v5.md) |
|
|
274
351
|
|
|
275
352
|
> [!NOTE]
|
|
276
353
|
> **Key reminders:**
|
|
277
|
-
> - `BaseEntity` auto-enables timestamps — no `timestamps: true` needed in `@Schema()`
|
|
354
|
+
> - `BaseEntity` auto-enables timestamps — no `timestamps: true` needed in `@DynamicApiSchema()`/`@Schema()`
|
|
278
355
|
> - Soft delete: extend `SoftDeletableEntity` to get `isDeleted` + `deletedAt` fields
|
|
279
356
|
> - Version strings must be numeric (`'1'`, `'2'`), not semver
|
|
280
357
|
> - WebSocket auth event names are fixed: `auth-login`, `auth-register`, `auth-refresh-token`, `auth-logout`…
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.run = run;
|
|
5
|
+
const migrate_v5_1 = require("./migrate-v5");
|
|
6
|
+
function run(argv) {
|
|
7
|
+
const [command, targetPath, ...rest] = argv;
|
|
8
|
+
if (command !== 'migrate-v5' || !targetPath) {
|
|
9
|
+
console.log('Usage: npx mongodb-dynamic-api migrate-v5 <path> [--dry-run]');
|
|
10
|
+
process.exitCode = 1;
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const dryRun = rest.includes('--dry-run');
|
|
14
|
+
const report = (0, migrate_v5_1.migrateV5)(targetPath, { dryRun });
|
|
15
|
+
console.log(`\nmongodb-dynamic-api migrate-v5${dryRun ? ' (dry run)' : ''}`);
|
|
16
|
+
console.log(`Scanned ${report.filesScanned} file(s), changed ${report.filesChanged}.\n`);
|
|
17
|
+
let warningCount = 0;
|
|
18
|
+
for (const result of report.results) {
|
|
19
|
+
if (result.fixes.length === 0 && result.warnings.length === 0) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
console.log(result.filePath);
|
|
23
|
+
result.fixes.forEach((fix) => console.log(` ✓ ${fix}`));
|
|
24
|
+
result.warnings.forEach((warning) => console.log(` ⚠ ${warning}`));
|
|
25
|
+
warningCount += result.warnings.length;
|
|
26
|
+
}
|
|
27
|
+
if (warningCount > 0) {
|
|
28
|
+
console.log(`\n${warningCount} item(s) need manual review — see the ⚠ lines above.`);
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.log('\nNo manual review needed.');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (require.main === module) {
|
|
36
|
+
run(process.argv.slice(2));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../libs/dynamic-api/codemods/migrate-v5/cli.ts"],"names":[],"mappings":";;;AAkDS,kBAAG;AAjDZ,6CAAyC;AAQzC,SAAS,GAAG,CAAC,IAAc;IACzB,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAE5C,IAAI,OAAO,KAAK,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC5E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAA,sBAAS,EAAC,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,YAAY,qBAAqB,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC;IAEzF,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9D,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IACzC,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,YAAY,sDAAsD,CAAC,CAAC;QACrF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAGD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SourceFile } from 'ts-morph';
|
|
2
|
+
interface FileMigrationResult {
|
|
3
|
+
filePath: string;
|
|
4
|
+
changed: boolean;
|
|
5
|
+
fixes: string[];
|
|
6
|
+
warnings: string[];
|
|
7
|
+
}
|
|
8
|
+
interface MigrationReport {
|
|
9
|
+
filesScanned: number;
|
|
10
|
+
filesChanged: number;
|
|
11
|
+
results: FileMigrationResult[];
|
|
12
|
+
}
|
|
13
|
+
declare function migrateSourceFile(sourceFile: SourceFile): FileMigrationResult;
|
|
14
|
+
declare function migrateV5(rootDir: string, options?: {
|
|
15
|
+
dryRun?: boolean;
|
|
16
|
+
}): MigrationReport;
|
|
17
|
+
export { migrateV5, migrateSourceFile };
|
|
18
|
+
export type { FileMigrationResult, MigrationReport };
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.migrateV5 = migrateV5;
|
|
4
|
+
exports.migrateSourceFile = migrateSourceFile;
|
|
5
|
+
const ts_morph_1 = require("ts-morph");
|
|
6
|
+
const removed_symbols_1 = require("./removed-symbols");
|
|
7
|
+
const PACKAGE_NAME = 'mongodb-dynamic-api';
|
|
8
|
+
function findImports(sourceFile, moduleSpecifier) {
|
|
9
|
+
return sourceFile
|
|
10
|
+
.getImportDeclarations()
|
|
11
|
+
.filter((declaration) => declaration.getModuleSpecifierValue() === moduleSpecifier);
|
|
12
|
+
}
|
|
13
|
+
function findNamedImport(sourceFile, moduleSpecifier, name) {
|
|
14
|
+
for (const importDeclaration of findImports(sourceFile, moduleSpecifier)) {
|
|
15
|
+
const namedImport = importDeclaration.getNamedImports().find((specifier) => specifier.getName() === name);
|
|
16
|
+
if (namedImport) {
|
|
17
|
+
return { importDeclaration, namedImport };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
function addNamedImport(sourceFile, moduleSpecifier, name) {
|
|
23
|
+
const existingDeclarations = findImports(sourceFile, moduleSpecifier);
|
|
24
|
+
const alreadyImported = existingDeclarations.some((declaration) => declaration.getNamedImports().some((namedImport) => namedImport.getName() === name));
|
|
25
|
+
if (alreadyImported) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const targetDeclaration = existingDeclarations.find((declaration) => !declaration.isTypeOnly()) ??
|
|
29
|
+
sourceFile.addImportDeclaration({ moduleSpecifier, namedImports: [] });
|
|
30
|
+
targetDeclaration.addNamedImport(name);
|
|
31
|
+
}
|
|
32
|
+
function removeNamedImport(sourceFile, moduleSpecifier, name) {
|
|
33
|
+
const found = findNamedImport(sourceFile, moduleSpecifier, name);
|
|
34
|
+
if (!found) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const { importDeclaration, namedImport } = found;
|
|
38
|
+
namedImport.remove();
|
|
39
|
+
const hasNoImportsLeft = importDeclaration.getNamedImports().length === 0 &&
|
|
40
|
+
!importDeclaration.getDefaultImport() &&
|
|
41
|
+
!importDeclaration.getNamespaceImport();
|
|
42
|
+
if (hasNoImportsLeft) {
|
|
43
|
+
importDeclaration.remove();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function migrateGlobalStateService(sourceFile) {
|
|
47
|
+
const filePath = sourceFile.getFilePath();
|
|
48
|
+
const fixes = [];
|
|
49
|
+
const warnings = [];
|
|
50
|
+
const found = findNamedImport(sourceFile, PACKAGE_NAME, 'DynamicApiGlobalStateService');
|
|
51
|
+
if (!found) {
|
|
52
|
+
return { filePath, changed: false, fixes, warnings };
|
|
53
|
+
}
|
|
54
|
+
const { namedImport } = found;
|
|
55
|
+
if (namedImport.getAliasNode()) {
|
|
56
|
+
warnings.push("imports DynamicApiGlobalStateService under an alias ('as ...') — not auto-migrated, rename its usages to DynamicApiEntityService.getModel() manually.");
|
|
57
|
+
return { filePath, changed: false, fixes, warnings };
|
|
58
|
+
}
|
|
59
|
+
const propertyAccesses = sourceFile
|
|
60
|
+
.getDescendantsOfKind(ts_morph_1.SyntaxKind.PropertyAccessExpression)
|
|
61
|
+
.filter((node) => node.getExpression().getText() === 'DynamicApiGlobalStateService');
|
|
62
|
+
const safeAccesses = propertyAccesses.filter((node) => node.getName() === 'getEntityModel');
|
|
63
|
+
const unsafeAccesses = propertyAccesses.filter((node) => node.getName() !== 'getEntityModel');
|
|
64
|
+
for (const access of unsafeAccesses) {
|
|
65
|
+
warnings.push(`line ${access.getStartLineNumber()}: DynamicApiGlobalStateService.${access.getName()}() has no direct v5 replacement — review manually.`);
|
|
66
|
+
}
|
|
67
|
+
const otherReferences = sourceFile
|
|
68
|
+
.getDescendantsOfKind(ts_morph_1.SyntaxKind.Identifier)
|
|
69
|
+
.filter((node) => node.getText() === 'DynamicApiGlobalStateService' &&
|
|
70
|
+
!node.getFirstAncestorByKind(ts_morph_1.SyntaxKind.ImportSpecifier) &&
|
|
71
|
+
!propertyAccesses.some((access) => access.getExpression() === node));
|
|
72
|
+
for (const reference of otherReferences) {
|
|
73
|
+
warnings.push(`line ${reference.getStartLineNumber()}: DynamicApiGlobalStateService is referenced directly (not as a static member access) — review manually, it is no longer exported in v5.`);
|
|
74
|
+
}
|
|
75
|
+
for (const access of safeAccesses) {
|
|
76
|
+
access.getExpression().replaceWithText('DynamicApiEntityService');
|
|
77
|
+
access.getNameNode().replaceWithText('getModel');
|
|
78
|
+
fixes.push(`line ${access.getStartLineNumber()}: renamed DynamicApiGlobalStateService.getEntityModel(...) to DynamicApiEntityService.getModel(...).`);
|
|
79
|
+
}
|
|
80
|
+
const totalUsages = propertyAccesses.length + otherReferences.length;
|
|
81
|
+
if (totalUsages === 0) {
|
|
82
|
+
removeNamedImport(sourceFile, PACKAGE_NAME, 'DynamicApiGlobalStateService');
|
|
83
|
+
fixes.push('removed the now-unused import of DynamicApiGlobalStateService (no longer exported in v5).');
|
|
84
|
+
}
|
|
85
|
+
else if (unsafeAccesses.length === 0 && otherReferences.length === 0) {
|
|
86
|
+
addNamedImport(sourceFile, PACKAGE_NAME, 'DynamicApiEntityService');
|
|
87
|
+
removeNamedImport(sourceFile, PACKAGE_NAME, 'DynamicApiGlobalStateService');
|
|
88
|
+
}
|
|
89
|
+
else if (safeAccesses.length > 0) {
|
|
90
|
+
addNamedImport(sourceFile, PACKAGE_NAME, 'DynamicApiEntityService');
|
|
91
|
+
}
|
|
92
|
+
return { filePath, changed: fixes.length > 0, fixes, warnings };
|
|
93
|
+
}
|
|
94
|
+
function migrateSchemaDecorators(sourceFile) {
|
|
95
|
+
const filePath = sourceFile.getFilePath();
|
|
96
|
+
const fixes = [];
|
|
97
|
+
const warnings = [];
|
|
98
|
+
let mergedAtLeastOne = false;
|
|
99
|
+
for (const classDeclaration of sourceFile.getClasses()) {
|
|
100
|
+
const decorators = classDeclaration.getDecorators();
|
|
101
|
+
const mdaDecorator = decorators.find((decorator) => ['DynamicApiSchemaOptions', 'DynamicAPISchemaOptions'].includes(decorator.getName()));
|
|
102
|
+
if (!mdaDecorator) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const mongooseDecorator = decorators.find((decorator) => decorator.getName() === 'Schema');
|
|
106
|
+
const mdaArgs = mdaDecorator.getArguments();
|
|
107
|
+
const mongooseArgs = mongooseDecorator?.getArguments() ?? [];
|
|
108
|
+
const mdaObjectLiteral = mdaArgs[0]?.asKind(ts_morph_1.SyntaxKind.ObjectLiteralExpression);
|
|
109
|
+
const mongooseObjectLiteral = mongooseArgs[0]?.asKind(ts_morph_1.SyntaxKind.ObjectLiteralExpression);
|
|
110
|
+
if (mdaArgs.length > 0 && !mdaObjectLiteral) {
|
|
111
|
+
warnings.push(`line ${mdaDecorator.getStartLineNumber()}: @${mdaDecorator.getName()}'s argument is not a plain object literal — merge it with @Schema into @DynamicApiSchema manually.`);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (mongooseArgs.length > 0 && !mongooseObjectLiteral) {
|
|
115
|
+
warnings.push(`line ${mongooseDecorator.getStartLineNumber()}: @Schema's argument is not a plain object literal — merge it with @${mdaDecorator.getName()} into @DynamicApiSchema manually.`);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const mongooseProps = mongooseObjectLiteral?.getProperties().map((property) => property.getText()) ?? [];
|
|
119
|
+
const mdaProps = mdaObjectLiteral?.getProperties().map((property) => property.getText()) ?? [];
|
|
120
|
+
const mergedProps = [...mongooseProps, ...mdaProps];
|
|
121
|
+
const mergedArgumentText = mergedProps.length > 0 ? `{\n ${mergedProps.join(',\n ')},\n}` : '{}';
|
|
122
|
+
const className = classDeclaration.getName() ?? '<anonymous>';
|
|
123
|
+
const line = mdaDecorator.getStartLineNumber();
|
|
124
|
+
const mdaDecoratorName = mdaDecorator.getName();
|
|
125
|
+
mdaDecorator.remove();
|
|
126
|
+
mongooseDecorator?.remove();
|
|
127
|
+
classDeclaration.insertDecorator(0, { name: 'DynamicApiSchema', arguments: [mergedArgumentText] });
|
|
128
|
+
fixes.push(`line ${line}: merged @${mdaDecoratorName} + @Schema into @DynamicApiSchema on class ${className}.`);
|
|
129
|
+
mergedAtLeastOne = true;
|
|
130
|
+
}
|
|
131
|
+
if (!mergedAtLeastOne) {
|
|
132
|
+
return { filePath, changed: false, fixes, warnings };
|
|
133
|
+
}
|
|
134
|
+
const stillUsesMongooseSchema = sourceFile
|
|
135
|
+
.getClasses()
|
|
136
|
+
.some((classDeclaration) => classDeclaration.getDecorators().some((decorator) => decorator.getName() === 'Schema'));
|
|
137
|
+
if (!stillUsesMongooseSchema) {
|
|
138
|
+
removeNamedImport(sourceFile, '@nestjs/mongoose', 'Schema');
|
|
139
|
+
}
|
|
140
|
+
addNamedImport(sourceFile, PACKAGE_NAME, 'DynamicApiSchema');
|
|
141
|
+
removeNamedImport(sourceFile, PACKAGE_NAME, 'DynamicApiSchemaOptions');
|
|
142
|
+
removeNamedImport(sourceFile, PACKAGE_NAME, 'DynamicAPISchemaOptions');
|
|
143
|
+
sourceFile.formatText({ indentSize: 2 });
|
|
144
|
+
sourceFile.replaceWithText(sourceFile.getFullText().replace(/\n{3,}/g, '\n\n'));
|
|
145
|
+
return { filePath, changed: true, fixes, warnings };
|
|
146
|
+
}
|
|
147
|
+
const SIMPLE_RENAMES = [
|
|
148
|
+
{ oldName: 'DynamicAPIRouteConfig', newName: 'DynamicApiRouteConfig' },
|
|
149
|
+
{ oldName: 'DynamicApiServiceBeforeSaveCreateContext', newName: 'BeforeSaveCreateContext' },
|
|
150
|
+
{ oldName: 'DynamicApiServiceBeforeSaveCreateManyContext', newName: 'BeforeSaveCreateManyContext' },
|
|
151
|
+
{ oldName: 'DynamicApiServiceBeforeSaveUpdateContext', newName: 'BeforeSaveUpdateContext' },
|
|
152
|
+
{ oldName: 'DynamicApiServiceBeforeSaveUpdateManyContext', newName: 'BeforeSaveUpdateManyContext' },
|
|
153
|
+
{ oldName: 'DynamicApiServiceBeforeSaveReplaceContext', newName: 'BeforeSaveReplaceContext' },
|
|
154
|
+
{ oldName: 'DynamicApiServiceBeforeSaveDeleteContext', newName: 'BeforeSaveDeleteContext' },
|
|
155
|
+
{ oldName: 'DynamicApiServiceBeforeSaveDeleteManyContext', newName: 'BeforeSaveDeleteManyContext' },
|
|
156
|
+
{ oldName: 'DynamicApiServiceBeforeSaveDuplicateContext', newName: 'BeforeSaveDuplicateContext' },
|
|
157
|
+
{ oldName: 'DynamicApiServiceBeforeSaveDuplicateManyContext', newName: 'BeforeSaveDuplicateManyContext' },
|
|
158
|
+
{ oldName: 'DynamicApiServiceBeforeSaveCallback', newName: 'BeforeSaveCallback' },
|
|
159
|
+
{ oldName: 'DynamicApiServiceBeforeSaveListCallback', newName: 'BeforeSaveListCallback' },
|
|
160
|
+
{ oldName: 'DynamicApiServiceBeforeSaveDeleteCallback', newName: 'BeforeSaveDeleteCallback' },
|
|
161
|
+
{ oldName: 'DynamicApiServiceBeforeSaveDeleteManyCallback', newName: 'BeforeSaveDeleteManyCallback' },
|
|
162
|
+
{ oldName: 'DynamicApiCallbackMethods', newName: 'CallbackMethods' },
|
|
163
|
+
{ oldName: 'DynamicApiServiceCallback', newName: 'AfterSaveCallback' },
|
|
164
|
+
{ oldName: 'DynamicAPIServiceProvider', newName: 'DynamicApiServiceProvider' },
|
|
165
|
+
{ oldName: 'DynamicAPISwaggerExtraConfig', newName: 'DynamicApiSwaggerExtraConfig' },
|
|
166
|
+
{ oldName: 'DynamicAPISwaggerOptions', newName: 'DynamicApiSwaggerOptions' },
|
|
167
|
+
];
|
|
168
|
+
function migrateSimpleRenames(sourceFile) {
|
|
169
|
+
const filePath = sourceFile.getFilePath();
|
|
170
|
+
const fixes = [];
|
|
171
|
+
const warnings = [];
|
|
172
|
+
for (const { oldName, newName } of SIMPLE_RENAMES) {
|
|
173
|
+
const found = findNamedImport(sourceFile, PACKAGE_NAME, oldName);
|
|
174
|
+
if (!found) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const { namedImport } = found;
|
|
178
|
+
if (namedImport.getAliasNode()) {
|
|
179
|
+
warnings.push(`imports ${oldName} under an alias ('as ...') — not auto-migrated, rename its usages to ${newName} manually.`);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const identifiers = sourceFile
|
|
183
|
+
.getDescendantsOfKind(ts_morph_1.SyntaxKind.Identifier)
|
|
184
|
+
.filter((node) => node.getText() === oldName && !node.getFirstAncestorByKind(ts_morph_1.SyntaxKind.ImportSpecifier));
|
|
185
|
+
identifiers.forEach((identifier) => identifier.replaceWithText(newName));
|
|
186
|
+
addNamedImport(sourceFile, PACKAGE_NAME, newName);
|
|
187
|
+
removeNamedImport(sourceFile, PACKAGE_NAME, oldName);
|
|
188
|
+
fixes.push(`renamed ${oldName} to ${newName} (${identifiers.length} usage(s)).`);
|
|
189
|
+
}
|
|
190
|
+
return { filePath, changed: fixes.length > 0, fixes, warnings };
|
|
191
|
+
}
|
|
192
|
+
function migrateWebSocketsMaxListenersOverload(sourceFile) {
|
|
193
|
+
const filePath = sourceFile.getFilePath();
|
|
194
|
+
const fixes = [];
|
|
195
|
+
const warnings = [];
|
|
196
|
+
const calls = sourceFile
|
|
197
|
+
.getDescendantsOfKind(ts_morph_1.SyntaxKind.CallExpression)
|
|
198
|
+
.filter((call) => call.getExpression().getText() === 'enableDynamicAPIWebSockets' && call.getArguments().length === 2);
|
|
199
|
+
for (const call of calls) {
|
|
200
|
+
const secondArg = call.getArguments()[1];
|
|
201
|
+
if (secondArg.asKind(ts_morph_1.SyntaxKind.ObjectLiteralExpression)) {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (secondArg.asKind(ts_morph_1.SyntaxKind.NumericLiteral)) {
|
|
205
|
+
const line = call.getStartLineNumber();
|
|
206
|
+
const originalText = secondArg.getText();
|
|
207
|
+
secondArg.replaceWithText(`{ maxListeners: ${originalText} }`);
|
|
208
|
+
fixes.push(`line ${line}: rewrote enableDynamicAPIWebSockets(app, ${originalText}) to the options-object form.`);
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
warnings.push(`line ${call.getStartLineNumber()}: enableDynamicAPIWebSockets's second argument is not a plain number literal — the numeric-overload form is gone in v5, pass { maxListeners } manually.`);
|
|
212
|
+
}
|
|
213
|
+
return { filePath, changed: fixes.length > 0, fixes, warnings };
|
|
214
|
+
}
|
|
215
|
+
function scanForRemovedSymbols(sourceFile) {
|
|
216
|
+
const filePath = sourceFile.getFilePath();
|
|
217
|
+
const warnings = [];
|
|
218
|
+
const importDeclarations = findImports(sourceFile, PACKAGE_NAME);
|
|
219
|
+
if (importDeclarations.length === 0) {
|
|
220
|
+
return { filePath, changed: false, fixes: [], warnings };
|
|
221
|
+
}
|
|
222
|
+
const importedNames = new Set(importDeclarations.flatMap((declaration) => declaration.getNamedImports().map((specifier) => specifier.getName())));
|
|
223
|
+
for (const removed of removed_symbols_1.REMOVED_SYMBOLS) {
|
|
224
|
+
if (importedNames.has(removed.name)) {
|
|
225
|
+
warnings.push(`imports '${removed.name}', which is no longer exported in v5 — ${removed.guidance}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return { filePath, changed: false, fixes: [], warnings };
|
|
229
|
+
}
|
|
230
|
+
function migrateSourceFile(sourceFile) {
|
|
231
|
+
const results = [
|
|
232
|
+
migrateGlobalStateService(sourceFile),
|
|
233
|
+
migrateSchemaDecorators(sourceFile),
|
|
234
|
+
migrateSimpleRenames(sourceFile),
|
|
235
|
+
migrateWebSocketsMaxListenersOverload(sourceFile),
|
|
236
|
+
scanForRemovedSymbols(sourceFile),
|
|
237
|
+
];
|
|
238
|
+
return {
|
|
239
|
+
filePath: sourceFile.getFilePath(),
|
|
240
|
+
changed: results.some((result) => result.changed),
|
|
241
|
+
fixes: results.flatMap((result) => result.fixes),
|
|
242
|
+
warnings: results.flatMap((result) => result.warnings),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function migrateV5(rootDir, options = {}) {
|
|
246
|
+
const project = new ts_morph_1.Project({ skipAddingFilesFromTsConfig: true });
|
|
247
|
+
project.addSourceFilesAtPaths([
|
|
248
|
+
`${rootDir}/**/*.ts`,
|
|
249
|
+
`!${rootDir}/**/*.d.ts`,
|
|
250
|
+
`!${rootDir}/**/*.spec.ts`,
|
|
251
|
+
`!${rootDir}/**/node_modules/**`,
|
|
252
|
+
]);
|
|
253
|
+
const results = project.getSourceFiles().map((sourceFile) => migrateSourceFile(sourceFile));
|
|
254
|
+
if (!options.dryRun) {
|
|
255
|
+
project.saveSync();
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
filesScanned: results.length,
|
|
259
|
+
filesChanged: results.filter((result) => result.changed).length,
|
|
260
|
+
results,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=migrate-v5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-v5.js","sourceRoot":"","sources":["../../../libs/dynamic-api/codemods/migrate-v5/migrate-v5.ts"],"names":[],"mappings":"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"}
|