@baseplate-dev/fastify-generators 0.3.7 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants/fastify-packages.d.ts +12 -11
- package/dist/constants/fastify-packages.d.ts.map +1 -1
- package/dist/constants/fastify-packages.js +12 -11
- package/dist/constants/fastify-packages.js.map +1 -1
- package/dist/generators/auth/auth-context/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/auth/auth-context/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/auth/auth-context/generated/ts-import-providers.js +1 -1
- package/dist/generators/auth/auth-context/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/auth/auth-roles/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/auth/auth-roles/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/auth/auth-roles/generated/ts-import-providers.js +1 -1
- package/dist/generators/auth/auth-roles/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/auth/index.d.ts +0 -1
- package/dist/generators/auth/index.d.ts.map +1 -1
- package/dist/generators/auth/index.js +0 -1
- package/dist/generators/auth/index.js.map +1 -1
- package/dist/generators/auth/password-hasher-service/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/auth/password-hasher-service/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/auth/password-hasher-service/generated/ts-import-providers.js +1 -1
- package/dist/generators/auth/password-hasher-service/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/auth/user-session-types/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/auth/user-session-types/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/auth/user-session-types/generated/ts-import-providers.js +1 -1
- package/dist/generators/auth/user-session-types/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/bull/bull-mq/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/bull/bull-mq/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/bull/bull-mq/generated/ts-import-providers.js +1 -1
- package/dist/generators/bull/bull-mq/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/app-module-setup/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/core/app-module-setup/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/core/app-module-setup/generated/ts-import-providers.js +1 -1
- package/dist/generators/core/app-module-setup/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/axios/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/core/axios/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/core/axios/generated/ts-import-providers.js +3 -1
- package/dist/generators/core/axios/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/config-service/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/core/config-service/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/core/config-service/generated/ts-import-providers.js +3 -1
- package/dist/generators/core/config-service/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/error-handler-service/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/core/error-handler-service/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/core/error-handler-service/generated/ts-import-providers.js +1 -1
- package/dist/generators/core/error-handler-service/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/fastify/fastify.generator.js +1 -1
- package/dist/generators/core/fastify/fastify.generator.js.map +1 -1
- package/dist/generators/core/fastify-redis/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/core/fastify-redis/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/core/fastify-redis/generated/ts-import-providers.js +1 -1
- package/dist/generators/core/fastify-redis/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/fastify-sentry/fastify-sentry.generator.js +1 -1
- package/dist/generators/core/fastify-sentry/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/core/fastify-sentry/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/core/fastify-sentry/generated/ts-import-providers.js +1 -1
- package/dist/generators/core/fastify-sentry/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/logger-service/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/core/logger-service/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/core/logger-service/generated/ts-import-providers.js +3 -1
- package/dist/generators/core/logger-service/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/readme/templates/package/README.md +4 -4
- package/dist/generators/core/request-context/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/core/request-context/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/core/request-context/generated/ts-import-providers.js +1 -1
- package/dist/generators/core/request-context/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/request-service-context/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/core/request-service-context/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/core/request-service-context/generated/ts-import-providers.js +1 -1
- package/dist/generators/core/request-service-context/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/service-context/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/core/service-context/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/core/service-context/generated/ts-import-providers.js +1 -1
- package/dist/generators/core/service-context/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/core/service-file/service-file.generator.d.ts +7 -0
- package/dist/generators/core/service-file/service-file.generator.d.ts.map +1 -1
- package/dist/generators/core/service-file/service-file.generator.js +12 -2
- package/dist/generators/core/service-file/service-file.generator.js.map +1 -1
- package/dist/generators/pothos/pothos/generated/index.d.ts +3 -1
- package/dist/generators/pothos/pothos/generated/index.d.ts.map +1 -1
- package/dist/generators/pothos/pothos/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/pothos/pothos/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/pothos/pothos/generated/ts-import-providers.js +1 -1
- package/dist/generators/pothos/pothos/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/pothos/pothos/generated/typed-templates.d.ts +6 -2
- package/dist/generators/pothos/pothos/generated/typed-templates.d.ts.map +1 -1
- package/dist/generators/pothos/pothos/generated/typed-templates.js +1 -0
- package/dist/generators/pothos/pothos/generated/typed-templates.js.map +1 -1
- package/dist/generators/pothos/pothos/pothos.generator.d.ts +3 -3
- package/dist/generators/pothos/pothos/pothos.generator.d.ts.map +1 -1
- package/dist/generators/pothos/pothos/pothos.generator.js +4 -0
- package/dist/generators/pothos/pothos/pothos.generator.js.map +1 -1
- package/dist/generators/pothos/pothos/templates/src/plugins/graphql/FieldWithInputPayloadPlugin/global-types.ts +3 -5
- package/dist/generators/pothos/pothos/templates/src/plugins/graphql/FieldWithInputPayloadPlugin/schema-builder.ts +9 -4
- package/dist/generators/pothos/pothos/templates/src/plugins/graphql/FieldWithInputPayloadPlugin/types.ts +6 -1
- package/dist/generators/pothos/pothos-auth/pothos-auth.generator.d.ts +1 -1
- package/dist/generators/pothos/pothos-enums-file/pothos-enums-file.generator.d.ts +1 -1
- package/dist/generators/pothos/pothos-prisma/generated/index.d.ts +36 -0
- package/dist/generators/pothos/pothos-prisma/generated/index.d.ts.map +1 -0
- package/dist/generators/pothos/pothos-prisma/generated/index.js +11 -0
- package/dist/generators/pothos/pothos-prisma/generated/index.js.map +1 -0
- package/dist/generators/pothos/pothos-prisma/generated/template-paths.d.ts +12 -0
- package/dist/generators/pothos/pothos-prisma/generated/template-paths.d.ts.map +1 -0
- package/dist/generators/pothos/pothos-prisma/generated/template-paths.js +22 -0
- package/dist/generators/pothos/pothos-prisma/generated/template-paths.js.map +1 -0
- package/dist/generators/pothos/pothos-prisma/generated/template-renderers.d.ts +18 -0
- package/dist/generators/pothos/pothos-prisma/generated/template-renderers.d.ts.map +1 -0
- package/dist/generators/pothos/pothos-prisma/generated/template-renderers.js +34 -0
- package/dist/generators/pothos/pothos-prisma/generated/template-renderers.js.map +1 -0
- package/dist/generators/pothos/pothos-prisma/generated/ts-import-providers.d.ts +30 -0
- package/dist/generators/pothos/pothos-prisma/generated/ts-import-providers.d.ts.map +1 -0
- package/dist/generators/pothos/pothos-prisma/generated/ts-import-providers.js +30 -0
- package/dist/generators/pothos/pothos-prisma/generated/ts-import-providers.js.map +1 -0
- package/dist/generators/pothos/pothos-prisma/generated/typed-templates.d.ts +4 -0
- package/dist/generators/pothos/pothos-prisma/generated/typed-templates.d.ts.map +1 -0
- package/dist/generators/pothos/pothos-prisma/generated/typed-templates.js +14 -0
- package/dist/generators/pothos/pothos-prisma/generated/typed-templates.js.map +1 -0
- package/dist/generators/pothos/pothos-prisma/index.d.ts +2 -0
- package/dist/generators/pothos/pothos-prisma/index.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-prisma/index.js +1 -0
- package/dist/generators/pothos/pothos-prisma/index.js.map +1 -1
- package/dist/generators/pothos/pothos-prisma/pothos-prisma.generator.d.ts +34 -1
- package/dist/generators/pothos/pothos-prisma/pothos-prisma.generator.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-prisma/pothos-prisma.generator.js +20 -6
- package/dist/generators/pothos/pothos-prisma/pothos-prisma.generator.js.map +1 -1
- package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.d.ts +2 -2
- package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.js +87 -50
- package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.js.map +1 -1
- package/dist/generators/pothos/pothos-scalar/generated/index.d.ts +9 -39
- package/dist/generators/pothos/pothos-scalar/generated/index.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-scalar/generated/template-paths.d.ts +2 -0
- package/dist/generators/pothos/pothos-scalar/generated/template-paths.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-scalar/generated/template-paths.js +2 -0
- package/dist/generators/pothos/pothos-scalar/generated/template-paths.js.map +1 -1
- package/dist/generators/pothos/pothos-scalar/generated/template-renderers.d.ts +6 -10
- package/dist/generators/pothos/pothos-scalar/generated/template-renderers.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-scalar/generated/template-renderers.js +21 -6
- package/dist/generators/pothos/pothos-scalar/generated/template-renderers.js.map +1 -1
- package/dist/generators/pothos/pothos-scalar/generated/typed-templates.d.ts +9 -29
- package/dist/generators/pothos/pothos-scalar/generated/typed-templates.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-scalar/generated/typed-templates.js +28 -14
- package/dist/generators/pothos/pothos-scalar/generated/typed-templates.js.map +1 -1
- package/dist/generators/pothos/pothos-scalar/pothos-scalar.generator.d.ts +2 -12
- package/dist/generators/pothos/pothos-scalar/pothos-scalar.generator.d.ts.map +1 -1
- package/dist/generators/pothos/pothos-scalar/pothos-scalar.generator.js +35 -11
- package/dist/generators/pothos/pothos-scalar/pothos-scalar.generator.js.map +1 -1
- package/dist/generators/pothos/pothos-scalar/templates/module/scalars/date-time.ts +21 -28
- package/dist/generators/pothos/pothos-scalar/templates/module/scalars/date.ts +13 -45
- package/dist/generators/pothos/pothos-scalar/templates/module/scalars/json-object.ts +28 -0
- package/dist/generators/pothos/pothos-scalar/templates/module/scalars/json.ts +23 -0
- package/dist/generators/pothos/pothos-scalar/templates/module/scalars/uuid.ts +13 -31
- package/dist/generators/pothos/pothos-sentry/pothos-sentry.generator.d.ts +1 -1
- package/dist/generators/prisma/_providers/index.d.ts +2 -0
- package/dist/generators/prisma/_providers/index.d.ts.map +1 -0
- package/dist/generators/prisma/_providers/index.js +2 -0
- package/dist/generators/prisma/_providers/index.js.map +1 -0
- package/dist/generators/prisma/_providers/prisma-generated-imports.d.ts +15 -0
- package/dist/generators/prisma/_providers/prisma-generated-imports.d.ts.map +1 -0
- package/dist/generators/prisma/_providers/prisma-generated-imports.js +10 -0
- package/dist/generators/prisma/_providers/prisma-generated-imports.js.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.d.ts +124 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.d.ts.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.js +137 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.js.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.d.ts +82 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.d.ts.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.js +215 -0
- package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.js.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/index.d.ts +3 -0
- package/dist/generators/prisma/_shared/build-data-helpers/index.d.ts.map +1 -0
- package/dist/generators/prisma/_shared/build-data-helpers/index.js +3 -0
- package/dist/generators/prisma/_shared/build-data-helpers/index.js.map +1 -0
- package/dist/generators/prisma/_shared/crud-method/primary-key-input.d.ts +0 -9
- package/dist/generators/prisma/_shared/crud-method/primary-key-input.d.ts.map +1 -1
- package/dist/generators/prisma/_shared/crud-method/primary-key-input.js +0 -32
- package/dist/generators/prisma/_shared/crud-method/primary-key-input.js.map +1 -1
- package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.d.ts +26 -0
- package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.d.ts.map +1 -0
- package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.js +47 -0
- package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.js.map +1 -0
- package/dist/generators/prisma/_shared/field-definition-generators/types.d.ts +8 -0
- package/dist/generators/prisma/_shared/field-definition-generators/types.d.ts.map +1 -0
- package/dist/generators/prisma/_shared/field-definition-generators/types.js +2 -0
- package/dist/generators/prisma/_shared/field-definition-generators/types.js.map +1 -0
- package/dist/generators/prisma/data-utils/data-utils.generator.d.ts +109 -0
- package/dist/generators/prisma/data-utils/data-utils.generator.d.ts.map +1 -0
- package/dist/generators/prisma/data-utils/data-utils.generator.js +32 -0
- package/dist/generators/prisma/data-utils/data-utils.generator.js.map +1 -0
- package/dist/generators/prisma/data-utils/generated/index.d.ts +190 -0
- package/dist/generators/prisma/data-utils/generated/index.d.ts.map +1 -0
- package/dist/generators/prisma/data-utils/generated/index.js +11 -0
- package/dist/generators/prisma/data-utils/generated/index.js.map +1 -0
- package/dist/generators/prisma/data-utils/generated/template-paths.d.ts +17 -0
- package/dist/generators/prisma/data-utils/generated/template-paths.d.ts.map +1 -0
- package/dist/generators/prisma/data-utils/generated/template-paths.js +27 -0
- package/dist/generators/prisma/data-utils/generated/template-paths.js.map +1 -0
- package/dist/generators/prisma/data-utils/generated/template-renderers.d.ts +45 -0
- package/dist/generators/prisma/data-utils/generated/template-renderers.d.ts.map +1 -0
- package/dist/generators/prisma/data-utils/generated/template-renderers.js +47 -0
- package/dist/generators/prisma/data-utils/generated/template-renderers.js.map +1 -0
- package/dist/generators/prisma/data-utils/generated/ts-import-providers.d.ts +183 -0
- package/dist/generators/prisma/data-utils/generated/ts-import-providers.d.ts.map +1 -0
- package/dist/generators/prisma/data-utils/generated/ts-import-providers.js +72 -0
- package/dist/generators/prisma/data-utils/generated/ts-import-providers.js.map +1 -0
- package/dist/generators/prisma/data-utils/generated/typed-templates.d.ts +157 -0
- package/dist/generators/prisma/data-utils/generated/typed-templates.d.ts.map +1 -0
- package/dist/generators/prisma/data-utils/generated/typed-templates.js +125 -0
- package/dist/generators/prisma/data-utils/generated/typed-templates.js.map +1 -0
- package/dist/generators/prisma/data-utils/index.d.ts +4 -0
- package/dist/generators/prisma/data-utils/index.d.ts.map +1 -0
- package/dist/generators/prisma/data-utils/index.js +3 -0
- package/dist/generators/prisma/data-utils/index.js.map +1 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/define-operations.ts +1030 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/field-definitions.ts +782 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prisma-types.ts +164 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prisma-utils.ts +80 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/relation-helpers.ts +196 -0
- package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/types.ts +372 -0
- package/dist/generators/prisma/index.d.ts +7 -6
- package/dist/generators/prisma/index.d.ts.map +1 -1
- package/dist/generators/prisma/index.js +7 -6
- package/dist/generators/prisma/index.js.map +1 -1
- package/dist/generators/prisma/prisma/generated/index.d.ts +22 -1
- package/dist/generators/prisma/prisma/generated/index.d.ts.map +1 -1
- package/dist/generators/prisma/prisma/generated/template-paths.d.ts +2 -0
- package/dist/generators/prisma/prisma/generated/template-paths.d.ts.map +1 -1
- package/dist/generators/prisma/prisma/generated/template-paths.js +3 -0
- package/dist/generators/prisma/prisma/generated/template-paths.js.map +1 -1
- package/dist/generators/prisma/prisma/generated/template-renderers.d.ts +10 -1
- package/dist/generators/prisma/prisma/generated/template-renderers.d.ts.map +1 -1
- package/dist/generators/prisma/prisma/generated/template-renderers.js +21 -1
- package/dist/generators/prisma/prisma/generated/template-renderers.js.map +1 -1
- package/dist/generators/prisma/prisma/generated/ts-import-providers.d.ts +7 -2
- package/dist/generators/prisma/prisma/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/prisma/prisma/generated/ts-import-providers.js +12 -2
- package/dist/generators/prisma/prisma/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/prisma/prisma/generated/typed-templates.d.ts +16 -1
- package/dist/generators/prisma/prisma/generated/typed-templates.d.ts.map +1 -1
- package/dist/generators/prisma/prisma/generated/typed-templates.js +28 -2
- package/dist/generators/prisma/prisma/generated/typed-templates.js.map +1 -1
- package/dist/generators/prisma/prisma/prisma.generator.d.ts +30 -1
- package/dist/generators/prisma/prisma/prisma.generator.d.ts.map +1 -1
- package/dist/generators/prisma/prisma/prisma.generator.js +55 -13
- package/dist/generators/prisma/prisma/prisma.generator.js.map +1 -1
- package/dist/generators/prisma/prisma/templates/package/prisma.config.mts +17 -0
- package/dist/generators/prisma/prisma/templates/src/services/prisma.ts +5 -2
- package/dist/generators/prisma/prisma-data-create/index.d.ts +2 -0
- package/dist/generators/prisma/prisma-data-create/index.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-create/index.js +2 -0
- package/dist/generators/prisma/prisma-data-create/index.js.map +1 -0
- package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.d.ts +73 -0
- package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.js +102 -0
- package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.js.map +1 -0
- package/dist/generators/prisma/prisma-data-delete/index.d.ts +2 -0
- package/dist/generators/prisma/prisma-data-delete/index.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-delete/index.js +2 -0
- package/dist/generators/prisma/prisma-data-delete/index.js.map +1 -0
- package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.d.ts +72 -0
- package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.js +82 -0
- package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.js.map +1 -0
- package/dist/generators/prisma/prisma-data-nested-field/index.d.ts +2 -0
- package/dist/generators/prisma/prisma-data-nested-field/index.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-nested-field/index.js +2 -0
- package/dist/generators/prisma/prisma-data-nested-field/index.js.map +1 -0
- package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.d.ts +16 -0
- package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.js +179 -0
- package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.js.map +1 -0
- package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.d.ts +95 -0
- package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.js +120 -0
- package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.js.map +1 -0
- package/dist/generators/prisma/prisma-data-service/index.d.ts +2 -0
- package/dist/generators/prisma/prisma-data-service/index.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-service/index.js +2 -0
- package/dist/generators/prisma/prisma-data-service/index.js.map +1 -0
- package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.d.ts +117 -0
- package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.js +127 -0
- package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.js.map +1 -0
- package/dist/generators/prisma/prisma-data-update/index.d.ts +2 -0
- package/dist/generators/prisma/prisma-data-update/index.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-update/index.js +2 -0
- package/dist/generators/prisma/prisma-data-update/index.js.map +1 -0
- package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.d.ts +73 -0
- package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.d.ts.map +1 -0
- package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.js +114 -0
- package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.js.map +1 -0
- package/dist/generators/prisma/prisma-field/prisma-field.generator.d.ts +6 -6
- package/dist/generators/stripe/fastify-stripe/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/stripe/fastify-stripe/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/stripe/fastify-stripe/generated/ts-import-providers.js +1 -1
- package/dist/generators/stripe/fastify-stripe/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/index.d.ts +20 -1
- package/dist/generators/vitest/prisma-vitest/generated/index.d.ts.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/template-renderers.d.ts +6 -0
- package/dist/generators/vitest/prisma-vitest/generated/template-renderers.d.ts.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/template-renderers.js +7 -1
- package/dist/generators/vitest/prisma-vitest/generated/template-renderers.js.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/ts-import-providers.d.ts +1 -2
- package/dist/generators/vitest/prisma-vitest/generated/ts-import-providers.d.ts.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/ts-import-providers.js +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/ts-import-providers.js.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/typed-templates.d.ts +14 -1
- package/dist/generators/vitest/prisma-vitest/generated/typed-templates.d.ts.map +1 -1
- package/dist/generators/vitest/prisma-vitest/generated/typed-templates.js +8 -2
- package/dist/generators/vitest/prisma-vitest/generated/typed-templates.js.map +1 -1
- package/dist/generators/vitest/prisma-vitest/prisma-vitest.generator.d.ts +16 -0
- package/dist/generators/vitest/prisma-vitest/prisma-vitest.generator.d.ts.map +1 -1
- package/dist/generators/vitest/prisma-vitest/prisma-vitest.generator.js +5 -10
- package/dist/generators/vitest/prisma-vitest/prisma-vitest.generator.js.map +1 -1
- package/dist/generators/vitest/prisma-vitest/templates/src/tests/helpers/db.test-helper.ts +3 -2
- package/dist/generators/vitest/prisma-vitest/templates/src/tests/helpers/prisma.test-helper.ts +1 -1
- package/dist/types/field-types.d.ts +1 -1
- package/dist/types/field-types.d.ts.map +1 -1
- package/dist/types/field-types.js +2 -0
- package/dist/types/field-types.js.map +1 -1
- package/dist/types/service-dto-kinds.d.ts +59 -0
- package/dist/types/service-dto-kinds.d.ts.map +1 -0
- package/dist/types/service-dto-kinds.js +53 -0
- package/dist/types/service-dto-kinds.js.map +1 -0
- package/dist/types/service-output.d.ts +25 -2
- package/dist/types/service-output.d.ts.map +1 -1
- package/dist/types/service-output.js +22 -2
- package/dist/types/service-output.js.map +1 -1
- package/dist/writers/pothos/input-types.d.ts +1 -1
- package/dist/writers/pothos/input-types.d.ts.map +1 -1
- package/dist/writers/pothos/input-types.js +7 -10
- package/dist/writers/pothos/input-types.js.map +1 -1
- package/dist/writers/pothos/resolvers.d.ts.map +1 -1
- package/dist/writers/pothos/resolvers.js +9 -6
- package/dist/writers/pothos/resolvers.js.map +1 -1
- package/dist/writers/pothos/scalars.d.ts.map +1 -1
- package/dist/writers/pothos/scalars.js +5 -0
- package/dist/writers/pothos/scalars.js.map +1 -1
- package/dist/writers/prisma-schema/fields.d.ts +3 -0
- package/dist/writers/prisma-schema/fields.d.ts.map +1 -1
- package/dist/writers/prisma-schema/fields.js +1 -0
- package/dist/writers/prisma-schema/fields.js.map +1 -1
- package/package.json +8 -6
- package/dist/generators/auth/prisma-password-transformer/index.d.ts +0 -2
- package/dist/generators/auth/prisma-password-transformer/index.d.ts.map +0 -1
- package/dist/generators/auth/prisma-password-transformer/index.js +0 -2
- package/dist/generators/auth/prisma-password-transformer/index.js.map +0 -1
- package/dist/generators/auth/prisma-password-transformer/prisma-password-transformer.generator.d.ts +0 -12
- package/dist/generators/auth/prisma-password-transformer/prisma-password-transformer.generator.d.ts.map +0 -1
- package/dist/generators/auth/prisma-password-transformer/prisma-password-transformer.generator.js +0 -48
- package/dist/generators/auth/prisma-password-transformer/prisma-password-transformer.generator.js.map +0 -1
- package/dist/generators/prisma/_shared/crud-method/data-method.d.ts +0 -31
- package/dist/generators/prisma/_shared/crud-method/data-method.d.ts.map +0 -1
- package/dist/generators/prisma/_shared/crud-method/data-method.js +0 -195
- package/dist/generators/prisma/_shared/crud-method/data-method.js.map +0 -1
- package/dist/generators/prisma/embedded-relation-transformer/embedded-relation-transformer.generator.d.ts +0 -50
- package/dist/generators/prisma/embedded-relation-transformer/embedded-relation-transformer.generator.d.ts.map +0 -1
- package/dist/generators/prisma/embedded-relation-transformer/embedded-relation-transformer.generator.js +0 -371
- package/dist/generators/prisma/embedded-relation-transformer/embedded-relation-transformer.generator.js.map +0 -1
- package/dist/generators/prisma/embedded-relation-transformer/index.d.ts +0 -2
- package/dist/generators/prisma/embedded-relation-transformer/index.d.ts.map +0 -1
- package/dist/generators/prisma/embedded-relation-transformer/index.js +0 -2
- package/dist/generators/prisma/embedded-relation-transformer/index.js.map +0 -1
- package/dist/generators/prisma/prisma-crud-create/index.d.ts +0 -2
- package/dist/generators/prisma/prisma-crud-create/index.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-crud-create/index.js +0 -2
- package/dist/generators/prisma/prisma-crud-create/index.js.map +0 -1
- package/dist/generators/prisma/prisma-crud-create/prisma-crud-create.generator.d.ts +0 -48
- package/dist/generators/prisma/prisma-crud-create/prisma-crud-create.generator.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-crud-create/prisma-crud-create.generator.js +0 -130
- package/dist/generators/prisma/prisma-crud-create/prisma-crud-create.generator.js.map +0 -1
- package/dist/generators/prisma/prisma-crud-delete/index.d.ts +0 -2
- package/dist/generators/prisma/prisma-crud-delete/index.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-crud-delete/index.js +0 -2
- package/dist/generators/prisma/prisma-crud-delete/index.js.map +0 -1
- package/dist/generators/prisma/prisma-crud-delete/prisma-crud-delete.generator.d.ts +0 -38
- package/dist/generators/prisma/prisma-crud-delete/prisma-crud-delete.generator.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-crud-delete/prisma-crud-delete.generator.js +0 -94
- package/dist/generators/prisma/prisma-crud-delete/prisma-crud-delete.generator.js.map +0 -1
- package/dist/generators/prisma/prisma-crud-service/index.d.ts +0 -2
- package/dist/generators/prisma/prisma-crud-service/index.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-crud-service/index.js +0 -2
- package/dist/generators/prisma/prisma-crud-service/index.js.map +0 -1
- package/dist/generators/prisma/prisma-crud-service/prisma-crud-service.generator.d.ts +0 -20
- package/dist/generators/prisma/prisma-crud-service/prisma-crud-service.generator.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-crud-service/prisma-crud-service.generator.js +0 -53
- package/dist/generators/prisma/prisma-crud-service/prisma-crud-service.generator.js.map +0 -1
- package/dist/generators/prisma/prisma-crud-update/index.d.ts +0 -2
- package/dist/generators/prisma/prisma-crud-update/index.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-crud-update/index.js +0 -2
- package/dist/generators/prisma/prisma-crud-update/index.js.map +0 -1
- package/dist/generators/prisma/prisma-crud-update/prisma-crud-update.generator.d.ts +0 -48
- package/dist/generators/prisma/prisma-crud-update/prisma-crud-update.generator.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-crud-update/prisma-crud-update.generator.js +0 -145
- package/dist/generators/prisma/prisma-crud-update/prisma-crud-update.generator.js.map +0 -1
- package/dist/generators/prisma/prisma-utils/generated/index.d.ts +0 -134
- package/dist/generators/prisma/prisma-utils/generated/index.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-utils/generated/index.js +0 -11
- package/dist/generators/prisma/prisma-utils/generated/index.js.map +0 -1
- package/dist/generators/prisma/prisma-utils/generated/template-paths.d.ts +0 -17
- package/dist/generators/prisma/prisma-utils/generated/template-paths.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-utils/generated/template-paths.js +0 -27
- package/dist/generators/prisma/prisma-utils/generated/template-paths.js.map +0 -1
- package/dist/generators/prisma/prisma-utils/generated/template-renderers.d.ts +0 -37
- package/dist/generators/prisma/prisma-utils/generated/template-renderers.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-utils/generated/template-renderers.js +0 -43
- package/dist/generators/prisma/prisma-utils/generated/template-renderers.js.map +0 -1
- package/dist/generators/prisma/prisma-utils/generated/ts-import-providers.d.ts +0 -88
- package/dist/generators/prisma/prisma-utils/generated/ts-import-providers.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-utils/generated/ts-import-providers.js +0 -54
- package/dist/generators/prisma/prisma-utils/generated/ts-import-providers.js.map +0 -1
- package/dist/generators/prisma/prisma-utils/generated/typed-templates.d.ts +0 -125
- package/dist/generators/prisma/prisma-utils/generated/typed-templates.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-utils/generated/typed-templates.js +0 -104
- package/dist/generators/prisma/prisma-utils/generated/typed-templates.js.map +0 -1
- package/dist/generators/prisma/prisma-utils/index.d.ts +0 -4
- package/dist/generators/prisma/prisma-utils/index.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-utils/index.js +0 -3
- package/dist/generators/prisma/prisma-utils/index.js.map +0 -1
- package/dist/generators/prisma/prisma-utils/prisma-utils.generator.d.ts +0 -61
- package/dist/generators/prisma/prisma-utils/prisma-utils.generator.d.ts.map +0 -1
- package/dist/generators/prisma/prisma-utils/prisma-utils.generator.js +0 -43
- package/dist/generators/prisma/prisma-utils/prisma-utils.generator.js.map +0 -1
- package/dist/generators/prisma/prisma-utils/templates/src/utils/crud-service-types.ts +0 -35
- package/dist/generators/prisma/prisma-utils/templates/src/utils/data-pipes.ts +0 -86
- package/dist/generators/prisma/prisma-utils/templates/src/utils/embedded-pipes/embedded-one-to-many.ts +0 -245
- package/dist/generators/prisma/prisma-utils/templates/src/utils/embedded-pipes/embedded-one-to-one.ts +0 -147
- package/dist/generators/prisma/prisma-utils/templates/src/utils/embedded-pipes/embedded-types.ts +0 -6
- package/dist/generators/prisma/prisma-utils/templates/src/utils/prisma-relations.ts +0 -24
- package/dist/providers/prisma/prisma-data-transformable.d.ts +0 -27
- package/dist/providers/prisma/prisma-data-transformable.d.ts.map +0 -1
- package/dist/providers/prisma/prisma-data-transformable.js +0 -2
- package/dist/providers/prisma/prisma-data-transformable.js.map +0 -1
package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/field-definitions.ts
ADDED
|
@@ -0,0 +1,782 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
CreateInput,
|
|
5
|
+
GetPayload,
|
|
6
|
+
ModelPropName,
|
|
7
|
+
UpdateInput,
|
|
8
|
+
WhereInput,
|
|
9
|
+
WhereUniqueInput,
|
|
10
|
+
} from '$prismaTypes';
|
|
11
|
+
import type {
|
|
12
|
+
AnyFieldDefinition,
|
|
13
|
+
FieldDefinition,
|
|
14
|
+
InferFieldsCreateOutput,
|
|
15
|
+
InferFieldsUpdateOutput,
|
|
16
|
+
InferInput,
|
|
17
|
+
InferInputSchema,
|
|
18
|
+
OperationContext,
|
|
19
|
+
TransactionalOperationContext,
|
|
20
|
+
} from '$types';
|
|
21
|
+
import type { Payload } from '@prisma/client/runtime/client';
|
|
22
|
+
import type { z } from 'zod';
|
|
23
|
+
|
|
24
|
+
import {
|
|
25
|
+
generateCreateSchema,
|
|
26
|
+
invokeHooks,
|
|
27
|
+
transformFields,
|
|
28
|
+
} from '$defineOperations';
|
|
29
|
+
import { makeGenericPrismaDelegate } from '$prismaUtils';
|
|
30
|
+
import { prisma } from '%prismaImports';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Create a simple scalar field with validation and optional transformation
|
|
34
|
+
*
|
|
35
|
+
* This helper creates a field definition that validates input using a Zod schema.
|
|
36
|
+
* Optionally, you can provide a transform function to convert the validated value
|
|
37
|
+
* into a different type for Prisma operations.
|
|
38
|
+
*
|
|
39
|
+
* For relation fields (e.g., `userId`), use this helper to validate the ID,
|
|
40
|
+
* then use relation helpers in the transform step to create Prisma connect/disconnect objects.
|
|
41
|
+
*
|
|
42
|
+
* @template TSchema - The Zod schema type for validation
|
|
43
|
+
* @template TTransformed - The output type after transformation (defaults to schema output)
|
|
44
|
+
* @param schema - Zod schema for validation
|
|
45
|
+
* @param options - Optional configuration
|
|
46
|
+
* @param options.transform - Function to transform the validated value
|
|
47
|
+
* @returns Field definition
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* // Simple validation
|
|
52
|
+
* const fields = {
|
|
53
|
+
* title: scalarField(z.string()),
|
|
54
|
+
* ownerId: scalarField(z.string()), // Validated as string
|
|
55
|
+
* };
|
|
56
|
+
*
|
|
57
|
+
* // With transformation
|
|
58
|
+
* const fields = {
|
|
59
|
+
* email: scalarField(
|
|
60
|
+
* z.string().email(),
|
|
61
|
+
* { transform: (email) => email.toLowerCase() }
|
|
62
|
+
* ),
|
|
63
|
+
* createdAt: scalarField(
|
|
64
|
+
* z.string().datetime(),
|
|
65
|
+
* { transform: (dateStr) => new Date(dateStr) }
|
|
66
|
+
* ),
|
|
67
|
+
* };
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export function scalarField<
|
|
71
|
+
TSchema extends z.ZodSchema,
|
|
72
|
+
TTransformed = z.output<TSchema>,
|
|
73
|
+
>(
|
|
74
|
+
schema: TSchema,
|
|
75
|
+
options?: {
|
|
76
|
+
transform?: (value: z.output<TSchema>) => TTransformed;
|
|
77
|
+
},
|
|
78
|
+
): FieldDefinition<TSchema, TTransformed, TTransformed> {
|
|
79
|
+
return {
|
|
80
|
+
schema,
|
|
81
|
+
processInput: (value) => {
|
|
82
|
+
// Apply transform if provided
|
|
83
|
+
const transformed = options?.transform
|
|
84
|
+
? options.transform(value)
|
|
85
|
+
: (value as TTransformed);
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
data: { create: transformed, update: transformed },
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* =========================================
|
|
96
|
+
* Nested Field Handlers
|
|
97
|
+
* =========================================
|
|
98
|
+
*/
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Configuration for a parent model in nested field definitions.
|
|
102
|
+
*
|
|
103
|
+
* Used to establish the relationship between a parent and child model
|
|
104
|
+
* in nested one-to-one and one-to-many field handlers.
|
|
105
|
+
*
|
|
106
|
+
* @template TModelName - Prisma model name
|
|
107
|
+
*/
|
|
108
|
+
export interface ParentModelConfig<TModelName extends ModelPropName> {
|
|
109
|
+
/** Prisma model name of the parent */
|
|
110
|
+
model: TModelName;
|
|
111
|
+
/** Function to extract unique identifier from parent model instance */
|
|
112
|
+
getWhereUnique: (
|
|
113
|
+
parentModel: GetPayload<TModelName>,
|
|
114
|
+
) => WhereUniqueInput<TModelName>;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Creates a parent model configuration for use in nested field definitions.
|
|
119
|
+
*
|
|
120
|
+
* @template TModelName - Prisma model name
|
|
121
|
+
* @param model - Prisma model name
|
|
122
|
+
* @param getWhereUnique - Function to extract unique identifier from parent model
|
|
123
|
+
* @returns Parent model configuration object
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* const parentModel = createParentModelConfig('user', (user) => ({
|
|
128
|
+
* id: user.id,
|
|
129
|
+
* }));
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export function createParentModelConfig<TModelName extends ModelPropName>(
|
|
133
|
+
model: TModelName,
|
|
134
|
+
getWhereUnique: (
|
|
135
|
+
parentModel: GetPayload<TModelName>,
|
|
136
|
+
) => WhereUniqueInput<TModelName>,
|
|
137
|
+
): ParentModelConfig<TModelName> {
|
|
138
|
+
return {
|
|
139
|
+
model,
|
|
140
|
+
getWhereUnique,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
type RelationName<TModelName extends ModelPropName> = keyof Payload<
|
|
145
|
+
(typeof prisma)[TModelName]
|
|
146
|
+
>['objects'];
|
|
147
|
+
|
|
148
|
+
interface PrismaFieldData<TModelName extends ModelPropName> {
|
|
149
|
+
create: CreateInput<TModelName>;
|
|
150
|
+
update: UpdateInput<TModelName>;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Configuration for defining a nested one-to-one relationship field.
|
|
155
|
+
*
|
|
156
|
+
* One-to-one fields represent a single related entity that can be created,
|
|
157
|
+
* updated, or deleted along with the parent entity. The field handler manages
|
|
158
|
+
* the lifecycle of the nested entity automatically.
|
|
159
|
+
*
|
|
160
|
+
* @template TParentModelName - Parent model name
|
|
161
|
+
* @template TModelName - Child model name
|
|
162
|
+
* @template TRelationName - Relation field name on the child model
|
|
163
|
+
* @template TFields - Field definitions for the nested entity
|
|
164
|
+
*/
|
|
165
|
+
export interface NestedOneToOneFieldConfig<
|
|
166
|
+
TParentModelName extends ModelPropName,
|
|
167
|
+
TModelName extends ModelPropName,
|
|
168
|
+
TRelationName extends RelationName<TModelName>,
|
|
169
|
+
TFields extends Record<string, AnyFieldDefinition>,
|
|
170
|
+
> {
|
|
171
|
+
/**
|
|
172
|
+
* Prisma model name of parent model
|
|
173
|
+
*/
|
|
174
|
+
parentModel: ParentModelConfig<TParentModelName>;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Prisma model name of the child model
|
|
178
|
+
*/
|
|
179
|
+
model: TModelName;
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Relation name of the parent model from the child model
|
|
183
|
+
*/
|
|
184
|
+
relationName: TRelationName;
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Field definitions for the nested entity
|
|
188
|
+
*/
|
|
189
|
+
fields: TFields;
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Extract where unique from parent model
|
|
193
|
+
*/
|
|
194
|
+
getWhereUnique: (
|
|
195
|
+
parentModel: GetPayload<TParentModelName>,
|
|
196
|
+
) => WhereUniqueInput<TModelName>;
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Transform validated field data into final Prisma structure
|
|
200
|
+
*/
|
|
201
|
+
buildData: (
|
|
202
|
+
data: {
|
|
203
|
+
create: InferFieldsCreateOutput<TFields> &
|
|
204
|
+
Record<TRelationName, { connect: WhereUniqueInput<TParentModelName> }>;
|
|
205
|
+
update: InferFieldsUpdateOutput<TFields>;
|
|
206
|
+
},
|
|
207
|
+
parentModel: GetPayload<TParentModelName>,
|
|
208
|
+
ctx: TransactionalOperationContext<
|
|
209
|
+
GetPayload<TModelName>,
|
|
210
|
+
{ hasResult: false }
|
|
211
|
+
>,
|
|
212
|
+
) => PrismaFieldData<TModelName> | Promise<PrismaFieldData<TModelName>>;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Create a nested one-to-one relationship field handler
|
|
217
|
+
*
|
|
218
|
+
* This helper creates a field definition for managing one-to-one nested relationships.
|
|
219
|
+
* It handles nested field validation, transformation, and supports both create and update operations.
|
|
220
|
+
*
|
|
221
|
+
* The nested entity is created/updated via afterExecute hooks, allowing it to reference
|
|
222
|
+
* the parent entity after it has been created.
|
|
223
|
+
*
|
|
224
|
+
* Behavior:
|
|
225
|
+
* - **Provided value**: Upserts the nested entity (creates if new, updates if exists)
|
|
226
|
+
* - **null**: Deletes the nested entity (update only)
|
|
227
|
+
* - **undefined**: No change to nested entity
|
|
228
|
+
*
|
|
229
|
+
* @param config - Configuration object
|
|
230
|
+
* @returns Field definition
|
|
231
|
+
*
|
|
232
|
+
* @example
|
|
233
|
+
* ```typescript
|
|
234
|
+
* const fields = {
|
|
235
|
+
* userProfile: nestedOneToOneField({
|
|
236
|
+
* parentModel: createParentModelConfig('user', (user) => ({ id: user.id })),
|
|
237
|
+
* model: 'userProfile',
|
|
238
|
+
* relationName: 'user',
|
|
239
|
+
* fields: {
|
|
240
|
+
* bio: scalarField(z.string()),
|
|
241
|
+
* avatar: fileField(avatarFileCategory),
|
|
242
|
+
* },
|
|
243
|
+
* getWhereUnique: (parent) => ({ userId: parent.id }),
|
|
244
|
+
* buildData: (data) => ({
|
|
245
|
+
* create: {
|
|
246
|
+
* bio: data.create.bio,
|
|
247
|
+
* avatar: data.create.avatar ? { connect: { id: data.create.avatar } } : undefined,
|
|
248
|
+
* },
|
|
249
|
+
* update: {
|
|
250
|
+
* bio: data.update.bio,
|
|
251
|
+
* avatar: data.update.avatar ? { connect: { id: data.update.avatar } } : undefined,
|
|
252
|
+
* },
|
|
253
|
+
* }),
|
|
254
|
+
* }),
|
|
255
|
+
* };
|
|
256
|
+
* ```
|
|
257
|
+
*/
|
|
258
|
+
export function nestedOneToOneField<
|
|
259
|
+
TParentModelName extends ModelPropName,
|
|
260
|
+
TModelName extends ModelPropName,
|
|
261
|
+
TRelationName extends RelationName<TModelName>,
|
|
262
|
+
TFields extends Record<string, AnyFieldDefinition>,
|
|
263
|
+
>(
|
|
264
|
+
config: NestedOneToOneFieldConfig<
|
|
265
|
+
TParentModelName,
|
|
266
|
+
TModelName,
|
|
267
|
+
TRelationName,
|
|
268
|
+
TFields
|
|
269
|
+
>,
|
|
270
|
+
): FieldDefinition<
|
|
271
|
+
z.ZodOptional<z.ZodNullable<InferInputSchema<TFields>>>,
|
|
272
|
+
undefined,
|
|
273
|
+
undefined | { delete: true }
|
|
274
|
+
> {
|
|
275
|
+
return {
|
|
276
|
+
schema: generateCreateSchema(config.fields).nullish(),
|
|
277
|
+
processInput: async (value, processCtx) => {
|
|
278
|
+
// Handle null - delete the relation
|
|
279
|
+
if (value === null) {
|
|
280
|
+
return {
|
|
281
|
+
data: {
|
|
282
|
+
create: undefined,
|
|
283
|
+
update: { delete: true },
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Handle undefined - no change
|
|
289
|
+
if (value === undefined) {
|
|
290
|
+
return { data: { create: undefined, update: undefined } };
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
let cachedExisting: GetPayload<TModelName> | undefined;
|
|
294
|
+
async function loadExisting(): Promise<
|
|
295
|
+
GetPayload<TModelName> | undefined
|
|
296
|
+
> {
|
|
297
|
+
if (cachedExisting) return cachedExisting;
|
|
298
|
+
const existingParent = await processCtx.loadExisting();
|
|
299
|
+
if (!existingParent) return undefined;
|
|
300
|
+
const whereUnique = config.getWhereUnique(
|
|
301
|
+
existingParent as GetPayload<TParentModelName>,
|
|
302
|
+
);
|
|
303
|
+
const prismaDelegate = makeGenericPrismaDelegate(prisma, config.model);
|
|
304
|
+
cachedExisting =
|
|
305
|
+
(await prismaDelegate.findUnique({
|
|
306
|
+
where: whereUnique,
|
|
307
|
+
})) ?? undefined;
|
|
308
|
+
return cachedExisting;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Process nested fields
|
|
312
|
+
const { data, hooks } = await transformFields(config.fields, value, {
|
|
313
|
+
serviceContext: processCtx.serviceContext,
|
|
314
|
+
operation: 'upsert',
|
|
315
|
+
allowOptionalFields: false,
|
|
316
|
+
loadExisting: loadExisting as () => Promise<object | undefined>,
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
let newModelResult: GetPayload<TModelName> | undefined;
|
|
320
|
+
|
|
321
|
+
return {
|
|
322
|
+
data: {},
|
|
323
|
+
hooks: {
|
|
324
|
+
beforeExecute: [
|
|
325
|
+
(ctx) => invokeHooks(hooks.beforeExecute, { ...ctx, loadExisting }),
|
|
326
|
+
],
|
|
327
|
+
afterExecute: [
|
|
328
|
+
async (ctx) => {
|
|
329
|
+
const awaitedData =
|
|
330
|
+
typeof data === 'function' ? await data(ctx.tx) : data;
|
|
331
|
+
const whereUnique = config.getWhereUnique(
|
|
332
|
+
ctx.result as GetPayload<TParentModelName>,
|
|
333
|
+
);
|
|
334
|
+
const parentWhereUnique = config.parentModel.getWhereUnique(
|
|
335
|
+
ctx.result as GetPayload<TParentModelName>,
|
|
336
|
+
);
|
|
337
|
+
const builtData = await config.buildData(
|
|
338
|
+
{
|
|
339
|
+
create: {
|
|
340
|
+
...awaitedData.create,
|
|
341
|
+
...({
|
|
342
|
+
[config.relationName]: { connect: parentWhereUnique },
|
|
343
|
+
} as Record<
|
|
344
|
+
TRelationName,
|
|
345
|
+
{ connect: WhereUniqueInput<TParentModelName> }
|
|
346
|
+
>),
|
|
347
|
+
},
|
|
348
|
+
update: awaitedData.update,
|
|
349
|
+
},
|
|
350
|
+
ctx.result as GetPayload<TParentModelName>,
|
|
351
|
+
{
|
|
352
|
+
...ctx,
|
|
353
|
+
operation: 'upsert',
|
|
354
|
+
loadExisting,
|
|
355
|
+
},
|
|
356
|
+
);
|
|
357
|
+
const prismaDelegate = makeGenericPrismaDelegate(
|
|
358
|
+
ctx.tx,
|
|
359
|
+
config.model,
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
newModelResult = await prismaDelegate.upsert({
|
|
363
|
+
where: whereUnique,
|
|
364
|
+
create: builtData.create,
|
|
365
|
+
update: builtData.update,
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
await invokeHooks(hooks.afterExecute, {
|
|
369
|
+
...ctx,
|
|
370
|
+
loadExisting,
|
|
371
|
+
result: newModelResult,
|
|
372
|
+
});
|
|
373
|
+
},
|
|
374
|
+
],
|
|
375
|
+
afterCommit: [
|
|
376
|
+
async (ctx) => {
|
|
377
|
+
await invokeHooks(hooks.afterCommit, {
|
|
378
|
+
...ctx,
|
|
379
|
+
loadExisting,
|
|
380
|
+
result: newModelResult,
|
|
381
|
+
});
|
|
382
|
+
},
|
|
383
|
+
],
|
|
384
|
+
},
|
|
385
|
+
};
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* Configuration for defining a nested one-to-many relationship field.
|
|
392
|
+
*
|
|
393
|
+
* One-to-many fields represent a collection of related entities that are synchronized
|
|
394
|
+
* with the input array. The handler automatically:
|
|
395
|
+
* - Creates new items without unique identifiers
|
|
396
|
+
* - Updates existing items with unique identifiers
|
|
397
|
+
* - Deletes items not present in the input array
|
|
398
|
+
*
|
|
399
|
+
* @template TParentModelName - Parent model name
|
|
400
|
+
* @template TModelName - Child model name
|
|
401
|
+
* @template TRelationName - Relation field name on the child model
|
|
402
|
+
* @template TFields - Field definitions for each item in the collection
|
|
403
|
+
*/
|
|
404
|
+
export interface NestedOneToManyFieldConfig<
|
|
405
|
+
TParentModelName extends ModelPropName,
|
|
406
|
+
TModelName extends ModelPropName,
|
|
407
|
+
TRelationName extends RelationName<TModelName>,
|
|
408
|
+
TFields extends Record<string, AnyFieldDefinition>,
|
|
409
|
+
> {
|
|
410
|
+
/**
|
|
411
|
+
* Prisma model name of parent model
|
|
412
|
+
*/
|
|
413
|
+
parentModel: ParentModelConfig<TParentModelName>;
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Prisma model name of the child model
|
|
417
|
+
*/
|
|
418
|
+
model: TModelName;
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Relation name of the parent model from the child model
|
|
422
|
+
*/
|
|
423
|
+
relationName: TRelationName;
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Field definitions for the nested entity
|
|
427
|
+
*/
|
|
428
|
+
fields: TFields;
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Function to extract a unique where clause from the input data for a child item and
|
|
432
|
+
* the parent model.
|
|
433
|
+
* If it returns undefined, the item is considered a new item to be created.
|
|
434
|
+
*/
|
|
435
|
+
getWhereUnique: (
|
|
436
|
+
input: InferInput<TFields>,
|
|
437
|
+
originalModel: GetPayload<TParentModelName>,
|
|
438
|
+
) => WhereUniqueInput<TModelName> | undefined;
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Transform validated field data into final Prisma structure for a single item.
|
|
442
|
+
* The returned payload should not include the parent relation field, as it will be added automatically.
|
|
443
|
+
*/
|
|
444
|
+
buildData: (
|
|
445
|
+
data: {
|
|
446
|
+
create: InferFieldsCreateOutput<TFields> &
|
|
447
|
+
Record<TRelationName, { connect: WhereUniqueInput<TParentModelName> }>;
|
|
448
|
+
update: InferFieldsUpdateOutput<TFields>;
|
|
449
|
+
},
|
|
450
|
+
parentModel: GetPayload<TParentModelName>,
|
|
451
|
+
ctx: TransactionalOperationContext<
|
|
452
|
+
GetPayload<TModelName> | undefined,
|
|
453
|
+
{ hasResult: false }
|
|
454
|
+
>,
|
|
455
|
+
) =>
|
|
456
|
+
| Promise<{
|
|
457
|
+
create: CreateInput<TModelName>;
|
|
458
|
+
update: UpdateInput<TModelName>;
|
|
459
|
+
}>
|
|
460
|
+
| {
|
|
461
|
+
create: CreateInput<TModelName>;
|
|
462
|
+
update: UpdateInput<TModelName>;
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* Converts a Prisma `WhereUniqueInput` into a plain `WhereInput`.
|
|
468
|
+
*
|
|
469
|
+
* Compound unique constraints arrive as synthetic keys (e.g., `userId_role: { userId, role }`),
|
|
470
|
+
* while generic `where` filters need the flattened field structure. This normalization allows
|
|
471
|
+
* composing unique constraints with parent-level filters when constructing delete conditions
|
|
472
|
+
* in one-to-many relationships.
|
|
473
|
+
*
|
|
474
|
+
* @template TModelName - Prisma model name
|
|
475
|
+
* @param whereUnique - Unique filter returned by `getWhereUnique`, or undefined for new items
|
|
476
|
+
* @returns Normalized where filter or undefined if no usable fields exist
|
|
477
|
+
*
|
|
478
|
+
* @internal This function is used internally by nestedOneToManyField
|
|
479
|
+
*/
|
|
480
|
+
function expandWhereUnique<TModelName extends ModelPropName>(
|
|
481
|
+
whereUnique: WhereUniqueInput<TModelName> | undefined,
|
|
482
|
+
): WhereInput<TModelName> | undefined {
|
|
483
|
+
if (!whereUnique) return undefined;
|
|
484
|
+
|
|
485
|
+
const entries = Object.entries(whereUnique as Record<string, unknown>).filter(
|
|
486
|
+
([, value]) => value !== undefined && value !== null,
|
|
487
|
+
);
|
|
488
|
+
|
|
489
|
+
if (entries.length === 0) return undefined;
|
|
490
|
+
|
|
491
|
+
const [[key, value]] = entries;
|
|
492
|
+
|
|
493
|
+
if (typeof value === 'object' && !Array.isArray(value)) {
|
|
494
|
+
return value as WhereInput<TModelName>;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
return { [key]: value as unknown } as WhereInput<TModelName>;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* Creates a nested one-to-many relationship field handler.
|
|
502
|
+
*
|
|
503
|
+
* This helper manages collections of child entities by synchronizing them with the input array.
|
|
504
|
+
* The synchronization logic:
|
|
505
|
+
* - **Update**: Items with unique identifiers (from `getWhereUnique`) are updated
|
|
506
|
+
* - **Create**: Items without unique identifiers are created as new records
|
|
507
|
+
* - **Delete**: Existing items not present in the input array are removed
|
|
508
|
+
* - **No Change**: Passing `undefined` leaves the collection unchanged
|
|
509
|
+
*
|
|
510
|
+
* All operations are performed atomically within the parent operation's transaction,
|
|
511
|
+
* ensuring data consistency even if the operation fails.
|
|
512
|
+
*
|
|
513
|
+
* @template TParentModelName - Parent model name
|
|
514
|
+
* @template TModelName - Child model name
|
|
515
|
+
* @template TRelationName - Relation field name on child model
|
|
516
|
+
* @template TFields - Field definitions for each child item
|
|
517
|
+
* @param config - Configuration object for the one-to-many relationship
|
|
518
|
+
* @returns Field definition for use in `defineCreateOperation` or `defineUpdateOperation`
|
|
519
|
+
*
|
|
520
|
+
* @example
|
|
521
|
+
* ```typescript
|
|
522
|
+
* const fields = {
|
|
523
|
+
* images: nestedOneToManyField({
|
|
524
|
+
* parentModel: createParentModelConfig('user', (user) => ({ id: user.id })),
|
|
525
|
+
* model: 'userImage',
|
|
526
|
+
* relationName: 'user',
|
|
527
|
+
* fields: {
|
|
528
|
+
* id: scalarField(z.string()),
|
|
529
|
+
* caption: scalarField(z.string()),
|
|
530
|
+
* },
|
|
531
|
+
* getWhereUnique: (input) => input.id ? { id: input.id } : undefined,
|
|
532
|
+
* buildData: (data) => ({
|
|
533
|
+
* create: { caption: data.caption },
|
|
534
|
+
* update: { caption: data.caption },
|
|
535
|
+
* }),
|
|
536
|
+
* }),
|
|
537
|
+
* };
|
|
538
|
+
*
|
|
539
|
+
* // Create user with images
|
|
540
|
+
* await createUser({
|
|
541
|
+
* data: {
|
|
542
|
+
* name: 'John',
|
|
543
|
+
* images: [
|
|
544
|
+
* { caption: 'First image' },
|
|
545
|
+
* { caption: 'Second image' },
|
|
546
|
+
* ],
|
|
547
|
+
* },
|
|
548
|
+
* context: ctx,
|
|
549
|
+
* });
|
|
550
|
+
*
|
|
551
|
+
* // Update user images (creates new, updates existing, deletes removed)
|
|
552
|
+
* await updateUser({
|
|
553
|
+
* where: { id: userId },
|
|
554
|
+
* data: {
|
|
555
|
+
* images: [
|
|
556
|
+
* { id: 'img-1', caption: 'Updated caption' }, // Updates existing
|
|
557
|
+
* { caption: 'New image' }, // Creates new
|
|
558
|
+
* // img-2 not in array, will be deleted
|
|
559
|
+
* ],
|
|
560
|
+
* },
|
|
561
|
+
* context: ctx,
|
|
562
|
+
* });
|
|
563
|
+
* ```
|
|
564
|
+
*/
|
|
565
|
+
export function nestedOneToManyField<
|
|
566
|
+
TParentModelName extends ModelPropName,
|
|
567
|
+
TModelName extends ModelPropName,
|
|
568
|
+
TRelationName extends RelationName<TModelName>,
|
|
569
|
+
TFields extends Record<string, AnyFieldDefinition>,
|
|
570
|
+
>(
|
|
571
|
+
config: NestedOneToManyFieldConfig<
|
|
572
|
+
TParentModelName,
|
|
573
|
+
TModelName,
|
|
574
|
+
TRelationName,
|
|
575
|
+
TFields
|
|
576
|
+
>,
|
|
577
|
+
): FieldDefinition<
|
|
578
|
+
z.ZodOptional<z.ZodArray<InferInputSchema<TFields>>>,
|
|
579
|
+
undefined,
|
|
580
|
+
undefined | { deleteMany: Record<never, never> }
|
|
581
|
+
> {
|
|
582
|
+
const getWhereUnique = (
|
|
583
|
+
input: InferInput<TFields>,
|
|
584
|
+
originalModel: GetPayload<TParentModelName>,
|
|
585
|
+
): WhereUniqueInput<TModelName> | undefined => {
|
|
586
|
+
const whereUnique = config.getWhereUnique(input, originalModel);
|
|
587
|
+
if (whereUnique && Object.values(whereUnique).includes(undefined)) {
|
|
588
|
+
throw new Error(
|
|
589
|
+
'getWhereUnique cannot return any undefined values in the object',
|
|
590
|
+
);
|
|
591
|
+
}
|
|
592
|
+
return whereUnique;
|
|
593
|
+
};
|
|
594
|
+
|
|
595
|
+
return {
|
|
596
|
+
schema: generateCreateSchema(config.fields).array().optional(),
|
|
597
|
+
processInput: async (value, processCtx) => {
|
|
598
|
+
const { serviceContext, loadExisting } = processCtx;
|
|
599
|
+
|
|
600
|
+
if (value === undefined) {
|
|
601
|
+
return { data: { create: undefined, update: undefined } };
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
const existingModel = (await loadExisting()) as
|
|
605
|
+
| GetPayload<TParentModelName>
|
|
606
|
+
| undefined;
|
|
607
|
+
|
|
608
|
+
// Filter objects that relate to parent model only
|
|
609
|
+
const whereFromOriginalModel = existingModel && {
|
|
610
|
+
[config.relationName]: expandWhereUnique(
|
|
611
|
+
config.parentModel.getWhereUnique(existingModel),
|
|
612
|
+
),
|
|
613
|
+
};
|
|
614
|
+
// Handle list of items
|
|
615
|
+
const delegate = makeGenericPrismaDelegate(prisma, config.model);
|
|
616
|
+
|
|
617
|
+
const cachedLoadExisting = value.map((itemInput) => {
|
|
618
|
+
let cachedExisting: GetPayload<TModelName> | undefined;
|
|
619
|
+
const whereUnique =
|
|
620
|
+
existingModel && getWhereUnique(itemInput, existingModel);
|
|
621
|
+
|
|
622
|
+
return async (): Promise<GetPayload<TModelName> | undefined> => {
|
|
623
|
+
if (cachedExisting) return cachedExisting;
|
|
624
|
+
if (!whereUnique) return undefined;
|
|
625
|
+
cachedExisting =
|
|
626
|
+
(await delegate.findUnique({
|
|
627
|
+
where: { ...whereUnique, ...whereFromOriginalModel },
|
|
628
|
+
})) ?? undefined;
|
|
629
|
+
return cachedExisting;
|
|
630
|
+
};
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
const processedItems = await Promise.all(
|
|
634
|
+
value.map(async (itemInput, idx) => {
|
|
635
|
+
const whereUnique =
|
|
636
|
+
existingModel && config.getWhereUnique(itemInput, existingModel);
|
|
637
|
+
|
|
638
|
+
const { data, hooks } = await transformFields(
|
|
639
|
+
config.fields,
|
|
640
|
+
itemInput,
|
|
641
|
+
{
|
|
642
|
+
serviceContext,
|
|
643
|
+
operation: 'upsert',
|
|
644
|
+
allowOptionalFields: false,
|
|
645
|
+
loadExisting: cachedLoadExisting[idx] as () => Promise<
|
|
646
|
+
object | undefined
|
|
647
|
+
>,
|
|
648
|
+
},
|
|
649
|
+
);
|
|
650
|
+
|
|
651
|
+
return { whereUnique, data, hooks };
|
|
652
|
+
}),
|
|
653
|
+
);
|
|
654
|
+
|
|
655
|
+
const beforeExecuteHook = async (
|
|
656
|
+
ctx: TransactionalOperationContext<
|
|
657
|
+
GetPayload<TParentModelName>,
|
|
658
|
+
{ hasResult: false }
|
|
659
|
+
>,
|
|
660
|
+
): Promise<void> => {
|
|
661
|
+
await Promise.all(
|
|
662
|
+
processedItems.map((item, idx) =>
|
|
663
|
+
invokeHooks(item.hooks.beforeExecute, {
|
|
664
|
+
...ctx,
|
|
665
|
+
loadExisting: cachedLoadExisting[idx],
|
|
666
|
+
}),
|
|
667
|
+
),
|
|
668
|
+
);
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
const results: (GetPayload<TModelName> | undefined)[] = Array.from(
|
|
672
|
+
{ length: value.length },
|
|
673
|
+
() => undefined,
|
|
674
|
+
);
|
|
675
|
+
const afterExecuteHook = async (
|
|
676
|
+
ctx: TransactionalOperationContext<
|
|
677
|
+
GetPayload<TParentModelName>,
|
|
678
|
+
{ hasResult: true }
|
|
679
|
+
>,
|
|
680
|
+
): Promise<void> => {
|
|
681
|
+
const prismaDelegate = makeGenericPrismaDelegate(ctx.tx, config.model);
|
|
682
|
+
|
|
683
|
+
// Delete items not in the input
|
|
684
|
+
if (whereFromOriginalModel) {
|
|
685
|
+
const keepFilters = processedItems
|
|
686
|
+
.map((item) => expandWhereUnique(item.whereUnique))
|
|
687
|
+
.filter(
|
|
688
|
+
(where): where is WhereInput<TModelName> => where !== undefined,
|
|
689
|
+
)
|
|
690
|
+
.map((where) => ({ NOT: where }));
|
|
691
|
+
|
|
692
|
+
const deleteWhere =
|
|
693
|
+
keepFilters.length === 0
|
|
694
|
+
? whereFromOriginalModel
|
|
695
|
+
: ({
|
|
696
|
+
AND: [whereFromOriginalModel, ...keepFilters],
|
|
697
|
+
} as WhereInput<TModelName>);
|
|
698
|
+
|
|
699
|
+
await prismaDelegate.deleteMany({ where: deleteWhere });
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
// Upsert items
|
|
703
|
+
await Promise.all(
|
|
704
|
+
processedItems.map(async (item, idx) => {
|
|
705
|
+
const awaitedData =
|
|
706
|
+
typeof item.data === 'function'
|
|
707
|
+
? await item.data(ctx.tx)
|
|
708
|
+
: item.data;
|
|
709
|
+
|
|
710
|
+
const parentWhereUnique = config.parentModel.getWhereUnique(
|
|
711
|
+
ctx.result,
|
|
712
|
+
);
|
|
713
|
+
|
|
714
|
+
const builtData = await config.buildData(
|
|
715
|
+
{
|
|
716
|
+
create: {
|
|
717
|
+
...awaitedData.create,
|
|
718
|
+
...({
|
|
719
|
+
[config.relationName]: { connect: parentWhereUnique },
|
|
720
|
+
} as Record<
|
|
721
|
+
TRelationName,
|
|
722
|
+
{ connect: WhereUniqueInput<TParentModelName> }
|
|
723
|
+
>),
|
|
724
|
+
},
|
|
725
|
+
update: awaitedData.update,
|
|
726
|
+
},
|
|
727
|
+
ctx.result,
|
|
728
|
+
{
|
|
729
|
+
...ctx,
|
|
730
|
+
operation: item.whereUnique ? 'update' : 'create',
|
|
731
|
+
loadExisting: cachedLoadExisting[idx],
|
|
732
|
+
result: undefined,
|
|
733
|
+
},
|
|
734
|
+
);
|
|
735
|
+
|
|
736
|
+
results[idx] = item.whereUnique
|
|
737
|
+
? await prismaDelegate.upsert({
|
|
738
|
+
where: item.whereUnique,
|
|
739
|
+
create: builtData.create,
|
|
740
|
+
update: builtData.update,
|
|
741
|
+
})
|
|
742
|
+
: await prismaDelegate.create({
|
|
743
|
+
data: builtData.create,
|
|
744
|
+
});
|
|
745
|
+
|
|
746
|
+
await invokeHooks(item.hooks.afterExecute, {
|
|
747
|
+
...ctx,
|
|
748
|
+
result: results[idx],
|
|
749
|
+
loadExisting: cachedLoadExisting[idx],
|
|
750
|
+
});
|
|
751
|
+
}),
|
|
752
|
+
);
|
|
753
|
+
};
|
|
754
|
+
|
|
755
|
+
const afterCommitHook = async (
|
|
756
|
+
ctx: OperationContext<
|
|
757
|
+
GetPayload<TParentModelName>,
|
|
758
|
+
{ hasResult: true }
|
|
759
|
+
>,
|
|
760
|
+
): Promise<void> => {
|
|
761
|
+
await Promise.all(
|
|
762
|
+
processedItems.map((item, idx) =>
|
|
763
|
+
invokeHooks(item.hooks.afterCommit, {
|
|
764
|
+
...ctx,
|
|
765
|
+
result: results[idx],
|
|
766
|
+
loadExisting: cachedLoadExisting[idx],
|
|
767
|
+
}),
|
|
768
|
+
),
|
|
769
|
+
);
|
|
770
|
+
};
|
|
771
|
+
|
|
772
|
+
return {
|
|
773
|
+
data: {},
|
|
774
|
+
hooks: {
|
|
775
|
+
beforeExecute: [beforeExecuteHook],
|
|
776
|
+
afterExecute: [afterExecuteHook],
|
|
777
|
+
afterCommit: [afterCommitHook],
|
|
778
|
+
},
|
|
779
|
+
};
|
|
780
|
+
},
|
|
781
|
+
};
|
|
782
|
+
}
|