@c15t/backend 1.5.0 → 1.6.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 (489) hide show
  1. package/.turbo/turbo-build.log +63 -37
  2. package/CHANGELOG.md +4 -209
  3. package/README.md +86 -164
  4. package/dist/contracts/consent/index.d.ts +103 -615
  5. package/dist/contracts/consent/index.d.ts.map +1 -1
  6. package/dist/contracts/consent/post.contract.d.ts +42 -140
  7. package/dist/contracts/consent/post.contract.d.ts.map +1 -1
  8. package/dist/contracts/consent/show-banner.contract.d.ts +28 -376
  9. package/dist/contracts/consent/show-banner.contract.d.ts.map +1 -1
  10. package/dist/contracts/consent/verify.contract.d.ts +33 -99
  11. package/dist/contracts/consent/verify.contract.d.ts.map +1 -1
  12. package/dist/contracts/index.d.ts +222 -1356
  13. package/dist/contracts/index.d.ts.map +1 -1
  14. package/dist/contracts/meta/index.d.ts +8 -63
  15. package/dist/contracts/meta/index.d.ts.map +1 -1
  16. package/dist/contracts/meta/status.contract.d.ts +8 -63
  17. package/dist/contracts/meta/status.contract.d.ts.map +1 -1
  18. package/dist/contracts/shared/jurisdiction.schema.d.ts +21 -9
  19. package/dist/contracts/shared/jurisdiction.schema.d.ts.map +1 -1
  20. package/dist/contracts.cjs +100 -106
  21. package/dist/contracts.js +100 -106
  22. package/dist/core.cjs +681 -681
  23. package/dist/core.d.ts +118 -678
  24. package/dist/core.d.ts.map +1 -1
  25. package/dist/core.js +634 -637
  26. package/dist/handlers/consent/index.d.ts +103 -615
  27. package/dist/handlers/consent/index.d.ts.map +1 -1
  28. package/dist/handlers/consent/post.handler.d.ts +42 -140
  29. package/dist/handlers/consent/post.handler.d.ts.map +1 -1
  30. package/dist/handlers/consent/show-banner/handler.d.ts +28 -376
  31. package/dist/handlers/consent/show-banner/handler.d.ts.map +1 -1
  32. package/dist/handlers/consent/show-banner/translations.d.ts.map +1 -1
  33. package/dist/handlers/consent/verify.handler.d.ts +33 -99
  34. package/dist/handlers/consent/verify.handler.d.ts.map +1 -1
  35. package/dist/handlers/meta/index.d.ts +8 -63
  36. package/dist/handlers/meta/index.d.ts.map +1 -1
  37. package/dist/handlers/meta/status.handler.d.ts +8 -63
  38. package/dist/handlers/meta/status.handler.d.ts.map +1 -1
  39. package/dist/init.d.ts.map +1 -1
  40. package/dist/middleware/openapi/index.d.ts +2 -2
  41. package/dist/middleware/openapi/index.d.ts.map +1 -1
  42. package/dist/pkgs/data-model/fields/index.cjs +14 -26
  43. package/dist/pkgs/data-model/fields/index.d.ts +4 -4
  44. package/dist/pkgs/data-model/fields/index.d.ts.map +1 -1
  45. package/dist/pkgs/data-model/fields/index.js +14 -26
  46. package/dist/pkgs/data-model/fields/zod-fields.d.ts +195 -871
  47. package/dist/pkgs/data-model/fields/zod-fields.d.ts.map +1 -1
  48. package/dist/pkgs/data-model/hooks/index.d.ts +2 -2
  49. package/dist/pkgs/data-model/hooks/index.d.ts.map +1 -1
  50. package/dist/pkgs/data-model/index.cjs +346 -358
  51. package/dist/pkgs/data-model/index.d.ts +1 -1
  52. package/dist/pkgs/data-model/index.d.ts.map +1 -1
  53. package/dist/pkgs/data-model/index.js +345 -357
  54. package/dist/pkgs/data-model/schema/index.cjs +346 -358
  55. package/dist/pkgs/data-model/schema/index.d.ts +1 -1
  56. package/dist/pkgs/data-model/schema/index.d.ts.map +1 -1
  57. package/dist/pkgs/data-model/schema/index.js +345 -357
  58. package/dist/pkgs/data-model/schema/schemas.d.ts +2 -2
  59. package/dist/pkgs/data-model/schema/schemas.d.ts.map +1 -1
  60. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts +3 -0
  61. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -1
  62. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.cjs +158 -170
  63. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.js +157 -169
  64. package/dist/pkgs/db-adapters/adapters/index.d.ts +2 -2
  65. package/dist/pkgs/db-adapters/adapters/index.d.ts.map +1 -1
  66. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.cjs +215 -227
  67. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.d.ts +2 -2
  68. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.d.ts.map +1 -1
  69. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.js +213 -225
  70. package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts +2 -0
  71. package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -1
  72. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts +1 -1
  73. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts.map +1 -1
  74. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.cjs +158 -170
  75. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.js +157 -169
  76. package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts +3 -0
  77. package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts.map +1 -1
  78. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.cjs +243 -255
  79. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.d.ts +1 -1
  80. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.d.ts.map +1 -1
  81. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.js +241 -253
  82. package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts +3 -0
  83. package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -1
  84. package/dist/pkgs/db-adapters/index.cjs +714 -726
  85. package/dist/pkgs/db-adapters/index.d.ts +6 -6
  86. package/dist/pkgs/db-adapters/index.d.ts.map +1 -1
  87. package/dist/pkgs/db-adapters/index.js +708 -720
  88. package/dist/pkgs/migrations/get-migration.d.ts.map +1 -1
  89. package/dist/pkgs/migrations/get-schema/get-schema.d.ts.map +1 -1
  90. package/dist/pkgs/migrations/get-schema/process-tables.d.ts.map +1 -1
  91. package/dist/pkgs/migrations/index.cjs +236 -248
  92. package/dist/pkgs/migrations/index.d.ts +4 -4
  93. package/dist/pkgs/migrations/index.d.ts.map +1 -1
  94. package/dist/pkgs/migrations/index.js +235 -247
  95. package/dist/pkgs/results/index.cjs +67 -67
  96. package/dist/pkgs/results/index.d.ts +5 -5
  97. package/dist/pkgs/results/index.d.ts.map +1 -1
  98. package/dist/pkgs/results/index.js +67 -67
  99. package/dist/pkgs/results/orpc-error-handler.d.ts +1 -1
  100. package/dist/pkgs/results/orpc-error-handler.d.ts.map +1 -1
  101. package/dist/pkgs/types/index.d.ts +1 -2
  102. package/dist/pkgs/types/index.d.ts.map +1 -1
  103. package/dist/pkgs/types/options.d.ts +9 -2
  104. package/dist/pkgs/types/options.d.ts.map +1 -1
  105. package/dist/pkgs/utils/index.d.ts +1 -1
  106. package/dist/pkgs/utils/index.d.ts.map +1 -1
  107. package/dist/pkgs/utils/logger.d.ts +1 -1
  108. package/dist/pkgs/utils/logger.d.ts.map +1 -1
  109. package/dist/router.cjs +114 -117
  110. package/dist/router.d.ts +111 -678
  111. package/dist/router.d.ts.map +1 -1
  112. package/dist/router.js +114 -117
  113. package/dist/schema/audit-log/schema.d.ts +2 -24
  114. package/dist/schema/audit-log/schema.d.ts.map +1 -1
  115. package/dist/schema/audit-log/table.d.ts +2 -24
  116. package/dist/schema/audit-log/table.d.ts.map +1 -1
  117. package/dist/schema/consent/registry.d.ts +8 -8
  118. package/dist/schema/consent/schema.d.ts +9 -33
  119. package/dist/schema/consent/schema.d.ts.map +1 -1
  120. package/dist/schema/consent/table.d.ts +9 -33
  121. package/dist/schema/consent/table.d.ts.map +1 -1
  122. package/dist/schema/consent-policy/registry.d.ts +20 -20
  123. package/dist/schema/consent-policy/schema.d.ts +22 -30
  124. package/dist/schema/consent-policy/schema.d.ts.map +1 -1
  125. package/dist/schema/consent-policy/table.d.ts +13 -29
  126. package/dist/schema/consent-policy/table.d.ts.map +1 -1
  127. package/dist/schema/consent-purpose/registry.d.ts +6 -6
  128. package/dist/schema/consent-purpose/schema.d.ts +5 -27
  129. package/dist/schema/consent-purpose/schema.d.ts.map +1 -1
  130. package/dist/schema/consent-purpose/table.d.ts +5 -27
  131. package/dist/schema/consent-purpose/table.d.ts.map +1 -1
  132. package/dist/schema/consent-record/schema.d.ts +3 -19
  133. package/dist/schema/consent-record/schema.d.ts.map +1 -1
  134. package/dist/schema/consent-record/table.d.ts +3 -19
  135. package/dist/schema/consent-record/table.d.ts.map +1 -1
  136. package/dist/schema/create-registry.d.ts +58 -58
  137. package/dist/schema/definition.d.ts +42 -176
  138. package/dist/schema/definition.d.ts.map +1 -1
  139. package/dist/schema/domain/registry.d.ts +20 -20
  140. package/dist/schema/domain/schema.d.ts +6 -24
  141. package/dist/schema/domain/schema.d.ts.map +1 -1
  142. package/dist/schema/domain/table.d.ts +6 -24
  143. package/dist/schema/domain/table.d.ts.map +1 -1
  144. package/dist/schema/index.cjs +426 -438
  145. package/dist/schema/index.d.ts +12 -12
  146. package/dist/schema/index.d.ts.map +1 -1
  147. package/dist/schema/index.js +426 -438
  148. package/dist/schema/schemas.d.ts +42 -176
  149. package/dist/schema/schemas.d.ts.map +1 -1
  150. package/dist/schema/subject/registry.d.ts +4 -4
  151. package/dist/schema/subject/schema.d.ts +4 -20
  152. package/dist/schema/subject/schema.d.ts.map +1 -1
  153. package/dist/schema/subject/table.d.ts +4 -20
  154. package/dist/schema/subject/table.d.ts.map +1 -1
  155. package/dist/schema/types.d.ts +1 -1
  156. package/dist/schema/types.d.ts.map +1 -1
  157. package/dist/testing/contract-testing.d.ts +3 -2
  158. package/dist/testing/contract-testing.d.ts.map +1 -1
  159. package/dist/types/index.d.ts +5 -4
  160. package/dist/types/index.d.ts.map +1 -1
  161. package/dist/types/options.d.ts +2 -2
  162. package/dist/types/options.d.ts.map +1 -1
  163. package/dist/v2/contracts/consent/index.d.ts +260 -0
  164. package/dist/v2/contracts/consent/index.d.ts.map +1 -0
  165. package/dist/v2/contracts/consent/index.test.d.ts +2 -0
  166. package/dist/v2/contracts/consent/index.test.d.ts.map +1 -0
  167. package/dist/v2/contracts/consent/post.contract.d.ts +114 -0
  168. package/dist/v2/contracts/consent/post.contract.d.ts.map +1 -0
  169. package/dist/v2/contracts/consent/post.contract.test.d.ts +2 -0
  170. package/dist/v2/contracts/consent/post.contract.test.d.ts.map +1 -0
  171. package/dist/v2/contracts/consent/show-banner.contract.d.ts +68 -0
  172. package/dist/v2/contracts/consent/show-banner.contract.d.ts.map +1 -0
  173. package/dist/v2/contracts/consent/show-banner.contract.test.d.ts +2 -0
  174. package/dist/v2/contracts/consent/show-banner.contract.test.d.ts.map +1 -0
  175. package/dist/v2/contracts/consent/verify.contract.d.ts +81 -0
  176. package/dist/v2/contracts/consent/verify.contract.d.ts.map +1 -0
  177. package/dist/v2/contracts/consent/verify.contract.test.d.ts +2 -0
  178. package/dist/v2/contracts/consent/verify.contract.test.d.ts.map +1 -0
  179. package/dist/v2/contracts/index.cjs +644 -0
  180. package/dist/v2/contracts/index.d.ts +563 -0
  181. package/dist/v2/contracts/index.d.ts.map +1 -0
  182. package/dist/v2/contracts/index.js +607 -0
  183. package/dist/v2/contracts/meta/index.d.ts +19 -0
  184. package/dist/v2/contracts/meta/index.d.ts.map +1 -0
  185. package/dist/v2/contracts/meta/index.test.d.ts +2 -0
  186. package/dist/v2/contracts/meta/index.test.d.ts.map +1 -0
  187. package/dist/v2/contracts/meta/status.contract.d.ts +18 -0
  188. package/dist/v2/contracts/meta/status.contract.d.ts.map +1 -0
  189. package/dist/v2/contracts/meta/status.contract.test.d.ts +2 -0
  190. package/dist/v2/contracts/meta/status.contract.test.d.ts.map +1 -0
  191. package/dist/v2/contracts/shared/jurisdiction.schema.d.ts +36 -0
  192. package/dist/v2/contracts/shared/jurisdiction.schema.d.ts.map +1 -0
  193. package/dist/v2/contracts/test.utils.d.ts +38 -0
  194. package/dist/v2/contracts/test.utils.d.ts.map +1 -0
  195. package/dist/v2/core.cjs +2181 -0
  196. package/dist/v2/core.d.ts +364 -0
  197. package/dist/v2/core.d.ts.map +1 -0
  198. package/dist/v2/core.js +2130 -0
  199. package/dist/v2/db/adapters/drizzle.cjs +36 -0
  200. package/dist/v2/db/adapters/drizzle.d.ts +2 -0
  201. package/dist/v2/db/adapters/drizzle.d.ts.map +1 -0
  202. package/dist/v2/db/adapters/drizzle.js +3 -0
  203. package/dist/v2/db/adapters/index.cjs +18 -0
  204. package/dist/v2/db/adapters/index.d.ts +2 -0
  205. package/dist/v2/db/adapters/index.d.ts.map +1 -0
  206. package/dist/v2/db/adapters/index.js +0 -0
  207. package/dist/v2/db/adapters/kysely.cjs +36 -0
  208. package/dist/v2/db/adapters/kysely.d.ts +2 -0
  209. package/dist/v2/db/adapters/kysely.d.ts.map +1 -0
  210. package/dist/v2/db/adapters/kysely.js +3 -0
  211. package/dist/v2/db/adapters/mongo.cjs +36 -0
  212. package/dist/v2/db/adapters/mongo.d.ts +2 -0
  213. package/dist/v2/db/adapters/mongo.d.ts.map +1 -0
  214. package/dist/v2/db/adapters/mongo.js +3 -0
  215. package/dist/v2/db/adapters/prisma.cjs +36 -0
  216. package/dist/v2/db/adapters/prisma.d.ts +2 -0
  217. package/dist/v2/db/adapters/prisma.d.ts.map +1 -0
  218. package/dist/v2/db/adapters/prisma.js +3 -0
  219. package/dist/v2/db/adapters/typeorm.cjs +36 -0
  220. package/dist/v2/db/adapters/typeorm.d.ts +2 -0
  221. package/dist/v2/db/adapters/typeorm.d.ts.map +1 -0
  222. package/dist/v2/db/adapters/typeorm.js +3 -0
  223. package/dist/v2/db/migrator/index.cjs +61 -0
  224. package/dist/v2/db/migrator/index.d.ts +29 -0
  225. package/dist/v2/db/migrator/index.d.ts.map +1 -0
  226. package/dist/v2/db/migrator/index.js +27 -0
  227. package/dist/v2/db/registry/audit-log.d.ts +21 -0
  228. package/dist/v2/db/registry/audit-log.d.ts.map +1 -0
  229. package/dist/v2/db/registry/audit-log.test.d.ts +2 -0
  230. package/dist/v2/db/registry/audit-log.test.d.ts.map +1 -0
  231. package/dist/v2/db/registry/consent-policy.d.ts +29 -0
  232. package/dist/v2/db/registry/consent-policy.d.ts.map +1 -0
  233. package/dist/v2/db/registry/consent-policy.test.d.ts +2 -0
  234. package/dist/v2/db/registry/consent-policy.test.d.ts.map +1 -0
  235. package/dist/v2/db/registry/consent-purpose.d.ts +16 -0
  236. package/dist/v2/db/registry/consent-purpose.d.ts.map +1 -0
  237. package/dist/v2/db/registry/consent-purpose.test.d.ts +2 -0
  238. package/dist/v2/db/registry/consent-purpose.test.d.ts.map +1 -0
  239. package/dist/v2/db/registry/consent.d.ts +20 -0
  240. package/dist/v2/db/registry/consent.d.ts.map +1 -0
  241. package/dist/v2/db/registry/consent.test.d.ts +2 -0
  242. package/dist/v2/db/registry/consent.test.d.ts.map +1 -0
  243. package/dist/v2/db/registry/domain.d.ts +24 -0
  244. package/dist/v2/db/registry/domain.d.ts.map +1 -0
  245. package/dist/v2/db/registry/domain.test.d.ts +2 -0
  246. package/dist/v2/db/registry/domain.test.d.ts.map +1 -0
  247. package/dist/v2/db/registry/index.d.ts +102 -0
  248. package/dist/v2/db/registry/index.d.ts.map +1 -0
  249. package/dist/v2/db/registry/subject.d.ts +18 -0
  250. package/dist/v2/db/registry/subject.d.ts.map +1 -0
  251. package/dist/v2/db/registry/subject.test.d.ts +2 -0
  252. package/dist/v2/db/registry/subject.test.d.ts.map +1 -0
  253. package/dist/v2/db/registry/types.d.ts +10 -0
  254. package/dist/v2/db/registry/types.d.ts.map +1 -0
  255. package/dist/v2/db/registry/utils/generate-id.d.ts +25 -0
  256. package/dist/v2/db/registry/utils/generate-id.d.ts.map +1 -0
  257. package/dist/v2/db/registry/utils/generate-id.test.d.ts +2 -0
  258. package/dist/v2/db/registry/utils/generate-id.test.d.ts.map +1 -0
  259. package/dist/v2/db/registry/utils.d.ts +25 -0
  260. package/dist/v2/db/registry/utils.d.ts.map +1 -0
  261. package/dist/v2/db/schema/1.0.0/audit-log.d.ts +29 -0
  262. package/dist/v2/db/schema/1.0.0/audit-log.d.ts.map +1 -0
  263. package/dist/v2/db/schema/1.0.0/consent-policy.d.ts +45 -0
  264. package/dist/v2/db/schema/1.0.0/consent-policy.d.ts.map +1 -0
  265. package/dist/v2/db/schema/1.0.0/consent-purpose.d.ts +27 -0
  266. package/dist/v2/db/schema/1.0.0/consent-purpose.d.ts.map +1 -0
  267. package/dist/v2/db/schema/1.0.0/consent-record.d.ts +19 -0
  268. package/dist/v2/db/schema/1.0.0/consent-record.d.ts.map +1 -0
  269. package/dist/v2/db/schema/1.0.0/consent.d.ts +42 -0
  270. package/dist/v2/db/schema/1.0.0/consent.d.ts.map +1 -0
  271. package/dist/v2/db/schema/1.0.0/domain.d.ts +23 -0
  272. package/dist/v2/db/schema/1.0.0/domain.d.ts.map +1 -0
  273. package/dist/v2/db/schema/1.0.0/index.d.ts +1513 -0
  274. package/dist/v2/db/schema/1.0.0/index.d.ts.map +1 -0
  275. package/dist/v2/db/schema/1.0.0/subject.d.ts +23 -0
  276. package/dist/v2/db/schema/1.0.0/subject.d.ts.map +1 -0
  277. package/dist/v2/db/schema/index.cjs +326 -0
  278. package/dist/v2/db/schema/index.d.ts +1507 -0
  279. package/dist/v2/db/schema/index.d.ts.map +1 -0
  280. package/dist/v2/db/schema/index.js +241 -0
  281. package/dist/v2/define-config.cjs +36 -0
  282. package/dist/v2/define-config.d.ts +5 -0
  283. package/dist/v2/define-config.d.ts.map +1 -0
  284. package/dist/v2/define-config.js +2 -0
  285. package/dist/v2/handlers/consent/index.d.ts +260 -0
  286. package/dist/v2/handlers/consent/index.d.ts.map +1 -0
  287. package/dist/v2/handlers/consent/post.handler.d.ts +136 -0
  288. package/dist/v2/handlers/consent/post.handler.d.ts.map +1 -0
  289. package/dist/v2/handlers/consent/show-banner/geo.d.ts +10 -0
  290. package/dist/v2/handlers/consent/show-banner/geo.d.ts.map +1 -0
  291. package/dist/v2/handlers/consent/show-banner/geo.test.d.ts +2 -0
  292. package/dist/v2/handlers/consent/show-banner/geo.test.d.ts.map +1 -0
  293. package/dist/v2/handlers/consent/show-banner/handler.d.ts +71 -0
  294. package/dist/v2/handlers/consent/show-banner/handler.d.ts.map +1 -0
  295. package/dist/v2/handlers/consent/show-banner/handler.test.d.ts +2 -0
  296. package/dist/v2/handlers/consent/show-banner/handler.test.d.ts.map +1 -0
  297. package/dist/v2/handlers/consent/show-banner/translations.d.ts +13 -0
  298. package/dist/v2/handlers/consent/show-banner/translations.d.ts.map +1 -0
  299. package/dist/v2/handlers/consent/show-banner/translations.test.d.ts +2 -0
  300. package/dist/v2/handlers/consent/show-banner/translations.test.d.ts.map +1 -0
  301. package/dist/v2/handlers/consent/verify.handler.d.ts +103 -0
  302. package/dist/v2/handlers/consent/verify.handler.d.ts.map +1 -0
  303. package/dist/v2/handlers/meta/index.d.ts +19 -0
  304. package/dist/v2/handlers/meta/index.d.ts.map +1 -0
  305. package/dist/v2/handlers/meta/status.handler.d.ts +17 -0
  306. package/dist/v2/handlers/meta/status.handler.d.ts.map +1 -0
  307. package/dist/v2/init.d.ts +3 -0
  308. package/dist/v2/init.d.ts.map +1 -0
  309. package/dist/v2/init.test.d.ts +2 -0
  310. package/dist/v2/init.test.d.ts.map +1 -0
  311. package/dist/v2/middleware/cors/cors.d.ts +37 -0
  312. package/dist/v2/middleware/cors/cors.d.ts.map +1 -0
  313. package/dist/v2/middleware/cors/cors.test.d.ts +2 -0
  314. package/dist/v2/middleware/cors/cors.test.d.ts.map +1 -0
  315. package/dist/v2/middleware/cors/index.d.ts +30 -0
  316. package/dist/v2/middleware/cors/index.d.ts.map +1 -0
  317. package/dist/v2/middleware/cors/is-origin-trusted.d.ts +49 -0
  318. package/dist/v2/middleware/cors/is-origin-trusted.d.ts.map +1 -0
  319. package/dist/v2/middleware/cors/is-origin-trusted.test.d.ts +2 -0
  320. package/dist/v2/middleware/cors/is-origin-trusted.test.d.ts.map +1 -0
  321. package/dist/v2/middleware/cors/process-cors.d.ts +31 -0
  322. package/dist/v2/middleware/cors/process-cors.d.ts.map +1 -0
  323. package/dist/v2/middleware/openapi/config.d.ts +28 -0
  324. package/dist/v2/middleware/openapi/config.d.ts.map +1 -0
  325. package/dist/v2/middleware/openapi/handlers.d.ts +29 -0
  326. package/dist/v2/middleware/openapi/handlers.d.ts.map +1 -0
  327. package/dist/v2/middleware/openapi/index.d.ts +11 -0
  328. package/dist/v2/middleware/openapi/index.d.ts.map +1 -0
  329. package/dist/v2/middleware/process-ip/index.d.ts +3 -0
  330. package/dist/v2/middleware/process-ip/index.d.ts.map +1 -0
  331. package/dist/v2/router.cjs +1275 -0
  332. package/dist/v2/router.d.ts +280 -0
  333. package/dist/v2/router.d.ts.map +1 -0
  334. package/dist/v2/router.js +1231 -0
  335. package/dist/v2/types/api.d.ts +27 -0
  336. package/dist/v2/types/api.d.ts.map +1 -0
  337. package/dist/v2/types/index.cjs +40 -0
  338. package/dist/v2/types/index.d.ts +104 -0
  339. package/dist/v2/types/index.d.ts.map +1 -0
  340. package/dist/v2/types/index.js +6 -0
  341. package/dist/v2/utils/create-telemetry-options.d.ts +28 -0
  342. package/dist/v2/utils/create-telemetry-options.d.ts.map +1 -0
  343. package/dist/v2/utils/env.d.ts +60 -0
  344. package/dist/v2/utils/env.d.ts.map +1 -0
  345. package/dist/v2/utils/index.d.ts +3 -0
  346. package/dist/v2/utils/index.d.ts.map +1 -0
  347. package/dist/v2/utils/logger.d.ts +16 -0
  348. package/dist/v2/utils/logger.d.ts.map +1 -0
  349. package/dist/version.d.ts +1 -1
  350. package/package.json +106 -15
  351. package/readme.json +30 -0
  352. package/rslib.config.ts +13 -14
  353. package/src/__tests__/server.test.ts +1 -1
  354. package/src/contracts/consent/post.contract.test.ts +3 -8
  355. package/src/contracts/consent/post.contract.ts +13 -13
  356. package/src/contracts/consent/show-banner.contract.test.ts +9 -0
  357. package/src/contracts/consent/show-banner.contract.ts +2 -0
  358. package/src/contracts/consent/verify.contract.ts +19 -23
  359. package/src/core.ts +7 -0
  360. package/src/handlers/consent/show-banner/handler.ts +12 -9
  361. package/src/handlers/consent/show-banner/translations.ts +2 -2
  362. package/src/init.ts +9 -6
  363. package/src/middleware/openapi/index.ts +2 -2
  364. package/src/pkgs/api-router/hooks/__tests__/processor.test.ts +1 -1
  365. package/src/pkgs/data-model/fields/index.ts +17 -22
  366. package/src/pkgs/data-model/fields/zod-fields.ts +14 -26
  367. package/src/pkgs/data-model/hooks/index.ts +3 -2
  368. package/src/pkgs/data-model/index.ts +2 -4
  369. package/src/pkgs/data-model/schema/index.ts +6 -7
  370. package/src/pkgs/data-model/schema/schemas.ts +3 -3
  371. package/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts +4 -1
  372. package/src/pkgs/db-adapters/adapters/index.ts +2 -2
  373. package/src/pkgs/db-adapters/adapters/kysely-adapter/index.ts +4 -4
  374. package/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts +4 -5
  375. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/postgres.test.ts +2 -4
  376. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/sqlite.test.ts +2 -3
  377. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts +1 -6
  378. package/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts +4 -1
  379. package/src/pkgs/db-adapters/adapters/prisma-adapter/index.ts +1 -1
  380. package/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts +5 -2
  381. package/src/pkgs/db-adapters/index.ts +12 -13
  382. package/src/pkgs/migrations/get-migration.ts +4 -2
  383. package/src/pkgs/migrations/get-schema/get-schema.ts +0 -1
  384. package/src/pkgs/migrations/get-schema/process-fields.ts +1 -1
  385. package/src/pkgs/migrations/get-schema/process-tables.ts +0 -2
  386. package/src/pkgs/migrations/index.ts +7 -8
  387. package/src/pkgs/results/__tests__/error-codes.test.ts +2 -2
  388. package/src/pkgs/results/index.ts +22 -27
  389. package/src/pkgs/results/orpc-error-handler.ts +1 -1
  390. package/src/pkgs/results/results/result-helpers.ts +1 -1
  391. package/src/pkgs/types/index.ts +4 -4
  392. package/src/pkgs/types/options.ts +10 -3
  393. package/src/pkgs/utils/index.ts +1 -1
  394. package/src/pkgs/utils/logger.ts +1 -1
  395. package/src/schema/audit-log/schema.ts +3 -3
  396. package/src/schema/consent/schema.ts +4 -4
  397. package/src/schema/consent-policy/schema.ts +3 -3
  398. package/src/schema/consent-purpose/schema.ts +4 -4
  399. package/src/schema/consent-record/schema.ts +3 -3
  400. package/src/schema/definition.ts +1 -1
  401. package/src/schema/domain/schema.ts +5 -5
  402. package/src/schema/index.ts +14 -17
  403. package/src/schema/subject/schema.ts +3 -3
  404. package/src/schema/types.ts +1 -1
  405. package/src/testing/contract-testing.ts +15 -52
  406. package/src/types/index.ts +8 -8
  407. package/src/types/options.ts +2 -3
  408. package/src/v2/contracts/consent/index.test.ts +5 -0
  409. package/src/v2/contracts/consent/index.ts +9 -0
  410. package/src/v2/contracts/consent/post.contract.test.ts +521 -0
  411. package/src/v2/contracts/consent/post.contract.ts +155 -0
  412. package/src/v2/contracts/consent/show-banner.contract.test.ts +252 -0
  413. package/src/v2/contracts/consent/show-banner.contract.ts +73 -0
  414. package/src/v2/contracts/consent/verify.contract.test.ts +185 -0
  415. package/src/v2/contracts/consent/verify.contract.ts +122 -0
  416. package/src/v2/contracts/index.ts +20 -0
  417. package/src/v2/contracts/meta/index.test.ts +5 -0
  418. package/src/v2/contracts/meta/index.ts +5 -0
  419. package/src/v2/contracts/meta/status.contract.test.ts +226 -0
  420. package/src/v2/contracts/meta/status.contract.ts +34 -0
  421. package/src/v2/contracts/shared/jurisdiction.schema.ts +30 -0
  422. package/src/v2/contracts/test.utils.ts +400 -0
  423. package/src/v2/core.ts +379 -0
  424. package/src/v2/db/adapters/drizzle.ts +1 -0
  425. package/src/v2/db/adapters/index.ts +1 -0
  426. package/src/v2/db/adapters/kysely.ts +1 -0
  427. package/src/v2/db/adapters/mongo.ts +1 -0
  428. package/src/v2/db/adapters/prisma.ts +1 -0
  429. package/src/v2/db/adapters/typeorm.ts +1 -0
  430. package/src/v2/db/migrator/index.ts +80 -0
  431. package/src/v2/db/registry/audit-log.test.ts +77 -0
  432. package/src/v2/db/registry/audit-log.ts +46 -0
  433. package/src/v2/db/registry/consent-policy.test.ts +778 -0
  434. package/src/v2/db/registry/consent-policy.ts +74 -0
  435. package/src/v2/db/registry/consent-purpose.test.ts +485 -0
  436. package/src/v2/db/registry/consent-purpose.ts +41 -0
  437. package/src/v2/db/registry/consent.test.ts +843 -0
  438. package/src/v2/db/registry/consent.ts +42 -0
  439. package/src/v2/db/registry/domain.test.ts +463 -0
  440. package/src/v2/db/registry/domain.ts +51 -0
  441. package/src/v2/db/registry/index.ts +18 -0
  442. package/src/v2/db/registry/subject.test.ts +497 -0
  443. package/src/v2/db/registry/subject.ts +101 -0
  444. package/src/v2/db/registry/types.ts +10 -0
  445. package/src/v2/db/registry/utils/generate-id.test.ts +217 -0
  446. package/src/v2/db/registry/utils/generate-id.ts +134 -0
  447. package/src/v2/db/registry/utils.ts +134 -0
  448. package/src/v2/db/schema/1.0.0/audit-log.ts +32 -0
  449. package/src/v2/db/schema/1.0.0/consent-policy.ts +41 -0
  450. package/src/v2/db/schema/1.0.0/consent-purpose.ts +30 -0
  451. package/src/v2/db/schema/1.0.0/consent-record.ts +22 -0
  452. package/src/v2/db/schema/1.0.0/consent.ts +38 -0
  453. package/src/v2/db/schema/1.0.0/domain.ts +26 -0
  454. package/src/v2/db/schema/1.0.0/index.ts +56 -0
  455. package/src/v2/db/schema/1.0.0/subject.ts +26 -0
  456. package/src/v2/db/schema/index.ts +9 -0
  457. package/src/v2/define-config.ts +5 -0
  458. package/src/v2/handlers/consent/index.ts +9 -0
  459. package/src/v2/handlers/consent/post.handler.ts +254 -0
  460. package/src/v2/handlers/consent/show-banner/geo.test.ts +281 -0
  461. package/src/v2/handlers/consent/show-banner/geo.ts +96 -0
  462. package/src/v2/handlers/consent/show-banner/handler.test.ts +374 -0
  463. package/src/v2/handlers/consent/show-banner/handler.ts +123 -0
  464. package/src/v2/handlers/consent/show-banner/translations.test.ts +121 -0
  465. package/src/v2/handlers/consent/show-banner/translations.ts +79 -0
  466. package/src/v2/handlers/consent/verify.handler.ts +288 -0
  467. package/src/v2/handlers/meta/index.ts +5 -0
  468. package/src/v2/handlers/meta/status.handler.ts +43 -0
  469. package/src/v2/init.test.ts +114 -0
  470. package/src/v2/init.ts +126 -0
  471. package/src/v2/middleware/cors/cors.test.ts +111 -0
  472. package/src/v2/middleware/cors/cors.ts +192 -0
  473. package/src/v2/middleware/cors/index.ts +30 -0
  474. package/src/v2/middleware/cors/is-origin-trusted.test.ts +104 -0
  475. package/src/v2/middleware/cors/is-origin-trusted.ts +126 -0
  476. package/src/v2/middleware/cors/process-cors.ts +91 -0
  477. package/src/v2/middleware/openapi/config.ts +27 -0
  478. package/src/v2/middleware/openapi/handlers.ts +132 -0
  479. package/src/v2/middleware/openapi/index.ts +11 -0
  480. package/src/v2/middleware/process-ip/index.ts +39 -0
  481. package/src/v2/router.ts +8 -0
  482. package/src/v2/types/api.ts +32 -0
  483. package/src/v2/types/index.ts +121 -0
  484. package/src/v2/utils/create-telemetry-options.ts +115 -0
  485. package/src/v2/utils/env.ts +84 -0
  486. package/src/v2/utils/index.ts +2 -0
  487. package/src/v2/utils/logger.ts +38 -0
  488. package/src/version.ts +1 -1
  489. package/vitest.config.ts +11 -2
@@ -22,32 +22,20 @@ const COMMON_TIMEZONES = {
22
22
  };
23
23
  (0, __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__["default"])('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
24
24
  const fieldConfigSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
25
- required: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true),
26
- returned: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true),
27
- input: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true),
28
- defaultValue: __WEBPACK_EXTERNAL_MODULE_zod__.z.union([
29
- __WEBPACK_EXTERNAL_MODULE_zod__.z.any(),
30
- __WEBPACK_EXTERNAL_MODULE_zod__.z["function"]().returns(__WEBPACK_EXTERNAL_MODULE_zod__.z.any())
31
- ]).optional(),
25
+ required: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
26
+ returned: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
27
+ input: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
28
+ defaultValue: __WEBPACK_EXTERNAL_MODULE_zod__.z.any().optional(),
32
29
  transform: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
33
- input: __WEBPACK_EXTERNAL_MODULE_zod__.z["function"]().args(__WEBPACK_EXTERNAL_MODULE_zod__.z.any()).returns(__WEBPACK_EXTERNAL_MODULE_zod__.z.union([
34
- __WEBPACK_EXTERNAL_MODULE_zod__.z.any(),
35
- __WEBPACK_EXTERNAL_MODULE_zod__.z.promise(__WEBPACK_EXTERNAL_MODULE_zod__.z.any())
36
- ])).optional(),
37
- output: __WEBPACK_EXTERNAL_MODULE_zod__.z["function"]().args(__WEBPACK_EXTERNAL_MODULE_zod__.z.any()).returns(__WEBPACK_EXTERNAL_MODULE_zod__.z.union([
38
- __WEBPACK_EXTERNAL_MODULE_zod__.z.any(),
39
- __WEBPACK_EXTERNAL_MODULE_zod__.z.promise(__WEBPACK_EXTERNAL_MODULE_zod__.z.any())
40
- ])).optional()
30
+ input: __WEBPACK_EXTERNAL_MODULE_zod__.z.any().optional(),
31
+ output: __WEBPACK_EXTERNAL_MODULE_zod__.z.any().optional()
41
32
  }).optional(),
42
- validator: __WEBPACK_EXTERNAL_MODULE_zod__.z["function"]().args(__WEBPACK_EXTERNAL_MODULE_zod__.z.any()).returns(__WEBPACK_EXTERNAL_MODULE_zod__.z.union([
43
- __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
44
- __WEBPACK_EXTERNAL_MODULE_zod__.z["null"]()
45
- ])).optional(),
33
+ validator: __WEBPACK_EXTERNAL_MODULE_zod__.z.any().optional(),
46
34
  unique: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().optional(),
47
35
  indexed: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().optional(),
48
- sortable: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true),
36
+ sortable: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
49
37
  fieldName: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
50
- bigint: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(false)
38
+ bigint: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(false)
51
39
  });
52
40
  const stringFieldSchema = fieldConfigSchema.extend({
53
41
  type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('string'),
@@ -67,18 +55,18 @@ const dateFieldSchema = fieldConfigSchema.extend({
67
55
  type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('date'),
68
56
  minDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().optional(),
69
57
  maxDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().optional(),
70
- dateOnly: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(false),
71
- format: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional()
58
+ dateOnly: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(false),
59
+ format: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional()
72
60
  });
73
61
  const timezoneFieldSchema = fieldConfigSchema.extend({
74
62
  type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('timezone'),
75
- validateTimezone: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true),
63
+ validateTimezone: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
76
64
  suggestedValues: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional(),
77
- restrictToSuggestedValues: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(false)
65
+ restrictToSuggestedValues: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(false)
78
66
  });
79
67
  const jsonFieldSchema = fieldConfigSchema.extend({
80
68
  type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('json'),
81
- validateJson: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true)
69
+ validateJson: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true)
82
70
  });
83
71
  const stringArrayFieldSchema = fieldConfigSchema.extend({
84
72
  type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('string[]')
@@ -96,6 +84,125 @@ __WEBPACK_EXTERNAL_MODULE_zod__.z.discriminatedUnion('type', [
96
84
  stringArrayFieldSchema,
97
85
  numberArrayFieldSchema
98
86
  ]);
87
+ async function processHooks(data, model, operation, phase, hooks, context) {
88
+ let currentData = {
89
+ ...data
90
+ };
91
+ for (const hookSet of hooks){
92
+ const modelHooks = hookSet[model];
93
+ if (!modelHooks) continue;
94
+ const operationHooks = modelHooks[operation];
95
+ if (!operationHooks) continue;
96
+ const hookFn = operationHooks[phase];
97
+ if (hookFn) if ('before' === phase) {
98
+ const result = await hookFn(currentData, context);
99
+ if (result && 'object' == typeof result && 'kind' in result) switch(result.kind){
100
+ case 'abort':
101
+ return null;
102
+ case 'transform':
103
+ {
104
+ const transformData = result.data;
105
+ currentData = {
106
+ ...currentData,
107
+ ...transformData
108
+ };
109
+ break;
110
+ }
111
+ default:
112
+ break;
113
+ }
114
+ } else await hookFn(currentData, context);
115
+ }
116
+ return currentData;
117
+ }
118
+ async function processAfterHooksForMany(records, model, hooks, context) {
119
+ if (!records.length) return;
120
+ for (const record of records)await processHooks(record, model, 'update', 'after', hooks, context);
121
+ }
122
+ async function create_hooks_createWithHooks(adapter, ctx, props) {
123
+ const { data, model, customFn, context } = props;
124
+ const hooks = ctx.hooks || [];
125
+ const transformedData = await processHooks(data, model, 'create', 'before', hooks, context);
126
+ if (null === transformedData) return null;
127
+ let created = null;
128
+ if (customFn) {
129
+ created = await customFn.fn(transformedData);
130
+ if (!customFn.executeMainFn && created) return created;
131
+ }
132
+ if (!created) created = await adapter.create({
133
+ model: model,
134
+ data: transformedData
135
+ });
136
+ if (created) await processHooks(created, model, 'create', 'after', hooks, context);
137
+ return created;
138
+ }
139
+ async function update_hooks_updateWithHooks(adapter, ctx, props) {
140
+ const { data, where, model, customFn, context } = props;
141
+ const hooks = ctx.hooks || [];
142
+ const transformedData = await processHooks(data, model, 'update', 'before', hooks, context);
143
+ if (null === transformedData) return null;
144
+ let updated = null;
145
+ if (customFn) {
146
+ const result = await customFn.fn(transformedData);
147
+ updated = result;
148
+ if (!customFn.executeMainFn && updated) return updated;
149
+ }
150
+ if (!updated) updated = await adapter.update({
151
+ model: model,
152
+ update: transformedData,
153
+ where
154
+ });
155
+ if (updated) await processHooks(updated, model, 'update', 'after', hooks, context);
156
+ return updated;
157
+ }
158
+ async function executeCustomFunction(data, customFn) {
159
+ if (!customFn) return {
160
+ result: null,
161
+ shouldContinue: true
162
+ };
163
+ const result = await customFn.fn(data);
164
+ const shouldContinue = !result || !!customFn.executeMainFn;
165
+ return {
166
+ result,
167
+ shouldContinue
168
+ };
169
+ }
170
+ function processUpdateManyResult(result) {
171
+ if (Array.isArray(result)) return result;
172
+ if ('number' == typeof result && result > 0) return [];
173
+ return null;
174
+ }
175
+ async function updateManyWithHooks(adapter, ctx, props) {
176
+ const { data, where, model, customFn, context } = props;
177
+ const hooks = ctx.hooks || [];
178
+ const transformedData = await processHooks(data, model, 'update', 'before', hooks, context);
179
+ if (null === transformedData) return null;
180
+ const { result: customResult, shouldContinue } = await executeCustomFunction(transformedData, customFn);
181
+ if (customResult && !shouldContinue) return customResult;
182
+ let updated = customResult;
183
+ if (!updated) {
184
+ const adapterResult = await adapter.updateMany({
185
+ model: model,
186
+ update: transformedData,
187
+ where
188
+ });
189
+ updated = processUpdateManyResult(adapterResult);
190
+ }
191
+ if (updated && updated.length > 0) await processAfterHooksForMany(updated, model, hooks, context);
192
+ return updated;
193
+ }
194
+ function getWithHooks(adapter, ctx) {
195
+ return {
196
+ createWithHooks: ({ data, model, customFn, context })=>create_hooks_createWithHooks(adapter, ctx, {
197
+ data,
198
+ model,
199
+ customFn,
200
+ context
201
+ }),
202
+ updateWithHooks: (props)=>update_hooks_updateWithHooks(adapter, ctx, props),
203
+ updateManyWithHooks: (props)=>updateManyWithHooks(adapter, ctx, props)
204
+ };
205
+ }
99
206
  const error_codes_ERROR_CODES = Object.freeze({
100
207
  NOT_FOUND: 'Resource not found',
101
208
  BAD_REQUEST: 'Bad request',
@@ -285,9 +392,9 @@ const auditLogSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
285
392
  subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
286
393
  ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
287
394
  userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
288
- changes: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
289
- metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
290
- createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date())
395
+ changes: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
396
+ metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
397
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
291
398
  });
292
399
  function getAuditLogTable(options, auditLogFields) {
293
400
  const auditLogConfig = options.tables?.auditLog;
@@ -386,6 +493,128 @@ function getAuditLogTable(options, auditLogFields) {
386
493
  order: 5
387
494
  };
388
495
  }
496
+ const consentSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
497
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
498
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
499
+ domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
500
+ purposeIds: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
501
+ metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).nullable().optional(),
502
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
503
+ ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable().optional(),
504
+ userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable().optional(),
505
+ status: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
506
+ 'active',
507
+ 'withdrawn',
508
+ 'expired'
509
+ ]).prefault('active'),
510
+ withdrawalReason: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable().optional(),
511
+ givenAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
512
+ validUntil: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullable().optional(),
513
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true)
514
+ });
515
+ function getConsentTable(options, consentFields) {
516
+ const consentConfig = options.tables?.consent;
517
+ const subjectConfig = options.tables?.subject;
518
+ const domainConfig = options.tables?.domain;
519
+ const policyConfig = options.tables?.consentPolicy;
520
+ return {
521
+ entityName: consentConfig?.entityName || 'consent',
522
+ entityPrefix: consentConfig?.entityPrefix || 'cns',
523
+ schema: consentSchema,
524
+ fields: {
525
+ subjectId: {
526
+ type: 'string',
527
+ required: true,
528
+ fieldName: consentConfig?.fields?.subjectId || 'subjectId',
529
+ references: {
530
+ model: subjectConfig?.entityName || 'subject',
531
+ field: 'id'
532
+ }
533
+ },
534
+ domainId: {
535
+ type: 'string',
536
+ required: true,
537
+ fieldName: consentConfig?.fields?.domainId || 'domainId',
538
+ references: {
539
+ model: domainConfig?.entityName || 'domain',
540
+ field: 'id'
541
+ }
542
+ },
543
+ purposeIds: {
544
+ type: 'json',
545
+ required: false,
546
+ fieldName: consentConfig?.fields?.purposeIds || 'purposeIds'
547
+ },
548
+ metadata: {
549
+ type: 'json',
550
+ required: false,
551
+ fieldName: consentConfig?.fields?.metadata || 'metadata'
552
+ },
553
+ policyId: {
554
+ type: 'string',
555
+ required: false,
556
+ fieldName: consentConfig?.fields?.policyId || 'policyId',
557
+ references: {
558
+ model: policyConfig?.entityName || 'consentPolicy',
559
+ field: 'id'
560
+ }
561
+ },
562
+ ipAddress: {
563
+ type: 'string',
564
+ required: false,
565
+ fieldName: consentConfig?.fields?.ipAddress || 'ipAddress'
566
+ },
567
+ userAgent: {
568
+ type: 'string',
569
+ required: false,
570
+ fieldName: consentConfig?.fields?.userAgent || 'userAgent'
571
+ },
572
+ status: {
573
+ type: 'string',
574
+ defaultValue: ()=>'active',
575
+ required: true,
576
+ fieldName: consentConfig?.fields?.status || 'status'
577
+ },
578
+ withdrawalReason: {
579
+ type: 'string',
580
+ required: false,
581
+ fieldName: consentConfig?.fields?.withdrawalReason || 'withdrawalReason'
582
+ },
583
+ givenAt: {
584
+ type: 'date',
585
+ defaultValue: ()=>new Date(),
586
+ required: true,
587
+ fieldName: consentConfig?.fields?.givenAt || 'givenAt'
588
+ },
589
+ validUntil: {
590
+ type: 'date',
591
+ required: false,
592
+ fieldName: consentConfig?.fields?.validUntil || 'validUntil',
593
+ transform: {
594
+ input: (val, data)=>{
595
+ if (val) return val;
596
+ const expiresIn = consentConfig?.expiresIn || 31536000;
597
+ const givenAt = data.givenAt instanceof Date ? data.givenAt : new Date();
598
+ if (expiresIn > 0) {
599
+ const validUntil = new Date(givenAt);
600
+ validUntil.setSeconds(validUntil.getSeconds() + expiresIn);
601
+ return validUntil;
602
+ }
603
+ }
604
+ }
605
+ },
606
+ isActive: {
607
+ type: 'boolean',
608
+ defaultValue: true,
609
+ required: true,
610
+ fieldName: consentConfig?.fields?.isActive || 'isActive'
611
+ },
612
+ ...consentFields || {},
613
+ ...consentConfig?.additionalFields || {}
614
+ },
615
+ order: 3
616
+ };
617
+ }
389
618
  const PolicyTypeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
390
619
  'cookie_banner',
391
620
  'privacy_policy',
@@ -404,9 +633,9 @@ const consentPolicySchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
404
633
  expirationDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullable().optional(),
405
634
  content: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
406
635
  contentHash: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
407
- isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true),
408
- createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date()),
409
- updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date())
636
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
637
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
638
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
410
639
  });
411
640
  function getConsentPolicyTable(options, policyFields) {
412
641
  const consentPolicyConfig = options.tables?.consentPolicy;
@@ -473,12 +702,12 @@ const purposeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
473
702
  code: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
474
703
  name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
475
704
  description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
476
- isEssential: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(false),
705
+ isEssential: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(false),
477
706
  dataCategory: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
478
707
  legalBasis: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
479
- isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true),
480
- createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date()),
481
- updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date())
708
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
709
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
710
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
482
711
  });
483
712
  function getPurposeTable(options, purposeFields) {
484
713
  const purposeConfig = options.tables?.consentPurpose;
@@ -547,9 +776,9 @@ const consentRecordSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
547
776
  subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
548
777
  consentId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
549
778
  actionType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
550
- details: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
551
- createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date()),
552
- updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date())
779
+ details: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
780
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
781
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
553
782
  });
554
783
  function getConsentRecordTable(options, recordFields) {
555
784
  const recordConfig = options.tables?.record;
@@ -600,137 +829,15 @@ function getConsentRecordTable(options, recordFields) {
600
829
  order: 4
601
830
  };
602
831
  }
603
- const consentSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
832
+ const domainSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
604
833
  id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
605
- subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
606
- domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
607
- purposeIds: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
608
- metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).nullable().optional(),
609
- policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
610
- ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable().optional(),
611
- userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable().optional(),
612
- status: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
613
- 'active',
614
- 'withdrawn',
615
- 'expired'
616
- ]).default('active'),
617
- withdrawalReason: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable().optional(),
618
- givenAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date()),
619
- validUntil: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullable().optional(),
620
- isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true)
621
- });
622
- function getConsentTable(options, consentFields) {
623
- const consentConfig = options.tables?.consent;
624
- const subjectConfig = options.tables?.subject;
625
- const domainConfig = options.tables?.domain;
626
- const policyConfig = options.tables?.consentPolicy;
627
- return {
628
- entityName: consentConfig?.entityName || 'consent',
629
- entityPrefix: consentConfig?.entityPrefix || 'cns',
630
- schema: consentSchema,
631
- fields: {
632
- subjectId: {
633
- type: 'string',
634
- required: true,
635
- fieldName: consentConfig?.fields?.subjectId || 'subjectId',
636
- references: {
637
- model: subjectConfig?.entityName || 'subject',
638
- field: 'id'
639
- }
640
- },
641
- domainId: {
642
- type: 'string',
643
- required: true,
644
- fieldName: consentConfig?.fields?.domainId || 'domainId',
645
- references: {
646
- model: domainConfig?.entityName || 'domain',
647
- field: 'id'
648
- }
649
- },
650
- purposeIds: {
651
- type: 'json',
652
- required: false,
653
- fieldName: consentConfig?.fields?.purposeIds || 'purposeIds'
654
- },
655
- metadata: {
656
- type: 'json',
657
- required: false,
658
- fieldName: consentConfig?.fields?.metadata || 'metadata'
659
- },
660
- policyId: {
661
- type: 'string',
662
- required: false,
663
- fieldName: consentConfig?.fields?.policyId || 'policyId',
664
- references: {
665
- model: policyConfig?.entityName || 'consentPolicy',
666
- field: 'id'
667
- }
668
- },
669
- ipAddress: {
670
- type: 'string',
671
- required: false,
672
- fieldName: consentConfig?.fields?.ipAddress || 'ipAddress'
673
- },
674
- userAgent: {
675
- type: 'string',
676
- required: false,
677
- fieldName: consentConfig?.fields?.userAgent || 'userAgent'
678
- },
679
- status: {
680
- type: 'string',
681
- defaultValue: ()=>'active',
682
- required: true,
683
- fieldName: consentConfig?.fields?.status || 'status'
684
- },
685
- withdrawalReason: {
686
- type: 'string',
687
- required: false,
688
- fieldName: consentConfig?.fields?.withdrawalReason || 'withdrawalReason'
689
- },
690
- givenAt: {
691
- type: 'date',
692
- defaultValue: ()=>new Date(),
693
- required: true,
694
- fieldName: consentConfig?.fields?.givenAt || 'givenAt'
695
- },
696
- validUntil: {
697
- type: 'date',
698
- required: false,
699
- fieldName: consentConfig?.fields?.validUntil || 'validUntil',
700
- transform: {
701
- input: (val, data)=>{
702
- if (val) return val;
703
- const expiresIn = consentConfig?.expiresIn || 31536000;
704
- const givenAt = data.givenAt instanceof Date ? data.givenAt : new Date();
705
- if (expiresIn > 0) {
706
- const validUntil = new Date(givenAt);
707
- validUntil.setSeconds(validUntil.getSeconds() + expiresIn);
708
- return validUntil;
709
- }
710
- }
711
- }
712
- },
713
- isActive: {
714
- type: 'boolean',
715
- defaultValue: true,
716
- required: true,
717
- fieldName: consentConfig?.fields?.isActive || 'isActive'
718
- },
719
- ...consentFields || {},
720
- ...consentConfig?.additionalFields || {}
721
- },
722
- order: 3
723
- };
724
- }
725
- const domainSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
726
- id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
727
- name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().min(1),
728
- description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
729
- allowedOrigins: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional().default([]),
730
- isVerified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true),
731
- isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true),
732
- createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date()),
733
- updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date())
834
+ name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().min(1),
835
+ description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
836
+ allowedOrigins: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional().prefault([]),
837
+ isVerified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
838
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
839
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
840
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
734
841
  });
735
842
  function getDomainTable(options, domainFields) {
736
843
  const domainConfig = options.tables?.domain;
@@ -787,12 +894,12 @@ function getDomainTable(options, domainFields) {
787
894
  }
788
895
  const subjectSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
789
896
  id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
790
- isIdentified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(false),
897
+ isIdentified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(false),
791
898
  externalId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable().optional(),
792
899
  identityProvider: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
793
900
  lastIpAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
794
- createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date()),
795
- updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date())
901
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
902
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
796
903
  });
797
904
  function getSubjectTable(options, subjectFields) {
798
905
  const subjectConfig = options.tables?.subject;
@@ -889,157 +996,6 @@ function validateEntityOutput(tableName, data, options) {
889
996
  throw error;
890
997
  }
891
998
  }
892
- function subjectRegistry({ adapter, ...ctx }) {
893
- const { createWithHooks } = getWithHooks(adapter, ctx);
894
- return {
895
- createSubject: async (subject, context)=>{
896
- const createdSubject = await createWithHooks({
897
- data: {
898
- createdAt: new Date(),
899
- updatedAt: new Date(),
900
- ...subject
901
- },
902
- model: 'subject',
903
- customFn: void 0,
904
- context
905
- });
906
- return createdSubject ? validateEntityOutput('subject', createdSubject, ctx.options) : null;
907
- },
908
- findOrCreateSubject: async function({ subjectId, externalSubjectId, ipAddress = 'unknown', context }) {
909
- if (subjectId && externalSubjectId) {
910
- const [subjectById, subjectByExternalId] = await Promise.all([
911
- this.findSubjectById(subjectId),
912
- this.findSubjectByExternalId(externalSubjectId)
913
- ]);
914
- if (!subjectById || !subjectByExternalId) {
915
- ctx.logger?.error('Subject validation failed: One or both subjects not found', {
916
- providedSubjectId: subjectId,
917
- providedExternalId: externalSubjectId,
918
- subjectByIdFound: !!subjectById,
919
- subjectByExternalIdFound: !!subjectByExternalId
920
- });
921
- throw new error_class_DoubleTieError('The specified subject could not be found. Please verify the subject identifiers and try again.', {
922
- code: error_codes_ERROR_CODES.NOT_FOUND,
923
- status: 404,
924
- meta: {
925
- providedSubjectId: subjectId,
926
- providedExternalId: externalSubjectId
927
- }
928
- });
929
- }
930
- if (subjectById.id !== subjectByExternalId.id) {
931
- ctx.logger?.warn('Subject validation failed: IDs do not match the same subject', {
932
- providedSubjectId: subjectId,
933
- providedExternalId: externalSubjectId,
934
- subjectByIdId: subjectById.id,
935
- subjectByExternalIdId: subjectByExternalId.id
936
- });
937
- throw new error_class_DoubleTieError('The provided subjectId and externalSubjectId do not match the same subject. Please ensure both identifiers refer to the same subject.', {
938
- code: error_codes_ERROR_CODES.CONFLICT,
939
- status: 409,
940
- meta: {
941
- providedSubjectId: subjectId,
942
- providedExternalId: externalSubjectId,
943
- subjectByIdId: subjectById.id,
944
- subjectByExternalIdId: subjectByExternalId.id
945
- }
946
- });
947
- }
948
- return subjectById;
949
- }
950
- if (subjectId) {
951
- const subject = await this.findSubjectById(subjectId);
952
- if (subject) return subject;
953
- throw new error_class_DoubleTieError('Subject not found by subjectId', {
954
- code: error_codes_ERROR_CODES.NOT_FOUND,
955
- status: 404
956
- });
957
- }
958
- if (externalSubjectId) try {
959
- const subject = await this.findSubjectByExternalId(externalSubjectId);
960
- if (subject) {
961
- ctx.logger?.debug('Found existing subject by external ID', {
962
- externalSubjectId
963
- });
964
- return subject;
965
- }
966
- ctx.logger?.info('Creating new subject with external ID', {
967
- externalSubjectId
968
- });
969
- return await this.createSubject({
970
- externalId: externalSubjectId,
971
- identityProvider: 'external',
972
- lastIpAddress: ipAddress,
973
- isIdentified: true
974
- }, context);
975
- } catch (error) {
976
- if (error instanceof Error && error.message.includes('unique constraint')) {
977
- ctx.logger?.info('Handling duplicate key violation for external ID', {
978
- externalSubjectId
979
- });
980
- const subject = await this.findSubjectByExternalId(externalSubjectId);
981
- if (subject) return subject;
982
- }
983
- ctx.logger?.error('Failed to create or find subject with external ID', {
984
- externalSubjectId,
985
- error: error instanceof Error ? error.message : 'Unknown error'
986
- });
987
- throw new error_class_DoubleTieError('Failed to create or find subject with external ID', {
988
- code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
989
- status: 500,
990
- meta: {
991
- error: error instanceof Error ? error.message : 'Unknown error'
992
- }
993
- });
994
- }
995
- try {
996
- ctx.logger?.info('Creating new anonymous subject');
997
- return await this.createSubject({
998
- externalId: null,
999
- identityProvider: 'anonymous',
1000
- lastIpAddress: ipAddress,
1001
- isIdentified: false
1002
- }, context);
1003
- } catch (error) {
1004
- ctx.logger?.error('Failed to create anonymous subject', {
1005
- ipAddress,
1006
- error: error instanceof Error ? error.message : 'Unknown error'
1007
- });
1008
- throw new error_class_DoubleTieError('Failed to create anonymous subject', {
1009
- code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1010
- status: 500,
1011
- meta: {
1012
- error: error instanceof Error ? error.message : 'Unknown error'
1013
- }
1014
- });
1015
- }
1016
- },
1017
- findSubjectById: async (subjectId)=>{
1018
- const subject = await adapter.findOne({
1019
- model: 'subject',
1020
- where: [
1021
- {
1022
- field: 'id',
1023
- value: subjectId
1024
- }
1025
- ]
1026
- });
1027
- return subject ? validateEntityOutput('subject', subject, ctx.options) : null;
1028
- },
1029
- findSubjectByExternalId: async (externalId)=>{
1030
- const subject = await adapter.findOne({
1031
- model: 'subject',
1032
- where: [
1033
- {
1034
- field: 'externalId',
1035
- value: externalId
1036
- }
1037
- ]
1038
- });
1039
- return subject ? validateEntityOutput('subject', subject, ctx.options) : null;
1040
- }
1041
- };
1042
- }
1043
999
  function consentRegistry({ adapter, ...ctx }) {
1044
1000
  const { createWithHooks, updateWithHooks } = getWithHooks(adapter, ctx);
1045
1001
  const registry = {
@@ -1315,123 +1271,155 @@ function domainRegistry({ adapter, ...ctx }) {
1315
1271
  };
1316
1272
  return registry;
1317
1273
  }
1318
- async function processHooks(data, model, operation, phase, hooks, context) {
1319
- let currentData = {
1320
- ...data
1321
- };
1322
- for (const hookSet of hooks){
1323
- const modelHooks = hookSet[model];
1324
- if (!modelHooks) continue;
1325
- const operationHooks = modelHooks[operation];
1326
- if (!operationHooks) continue;
1327
- const hookFn = operationHooks[phase];
1328
- if (hookFn) if ('before' === phase) {
1329
- const result = await hookFn(currentData, context);
1330
- if (result && 'object' == typeof result && 'kind' in result) switch(result.kind){
1331
- case 'abort':
1332
- return null;
1333
- case 'transform':
1334
- {
1335
- const transformData = result.data;
1336
- currentData = {
1337
- ...currentData,
1338
- ...transformData
1339
- };
1340
- break;
1341
- }
1342
- default:
1343
- break;
1344
- }
1345
- } else await hookFn(currentData, context);
1346
- }
1347
- return currentData;
1348
- }
1349
- async function processAfterHooksForMany(records, model, hooks, context) {
1350
- if (!records.length) return;
1351
- for (const record of records)await processHooks(record, model, 'update', 'after', hooks, context);
1352
- }
1353
- async function create_hooks_createWithHooks(adapter, ctx, props) {
1354
- const { data, model, customFn, context } = props;
1355
- const hooks = ctx.hooks || [];
1356
- const transformedData = await processHooks(data, model, 'create', 'before', hooks, context);
1357
- if (null === transformedData) return null;
1358
- let created = null;
1359
- if (customFn) {
1360
- created = await customFn.fn(transformedData);
1361
- if (!customFn.executeMainFn && created) return created;
1362
- }
1363
- if (!created) created = await adapter.create({
1364
- model: model,
1365
- data: transformedData
1366
- });
1367
- if (created) await processHooks(created, model, 'create', 'after', hooks, context);
1368
- return created;
1369
- }
1370
- async function update_hooks_updateWithHooks(adapter, ctx, props) {
1371
- const { data, where, model, customFn, context } = props;
1372
- const hooks = ctx.hooks || [];
1373
- const transformedData = await processHooks(data, model, 'update', 'before', hooks, context);
1374
- if (null === transformedData) return null;
1375
- let updated = null;
1376
- if (customFn) {
1377
- const result = await customFn.fn(transformedData);
1378
- updated = result;
1379
- if (!customFn.executeMainFn && updated) return updated;
1380
- }
1381
- if (!updated) updated = await adapter.update({
1382
- model: model,
1383
- update: transformedData,
1384
- where
1385
- });
1386
- if (updated) await processHooks(updated, model, 'update', 'after', hooks, context);
1387
- return updated;
1388
- }
1389
- async function executeCustomFunction(data, customFn) {
1390
- if (!customFn) return {
1391
- result: null,
1392
- shouldContinue: true
1393
- };
1394
- const result = await customFn.fn(data);
1395
- const shouldContinue = !result || !!customFn.executeMainFn;
1396
- return {
1397
- result,
1398
- shouldContinue
1399
- };
1400
- }
1401
- function processUpdateManyResult(result) {
1402
- if (Array.isArray(result)) return result;
1403
- if ('number' == typeof result && result > 0) return [];
1404
- return null;
1405
- }
1406
- async function updateManyWithHooks(adapter, ctx, props) {
1407
- const { data, where, model, customFn, context } = props;
1408
- const hooks = ctx.hooks || [];
1409
- const transformedData = await processHooks(data, model, 'update', 'before', hooks, context);
1410
- if (null === transformedData) return null;
1411
- const { result: customResult, shouldContinue } = await executeCustomFunction(transformedData, customFn);
1412
- if (customResult && !shouldContinue) return customResult;
1413
- let updated = customResult;
1414
- if (!updated) {
1415
- const adapterResult = await adapter.updateMany({
1416
- model: model,
1417
- update: transformedData,
1418
- where
1419
- });
1420
- updated = processUpdateManyResult(adapterResult);
1421
- }
1422
- if (updated && updated.length > 0) await processAfterHooksForMany(updated, model, hooks, context);
1423
- return updated;
1424
- }
1425
- function getWithHooks(adapter, ctx) {
1274
+ function subjectRegistry({ adapter, ...ctx }) {
1275
+ const { createWithHooks } = getWithHooks(adapter, ctx);
1426
1276
  return {
1427
- createWithHooks: ({ data, model, customFn, context })=>create_hooks_createWithHooks(adapter, ctx, {
1428
- data,
1429
- model,
1430
- customFn,
1277
+ createSubject: async (subject, context)=>{
1278
+ const createdSubject = await createWithHooks({
1279
+ data: {
1280
+ createdAt: new Date(),
1281
+ updatedAt: new Date(),
1282
+ ...subject
1283
+ },
1284
+ model: 'subject',
1285
+ customFn: void 0,
1431
1286
  context
1432
- }),
1433
- updateWithHooks: (props)=>update_hooks_updateWithHooks(adapter, ctx, props),
1434
- updateManyWithHooks: (props)=>updateManyWithHooks(adapter, ctx, props)
1287
+ });
1288
+ return createdSubject ? validateEntityOutput('subject', createdSubject, ctx.options) : null;
1289
+ },
1290
+ findOrCreateSubject: async function({ subjectId, externalSubjectId, ipAddress = 'unknown', context }) {
1291
+ if (subjectId && externalSubjectId) {
1292
+ const [subjectById, subjectByExternalId] = await Promise.all([
1293
+ this.findSubjectById(subjectId),
1294
+ this.findSubjectByExternalId(externalSubjectId)
1295
+ ]);
1296
+ if (!subjectById || !subjectByExternalId) {
1297
+ ctx.logger?.error('Subject validation failed: One or both subjects not found', {
1298
+ providedSubjectId: subjectId,
1299
+ providedExternalId: externalSubjectId,
1300
+ subjectByIdFound: !!subjectById,
1301
+ subjectByExternalIdFound: !!subjectByExternalId
1302
+ });
1303
+ throw new error_class_DoubleTieError('The specified subject could not be found. Please verify the subject identifiers and try again.', {
1304
+ code: error_codes_ERROR_CODES.NOT_FOUND,
1305
+ status: 404,
1306
+ meta: {
1307
+ providedSubjectId: subjectId,
1308
+ providedExternalId: externalSubjectId
1309
+ }
1310
+ });
1311
+ }
1312
+ if (subjectById.id !== subjectByExternalId.id) {
1313
+ ctx.logger?.warn('Subject validation failed: IDs do not match the same subject', {
1314
+ providedSubjectId: subjectId,
1315
+ providedExternalId: externalSubjectId,
1316
+ subjectByIdId: subjectById.id,
1317
+ subjectByExternalIdId: subjectByExternalId.id
1318
+ });
1319
+ throw new error_class_DoubleTieError('The provided subjectId and externalSubjectId do not match the same subject. Please ensure both identifiers refer to the same subject.', {
1320
+ code: error_codes_ERROR_CODES.CONFLICT,
1321
+ status: 409,
1322
+ meta: {
1323
+ providedSubjectId: subjectId,
1324
+ providedExternalId: externalSubjectId,
1325
+ subjectByIdId: subjectById.id,
1326
+ subjectByExternalIdId: subjectByExternalId.id
1327
+ }
1328
+ });
1329
+ }
1330
+ return subjectById;
1331
+ }
1332
+ if (subjectId) {
1333
+ const subject = await this.findSubjectById(subjectId);
1334
+ if (subject) return subject;
1335
+ throw new error_class_DoubleTieError('Subject not found by subjectId', {
1336
+ code: error_codes_ERROR_CODES.NOT_FOUND,
1337
+ status: 404
1338
+ });
1339
+ }
1340
+ if (externalSubjectId) try {
1341
+ const subject = await this.findSubjectByExternalId(externalSubjectId);
1342
+ if (subject) {
1343
+ ctx.logger?.debug('Found existing subject by external ID', {
1344
+ externalSubjectId
1345
+ });
1346
+ return subject;
1347
+ }
1348
+ ctx.logger?.info('Creating new subject with external ID', {
1349
+ externalSubjectId
1350
+ });
1351
+ return await this.createSubject({
1352
+ externalId: externalSubjectId,
1353
+ identityProvider: 'external',
1354
+ lastIpAddress: ipAddress,
1355
+ isIdentified: true
1356
+ }, context);
1357
+ } catch (error) {
1358
+ if (error instanceof Error && error.message.includes('unique constraint')) {
1359
+ ctx.logger?.info('Handling duplicate key violation for external ID', {
1360
+ externalSubjectId
1361
+ });
1362
+ const subject = await this.findSubjectByExternalId(externalSubjectId);
1363
+ if (subject) return subject;
1364
+ }
1365
+ ctx.logger?.error('Failed to create or find subject with external ID', {
1366
+ externalSubjectId,
1367
+ error: error instanceof Error ? error.message : 'Unknown error'
1368
+ });
1369
+ throw new error_class_DoubleTieError('Failed to create or find subject with external ID', {
1370
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1371
+ status: 500,
1372
+ meta: {
1373
+ error: error instanceof Error ? error.message : 'Unknown error'
1374
+ }
1375
+ });
1376
+ }
1377
+ try {
1378
+ ctx.logger?.info('Creating new anonymous subject');
1379
+ return await this.createSubject({
1380
+ externalId: null,
1381
+ identityProvider: 'anonymous',
1382
+ lastIpAddress: ipAddress,
1383
+ isIdentified: false
1384
+ }, context);
1385
+ } catch (error) {
1386
+ ctx.logger?.error('Failed to create anonymous subject', {
1387
+ ipAddress,
1388
+ error: error instanceof Error ? error.message : 'Unknown error'
1389
+ });
1390
+ throw new error_class_DoubleTieError('Failed to create anonymous subject', {
1391
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1392
+ status: 500,
1393
+ meta: {
1394
+ error: error instanceof Error ? error.message : 'Unknown error'
1395
+ }
1396
+ });
1397
+ }
1398
+ },
1399
+ findSubjectById: async (subjectId)=>{
1400
+ const subject = await adapter.findOne({
1401
+ model: 'subject',
1402
+ where: [
1403
+ {
1404
+ field: 'id',
1405
+ value: subjectId
1406
+ }
1407
+ ]
1408
+ });
1409
+ return subject ? validateEntityOutput('subject', subject, ctx.options) : null;
1410
+ },
1411
+ findSubjectByExternalId: async (externalId)=>{
1412
+ const subject = await adapter.findOne({
1413
+ model: 'subject',
1414
+ where: [
1415
+ {
1416
+ field: 'externalId',
1417
+ value: externalId
1418
+ }
1419
+ ]
1420
+ });
1421
+ return subject ? validateEntityOutput('subject', subject, ctx.options) : null;
1422
+ }
1435
1423
  };
1436
1424
  }
1437
1425
  function auditLogRegistry({ adapter, ...ctx }) {