@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.
Files changed (431) hide show
  1. package/dist/constants/fastify-packages.d.ts +12 -11
  2. package/dist/constants/fastify-packages.d.ts.map +1 -1
  3. package/dist/constants/fastify-packages.js +12 -11
  4. package/dist/constants/fastify-packages.js.map +1 -1
  5. package/dist/generators/auth/auth-context/generated/ts-import-providers.d.ts +1 -2
  6. package/dist/generators/auth/auth-context/generated/ts-import-providers.d.ts.map +1 -1
  7. package/dist/generators/auth/auth-context/generated/ts-import-providers.js +1 -1
  8. package/dist/generators/auth/auth-context/generated/ts-import-providers.js.map +1 -1
  9. package/dist/generators/auth/auth-roles/generated/ts-import-providers.d.ts +1 -2
  10. package/dist/generators/auth/auth-roles/generated/ts-import-providers.d.ts.map +1 -1
  11. package/dist/generators/auth/auth-roles/generated/ts-import-providers.js +1 -1
  12. package/dist/generators/auth/auth-roles/generated/ts-import-providers.js.map +1 -1
  13. package/dist/generators/auth/index.d.ts +0 -1
  14. package/dist/generators/auth/index.d.ts.map +1 -1
  15. package/dist/generators/auth/index.js +0 -1
  16. package/dist/generators/auth/index.js.map +1 -1
  17. package/dist/generators/auth/password-hasher-service/generated/ts-import-providers.d.ts +1 -2
  18. package/dist/generators/auth/password-hasher-service/generated/ts-import-providers.d.ts.map +1 -1
  19. package/dist/generators/auth/password-hasher-service/generated/ts-import-providers.js +1 -1
  20. package/dist/generators/auth/password-hasher-service/generated/ts-import-providers.js.map +1 -1
  21. package/dist/generators/auth/user-session-types/generated/ts-import-providers.d.ts +1 -2
  22. package/dist/generators/auth/user-session-types/generated/ts-import-providers.d.ts.map +1 -1
  23. package/dist/generators/auth/user-session-types/generated/ts-import-providers.js +1 -1
  24. package/dist/generators/auth/user-session-types/generated/ts-import-providers.js.map +1 -1
  25. package/dist/generators/bull/bull-mq/generated/ts-import-providers.d.ts +1 -2
  26. package/dist/generators/bull/bull-mq/generated/ts-import-providers.d.ts.map +1 -1
  27. package/dist/generators/bull/bull-mq/generated/ts-import-providers.js +1 -1
  28. package/dist/generators/bull/bull-mq/generated/ts-import-providers.js.map +1 -1
  29. package/dist/generators/core/app-module-setup/generated/ts-import-providers.d.ts +1 -2
  30. package/dist/generators/core/app-module-setup/generated/ts-import-providers.d.ts.map +1 -1
  31. package/dist/generators/core/app-module-setup/generated/ts-import-providers.js +1 -1
  32. package/dist/generators/core/app-module-setup/generated/ts-import-providers.js.map +1 -1
  33. package/dist/generators/core/axios/generated/ts-import-providers.d.ts +1 -2
  34. package/dist/generators/core/axios/generated/ts-import-providers.d.ts.map +1 -1
  35. package/dist/generators/core/axios/generated/ts-import-providers.js +3 -1
  36. package/dist/generators/core/axios/generated/ts-import-providers.js.map +1 -1
  37. package/dist/generators/core/config-service/generated/ts-import-providers.d.ts +1 -2
  38. package/dist/generators/core/config-service/generated/ts-import-providers.d.ts.map +1 -1
  39. package/dist/generators/core/config-service/generated/ts-import-providers.js +3 -1
  40. package/dist/generators/core/config-service/generated/ts-import-providers.js.map +1 -1
  41. package/dist/generators/core/error-handler-service/generated/ts-import-providers.d.ts +1 -2
  42. package/dist/generators/core/error-handler-service/generated/ts-import-providers.d.ts.map +1 -1
  43. package/dist/generators/core/error-handler-service/generated/ts-import-providers.js +1 -1
  44. package/dist/generators/core/error-handler-service/generated/ts-import-providers.js.map +1 -1
  45. package/dist/generators/core/fastify/fastify.generator.js +1 -1
  46. package/dist/generators/core/fastify/fastify.generator.js.map +1 -1
  47. package/dist/generators/core/fastify-redis/generated/ts-import-providers.d.ts +1 -2
  48. package/dist/generators/core/fastify-redis/generated/ts-import-providers.d.ts.map +1 -1
  49. package/dist/generators/core/fastify-redis/generated/ts-import-providers.js +1 -1
  50. package/dist/generators/core/fastify-redis/generated/ts-import-providers.js.map +1 -1
  51. package/dist/generators/core/fastify-sentry/fastify-sentry.generator.js +1 -1
  52. package/dist/generators/core/fastify-sentry/generated/ts-import-providers.d.ts +1 -2
  53. package/dist/generators/core/fastify-sentry/generated/ts-import-providers.d.ts.map +1 -1
  54. package/dist/generators/core/fastify-sentry/generated/ts-import-providers.js +1 -1
  55. package/dist/generators/core/fastify-sentry/generated/ts-import-providers.js.map +1 -1
  56. package/dist/generators/core/logger-service/generated/ts-import-providers.d.ts +1 -2
  57. package/dist/generators/core/logger-service/generated/ts-import-providers.d.ts.map +1 -1
  58. package/dist/generators/core/logger-service/generated/ts-import-providers.js +3 -1
  59. package/dist/generators/core/logger-service/generated/ts-import-providers.js.map +1 -1
  60. package/dist/generators/core/readme/templates/package/README.md +4 -4
  61. package/dist/generators/core/request-context/generated/ts-import-providers.d.ts +1 -2
  62. package/dist/generators/core/request-context/generated/ts-import-providers.d.ts.map +1 -1
  63. package/dist/generators/core/request-context/generated/ts-import-providers.js +1 -1
  64. package/dist/generators/core/request-context/generated/ts-import-providers.js.map +1 -1
  65. package/dist/generators/core/request-service-context/generated/ts-import-providers.d.ts +1 -2
  66. package/dist/generators/core/request-service-context/generated/ts-import-providers.d.ts.map +1 -1
  67. package/dist/generators/core/request-service-context/generated/ts-import-providers.js +1 -1
  68. package/dist/generators/core/request-service-context/generated/ts-import-providers.js.map +1 -1
  69. package/dist/generators/core/service-context/generated/ts-import-providers.d.ts +1 -2
  70. package/dist/generators/core/service-context/generated/ts-import-providers.d.ts.map +1 -1
  71. package/dist/generators/core/service-context/generated/ts-import-providers.js +1 -1
  72. package/dist/generators/core/service-context/generated/ts-import-providers.js.map +1 -1
  73. package/dist/generators/core/service-file/service-file.generator.d.ts +7 -0
  74. package/dist/generators/core/service-file/service-file.generator.d.ts.map +1 -1
  75. package/dist/generators/core/service-file/service-file.generator.js +12 -2
  76. package/dist/generators/core/service-file/service-file.generator.js.map +1 -1
  77. package/dist/generators/pothos/pothos/generated/index.d.ts +3 -1
  78. package/dist/generators/pothos/pothos/generated/index.d.ts.map +1 -1
  79. package/dist/generators/pothos/pothos/generated/ts-import-providers.d.ts +1 -2
  80. package/dist/generators/pothos/pothos/generated/ts-import-providers.d.ts.map +1 -1
  81. package/dist/generators/pothos/pothos/generated/ts-import-providers.js +1 -1
  82. package/dist/generators/pothos/pothos/generated/ts-import-providers.js.map +1 -1
  83. package/dist/generators/pothos/pothos/generated/typed-templates.d.ts +6 -2
  84. package/dist/generators/pothos/pothos/generated/typed-templates.d.ts.map +1 -1
  85. package/dist/generators/pothos/pothos/generated/typed-templates.js +1 -0
  86. package/dist/generators/pothos/pothos/generated/typed-templates.js.map +1 -1
  87. package/dist/generators/pothos/pothos/pothos.generator.d.ts +3 -3
  88. package/dist/generators/pothos/pothos/pothos.generator.d.ts.map +1 -1
  89. package/dist/generators/pothos/pothos/pothos.generator.js +4 -0
  90. package/dist/generators/pothos/pothos/pothos.generator.js.map +1 -1
  91. package/dist/generators/pothos/pothos/templates/src/plugins/graphql/FieldWithInputPayloadPlugin/global-types.ts +3 -5
  92. package/dist/generators/pothos/pothos/templates/src/plugins/graphql/FieldWithInputPayloadPlugin/schema-builder.ts +9 -4
  93. package/dist/generators/pothos/pothos/templates/src/plugins/graphql/FieldWithInputPayloadPlugin/types.ts +6 -1
  94. package/dist/generators/pothos/pothos-auth/pothos-auth.generator.d.ts +1 -1
  95. package/dist/generators/pothos/pothos-enums-file/pothos-enums-file.generator.d.ts +1 -1
  96. package/dist/generators/pothos/pothos-prisma/generated/index.d.ts +36 -0
  97. package/dist/generators/pothos/pothos-prisma/generated/index.d.ts.map +1 -0
  98. package/dist/generators/pothos/pothos-prisma/generated/index.js +11 -0
  99. package/dist/generators/pothos/pothos-prisma/generated/index.js.map +1 -0
  100. package/dist/generators/pothos/pothos-prisma/generated/template-paths.d.ts +12 -0
  101. package/dist/generators/pothos/pothos-prisma/generated/template-paths.d.ts.map +1 -0
  102. package/dist/generators/pothos/pothos-prisma/generated/template-paths.js +22 -0
  103. package/dist/generators/pothos/pothos-prisma/generated/template-paths.js.map +1 -0
  104. package/dist/generators/pothos/pothos-prisma/generated/template-renderers.d.ts +18 -0
  105. package/dist/generators/pothos/pothos-prisma/generated/template-renderers.d.ts.map +1 -0
  106. package/dist/generators/pothos/pothos-prisma/generated/template-renderers.js +34 -0
  107. package/dist/generators/pothos/pothos-prisma/generated/template-renderers.js.map +1 -0
  108. package/dist/generators/pothos/pothos-prisma/generated/ts-import-providers.d.ts +30 -0
  109. package/dist/generators/pothos/pothos-prisma/generated/ts-import-providers.d.ts.map +1 -0
  110. package/dist/generators/pothos/pothos-prisma/generated/ts-import-providers.js +30 -0
  111. package/dist/generators/pothos/pothos-prisma/generated/ts-import-providers.js.map +1 -0
  112. package/dist/generators/pothos/pothos-prisma/generated/typed-templates.d.ts +4 -0
  113. package/dist/generators/pothos/pothos-prisma/generated/typed-templates.d.ts.map +1 -0
  114. package/dist/generators/pothos/pothos-prisma/generated/typed-templates.js +14 -0
  115. package/dist/generators/pothos/pothos-prisma/generated/typed-templates.js.map +1 -0
  116. package/dist/generators/pothos/pothos-prisma/index.d.ts +2 -0
  117. package/dist/generators/pothos/pothos-prisma/index.d.ts.map +1 -1
  118. package/dist/generators/pothos/pothos-prisma/index.js +1 -0
  119. package/dist/generators/pothos/pothos-prisma/index.js.map +1 -1
  120. package/dist/generators/pothos/pothos-prisma/pothos-prisma.generator.d.ts +34 -1
  121. package/dist/generators/pothos/pothos-prisma/pothos-prisma.generator.d.ts.map +1 -1
  122. package/dist/generators/pothos/pothos-prisma/pothos-prisma.generator.js +20 -6
  123. package/dist/generators/pothos/pothos-prisma/pothos-prisma.generator.js.map +1 -1
  124. package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.d.ts +2 -2
  125. package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.d.ts.map +1 -1
  126. package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.js +87 -50
  127. package/dist/generators/pothos/pothos-prisma-crud-mutation/pothos-prisma-crud-mutation.generator.js.map +1 -1
  128. package/dist/generators/pothos/pothos-scalar/generated/index.d.ts +9 -39
  129. package/dist/generators/pothos/pothos-scalar/generated/index.d.ts.map +1 -1
  130. package/dist/generators/pothos/pothos-scalar/generated/template-paths.d.ts +2 -0
  131. package/dist/generators/pothos/pothos-scalar/generated/template-paths.d.ts.map +1 -1
  132. package/dist/generators/pothos/pothos-scalar/generated/template-paths.js +2 -0
  133. package/dist/generators/pothos/pothos-scalar/generated/template-paths.js.map +1 -1
  134. package/dist/generators/pothos/pothos-scalar/generated/template-renderers.d.ts +6 -10
  135. package/dist/generators/pothos/pothos-scalar/generated/template-renderers.d.ts.map +1 -1
  136. package/dist/generators/pothos/pothos-scalar/generated/template-renderers.js +21 -6
  137. package/dist/generators/pothos/pothos-scalar/generated/template-renderers.js.map +1 -1
  138. package/dist/generators/pothos/pothos-scalar/generated/typed-templates.d.ts +9 -29
  139. package/dist/generators/pothos/pothos-scalar/generated/typed-templates.d.ts.map +1 -1
  140. package/dist/generators/pothos/pothos-scalar/generated/typed-templates.js +28 -14
  141. package/dist/generators/pothos/pothos-scalar/generated/typed-templates.js.map +1 -1
  142. package/dist/generators/pothos/pothos-scalar/pothos-scalar.generator.d.ts +2 -12
  143. package/dist/generators/pothos/pothos-scalar/pothos-scalar.generator.d.ts.map +1 -1
  144. package/dist/generators/pothos/pothos-scalar/pothos-scalar.generator.js +35 -11
  145. package/dist/generators/pothos/pothos-scalar/pothos-scalar.generator.js.map +1 -1
  146. package/dist/generators/pothos/pothos-scalar/templates/module/scalars/date-time.ts +21 -28
  147. package/dist/generators/pothos/pothos-scalar/templates/module/scalars/date.ts +13 -45
  148. package/dist/generators/pothos/pothos-scalar/templates/module/scalars/json-object.ts +28 -0
  149. package/dist/generators/pothos/pothos-scalar/templates/module/scalars/json.ts +23 -0
  150. package/dist/generators/pothos/pothos-scalar/templates/module/scalars/uuid.ts +13 -31
  151. package/dist/generators/pothos/pothos-sentry/pothos-sentry.generator.d.ts +1 -1
  152. package/dist/generators/prisma/_providers/index.d.ts +2 -0
  153. package/dist/generators/prisma/_providers/index.d.ts.map +1 -0
  154. package/dist/generators/prisma/_providers/index.js +2 -0
  155. package/dist/generators/prisma/_providers/index.js.map +1 -0
  156. package/dist/generators/prisma/_providers/prisma-generated-imports.d.ts +15 -0
  157. package/dist/generators/prisma/_providers/prisma-generated-imports.d.ts.map +1 -0
  158. package/dist/generators/prisma/_providers/prisma-generated-imports.js +10 -0
  159. package/dist/generators/prisma/_providers/prisma-generated-imports.js.map +1 -0
  160. package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.d.ts +124 -0
  161. package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.d.ts.map +1 -0
  162. package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.js +137 -0
  163. package/dist/generators/prisma/_shared/build-data-helpers/generate-operation-callbacks.js.map +1 -0
  164. package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.d.ts +82 -0
  165. package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.d.ts.map +1 -0
  166. package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.js +215 -0
  167. package/dist/generators/prisma/_shared/build-data-helpers/generate-relation-build-data.js.map +1 -0
  168. package/dist/generators/prisma/_shared/build-data-helpers/index.d.ts +3 -0
  169. package/dist/generators/prisma/_shared/build-data-helpers/index.d.ts.map +1 -0
  170. package/dist/generators/prisma/_shared/build-data-helpers/index.js +3 -0
  171. package/dist/generators/prisma/_shared/build-data-helpers/index.js.map +1 -0
  172. package/dist/generators/prisma/_shared/crud-method/primary-key-input.d.ts +0 -9
  173. package/dist/generators/prisma/_shared/crud-method/primary-key-input.d.ts.map +1 -1
  174. package/dist/generators/prisma/_shared/crud-method/primary-key-input.js +0 -32
  175. package/dist/generators/prisma/_shared/crud-method/primary-key-input.js.map +1 -1
  176. package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.d.ts +26 -0
  177. package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.d.ts.map +1 -0
  178. package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.js +47 -0
  179. package/dist/generators/prisma/_shared/field-definition-generators/generate-scalar-input-field.js.map +1 -0
  180. package/dist/generators/prisma/_shared/field-definition-generators/types.d.ts +8 -0
  181. package/dist/generators/prisma/_shared/field-definition-generators/types.d.ts.map +1 -0
  182. package/dist/generators/prisma/_shared/field-definition-generators/types.js +2 -0
  183. package/dist/generators/prisma/_shared/field-definition-generators/types.js.map +1 -0
  184. package/dist/generators/prisma/data-utils/data-utils.generator.d.ts +109 -0
  185. package/dist/generators/prisma/data-utils/data-utils.generator.d.ts.map +1 -0
  186. package/dist/generators/prisma/data-utils/data-utils.generator.js +32 -0
  187. package/dist/generators/prisma/data-utils/data-utils.generator.js.map +1 -0
  188. package/dist/generators/prisma/data-utils/generated/index.d.ts +190 -0
  189. package/dist/generators/prisma/data-utils/generated/index.d.ts.map +1 -0
  190. package/dist/generators/prisma/data-utils/generated/index.js +11 -0
  191. package/dist/generators/prisma/data-utils/generated/index.js.map +1 -0
  192. package/dist/generators/prisma/data-utils/generated/template-paths.d.ts +17 -0
  193. package/dist/generators/prisma/data-utils/generated/template-paths.d.ts.map +1 -0
  194. package/dist/generators/prisma/data-utils/generated/template-paths.js +27 -0
  195. package/dist/generators/prisma/data-utils/generated/template-paths.js.map +1 -0
  196. package/dist/generators/prisma/data-utils/generated/template-renderers.d.ts +45 -0
  197. package/dist/generators/prisma/data-utils/generated/template-renderers.d.ts.map +1 -0
  198. package/dist/generators/prisma/data-utils/generated/template-renderers.js +47 -0
  199. package/dist/generators/prisma/data-utils/generated/template-renderers.js.map +1 -0
  200. package/dist/generators/prisma/data-utils/generated/ts-import-providers.d.ts +183 -0
  201. package/dist/generators/prisma/data-utils/generated/ts-import-providers.d.ts.map +1 -0
  202. package/dist/generators/prisma/data-utils/generated/ts-import-providers.js +72 -0
  203. package/dist/generators/prisma/data-utils/generated/ts-import-providers.js.map +1 -0
  204. package/dist/generators/prisma/data-utils/generated/typed-templates.d.ts +157 -0
  205. package/dist/generators/prisma/data-utils/generated/typed-templates.d.ts.map +1 -0
  206. package/dist/generators/prisma/data-utils/generated/typed-templates.js +125 -0
  207. package/dist/generators/prisma/data-utils/generated/typed-templates.js.map +1 -0
  208. package/dist/generators/prisma/data-utils/index.d.ts +4 -0
  209. package/dist/generators/prisma/data-utils/index.d.ts.map +1 -0
  210. package/dist/generators/prisma/data-utils/index.js +3 -0
  211. package/dist/generators/prisma/data-utils/index.js.map +1 -0
  212. package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/define-operations.ts +1030 -0
  213. package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/field-definitions.ts +782 -0
  214. package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prisma-types.ts +164 -0
  215. package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/prisma-utils.ts +80 -0
  216. package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/relation-helpers.ts +196 -0
  217. package/dist/generators/prisma/data-utils/templates/src/utils/data-operations/types.ts +372 -0
  218. package/dist/generators/prisma/index.d.ts +7 -6
  219. package/dist/generators/prisma/index.d.ts.map +1 -1
  220. package/dist/generators/prisma/index.js +7 -6
  221. package/dist/generators/prisma/index.js.map +1 -1
  222. package/dist/generators/prisma/prisma/generated/index.d.ts +22 -1
  223. package/dist/generators/prisma/prisma/generated/index.d.ts.map +1 -1
  224. package/dist/generators/prisma/prisma/generated/template-paths.d.ts +2 -0
  225. package/dist/generators/prisma/prisma/generated/template-paths.d.ts.map +1 -1
  226. package/dist/generators/prisma/prisma/generated/template-paths.js +3 -0
  227. package/dist/generators/prisma/prisma/generated/template-paths.js.map +1 -1
  228. package/dist/generators/prisma/prisma/generated/template-renderers.d.ts +10 -1
  229. package/dist/generators/prisma/prisma/generated/template-renderers.d.ts.map +1 -1
  230. package/dist/generators/prisma/prisma/generated/template-renderers.js +21 -1
  231. package/dist/generators/prisma/prisma/generated/template-renderers.js.map +1 -1
  232. package/dist/generators/prisma/prisma/generated/ts-import-providers.d.ts +7 -2
  233. package/dist/generators/prisma/prisma/generated/ts-import-providers.d.ts.map +1 -1
  234. package/dist/generators/prisma/prisma/generated/ts-import-providers.js +12 -2
  235. package/dist/generators/prisma/prisma/generated/ts-import-providers.js.map +1 -1
  236. package/dist/generators/prisma/prisma/generated/typed-templates.d.ts +16 -1
  237. package/dist/generators/prisma/prisma/generated/typed-templates.d.ts.map +1 -1
  238. package/dist/generators/prisma/prisma/generated/typed-templates.js +28 -2
  239. package/dist/generators/prisma/prisma/generated/typed-templates.js.map +1 -1
  240. package/dist/generators/prisma/prisma/prisma.generator.d.ts +30 -1
  241. package/dist/generators/prisma/prisma/prisma.generator.d.ts.map +1 -1
  242. package/dist/generators/prisma/prisma/prisma.generator.js +55 -13
  243. package/dist/generators/prisma/prisma/prisma.generator.js.map +1 -1
  244. package/dist/generators/prisma/prisma/templates/package/prisma.config.mts +17 -0
  245. package/dist/generators/prisma/prisma/templates/src/services/prisma.ts +5 -2
  246. package/dist/generators/prisma/prisma-data-create/index.d.ts +2 -0
  247. package/dist/generators/prisma/prisma-data-create/index.d.ts.map +1 -0
  248. package/dist/generators/prisma/prisma-data-create/index.js +2 -0
  249. package/dist/generators/prisma/prisma-data-create/index.js.map +1 -0
  250. package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.d.ts +73 -0
  251. package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.d.ts.map +1 -0
  252. package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.js +102 -0
  253. package/dist/generators/prisma/prisma-data-create/prisma-data-create.generator.js.map +1 -0
  254. package/dist/generators/prisma/prisma-data-delete/index.d.ts +2 -0
  255. package/dist/generators/prisma/prisma-data-delete/index.d.ts.map +1 -0
  256. package/dist/generators/prisma/prisma-data-delete/index.js +2 -0
  257. package/dist/generators/prisma/prisma-data-delete/index.js.map +1 -0
  258. package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.d.ts +72 -0
  259. package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.d.ts.map +1 -0
  260. package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.js +82 -0
  261. package/dist/generators/prisma/prisma-data-delete/prisma-data-delete.generator.js.map +1 -0
  262. package/dist/generators/prisma/prisma-data-nested-field/index.d.ts +2 -0
  263. package/dist/generators/prisma/prisma-data-nested-field/index.d.ts.map +1 -0
  264. package/dist/generators/prisma/prisma-data-nested-field/index.js +2 -0
  265. package/dist/generators/prisma/prisma-data-nested-field/index.js.map +1 -0
  266. package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.d.ts +16 -0
  267. package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.d.ts.map +1 -0
  268. package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.js +179 -0
  269. package/dist/generators/prisma/prisma-data-nested-field/nested-field-writer.js.map +1 -0
  270. package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.d.ts +95 -0
  271. package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.d.ts.map +1 -0
  272. package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.js +120 -0
  273. package/dist/generators/prisma/prisma-data-nested-field/prisma-data-nested-field.generator.js.map +1 -0
  274. package/dist/generators/prisma/prisma-data-service/index.d.ts +2 -0
  275. package/dist/generators/prisma/prisma-data-service/index.d.ts.map +1 -0
  276. package/dist/generators/prisma/prisma-data-service/index.js +2 -0
  277. package/dist/generators/prisma/prisma-data-service/index.js.map +1 -0
  278. package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.d.ts +117 -0
  279. package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.d.ts.map +1 -0
  280. package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.js +127 -0
  281. package/dist/generators/prisma/prisma-data-service/prisma-data-service.generator.js.map +1 -0
  282. package/dist/generators/prisma/prisma-data-update/index.d.ts +2 -0
  283. package/dist/generators/prisma/prisma-data-update/index.d.ts.map +1 -0
  284. package/dist/generators/prisma/prisma-data-update/index.js +2 -0
  285. package/dist/generators/prisma/prisma-data-update/index.js.map +1 -0
  286. package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.d.ts +73 -0
  287. package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.d.ts.map +1 -0
  288. package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.js +114 -0
  289. package/dist/generators/prisma/prisma-data-update/prisma-data-update.generator.js.map +1 -0
  290. package/dist/generators/prisma/prisma-field/prisma-field.generator.d.ts +6 -6
  291. package/dist/generators/stripe/fastify-stripe/generated/ts-import-providers.d.ts +1 -2
  292. package/dist/generators/stripe/fastify-stripe/generated/ts-import-providers.d.ts.map +1 -1
  293. package/dist/generators/stripe/fastify-stripe/generated/ts-import-providers.js +1 -1
  294. package/dist/generators/stripe/fastify-stripe/generated/ts-import-providers.js.map +1 -1
  295. package/dist/generators/vitest/prisma-vitest/generated/index.d.ts +20 -1
  296. package/dist/generators/vitest/prisma-vitest/generated/index.d.ts.map +1 -1
  297. package/dist/generators/vitest/prisma-vitest/generated/template-renderers.d.ts +6 -0
  298. package/dist/generators/vitest/prisma-vitest/generated/template-renderers.d.ts.map +1 -1
  299. package/dist/generators/vitest/prisma-vitest/generated/template-renderers.js +7 -1
  300. package/dist/generators/vitest/prisma-vitest/generated/template-renderers.js.map +1 -1
  301. package/dist/generators/vitest/prisma-vitest/generated/ts-import-providers.d.ts +1 -2
  302. package/dist/generators/vitest/prisma-vitest/generated/ts-import-providers.d.ts.map +1 -1
  303. package/dist/generators/vitest/prisma-vitest/generated/ts-import-providers.js +1 -1
  304. package/dist/generators/vitest/prisma-vitest/generated/ts-import-providers.js.map +1 -1
  305. package/dist/generators/vitest/prisma-vitest/generated/typed-templates.d.ts +14 -1
  306. package/dist/generators/vitest/prisma-vitest/generated/typed-templates.d.ts.map +1 -1
  307. package/dist/generators/vitest/prisma-vitest/generated/typed-templates.js +8 -2
  308. package/dist/generators/vitest/prisma-vitest/generated/typed-templates.js.map +1 -1
  309. package/dist/generators/vitest/prisma-vitest/prisma-vitest.generator.d.ts +16 -0
  310. package/dist/generators/vitest/prisma-vitest/prisma-vitest.generator.d.ts.map +1 -1
  311. package/dist/generators/vitest/prisma-vitest/prisma-vitest.generator.js +5 -10
  312. package/dist/generators/vitest/prisma-vitest/prisma-vitest.generator.js.map +1 -1
  313. package/dist/generators/vitest/prisma-vitest/templates/src/tests/helpers/db.test-helper.ts +3 -2
  314. package/dist/generators/vitest/prisma-vitest/templates/src/tests/helpers/prisma.test-helper.ts +1 -1
  315. package/dist/types/field-types.d.ts +1 -1
  316. package/dist/types/field-types.d.ts.map +1 -1
  317. package/dist/types/field-types.js +2 -0
  318. package/dist/types/field-types.js.map +1 -1
  319. package/dist/types/service-dto-kinds.d.ts +59 -0
  320. package/dist/types/service-dto-kinds.d.ts.map +1 -0
  321. package/dist/types/service-dto-kinds.js +53 -0
  322. package/dist/types/service-dto-kinds.js.map +1 -0
  323. package/dist/types/service-output.d.ts +25 -2
  324. package/dist/types/service-output.d.ts.map +1 -1
  325. package/dist/types/service-output.js +22 -2
  326. package/dist/types/service-output.js.map +1 -1
  327. package/dist/writers/pothos/input-types.d.ts +1 -1
  328. package/dist/writers/pothos/input-types.d.ts.map +1 -1
  329. package/dist/writers/pothos/input-types.js +7 -10
  330. package/dist/writers/pothos/input-types.js.map +1 -1
  331. package/dist/writers/pothos/resolvers.d.ts.map +1 -1
  332. package/dist/writers/pothos/resolvers.js +9 -6
  333. package/dist/writers/pothos/resolvers.js.map +1 -1
  334. package/dist/writers/pothos/scalars.d.ts.map +1 -1
  335. package/dist/writers/pothos/scalars.js +5 -0
  336. package/dist/writers/pothos/scalars.js.map +1 -1
  337. package/dist/writers/prisma-schema/fields.d.ts +3 -0
  338. package/dist/writers/prisma-schema/fields.d.ts.map +1 -1
  339. package/dist/writers/prisma-schema/fields.js +1 -0
  340. package/dist/writers/prisma-schema/fields.js.map +1 -1
  341. package/package.json +8 -6
  342. package/dist/generators/auth/prisma-password-transformer/index.d.ts +0 -2
  343. package/dist/generators/auth/prisma-password-transformer/index.d.ts.map +0 -1
  344. package/dist/generators/auth/prisma-password-transformer/index.js +0 -2
  345. package/dist/generators/auth/prisma-password-transformer/index.js.map +0 -1
  346. package/dist/generators/auth/prisma-password-transformer/prisma-password-transformer.generator.d.ts +0 -12
  347. package/dist/generators/auth/prisma-password-transformer/prisma-password-transformer.generator.d.ts.map +0 -1
  348. package/dist/generators/auth/prisma-password-transformer/prisma-password-transformer.generator.js +0 -48
  349. package/dist/generators/auth/prisma-password-transformer/prisma-password-transformer.generator.js.map +0 -1
  350. package/dist/generators/prisma/_shared/crud-method/data-method.d.ts +0 -31
  351. package/dist/generators/prisma/_shared/crud-method/data-method.d.ts.map +0 -1
  352. package/dist/generators/prisma/_shared/crud-method/data-method.js +0 -195
  353. package/dist/generators/prisma/_shared/crud-method/data-method.js.map +0 -1
  354. package/dist/generators/prisma/embedded-relation-transformer/embedded-relation-transformer.generator.d.ts +0 -50
  355. package/dist/generators/prisma/embedded-relation-transformer/embedded-relation-transformer.generator.d.ts.map +0 -1
  356. package/dist/generators/prisma/embedded-relation-transformer/embedded-relation-transformer.generator.js +0 -371
  357. package/dist/generators/prisma/embedded-relation-transformer/embedded-relation-transformer.generator.js.map +0 -1
  358. package/dist/generators/prisma/embedded-relation-transformer/index.d.ts +0 -2
  359. package/dist/generators/prisma/embedded-relation-transformer/index.d.ts.map +0 -1
  360. package/dist/generators/prisma/embedded-relation-transformer/index.js +0 -2
  361. package/dist/generators/prisma/embedded-relation-transformer/index.js.map +0 -1
  362. package/dist/generators/prisma/prisma-crud-create/index.d.ts +0 -2
  363. package/dist/generators/prisma/prisma-crud-create/index.d.ts.map +0 -1
  364. package/dist/generators/prisma/prisma-crud-create/index.js +0 -2
  365. package/dist/generators/prisma/prisma-crud-create/index.js.map +0 -1
  366. package/dist/generators/prisma/prisma-crud-create/prisma-crud-create.generator.d.ts +0 -48
  367. package/dist/generators/prisma/prisma-crud-create/prisma-crud-create.generator.d.ts.map +0 -1
  368. package/dist/generators/prisma/prisma-crud-create/prisma-crud-create.generator.js +0 -130
  369. package/dist/generators/prisma/prisma-crud-create/prisma-crud-create.generator.js.map +0 -1
  370. package/dist/generators/prisma/prisma-crud-delete/index.d.ts +0 -2
  371. package/dist/generators/prisma/prisma-crud-delete/index.d.ts.map +0 -1
  372. package/dist/generators/prisma/prisma-crud-delete/index.js +0 -2
  373. package/dist/generators/prisma/prisma-crud-delete/index.js.map +0 -1
  374. package/dist/generators/prisma/prisma-crud-delete/prisma-crud-delete.generator.d.ts +0 -38
  375. package/dist/generators/prisma/prisma-crud-delete/prisma-crud-delete.generator.d.ts.map +0 -1
  376. package/dist/generators/prisma/prisma-crud-delete/prisma-crud-delete.generator.js +0 -94
  377. package/dist/generators/prisma/prisma-crud-delete/prisma-crud-delete.generator.js.map +0 -1
  378. package/dist/generators/prisma/prisma-crud-service/index.d.ts +0 -2
  379. package/dist/generators/prisma/prisma-crud-service/index.d.ts.map +0 -1
  380. package/dist/generators/prisma/prisma-crud-service/index.js +0 -2
  381. package/dist/generators/prisma/prisma-crud-service/index.js.map +0 -1
  382. package/dist/generators/prisma/prisma-crud-service/prisma-crud-service.generator.d.ts +0 -20
  383. package/dist/generators/prisma/prisma-crud-service/prisma-crud-service.generator.d.ts.map +0 -1
  384. package/dist/generators/prisma/prisma-crud-service/prisma-crud-service.generator.js +0 -53
  385. package/dist/generators/prisma/prisma-crud-service/prisma-crud-service.generator.js.map +0 -1
  386. package/dist/generators/prisma/prisma-crud-update/index.d.ts +0 -2
  387. package/dist/generators/prisma/prisma-crud-update/index.d.ts.map +0 -1
  388. package/dist/generators/prisma/prisma-crud-update/index.js +0 -2
  389. package/dist/generators/prisma/prisma-crud-update/index.js.map +0 -1
  390. package/dist/generators/prisma/prisma-crud-update/prisma-crud-update.generator.d.ts +0 -48
  391. package/dist/generators/prisma/prisma-crud-update/prisma-crud-update.generator.d.ts.map +0 -1
  392. package/dist/generators/prisma/prisma-crud-update/prisma-crud-update.generator.js +0 -145
  393. package/dist/generators/prisma/prisma-crud-update/prisma-crud-update.generator.js.map +0 -1
  394. package/dist/generators/prisma/prisma-utils/generated/index.d.ts +0 -134
  395. package/dist/generators/prisma/prisma-utils/generated/index.d.ts.map +0 -1
  396. package/dist/generators/prisma/prisma-utils/generated/index.js +0 -11
  397. package/dist/generators/prisma/prisma-utils/generated/index.js.map +0 -1
  398. package/dist/generators/prisma/prisma-utils/generated/template-paths.d.ts +0 -17
  399. package/dist/generators/prisma/prisma-utils/generated/template-paths.d.ts.map +0 -1
  400. package/dist/generators/prisma/prisma-utils/generated/template-paths.js +0 -27
  401. package/dist/generators/prisma/prisma-utils/generated/template-paths.js.map +0 -1
  402. package/dist/generators/prisma/prisma-utils/generated/template-renderers.d.ts +0 -37
  403. package/dist/generators/prisma/prisma-utils/generated/template-renderers.d.ts.map +0 -1
  404. package/dist/generators/prisma/prisma-utils/generated/template-renderers.js +0 -43
  405. package/dist/generators/prisma/prisma-utils/generated/template-renderers.js.map +0 -1
  406. package/dist/generators/prisma/prisma-utils/generated/ts-import-providers.d.ts +0 -88
  407. package/dist/generators/prisma/prisma-utils/generated/ts-import-providers.d.ts.map +0 -1
  408. package/dist/generators/prisma/prisma-utils/generated/ts-import-providers.js +0 -54
  409. package/dist/generators/prisma/prisma-utils/generated/ts-import-providers.js.map +0 -1
  410. package/dist/generators/prisma/prisma-utils/generated/typed-templates.d.ts +0 -125
  411. package/dist/generators/prisma/prisma-utils/generated/typed-templates.d.ts.map +0 -1
  412. package/dist/generators/prisma/prisma-utils/generated/typed-templates.js +0 -104
  413. package/dist/generators/prisma/prisma-utils/generated/typed-templates.js.map +0 -1
  414. package/dist/generators/prisma/prisma-utils/index.d.ts +0 -4
  415. package/dist/generators/prisma/prisma-utils/index.d.ts.map +0 -1
  416. package/dist/generators/prisma/prisma-utils/index.js +0 -3
  417. package/dist/generators/prisma/prisma-utils/index.js.map +0 -1
  418. package/dist/generators/prisma/prisma-utils/prisma-utils.generator.d.ts +0 -61
  419. package/dist/generators/prisma/prisma-utils/prisma-utils.generator.d.ts.map +0 -1
  420. package/dist/generators/prisma/prisma-utils/prisma-utils.generator.js +0 -43
  421. package/dist/generators/prisma/prisma-utils/prisma-utils.generator.js.map +0 -1
  422. package/dist/generators/prisma/prisma-utils/templates/src/utils/crud-service-types.ts +0 -35
  423. package/dist/generators/prisma/prisma-utils/templates/src/utils/data-pipes.ts +0 -86
  424. package/dist/generators/prisma/prisma-utils/templates/src/utils/embedded-pipes/embedded-one-to-many.ts +0 -245
  425. package/dist/generators/prisma/prisma-utils/templates/src/utils/embedded-pipes/embedded-one-to-one.ts +0 -147
  426. package/dist/generators/prisma/prisma-utils/templates/src/utils/embedded-pipes/embedded-types.ts +0 -6
  427. package/dist/generators/prisma/prisma-utils/templates/src/utils/prisma-relations.ts +0 -24
  428. package/dist/providers/prisma/prisma-data-transformable.d.ts +0 -27
  429. package/dist/providers/prisma/prisma-data-transformable.d.ts.map +0 -1
  430. package/dist/providers/prisma/prisma-data-transformable.js +0 -2
  431. package/dist/providers/prisma/prisma-data-transformable.js.map +0 -1
@@ -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
+ }