@lenne.tech/nest-server 11.13.5 → 11.14.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/README.md +1 -3
- package/dist/core/common/args/filter.args.js +3 -6
- package/dist/core/common/args/filter.args.js.map +1 -1
- package/dist/core/common/args/pagination.args.js +6 -9
- package/dist/core/common/args/pagination.args.js.map +1 -1
- package/dist/core/common/decorators/translatable.decorator.js +1 -1
- package/dist/core/common/decorators/translatable.decorator.js.map +1 -1
- package/dist/core/common/enums/role.enum.js.map +1 -1
- package/dist/core/common/filters/http-exception-log.filter.js +3 -1
- package/dist/core/common/filters/http-exception-log.filter.js.map +1 -1
- package/dist/core/common/helpers/config.helper.js +2 -2
- package/dist/core/common/helpers/config.helper.js.map +1 -1
- package/dist/core/common/helpers/db.helper.js +12 -12
- package/dist/core/common/helpers/db.helper.js.map +1 -1
- package/dist/core/common/helpers/graphql.helper.js +1 -1
- package/dist/core/common/helpers/graphql.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.js +7 -4
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/helpers/scim.helper.js +2 -2
- package/dist/core/common/helpers/scim.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.js +1 -1
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/inputs/combined-filter.input.js +3 -6
- package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
- package/dist/core/common/inputs/core-input.input.js +1 -1
- package/dist/core/common/inputs/core-input.input.js.map +1 -1
- package/dist/core/common/inputs/filter.input.js +3 -6
- package/dist/core/common/inputs/filter.input.js.map +1 -1
- package/dist/core/common/inputs/single-filter.input.js +9 -12
- package/dist/core/common/inputs/single-filter.input.js.map +1 -1
- package/dist/core/common/inputs/sort.input.js +2 -5
- package/dist/core/common/inputs/sort.input.js.map +1 -1
- package/dist/core/common/interceptors/check-response.interceptor.js +12 -11
- package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
- package/dist/core/common/interceptors/check-security.interceptor.js +5 -4
- package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
- package/dist/core/common/models/core-model.model.d.ts +2 -2
- package/dist/core/common/models/core-model.model.js +2 -2
- package/dist/core/common/models/core-model.model.js.map +1 -1
- package/dist/core/common/models/core-persistence.model.js +3 -6
- package/dist/core/common/models/core-persistence.model.js.map +1 -1
- package/dist/core/common/models/pagination-info.model.js +6 -0
- package/dist/core/common/models/pagination-info.model.js.map +1 -1
- package/dist/core/common/pipes/check-input.pipe.js +1 -0
- package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
- package/dist/core/common/plugins/complexity.plugin.js +2 -0
- package/dist/core/common/plugins/complexity.plugin.js.map +1 -1
- package/dist/core/common/scalars/any.scalar.js +2 -4
- package/dist/core/common/scalars/any.scalar.js.map +1 -1
- package/dist/core/common/scalars/date-timestamp.scalar.js +1 -3
- package/dist/core/common/scalars/date-timestamp.scalar.js.map +1 -1
- package/dist/core/common/scalars/date.scalar.js +1 -3
- package/dist/core/common/scalars/date.scalar.js.map +1 -1
- package/dist/core/common/scalars/json.scalar.js +2 -4
- package/dist/core/common/scalars/json.scalar.js.map +1 -1
- package/dist/core/common/services/brevo.service.js +3 -0
- package/dist/core/common/services/brevo.service.js.map +1 -1
- package/dist/core/common/services/config.service.js +15 -8
- package/dist/core/common/services/config.service.js.map +1 -1
- package/dist/core/common/services/core-cron-jobs.service.js +10 -7
- package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
- package/dist/core/common/services/crud.service.js +1 -9
- package/dist/core/common/services/crud.service.js.map +1 -1
- package/dist/core/common/services/email.service.js +2 -0
- package/dist/core/common/services/email.service.js.map +1 -1
- package/dist/core/common/services/mailjet.service.js +5 -4
- package/dist/core/common/services/mailjet.service.js.map +1 -1
- package/dist/core/common/services/model-doc.service.js +1 -0
- package/dist/core/common/services/model-doc.service.js.map +1 -1
- package/dist/core/common/services/module.service.js +6 -3
- package/dist/core/common/services/module.service.js.map +1 -1
- package/dist/core/common/services/template.service.js +2 -1
- package/dist/core/common/services/template.service.js.map +1 -1
- package/dist/core/common/types/array-element.type.d.ts +1 -1
- package/dist/core/modules/auth/core-auth.controller.js +2 -0
- package/dist/core/modules/auth/core-auth.controller.js.map +1 -1
- package/dist/core/modules/auth/core-auth.model.js +3 -6
- package/dist/core/modules/auth/core-auth.model.js.map +1 -1
- package/dist/core/modules/auth/core-auth.resolver.js +2 -0
- package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
- package/dist/core/modules/auth/guards/auth.guard.js +6 -4
- package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
- package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js +1 -0
- package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js.map +1 -1
- package/dist/core/modules/auth/guards/roles-guard-registry.js +3 -3
- package/dist/core/modules/auth/guards/roles-guard-registry.js.map +1 -1
- package/dist/core/modules/auth/guards/roles.guard.js +15 -7
- package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
- package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js +4 -7
- package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth.service.js +6 -1
- package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
- package/dist/core/modules/auth/services/legacy-auth-rate-limiter.service.js +4 -4
- package/dist/core/modules/auth/services/legacy-auth-rate-limiter.service.js.map +1 -1
- package/dist/core/modules/auth/strategies/jwt-refresh.strategy.js +2 -0
- package/dist/core/modules/auth/strategies/jwt-refresh.strategy.js.map +1 -1
- package/dist/core/modules/auth/strategies/jwt.strategy.js +2 -0
- package/dist/core/modules/auth/strategies/jwt.strategy.js.map +1 -1
- package/dist/core/modules/auth/tokens.decorator.js +2 -2
- package/dist/core/modules/auth/tokens.decorator.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth-roles.guard.js +2 -4
- package/dist/core/modules/better-auth/better-auth-roles.guard.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth-token.service.js +3 -1
- package/dist/core/modules/better-auth/better-auth-token.service.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth.resolver.js +4 -0
- package/dist/core/modules/better-auth/better-auth.resolver.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth.types.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-api.middleware.js +6 -3
- package/dist/core/modules/better-auth/core-better-auth-api.middleware.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-auth.model.js +7 -0
- package/dist/core/modules/better-auth/core-better-auth-auth.model.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-challenge.service.js +6 -4
- package/dist/core/modules/better-auth/core-better-auth-challenge.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-cookie.helper.js +3 -0
- package/dist/core/modules/better-auth/core-better-auth-cookie.helper.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js +16 -8
- package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-migration-status.model.js +8 -0
- package/dist/core/modules/better-auth/core-better-auth-migration-status.model.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-models.js +31 -0
- package/dist/core/modules/better-auth/core-better-auth-models.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js +2 -0
- package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js +4 -4
- package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-signup-validator.service.js +3 -2
- package/dist/core/modules/better-auth/core-better-auth-signup-validator.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.js +2 -1
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.controller.js +27 -1
- package/dist/core/modules/better-auth/core-better-auth.controller.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.middleware.js +3 -1
- package/dist/core/modules/better-auth/core-better-auth.middleware.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.module.js +23 -18
- package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.resolver.js +5 -1
- package/dist/core/modules/better-auth/core-better-auth.resolver.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.service.js +6 -1
- package/dist/core/modules/better-auth/core-better-auth.service.js.map +1 -1
- package/dist/core/modules/error-code/core-error-code.controller.js +1 -0
- package/dist/core/modules/error-code/core-error-code.controller.js.map +1 -1
- package/dist/core/modules/error-code/core-error-code.service.js +3 -3
- package/dist/core/modules/error-code/core-error-code.service.js.map +1 -1
- package/dist/core/modules/error-code/error-codes.js.map +1 -1
- package/dist/core/modules/file/core-file-info.model.js +6 -9
- package/dist/core/modules/file/core-file-info.model.js.map +1 -1
- package/dist/core/modules/file/core-file.controller.js +1 -0
- package/dist/core/modules/file/core-file.controller.js.map +1 -1
- package/dist/core/modules/file/core-file.resolver.js +1 -0
- package/dist/core/modules/file/core-file.resolver.js.map +1 -1
- package/dist/core/modules/file/core-file.service.d.ts +1 -1
- package/dist/core/modules/file/core-file.service.js +4 -4
- package/dist/core/modules/file/core-file.service.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check-result.model.js +4 -7
- package/dist/core/modules/health-check/core-health-check-result.model.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.controller.js +1 -0
- package/dist/core/modules/health-check/core-health-check.controller.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.resolver.js +1 -0
- package/dist/core/modules/health-check/core-health-check.resolver.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.service.js +5 -0
- package/dist/core/modules/health-check/core-health-check.service.js.map +1 -1
- package/dist/core/modules/migrate/cli/migrate-cli.js.map +1 -1
- package/dist/core/modules/migrate/helpers/migration.helper.js +11 -19
- package/dist/core/modules/migrate/helpers/migration.helper.js.map +1 -1
- package/dist/core/modules/migrate/migration-runner.js +2 -0
- package/dist/core/modules/migrate/migration-runner.js.map +1 -1
- package/dist/core/modules/migrate/mongo-state-store.js +3 -0
- package/dist/core/modules/migrate/mongo-state-store.js.map +1 -1
- package/dist/core/modules/system-setup/core-system-setup.controller.js +4 -0
- package/dist/core/modules/system-setup/core-system-setup.controller.js.map +1 -1
- package/dist/core/modules/system-setup/core-system-setup.service.js +6 -5
- package/dist/core/modules/system-setup/core-system-setup.service.js.map +1 -1
- package/dist/core/modules/tus/core-tus.controller.js +2 -1
- package/dist/core/modules/tus/core-tus.controller.js.map +1 -1
- package/dist/core/modules/tus/core-tus.service.js +6 -3
- package/dist/core/modules/tus/core-tus.service.js.map +1 -1
- package/dist/core/modules/tus/tus.module.js +7 -5
- package/dist/core/modules/tus/tus.module.js.map +1 -1
- package/dist/core/modules/user/core-user.model.js +15 -18
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.d.ts +1 -1
- package/dist/core/modules/user/core-user.service.js +7 -2
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user-create.input.js +1 -4
- package/dist/core/modules/user/inputs/core-user-create.input.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user.input.js +6 -9
- package/dist/core/modules/user/inputs/core-user.input.js.map +1 -1
- package/dist/server/common/models/persistence.model.js +2 -5
- package/dist/server/common/models/persistence.model.js.map +1 -1
- package/dist/server/common/services/cron-jobs.service.js +2 -0
- package/dist/server/common/services/cron-jobs.service.js.map +1 -1
- package/dist/server/modules/auth/auth.controller.js +2 -0
- package/dist/server/modules/auth/auth.controller.js.map +1 -1
- package/dist/server/modules/auth/auth.model.js +1 -4
- package/dist/server/modules/auth/auth.model.js.map +1 -1
- package/dist/server/modules/auth/auth.module.js +1 -6
- package/dist/server/modules/auth/auth.module.js.map +1 -1
- package/dist/server/modules/auth/auth.resolver.js +2 -0
- package/dist/server/modules/auth/auth.resolver.js.map +1 -1
- package/dist/server/modules/auth/auth.service.js +4 -0
- package/dist/server/modules/auth/auth.service.js.map +1 -1
- package/dist/server/modules/auth/inputs/auth-sign-up.input.js +2 -5
- package/dist/server/modules/auth/inputs/auth-sign-up.input.js.map +1 -1
- package/dist/server/modules/better-auth/better-auth.controller.js +3 -0
- package/dist/server/modules/better-auth/better-auth.controller.js.map +1 -1
- package/dist/server/modules/better-auth/better-auth.resolver.js +4 -0
- package/dist/server/modules/better-auth/better-auth.resolver.js.map +1 -1
- package/dist/server/modules/error-code/error-code.controller.js +1 -0
- package/dist/server/modules/error-code/error-code.controller.js.map +1 -1
- package/dist/server/modules/file/file-info.model.d.ts +2 -2
- package/dist/server/modules/file/file.controller.js +1 -0
- package/dist/server/modules/file/file.controller.js.map +1 -1
- package/dist/server/modules/file/file.resolver.js +2 -1
- package/dist/server/modules/file/file.resolver.js.map +1 -1
- package/dist/server/modules/file/file.service.js +2 -3
- package/dist/server/modules/file/file.service.js.map +1 -1
- package/dist/server/modules/user/avatar.controller.js +1 -0
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/inputs/user-create.input.js +1 -4
- package/dist/server/modules/user/inputs/user-create.input.js.map +1 -1
- package/dist/server/modules/user/inputs/user.input.js +1 -4
- package/dist/server/modules/user/inputs/user.input.js.map +1 -1
- package/dist/server/modules/user/outputs/find-and-count-users-result.output.js +3 -0
- package/dist/server/modules/user/outputs/find-and-count-users-result.output.js.map +1 -1
- package/dist/server/modules/user/user.controller.js +1 -0
- package/dist/server/modules/user/user.controller.js.map +1 -1
- package/dist/server/modules/user/user.model.js +7 -10
- package/dist/server/modules/user/user.model.js.map +1 -1
- package/dist/server/modules/user/user.resolver.js +3 -1
- package/dist/server/modules/user/user.resolver.js.map +1 -1
- package/dist/server/modules/user/user.service.js +6 -0
- package/dist/server/modules/user/user.service.js.map +1 -1
- package/dist/server/server.controller.js +1 -0
- package/dist/server/server.controller.js.map +1 -1
- package/dist/test/test.helper.js +18 -10
- package/dist/test/test.helper.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +26 -58
- package/src/core/common/args/filter.args.ts +1 -1
- package/src/core/common/args/pagination.args.ts +1 -1
- package/src/core/common/decorators/translatable.decorator.ts +1 -1
- package/src/core/common/enums/role.enum.ts +0 -1
- package/src/core/common/filters/http-exception-log.filter.ts +3 -3
- package/src/core/common/helpers/config.helper.ts +2 -2
- package/src/core/common/helpers/db.helper.ts +12 -12
- package/src/core/common/helpers/graphql.helper.ts +1 -1
- package/src/core/common/helpers/input.helper.ts +7 -4
- package/src/core/common/helpers/scim.helper.ts +16 -13
- package/src/core/common/helpers/service.helper.ts +1 -1
- package/src/core/common/inputs/combined-filter.input.ts +1 -1
- package/src/core/common/inputs/core-input.input.ts +1 -1
- package/src/core/common/inputs/filter.input.ts +13 -13
- package/src/core/common/inputs/single-filter.input.ts +2 -2
- package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
- package/src/core/common/interfaces/cron-job-config-with-time-zone.interface.ts +4 -2
- package/src/core/common/interfaces/cron-job-config-with-utc-offset.interface.ts +4 -2
- package/src/core/common/interfaces/scim-array-filter-node.interface.ts +1 -1
- package/src/core/common/interfaces/scim-condition-node.interface.ts +1 -1
- package/src/core/common/interfaces/scim-logical-node.interface.ts +1 -1
- package/src/core/common/models/core-model.model.ts +2 -4
- package/src/core/common/scalars/any.scalar.ts +1 -1
- package/src/core/common/scalars/json.scalar.ts +3 -3
- package/src/core/common/services/config.service.ts +17 -11
- package/src/core/common/services/core-cron-jobs.service.ts +6 -6
- package/src/core/common/services/crud.service.ts +3 -12
- package/src/core/common/services/mailjet.service.ts +4 -5
- package/src/core/common/services/module.service.ts +3 -3
- package/src/core/common/types/array-element.type.ts +3 -2
- package/src/core/common/types/require-only-one.type.ts +2 -2
- package/src/core/common/types/required-at-least-one.type.ts +2 -2
- package/src/core/common/types/scim-comparator.type.ts +1 -1
- package/src/core/common/types/scim-logical-operator.type.ts +1 -1
- package/src/core/common/types/scim-node.type.ts +1 -1
- package/src/core/modules/auth/guards/auth.guard.ts +4 -2
- package/src/core/modules/auth/guards/roles.guard.ts +17 -3
- package/src/core/modules/auth/tokens.decorator.ts +3 -3
- package/src/core/modules/better-auth/ARCHITECTURE.md +23 -20
- package/src/core/modules/better-auth/CUSTOMIZATION.md +64 -56
- package/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md +67 -40
- package/src/core/modules/better-auth/README.md +268 -230
- package/src/core/modules/better-auth/better-auth-roles.guard.ts +8 -1
- package/src/core/modules/better-auth/better-auth-token.service.ts +10 -3
- package/src/core/modules/better-auth/better-auth.resolver.ts +3 -1
- package/src/core/modules/better-auth/better-auth.types.ts +3 -1
- package/src/core/modules/better-auth/core-better-auth-api.middleware.ts +3 -1
- package/src/core/modules/better-auth/core-better-auth-challenge.service.ts +3 -1
- package/src/core/modules/better-auth/core-better-auth-email-verification.service.ts +35 -26
- package/src/core/modules/better-auth/core-better-auth-signup-validator.service.ts +3 -1
- package/src/core/modules/better-auth/core-better-auth.middleware.ts +6 -2
- package/src/core/modules/error-code/INTEGRATION-CHECKLIST.md +28 -21
- package/src/core/modules/error-code/error-codes.ts +0 -2
- package/src/core/modules/file/README.md +12 -10
- package/src/core/modules/file/core-file.service.ts +5 -9
- package/src/core/modules/migrate/MIGRATION_FROM_NODEPIT.md +21 -9
- package/src/core/modules/migrate/README.md +30 -28
- package/src/core/modules/migrate/cli/migrate-cli.ts +0 -3
- package/src/core/modules/migrate/helpers/migration.helper.ts +13 -21
- package/src/core/modules/migrate/migration-runner.ts +0 -3
- package/src/core/modules/system-setup/INTEGRATION-CHECKLIST.md +15 -14
- package/src/core/modules/system-setup/README.md +28 -20
- package/src/core/modules/system-setup/core-system-setup.service.ts +4 -5
- package/src/core/modules/tus/INTEGRATION-CHECKLIST.md +15 -14
- package/src/core/modules/tus/README.md +50 -44
- package/src/core/modules/user/core-user.service.ts +1 -2
- package/src/server/modules/auth/auth.module.ts +1 -9
- package/src/server/modules/better-auth/better-auth.resolver.ts +3 -1
- package/src/server/modules/error-code/README.md +19 -16
- package/src/server/modules/error-code/error-code.controller.ts +4 -1
- package/src/server/modules/file/file.resolver.ts +1 -1
- package/src/server/modules/file/file.service.ts +1 -3
- package/src/server/modules/user/user.resolver.ts +1 -1
- package/src/test/README.md +31 -27
- package/src/test/test.helper.ts +18 -10
|
@@ -12,12 +12,12 @@ Integration of the [tus.io](https://tus.io) resumable upload protocol with @lenn
|
|
|
12
12
|
TusModule.forRoot({
|
|
13
13
|
config: {
|
|
14
14
|
maxSize: 100 * 1024 * 1024, // 100 MB instead of 50 GB default
|
|
15
|
-
path: '/uploads',
|
|
15
|
+
path: '/uploads', // Custom path instead of /tus
|
|
16
16
|
},
|
|
17
|
-
})
|
|
17
|
+
});
|
|
18
18
|
|
|
19
19
|
// To disable:
|
|
20
|
-
TusModule.forRoot({ config: false })
|
|
20
|
+
TusModule.forRoot({ config: false });
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
**Quick Links:** [Integration Checklist](./INTEGRATION-CHECKLIST.md) | [Endpoints](#endpoints) | [Configuration](#configuration) | [Client Usage](#client-usage)
|
|
@@ -47,14 +47,14 @@ TusModule.forRoot({ config: false })
|
|
|
47
47
|
|
|
48
48
|
### TUS Protocol Extensions (All Enabled by Default)
|
|
49
49
|
|
|
50
|
-
| Extension
|
|
51
|
-
|
|
52
|
-
| **creation**
|
|
53
|
-
| **creation-with-upload** | Include data in creation request
|
|
54
|
-
| **termination**
|
|
55
|
-
| **expiration**
|
|
56
|
-
| **checksum**
|
|
57
|
-
| **concatenation**
|
|
50
|
+
| Extension | Description |
|
|
51
|
+
| ------------------------ | --------------------------------- |
|
|
52
|
+
| **creation** | Create new uploads via POST |
|
|
53
|
+
| **creation-with-upload** | Include data in creation request |
|
|
54
|
+
| **termination** | Delete incomplete uploads |
|
|
55
|
+
| **expiration** | Auto-cleanup of abandoned uploads |
|
|
56
|
+
| **checksum** | Verify data integrity |
|
|
57
|
+
| **concatenation** | Combine multiple uploads |
|
|
58
58
|
|
|
59
59
|
---
|
|
60
60
|
|
|
@@ -87,13 +87,13 @@ TUS is **enabled by default** with the following configuration:
|
|
|
87
87
|
|
|
88
88
|
All endpoints are handled by the TUS protocol via `@tus/server`:
|
|
89
89
|
|
|
90
|
-
| Method
|
|
91
|
-
|
|
92
|
-
| OPTIONS | `/tus`
|
|
93
|
-
| POST
|
|
94
|
-
| HEAD
|
|
95
|
-
| PATCH
|
|
96
|
-
| DELETE
|
|
90
|
+
| Method | Endpoint | Description |
|
|
91
|
+
| ------- | ---------- | ------------------------ |
|
|
92
|
+
| OPTIONS | `/tus` | Get server capabilities |
|
|
93
|
+
| POST | `/tus` | Create new upload |
|
|
94
|
+
| HEAD | `/tus/:id` | Get upload status/offset |
|
|
95
|
+
| PATCH | `/tus/:id` | Continue upload |
|
|
96
|
+
| DELETE | `/tus/:id` | Terminate upload |
|
|
97
97
|
|
|
98
98
|
### CORS Headers
|
|
99
99
|
|
|
@@ -115,10 +115,10 @@ The TUS server automatically handles CORS headers for browser-based clients:
|
|
|
115
115
|
|
|
116
116
|
```typescript
|
|
117
117
|
// In server.module.ts
|
|
118
|
-
TusModule.forRoot({ config: false })
|
|
118
|
+
TusModule.forRoot({ config: false });
|
|
119
119
|
|
|
120
120
|
// Or via environment config
|
|
121
|
-
tus: false
|
|
121
|
+
tus: false;
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
### Custom Configuration
|
|
@@ -148,29 +148,30 @@ TusModule.forRoot({
|
|
|
148
148
|
expiresIn: '12h', // Cleanup after 12 hours
|
|
149
149
|
},
|
|
150
150
|
},
|
|
151
|
-
})
|
|
151
|
+
});
|
|
152
152
|
```
|
|
153
153
|
|
|
154
154
|
### Configuration Options
|
|
155
155
|
|
|
156
|
-
| Option
|
|
157
|
-
|
|
158
|
-
| `enabled`
|
|
159
|
-
| `path`
|
|
160
|
-
| `maxSize`
|
|
161
|
-
| `allowedTypes`
|
|
162
|
-
| `allowedHeaders`
|
|
163
|
-
| `uploadDir`
|
|
164
|
-
| `creation`
|
|
165
|
-
| `creationWithUpload` | boolean
|
|
166
|
-
| `termination`
|
|
167
|
-
| `expiration`
|
|
168
|
-
| `checksum`
|
|
169
|
-
| `concatenation`
|
|
156
|
+
| Option | Type | Default | Description |
|
|
157
|
+
| -------------------- | ----------------- | ---------------------- | -------------------------------------------------------- |
|
|
158
|
+
| `enabled` | boolean | `true` | Enable/disable TUS |
|
|
159
|
+
| `path` | string | `/tus` | Endpoint path |
|
|
160
|
+
| `maxSize` | number | 50 GB | Maximum file size in bytes |
|
|
161
|
+
| `allowedTypes` | string[] | undefined | Allowed MIME types (all if undefined) |
|
|
162
|
+
| `allowedHeaders` | string[] | `[]` | Additional custom headers (TUS headers already included) |
|
|
163
|
+
| `uploadDir` | string | `uploads/tus` | Temporary upload directory |
|
|
164
|
+
| `creation` | boolean | `true` | Enable creation extension |
|
|
165
|
+
| `creationWithUpload` | boolean | `true` | Enable creation-with-upload extension |
|
|
166
|
+
| `termination` | boolean | `true` | Enable termination extension |
|
|
167
|
+
| `expiration` | boolean \| object | `{ expiresIn: '24h' }` | Expiration configuration |
|
|
168
|
+
| `checksum` | boolean | `true` | Enable checksum extension |
|
|
169
|
+
| `concatenation` | boolean | `true` | Enable concatenation extension |
|
|
170
170
|
|
|
171
171
|
**Note on `allowedHeaders`:**
|
|
172
172
|
|
|
173
173
|
`@tus/server` already includes all TUS protocol headers by default:
|
|
174
|
+
|
|
174
175
|
- Authorization, Content-Type, Location, Tus-Extension, Tus-Max-Size
|
|
175
176
|
- Tus-Resumable, Tus-Version, Upload-Concat, Upload-Defer-Length
|
|
176
177
|
- Upload-Length, Upload-Metadata, Upload-Offset, X-HTTP-Method-Override
|
|
@@ -281,7 +282,7 @@ Then register with custom controller:
|
|
|
281
282
|
// server.module.ts
|
|
282
283
|
TusModule.forRoot({
|
|
283
284
|
controller: TusController,
|
|
284
|
-
})
|
|
285
|
+
});
|
|
285
286
|
```
|
|
286
287
|
|
|
287
288
|
### Custom Upload Handler
|
|
@@ -346,13 +347,13 @@ query {
|
|
|
346
347
|
|
|
347
348
|
The following metadata is stored with each GridFS file:
|
|
348
349
|
|
|
349
|
-
| Field
|
|
350
|
-
|
|
351
|
-
| `filename`
|
|
352
|
-
| `contentType`
|
|
353
|
-
| `tusUploadId`
|
|
354
|
-
| `originalMetadata` | All TUS metadata
|
|
355
|
-
| `uploadedAt`
|
|
350
|
+
| Field | Source |
|
|
351
|
+
| ------------------ | --------------------------------- |
|
|
352
|
+
| `filename` | From TUS `Upload-Metadata` header |
|
|
353
|
+
| `contentType` | From TUS `filetype` metadata |
|
|
354
|
+
| `tusUploadId` | Original TUS upload ID |
|
|
355
|
+
| `originalMetadata` | All TUS metadata |
|
|
356
|
+
| `uploadedAt` | Completion timestamp |
|
|
356
357
|
|
|
357
358
|
---
|
|
358
359
|
|
|
@@ -363,6 +364,7 @@ The following metadata is stored with each GridFS file:
|
|
|
363
364
|
**Cause:** TUS server not initialized
|
|
364
365
|
|
|
365
366
|
**Solutions:**
|
|
367
|
+
|
|
366
368
|
1. Check if TUS is disabled in config (`tus: false`)
|
|
367
369
|
2. Verify MongoDB connection is established
|
|
368
370
|
3. Check server logs for initialization errors
|
|
@@ -372,6 +374,7 @@ The following metadata is stored with each GridFS file:
|
|
|
372
374
|
**Cause:** Upload expired or server restarted
|
|
373
375
|
|
|
374
376
|
**Solutions:**
|
|
377
|
+
|
|
375
378
|
1. Check expiration configuration (default: 24h)
|
|
376
379
|
2. Increase `expiration.expiresIn` if needed
|
|
377
380
|
3. Client should handle `onError` and create new upload
|
|
@@ -381,6 +384,7 @@ The following metadata is stored with each GridFS file:
|
|
|
381
384
|
**Cause:** Missing or incorrect CORS configuration
|
|
382
385
|
|
|
383
386
|
**Solutions:**
|
|
387
|
+
|
|
384
388
|
1. Verify client sends correct headers
|
|
385
389
|
2. Check that `Tus-Resumable` header is included
|
|
386
390
|
3. Ensure server CORS allows TUS headers
|
|
@@ -390,6 +394,7 @@ The following metadata is stored with each GridFS file:
|
|
|
390
394
|
**Cause:** Upload incomplete or migration failed
|
|
391
395
|
|
|
392
396
|
**Solutions:**
|
|
397
|
+
|
|
393
398
|
1. Verify upload completed (check `onSuccess` callback)
|
|
394
399
|
2. Check server logs for migration errors
|
|
395
400
|
3. Verify MongoDB GridFS bucket exists (`fs.files`, `fs.chunks`)
|
|
@@ -399,6 +404,7 @@ The following metadata is stored with each GridFS file:
|
|
|
399
404
|
**Cause:** File exceeds `maxSize` limit
|
|
400
405
|
|
|
401
406
|
**Solutions:**
|
|
407
|
+
|
|
402
408
|
1. Increase `maxSize` in configuration
|
|
403
409
|
2. Check for proxy/nginx upload limits
|
|
404
410
|
3. Verify client `chunkSize` is reasonable
|
|
@@ -436,4 +442,4 @@ The following metadata is stored with each GridFS file:
|
|
|
436
442
|
- [tus.io Protocol](https://tus.io/protocols/resumable-upload)
|
|
437
443
|
- [tus-js-client](https://github.com/tus/tus-js-client)
|
|
438
444
|
- [@tus/server](https://github.com/tus/tus-node-server)
|
|
439
|
-
- [FileModule Documentation](../file/README.md)
|
|
445
|
+
- [FileModule Documentation](../file/README.md)
|
|
@@ -121,8 +121,7 @@ export abstract class CoreUserService<
|
|
|
121
121
|
/**
|
|
122
122
|
* Get verified state of user by token
|
|
123
123
|
*/
|
|
124
|
-
|
|
125
|
-
async getVerifiedState(token: string, serviceOptions?: ServiceOptions): Promise<boolean> {
|
|
124
|
+
async getVerifiedState(token: string, _serviceOptions?: ServiceOptions): Promise<boolean> {
|
|
126
125
|
const user = await this.mainDbModel.findOne({ verificationToken: token }).exec();
|
|
127
126
|
|
|
128
127
|
if (!user) {
|
|
@@ -22,15 +22,7 @@ export class AuthModule {
|
|
|
22
22
|
return {
|
|
23
23
|
controllers: [AuthController],
|
|
24
24
|
exports: [AuthController, AuthResolver, CoreAuthModule, AuthService],
|
|
25
|
-
imports: [
|
|
26
|
-
CoreAuthModule.forRoot(UserModule, UserService, {
|
|
27
|
-
...options,
|
|
28
|
-
...{
|
|
29
|
-
// imports: [], // Integrate additional Services here to resolve dependencies
|
|
30
|
-
// providers: [] // Integrate additional Providers here to resolve dependencies
|
|
31
|
-
},
|
|
32
|
-
}),
|
|
33
|
-
],
|
|
25
|
+
imports: [CoreAuthModule.forRoot(UserModule, UserService, { ...options })],
|
|
34
26
|
module: AuthModule,
|
|
35
27
|
providers: [AuthController, AuthResolver, AuthService, EmailService],
|
|
36
28
|
};
|
|
@@ -107,7 +107,9 @@ export class BetterAuthResolver extends CoreBetterAuthResolver {
|
|
|
107
107
|
nullable: true,
|
|
108
108
|
})
|
|
109
109
|
@Roles(RoleEnum.S_USER)
|
|
110
|
-
override async betterAuthListPasskeys(
|
|
110
|
+
override async betterAuthListPasskeys(
|
|
111
|
+
@Context() ctx: { req: Request },
|
|
112
|
+
): Promise<CoreBetterAuthPasskeyModel[] | null> {
|
|
111
113
|
return super.betterAuthListPasskeys(ctx);
|
|
112
114
|
}
|
|
113
115
|
|
|
@@ -5,6 +5,7 @@ This directory contains the reference implementation for extending the ErrorCode
|
|
|
5
5
|
## Purpose
|
|
6
6
|
|
|
7
7
|
Demonstrates **Scenario C: Custom Service + Controller via forRoot()** where a project:
|
|
8
|
+
|
|
8
9
|
1. Defines its own error codes with a unique prefix (`SRV_*`)
|
|
9
10
|
2. Creates a custom service extending `CoreErrorCodeService`
|
|
10
11
|
3. Creates a **standalone** controller (not extending CoreErrorCodeController - see below)
|
|
@@ -14,12 +15,12 @@ Demonstrates **Scenario C: Custom Service + Controller via forRoot()** where a p
|
|
|
14
15
|
|
|
15
16
|
## Files
|
|
16
17
|
|
|
17
|
-
| File
|
|
18
|
-
|
|
19
|
-
| `error-codes.ts`
|
|
20
|
-
| `error-code.service.ts`
|
|
21
|
-
| `error-code.controller.ts` | Custom controller with `/codes` endpoint
|
|
22
|
-
| `index.ts`
|
|
18
|
+
| File | Description |
|
|
19
|
+
| -------------------------- | -------------------------------------------------- |
|
|
20
|
+
| `error-codes.ts` | Server-specific error definitions (`SRV_*` prefix) |
|
|
21
|
+
| `error-code.service.ts` | Custom service registering `ServerErrors` |
|
|
22
|
+
| `error-code.controller.ts` | Custom controller with `/codes` endpoint |
|
|
23
|
+
| `index.ts` | Module exports |
|
|
23
24
|
|
|
24
25
|
## Architecture
|
|
25
26
|
|
|
@@ -73,7 +74,7 @@ import { ErrorCode } from './modules/error-code/error-codes';
|
|
|
73
74
|
import { Errors } from '@lenne.tech/nest-server';
|
|
74
75
|
|
|
75
76
|
// Access error codes
|
|
76
|
-
console.log(ErrorCode.DEMO_ERROR);
|
|
77
|
+
console.log(ErrorCode.DEMO_ERROR); // '#SRV_0001: Demo error for testing'
|
|
77
78
|
|
|
78
79
|
// Use factory functions
|
|
79
80
|
throw new BadRequestException(Errors.userNotFound({ email: 'test@example.com' }));
|
|
@@ -82,11 +83,13 @@ throw new BadRequestException(Errors.userNotFound({ email: 'test@example.com' })
|
|
|
82
83
|
## When to Use This Pattern
|
|
83
84
|
|
|
84
85
|
Use Scenario C when you need:
|
|
86
|
+
|
|
85
87
|
- Custom REST endpoints (like `/codes`)
|
|
86
88
|
- Different route paths
|
|
87
89
|
- Complex controller logic
|
|
88
90
|
|
|
89
91
|
For simpler cases, see:
|
|
92
|
+
|
|
90
93
|
- **Scenario A**: `additionalErrorRegistry` in config (simplest)
|
|
91
94
|
- **Scenario B**: Custom service via inheritance
|
|
92
95
|
|
|
@@ -106,21 +109,21 @@ static routes (`/codes`), even if you re-declare the methods.
|
|
|
106
109
|
// DOES NOT WORK - parent route registered first!
|
|
107
110
|
@Controller('api/i18n/errors')
|
|
108
111
|
export class ErrorCodeController extends CoreErrorCodeController {
|
|
109
|
-
@Get('codes')
|
|
110
|
-
getAllCodes(): string[] {
|
|
112
|
+
@Get('codes') // Registered AFTER parent's :locale
|
|
113
|
+
getAllCodes(): string[] {}
|
|
111
114
|
|
|
112
|
-
@Get(':locale')
|
|
113
|
-
override getTranslations() {
|
|
115
|
+
@Get(':locale') // Parent already registered this
|
|
116
|
+
override getTranslations() {}
|
|
114
117
|
}
|
|
115
118
|
|
|
116
119
|
// WORKS - standalone ensures correct order
|
|
117
120
|
@Controller('api/i18n/errors')
|
|
118
121
|
export class ErrorCodeController {
|
|
119
|
-
@Get('codes')
|
|
120
|
-
getAllCodes(): string[] {
|
|
122
|
+
@Get('codes') // Registered first
|
|
123
|
+
getAllCodes(): string[] {}
|
|
121
124
|
|
|
122
|
-
@Get(':locale')
|
|
123
|
-
getTranslations() {
|
|
125
|
+
@Get(':locale') // Registered second
|
|
126
|
+
getTranslations() {}
|
|
124
127
|
}
|
|
125
128
|
```
|
|
126
129
|
|
|
@@ -128,4 +131,4 @@ export class ErrorCodeController {
|
|
|
128
131
|
|
|
129
132
|
### Why is `autoRegister: false` required?
|
|
130
133
|
|
|
131
|
-
NestJS `@Global()` modules use "first wins" for provider registration. Without `autoRegister: false`, CoreModule registers its ErrorCodeModule first, and your custom service is ignored.
|
|
134
|
+
NestJS `@Global()` modules use "first wins" for provider registration. Without `autoRegister: false`, CoreModule registers its ErrorCodeModule first, and your custom service is ignored.
|
|
@@ -2,7 +2,10 @@ import { Controller, Get, NotFoundException, Param } from '@nestjs/common';
|
|
|
2
2
|
|
|
3
3
|
import { Roles } from '../../../core/common/decorators/roles.decorator';
|
|
4
4
|
import { RoleEnum } from '../../../core/common/enums/role.enum';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
IErrorTranslationResponse,
|
|
7
|
+
SupportedLocale,
|
|
8
|
+
} from '../../../core/modules/error-code/interfaces/error-code.interfaces';
|
|
6
9
|
import { ErrorCodeService } from './error-code.service';
|
|
7
10
|
|
|
8
11
|
/**
|
|
@@ -17,8 +17,6 @@ export class FileService extends CoreFileService {
|
|
|
17
17
|
* Duplicate file by name
|
|
18
18
|
*/
|
|
19
19
|
async duplicate(fileName: string, newName: string): Promise<any> {
|
|
20
|
-
return
|
|
21
|
-
resolve(this.files.openDownloadStreamByName(fileName).pipe(this.files.openUploadStream(newName)));
|
|
22
|
-
});
|
|
20
|
+
return this.files.openDownloadStreamByName(fileName).pipe(this.files.openUploadStream(newName));
|
|
23
21
|
}
|
|
24
22
|
}
|
|
@@ -166,7 +166,7 @@ export class UserResolver {
|
|
|
166
166
|
filter(this: UserResolver, payload, variables, context) {
|
|
167
167
|
return context?.user?.hasRole?.(RoleEnum.ADMIN);
|
|
168
168
|
},
|
|
169
|
-
resolve: user => user,
|
|
169
|
+
resolve: (user) => user,
|
|
170
170
|
})
|
|
171
171
|
async userCreated() {
|
|
172
172
|
return this.pubSub.asyncIterableIterator('userCreated');
|
package/src/test/README.md
CHANGED
|
@@ -23,18 +23,18 @@ const result = await testHelper.rest('/endpoint', options);
|
|
|
23
23
|
|
|
24
24
|
### TestRestOptions
|
|
25
25
|
|
|
26
|
-
| Option
|
|
27
|
-
|
|
28
|
-
| `method`
|
|
29
|
-
| `token`
|
|
30
|
-
| `cookies`
|
|
31
|
-
| `headers`
|
|
32
|
-
| `payload`
|
|
33
|
-
| `statusCode`
|
|
34
|
-
| `returnResponse` | `boolean`
|
|
35
|
-
| `attachments`
|
|
36
|
-
| `log`
|
|
37
|
-
| `logError`
|
|
26
|
+
| Option | Type | Default | Description |
|
|
27
|
+
| ---------------- | ------------------------------------------------- | ------- | ------------------------------------------------ |
|
|
28
|
+
| `method` | `'GET' \| 'POST' \| 'PUT' \| 'PATCH' \| 'DELETE'` | `'GET'` | HTTP method |
|
|
29
|
+
| `token` | `string` | `null` | Bearer token via Authorization header |
|
|
30
|
+
| `cookies` | `string \| Record<string, string>` | - | Cookie-based authentication (see below) |
|
|
31
|
+
| `headers` | `Record<string, string>` | - | Custom request headers |
|
|
32
|
+
| `payload` | `any` | `null` | Request body |
|
|
33
|
+
| `statusCode` | `number` | `200` | Expected HTTP status code |
|
|
34
|
+
| `returnResponse` | `boolean` | `false` | Return full response including headers |
|
|
35
|
+
| `attachments` | `Record<string, string>` | - | File uploads (key: field name, value: file path) |
|
|
36
|
+
| `log` | `boolean` | `false` | Log request config to console |
|
|
37
|
+
| `logError` | `boolean` | `false` | Log error details when status >= 400 |
|
|
38
38
|
|
|
39
39
|
## Cookie Authentication
|
|
40
40
|
|
|
@@ -52,6 +52,7 @@ const result = await testHelper.rest('/endpoint', {
|
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
This is equivalent to:
|
|
55
|
+
|
|
55
56
|
```typescript
|
|
56
57
|
cookies: { 'iam.session_token': sessionToken, 'token': sessionToken }
|
|
57
58
|
```
|
|
@@ -76,10 +77,10 @@ const result = await testHelper.rest('/endpoint', {
|
|
|
76
77
|
|
|
77
78
|
### `token` vs `cookies`
|
|
78
79
|
|
|
79
|
-
| Option
|
|
80
|
-
|
|
81
|
-
| `token`
|
|
82
|
-
| `cookies` | `Cookie` header
|
|
80
|
+
| Option | Transport | Use Case |
|
|
81
|
+
| --------- | -------------------------------------- | ----------------------------------------- |
|
|
82
|
+
| `token` | `Authorization: Bearer <token>` header | JWT authentication |
|
|
83
|
+
| `cookies` | `Cookie` header | Session-based authentication (BetterAuth) |
|
|
83
84
|
|
|
84
85
|
Both can be used simultaneously without conflict - `token` sets the Authorization header while `cookies` sets the Cookie header.
|
|
85
86
|
|
|
@@ -153,7 +154,7 @@ const session = await db.collection('session').findOne({ userId: user._id });
|
|
|
153
154
|
|
|
154
155
|
// Use session token with auto-detection
|
|
155
156
|
await testHelper.rest('/protected-endpoint', {
|
|
156
|
-
cookies: session.token,
|
|
157
|
+
cookies: session.token, // Auto -> iam.session_token=...; token=...
|
|
157
158
|
});
|
|
158
159
|
```
|
|
159
160
|
|
|
@@ -176,15 +177,18 @@ await testHelper.rest('/protected-endpoint', {
|
|
|
176
177
|
## GraphQL Testing (`testHelper.graphQl()`)
|
|
177
178
|
|
|
178
179
|
```typescript
|
|
179
|
-
const result = await testHelper.graphQl(
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
180
|
+
const result = await testHelper.graphQl(
|
|
181
|
+
{
|
|
182
|
+
name: 'findUsers',
|
|
183
|
+
type: TestGraphQLType.QUERY,
|
|
184
|
+
arguments: { filter: { email: { eq: 'test@test.com' } } },
|
|
185
|
+
fields: ['id', 'email', 'name'],
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
token: jwtToken,
|
|
189
|
+
statusCode: 200,
|
|
190
|
+
},
|
|
191
|
+
);
|
|
188
192
|
```
|
|
189
193
|
|
|
190
|
-
See `TestGraphQLConfig` and `TestGraphQLOptions` interfaces in `test.helper.ts` for full configuration options.
|
|
194
|
+
See `TestGraphQLConfig` and `TestGraphQLOptions` interfaces in `test.helper.ts` for full configuration options.
|
package/src/test/test.helper.ts
CHANGED
|
@@ -264,14 +264,18 @@ export class TestHelper {
|
|
|
264
264
|
|
|
265
265
|
// Convert string to TestGraphQLConfig
|
|
266
266
|
if (
|
|
267
|
-
(typeof graphql === 'string' ||
|
|
268
|
-
|
|
267
|
+
(typeof graphql === 'string' ||
|
|
268
|
+
(typeof graphql === 'object' && graphql !== null && graphql.constructor === String)) &&
|
|
269
|
+
/^(?![a-zA-Z]+$).*$/.test((graphql as string).trim())
|
|
269
270
|
) {
|
|
270
271
|
// Use input as query
|
|
271
272
|
query = (graphql as string).trim();
|
|
272
273
|
} else {
|
|
273
274
|
// Use input as name
|
|
274
|
-
if (
|
|
275
|
+
if (
|
|
276
|
+
typeof graphql === 'string' ||
|
|
277
|
+
(typeof graphql === 'object' && graphql !== null && graphql.constructor === String)
|
|
278
|
+
) {
|
|
275
279
|
graphql = { name: (graphql as string).trim() } as any;
|
|
276
280
|
}
|
|
277
281
|
|
|
@@ -336,7 +340,7 @@ export class TestHelper {
|
|
|
336
340
|
});
|
|
337
341
|
}
|
|
338
342
|
} else {
|
|
339
|
-
query = query.replace(/(?<=[
|
|
343
|
+
query = query.replace(/(?<=[:[,]\s*)"([A-Z0-9_]+)"(?=\s*[,\]}])/g, (match, group1) => {
|
|
340
344
|
// If group1 only contains digits, the original string is returned
|
|
341
345
|
if (/^\d+$/.test(group1)) {
|
|
342
346
|
return match;
|
|
@@ -471,7 +475,7 @@ export class TestHelper {
|
|
|
471
475
|
}
|
|
472
476
|
if (Array.isArray(args)) {
|
|
473
477
|
objects.set(args, args);
|
|
474
|
-
return args.map(item => this.prepareArguments(item, objects));
|
|
478
|
+
return args.map((item) => this.prepareArguments(item, objects));
|
|
475
479
|
}
|
|
476
480
|
if (typeof args === 'object') {
|
|
477
481
|
objects.set(args, args);
|
|
@@ -542,7 +546,7 @@ export class TestHelper {
|
|
|
542
546
|
): Promise<any> {
|
|
543
547
|
// Token
|
|
544
548
|
if (token) {
|
|
545
|
-
requestConfig.headers = { authorization: `Bearer ${token}`, ...
|
|
549
|
+
requestConfig.headers = { authorization: `Bearer ${token}`, ...requestConfig.headers };
|
|
546
550
|
}
|
|
547
551
|
|
|
548
552
|
// Init response
|
|
@@ -580,12 +584,16 @@ export class TestHelper {
|
|
|
580
584
|
if (!requestConfig.cookies.includes('=') && !requestConfig.cookies.includes(';')) {
|
|
581
585
|
// Plain session token -> auto-build BetterAuth cookies
|
|
582
586
|
const cookieRecord = TestHelper.buildBetterAuthCookies(requestConfig.cookies);
|
|
583
|
-
cookieString = Object.entries(cookieRecord)
|
|
587
|
+
cookieString = Object.entries(cookieRecord)
|
|
588
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
589
|
+
.join('; ');
|
|
584
590
|
} else {
|
|
585
591
|
cookieString = requestConfig.cookies;
|
|
586
592
|
}
|
|
587
593
|
} else {
|
|
588
|
-
cookieString = Object.entries(requestConfig.cookies)
|
|
594
|
+
cookieString = Object.entries(requestConfig.cookies)
|
|
595
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
596
|
+
.join('; ');
|
|
589
597
|
}
|
|
590
598
|
request.set('Cookie', cookieString);
|
|
591
599
|
}
|
|
@@ -712,7 +720,7 @@ export class TestHelper {
|
|
|
712
720
|
async getSubscription(graphql: TestGraphQLConfig, query: string, options?: TestGraphQLOptions) {
|
|
713
721
|
// Check url
|
|
714
722
|
if (!this.subscriptionUrl) {
|
|
715
|
-
throw new Error(
|
|
723
|
+
throw new Error("Missing subscriptionUrl in TestHelper: new TestHelper(app, 'ws://localhost:3030/graphql')");
|
|
716
724
|
}
|
|
717
725
|
|
|
718
726
|
// Prepare subscription
|
|
@@ -761,7 +769,7 @@ export class TestHelper {
|
|
|
761
769
|
static buildBetterAuthCookies(sessionToken: string, basePath: string = 'iam'): Record<string, string> {
|
|
762
770
|
return {
|
|
763
771
|
[`${basePath}.session_token`]: sessionToken,
|
|
764
|
-
|
|
772
|
+
token: sessionToken,
|
|
765
773
|
};
|
|
766
774
|
}
|
|
767
775
|
|