@c15t/backend 0.0.1-rc.10

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 (521) hide show
  1. package/.turbo/turbo-build.log +11 -0
  2. package/.turbo/turbo-check-types.log +5 -0
  3. package/.turbo/turbo-fmt.log +7 -0
  4. package/.turbo/turbo-lint.log +6 -0
  5. package/.turbo/turbo-test.log +26 -0
  6. package/README-next.md +223 -0
  7. package/README.md +164 -0
  8. package/dist/api/call.d.ts +176 -0
  9. package/dist/api/call.d.ts.map +1 -0
  10. package/dist/api/index.d.ts +935 -0
  11. package/dist/api/index.d.ts.map +1 -0
  12. package/dist/api/middlewares/index.d.ts +39 -0
  13. package/dist/api/middlewares/index.d.ts.map +1 -0
  14. package/dist/api/middlewares/origin-check.d.ts +82 -0
  15. package/dist/api/middlewares/origin-check.d.ts.map +1 -0
  16. package/dist/api/middlewares/validate-context.d.ts +38 -0
  17. package/dist/api/middlewares/validate-context.d.ts.map +1 -0
  18. package/dist/api/routes/__tests__/consent.test.d.ts +2 -0
  19. package/dist/api/routes/__tests__/consent.test.d.ts.map +1 -0
  20. package/dist/api/routes/__tests__/status.test.d.ts +2 -0
  21. package/dist/api/routes/__tests__/status.test.d.ts.map +1 -0
  22. package/dist/api/routes/error.d.ts +57 -0
  23. package/dist/api/routes/error.d.ts.map +1 -0
  24. package/dist/api/routes/generate-consent-receipt.d.ts +130 -0
  25. package/dist/api/routes/generate-consent-receipt.d.ts.map +1 -0
  26. package/dist/api/routes/get-consent-history.d.ts +133 -0
  27. package/dist/api/routes/get-consent-history.d.ts.map +1 -0
  28. package/dist/api/routes/get-consent-policy.d.ts +164 -0
  29. package/dist/api/routes/get-consent-policy.d.ts.map +1 -0
  30. package/dist/api/routes/get-consent.d.ts +148 -0
  31. package/dist/api/routes/get-consent.d.ts.map +1 -0
  32. package/dist/api/routes/index.d.ts +339 -0
  33. package/dist/api/routes/index.d.ts.map +1 -0
  34. package/dist/api/routes/ok.d.ts +87 -0
  35. package/dist/api/routes/ok.d.ts.map +1 -0
  36. package/dist/api/routes/set-consent.d.ts +245 -0
  37. package/dist/api/routes/set-consent.d.ts.map +1 -0
  38. package/dist/api/routes/show-consent-banner.d.ts +127 -0
  39. package/dist/api/routes/show-consent-banner.d.ts.map +1 -0
  40. package/dist/api/routes/status.d.ts +61 -0
  41. package/dist/api/routes/status.d.ts.map +1 -0
  42. package/dist/api/routes/verify-consent.d.ts +179 -0
  43. package/dist/api/routes/verify-consent.d.ts.map +1 -0
  44. package/dist/api/routes/withdraw-consent.d.ts +194 -0
  45. package/dist/api/routes/withdraw-consent.d.ts.map +1 -0
  46. package/dist/api/to-endpoints.d.ts +35 -0
  47. package/dist/api/to-endpoints.d.ts.map +1 -0
  48. package/dist/client/index.cjs +139 -0
  49. package/dist/client/index.d.ts +203 -0
  50. package/dist/client/index.d.ts.map +1 -0
  51. package/dist/client/index.js +106 -0
  52. package/dist/client/types.d.ts +431 -0
  53. package/dist/client/types.d.ts.map +1 -0
  54. package/dist/core.d.ts +124 -0
  55. package/dist/core.d.ts.map +1 -0
  56. package/dist/core.test.d.ts +2 -0
  57. package/dist/core.test.d.ts.map +1 -0
  58. package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts +122 -0
  59. package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -0
  60. package/dist/db/adapters/drizzle-adapter/index.d.ts +2 -0
  61. package/dist/db/adapters/drizzle-adapter/index.d.ts.map +1 -0
  62. package/dist/db/adapters/drizzle.cjs +1531 -0
  63. package/dist/db/adapters/drizzle.js +1489 -0
  64. package/dist/db/adapters/kysely-adapter/dialect.d.ts +72 -0
  65. package/dist/db/adapters/kysely-adapter/dialect.d.ts.map +1 -0
  66. package/dist/db/adapters/kysely-adapter/index.d.ts +4 -0
  67. package/dist/db/adapters/kysely-adapter/index.d.ts.map +1 -0
  68. package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts +98 -0
  69. package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -0
  70. package/dist/db/adapters/kysely-adapter/types.d.ts +281 -0
  71. package/dist/db/adapters/kysely-adapter/types.d.ts.map +1 -0
  72. package/dist/db/adapters/kysely.cjs +1551 -0
  73. package/dist/db/adapters/kysely.js +1508 -0
  74. package/dist/db/adapters/memory-adapter/index.d.ts +2 -0
  75. package/dist/db/adapters/memory-adapter/index.d.ts.map +1 -0
  76. package/dist/db/adapters/memory-adapter/memory-adapter.d.ts +56 -0
  77. package/dist/db/adapters/memory-adapter/memory-adapter.d.ts.map +1 -0
  78. package/dist/db/adapters/memory.cjs +1391 -0
  79. package/dist/db/adapters/memory.js +1349 -0
  80. package/dist/db/adapters/prisma-adapter/index.d.ts +2 -0
  81. package/dist/db/adapters/prisma-adapter/index.d.ts.map +1 -0
  82. package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts +143 -0
  83. package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -0
  84. package/dist/db/adapters/prisma.cjs +1503 -0
  85. package/dist/db/adapters/prisma.js +1461 -0
  86. package/dist/db/adapters/types.d.ts +154 -0
  87. package/dist/db/adapters/types.d.ts.map +1 -0
  88. package/dist/db/adapters/utils.d.ts +36 -0
  89. package/dist/db/adapters/utils.d.ts.map +1 -0
  90. package/dist/db/core/fields/field-factory.d.ts +383 -0
  91. package/dist/db/core/fields/field-factory.d.ts.map +1 -0
  92. package/dist/db/core/fields/field-inference.d.ts +218 -0
  93. package/dist/db/core/fields/field-inference.d.ts.map +1 -0
  94. package/dist/db/core/fields/field-options-integration.d.ts +90 -0
  95. package/dist/db/core/fields/field-options-integration.d.ts.map +1 -0
  96. package/dist/db/core/fields/field-types.d.ts +182 -0
  97. package/dist/db/core/fields/field-types.d.ts.map +1 -0
  98. package/dist/db/core/fields/id-generator.d.ts +19 -0
  99. package/dist/db/core/fields/id-generator.d.ts.map +1 -0
  100. package/dist/db/core/fields/index.d.ts +8 -0
  101. package/dist/db/core/fields/index.d.ts.map +1 -0
  102. package/dist/db/core/fields/superjson-utils.d.ts +34 -0
  103. package/dist/db/core/fields/superjson-utils.d.ts.map +1 -0
  104. package/dist/db/core/fields/zod-fields.d.ts +1011 -0
  105. package/dist/db/core/fields/zod-fields.d.ts.map +1 -0
  106. package/dist/db/core/get-schema.d.ts +36 -0
  107. package/dist/db/core/get-schema.d.ts.map +1 -0
  108. package/dist/db/core/types.d.ts +41 -0
  109. package/dist/db/core/types.d.ts.map +1 -0
  110. package/dist/db/create-registry.d.ts +760 -0
  111. package/dist/db/create-registry.d.ts.map +1 -0
  112. package/dist/db/hooks/create-hooks.d.ts +32 -0
  113. package/dist/db/hooks/create-hooks.d.ts.map +1 -0
  114. package/dist/db/hooks/index.d.ts +40 -0
  115. package/dist/db/hooks/index.d.ts.map +1 -0
  116. package/dist/db/hooks/types.d.ts +133 -0
  117. package/dist/db/hooks/types.d.ts.map +1 -0
  118. package/dist/db/hooks/update-hooks.d.ts +33 -0
  119. package/dist/db/hooks/update-hooks.d.ts.map +1 -0
  120. package/dist/db/hooks/update-many-hooks.d.ts +55 -0
  121. package/dist/db/hooks/update-many-hooks.d.ts.map +1 -0
  122. package/dist/db/hooks/utils.d.ts +62 -0
  123. package/dist/db/hooks/utils.d.ts.map +1 -0
  124. package/dist/db/hooks/with-hooks-factory.d.ts +33 -0
  125. package/dist/db/hooks/with-hooks-factory.d.ts.map +1 -0
  126. package/dist/db/index.cjs +2458 -0
  127. package/dist/db/index.d.ts +11 -0
  128. package/dist/db/index.d.ts.map +1 -0
  129. package/dist/db/index.js +2404 -0
  130. package/dist/db/migration/get-migration.d.ts +32 -0
  131. package/dist/db/migration/get-migration.d.ts.map +1 -0
  132. package/dist/db/migration/get-schema/get-schema.d.ts +27 -0
  133. package/dist/db/migration/get-schema/get-schema.d.ts.map +1 -0
  134. package/dist/db/migration/get-schema/index.d.ts +21 -0
  135. package/dist/db/migration/get-schema/index.d.ts.map +1 -0
  136. package/dist/db/migration/get-schema/process-fields.d.ts +16 -0
  137. package/dist/db/migration/get-schema/process-fields.d.ts.map +1 -0
  138. package/dist/db/migration/get-schema/process-tables.d.ts +13 -0
  139. package/dist/db/migration/get-schema/process-tables.d.ts.map +1 -0
  140. package/dist/db/migration/get-schema/types.d.ts +17 -0
  141. package/dist/db/migration/get-schema/types.d.ts.map +1 -0
  142. package/dist/db/migration/index.cjs +1613 -0
  143. package/dist/db/migration/index.d.ts +14 -0
  144. package/dist/db/migration/index.d.ts.map +1 -0
  145. package/dist/db/migration/index.js +1571 -0
  146. package/dist/db/migration/migration-builders.d.ts +28 -0
  147. package/dist/db/migration/migration-builders.d.ts.map +1 -0
  148. package/dist/db/migration/migration-execution.d.ts +12 -0
  149. package/dist/db/migration/migration-execution.d.ts.map +1 -0
  150. package/dist/db/migration/schema-comparison.d.ts +54 -0
  151. package/dist/db/migration/schema-comparison.d.ts.map +1 -0
  152. package/dist/db/migration/type-mapping.d.ts +86 -0
  153. package/dist/db/migration/type-mapping.d.ts.map +1 -0
  154. package/dist/db/migration/types.d.ts +37 -0
  155. package/dist/db/migration/types.d.ts.map +1 -0
  156. package/dist/db/schema/audit-log/index.d.ts +4 -0
  157. package/dist/db/schema/audit-log/index.d.ts.map +1 -0
  158. package/dist/db/schema/audit-log/registry.d.ts +128 -0
  159. package/dist/db/schema/audit-log/registry.d.ts.map +1 -0
  160. package/dist/db/schema/audit-log/schema.d.ts +67 -0
  161. package/dist/db/schema/audit-log/schema.d.ts.map +1 -0
  162. package/dist/db/schema/audit-log/table.d.ts +175 -0
  163. package/dist/db/schema/audit-log/table.d.ts.map +1 -0
  164. package/dist/db/schema/audit-log/types.d.ts +29 -0
  165. package/dist/db/schema/audit-log/types.d.ts.map +1 -0
  166. package/dist/db/schema/consent/index.d.ts +4 -0
  167. package/dist/db/schema/consent/index.d.ts.map +1 -0
  168. package/dist/db/schema/consent/registry.d.ts +318 -0
  169. package/dist/db/schema/consent/registry.d.ts.map +1 -0
  170. package/dist/db/schema/consent/schema.d.ts +135 -0
  171. package/dist/db/schema/consent/schema.d.ts.map +1 -0
  172. package/dist/db/schema/consent/table.d.ts +245 -0
  173. package/dist/db/schema/consent/table.d.ts.map +1 -0
  174. package/dist/db/schema/consent/types.d.ts +37 -0
  175. package/dist/db/schema/consent/types.d.ts.map +1 -0
  176. package/dist/db/schema/consent-geo-location/index.d.ts +4 -0
  177. package/dist/db/schema/consent-geo-location/index.d.ts.map +1 -0
  178. package/dist/db/schema/consent-geo-location/registry.d.ts +96 -0
  179. package/dist/db/schema/consent-geo-location/registry.d.ts.map +1 -0
  180. package/dist/db/schema/consent-geo-location/schema.d.ts +71 -0
  181. package/dist/db/schema/consent-geo-location/schema.d.ts.map +1 -0
  182. package/dist/db/schema/consent-geo-location/table.d.ts +167 -0
  183. package/dist/db/schema/consent-geo-location/table.d.ts.map +1 -0
  184. package/dist/db/schema/consent-geo-location/types.d.ts +21 -0
  185. package/dist/db/schema/consent-geo-location/types.d.ts.map +1 -0
  186. package/dist/db/schema/consent-policy/index.d.ts +4 -0
  187. package/dist/db/schema/consent-policy/index.d.ts.map +1 -0
  188. package/dist/db/schema/consent-policy/registry.d.ts +186 -0
  189. package/dist/db/schema/consent-policy/registry.d.ts.map +1 -0
  190. package/dist/db/schema/consent-policy/schema.d.ts +68 -0
  191. package/dist/db/schema/consent-policy/schema.d.ts.map +1 -0
  192. package/dist/db/schema/consent-policy/table.d.ts +147 -0
  193. package/dist/db/schema/consent-policy/table.d.ts.map +1 -0
  194. package/dist/db/schema/consent-policy/types.d.ts +28 -0
  195. package/dist/db/schema/consent-policy/types.d.ts.map +1 -0
  196. package/dist/db/schema/consent-purpose/index.d.ts +4 -0
  197. package/dist/db/schema/consent-purpose/index.d.ts.map +1 -0
  198. package/dist/db/schema/consent-purpose/registry.d.ts +136 -0
  199. package/dist/db/schema/consent-purpose/registry.d.ts.map +1 -0
  200. package/dist/db/schema/consent-purpose/schema.d.ts +79 -0
  201. package/dist/db/schema/consent-purpose/schema.d.ts.map +1 -0
  202. package/dist/db/schema/consent-purpose/table.d.ts +161 -0
  203. package/dist/db/schema/consent-purpose/table.d.ts.map +1 -0
  204. package/dist/db/schema/consent-purpose/types.d.ts +16 -0
  205. package/dist/db/schema/consent-purpose/types.d.ts.map +1 -0
  206. package/dist/db/schema/consent-purpose-junction/index.d.ts +4 -0
  207. package/dist/db/schema/consent-purpose-junction/index.d.ts.map +1 -0
  208. package/dist/db/schema/consent-purpose-junction/registry.d.ts +109 -0
  209. package/dist/db/schema/consent-purpose-junction/registry.d.ts.map +1 -0
  210. package/dist/db/schema/consent-purpose-junction/schema.d.ts +57 -0
  211. package/dist/db/schema/consent-purpose-junction/schema.d.ts.map +1 -0
  212. package/dist/db/schema/consent-purpose-junction/table.d.ts +138 -0
  213. package/dist/db/schema/consent-purpose-junction/table.d.ts.map +1 -0
  214. package/dist/db/schema/consent-purpose-junction/types.d.ts +14 -0
  215. package/dist/db/schema/consent-purpose-junction/types.d.ts.map +1 -0
  216. package/dist/db/schema/consent-record/index.d.ts +4 -0
  217. package/dist/db/schema/consent-record/index.d.ts.map +1 -0
  218. package/dist/db/schema/consent-record/registry.d.ts +119 -0
  219. package/dist/db/schema/consent-record/registry.d.ts.map +1 -0
  220. package/dist/db/schema/consent-record/schema.d.ts +57 -0
  221. package/dist/db/schema/consent-record/schema.d.ts.map +1 -0
  222. package/dist/db/schema/consent-record/table.d.ts +123 -0
  223. package/dist/db/schema/consent-record/table.d.ts.map +1 -0
  224. package/dist/db/schema/consent-record/types.d.ts +21 -0
  225. package/dist/db/schema/consent-record/types.d.ts.map +1 -0
  226. package/dist/db/schema/consent-withdrawal/index.d.ts +4 -0
  227. package/dist/db/schema/consent-withdrawal/index.d.ts.map +1 -0
  228. package/dist/db/schema/consent-withdrawal/registry.d.ts +134 -0
  229. package/dist/db/schema/consent-withdrawal/registry.d.ts.map +1 -0
  230. package/dist/db/schema/consent-withdrawal/schema.d.ts +67 -0
  231. package/dist/db/schema/consent-withdrawal/schema.d.ts.map +1 -0
  232. package/dist/db/schema/consent-withdrawal/table.d.ts +170 -0
  233. package/dist/db/schema/consent-withdrawal/table.d.ts.map +1 -0
  234. package/dist/db/schema/consent-withdrawal/types.d.ts +28 -0
  235. package/dist/db/schema/consent-withdrawal/types.d.ts.map +1 -0
  236. package/dist/db/schema/definition.d.ts +1100 -0
  237. package/dist/db/schema/definition.d.ts.map +1 -0
  238. package/dist/db/schema/domain/index.d.ts +4 -0
  239. package/dist/db/schema/domain/index.d.ts.map +1 -0
  240. package/dist/db/schema/domain/registry.d.ts +169 -0
  241. package/dist/db/schema/domain/registry.d.ts.map +1 -0
  242. package/dist/db/schema/domain/schema.d.ts +60 -0
  243. package/dist/db/schema/domain/schema.d.ts.map +1 -0
  244. package/dist/db/schema/domain/table.d.ts +140 -0
  245. package/dist/db/schema/domain/table.d.ts.map +1 -0
  246. package/dist/db/schema/domain/types.d.ts +27 -0
  247. package/dist/db/schema/domain/types.d.ts.map +1 -0
  248. package/dist/db/schema/geo-location/index.d.ts +4 -0
  249. package/dist/db/schema/geo-location/index.d.ts.map +1 -0
  250. package/dist/db/schema/geo-location/registry.d.ts +114 -0
  251. package/dist/db/schema/geo-location/registry.d.ts.map +1 -0
  252. package/dist/db/schema/geo-location/schema.d.ts +58 -0
  253. package/dist/db/schema/geo-location/schema.d.ts.map +1 -0
  254. package/dist/db/schema/geo-location/table.d.ts +132 -0
  255. package/dist/db/schema/geo-location/table.d.ts.map +1 -0
  256. package/dist/db/schema/geo-location/types.d.ts +17 -0
  257. package/dist/db/schema/geo-location/types.d.ts.map +1 -0
  258. package/dist/db/schema/index.d.ts +85 -0
  259. package/dist/db/schema/index.d.ts.map +1 -0
  260. package/dist/db/schema/parser.d.ts +183 -0
  261. package/dist/db/schema/parser.d.ts.map +1 -0
  262. package/dist/db/schema/schemas.d.ts +383 -0
  263. package/dist/db/schema/schemas.d.ts.map +1 -0
  264. package/dist/db/schema/subject/index.d.ts +4 -0
  265. package/dist/db/schema/subject/index.d.ts.map +1 -0
  266. package/dist/db/schema/subject/registry.d.ts +141 -0
  267. package/dist/db/schema/subject/registry.d.ts.map +1 -0
  268. package/dist/db/schema/subject/schema.d.ts +56 -0
  269. package/dist/db/schema/subject/schema.d.ts.map +1 -0
  270. package/dist/db/schema/subject/table.d.ts +136 -0
  271. package/dist/db/schema/subject/table.d.ts.map +1 -0
  272. package/dist/db/schema/subject/types.d.ts +22 -0
  273. package/dist/db/schema/subject/types.d.ts.map +1 -0
  274. package/dist/db/schema/types.d.ts +136 -0
  275. package/dist/db/schema/types.d.ts.map +1 -0
  276. package/dist/db/utils/adapter-factory.d.ts +21 -0
  277. package/dist/db/utils/adapter-factory.d.ts.map +1 -0
  278. package/dist/db/utils/index.d.ts +10 -0
  279. package/dist/db/utils/index.d.ts.map +1 -0
  280. package/dist/db/utils.d.ts +4 -0
  281. package/dist/db/utils.d.ts.map +1 -0
  282. package/dist/error/codes.cjs +68 -0
  283. package/dist/error/codes.d.ts +175 -0
  284. package/dist/error/codes.d.ts.map +1 -0
  285. package/dist/error/codes.js +35 -0
  286. package/dist/error/error.d.ts +79 -0
  287. package/dist/error/error.d.ts.map +1 -0
  288. package/dist/error/index.cjs +172 -0
  289. package/dist/error/index.d.ts +9 -0
  290. package/dist/error/index.d.ts.map +1 -0
  291. package/dist/error/index.js +129 -0
  292. package/dist/error/logging.d.ts +25 -0
  293. package/dist/error/logging.d.ts.map +1 -0
  294. package/dist/error/pipeline.d.ts +19 -0
  295. package/dist/error/pipeline.d.ts.map +1 -0
  296. package/dist/error/recovery.d.ts +22 -0
  297. package/dist/error/recovery.d.ts.map +1 -0
  298. package/dist/error/results.d.ts +56 -0
  299. package/dist/error/results.d.ts.map +1 -0
  300. package/dist/index.cjs +4777 -0
  301. package/dist/index.d.ts +46 -0
  302. package/dist/index.d.ts.map +1 -0
  303. package/dist/index.js +4708 -0
  304. package/dist/init.d.ts +52 -0
  305. package/dist/init.d.ts.map +1 -0
  306. package/dist/init.test.d.ts +2 -0
  307. package/dist/init.test.d.ts.map +1 -0
  308. package/dist/integrations/index.cjs +281 -0
  309. package/dist/integrations/index.d.ts +7 -0
  310. package/dist/integrations/index.d.ts.map +1 -0
  311. package/dist/integrations/index.js +248 -0
  312. package/dist/integrations/next.cjs +131 -0
  313. package/dist/integrations/next.d.ts +29 -0
  314. package/dist/integrations/next.d.ts.map +1 -0
  315. package/dist/integrations/next.js +99 -0
  316. package/dist/integrations/react.cjs +182 -0
  317. package/dist/integrations/react.d.ts +257 -0
  318. package/dist/integrations/react.d.ts.map +1 -0
  319. package/dist/integrations/react.js +150 -0
  320. package/dist/plugins/geo/index.d.ts +2 -0
  321. package/dist/plugins/geo/index.d.ts.map +1 -0
  322. package/dist/test/utils.d.ts +65 -0
  323. package/dist/test/utils.d.ts.map +1 -0
  324. package/dist/types/api.d.ts +89 -0
  325. package/dist/types/api.d.ts.map +1 -0
  326. package/dist/types/context.d.ts +205 -0
  327. package/dist/types/context.d.ts.map +1 -0
  328. package/dist/types/helper.d.ts +78 -0
  329. package/dist/types/helper.d.ts.map +1 -0
  330. package/dist/types/index.cjs +19 -0
  331. package/dist/types/index.d.ts +6 -0
  332. package/dist/types/index.d.ts.map +1 -0
  333. package/dist/types/index.js +0 -0
  334. package/dist/types/options.d.ts +172 -0
  335. package/dist/types/options.d.ts.map +1 -0
  336. package/dist/types/plugins.d.ts +442 -0
  337. package/dist/types/plugins.d.ts.map +1 -0
  338. package/dist/utils/env.d.ts +77 -0
  339. package/dist/utils/env.d.ts.map +1 -0
  340. package/dist/utils/hide-metadata.d.ts +22 -0
  341. package/dist/utils/hide-metadata.d.ts.map +1 -0
  342. package/dist/utils/index.cjs +268 -0
  343. package/dist/utils/index.d.ts +18 -0
  344. package/dist/utils/index.d.ts.map +1 -0
  345. package/dist/utils/index.js +210 -0
  346. package/dist/utils/ip.d.ts +10 -0
  347. package/dist/utils/ip.d.ts.map +1 -0
  348. package/dist/utils/json.d.ts +14 -0
  349. package/dist/utils/json.d.ts.map +1 -0
  350. package/dist/utils/logger.d.ts +108 -0
  351. package/dist/utils/logger.d.ts.map +1 -0
  352. package/dist/utils/url.d.ts +87 -0
  353. package/dist/utils/url.d.ts.map +1 -0
  354. package/dist/utils/wildcard.d.ts +46 -0
  355. package/dist/utils/wildcard.d.ts.map +1 -0
  356. package/knip.json +37 -0
  357. package/package.json +146 -0
  358. package/rslib.config.ts +104 -0
  359. package/src/api/call.ts +177 -0
  360. package/src/api/index.ts +303 -0
  361. package/src/api/middlewares/index.ts +38 -0
  362. package/src/api/middlewares/origin-check.ts +260 -0
  363. package/src/api/middlewares/validate-context.ts +175 -0
  364. package/src/api/routes/__tests__/consent.test.ts +270 -0
  365. package/src/api/routes/__tests__/status.test.ts +36 -0
  366. package/src/api/routes/error.ts +130 -0
  367. package/src/api/routes/generate-consent-receipt.ts +244 -0
  368. package/src/api/routes/get-consent-history.ts +128 -0
  369. package/src/api/routes/get-consent-policy.ts +327 -0
  370. package/src/api/routes/get-consent.ts +230 -0
  371. package/src/api/routes/index.ts +12 -0
  372. package/src/api/routes/ok.ts +45 -0
  373. package/src/api/routes/set-consent.ts +328 -0
  374. package/src/api/routes/show-consent-banner.ts +149 -0
  375. package/src/api/routes/status.ts +62 -0
  376. package/src/api/routes/verify-consent.ts +272 -0
  377. package/src/api/routes/withdraw-consent.ts +293 -0
  378. package/src/api/to-endpoints.ts +371 -0
  379. package/src/client/index.ts +471 -0
  380. package/src/client/types.ts +458 -0
  381. package/src/core.test.ts +303 -0
  382. package/src/core.ts +267 -0
  383. package/src/db/adapters/drizzle-adapter/drizzle-adapter.ts +711 -0
  384. package/src/db/adapters/drizzle-adapter/index.ts +1 -0
  385. package/src/db/adapters/kysely-adapter/dialect.ts +192 -0
  386. package/src/db/adapters/kysely-adapter/index.ts +3 -0
  387. package/src/db/adapters/kysely-adapter/kysely-adapter.ts +1168 -0
  388. package/src/db/adapters/kysely-adapter/types.ts +307 -0
  389. package/src/db/adapters/memory-adapter/index.ts +1 -0
  390. package/src/db/adapters/memory-adapter/memory-adapter.ts +648 -0
  391. package/src/db/adapters/prisma-adapter/index.ts +1 -0
  392. package/src/db/adapters/prisma-adapter/prisma-adapter.ts +586 -0
  393. package/src/db/adapters/types.ts +203 -0
  394. package/src/db/adapters/utils.ts +51 -0
  395. package/src/db/core/fields/field-factory.ts +804 -0
  396. package/src/db/core/fields/field-inference.ts +298 -0
  397. package/src/db/core/fields/field-options-integration.ts +135 -0
  398. package/src/db/core/fields/field-types.ts +233 -0
  399. package/src/db/core/fields/id-generator.ts +57 -0
  400. package/src/db/core/fields/index.ts +56 -0
  401. package/src/db/core/fields/superjson-utils.ts +155 -0
  402. package/src/db/core/fields/zod-fields.ts +269 -0
  403. package/src/db/core/get-schema.ts +102 -0
  404. package/src/db/core/types.ts +52 -0
  405. package/src/db/create-registry.ts +31 -0
  406. package/src/db/hooks/create-hooks.ts +88 -0
  407. package/src/db/hooks/index.ts +39 -0
  408. package/src/db/hooks/types.ts +164 -0
  409. package/src/db/hooks/update-hooks.ts +91 -0
  410. package/src/db/hooks/update-many-hooks.ts +176 -0
  411. package/src/db/hooks/utils.ts +151 -0
  412. package/src/db/hooks/with-hooks-factory.ts +68 -0
  413. package/src/db/index.ts +32 -0
  414. package/src/db/migration/get-migration.ts +89 -0
  415. package/src/db/migration/get-schema/get-schema.ts +44 -0
  416. package/src/db/migration/get-schema/index.ts +20 -0
  417. package/src/db/migration/get-schema/process-fields.ts +66 -0
  418. package/src/db/migration/get-schema/process-tables.ts +68 -0
  419. package/src/db/migration/get-schema/types.ts +18 -0
  420. package/src/db/migration/index.ts +18 -0
  421. package/src/db/migration/migration-builders.ts +170 -0
  422. package/src/db/migration/migration-execution.ts +79 -0
  423. package/src/db/migration/schema-comparison.ts +216 -0
  424. package/src/db/migration/type-mapping.ts +255 -0
  425. package/src/db/migration/types.ts +46 -0
  426. package/src/db/schema/audit-log/index.ts +3 -0
  427. package/src/db/schema/audit-log/registry.ts +228 -0
  428. package/src/db/schema/audit-log/schema.ts +46 -0
  429. package/src/db/schema/audit-log/table.ts +185 -0
  430. package/src/db/schema/audit-log/types.ts +29 -0
  431. package/src/db/schema/consent/index.ts +3 -0
  432. package/src/db/schema/consent/registry.ts +381 -0
  433. package/src/db/schema/consent/schema.ts +65 -0
  434. package/src/db/schema/consent/table.ts +220 -0
  435. package/src/db/schema/consent/types.ts +39 -0
  436. package/src/db/schema/consent-geo-location/index.ts +3 -0
  437. package/src/db/schema/consent-geo-location/registry.ts +124 -0
  438. package/src/db/schema/consent-geo-location/schema.ts +51 -0
  439. package/src/db/schema/consent-geo-location/table.ts +169 -0
  440. package/src/db/schema/consent-geo-location/types.ts +21 -0
  441. package/src/db/schema/consent-policy/index.ts +3 -0
  442. package/src/db/schema/consent-policy/registry.ts +313 -0
  443. package/src/db/schema/consent-policy/schema.ts +47 -0
  444. package/src/db/schema/consent-policy/table.ts +141 -0
  445. package/src/db/schema/consent-policy/types.ts +28 -0
  446. package/src/db/schema/consent-purpose/index.ts +3 -0
  447. package/src/db/schema/consent-purpose/registry.ts +188 -0
  448. package/src/db/schema/consent-purpose/schema.ts +58 -0
  449. package/src/db/schema/consent-purpose/table.ts +154 -0
  450. package/src/db/schema/consent-purpose/types.ts +16 -0
  451. package/src/db/schema/consent-purpose-junction/index.ts +3 -0
  452. package/src/db/schema/consent-purpose-junction/registry.ts +189 -0
  453. package/src/db/schema/consent-purpose-junction/schema.ts +49 -0
  454. package/src/db/schema/consent-purpose-junction/table.ts +142 -0
  455. package/src/db/schema/consent-purpose-junction/types.ts +14 -0
  456. package/src/db/schema/consent-record/index.ts +3 -0
  457. package/src/db/schema/consent-record/registry.ts +209 -0
  458. package/src/db/schema/consent-record/schema.ts +42 -0
  459. package/src/db/schema/consent-record/table.ts +124 -0
  460. package/src/db/schema/consent-record/types.ts +21 -0
  461. package/src/db/schema/consent-withdrawal/index.ts +3 -0
  462. package/src/db/schema/consent-withdrawal/registry.ts +219 -0
  463. package/src/db/schema/consent-withdrawal/schema.ts +48 -0
  464. package/src/db/schema/consent-withdrawal/table.ts +181 -0
  465. package/src/db/schema/consent-withdrawal/types.ts +29 -0
  466. package/src/db/schema/definition.ts +196 -0
  467. package/src/db/schema/domain/index.ts +3 -0
  468. package/src/db/schema/domain/registry.ts +272 -0
  469. package/src/db/schema/domain/schema.ts +43 -0
  470. package/src/db/schema/domain/table.ts +137 -0
  471. package/src/db/schema/domain/types.ts +27 -0
  472. package/src/db/schema/geo-location/index.ts +3 -0
  473. package/src/db/schema/geo-location/registry.ts +159 -0
  474. package/src/db/schema/geo-location/schema.ts +45 -0
  475. package/src/db/schema/geo-location/table.ts +148 -0
  476. package/src/db/schema/geo-location/types.ts +18 -0
  477. package/src/db/schema/index.ts +96 -0
  478. package/src/db/schema/parser.ts +417 -0
  479. package/src/db/schema/schemas.ts +35 -0
  480. package/src/db/schema/subject/index.ts +3 -0
  481. package/src/db/schema/subject/registry.ts +371 -0
  482. package/src/db/schema/subject/schema.ts +41 -0
  483. package/src/db/schema/subject/table.ts +139 -0
  484. package/src/db/schema/subject/types.ts +22 -0
  485. package/src/db/schema/types.ts +154 -0
  486. package/src/db/utils/adapter-factory.ts +64 -0
  487. package/src/db/utils/index.ts +10 -0
  488. package/src/db/utils.ts +42 -0
  489. package/src/docs/ADVANCED_JSON_HANDLING.md +99 -0
  490. package/src/docs/neverthrow.md +171 -0
  491. package/src/error/codes.ts +201 -0
  492. package/src/error/error.ts +145 -0
  493. package/src/error/index.ts +23 -0
  494. package/src/error/logging.ts +52 -0
  495. package/src/error/pipeline.ts +57 -0
  496. package/src/error/recovery.ts +45 -0
  497. package/src/error/results.ts +100 -0
  498. package/src/index.ts +79 -0
  499. package/src/init.test.ts +235 -0
  500. package/src/init.ts +261 -0
  501. package/src/integrations/index.ts +10 -0
  502. package/src/integrations/next.ts +136 -0
  503. package/src/integrations/react.ts +567 -0
  504. package/src/plugins/geo/index.ts +563 -0
  505. package/src/test/utils.ts +244 -0
  506. package/src/types/api.ts +101 -0
  507. package/src/types/context.ts +235 -0
  508. package/src/types/helper.ts +87 -0
  509. package/src/types/index.ts +5 -0
  510. package/src/types/options.ts +189 -0
  511. package/src/types/plugins.ts +538 -0
  512. package/src/utils/env.ts +103 -0
  513. package/src/utils/hide-metadata.ts +21 -0
  514. package/src/utils/index.ts +17 -0
  515. package/src/utils/ip.ts +45 -0
  516. package/src/utils/json.ts +19 -0
  517. package/src/utils/logger.ts +252 -0
  518. package/src/utils/url.ts +194 -0
  519. package/src/utils/wildcard.ts +253 -0
  520. package/tsconfig.json +12 -0
  521. package/vitest.config.ts +14 -0
@@ -0,0 +1,31 @@
1
+ import type { RegistryContext } from '~/types/context';
2
+
3
+ import {
4
+ auditLogRegistry,
5
+ consentGeoLocationRegistry,
6
+ consentPurposeJunctionRegistry,
7
+ consentPurposeRegistry,
8
+ consentRecordRegistry,
9
+ consentRegistry,
10
+ consentWithdrawalRegistry,
11
+ domainRegistry,
12
+ geoLocationRegistry,
13
+ policyRegistry,
14
+ subjectRegistry,
15
+ } from './schema/index';
16
+
17
+ export const createRegistry = (ctx: RegistryContext) => {
18
+ return {
19
+ ...auditLogRegistry(ctx),
20
+ ...consentRegistry(ctx),
21
+ ...domainRegistry(ctx),
22
+ ...geoLocationRegistry(ctx),
23
+ ...consentGeoLocationRegistry(ctx),
24
+ ...consentPurposeJunctionRegistry(ctx),
25
+ ...consentPurposeRegistry(ctx),
26
+ ...policyRegistry(ctx),
27
+ ...consentRecordRegistry(ctx),
28
+ ...subjectRegistry(ctx),
29
+ ...consentWithdrawalRegistry(ctx),
30
+ };
31
+ };
@@ -0,0 +1,88 @@
1
+ import type { Adapter } from '../adapters/types';
2
+ import type { EntityName } from '../core/types';
3
+ import type { CreateWithHooksProps, HookContext } from './types';
4
+ import { processHooks } from './utils';
5
+
6
+ /**
7
+ * Creates a record with hooks applied before and after creation.
8
+ *
9
+ * @typeParam TInputData - Type of the data being created
10
+ * @typeParam TOutputData - Type of the data returned after creation
11
+ *
12
+ * @param adapter - The database adapter to use
13
+ * @param ctx - Context containing hooks and options
14
+ * @param props - Properties for the create operation
15
+ * @returns The created record or null if a hook aborted the operation
16
+ *
17
+ * @remarks
18
+ * This function orchestrates the entity creation process, executing hooks
19
+ * at appropriate times to allow validation, transformation, and post-processing.
20
+ * It supports both standard adapter-based creation and custom creation functions.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const subject = await createWithHook(
25
+ * mysqlAdapter,
26
+ * { hooks: subjectHooks, options: config },
27
+ * {
28
+ * data: { name: 'Alice' },
29
+ * model: 'subject'
30
+ * }
31
+ * );
32
+ * ```
33
+ */
34
+ export async function createWithHook<
35
+ TInputData extends Record<string, unknown> = Record<string, unknown>,
36
+ TOutputData extends Record<string, unknown> = TInputData,
37
+ >(
38
+ adapter: Adapter,
39
+ ctx: HookContext,
40
+ props: CreateWithHooksProps<TInputData>
41
+ ): Promise<TOutputData | null> {
42
+ const { data, model, customFn, context } = props;
43
+ const hooks = ctx.hooks || [];
44
+
45
+ // Process before hooks
46
+ const transformedData = await processHooks<EntityName, TInputData>(
47
+ data,
48
+ model,
49
+ 'create',
50
+ 'before',
51
+ hooks,
52
+ context
53
+ );
54
+ if (transformedData === null) {
55
+ return null;
56
+ }
57
+
58
+ // Execute operation
59
+ let created: TOutputData | null = null;
60
+
61
+ if (customFn) {
62
+ created = (await customFn.fn(transformedData)) as TOutputData | null;
63
+ if (!customFn.executeMainFn && created) {
64
+ return created;
65
+ }
66
+ }
67
+
68
+ if (!created) {
69
+ created = (await adapter.create({
70
+ model: model as EntityName,
71
+ data: transformedData,
72
+ })) as unknown as TOutputData;
73
+ }
74
+
75
+ // Process after hooks
76
+ if (created) {
77
+ await processHooks<EntityName, TOutputData>(
78
+ created,
79
+ model,
80
+ 'create',
81
+ 'after',
82
+ hooks,
83
+ context
84
+ );
85
+ }
86
+
87
+ return created;
88
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Database Hooks Module
3
+ *
4
+ * A comprehensive system for intercepting, validating, and transforming data
5
+ * during database operations. Hooks provide a powerful way to implement
6
+ * cross-cutting concerns like validation, authorization, and data enrichment.
7
+ *
8
+ * This module provides:
9
+ * - Type definitions for hooks and their operations
10
+ * - Core hook processing utilities
11
+ * - Operation-specific hook implementations (create, update, updateMany)
12
+ * - A factory for generating hook-enabled database operations
13
+ *
14
+ * @module db/hooks
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { getWithHooks } from '~/db/hooks';
19
+ * import { adapter } from '~/adapters';
20
+ *
21
+ * // Create hook-enabled database operations
22
+ * const { createWithHooks } = getWithHooks(adapter, {
23
+ * options: config,
24
+ * hooks: config.databaseHooks || []
25
+ * });
26
+ *
27
+ * // Use hooks with database operations
28
+ * const subject = await createWithHooks({
29
+ * data: { name: 'Alice', email: 'alice@example.com' },
30
+ * model: 'subject'
31
+ * });
32
+ * ```
33
+ */
34
+ export * from './types';
35
+ export * from './utils';
36
+ export * from './create-hooks';
37
+ export * from './update-hooks';
38
+ export * from './update-many-hooks';
39
+ export * from './with-hooks-factory';
@@ -0,0 +1,164 @@
1
+ import type { Where } from '~/db/adapters/types';
2
+ import type { C15TOptions, GenericEndpointContext } from '~/types';
3
+ import type { EntityName, EntityTypeMap } from '../core/types';
4
+
5
+ /**
6
+ * Defines execution phases when hooks can run in the database operation lifecycle.
7
+ */
8
+ export type HookPhase = 'before' | 'after';
9
+
10
+ /**
11
+ * Defines database operations that can have hooks attached.
12
+ */
13
+ export type HookOperation = 'create' | 'update';
14
+
15
+ /**
16
+ * Result types for hook execution that control the flow of operations.
17
+ *
18
+ * @typeParam TData - The data type being processed by the hook
19
+ *
20
+ * @remarks
21
+ * Hook functions can return different result types to control operation flow:
22
+ * - `{ kind: 'abort' }` - Abort the operation entirely
23
+ * - `{ kind: 'transform', data: TData }` - Transform the data and continue
24
+ * - `{ kind: 'continue' }` - Continue with unchanged data
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // Abort if validation fails
29
+ * if (!isValid(data)) {
30
+ * return { kind: 'abort' };
31
+ * }
32
+ * ```
33
+ */
34
+ export type HookResult<TData> =
35
+ | { kind: 'abort' }
36
+ | { kind: 'transform'; data: TData }
37
+ | { kind: 'continue' };
38
+
39
+ /**
40
+ * Hook function for a specific entity type, providing before/after hooks
41
+ * for create and update operations.
42
+ *
43
+ * @typeParam TEntityName - The entity type this hook applies to
44
+ *
45
+ * @remarks
46
+ * ModelHook provides a structured way to define hooks for different
47
+ * database operations on a specific entity type.
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const subjectHook: ModelHook<'subject'> = {
52
+ * create: {
53
+ * before: (subjectData) => ({
54
+ * kind: 'transform',
55
+ * data: { ...subjectData, createdAt: new Date() }
56
+ * })
57
+ * }
58
+ * };
59
+ * ```
60
+ */
61
+ export interface ModelHook<TEntityName extends EntityName = EntityName> {
62
+ create?: {
63
+ before?: (
64
+ data: EntityTypeMap[TEntityName],
65
+ context?: GenericEndpointContext
66
+ ) =>
67
+ | Promise<HookResult<EntityTypeMap[TEntityName]> | undefined>
68
+ | HookResult<EntityTypeMap[TEntityName]>
69
+ | undefined;
70
+ after?: (
71
+ data: EntityTypeMap[TEntityName],
72
+ context?: GenericEndpointContext
73
+ ) => Promise<void> | void;
74
+ };
75
+ update?: {
76
+ before?: (
77
+ data: Partial<EntityTypeMap[TEntityName]>,
78
+ context?: GenericEndpointContext
79
+ ) =>
80
+ | Promise<HookResult<Partial<EntityTypeMap[TEntityName]>> | undefined>
81
+ | HookResult<Partial<EntityTypeMap[TEntityName]>>
82
+ | undefined;
83
+ after?: (
84
+ data: EntityTypeMap[TEntityName],
85
+ context?: GenericEndpointContext
86
+ ) => Promise<void> | void;
87
+ };
88
+ }
89
+
90
+ /**
91
+ * A collection of hooks for different entity types in the database.
92
+ *
93
+ * @remarks
94
+ * This is the primary way to register hooks in the system.
95
+ */
96
+ export type DatabaseHook = {
97
+ [TEntityName in EntityName]?: ModelHook<TEntityName>;
98
+ };
99
+
100
+ /**
101
+ * Context object containing application options and registered hooks.
102
+ */
103
+ export interface HookContext {
104
+ hooks: DatabaseHook[];
105
+ options: C15TOptions;
106
+ }
107
+
108
+ /**
109
+ * Interface for defining custom operation functions that can be used
110
+ * in place of or alongside standard database operations.
111
+ *
112
+ * @typeParam TInputData - The input data type for the operation
113
+ * @typeParam TOutputData - The output data type for the operation
114
+ *
115
+ * @remarks
116
+ * Custom functions allow for specialized behavior when standard
117
+ * CRUD operations aren't sufficient.
118
+ */
119
+ export interface CustomOperationFunction<
120
+ TInputData extends Record<string, unknown> = Record<string, unknown>,
121
+ TOutputData = TInputData,
122
+ > {
123
+ fn: (data: TOutputData) => Promise<TOutputData | null> | TOutputData | null;
124
+ executeMainFn?: boolean;
125
+ }
126
+
127
+ /**
128
+ * Properties for creating a record with hooks.
129
+ *
130
+ * @typeParam TData - The data type being created
131
+ *
132
+ * @remarks
133
+ * This is the parameter object for the createWithHook function.
134
+ */
135
+ export interface CreateWithHooksProps<
136
+ TData extends Record<string, unknown> = Record<string, unknown>,
137
+ > {
138
+ data: TData;
139
+ model: EntityName;
140
+ customFn?: CustomOperationFunction<TData>;
141
+ context?: GenericEndpointContext;
142
+ }
143
+
144
+ /**
145
+ * Properties for updating records with hooks.
146
+ *
147
+ * @typeParam TInputData - The input data type for the update
148
+ * @typeParam TOutputData - The expected output data type
149
+ * @typeParam TResultData - The final result data type
150
+ *
151
+ * @remarks
152
+ * This is the parameter object for updateWithHooks and updateManyWithHooks functions.
153
+ */
154
+ export interface UpdateWithHooksProps<
155
+ TInputData extends Record<string, unknown> = Record<string, unknown>,
156
+ TOutputData = TInputData,
157
+ TResultData = TOutputData,
158
+ > {
159
+ data: Partial<TInputData>;
160
+ where: Where<EntityName>;
161
+ model: EntityName;
162
+ customFn?: CustomOperationFunction<Partial<TInputData>, TResultData>;
163
+ context?: GenericEndpointContext;
164
+ }
@@ -0,0 +1,91 @@
1
+ import type { Adapter } from '../adapters/types';
2
+ import type { EntityName } from '../core/types';
3
+ import type { HookContext, UpdateWithHooksProps } from './types';
4
+ import { processHooks } from './utils';
5
+
6
+ /**
7
+ * Updates a record with hooks applied before and after the update operation.
8
+ *
9
+ * @typeParam TInputData - Type of the data being updated
10
+ * @typeParam TOutputData - Type of the data returned after update
11
+ *
12
+ * @param adapter - The database adapter to use
13
+ * @param ctx - Context containing hooks and options
14
+ * @param props - Properties for the update operation
15
+ * @returns The updated record or null if a hook aborted the operation
16
+ *
17
+ * @remarks
18
+ * This function orchestrates the entity update process, executing hooks
19
+ * at appropriate times to allow validation, transformation, and post-processing.
20
+ * It supports both standard adapter-based updates and custom update functions.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const updatedSubject = await updateWithHooks(
25
+ * mysqlAdapter,
26
+ * { hooks: subjectHooks, options: config },
27
+ * {
28
+ * data: { status: 'active' },
29
+ * where: { id: 'sub_x1pftyoufsm7xgo1kv' },
30
+ * model: 'subject'
31
+ * }
32
+ * );
33
+ * ```
34
+ */
35
+ export async function updateWithHooks<
36
+ TInputData extends Record<string, unknown> = Record<string, unknown>,
37
+ TOutputData extends Record<string, unknown> = TInputData,
38
+ >(
39
+ adapter: Adapter,
40
+ ctx: HookContext,
41
+ props: UpdateWithHooksProps<TInputData, TOutputData>
42
+ ): Promise<TOutputData | null> {
43
+ const { data, where, model, customFn, context } = props;
44
+ const hooks = ctx.hooks || [];
45
+
46
+ // Process before hooks
47
+ const transformedData = await processHooks<EntityName, Partial<TInputData>>(
48
+ data,
49
+ model,
50
+ 'update',
51
+ 'before',
52
+ hooks,
53
+ context
54
+ );
55
+ if (transformedData === null) {
56
+ return null;
57
+ }
58
+
59
+ // Execute operation
60
+ let updated: TOutputData | null = null;
61
+ if (customFn) {
62
+ // Ensure customFn handles partial updates correctly
63
+ const result = await customFn.fn(transformedData as TOutputData);
64
+ updated = result;
65
+ if (!customFn.executeMainFn && updated) {
66
+ return updated;
67
+ }
68
+ }
69
+
70
+ if (!updated) {
71
+ updated = (await adapter.update({
72
+ model: model as EntityName,
73
+ update: transformedData,
74
+ where,
75
+ })) as TOutputData | null;
76
+ }
77
+
78
+ // Process after hooks
79
+ if (updated) {
80
+ await processHooks<EntityName, TOutputData>(
81
+ updated,
82
+ model,
83
+ 'update',
84
+ 'after',
85
+ hooks,
86
+ context
87
+ );
88
+ }
89
+
90
+ return updated;
91
+ }
@@ -0,0 +1,176 @@
1
+ import type { Adapter } from '~/db/adapters/types';
2
+ import type { EntityName } from '~/db/core/types';
3
+ import type {
4
+ CustomOperationFunction,
5
+ HookContext,
6
+ UpdateWithHooksProps,
7
+ } from './types';
8
+ import { processAfterHooksForMany, processHooks } from './utils';
9
+
10
+ /**
11
+ * Executes a custom function if provided for batch updates.
12
+ *
13
+ * This internal helper handles custom function execution and determines
14
+ * whether the standard update operation should also be performed.
15
+ *
16
+ * @template TInputData - Type of the input data
17
+ * @template TOutputData - Type of the output data
18
+ *
19
+ * @param data - The data to process
20
+ * @param customFn - Optional custom function to execute
21
+ *
22
+ * @returns Object containing the result and whether to continue with standard update
23
+ */
24
+ async function executeCustomFunction<
25
+ TInputData extends Record<string, unknown>,
26
+ TOutputData,
27
+ >(
28
+ data: TInputData,
29
+ customFn?: CustomOperationFunction<Partial<TInputData>, TOutputData>
30
+ ): Promise<{ result: TOutputData | null; shouldContinue: boolean }> {
31
+ if (!customFn) {
32
+ return { result: null, shouldContinue: true };
33
+ }
34
+ const result = (await customFn.fn(
35
+ data as unknown as TOutputData
36
+ )) as TOutputData | null;
37
+ const shouldContinue = !result || !!customFn.executeMainFn;
38
+
39
+ return { result, shouldContinue };
40
+ }
41
+
42
+ /**
43
+ * Processes the result from updateMany adapter operations.
44
+ *
45
+ * This internal helper normalizes various result formats that may be
46
+ * returned by different adapters when performing batch updates.
47
+ *
48
+ * @template TEntityData - The entity data type
49
+ *
50
+ * @param result - The raw result from the adapter
51
+ * @returns Normalized array of entity data or null
52
+ */
53
+ function processUpdateManyResult<TEntityData extends Record<string, unknown>>(
54
+ result: unknown
55
+ ): TEntityData[] | null {
56
+ if (Array.isArray(result)) {
57
+ return result;
58
+ }
59
+
60
+ if (typeof result === 'number' && result > 0) {
61
+ return []; // Empty array if we just got a count
62
+ }
63
+
64
+ return null;
65
+ }
66
+
67
+ /**
68
+ * Updates multiple records with hooks applied before and after the batch update.
69
+ *
70
+ * This function orchestrates the batch update process, executing hooks
71
+ * at appropriate times to allow validation, transformation, and post-processing
72
+ * for multiple records simultaneously.
73
+ *
74
+ * @template TInputData - Type of the data being updated
75
+ * @template TOutputData - Type of the data returned after update
76
+ *
77
+ * @param adapter - The database adapter to use
78
+ * @param ctx - Context containing hooks and options
79
+ * @param props - Properties for the updateMany operation
80
+ *
81
+ * @returns The updated records or null if a hook aborted the operation
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * // Batch update subjects
86
+ * const updatedSubjects = await updateManyWithHooks(
87
+ * mysqlAdapter,
88
+ * { hooks: subjectHooks, options: config },
89
+ * {
90
+ * data: { isVerified: true },
91
+ * where: { emailDomain: 'example.com' },
92
+ * model: 'subject'
93
+ * }
94
+ * );
95
+ *
96
+ * // With custom function for complex batch processing
97
+ * const updatedPosts = await updateManyWithHooks(
98
+ * mysqlAdapter,
99
+ * { hooks: postHooks, options: config },
100
+ * {
101
+ * data: { isArchived: true },
102
+ * where: { createdAt: { lt: oneYearAgo } },
103
+ * model: 'post',
104
+ * customFn: {
105
+ * fn: async (data) => {
106
+ * // Get posts to be archived
107
+ * const postsToArchive = await postService.findOldPosts();
108
+ * // Custom batch processing
109
+ * const archivedPosts = await postService.batchArchive(postsToArchive, data);
110
+ * return archivedPosts;
111
+ * },
112
+ * executeMainFn: false // Skip standard update as custom function handles it
113
+ * }
114
+ * }
115
+ * );
116
+ * ```
117
+ */
118
+ export async function updateManyWithHooks<
119
+ TInputData extends Record<string, unknown> = Record<string, unknown>,
120
+ TOutputData extends Record<string, unknown> = TInputData,
121
+ >(
122
+ adapter: Adapter,
123
+ ctx: HookContext,
124
+ props: UpdateWithHooksProps<TInputData, TOutputData>
125
+ ): Promise<TOutputData[] | null> {
126
+ const { data, where, model, customFn, context } = props;
127
+ const hooks = ctx.hooks || [];
128
+
129
+ // Process before hooks
130
+ const transformedData = await processHooks<EntityName, Partial<TInputData>>(
131
+ data,
132
+ model,
133
+ 'update',
134
+ 'before',
135
+ hooks,
136
+ context
137
+ );
138
+ if (transformedData === null) {
139
+ return null;
140
+ }
141
+
142
+ // Try custom function first
143
+ const { result: customResult, shouldContinue } = await executeCustomFunction<
144
+ Partial<TInputData>,
145
+ TOutputData[]
146
+ //@ts-expect-error
147
+ >(transformedData, customFn);
148
+
149
+ if (customResult && !shouldContinue) {
150
+ return customResult;
151
+ }
152
+
153
+ // Use adapter if needed
154
+ let updated = customResult;
155
+ if (!updated) {
156
+ const adapterResult = await adapter.updateMany({
157
+ model: model as EntityName,
158
+ update: transformedData,
159
+ where,
160
+ });
161
+
162
+ updated = processUpdateManyResult<TOutputData>(adapterResult);
163
+ }
164
+
165
+ // Process after hooks
166
+ if (updated && updated.length > 0) {
167
+ await processAfterHooksForMany<EntityName, TOutputData>(
168
+ updated,
169
+ model,
170
+ hooks,
171
+ context
172
+ );
173
+ }
174
+
175
+ return updated;
176
+ }