arkos 2.0.0-next.2 → 2.0.0-next.20
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 +146 -145
- package/cli.js +11 -13
- package/dist/esm/app.js +17 -16
- package/dist/esm/app.js.map +1 -1
- package/dist/esm/components/arkos-gateway/arkos-gateway.js +338 -0
- package/dist/esm/components/arkos-gateway/arkos-gateway.js.map +1 -0
- package/dist/esm/components/arkos-gateway/socket-extensions.js +168 -0
- package/dist/esm/components/arkos-gateway/socket-extensions.js.map +1 -0
- package/dist/esm/components/arkos-gateway/types.js +3 -0
- package/dist/esm/components/arkos-gateway/types.js.map +1 -0
- package/dist/esm/components/arkos-gateway/utils/helpers.js +105 -0
- package/dist/esm/components/arkos-gateway/utils/helpers.js.map +1 -0
- package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js +45 -0
- package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js.map +1 -0
- package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js +40 -0
- package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js.map +1 -0
- package/dist/esm/components/arkos-gateway/utils/rate-limiter.js +13 -0
- package/dist/esm/components/arkos-gateway/utils/rate-limiter.js.map +1 -0
- package/dist/esm/components/arkos-loadable-registry/index.js +1 -3
- package/dist/esm/components/arkos-loadable-registry/index.js.map +1 -1
- package/dist/esm/components/arkos-policy/index.js +3 -1
- package/dist/esm/components/arkos-policy/index.js.map +1 -1
- package/dist/esm/components/arkos-route-hook/index.js +2 -1
- package/dist/esm/components/arkos-route-hook/index.js.map +1 -1
- package/dist/esm/components/arkos-route-hook/reader.js.map +1 -1
- package/dist/esm/components/arkos-route-hook/types.js.map +1 -1
- package/dist/esm/exports/error-handler/index.js +1 -0
- package/dist/esm/exports/error-handler/index.js.map +1 -1
- package/dist/esm/exports/index.js +3 -3
- package/dist/esm/exports/index.js.map +1 -1
- package/dist/esm/exports/middlewares/index.js +1 -1
- package/dist/esm/exports/middlewares/index.js.map +1 -1
- package/dist/esm/exports/services/index.js +2 -2
- package/dist/esm/exports/services/index.js.map +1 -1
- package/dist/esm/exports/websockets.js +5 -0
- package/dist/esm/exports/websockets.js.map +1 -0
- package/dist/esm/generated.js.map +1 -1
- package/dist/esm/modules/auth/auth.controller.js +214 -222
- package/dist/esm/modules/auth/auth.controller.js.map +1 -1
- package/dist/esm/modules/auth/auth.router.js +26 -9
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js +90 -102
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/auth/utils/auth-error-objects.js +2 -2
- package/dist/esm/modules/auth/utils/auth-error-objects.js.map +1 -1
- package/dist/esm/modules/auth/utils/auth-hooks-manager.js +148 -0
- package/dist/esm/modules/auth/utils/auth-hooks-manager.js.map +1 -0
- package/dist/esm/modules/auth/utils/auth-openapi-generator.js +367 -0
- package/dist/esm/modules/auth/utils/auth-openapi-generator.js.map +1 -0
- package/dist/esm/modules/auth/utils/auth-prisma-json-schema-generator.js +97 -0
- package/dist/esm/modules/auth/utils/auth-prisma-json-schema-generator.js.map +1 -0
- package/dist/esm/modules/auth/utils/docs-links.js +6 -0
- package/dist/esm/modules/auth/utils/docs-links.js.map +1 -0
- package/dist/esm/modules/auth/utils/services/auth-action.service.js +20 -16
- package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/esm/modules/base/base.controller.js +182 -162
- package/dist/esm/modules/base/base.controller.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +31 -48
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/base/base.router.js +23 -9
- package/dist/esm/modules/base/base.router.js.map +1 -1
- package/dist/esm/modules/base/base.service.js +33 -138
- package/dist/esm/modules/base/base.service.js.map +1 -1
- package/dist/esm/modules/base/types/base.service.types.js.map +1 -1
- package/dist/esm/modules/base/utils/error-prettifier.js +26 -30
- package/dist/esm/modules/base/utils/error-prettifier.js.map +1 -1
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +26 -5
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
- package/dist/esm/modules/base/utils/model-openapi-generator.js +438 -0
- package/dist/esm/modules/base/utils/model-openapi-generator.js.map +1 -0
- package/dist/esm/modules/email/email.service.js +17 -10
- package/dist/esm/modules/email/email.service.js.map +1 -1
- package/dist/esm/modules/error-handler/error-handler.controller.js +24 -113
- package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/app-error.js +5 -2
- package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/catch-async.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +9 -103
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/errors.js +127 -0
- package/dist/esm/modules/error-handler/utils/errors.js.map +1 -0
- package/dist/esm/modules/error-handler/utils/get-handled-error.js +68 -0
- package/dist/esm/modules/error-handler/utils/get-handled-error.js.map +1 -0
- package/dist/esm/modules/error-handler/utils/multer-error-handler.js +34 -0
- package/dist/esm/modules/error-handler/utils/multer-error-handler.js.map +1 -0
- package/dist/esm/modules/file-upload/file-upload.controller.js +208 -214
- package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.router.js +35 -12
- package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.service.js +13 -8
- package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
- package/dist/esm/modules/file-upload/utils/file-upload-json-schema-generator.js +346 -0
- package/dist/esm/modules/file-upload/utils/file-upload-json-schema-generator.js.map +1 -0
- package/dist/esm/modules/swagger/swagger.router.js +39 -22
- package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
- package/dist/esm/modules/swagger/utils/get-open-api-login-html.js +305 -0
- package/dist/esm/modules/swagger/utils/get-open-api-login-html.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js +6 -7
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +6 -3
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
- package/dist/esm/server.js +1 -1
- package/dist/esm/server.js.map +1 -1
- package/dist/esm/types/arkos-config/utils.js +2 -0
- package/dist/esm/types/arkos-config/utils.js.map +1 -0
- package/dist/esm/types/arkos-prisma-input.js.map +1 -1
- package/dist/esm/types/arkos.js.map +1 -1
- package/dist/esm/types/auth.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/new-arkos-config.js.map +1 -1
- package/dist/esm/types/router-config.js.map +1 -1
- package/dist/esm/types/upload.js +2 -0
- package/dist/esm/types/upload.js.map +1 -0
- package/dist/esm/types/validation/validation-manager.js +49 -0
- package/dist/esm/types/validation/validation-manager.js.map +1 -0
- package/dist/esm/types/validation/validator.js +2 -0
- package/dist/esm/types/validation/validator.js.map +1 -0
- package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js +68 -34
- package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +37 -130
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/route-config-registry.js +2 -3
- package/dist/esm/utils/arkos-router/route-config-registry.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/openapi-config.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/upload-config.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +188 -0
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -0
- package/dist/esm/utils/arkos-router/utils/helpers/index.js +88 -29
- package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +364 -89
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
- package/dist/esm/utils/bundler.js +6 -6
- package/dist/esm/utils/bundler.js.map +1 -1
- package/dist/esm/utils/cli/build.js +16 -7
- package/dist/esm/utils/cli/build.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +18 -28
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/export-auth-action.js +5 -4
- package/dist/esm/utils/cli/export-auth-action.js.map +1 -1
- package/dist/esm/utils/cli/generate.js +70 -56
- package/dist/esm/utils/cli/generate.js.map +1 -1
- package/dist/esm/utils/cli/index.js +54 -50
- package/dist/esm/utils/cli/index.js.map +1 -1
- package/dist/esm/utils/cli/prisma-generate.js +8 -37
- package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
- package/dist/esm/utils/cli/start.js +25 -14
- package/dist/esm/utils/cli/start.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/runtime-cli-commander.js +7 -4
- package/dist/esm/utils/cli/utils/runtime-cli-commander.js.map +1 -1
- package/dist/esm/utils/cli/utils/smart-fs-watcher.js +3 -0
- package/dist/esm/utils/cli/utils/smart-fs-watcher.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +307 -11
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js +16 -7
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +117 -65
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js +6 -8
- package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +13 -2
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js +2 -2
- package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js +213 -19
- package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generators.js +31 -18
- package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/esm/utils/define-config.js +14 -0
- package/dist/esm/utils/define-config.js.map +1 -1
- package/dist/esm/utils/docs-links.js +2 -0
- package/dist/esm/utils/docs-links.js.map +1 -0
- package/dist/esm/utils/dotenv.helpers.js +0 -6
- package/dist/esm/utils/dotenv.helpers.js.map +1 -1
- package/dist/esm/utils/dynamic-loader.js +2 -1
- package/dist/esm/utils/dynamic-loader.js.map +1 -1
- package/dist/esm/utils/features/api.features.js +46 -27
- package/dist/esm/utils/features/api.features.js.map +1 -1
- package/dist/esm/utils/features/port-and-host-allocator.js +4 -3
- package/dist/esm/utils/features/port-and-host-allocator.js.map +1 -1
- package/dist/esm/utils/helpers/api.features.helpers.js +20 -0
- package/dist/esm/utils/helpers/api.features.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/arkos-config.helpers.js +20 -2
- package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/exit-error.js +1 -0
- package/dist/esm/utils/helpers/exit-error.js.map +1 -1
- package/dist/esm/utils/helpers/fs.helpers.js +26 -33
- package/dist/esm/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/global.helpers.js +1 -1
- package/dist/esm/utils/helpers/global.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/prisma.helpers.js +10 -7
- package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/query-parser.helpers.js +7 -22
- package/dist/esm/utils/helpers/query-parser.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/routers.helpers.js +2 -2
- package/dist/esm/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/url-helpers.js +11 -0
- package/dist/esm/utils/helpers/url-helpers.js.map +1 -0
- package/dist/esm/utils/initialize-app.js +41 -17
- package/dist/esm/utils/initialize-app.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +154 -226
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-schema-parser.js +37 -11
- package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
- package/dist/esm/utils/prisma/types.js.map +1 -1
- package/dist/esm/utils/remove-dir.js +1 -1
- package/dist/esm/utils/remove-dir.js.map +1 -1
- package/dist/esm/utils/setup-app.js +59 -42
- package/dist/esm/utils/setup-app.js.map +1 -1
- package/dist/esm/utils/validate-schema.js +23 -21
- package/dist/esm/utils/validate-schema.js.map +1 -1
- package/dist/types/app.d.ts +10 -7
- package/dist/types/components/arkos-gateway/arkos-gateway.d.ts +121 -0
- package/dist/types/components/arkos-gateway/socket-extensions.d.ts +79 -0
- package/dist/types/components/arkos-gateway/types.d.ts +364 -0
- package/dist/types/components/arkos-gateway/utils/helpers.d.ts +9 -0
- package/dist/types/components/arkos-gateway/utils/memory-gateway-store.d.ts +14 -0
- package/dist/types/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.d.ts +20 -0
- package/dist/types/components/arkos-gateway/utils/rate-limiter.d.ts +11 -0
- package/dist/types/components/arkos-route-hook/index.d.ts +11 -5
- package/dist/types/components/arkos-route-hook/reader.d.ts +4 -7
- package/dist/types/components/arkos-route-hook/types.d.ts +9 -5
- package/dist/types/exports/error-handler/index.d.ts +1 -0
- package/dist/types/exports/index.d.ts +5 -5
- package/dist/types/exports/middlewares/index.d.ts +1 -1
- package/dist/types/exports/services/index.d.ts +3 -3
- package/dist/types/exports/websockets.d.ts +5 -0
- package/dist/types/modules/auth/auth.service.d.ts +80 -51
- package/dist/types/modules/auth/utils/auth-hooks-manager.d.ts +63 -0
- package/dist/types/modules/auth/utils/auth-openapi-generator.d.ts +9 -0
- package/dist/types/modules/auth/utils/auth-prisma-json-schema-generator.d.ts +13 -0
- package/dist/types/modules/auth/utils/docs-links.d.ts +3 -0
- package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +2 -2
- package/dist/types/modules/base/base.controller.d.ts +4 -4
- package/dist/types/modules/base/base.middlewares.d.ts +1 -7
- package/dist/types/modules/base/base.service.d.ts +8 -17
- package/dist/types/modules/base/types/base.service.types.d.ts +11 -0
- package/dist/types/modules/base/utils/helpers/base.service.helpers.d.ts +1 -1
- package/dist/types/modules/base/utils/model-openapi-generator.d.ts +12 -0
- package/dist/types/modules/email/email.service.d.ts +1 -1
- package/dist/types/modules/error-handler/utils/app-error.d.ts +0 -2
- package/dist/types/modules/error-handler/utils/catch-async.d.ts +2 -2
- package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +1 -27
- package/dist/types/modules/error-handler/utils/errors.d.ts +176 -0
- package/dist/types/modules/error-handler/utils/get-handled-error.d.ts +1 -0
- package/dist/types/modules/error-handler/utils/multer-error-handler.d.ts +7 -0
- package/dist/types/modules/file-upload/file-upload.controller.d.ts +7 -2
- package/dist/types/modules/file-upload/utils/file-upload-json-schema-generator.d.ts +12 -0
- package/dist/types/modules/swagger/swagger.router.d.ts +1 -2
- package/dist/types/modules/swagger/utils/get-open-api-login-html.d.ts +1 -0
- package/dist/types/modules/swagger/utils/helpers/get-swagger-default-configs.d.ts +48 -3
- package/dist/types/modules/swagger/utils/helpers/openapi-schema-converter.d.ts +6 -1
- package/dist/types/types/arkos-config/utils.d.ts +68 -0
- package/dist/types/types/arkos-prisma-input.d.ts +4 -3
- package/dist/types/types/arkos.d.ts +5 -15
- package/dist/types/types/auth.d.ts +4 -4
- package/dist/types/types/index.d.ts +10 -58
- package/dist/types/types/new-arkos-config.d.ts +326 -36
- package/dist/types/types/router-config.d.ts +0 -63
- package/dist/types/types/upload.d.ts +10 -0
- package/dist/types/types/validation/validation-manager.d.ts +27 -0
- package/dist/types/types/validation/validator.d.ts +2 -0
- package/dist/types/utils/arkos-router/arkos-router-openapi-manager.d.ts +14 -1
- package/dist/types/utils/arkos-router/index.d.ts +83 -8
- package/dist/types/utils/arkos-router/types/index.d.ts +74 -23
- package/dist/types/utils/arkos-router/types/openapi-config.d.ts +3 -2
- package/dist/types/utils/arkos-router/types/upload-config.d.ts +65 -8
- package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +6 -0
- package/dist/types/utils/arkos-router/utils/helpers/index.d.ts +4 -6
- package/dist/types/utils/arkos-router/utils/helpers/upload-manager.d.ts +1 -36
- package/dist/types/utils/bundler.d.ts +1 -1
- package/dist/types/utils/cli/build.d.ts +1 -1
- package/dist/types/utils/cli/generate.d.ts +15 -6
- package/dist/types/utils/cli/start.d.ts +3 -1
- package/dist/types/utils/cli/utils/template-generator/templates/class-validator-dto-generator.d.ts +11 -0
- package/dist/types/utils/cli/utils/template-generator/templates/zod-schema-generator.d.ts +4 -0
- package/dist/types/utils/define-config.d.ts +1 -1
- package/dist/types/utils/docs-links.d.ts +1 -0
- package/dist/types/utils/dynamic-loader.d.ts +2 -2
- package/dist/types/utils/features/api.features.d.ts +1 -2
- package/dist/types/utils/helpers/arkos-config.helpers.d.ts +7 -0
- package/dist/types/utils/helpers/fs.helpers.d.ts +1 -16
- package/dist/types/utils/helpers/global.helpers.d.ts +1 -0
- package/dist/types/utils/helpers/prisma.helpers.d.ts +1 -1
- package/dist/types/utils/helpers/query-parser.helpers.d.ts +1 -1
- package/dist/types/utils/helpers/url-helpers.d.ts +1 -0
- package/dist/types/utils/initialize-app.d.ts +1 -0
- package/dist/types/utils/prisma/prisma-json-schema-generator.d.ts +12 -30
- package/dist/types/utils/prisma/prisma-schema-parser.d.ts +4 -0
- package/dist/types/utils/prisma/types.d.ts +3 -2
- package/package.json +117 -84
- package/dist/cjs/app.js +0 -79
- package/dist/cjs/app.js.map +0 -1
- package/dist/cjs/components/arkos-loadable-registry/index.js +0 -28
- package/dist/cjs/components/arkos-loadable-registry/index.js.map +0 -1
- package/dist/cjs/components/arkos-loadable-translator/index.js +0 -144
- package/dist/cjs/components/arkos-loadable-translator/index.js.map +0 -1
- package/dist/cjs/components/arkos-policy/index.js +0 -36
- package/dist/cjs/components/arkos-policy/index.js.map +0 -1
- package/dist/cjs/components/arkos-policy/types.js +0 -3
- package/dist/cjs/components/arkos-policy/types.js.map +0 -1
- package/dist/cjs/components/arkos-route-hook/index.js +0 -50
- package/dist/cjs/components/arkos-route-hook/index.js.map +0 -1
- package/dist/cjs/components/arkos-route-hook/reader.js +0 -47
- package/dist/cjs/components/arkos-route-hook/reader.js.map +0 -1
- package/dist/cjs/components/arkos-route-hook/types.js +0 -3
- package/dist/cjs/components/arkos-route-hook/types.js.map +0 -1
- package/dist/cjs/components/arkos-service-hook/index.js +0 -35
- package/dist/cjs/components/arkos-service-hook/index.js.map +0 -1
- package/dist/cjs/components/arkos-service-hook/reader.js +0 -30
- package/dist/cjs/components/arkos-service-hook/reader.js.map +0 -1
- package/dist/cjs/components/arkos-service-hook/types.js +0 -3
- package/dist/cjs/components/arkos-service-hook/types.js.map +0 -1
- package/dist/cjs/exports/auth/index.js +0 -6
- package/dist/cjs/exports/auth/index.js.map +0 -1
- package/dist/cjs/exports/config.js +0 -6
- package/dist/cjs/exports/config.js.map +0 -1
- package/dist/cjs/exports/controllers/index.js +0 -42
- package/dist/cjs/exports/controllers/index.js.map +0 -1
- package/dist/cjs/exports/error-handler/index.js +0 -11
- package/dist/cjs/exports/error-handler/index.js.map +0 -1
- package/dist/cjs/exports/index.js +0 -23
- package/dist/cjs/exports/index.js.map +0 -1
- package/dist/cjs/exports/middlewares/index.js +0 -7
- package/dist/cjs/exports/middlewares/index.js.map +0 -1
- package/dist/cjs/exports/prisma/index.js +0 -13
- package/dist/cjs/exports/prisma/index.js.map +0 -1
- package/dist/cjs/exports/services/index.js +0 -53
- package/dist/cjs/exports/services/index.js.map +0 -1
- package/dist/cjs/exports/utils/index.js +0 -26
- package/dist/cjs/exports/utils/index.js.map +0 -1
- package/dist/cjs/exports/validation/index.js +0 -11
- package/dist/cjs/exports/validation/index.js.map +0 -1
- package/dist/cjs/generated.js +0 -7
- package/dist/cjs/generated.js.map +0 -1
- package/dist/cjs/modules/auth/auth.controller.js +0 -254
- package/dist/cjs/modules/auth/auth.controller.js.map +0 -1
- package/dist/cjs/modules/auth/auth.router.js +0 -113
- package/dist/cjs/modules/auth/auth.router.js.map +0 -1
- package/dist/cjs/modules/auth/auth.service.js +0 -277
- package/dist/cjs/modules/auth/auth.service.js.map +0 -1
- package/dist/cjs/modules/auth/utils/auth-error-objects.js +0 -10
- package/dist/cjs/modules/auth/utils/auth-error-objects.js.map +0 -1
- package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +0 -83
- package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js.map +0 -1
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js +0 -150
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +0 -1
- package/dist/cjs/modules/base/base.controller.js +0 -275
- package/dist/cjs/modules/base/base.controller.js.map +0 -1
- package/dist/cjs/modules/base/base.middlewares.js +0 -231
- package/dist/cjs/modules/base/base.middlewares.js.map +0 -1
- package/dist/cjs/modules/base/base.router.js +0 -112
- package/dist/cjs/modules/base/base.router.js.map +0 -1
- package/dist/cjs/modules/base/base.service.js +0 -432
- package/dist/cjs/modules/base/base.service.js.map +0 -1
- package/dist/cjs/modules/base/types/base.service.types.js +0 -3
- package/dist/cjs/modules/base/types/base.service.types.js.map +0 -1
- package/dist/cjs/modules/base/utils/error-prettifier.js +0 -188
- package/dist/cjs/modules/base/utils/error-prettifier.js.map +0 -1
- package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js +0 -49
- package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js.map +0 -1
- package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +0 -13
- package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +0 -1
- package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +0 -222
- package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +0 -1
- package/dist/cjs/modules/base/utils/router-validator.js +0 -13
- package/dist/cjs/modules/base/utils/router-validator.js.map +0 -1
- package/dist/cjs/modules/base/utils/service-hooks-manager.js +0 -19
- package/dist/cjs/modules/base/utils/service-hooks-manager.js.map +0 -1
- package/dist/cjs/modules/debugger/debugger.service.js +0 -59
- package/dist/cjs/modules/debugger/debugger.service.js.map +0 -1
- package/dist/cjs/modules/email/email.service.js +0 -106
- package/dist/cjs/modules/email/email.service.js.map +0 -1
- package/dist/cjs/modules/error-handler/error-handler.controller.js +0 -192
- package/dist/cjs/modules/error-handler/error-handler.controller.js.map +0 -1
- package/dist/cjs/modules/error-handler/utils/app-error.js +0 -28
- package/dist/cjs/modules/error-handler/utils/app-error.js.map +0 -1
- package/dist/cjs/modules/error-handler/utils/catch-async.js +0 -21
- package/dist/cjs/modules/error-handler/utils/catch-async.js.map +0 -1
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +0 -218
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +0 -1
- package/dist/cjs/modules/file-upload/file-upload.controller.js +0 -256
- package/dist/cjs/modules/file-upload/file-upload.controller.js.map +0 -1
- package/dist/cjs/modules/file-upload/file-upload.router.js +0 -80
- package/dist/cjs/modules/file-upload/file-upload.router.js.map +0 -1
- package/dist/cjs/modules/file-upload/file-upload.service.js +0 -343
- package/dist/cjs/modules/file-upload/file-upload.service.js.map +0 -1
- package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js +0 -134
- package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js.map +0 -1
- package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +0 -100
- package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +0 -1
- package/dist/cjs/modules/swagger/swagger.router.js +0 -65
- package/dist/cjs/modules/swagger/swagger.router.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/built-in-route-path-object-manager.js +0 -7
- package/dist/cjs/modules/swagger/utils/built-in-route-path-object-manager.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js +0 -53
- package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +0 -473
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +0 -491
- package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +0 -73
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js +0 -37
- package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +0 -61
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +0 -31
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js +0 -49
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +0 -39
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +0 -468
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +0 -260
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js +0 -331
- package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js.map +0 -1
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +0 -109
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +0 -1
- package/dist/cjs/package.json +0 -3
- package/dist/cjs/server.js +0 -60
- package/dist/cjs/server.js.map +0 -1
- package/dist/cjs/types/arkos-prisma-input.js +0 -3
- package/dist/cjs/types/arkos-prisma-input.js.map +0 -1
- package/dist/cjs/types/arkos.js +0 -3
- package/dist/cjs/types/arkos.js.map +0 -1
- package/dist/cjs/types/auth.js +0 -3
- package/dist/cjs/types/auth.js.map +0 -1
- package/dist/cjs/types/index.js +0 -3
- package/dist/cjs/types/index.js.map +0 -1
- package/dist/cjs/types/new-arkos-config.js +0 -3
- package/dist/cjs/types/new-arkos-config.js.map +0 -1
- package/dist/cjs/types/router-config.js +0 -3
- package/dist/cjs/types/router-config.js.map +0 -1
- package/dist/cjs/utils/arkos-env.js +0 -9
- package/dist/cjs/utils/arkos-env.js.map +0 -1
- package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js +0 -126
- package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js.map +0 -1
- package/dist/cjs/utils/arkos-router/index.js +0 -253
- package/dist/cjs/utils/arkos-router/index.js.map +0 -1
- package/dist/cjs/utils/arkos-router/route-config-registry.js +0 -16
- package/dist/cjs/utils/arkos-router/route-config-registry.js.map +0 -1
- package/dist/cjs/utils/arkos-router/route-config-validator.js +0 -56
- package/dist/cjs/utils/arkos-router/route-config-validator.js.map +0 -1
- package/dist/cjs/utils/arkos-router/types/body-parser-config.js +0 -3
- package/dist/cjs/utils/arkos-router/types/body-parser-config.js.map +0 -1
- package/dist/cjs/utils/arkos-router/types/index.js +0 -3
- package/dist/cjs/utils/arkos-router/types/index.js.map +0 -1
- package/dist/cjs/utils/arkos-router/types/openapi-config.js +0 -3
- package/dist/cjs/utils/arkos-router/types/openapi-config.js.map +0 -1
- package/dist/cjs/utils/arkos-router/types/upload-config.js +0 -3
- package/dist/cjs/utils/arkos-router/types/upload-config.js.map +0 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js +0 -163
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +0 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js +0 -283
- package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js.map +0 -1
- package/dist/cjs/utils/bundler.js +0 -163
- package/dist/cjs/utils/bundler.js.map +0 -1
- package/dist/cjs/utils/cli/build.js +0 -199
- package/dist/cjs/utils/cli/build.js.map +0 -1
- package/dist/cjs/utils/cli/dev.js +0 -128
- package/dist/cjs/utils/cli/dev.js.map +0 -1
- package/dist/cjs/utils/cli/export-auth-action.js +0 -79
- package/dist/cjs/utils/cli/export-auth-action.js.map +0 -1
- package/dist/cjs/utils/cli/generate.js +0 -229
- package/dist/cjs/utils/cli/generate.js.map +0 -1
- package/dist/cjs/utils/cli/index.js +0 -191
- package/dist/cjs/utils/cli/index.js.map +0 -1
- package/dist/cjs/utils/cli/prisma-generate.js +0 -112
- package/dist/cjs/utils/cli/prisma-generate.js.map +0 -1
- package/dist/cjs/utils/cli/start.js +0 -72
- package/dist/cjs/utils/cli/start.js.map +0 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +0 -24
- package/dist/cjs/utils/cli/utils/cli.helpers.js.map +0 -1
- package/dist/cjs/utils/cli/utils/runtime-cli-commander.js +0 -115
- package/dist/cjs/utils/cli/utils/runtime-cli-commander.js.map +0 -1
- package/dist/cjs/utils/cli/utils/smart-fs-watcher.js +0 -73
- package/dist/cjs/utils/cli/utils/smart-fs-watcher.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +0 -550
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -52
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +0 -139
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js +0 -53
- package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/route-hook.template.js +0 -39
- package/dist/cjs/utils/cli/utils/template-generator/templates/route-hook.template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +0 -19
- package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-hook.template.js +0 -32
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-hook.template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js +0 -50
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js +0 -351
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generators.js +0 -52
- package/dist/cjs/utils/cli/utils/template-generators.js.map +0 -1
- package/dist/cjs/utils/cli/utils/watermark-stamper.js +0 -26
- package/dist/cjs/utils/cli/utils/watermark-stamper.js.map +0 -1
- package/dist/cjs/utils/define-config.js +0 -46
- package/dist/cjs/utils/define-config.js.map +0 -1
- package/dist/cjs/utils/dotenv.helpers.js +0 -52
- package/dist/cjs/utils/dotenv.helpers.js.map +0 -1
- package/dist/cjs/utils/dynamic-loader.js +0 -22
- package/dist/cjs/utils/dynamic-loader.js.map +0 -1
- package/dist/cjs/utils/expand-env.js +0 -72
- package/dist/cjs/utils/expand-env.js.map +0 -1
- package/dist/cjs/utils/features/api.features.js +0 -201
- package/dist/cjs/utils/features/api.features.js.map +0 -1
- package/dist/cjs/utils/features/port-and-host-allocator.js +0 -129
- package/dist/cjs/utils/features/port-and-host-allocator.js.map +0 -1
- package/dist/cjs/utils/helpers/api.features.helpers.js +0 -327
- package/dist/cjs/utils/helpers/api.features.helpers.js.map +0 -1
- package/dist/cjs/utils/helpers/arkos-config.helpers.js +0 -86
- package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +0 -1
- package/dist/cjs/utils/helpers/change-case.helpers.js +0 -177
- package/dist/cjs/utils/helpers/change-case.helpers.js.map +0 -1
- package/dist/cjs/utils/helpers/deepmerge.helper.js +0 -115
- package/dist/cjs/utils/helpers/deepmerge.helper.js.map +0 -1
- package/dist/cjs/utils/helpers/exit-error.js +0 -12
- package/dist/cjs/utils/helpers/exit-error.js.map +0 -1
- package/dist/cjs/utils/helpers/fs.helpers.js +0 -60
- package/dist/cjs/utils/helpers/fs.helpers.js.map +0 -1
- package/dist/cjs/utils/helpers/global.helpers.js +0 -105
- package/dist/cjs/utils/helpers/global.helpers.js.map +0 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js +0 -53
- package/dist/cjs/utils/helpers/prisma.helpers.js.map +0 -1
- package/dist/cjs/utils/helpers/query-parser.helpers.js +0 -69
- package/dist/cjs/utils/helpers/query-parser.helpers.js.map +0 -1
- package/dist/cjs/utils/helpers/routers.helpers.js +0 -36
- package/dist/cjs/utils/helpers/routers.helpers.js.map +0 -1
- package/dist/cjs/utils/helpers/text.helpers.js +0 -28
- package/dist/cjs/utils/helpers/text.helpers.js.map +0 -1
- package/dist/cjs/utils/initialize-app.js +0 -55
- package/dist/cjs/utils/initialize-app.js.map +0 -1
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +0 -437
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +0 -1
- package/dist/cjs/utils/prisma/prisma-schema-parser.js +0 -360
- package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +0 -1
- package/dist/cjs/utils/prisma/types.js +0 -3
- package/dist/cjs/utils/prisma/types.js.map +0 -1
- package/dist/cjs/utils/remove-dir.js +0 -14
- package/dist/cjs/utils/remove-dir.js.map +0 -1
- package/dist/cjs/utils/setup-app.js +0 -119
- package/dist/cjs/utils/setup-app.js.map +0 -1
- package/dist/cjs/utils/sheu.js +0 -131
- package/dist/cjs/utils/sheu.js.map +0 -1
- package/dist/cjs/utils/validate-dto.js +0 -19
- package/dist/cjs/utils/validate-dto.js.map +0 -1
- package/dist/cjs/utils/validate-schema.js +0 -75
- package/dist/cjs/utils/validate-schema.js.map +0 -1
- package/dist/esm/components/arkos-loadable-translator/index.js +0 -138
- package/dist/esm/components/arkos-loadable-translator/index.js.map +0 -1
- package/dist/esm/components/arkos-service-hook/index.js +0 -32
- package/dist/esm/components/arkos-service-hook/index.js.map +0 -1
- package/dist/esm/components/arkos-service-hook/reader.js +0 -24
- package/dist/esm/components/arkos-service-hook/reader.js.map +0 -1
- package/dist/esm/components/arkos-service-hook/types.js +0 -2
- package/dist/esm/components/arkos-service-hook/types.js.map +0 -1
- package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +0 -10
- package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +0 -1
- package/dist/esm/modules/base/utils/service-hooks-manager.js +0 -17
- package/dist/esm/modules/base/utils/service-hooks-manager.js.map +0 -1
- package/dist/esm/modules/swagger/utils/built-in-route-path-object-manager.js +0 -5
- package/dist/esm/modules/swagger/utils/built-in-route-path-object-manager.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +0 -469
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +0 -485
- package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js +0 -34
- package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +0 -55
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +0 -25
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js +0 -46
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +0 -33
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +0 -462
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +0 -255
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +0 -1
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js +0 -98
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/route-hook.template.js +0 -36
- package/dist/esm/utils/cli/utils/template-generator/templates/route-hook.template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/service-hook.template.js +0 -29
- package/dist/esm/utils/cli/utils/template-generator/templates/service-hook.template.js.map +0 -1
- package/dist/types/components/arkos-loadable-translator/index.d.ts +0 -53
- package/dist/types/components/arkos-service-hook/index.d.ts +0 -41
- package/dist/types/components/arkos-service-hook/reader.d.ts +0 -35
- package/dist/types/components/arkos-service-hook/types.d.ts +0 -240
- package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +0 -3
- package/dist/types/modules/base/utils/service-hooks-manager.d.ts +0 -10
- package/dist/types/modules/swagger/utils/built-in-route-path-object-manager.d.ts +0 -4
- package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +0 -5
- package/dist/types/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.d.ts +0 -3
- package/dist/types/modules/swagger/utils/helpers/get-system-json-schema-paths.d.ts +0 -2
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.d.ts +0 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.d.ts +0 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.d.ts +0 -4
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.d.ts +0 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.d.ts +0 -2
- package/dist/types/modules/swagger/utils/helpers/missing-json-schemas-generator.d.ts +0 -76
- package/dist/types/modules/swagger/utils/helpers/swagger.router.helpers.d.ts +0 -19
- package/dist/types/utils/cli/utils/template-generator/templates/route-hook.template.d.ts +0 -2
- package/dist/types/utils/cli/utils/template-generator/templates/service-hook.template.d.ts +0 -2
|
@@ -3,76 +3,12 @@ import deepmerge from "../../utils/helpers/deepmerge.helper.js";
|
|
|
3
3
|
import { handleRelationFieldsInBody, } from "./utils/helpers/base.service.helpers.js";
|
|
4
4
|
import { getPrismaInstance } from "../../utils/helpers/prisma.helpers.js";
|
|
5
5
|
import authService from "../auth/auth.service.js";
|
|
6
|
-
import serviceHooksManager from "./utils/service-hooks-manager.js";
|
|
7
6
|
import prismaSchemaParser from "../../utils/prisma/prisma-schema-parser.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
export class ArkosPrismaService {
|
|
8
|
+
modelName;
|
|
9
|
+
relationFields;
|
|
10
|
+
prismaInstace;
|
|
11
11
|
constructor(modelName) {
|
|
12
|
-
this.executeOperation = (config) => {
|
|
13
|
-
return async (...args) => {
|
|
14
|
-
const context = args[args.length - 1];
|
|
15
|
-
try {
|
|
16
|
-
let argsWithRelationFieldsHandled = await this.processRelationFieldsInBody(args, config);
|
|
17
|
-
let prismaFinalArgs = await this.handlePasswordHashing(argsWithRelationFieldsHandled, config);
|
|
18
|
-
await this.executeHooks("before", config.operationType, this.buildHookParams(argsWithRelationFieldsHandled, config), context);
|
|
19
|
-
if (config.hooks?.beforeOperation)
|
|
20
|
-
await config.hooks.beforeOperation(this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
21
|
-
if (config.hooks?.beforePrisma) {
|
|
22
|
-
argsWithRelationFieldsHandled = await config.hooks.beforePrisma(argsWithRelationFieldsHandled, this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
23
|
-
}
|
|
24
|
-
const prisma = getPrismaInstance();
|
|
25
|
-
let result;
|
|
26
|
-
if (config.customPrismaLogic) {
|
|
27
|
-
result = await config.customPrismaLogic(argsWithRelationFieldsHandled, prisma, config, this);
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
const prismaArgs = this.buildPrismaArgs(prismaFinalArgs, config);
|
|
31
|
-
result = await prisma[this.modelName][config.prismaMethod](prismaArgs);
|
|
32
|
-
}
|
|
33
|
-
if (config.hooks?.afterPrisma) {
|
|
34
|
-
result = await config.hooks.afterPrisma(result, this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
35
|
-
}
|
|
36
|
-
await this.executeHooks("after", config.operationType, {
|
|
37
|
-
...this.buildHookParams(argsWithRelationFieldsHandled, config),
|
|
38
|
-
result,
|
|
39
|
-
}, context);
|
|
40
|
-
if (config.hooks?.afterOperation) {
|
|
41
|
-
await config.hooks.afterOperation(result, this.buildHookParams(argsWithRelationFieldsHandled, config));
|
|
42
|
-
}
|
|
43
|
-
return result;
|
|
44
|
-
}
|
|
45
|
-
catch (err) {
|
|
46
|
-
await this.executeHooks("error", config.operationType, { ...this.buildHookParams(args, config), error: err }, context);
|
|
47
|
-
if (context?.throwOnError !== false)
|
|
48
|
-
throw err;
|
|
49
|
-
return config.returnsFallback;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
};
|
|
53
|
-
this.executeTransactionOperation = (config) => {
|
|
54
|
-
return async (...args) => {
|
|
55
|
-
const context = args[args.length - 1];
|
|
56
|
-
try {
|
|
57
|
-
let argsWithRelationFieldsHandled = await this.processRelationFieldsInBody(args, config);
|
|
58
|
-
let prismaFinalArgs = await this.handlePasswordHashing(argsWithRelationFieldsHandled, config);
|
|
59
|
-
await this.executeHooks("before", config.operationType, this.buildTransactionHookParams(argsWithRelationFieldsHandled, config), context);
|
|
60
|
-
const prisma = getPrismaInstance();
|
|
61
|
-
const results = await this.executeTransactionLogic(prismaFinalArgs, config, prisma);
|
|
62
|
-
await this.executeHooks("after", config.operationType, {
|
|
63
|
-
...this.buildTransactionHookParams(argsWithRelationFieldsHandled, config),
|
|
64
|
-
results,
|
|
65
|
-
}, context);
|
|
66
|
-
return results;
|
|
67
|
-
}
|
|
68
|
-
catch (err) {
|
|
69
|
-
await this.executeHooks("error", config.operationType, { ...this.buildTransactionHookParams(args, config), error: err }, context);
|
|
70
|
-
if (context?.throwOnError !== false)
|
|
71
|
-
throw err;
|
|
72
|
-
return config.returnsFallback;
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
};
|
|
76
12
|
this.modelName = camelCase(modelName);
|
|
77
13
|
const modelFields = prismaSchemaParser?.getModelRelations?.(modelName);
|
|
78
14
|
this.relationFields = {
|
|
@@ -80,78 +16,37 @@ export class BaseService {
|
|
|
80
16
|
[],
|
|
81
17
|
list: modelFields?.filter((field) => field.isRelation && field.isArray) || [],
|
|
82
18
|
};
|
|
83
|
-
this.prisma = getPrismaInstance();
|
|
84
|
-
}
|
|
85
|
-
getServiceHook() {
|
|
86
|
-
return loadableRegistry.getItem("ArkosServiceHook", kebabCase(this.modelName));
|
|
87
19
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const skipCondition = context?.skip === hookType ||
|
|
93
|
-
context?.skip === "all" ||
|
|
94
|
-
(Array.isArray(context?.skip) && context.skip.includes(hookType));
|
|
95
|
-
if (skipCondition || ["batchDelete", "batchUpdate"].includes(operationType))
|
|
96
|
-
return;
|
|
97
|
-
const hooks = serviceHookReader.getHooks(this.modelName, operationType);
|
|
98
|
-
if (!hooks)
|
|
99
|
-
return;
|
|
100
|
-
const handlers = hookType === "before"
|
|
101
|
-
? hooks.before
|
|
102
|
-
: hookType === "after"
|
|
103
|
-
? hooks.after
|
|
104
|
-
: hooks.onError;
|
|
105
|
-
if (handlers?.length)
|
|
106
|
-
await serviceHooksManager.handleHook(handlers, params);
|
|
107
|
-
}
|
|
108
|
-
buildHookParams(args, config) {
|
|
109
|
-
const context = args[args.length - 1];
|
|
110
|
-
switch (config.operationType) {
|
|
111
|
-
case "createOne":
|
|
112
|
-
case "createMany":
|
|
113
|
-
return { data: args[0], queryOptions: args[1], context };
|
|
114
|
-
case "findMany":
|
|
115
|
-
return { filters: args[0], queryOptions: args[1], context };
|
|
116
|
-
case "findById":
|
|
117
|
-
return { id: args[0], queryOptions: args[1], context };
|
|
118
|
-
case "findOne":
|
|
119
|
-
return { filters: args[0], queryOptions: args[1], context };
|
|
120
|
-
case "updateOne":
|
|
121
|
-
return {
|
|
122
|
-
filters: args[0],
|
|
123
|
-
data: args[1],
|
|
124
|
-
queryOptions: args[2],
|
|
125
|
-
context,
|
|
126
|
-
};
|
|
127
|
-
case "updateMany":
|
|
128
|
-
return {
|
|
129
|
-
filters: args[0],
|
|
130
|
-
data: args[1],
|
|
131
|
-
queryOptions: args[2],
|
|
132
|
-
context,
|
|
133
|
-
};
|
|
134
|
-
case "deleteOne":
|
|
135
|
-
return { filters: args[0], context };
|
|
136
|
-
case "deleteMany":
|
|
137
|
-
return { filters: args[0], context };
|
|
138
|
-
case "count":
|
|
139
|
-
return { filters: args[0], context };
|
|
140
|
-
default:
|
|
141
|
-
return { context };
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
buildTransactionHookParams(args, config) {
|
|
145
|
-
const context = args[args.length - 1];
|
|
146
|
-
switch (config.operationType) {
|
|
147
|
-
case "batchUpdate":
|
|
148
|
-
return { data: args[0], queryOptions: args[1], context };
|
|
149
|
-
case "batchDelete":
|
|
150
|
-
return { batchFilters: args[0], context };
|
|
151
|
-
default:
|
|
152
|
-
return { context };
|
|
153
|
-
}
|
|
20
|
+
get prisma() {
|
|
21
|
+
if (!this.prismaInstace)
|
|
22
|
+
this.prismaInstace = getPrismaInstance();
|
|
23
|
+
return this.prismaInstace;
|
|
154
24
|
}
|
|
25
|
+
executeOperation = (config) => {
|
|
26
|
+
return async (...args) => {
|
|
27
|
+
let argsWithRelationFieldsHandled = await this.processRelationFieldsInBody(args, config);
|
|
28
|
+
let prismaFinalArgs = await this.handlePasswordHashing(argsWithRelationFieldsHandled, config);
|
|
29
|
+
const prisma = getPrismaInstance();
|
|
30
|
+
let result;
|
|
31
|
+
if (config.customPrismaLogic) {
|
|
32
|
+
result = await config.customPrismaLogic(argsWithRelationFieldsHandled, prisma, config, this);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const prismaArgs = this.buildPrismaArgs(prismaFinalArgs, config);
|
|
36
|
+
result = await prisma[this.modelName][config.prismaMethod](prismaArgs);
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
executeTransactionOperation = (config) => {
|
|
42
|
+
return async (...args) => {
|
|
43
|
+
let argsWithRelationFieldsHandled = await this.processRelationFieldsInBody(args, config);
|
|
44
|
+
let prismaFinalArgs = await this.handlePasswordHashing(argsWithRelationFieldsHandled, config);
|
|
45
|
+
const prisma = getPrismaInstance();
|
|
46
|
+
const results = await this.executeTransactionLogic(prismaFinalArgs, config, prisma);
|
|
47
|
+
return results;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
155
50
|
async handlePasswordHashing(args, config) {
|
|
156
51
|
let processedArgs = [...args];
|
|
157
52
|
if (config.requiresPasswordHashing) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n camelCase,\n kebabCase,\n pascalCase,\n} from \"../../utils/helpers/change-case.helpers\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n handleRelationFieldsInBody,\n ModelGroupRelationFields,\n} from \"./utils/helpers/base.service.helpers\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport authService from \"../auth/auth.service\";\nimport { PrismaClient } from \"../../generated\";\nimport {\n CountFilters,\n CreateData,\n CreateManyData,\n CreateManyOptions,\n CreateOptions,\n Delegate,\n DeleteManyFilters,\n DeleteOneFilters,\n FindManyFilters,\n FindManyOptions,\n FindOneFilters,\n FindOneOptions,\n GetPayload,\n Models,\n UpdateManyData,\n UpdateManyFilters,\n UpdateManyOptions,\n UpdateOneData,\n UpdateOneFilters,\n UpdateOneOptions,\n} from \"./types/base.service.types\";\nimport serviceHooksManager from \"./utils/service-hooks-manager\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport {\n ArkosServiceHookInstance,\n ArkosServiceHookMethodConfigs,\n ServiceHookContext,\n} from \"../../components/arkos-service-hook/types\";\nimport { serviceHookReader } from \"../../components/arkos-service-hook/reader\";\n\nexport interface ServiceOperationHooks {\n beforeOperation?: (params: any) => void | Promise<void>;\n afterOperation?: (result: any, params: any) => void | Promise<void>;\n beforePrisma?: (prismaArgs: any, params: any) => any | Promise<any>;\n afterPrisma?: (result: any, params: any) => any | Promise<any>;\n}\n\ninterface ServiceOperationConfig {\n operationType:\n | keyof ArkosServiceHookMethodConfigs<any, any>\n | \"batchDelete\"\n | \"batchUpdate\";\n prismaMethod: string;\n requiresPasswordHashing?: boolean;\n relationFieldsHandling?: string[];\n returnsFallback?: any;\n customPrismaLogic?: (\n args: any[],\n prisma: PrismaClient,\n config: ServiceOperationConfig,\n context: BaseService<any>\n ) => Promise<any>;\n hooks?: ServiceOperationHooks;\n}\n\n/**\n * Base service class for handling CRUD operations on a specific model.\n * This class provides standard implementation of data operations that can be extended\n * by model-specific service classes.\n *\n * @class BaseService\n *\n * @example\n * ```ts\n * import { BaseService } from \"arkos/services\";\n *\n * export class UserService extends BaseService<\"user\"> {}\n *\n * const userService = new UserService(\"user\");\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-service-class}\n * @see {@link https://www.arkosjs.com/docs/guide/accessing-request-context-in-services}\n */\nexport class BaseService<TModelName extends keyof Models = keyof Models> {\n modelName: TModelName;\n relationFields: ModelGroupRelationFields;\n prisma: PrismaClient;\n\n constructor(modelName: TModelName) {\n this.modelName = camelCase(modelName as string) as TModelName;\n const modelFields = prismaSchemaParser?.getModelRelations?.(\n modelName as string\n );\n\n this.relationFields = {\n singular:\n modelFields?.filter((field) => field.isRelation && !field.isArray) ||\n [],\n list:\n modelFields?.filter((field) => field.isRelation && field.isArray) || [],\n };\n this.prisma = getPrismaInstance();\n }\n\n private getServiceHook() {\n return loadableRegistry.getItem(\n \"ArkosServiceHook\",\n kebabCase(this.modelName)\n ) as ArkosServiceHookInstance<TModelName>;\n }\n\n private executeOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n const context = args[args.length - 1] as ServiceHookContext;\n\n try {\n let argsWithRelationFieldsHandled =\n await this.processRelationFieldsInBody(args, config);\n let prismaFinalArgs = await this.handlePasswordHashing(\n argsWithRelationFieldsHandled,\n config\n );\n\n await this.executeHooks(\n \"before\",\n config.operationType,\n this.buildHookParams(argsWithRelationFieldsHandled, config),\n context\n );\n\n if (config.hooks?.beforeOperation)\n await config.hooks.beforeOperation(\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n\n if (config.hooks?.beforePrisma) {\n argsWithRelationFieldsHandled = await config.hooks.beforePrisma(\n argsWithRelationFieldsHandled,\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n }\n\n const prisma = getPrismaInstance();\n let result: any;\n\n if (config.customPrismaLogic) {\n result = await config.customPrismaLogic(\n argsWithRelationFieldsHandled,\n prisma,\n config,\n this\n );\n } else {\n const prismaArgs = this.buildPrismaArgs(prismaFinalArgs, config);\n result = await (\n prisma[this.modelName as string] as Delegate<TModelName>\n )[config.prismaMethod](prismaArgs);\n }\n\n if (config.hooks?.afterPrisma) {\n result = await config.hooks.afterPrisma(\n result,\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n }\n\n await this.executeHooks(\n \"after\",\n config.operationType,\n {\n ...this.buildHookParams(argsWithRelationFieldsHandled, config),\n result,\n },\n context\n );\n\n if (config.hooks?.afterOperation) {\n await config.hooks.afterOperation(\n result,\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n }\n\n return result;\n } catch (err: any) {\n await this.executeHooks(\n \"error\",\n config.operationType,\n { ...this.buildHookParams(args, config), error: err },\n context\n );\n if (context?.throwOnError !== false) throw err;\n return config.returnsFallback;\n }\n };\n };\n\n private executeTransactionOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n const context = args[args.length - 1] as ServiceHookContext;\n\n try {\n let argsWithRelationFieldsHandled =\n await this.processRelationFieldsInBody(args, config);\n let prismaFinalArgs = await this.handlePasswordHashing(\n argsWithRelationFieldsHandled,\n config\n );\n\n await this.executeHooks(\n \"before\",\n config.operationType,\n this.buildTransactionHookParams(\n argsWithRelationFieldsHandled,\n config\n ),\n context\n );\n\n const prisma = getPrismaInstance();\n const results = await this.executeTransactionLogic(\n prismaFinalArgs,\n config,\n prisma\n );\n\n await this.executeHooks(\n \"after\",\n config.operationType,\n {\n ...this.buildTransactionHookParams(\n argsWithRelationFieldsHandled,\n config\n ),\n results,\n },\n context\n );\n return results;\n } catch (err: any) {\n await this.executeHooks(\n \"error\",\n config.operationType,\n { ...this.buildTransactionHookParams(args, config), error: err },\n context\n );\n if (context?.throwOnError !== false) throw err;\n return config.returnsFallback;\n }\n };\n };\n\n private async executeHooks(\n hookType: \"before\" | \"after\" | \"error\",\n operationType:\n | keyof ArkosServiceHookMethodConfigs<any, any>\n | \"batchUpdate\"\n | \"batchDelete\",\n params: any,\n context?: ServiceHookContext\n ): Promise<void> {\n const serviceHook = this.getServiceHook();\n if (!serviceHook) return;\n\n const skipCondition =\n context?.skip === hookType ||\n context?.skip === \"all\" ||\n (Array.isArray(context?.skip) && context.skip.includes(hookType));\n\n if (skipCondition || [\"batchDelete\", \"batchUpdate\"].includes(operationType))\n return;\n\n const hooks = serviceHookReader.getHooks(\n this.modelName,\n operationType as any\n );\n if (!hooks) return;\n\n const handlers =\n hookType === \"before\"\n ? hooks.before\n : hookType === \"after\"\n ? hooks.after\n : hooks.onError;\n\n if (handlers?.length)\n await serviceHooksManager.handleHook(handlers, params);\n }\n\n private buildHookParams(args: any[], config: ServiceOperationConfig): any {\n const context = args[args.length - 1];\n\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return { data: args[0], queryOptions: args[1], context };\n case \"findMany\":\n return { filters: args[0], queryOptions: args[1], context };\n case \"findById\":\n return { id: args[0], queryOptions: args[1], context };\n case \"findOne\":\n return { filters: args[0], queryOptions: args[1], context };\n case \"updateOne\":\n return {\n filters: args[0],\n data: args[1],\n queryOptions: args[2],\n context,\n };\n case \"updateMany\":\n return {\n filters: args[0],\n data: args[1],\n queryOptions: args[2],\n context,\n };\n case \"deleteOne\":\n return { filters: args[0], context };\n case \"deleteMany\":\n return { filters: args[0], context };\n case \"count\":\n return { filters: args[0], context };\n default:\n return { context };\n }\n }\n\n private buildTransactionHookParams(\n args: any[],\n config: ServiceOperationConfig\n ): any {\n const context = args[args.length - 1];\n\n switch (config.operationType) {\n case \"batchUpdate\":\n return { data: args[0], queryOptions: args[1], context };\n case \"batchDelete\":\n return { batchFilters: args[0], context };\n default:\n return { context };\n }\n }\n\n private async handlePasswordHashing(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.requiresPasswordHashing) {\n const dataIndex = config.operationType.includes(\"update\") ? 1 : 0;\n const data = processedArgs[dataIndex];\n\n if (Array.isArray(data)) {\n for (const i in data) {\n if (this.shouldHashPassword(data[i]))\n processedArgs[dataIndex][i] = await this.processPasswordHashing(\n data[i]\n );\n }\n } else if (this.shouldHashPassword(data)) {\n processedArgs[dataIndex] = await this.processPasswordHashing(data);\n }\n }\n\n return processedArgs;\n }\n\n private async processRelationFieldsInBody(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.relationFieldsHandling) {\n const dataIndex = config.operationType.includes(\"update\") ? 1 : 0;\n\n if (config.operationType === \"batchUpdate\") {\n const dataArray = processedArgs[0];\n if (Array.isArray(dataArray)) {\n processedArgs[0] = dataArray.map((data) =>\n handleRelationFieldsInBody(\n data as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n );\n }\n } else if (config.operationType === \"batchDelete\") {\n const batchFilters = processedArgs[0];\n if (Array.isArray(batchFilters)) {\n processedArgs[0] = batchFilters.map((filters) =>\n handleRelationFieldsInBody(\n filters as Record<string, any>,\n this.relationFields\n )\n );\n }\n } else if (config.operationType === \"createMany\") {\n const data = processedArgs[dataIndex];\n if (Array.isArray(data)) {\n processedArgs[dataIndex] = data.map((item) =>\n handleRelationFieldsInBody(\n item as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n );\n }\n } else {\n const data = processedArgs[dataIndex];\n if (data) {\n processedArgs[dataIndex] = handleRelationFieldsInBody(\n data as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n );\n }\n }\n }\n\n return processedArgs;\n }\n\n private buildPrismaArgs(args: any[], config: ServiceOperationConfig): any {\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return deepmerge({ data: args[0] }, args[1] || {});\n case \"findMany\":\n return deepmerge({ where: args[0] }, args[1] || {});\n case \"findById\":\n return deepmerge({ where: { id: args[0] } }, args[1] || {});\n case \"findOne\":\n return deepmerge({ where: args[0] }, args[1] || {});\n case \"updateOne\":\n return deepmerge({ where: args[0], data: args[1] }, args[2] || {});\n case \"updateMany\":\n const firstMerge = deepmerge({ data: args[1] }, args[2] || {});\n return deepmerge({ where: args[0] }, firstMerge);\n case \"deleteOne\":\n case \"deleteMany\":\n return { where: args[0] };\n case \"count\":\n return { where: args[0] };\n default:\n return {};\n }\n }\n\n private async executeTransactionLogic(\n args: any[],\n config: ServiceOperationConfig,\n prisma: PrismaClient\n ): Promise<any> {\n if (config.operationType === \"batchUpdate\") {\n const dataArray = args[0];\n const queryOptions = args[1];\n\n return await (prisma as any).$transaction(async (tx: any) => {\n const updatePromises = dataArray.map(async (data: any) => {\n let processedData = data;\n if (this.shouldHashPassword(data)) {\n processedData = await this.processPasswordHashing(data);\n }\n\n const finalPrismaQueryParams = handleRelationFieldsInBody(\n {\n batchedData: {\n ...processedData,\n apiAction: \"update\",\n },\n } as Record<string, any>,\n {\n singular: [\n {\n ...prismaSchemaParser.getField({\n type: pascalCase(this.modelName as string),\n })!,\n name: \"batchedData\",\n },\n ],\n list: [],\n }\n );\n\n return await tx[this.modelName as string].update(\n deepmerge(\n finalPrismaQueryParams.batchedData?.update,\n queryOptions || {}\n ) as { where: any; data: any }\n );\n });\n\n return await Promise.all(updatePromises);\n });\n }\n\n if (config.operationType === \"batchDelete\") {\n const batchFilters = args[0];\n\n return await (prisma as any).$transaction(async (tx: any) => {\n const deletePromises = batchFilters.map(async (filters: any) => {\n return await tx[this.modelName as string].delete({ where: filters });\n });\n\n return await Promise.all(deletePromises);\n });\n }\n\n throw new Error(`Unknown transaction operation: ${config.operationType}`);\n }\n\n private shouldHashPassword(data: any): boolean {\n return kebabCase(this.modelName as string) === \"user\" && data?.password;\n }\n\n private async processPasswordHashing(data: any): Promise<any> {\n if (Array.isArray(data)) {\n const processedArray: any[] = [];\n for (let i = 0; i < data.length; i++) {\n const curr = data[i];\n if (\n \"password\" in curr &&\n !authService.isPasswordHashed(curr.password!)\n ) {\n processedArray[i] = {\n ...curr,\n password: await authService.hashPassword(curr.password!),\n };\n } else {\n processedArray[i] = curr;\n }\n }\n return processedArray;\n } else {\n if (data.password && !authService.isPasswordHashed(data.password)) {\n return {\n ...data,\n password: await authService.hashPassword(data.password),\n };\n }\n }\n return data;\n }\n\n // ─── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Creates a single record in the database.\n *\n * @param data - The data for creating the record\n * @param queryOptions - Optional Prisma query options (select, include, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.createOne({\n * name: \"John Doe\",\n * email: \"john@example.com\"\n * });\n * ```\n */\n async createOne<TOptions extends CreateOptions<TModelName>>(\n data: CreateData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"createOne\",\n prismaMethod: \"create\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n /**\n * Creates multiple records in the database.\n *\n * @param data - Array of data objects or object with data array\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.createMany([\n * { name: \"John Doe\", email: \"john@example.com\" },\n * { name: \"Jane Smith\", email: \"jane@example.com\" }\n * ]);\n * ```\n */\n async createMany<TOptions extends CreateManyOptions<TModelName>>(\n data: CreateManyData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeOperation({\n operationType: \"createMany\",\n prismaMethod: \"createMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n /**\n * Counts records matching the specified filters.\n *\n * @param filters - Optional where conditions\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const total = await userService.count({ status: \"active\" });\n * ```\n */\n async count(\n filters?: CountFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<number> {\n return this.executeOperation({\n operationType: \"count\",\n prismaMethod: \"count\",\n returnsFallback: 0,\n })(filters, context);\n }\n\n /**\n * Finds multiple records matching the specified filters.\n *\n * @param filters - Optional where conditions\n * @param queryOptions - Optional Prisma query options (select, include, orderBy, skip, take, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const users = await userService.findMany(\n * { status: \"active\" },\n * { orderBy: { createdAt: \"desc\" }, take: 10 }\n * );\n * ```\n */\n async findMany<TOptions extends FindManyOptions<TModelName>>(\n filters?: FindManyFilters<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeOperation({\n operationType: \"findMany\",\n prismaMethod: \"findMany\",\n returnsFallback: [],\n })(filters, queryOptions, context);\n }\n\n /**\n * Finds a single record by its ID.\n *\n * @param id - The unique identifier of the record\n * @param queryOptions - Optional Prisma query options (select, include, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.findById(\"user-123\");\n * ```\n */\n async findById<TOptions extends FindOneOptions<TModelName>>(\n id: string | number,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions> | null> {\n return this.executeOperation({\n operationType: \"findById\",\n prismaMethod: \"findUnique\",\n returnsFallback: undefined,\n })(id, queryOptions, context);\n }\n\n /**\n * Finds the first record matching the specified filters.\n *\n * @param filters - Where conditions to filter records\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.findOne({ email: \"john@example.com\" });\n * ```\n */\n async findOne<TOptions extends FindOneOptions<TModelName>>(\n filters: FindOneFilters<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions> | null> {\n return this.executeOperation({\n operationType: \"findOne\",\n prismaMethod: \"findFirst\",\n returnsFallback: undefined,\n customPrismaLogic: async (args, prisma, _, serviceContext) => {\n const filters = args[0];\n const queryOptions = args[1];\n\n if (\n Object.keys(filters as Record<string, any>).length === 1 &&\n \"id\" in (filters as Record<string, any>) &&\n (filters as any).id !== \"me\"\n ) {\n return await (prisma as any)[serviceContext.modelName].findUnique(\n deepmerge({ where: filters }, queryOptions || {})\n );\n } else {\n return await (prisma as any)[serviceContext.modelName].findFirst(\n deepmerge({ where: filters }, queryOptions || {})\n );\n }\n },\n })(filters, queryOptions, context);\n }\n\n /**\n * Updates a single record matching the specified filters.\n *\n * @param filters - Where conditions to identify the record\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const updated = await userService.updateOne(\n * { id: \"user-123\" },\n * { name: \"John Updated\" }\n * );\n * ```\n */\n async updateOne<TOptions extends UpdateOneOptions<TModelName>>(\n filters: UpdateOneFilters<TModelName>,\n data: UpdateOneData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"updateOne\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\n\n /**\n * Updates a single record matching the specified id.\n *\n * @param id - The unique identifier of the record\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const updated = await userService.updateById(\"user-123\", { name: \"John Updated\" });\n * ```\n */\n async updateById<TOptions extends UpdateOneOptions<TModelName>>(\n id: string | number,\n data: UpdateOneData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"updateOne\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })({ id }, data, queryOptions, context);\n }\n\n /**\n * Updates multiple records matching the specified filters.\n *\n * @param filters - Where conditions to identify records\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.updateMany(\n * { status: \"pending\" },\n * { status: \"active\" }\n * );\n * ```\n */\n async updateMany<TOptions extends UpdateManyOptions<TModelName>>(\n filters: UpdateManyFilters<TModelName>,\n data: UpdateManyData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<{ count: number }> {\n return this.executeOperation({\n operationType: \"updateMany\",\n prismaMethod: \"updateMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\n\n /**\n * Deletes a single record by its ID.\n *\n * @param id - The unique identifier of the record\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.deleteById(\"user-123\");\n * ```\n */\n async deleteById(\n id: string | number,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>> {\n return this.executeOperation({\n operationType: \"deleteOne\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })({ id }, context);\n }\n\n /**\n * Deletes a single record matching the specified filters.\n *\n * @param filters - Where conditions to identify the record\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.deleteOne({ id: \"user-123\" });\n * ```\n */\n async deleteOne(\n filters: DeleteOneFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>> {\n return this.executeOperation({\n operationType: \"deleteOne\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n /**\n * Deletes multiple records matching the specified filters.\n *\n * @param filters - Where conditions to identify records\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.deleteMany({ status: \"inactive\" });\n * ```\n */\n async deleteMany(\n filters: DeleteManyFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<{ count: number }> {\n return this.executeOperation({\n operationType: \"deleteMany\",\n prismaMethod: \"deleteMany\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n /**\n * Performs multiple update operations in a single transaction.\n *\n * @param dataArray - Array of update objects each containing filter criteria and data\n * @param queryOptions - Optional Prisma query options applied to all updates\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const results = await userService.batchUpdate([\n * { id: \"user-1\", status: \"active\" },\n * { id: \"user-2\", status: \"inactive\" }\n * ]);\n * ```\n */\n async batchUpdate<TOptions extends UpdateOneOptions<TModelName>>(\n dataArray: UpdateOneData<TModelName>[],\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeTransactionOperation({\n operationType: \"batchUpdate\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(dataArray, queryOptions, context);\n }\n\n /**\n * Performs multiple delete operations in a single transaction.\n *\n * @param batchFilters - Array of where conditions each identifying a record to delete\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.batchDelete([\n * { id: \"user-1\" },\n * { id: \"user-2\" }\n * ]);\n * ```\n */\n async batchDelete(\n batchFilters: Array<DeleteOneFilters<TModelName>>,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>[]> {\n return this.executeTransactionOperation({\n operationType: \"batchDelete\",\n prismaMethod: \"delete\",\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(batchFilters, context);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n camelCase,\n kebabCase,\n pascalCase,\n} from \"../../utils/helpers/change-case.helpers\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n handleRelationFieldsInBody,\n ModelGroupRelationFields,\n} from \"./utils/helpers/base.service.helpers\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport authService from \"../auth/auth.service\";\nimport { PrismaClient } from \"../../generated\";\nimport {\n CountFilters,\n CreateData,\n CreateManyData,\n CreateManyOptions,\n CreateOptions,\n Delegate,\n DeleteManyFilters,\n DeleteOneFilters,\n FindManyFilters,\n FindManyOptions,\n FindOneFilters,\n FindOneOptions,\n GetPayload,\n Models,\n UpdateManyData,\n UpdateManyFilters,\n UpdateManyOptions,\n UpdateOneData,\n UpdateOneFilters,\n UpdateOneOptions,\n} from \"./types/base.service.types\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\nimport { ServiceHookContext } from \"./types/base.service.types\";\n\ninterface ServiceOperationConfig {\n operationType:\n | keyof ArkosPrismaService\n | \"batchDelete\"\n | \"batchUpdate\";\n prismaMethod: string;\n requiresPasswordHashing?: boolean;\n relationFieldsHandling?: string[];\n returnsFallback?: any;\n customPrismaLogic?: (\n args: any[],\n prisma: PrismaClient,\n config: ServiceOperationConfig,\n context: ArkosPrismaService<any>\n ) => Promise<any>;\n}\n\n/**\n * Base service class for handling CRUD operations on a specific model.\n * This class provides standard implementation of data operations that can be extended\n * by model-specific service classes.\n *\n * @class ArkosPrismaService\n *\n * @example\n * ```ts\n * import { ArkosPrismaService } from \"arkos/services\";\n *\n * export class UserService extends ArkosPrismaService<\"user\"> {}\n *\n * const userService = new UserService(\"user\");\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/reference/base-service}\n * @see {@link https://www.arkosjs.com/docs/guide/accessing-request-context-in-services}\n */\nexport class ArkosPrismaService<TModelName extends keyof Models = keyof Models> {\n modelName: TModelName;\n relationFields: ModelGroupRelationFields;\n private prismaInstace?: PrismaClient;\n\n constructor(modelName: TModelName) {\n this.modelName = camelCase(modelName as string) as TModelName;\n const modelFields = prismaSchemaParser?.getModelRelations?.(\n modelName as string\n );\n\n this.relationFields = {\n singular:\n modelFields?.filter((field) => field.isRelation && !field.isArray) ||\n [],\n list:\n modelFields?.filter((field) => field.isRelation && field.isArray) || [],\n };\n }\n\n get prisma() {\n if (!this.prismaInstace) this.prismaInstace = getPrismaInstance();\n return this.prismaInstace!;\n }\n\n private executeOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n let argsWithRelationFieldsHandled =\n await this.processRelationFieldsInBody(args, config);\n let prismaFinalArgs = await this.handlePasswordHashing(\n argsWithRelationFieldsHandled,\n config\n );\n\n\n\n\n const prisma = getPrismaInstance();\n let result: any;\n\n if (config.customPrismaLogic) {\n result = await config.customPrismaLogic(\n argsWithRelationFieldsHandled,\n prisma,\n config,\n this\n );\n } else {\n const prismaArgs = this.buildPrismaArgs(prismaFinalArgs, config);\n result = await (\n prisma[this.modelName as string] as Delegate<TModelName>\n )[config.prismaMethod](prismaArgs);\n }\n\n return result;\n };\n };\n\n private executeTransactionOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n\n let argsWithRelationFieldsHandled =\n await this.processRelationFieldsInBody(args, config);\n let prismaFinalArgs = await this.handlePasswordHashing(\n argsWithRelationFieldsHandled,\n config\n );\n\n\n const prisma = getPrismaInstance();\n const results = await this.executeTransactionLogic(\n prismaFinalArgs,\n config,\n prisma\n );\n\n return results;\n }\n };\n\n\n private async handlePasswordHashing(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.requiresPasswordHashing) {\n const dataIndex = config.operationType.includes(\"update\") ? 1 : 0;\n const data = processedArgs[dataIndex];\n\n if (Array.isArray(data)) {\n for (const i in data) {\n if (this.shouldHashPassword(data[i]))\n processedArgs[dataIndex][i] = await this.processPasswordHashing(\n data[i]\n );\n }\n } else if (this.shouldHashPassword(data)) {\n processedArgs[dataIndex] = await this.processPasswordHashing(data);\n }\n }\n\n return processedArgs;\n }\n\n private async processRelationFieldsInBody(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.relationFieldsHandling) {\n const dataIndex = config.operationType.includes(\"update\") ? 1 : 0;\n\n if (config.operationType === \"batchUpdate\") {\n const dataArray = processedArgs[0];\n if (Array.isArray(dataArray)) {\n processedArgs[0] = dataArray.map((data) =>\n handleRelationFieldsInBody(\n data as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n );\n }\n } else if (config.operationType === \"batchDelete\") {\n const batchFilters = processedArgs[0];\n if (Array.isArray(batchFilters)) {\n processedArgs[0] = batchFilters.map((filters) =>\n handleRelationFieldsInBody(\n filters as Record<string, any>,\n this.relationFields\n )\n );\n }\n } else if (config.operationType === \"createMany\") {\n const data = processedArgs[dataIndex];\n if (Array.isArray(data)) {\n processedArgs[dataIndex] = data.map((item) =>\n handleRelationFieldsInBody(\n item as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n );\n }\n } else {\n const data = processedArgs[dataIndex];\n if (data) {\n processedArgs[dataIndex] = handleRelationFieldsInBody(\n data as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n );\n }\n }\n }\n\n return processedArgs;\n }\n\n private buildPrismaArgs(args: any[], config: ServiceOperationConfig): any {\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return deepmerge({ data: args[0] }, args[1] || {});\n case \"findMany\":\n return deepmerge({ where: args[0] }, args[1] || {});\n case \"findById\":\n return deepmerge({ where: { id: args[0] } }, args[1] || {});\n case \"findOne\":\n return deepmerge({ where: args[0] }, args[1] || {});\n case \"updateOne\":\n return deepmerge({ where: args[0], data: args[1] }, args[2] || {});\n case \"updateMany\":\n const firstMerge = deepmerge({ data: args[1] }, args[2] || {});\n return deepmerge({ where: args[0] }, firstMerge);\n case \"deleteOne\":\n case \"deleteMany\":\n return { where: args[0] };\n case \"count\":\n return { where: args[0] };\n default:\n return {};\n }\n }\n\n private async executeTransactionLogic(\n args: any[],\n config: ServiceOperationConfig,\n prisma: PrismaClient\n ): Promise<any> {\n if (config.operationType === \"batchUpdate\") {\n const dataArray = args[0];\n const queryOptions = args[1];\n\n return await (prisma as any).$transaction(async (tx: any) => {\n const updatePromises = dataArray.map(async (data: any) => {\n let processedData = data;\n if (this.shouldHashPassword(data)) {\n processedData = await this.processPasswordHashing(data);\n }\n\n const finalPrismaQueryParams = handleRelationFieldsInBody(\n {\n batchedData: {\n ...processedData,\n apiAction: \"update\",\n },\n } as Record<string, any>,\n {\n singular: [\n {\n ...prismaSchemaParser.getField({\n type: pascalCase(this.modelName as string),\n })!,\n name: \"batchedData\",\n },\n ],\n list: [],\n }\n );\n\n return await tx[this.modelName as string].update(\n deepmerge(\n finalPrismaQueryParams.batchedData?.update,\n queryOptions || {}\n ) as { where: any; data: any }\n );\n });\n\n return await Promise.all(updatePromises);\n });\n }\n\n if (config.operationType === \"batchDelete\") {\n const batchFilters = args[0];\n\n return await (prisma as any).$transaction(async (tx: any) => {\n const deletePromises = batchFilters.map(async (filters: any) => {\n return await tx[this.modelName as string].delete({ where: filters });\n });\n\n return await Promise.all(deletePromises);\n });\n }\n\n throw new Error(`Unknown transaction operation: ${config.operationType}`);\n }\n\n private shouldHashPassword(data: any): boolean {\n return kebabCase(this.modelName as string) === \"user\" && data?.password;\n }\n\n private async processPasswordHashing(data: any): Promise<any> {\n if (Array.isArray(data)) {\n const processedArray: any[] = [];\n for (let i = 0; i < data.length; i++) {\n const curr = data[i];\n if (\n \"password\" in curr &&\n !authService.isPasswordHashed(curr.password!)\n ) {\n processedArray[i] = {\n ...curr,\n password: await authService.hashPassword(curr.password!),\n };\n } else {\n processedArray[i] = curr;\n }\n }\n return processedArray;\n } else {\n if (data.password && !authService.isPasswordHashed(data.password)) {\n return {\n ...data,\n password: await authService.hashPassword(data.password),\n };\n }\n }\n return data;\n }\n\n // ─── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Creates a single record in the database.\n *\n * @param data - The data for creating the record\n * @param queryOptions - Optional Prisma query options (select, include, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.createOne({\n * name: \"John Doe\",\n * email: \"john@example.com\"\n * });\n * ```\n */\n async createOne<TOptions extends CreateOptions<TModelName>>(\n data: CreateData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"createOne\",\n prismaMethod: \"create\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n /**\n * Creates multiple records in the database.\n *\n * @param data - Array of data objects or object with data array\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.createMany([\n * { name: \"John Doe\", email: \"john@example.com\" },\n * { name: \"Jane Smith\", email: \"jane@example.com\" }\n * ]);\n * ```\n */\n async createMany<TOptions extends CreateManyOptions<TModelName>>(\n data: CreateManyData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeOperation({\n operationType: \"createMany\",\n prismaMethod: \"createMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n /**\n * Counts records matching the specified filters.\n *\n * @param filters - Optional where conditions\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const total = await userService.count({ status: \"active\" });\n * ```\n */\n async count(\n filters?: CountFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<number> {\n return this.executeOperation({\n operationType: \"count\",\n prismaMethod: \"count\",\n returnsFallback: 0,\n })(filters, context);\n }\n\n /**\n * Finds multiple records matching the specified filters.\n *\n * @param filters - Optional where conditions\n * @param queryOptions - Optional Prisma query options (select, include, orderBy, skip, take, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const users = await userService.findMany(\n * { status: \"active\" },\n * { orderBy: { createdAt: \"desc\" }, take: 10 }\n * );\n * ```\n */\n async findMany<TOptions extends FindManyOptions<TModelName>>(\n filters?: FindManyFilters<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeOperation({\n operationType: \"findMany\",\n prismaMethod: \"findMany\",\n returnsFallback: [],\n })(filters, queryOptions, context);\n }\n\n /**\n * Finds a single record by its ID.\n *\n * @param id - The unique identifier of the record\n * @param queryOptions - Optional Prisma query options (select, include, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.findById(\"user-123\");\n * ```\n */\n async findById<TOptions extends FindOneOptions<TModelName>>(\n id: string | number,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions> | null> {\n return this.executeOperation({\n operationType: \"findById\",\n prismaMethod: \"findUnique\",\n returnsFallback: undefined,\n })(id, queryOptions, context);\n }\n\n /**\n * Finds the first record matching the specified filters.\n *\n * @param filters - Where conditions to filter records\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.findOne({ email: \"john@example.com\" });\n * ```\n */\n async findOne<TOptions extends FindOneOptions<TModelName>>(\n filters: FindOneFilters<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions> | null> {\n return this.executeOperation({\n operationType: \"findOne\",\n prismaMethod: \"findFirst\",\n returnsFallback: undefined,\n customPrismaLogic: async (args, prisma, _, serviceContext) => {\n const filters = args[0];\n const queryOptions = args[1];\n\n if (\n Object.keys(filters as Record<string, any>).length === 1 &&\n \"id\" in (filters as Record<string, any>) &&\n (filters as any).id !== \"me\"\n ) {\n return await (prisma as any)[serviceContext.modelName].findUnique(\n deepmerge({ where: filters }, queryOptions || {})\n );\n } else {\n return await (prisma as any)[serviceContext.modelName].findFirst(\n deepmerge({ where: filters }, queryOptions || {})\n );\n }\n },\n })(filters, queryOptions, context);\n }\n\n /**\n * Updates a single record matching the specified filters.\n *\n * @param filters - Where conditions to identify the record\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const updated = await userService.updateOne(\n * { id: \"user-123\" },\n * { name: \"John Updated\" }\n * );\n * ```\n */\n async updateOne<TOptions extends UpdateOneOptions<TModelName>>(\n filters: UpdateOneFilters<TModelName>,\n data: UpdateOneData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"updateOne\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\n\n /**\n * Updates a single record matching the specified id.\n *\n * @param id - The unique identifier of the record\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const updated = await userService.updateById(\"user-123\", { name: \"John Updated\" });\n * ```\n */\n async updateById<TOptions extends UpdateOneOptions<TModelName>>(\n id: string | number,\n data: UpdateOneData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"updateOne\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })({ id }, data, queryOptions, context);\n }\n\n /**\n * Updates multiple records matching the specified filters.\n *\n * @param filters - Where conditions to identify records\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.updateMany(\n * { status: \"pending\" },\n * { status: \"active\" }\n * );\n * ```\n */\n async updateMany<TOptions extends UpdateManyOptions<TModelName>>(\n filters: UpdateManyFilters<TModelName>,\n data: UpdateManyData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<{ count: number }> {\n return this.executeOperation({\n operationType: \"updateMany\",\n prismaMethod: \"updateMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\n\n /**\n * Deletes a single record by its ID.\n *\n * @param id - The unique identifier of the record\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.deleteById(\"user-123\");\n * ```\n */\n async deleteById(\n id: string | number,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>> {\n return this.executeOperation({\n operationType: \"deleteOne\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })({ id }, context);\n }\n\n /**\n * Deletes a single record matching the specified filters.\n *\n * @param filters - Where conditions to identify the record\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.deleteOne({ id: \"user-123\" });\n * ```\n */\n async deleteOne(\n filters: DeleteOneFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>> {\n return this.executeOperation({\n operationType: \"deleteOne\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n /**\n * Deletes multiple records matching the specified filters.\n *\n * @param filters - Where conditions to identify records\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.deleteMany({ status: \"inactive\" });\n * ```\n */\n async deleteMany(\n filters: DeleteManyFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<{ count: number }> {\n return this.executeOperation({\n operationType: \"deleteMany\",\n prismaMethod: \"deleteMany\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n /**\n * Performs multiple update operations in a single transaction.\n *\n * @param dataArray - Array of update objects each containing filter criteria and data\n * @param queryOptions - Optional Prisma query options applied to all updates\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const results = await userService.batchUpdate([\n * { id: \"user-1\", status: \"active\" },\n * { id: \"user-2\", status: \"inactive\" }\n * ]);\n * ```\n */\n async batchUpdate<TOptions extends UpdateOneOptions<TModelName>>(\n dataArray: UpdateOneData<TModelName>[],\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeTransactionOperation({\n operationType: \"batchUpdate\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(dataArray, queryOptions, context);\n }\n\n /**\n * Performs multiple delete operations in a single transaction.\n *\n * @param batchFilters - Array of where conditions each identifying a record to delete\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.batchDelete([\n * { id: \"user-1\" },\n * { id: \"user-2\" }\n * ]);\n * ```\n */\n async batchDelete(\n batchFilters: Array<DeleteOneFilters<TModelName>>,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>[]> {\n return this.executeTransactionOperation({\n operationType: \"batchDelete\",\n prismaMethod: \"delete\",\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(batchFilters, context);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.service.types.js","sourceRoot":"","sources":["../../../../../src/modules/base/types/base.service.types.ts"],"names":[],"mappings":"","sourcesContent":["import {\n ExtractPrismaData,\n ExtractPrismaFilters,\n ExtractPrismaQueryOptions,\n PrismaModels,\n} from \"../../../generated\";\n\nexport type Models = PrismaModels<any>;\n\nexport type Delegate<TModelName extends keyof Models> =\n Models[TModelName][\"Delegate\"];\n\nexport type CreateData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"CreateArgs\"]\n>;\nexport type CreateOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"CreateArgs\"], \"data\">;\nexport type CreateResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"];\n\nexport type CreateManyData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"CreateManyArgs\"]\n>;\nexport type CreateManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"CreateManyArgs\"], \"data\">;\nexport type CreateManyResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"][];\n\nexport type CountFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"CountArgs\"]>;\n\nexport type FindManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"FindManyArgs\"]>;\nexport type FindManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"FindManyArgs\"], \"where\">;\nexport type FindManyResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"][];\n\nexport type FindOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"FindFirstArgs\"]>;\nexport type FindOneOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"FindFirstArgs\"], \"where\">;\nexport type FindOneResult<TModelName extends keyof Models> =\n | Models[TModelName][\"GetPayload\"]\n | null;\n\nexport type UpdateOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"UpdateArgs\"]>;\nexport type UpdateOneData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"UpdateArgs\"]\n>;\nexport type UpdateOneOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"UpdateArgs\"], \"where\" | \"data\">;\nexport type UpdateOneResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"];\n\nexport type UpdateManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"UpdateManyArgs\"]>;\nexport type UpdateManyData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"UpdateManyArgs\"]\n>;\nexport type UpdateManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<\n Models[TModelName][\"UpdateManyArgs\"],\n \"where\" | \"data\"\n >;\n\nexport type DeleteOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"DeleteArgs\"]>;\n\nexport type DeleteManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"DeleteManyArgs\"]>;\n\nexport type GetPayload<\n TModelName extends keyof Models,\n TOptions extends Record<string, any>,\n> = PrismaModels<TOptions>[TModelName][\"GetPayload\"];\n"]}
|
|
1
|
+
{"version":3,"file":"base.service.types.js","sourceRoot":"","sources":["../../../../../src/modules/base/types/base.service.types.ts"],"names":[],"mappings":"","sourcesContent":["import {\n ExtractPrismaData,\n ExtractPrismaFilters,\n ExtractPrismaQueryOptions,\n PrismaModels,\n} from \"../../../generated\";\nimport { User } from \"../../../types\";\n\nexport type Models = PrismaModels<any>;\n\n\nexport interface ServiceHookContext {\n /**\n * The authenticated user making the request.\n */\n user?: User;\n /**\n * The access token from the request for authorization.\n */\n accessToken?: string;\n}\n\nexport type Delegate<TModelName extends keyof Models> =\n Models[TModelName][\"Delegate\"];\n\nexport type CreateData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"CreateArgs\"]\n>;\nexport type CreateOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"CreateArgs\"], \"data\">;\nexport type CreateResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"];\n\nexport type CreateManyData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"CreateManyArgs\"]\n>;\nexport type CreateManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"CreateManyArgs\"], \"data\">;\nexport type CreateManyResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"][];\n\nexport type CountFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"CountArgs\"]>;\n\nexport type FindManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"FindManyArgs\"]>;\nexport type FindManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"FindManyArgs\"], \"where\">;\nexport type FindManyResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"][];\n\nexport type FindOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"FindFirstArgs\"]>;\nexport type FindOneOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"FindFirstArgs\"], \"where\">;\nexport type FindOneResult<TModelName extends keyof Models> =\n | Models[TModelName][\"GetPayload\"]\n | null;\n\nexport type UpdateOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"UpdateArgs\"]>;\nexport type UpdateOneData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"UpdateArgs\"]\n>;\nexport type UpdateOneOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"UpdateArgs\"], \"where\" | \"data\">;\nexport type UpdateOneResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"];\n\nexport type UpdateManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"UpdateManyArgs\"]>;\nexport type UpdateManyData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"UpdateManyArgs\"]\n>;\nexport type UpdateManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<\n Models[TModelName][\"UpdateManyArgs\"],\n \"where\" | \"data\"\n >;\n\nexport type DeleteOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"DeleteArgs\"]>;\n\nexport type DeleteManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"DeleteManyArgs\"]>;\n\nexport type GetPayload<\n TModelName extends keyof Models,\n TOptions extends Record<string, any>,\n> = PrismaModels<TOptions>[TModelName][\"GetPayload\"];\n"]}
|
|
@@ -59,6 +59,12 @@ export class ErrorPrettifier {
|
|
|
59
59
|
switch (expected) {
|
|
60
60
|
case "string":
|
|
61
61
|
return "IsStringConstraint";
|
|
62
|
+
case "email":
|
|
63
|
+
return "IsEmailConstraint";
|
|
64
|
+
case "uuid":
|
|
65
|
+
return "IsUuidConstraint";
|
|
66
|
+
case "url":
|
|
67
|
+
return "IsUrlConstraint";
|
|
62
68
|
case "number":
|
|
63
69
|
return "IsNumberConstraint";
|
|
64
70
|
case "boolean":
|
|
@@ -70,57 +76,47 @@ export class ErrorPrettifier {
|
|
|
70
76
|
case "date":
|
|
71
77
|
return "IsDateConstraint";
|
|
72
78
|
default:
|
|
79
|
+
if (typeof expected === "object" && "includes" in expected)
|
|
80
|
+
return "ContainsConstraint";
|
|
81
|
+
if (typeof expected === "object" && "startsWith" in expected)
|
|
82
|
+
return "StartsWithConstraint";
|
|
83
|
+
if (typeof expected === "object" && "endsWith" in expected)
|
|
84
|
+
return "EndsWithConstraint";
|
|
73
85
|
return "InvalidTypeConstraint";
|
|
74
86
|
}
|
|
75
87
|
case "too_small":
|
|
76
|
-
if (issue.
|
|
88
|
+
if (issue.origin === "string") {
|
|
77
89
|
return "MinLengthConstraint";
|
|
78
90
|
}
|
|
79
|
-
else if (issue.
|
|
91
|
+
else if (issue.origin === "number") {
|
|
80
92
|
return "MinConstraint";
|
|
81
93
|
}
|
|
82
|
-
else if (issue.
|
|
94
|
+
else if (issue.origin === "array") {
|
|
83
95
|
return "ArrayMinSizeConstraint";
|
|
84
96
|
}
|
|
85
97
|
return "TooSmallConstraint";
|
|
86
98
|
case "too_big":
|
|
87
|
-
if (issue.
|
|
99
|
+
if (issue.origin === "string") {
|
|
88
100
|
return "MaxLengthConstraint";
|
|
89
101
|
}
|
|
90
|
-
else if (issue.
|
|
102
|
+
else if (issue.origin === "number") {
|
|
91
103
|
return "MaxConstraint";
|
|
92
104
|
}
|
|
93
|
-
else if (issue.
|
|
105
|
+
else if (issue.origin === "array") {
|
|
94
106
|
return "ArrayMaxSizeConstraint";
|
|
95
107
|
}
|
|
96
108
|
return "TooBigConstraint";
|
|
97
|
-
case "
|
|
98
|
-
if (
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
return "IsUuidConstraint";
|
|
104
|
-
if (validation === "url")
|
|
105
|
-
return "IsUrlConstraint";
|
|
106
|
-
if (typeof validation === "object" && "includes" in validation)
|
|
107
|
-
return "ContainsConstraint";
|
|
108
|
-
if (typeof validation === "object" && "startsWith" in validation)
|
|
109
|
-
return "StartsWithConstraint";
|
|
110
|
-
if (typeof validation === "object" && "endsWith" in validation)
|
|
111
|
-
return "EndsWithConstraint";
|
|
109
|
+
case "invalid_value":
|
|
110
|
+
if (issue.values.length > 1) {
|
|
111
|
+
return "IsEnumConstraint";
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
return "EqualsConstraint";
|
|
112
115
|
}
|
|
113
|
-
return "InvalidStringConstraint";
|
|
114
|
-
case "invalid_enum_value":
|
|
115
|
-
return "IsEnumConstraint";
|
|
116
|
-
case "invalid_literal":
|
|
117
|
-
return "EqualsConstraint";
|
|
118
116
|
case "unrecognized_keys":
|
|
119
117
|
return "UnrecognizedKeysConstraint";
|
|
120
118
|
case "invalid_union":
|
|
121
119
|
return "InvalidUnionConstraint";
|
|
122
|
-
case "invalid_date":
|
|
123
|
-
return "IsDateConstraint";
|
|
124
120
|
case "custom":
|
|
125
121
|
return "CustomConstraint";
|
|
126
122
|
default:
|
|
@@ -135,7 +131,7 @@ export class ErrorPrettifier {
|
|
|
135
131
|
if (typeof segment === "number") {
|
|
136
132
|
return `[${segment}]`;
|
|
137
133
|
}
|
|
138
|
-
return index === 0 ? segment : `.${segment}`;
|
|
134
|
+
return index === 0 ? segment : `.${String(segment)}`;
|
|
139
135
|
})
|
|
140
136
|
.join("")
|
|
141
137
|
.replace(/\.\[/g, "[");
|
|
@@ -151,7 +147,7 @@ export class ErrorPrettifier {
|
|
|
151
147
|
}
|
|
152
148
|
return result;
|
|
153
149
|
}
|
|
154
|
-
injectFieldPathInZodMessage(message, fieldPath,
|
|
150
|
+
injectFieldPathInZodMessage(message, fieldPath, _) {
|
|
155
151
|
if (!fieldPath) {
|
|
156
152
|
return message;
|
|
157
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-prettifier.js","sourceRoot":"","sources":["../../../../../src/modules/base/utils/error-prettifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { ValidationError } from \"class-validator\";\nimport { ZodError, ZodIssue } from \"zod\";\nimport { pascalCase } from \"../../../utils/helpers/change-case.helpers\";\n\n/**\n * Prettified error result with consistent format\n */\nexport interface PrettifiedError {\n /** Human-readable error message */\n message: string;\n /** Field name + constraint type code (e.g., 'NameIsStringConstraint') */\n code: string;\n}\n\n/**\n * Supported validation library types\n */\nexport type ValidationLibrary = \"class-validator\" | \"zod\";\n\n/**\n * ErrorPrettifier class for normalizing validation errors from class-validator and Zod\n * into a consistent format with field name + constraint code pattern.\n *\n * @example\n * ```typescript\n * const prettifier = new ErrorPrettifier();\n *\n * // Class-validator example\n * const classValidatorErrors = await validate(userDto);\n * const prettified = prettifier.prettify('class-validator', classValidatorErrors);\n * // [{ message: 'name must be a string', code: 'NameIsStringConstraint' }]\n *\n * // Zod example\n * try {\n * schema.parse(data);\n * } catch (error) {\n * const prettified = prettifier.prettify('zod', error);\n * // [{ message: 'name must be a string', code: 'NameIsStringConstraint' }]\n * }\n *\n * // Nested errors\n * // [{ message: 'user.address.street must be a string', code: 'UserAddressStreetIsStringConstraint' }]\n * ```\n */\nexport class ErrorPrettifier {\n /**\n * Prettifies validation errors from class-validator or Zod into a consistent format.\n *\n * @param library - The validation library type ('class-validator' or 'zod')\n * @param error - The validation error(s) from the library\n * @returns Array of prettified errors with consistent message and code format\n */\n prettify(\n library: \"class-validator\",\n error: ValidationError[]\n ): PrettifiedError[];\n prettify(library: \"zod\", error: ZodError): PrettifiedError[];\n prettify(\n library: ValidationLibrary,\n error: ValidationError[] | ZodError\n ): PrettifiedError[] {\n if (library === \"class-validator\") {\n return this.prettifyClassValidator(error as ValidationError[]);\n } else {\n return this.prettifyZod(error as ZodError);\n }\n }\n\n /**\n * Converts a field path to PascalCase for code generation.\n *\n * @example\n * ```typescript\n * toPascalCase('user.address.street') // 'UserAddressStreet'\n * toPascalCase('email') // 'Email'\n * ```\n *\n * @param path - Dot-separated field path\n * @returns PascalCase version of the path\n */\n private toPascalCase(path: string): string {\n return path\n .split(\".\")\n .map((part) => pascalCase(part))\n .join(\"\");\n }\n\n /**\n * Replaces the field name in the validation message with the full path.\n * Handles array indices like tags[0] and nested paths like user.address.street.\n *\n * @example\n * ```typescript\n * replaceFieldInMessage('id must be a UUID', 'id', 'user.id')\n * // Returns: ''user.id' must be a UUID'\n *\n * replaceFieldInMessage('name must be a string', 'name', 'tags[0].name')\n * // Returns: ''tags[0].name' must be a string'\n * ```\n *\n * @param message - Original validation message\n * @param fieldName - Original field name\n * @param fullPath - Full path including parent properties\n * @returns Message with field name replaced by full path\n */\n private replaceFieldInMessage(\n message: string,\n fieldName: string,\n fullPath: string\n ): string {\n // If it's a top-level field (no dots or brackets), return original message\n if (!fullPath.includes(\".\") && !fullPath.includes(\"[\")) {\n return message;\n }\n\n // Replace the field name at the start of the message with the full path\n // Handle cases like \"id must be a UUID\" -> \"'user.id' must be a UUID\"\n const regex = new RegExp(`^${fieldName}\\\\b`, \"i\");\n if (regex.test(message)) {\n return message.replace(regex, `'${fullPath}'`);\n }\n\n // If field name is not at the start, try to find it and replace\n // This handles cases like \"must be a valid id\" or other formats\n const wordBoundaryRegex = new RegExp(`\\\\b${fieldName}\\\\b`, \"gi\");\n if (wordBoundaryRegex.test(message)) {\n return message.replace(wordBoundaryRegex, `'${fullPath}'`);\n }\n\n // If we can't find the field name in the message, prepend the path\n return `'${fullPath}' ${message}`;\n }\n\n /**\n * Prettifies class-validator ValidationError array.\n * Handles nested validation errors recursively.\n *\n * @param errors - Array of ValidationError from class-validator\n * @param parentPath - Parent path for nested errors (used internally)\n * @returns Array of prettified errors\n */\n private prettifyClassValidator(\n errors: ValidationError[],\n parentPath: string = \"\"\n ): PrettifiedError[] {\n const result: PrettifiedError[] = [];\n\n for (const error of errors) {\n const currentPath = parentPath\n ? `${parentPath}.${error.property}`\n : error.property;\n\n if (error.children && error.children.length > 0) {\n result.push(\n ...this.prettifyClassValidator(error.children, currentPath)\n );\n continue;\n }\n\n if (error.constraints) {\n const fieldPascal = this.toPascalCase(currentPath);\n\n for (const [constraintKey, originalMessage] of Object.entries(\n error.constraints\n )) {\n const constraintName =\n constraintKey.charAt(0).toUpperCase() + constraintKey.slice(1);\n\n const message = this.replaceFieldInMessage(\n originalMessage,\n error.property,\n currentPath\n );\n\n result.push({\n message: message,\n code: `${fieldPascal}${constraintName}Constraint`,\n });\n }\n }\n }\n\n return result;\n }\n\n /**\n * Maps Zod error codes and validation info to class-validator style constraint names.\n *\n * @param issue - Zod validation issue\n * @returns Class-validator style constraint name\n */\n private mapZodToConstraintName(issue: ZodIssue): string {\n switch (issue.code) {\n case \"invalid_type\":\n const expected = issue.expected;\n switch (expected) {\n case \"string\":\n return \"IsStringConstraint\";\n case \"number\":\n return \"IsNumberConstraint\";\n case \"boolean\":\n return \"IsBooleanConstraint\";\n case \"array\":\n return \"IsArrayConstraint\";\n case \"object\":\n return \"IsObjectConstraint\";\n case \"date\":\n return \"IsDateConstraint\";\n default:\n return \"InvalidTypeConstraint\";\n }\n\n case \"too_small\":\n if (issue.type === \"string\") {\n return \"MinLengthConstraint\";\n } else if (issue.type === \"number\") {\n return \"MinConstraint\";\n } else if (issue.type === \"array\") {\n return \"ArrayMinSizeConstraint\";\n }\n return \"TooSmallConstraint\";\n\n case \"too_big\":\n if (issue.type === \"string\") {\n return \"MaxLengthConstraint\";\n } else if (issue.type === \"number\") {\n return \"MaxConstraint\";\n } else if (issue.type === \"array\") {\n return \"ArrayMaxSizeConstraint\";\n }\n return \"TooBigConstraint\";\n\n case \"invalid_string\":\n if (\"validation\" in issue) {\n const validation = issue.validation;\n if (validation === \"email\") return \"IsEmailConstraint\";\n if (validation === \"uuid\") return \"IsUuidConstraint\";\n if (validation === \"url\") return \"IsUrlConstraint\";\n if (typeof validation === \"object\" && \"includes\" in validation)\n return \"ContainsConstraint\";\n if (typeof validation === \"object\" && \"startsWith\" in validation)\n return \"StartsWithConstraint\";\n if (typeof validation === \"object\" && \"endsWith\" in validation)\n return \"EndsWithConstraint\";\n }\n return \"InvalidStringConstraint\";\n\n case \"invalid_enum_value\":\n return \"IsEnumConstraint\";\n\n case \"invalid_literal\":\n return \"EqualsConstraint\";\n\n case \"unrecognized_keys\":\n return \"UnrecognizedKeysConstraint\";\n\n case \"invalid_union\":\n return \"InvalidUnionConstraint\";\n\n case \"invalid_date\":\n return \"IsDateConstraint\";\n\n case \"custom\":\n return \"CustomConstraint\";\n\n default:\n return \"ValidationConstraint\";\n }\n }\n\n /**\n * Prettifies Zod ZodError.\n * Handles nested paths and multiple issues per field.\n *\n * @param error - ZodError from Zod validation\n * @returns Array of prettified errors\n */\n private prettifyZod(error: ZodError): PrettifiedError[] {\n const result: PrettifiedError[] = [];\n\n for (const issue of error.issues) {\n // Build the field path from the issue path\n const fieldPath = issue.path\n .map((segment, index) => {\n // Handle array indices: convert to bracket notation\n if (typeof segment === \"number\") {\n return `[${segment}]`;\n }\n // First segment doesn't need a dot prefix\n return index === 0 ? segment : `.${segment}`;\n })\n .join(\"\")\n .replace(/\\.\\[/g, \"[\"); // Clean up .[ to just [\n\n const fieldPascal = fieldPath\n ? this.toPascalCase(fieldPath.replace(/\\[\\d+\\]/g, \"\"))\n : \"\";\n\n // Map Zod error code to constraint name\n const constraintName = this.mapZodToConstraintName(issue);\n\n // Inject the field path into the message naturally\n const message = this.injectFieldPathInZodMessage(\n issue.message,\n fieldPath,\n issue\n );\n\n result.push({\n message: message,\n code: `${fieldPascal}${constraintName}`,\n });\n }\n\n return result;\n }\n\n /**\n * Injects the field path into Zod error messages naturally.\n *\n * @example\n * ```typescript\n * injectFieldPathInZodMessage('String must contain at least 100 character(s)', 'user.id', issue)\n * // Returns: ''user.id' must contain at least 100 character(s)'\n *\n * injectFieldPathInZodMessage('Required', 'email', issue)\n * // Returns: ''email' is required'\n * ```\n *\n * @param message - Original Zod error message\n * @param fieldPath - Full field path (e.g., 'user.id', 'tags[0].name')\n * @param issue - Zod issue for context\n * @returns Message with field path injected naturally\n */\n private injectFieldPathInZodMessage(\n message: string,\n fieldPath: string,\n issue: ZodIssue\n ): string {\n if (!fieldPath) {\n return message;\n }\n\n // \"Required\" -> \"'fieldPath' is required\"\n if (message === \"Required\") {\n return `'${fieldPath}' is required`;\n }\n\n // \"String must...\" -> \"'fieldPath' must...\"\n if (message.startsWith(\"String must\")) {\n return message.replace(/^String must/, `'${fieldPath}' must`);\n }\n\n // \"Number must...\" -> \"'fieldPath' must...\"\n if (message.startsWith(\"Number must\")) {\n return message.replace(/^Number must/, `'${fieldPath}' must`);\n }\n\n // \"Array must...\" -> \"'fieldPath' must...\"\n if (message.startsWith(\"Array must\")) {\n return message.replace(/^Array must/, `'${fieldPath}' must`);\n }\n\n // \"Expected string, received number\" -> \"'fieldPath': Expected string, received number\"\n if (message.startsWith(\"Expected\")) {\n return `'${fieldPath}' must be valid: ${message}`;\n }\n\n // \"Invalid email\" -> \"'fieldPath' must be a valid email\"\n if (message.startsWith(\"Invalid \")) {\n const type = message.replace(\"Invalid \", \"\");\n return `'${fieldPath}' must be a valid ${type}`;\n }\n\n // For any other message, return the message\n if (!message.toLowerCase().includes(fieldPath))\n return `'${fieldPath}' ${message}`;\n return message;\n }\n}\n\nconst errorPrettifier = new ErrorPrettifier();\n\nexport default errorPrettifier;\n"]}
|
|
1
|
+
{"version":3,"file":"error-prettifier.js","sourceRoot":"","sources":["../../../../../src/modules/base/utils/error-prettifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { ValidationError } from \"class-validator\";\nimport z, { ZodError } from \"zod\";\nimport { pascalCase } from \"../../../utils/helpers/change-case.helpers\";\n\n/**\n * Prettified error result with consistent format\n */\nexport interface PrettifiedError {\n /** Human-readable error message */\n message: string;\n /** Field name + constraint type code (e.g., 'NameIsStringConstraint') */\n code: string;\n}\n\n/**\n * Supported validation library types\n */\nexport type ValidationLibrary = \"class-validator\" | \"zod\";\n\n/**\n * ErrorPrettifier class for normalizing validation errors from class-validator and Zod\n * into a consistent format with field name + constraint code pattern.\n *\n * @example\n * ```typescript\n * const prettifier = new ErrorPrettifier();\n *\n * // Class-validator example\n * const classValidatorErrors = await validate(userDto);\n * const prettified = prettifier.prettify('class-validator', classValidatorErrors);\n * // [{ message: 'name must be a string', code: 'NameIsStringConstraint' }]\n *\n * // Zod example\n * try {\n * schema.parse(data);\n * } catch (error) {\n * const prettified = prettifier.prettify('zod', error);\n * // [{ message: 'name must be a string', code: 'NameIsStringConstraint' }]\n * }\n *\n * // Nested errors\n * // [{ message: 'user.address.street must be a string', code: 'UserAddressStreetIsStringConstraint' }]\n * ```\n */\nexport class ErrorPrettifier {\n /**\n * Prettifies validation errors from class-validator or Zod into a consistent format.\n *\n * @param library - The validation library type ('class-validator' or 'zod')\n * @param error - The validation error(s) from the library\n * @returns Array of prettified errors with consistent message and code format\n */\n prettify(\n library: \"class-validator\",\n error: ValidationError[]\n ): PrettifiedError[];\n prettify(library: \"zod\", error: ZodError): PrettifiedError[];\n prettify(\n library: ValidationLibrary,\n error: ValidationError[] | ZodError\n ): PrettifiedError[] {\n if (library === \"class-validator\") {\n return this.prettifyClassValidator(error as ValidationError[]);\n } else {\n return this.prettifyZod(error as ZodError);\n }\n }\n\n /**\n * Converts a field path to PascalCase for code generation.\n *\n * @example\n * ```typescript\n * toPascalCase('user.address.street') // 'UserAddressStreet'\n * toPascalCase('email') // 'Email'\n * ```\n *\n * @param path - Dot-separated field path\n * @returns PascalCase version of the path\n */\n private toPascalCase(path: string): string {\n return path\n .split(\".\")\n .map((part) => pascalCase(part))\n .join(\"\");\n }\n\n /**\n * Replaces the field name in the validation message with the full path.\n * Handles array indices like tags[0] and nested paths like user.address.street.\n *\n * @example\n * ```typescript\n * replaceFieldInMessage('id must be a UUID', 'id', 'user.id')\n * // Returns: ''user.id' must be a UUID'\n *\n * replaceFieldInMessage('name must be a string', 'name', 'tags[0].name')\n * // Returns: ''tags[0].name' must be a string'\n * ```\n *\n * @param message - Original validation message\n * @param fieldName - Original field name\n * @param fullPath - Full path including parent properties\n * @returns Message with field name replaced by full path\n */\n private replaceFieldInMessage(\n message: string,\n fieldName: string,\n fullPath: string\n ): string {\n // If it's a top-level field (no dots or brackets), return original message\n if (!fullPath.includes(\".\") && !fullPath.includes(\"[\")) {\n return message;\n }\n\n // Replace the field name at the start of the message with the full path\n // Handle cases like \"id must be a UUID\" -> \"'user.id' must be a UUID\"\n const regex = new RegExp(`^${fieldName}\\\\b`, \"i\");\n if (regex.test(message)) {\n return message.replace(regex, `'${fullPath}'`);\n }\n\n // If field name is not at the start, try to find it and replace\n // This handles cases like \"must be a valid id\" or other formats\n const wordBoundaryRegex = new RegExp(`\\\\b${fieldName}\\\\b`, \"gi\");\n if (wordBoundaryRegex.test(message)) {\n return message.replace(wordBoundaryRegex, `'${fullPath}'`);\n }\n\n // If we can't find the field name in the message, prepend the path\n return `'${fullPath}' ${message}`;\n }\n\n /**\n * Prettifies class-validator ValidationError array.\n * Handles nested validation errors recursively.\n *\n * @param errors - Array of ValidationError from class-validator\n * @param parentPath - Parent path for nested errors (used internally)\n * @returns Array of prettified errors\n */\n private prettifyClassValidator(\n errors: ValidationError[],\n parentPath: string = \"\"\n ): PrettifiedError[] {\n const result: PrettifiedError[] = [];\n\n for (const error of errors) {\n const currentPath = parentPath\n ? `${parentPath}.${error.property}`\n : error.property;\n\n if (error.children && error.children.length > 0) {\n result.push(\n ...this.prettifyClassValidator(error.children, currentPath)\n );\n continue;\n }\n\n if (error.constraints) {\n const fieldPascal = this.toPascalCase(currentPath);\n\n for (const [constraintKey, originalMessage] of Object.entries(\n error.constraints\n )) {\n const constraintName =\n constraintKey.charAt(0).toUpperCase() + constraintKey.slice(1);\n\n const message = this.replaceFieldInMessage(\n originalMessage,\n error.property,\n currentPath\n );\n\n result.push({\n message: message,\n code: `${fieldPascal}${constraintName}Constraint`,\n });\n }\n }\n }\n\n return result;\n }\n\n /**\n * Maps Zod error codes and validation info to class-validator style constraint names.\n *\n * @param issue - Zod validation issue\n * @returns Class-validator style constraint name\n */\n private mapZodToConstraintName(issue: z.core.$ZodIssue): string {\n switch (issue.code) {\n case \"invalid_type\":\n const expected = issue.expected;\n switch (expected) {\n case \"string\":\n return \"IsStringConstraint\";\n case \"email\":\n return \"IsEmailConstraint\";\n case \"uuid\":\n return \"IsUuidConstraint\";\n case \"url\":\n return \"IsUrlConstraint\";\n case \"number\":\n return \"IsNumberConstraint\";\n case \"boolean\":\n return \"IsBooleanConstraint\";\n case \"array\":\n return \"IsArrayConstraint\";\n case \"object\":\n return \"IsObjectConstraint\";\n case \"date\":\n return \"IsDateConstraint\";\n default:\n if (typeof expected === \"object\" && \"includes\" in expected)\n return \"ContainsConstraint\";\n if (typeof expected === \"object\" && \"startsWith\" in expected)\n return \"StartsWithConstraint\";\n if (typeof expected === \"object\" && \"endsWith\" in expected)\n return \"EndsWithConstraint\";\n return \"InvalidTypeConstraint\";\n }\n\n case \"too_small\":\n if (issue.origin === \"string\") {\n return \"MinLengthConstraint\";\n } else if (issue.origin === \"number\") {\n return \"MinConstraint\";\n } else if (issue.origin === \"array\") {\n return \"ArrayMinSizeConstraint\";\n }\n return \"TooSmallConstraint\";\n\n case \"too_big\":\n if (issue.origin === \"string\") {\n return \"MaxLengthConstraint\";\n } else if (issue.origin === \"number\") {\n return \"MaxConstraint\";\n } else if (issue.origin === \"array\") {\n return \"ArrayMaxSizeConstraint\";\n }\n return \"TooBigConstraint\";\n\n // case \"invalid_string\":\n // if (\"expected\" in issue) {\n // const validation = issue.expected;\n // if (validation === \"email\") return \"IsEmailConstraint\";\n // if (validation === \"uuid\") return \"IsUuidConstraint\";\n // if (validation === \"url\") return \"IsUrlConstraint\";\n // if (typeof validation === \"object\" && \"includes\" in validation)\n // return \"ContainsConstraint\";\n // if (typeof validation === \"object\" && \"startsWith\" in validation)\n // return \"StartsWithConstraint\";\n // if (typeof validation === \"object\" && \"endsWith\" in validation)\n // return \"EndsWithConstraint\";\n // }\n // return \"InvalidStringConstraint\";\n //\n case \"invalid_value\":\n if (issue.values.length > 1) {\n return \"IsEnumConstraint\";\n } else {\n return \"EqualsConstraint\";\n }\n\n // case \"invalid_enum_value\":\n // return \"IsEnumConstraint\";\n\n // case \"invalid_literal\":\n // return \"EqualsConstraint\";\n\n case \"unrecognized_keys\":\n return \"UnrecognizedKeysConstraint\";\n\n case \"invalid_union\":\n return \"InvalidUnionConstraint\";\n\n case \"custom\":\n return \"CustomConstraint\";\n\n default:\n return \"ValidationConstraint\";\n }\n }\n\n /**\n * Prettifies Zod ZodError.\n * Handles nested paths and multiple issues per field.\n *\n * @param error - ZodError from Zod validation\n * @returns Array of prettified errors\n */\n private prettifyZod(error: ZodError): PrettifiedError[] {\n const result: PrettifiedError[] = [];\n\n for (const issue of error.issues) {\n // Build the field path from the issue path\n const fieldPath = issue.path\n .map((segment, index) => {\n // Handle array indices: convert to bracket notation\n if (typeof segment === \"number\") {\n return `[${segment}]`;\n }\n // First segment doesn't need a dot prefix\n return index === 0 ? segment : `.${String(segment)}`;\n })\n .join(\"\")\n .replace(/\\.\\[/g, \"[\"); // Clean up .[ to just [\n\n const fieldPascal = fieldPath\n ? this.toPascalCase(fieldPath.replace(/\\[\\d+\\]/g, \"\"))\n : \"\";\n\n // Map Zod error code to constraint name\n const constraintName = this.mapZodToConstraintName(issue);\n\n // Inject the field path into the message naturally\n const message = this.injectFieldPathInZodMessage(\n issue.message,\n fieldPath,\n issue\n );\n\n result.push({\n message: message,\n code: `${fieldPascal}${constraintName}`,\n });\n }\n\n return result;\n }\n\n /**\n * Injects the field path into Zod error messages naturally.\n *\n * @example\n * ```typescript\n * injectFieldPathInZodMessage('String must contain at least 100 character(s)', 'user.id', issue)\n * // Returns: ''user.id' must contain at least 100 character(s)'\n *\n * injectFieldPathInZodMessage('Required', 'email', issue)\n * // Returns: ''email' is required'\n * ```\n *\n * @param message - Original Zod error message\n * @param fieldPath - Full field path (e.g., 'user.id', 'tags[0].name')\n * @param issue - Zod issue for context\n * @returns Message with field path injected naturally\n */\n private injectFieldPathInZodMessage(\n message: string,\n fieldPath: string,\n _: z.core.$ZodIssue\n ): string {\n if (!fieldPath) {\n return message;\n }\n\n // \"Required\" -> \"'fieldPath' is required\"\n if (message === \"Required\") {\n return `'${fieldPath}' is required`;\n }\n\n // \"String must...\" -> \"'fieldPath' must...\"\n if (message.startsWith(\"String must\")) {\n return message.replace(/^String must/, `'${fieldPath}' must`);\n }\n\n // \"Number must...\" -> \"'fieldPath' must...\"\n if (message.startsWith(\"Number must\")) {\n return message.replace(/^Number must/, `'${fieldPath}' must`);\n }\n\n // \"Array must...\" -> \"'fieldPath' must...\"\n if (message.startsWith(\"Array must\")) {\n return message.replace(/^Array must/, `'${fieldPath}' must`);\n }\n\n // \"Expected string, received number\" -> \"'fieldPath': Expected string, received number\"\n if (message.startsWith(\"Expected\")) {\n return `'${fieldPath}' must be valid: ${message}`;\n }\n\n // \"Invalid email\" -> \"'fieldPath' must be a valid email\"\n if (message.startsWith(\"Invalid \")) {\n const type = message.replace(\"Invalid \", \"\");\n return `'${fieldPath}' must be a valid ${type}`;\n }\n\n // For any other message, return the message\n if (!message.toLowerCase().includes(fieldPath))\n return `'${fieldPath}' ${message}`;\n return message;\n }\n}\n\nconst errorPrettifier = new ErrorPrettifier();\n\nexport default errorPrettifier;\n"]}
|