@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
@@ -0,0 +1,42 @@
1
+ import { ORPCError } from '@orpc/server';
2
+ import type { Consent } from '../schema';
3
+ import type { Registry } from './types';
4
+ import { generateUniqueId } from './utils/generate-id';
5
+
6
+ export function consentRegistry({ db, ctx }: Registry) {
7
+ const { logger } = ctx;
8
+
9
+ return {
10
+ createConsent: async (
11
+ consent: Omit<Consent, 'id' | 'createdAt'> & Partial<Consent>
12
+ ) => {
13
+ logger.debug('Creating consent', { consent });
14
+ const createdConsent = await db.create('consent', {
15
+ id: await generateUniqueId(db, 'consent', ctx),
16
+ subjectId: consent.subjectId,
17
+ domainId: consent.domainId,
18
+ policyId: consent.policyId,
19
+ purposeIds: consent.purposeIds,
20
+ metadata: consent.metadata,
21
+ ipAddress: consent.ipAddress,
22
+ userAgent: consent.userAgent,
23
+ status: consent.status,
24
+ givenAt: consent.givenAt,
25
+ isActive: consent.isActive,
26
+ });
27
+
28
+ if (!createdConsent) {
29
+ throw new ORPCError('CONSENT_CREATION_FAILED', {
30
+ message: 'Failed to create consent - operation returned null',
31
+ status: 500,
32
+ data: {
33
+ subjectId: consent.subjectId,
34
+ domainId: consent.domainId,
35
+ },
36
+ });
37
+ }
38
+
39
+ return createdConsent;
40
+ },
41
+ };
42
+ }
@@ -0,0 +1,463 @@
1
+ import { ORPCError } from '@orpc/server';
2
+ import { afterEach, describe, expect, it, vi } from 'vitest';
3
+ import type { Domain } from '../schema';
4
+ import { domainRegistry } from './domain';
5
+ import type { Registry } from './types';
6
+
7
+ describe('domainRegistry', () => {
8
+ const mockLogger = {
9
+ debug: vi.fn(),
10
+ error: vi.fn(),
11
+ info: vi.fn(),
12
+ warn: vi.fn(),
13
+ };
14
+
15
+ vi.mock('./utils/generate-id', () => ({
16
+ generateUniqueId: vi.fn().mockResolvedValue('dom_test'),
17
+ }));
18
+
19
+ /**
20
+ * Creates a mock domain object with the specified overrides
21
+ *
22
+ * @param overrides - Partial domain properties to override defaults
23
+ * @returns A complete Domain object for testing
24
+ */
25
+ const createMockDomain = (overrides: Partial<Domain> = {}): Domain => ({
26
+ id: 'dom_test',
27
+ name: 'example.com',
28
+ description: 'Auto-created domain for example.com',
29
+ allowedOrigins: [],
30
+ isVerified: true,
31
+ isActive: true,
32
+ createdAt: new Date('2024-01-01T00:00:00.000Z'),
33
+ updatedAt: new Date('2024-01-01T00:00:00.000Z'),
34
+ ...overrides,
35
+ });
36
+
37
+ afterEach(() => {
38
+ vi.clearAllMocks();
39
+ });
40
+
41
+ describe('findDomainByName', () => {
42
+ it('should return domain when found by name', async () => {
43
+ const mockDomain = createMockDomain({
44
+ name: 'example.com',
45
+ });
46
+
47
+ const db = {
48
+ findFirst: vi.fn().mockResolvedValue(mockDomain),
49
+ };
50
+
51
+ const registry = domainRegistry({
52
+ db,
53
+ ctx: { logger: mockLogger },
54
+ } as unknown as Registry);
55
+
56
+ const result = await registry.findDomainByName('example.com');
57
+
58
+ expect(db.findFirst).toHaveBeenCalledWith('domain', {
59
+ where: expect.any(Function),
60
+ });
61
+
62
+ expect(result).toEqual(mockDomain);
63
+ });
64
+
65
+ it('should return null when domain not found by name', async () => {
66
+ const db = {
67
+ findFirst: vi.fn().mockResolvedValue(null),
68
+ };
69
+
70
+ const registry = domainRegistry({
71
+ db,
72
+ ctx: { logger: mockLogger },
73
+ } as unknown as Registry);
74
+
75
+ const result = await registry.findDomainByName('nonexistent.com');
76
+
77
+ expect(db.findFirst).toHaveBeenCalledWith('domain', {
78
+ where: expect.any(Function),
79
+ });
80
+
81
+ expect(result).toBeNull();
82
+ expect(mockLogger.debug).toHaveBeenCalledWith('No domain found', {
83
+ name: 'nonexistent.com',
84
+ });
85
+ });
86
+
87
+ it('should handle empty string domain name', async () => {
88
+ const db = {
89
+ findFirst: vi.fn().mockResolvedValue(null),
90
+ };
91
+
92
+ const registry = domainRegistry({
93
+ db,
94
+ ctx: { logger: mockLogger },
95
+ } as unknown as Registry);
96
+
97
+ const result = await registry.findDomainByName('');
98
+
99
+ expect(db.findFirst).toHaveBeenCalledWith('domain', {
100
+ where: expect.any(Function),
101
+ });
102
+
103
+ expect(result).toBeNull();
104
+ expect(mockLogger.debug).toHaveBeenCalledWith('No domain found', {
105
+ name: '',
106
+ });
107
+ });
108
+ });
109
+
110
+ describe('findOrCreateDomain', () => {
111
+ describe('when domain exists', () => {
112
+ it('should return existing domain when found', async () => {
113
+ const mockDomain = createMockDomain({
114
+ name: 'existing.com',
115
+ description: 'Existing domain description',
116
+ isVerified: false,
117
+ });
118
+
119
+ const db = {
120
+ findFirst: vi.fn().mockResolvedValue(mockDomain),
121
+ create: vi.fn(),
122
+ };
123
+
124
+ const registry = domainRegistry({
125
+ db,
126
+ ctx: { logger: mockLogger },
127
+ } as unknown as Registry);
128
+
129
+ const result = await registry.findOrCreateDomain('existing.com');
130
+
131
+ expect(db.findFirst).toHaveBeenCalledWith('domain', {
132
+ where: expect.any(Function),
133
+ });
134
+
135
+ expect(db.create).not.toHaveBeenCalled();
136
+ expect(result).toEqual(mockDomain);
137
+ expect(mockLogger.debug).toHaveBeenCalledWith('Found existing domain', {
138
+ name: 'existing.com',
139
+ });
140
+ });
141
+ });
142
+
143
+ describe('when domain does not exist', () => {
144
+ it('should create and return new domain', async () => {
145
+ const newMockDomain = createMockDomain({
146
+ name: 'new.com',
147
+ description: 'Auto-created domain for new.com',
148
+ });
149
+
150
+ const db = {
151
+ findFirst: vi.fn().mockResolvedValue(null),
152
+ create: vi.fn().mockResolvedValue(newMockDomain),
153
+ };
154
+
155
+ const registry = domainRegistry({
156
+ db,
157
+ ctx: { logger: mockLogger },
158
+ } as unknown as Registry);
159
+
160
+ const result = await registry.findOrCreateDomain('new.com');
161
+
162
+ expect(db.findFirst).toHaveBeenCalledWith('domain', {
163
+ where: expect.any(Function),
164
+ });
165
+
166
+ expect(db.create).toHaveBeenCalledWith('domain', {
167
+ id: 'dom_test',
168
+ name: 'new.com',
169
+ description: 'Auto-created domain for new.com',
170
+ isActive: true,
171
+ isVerified: true,
172
+ allowedOrigins: [],
173
+ });
174
+
175
+ expect(result).toEqual(newMockDomain);
176
+ expect(mockLogger.debug).toHaveBeenCalledWith('Creating new domain', {
177
+ name: 'new.com',
178
+ });
179
+ });
180
+
181
+ it('should create domain with correct default values', async () => {
182
+ const newMockDomain = createMockDomain({
183
+ name: 'test.org',
184
+ });
185
+
186
+ const db = {
187
+ findFirst: vi.fn().mockResolvedValue(null),
188
+ create: vi.fn().mockResolvedValue(newMockDomain),
189
+ };
190
+
191
+ const registry = domainRegistry({
192
+ db,
193
+ ctx: { logger: mockLogger },
194
+ } as unknown as Registry);
195
+
196
+ await registry.findOrCreateDomain('test.org');
197
+
198
+ expect(db.create).toHaveBeenCalledWith('domain', {
199
+ id: 'dom_test',
200
+ name: 'test.org',
201
+ description: 'Auto-created domain for test.org',
202
+ isActive: true,
203
+ isVerified: true,
204
+ allowedOrigins: [],
205
+ });
206
+ });
207
+
208
+ it('should handle special domain names correctly', async () => {
209
+ const specialDomains = [
210
+ 'localhost',
211
+ '127.0.0.1',
212
+ 'sub.domain.example.com',
213
+ 'domain-with-hyphens.co.uk',
214
+ '123numeric.com',
215
+ ];
216
+
217
+ for (const domainName of specialDomains) {
218
+ const mockDomain = createMockDomain({
219
+ name: domainName,
220
+ description: `Auto-created domain for ${domainName}`,
221
+ });
222
+
223
+ const db = {
224
+ findFirst: vi.fn().mockResolvedValue(null),
225
+ create: vi.fn().mockResolvedValue(mockDomain),
226
+ };
227
+
228
+ const registry = domainRegistry({
229
+ db,
230
+ ctx: { logger: mockLogger },
231
+ } as unknown as Registry);
232
+
233
+ const result = await registry.findOrCreateDomain(domainName);
234
+
235
+ expect(db.create).toHaveBeenCalledWith('domain', {
236
+ id: 'dom_test',
237
+ name: domainName,
238
+ description: `Auto-created domain for ${domainName}`,
239
+ isActive: true,
240
+ isVerified: true,
241
+ allowedOrigins: [],
242
+ });
243
+
244
+ expect(result).toEqual(mockDomain);
245
+
246
+ vi.clearAllMocks();
247
+ }
248
+ });
249
+ });
250
+
251
+ describe('error handling', () => {
252
+ it('should throw ORPCError when domain creation fails', async () => {
253
+ const db = {
254
+ findFirst: vi.fn().mockResolvedValue(null),
255
+ create: vi.fn().mockResolvedValue(null),
256
+ };
257
+
258
+ const registry = domainRegistry({
259
+ db,
260
+ ctx: { logger: mockLogger },
261
+ } as unknown as Registry);
262
+
263
+ const promise = registry.findOrCreateDomain('failed.com');
264
+
265
+ await expect(promise).rejects.toBeInstanceOf(ORPCError);
266
+ await expect(promise).rejects.toEqual(
267
+ expect.objectContaining({
268
+ message: 'Failed to create domain',
269
+ code: 'DOMAIN_CREATION_FAILED',
270
+ status: 503,
271
+ })
272
+ );
273
+
274
+ expect(db.findFirst).toHaveBeenCalledWith('domain', {
275
+ where: expect.any(Function),
276
+ });
277
+
278
+ expect(db.create).toHaveBeenCalledWith('domain', {
279
+ id: 'dom_test',
280
+ name: 'failed.com',
281
+ description: 'Auto-created domain for failed.com',
282
+ isActive: true,
283
+ isVerified: true,
284
+ allowedOrigins: [],
285
+ });
286
+
287
+ expect(mockLogger.debug).toHaveBeenCalledWith('Creating new domain', {
288
+ name: 'failed.com',
289
+ });
290
+ });
291
+
292
+ it('should throw ORPCError when domain creation returns undefined', async () => {
293
+ const db = {
294
+ findFirst: vi.fn().mockResolvedValue(null),
295
+ create: vi.fn().mockResolvedValue(undefined),
296
+ };
297
+
298
+ const registry = domainRegistry({
299
+ db,
300
+ ctx: { logger: mockLogger },
301
+ } as unknown as Registry);
302
+
303
+ const promise = registry.findOrCreateDomain('undefined.com');
304
+
305
+ await expect(promise).rejects.toBeInstanceOf(ORPCError);
306
+ await expect(promise).rejects.toEqual(
307
+ expect.objectContaining({
308
+ message: 'Failed to create domain',
309
+ code: 'DOMAIN_CREATION_FAILED',
310
+ status: 503,
311
+ })
312
+ );
313
+ });
314
+
315
+ it('should propagate database findFirst errors', async () => {
316
+ const dbError = new Error('Database connection failed');
317
+ const db = {
318
+ findFirst: vi.fn().mockRejectedValue(dbError),
319
+ };
320
+
321
+ const registry = domainRegistry({
322
+ db,
323
+ ctx: { logger: mockLogger },
324
+ } as unknown as Registry);
325
+
326
+ const promise = registry.findOrCreateDomain('error.com');
327
+
328
+ await expect(promise).rejects.toThrow('Database connection failed');
329
+ });
330
+
331
+ it('should propagate database create errors', async () => {
332
+ const dbError = new Error('Create operation failed');
333
+ const db = {
334
+ findFirst: vi.fn().mockResolvedValue(null),
335
+ create: vi.fn().mockRejectedValue(dbError),
336
+ };
337
+
338
+ const registry = domainRegistry({
339
+ db,
340
+ ctx: { logger: mockLogger },
341
+ } as unknown as Registry);
342
+
343
+ const promise = registry.findOrCreateDomain('create-error.com');
344
+
345
+ await expect(promise).rejects.toThrow('Create operation failed');
346
+ });
347
+ });
348
+ });
349
+
350
+ describe('database query construction', () => {
351
+ it('should construct correct query for domain lookup by name', async () => {
352
+ const db = {
353
+ findFirst: vi.fn().mockResolvedValue(null),
354
+ };
355
+
356
+ const registry = domainRegistry({
357
+ db,
358
+ ctx: { logger: mockLogger },
359
+ } as unknown as Registry);
360
+
361
+ await registry.findDomainByName('query-test.com');
362
+
363
+ expect(db.findFirst).toHaveBeenCalledWith('domain', {
364
+ where: expect.any(Function),
365
+ });
366
+
367
+ // Verify the where function is properly constructed
368
+ const whereCall = db.findFirst.mock.calls[0]?.[1];
369
+ expect(whereCall).toHaveProperty('where');
370
+ expect(typeof whereCall?.where).toBe('function');
371
+ });
372
+
373
+ it('should construct correct query for findOrCreateDomain lookup', async () => {
374
+ const mockDomain = createMockDomain();
375
+ const db = {
376
+ findFirst: vi.fn().mockResolvedValue(mockDomain),
377
+ };
378
+
379
+ const registry = domainRegistry({
380
+ db,
381
+ ctx: { logger: mockLogger },
382
+ } as unknown as Registry);
383
+
384
+ await registry.findOrCreateDomain('query-existing.com');
385
+
386
+ expect(db.findFirst).toHaveBeenCalledWith('domain', {
387
+ where: expect.any(Function),
388
+ });
389
+
390
+ // Verify the where function is properly constructed
391
+ const whereCall = db.findFirst.mock.calls[0]?.[1];
392
+ expect(whereCall).toHaveProperty('where');
393
+ expect(typeof whereCall?.where).toBe('function');
394
+ });
395
+ });
396
+
397
+ describe('edge cases', () => {
398
+ it('should handle domain names with various formats', async () => {
399
+ const edgeCaseDomains = [
400
+ 'a.b', // Minimal valid domain
401
+ 'very-long-subdomain.example.org', // Long subdomain
402
+ 'test.co.uk', // Multiple TLDs
403
+ 'xn--nxasmq6b.xn--o3cw4h', // IDN (internationalized domain)
404
+ ];
405
+
406
+ for (const domainName of edgeCaseDomains) {
407
+ const mockDomain = createMockDomain({
408
+ name: domainName,
409
+ description: `Auto-created domain for ${domainName}`,
410
+ });
411
+
412
+ const db = {
413
+ findFirst: vi.fn().mockResolvedValue(null),
414
+ create: vi.fn().mockResolvedValue(mockDomain),
415
+ };
416
+
417
+ const registry = domainRegistry({
418
+ db,
419
+ ctx: { logger: mockLogger },
420
+ } as unknown as Registry);
421
+
422
+ const result = await registry.findOrCreateDomain(domainName);
423
+
424
+ expect(result.name).toBe(domainName);
425
+ expect(result.description).toBe(
426
+ `Auto-created domain for ${domainName}`
427
+ );
428
+
429
+ vi.clearAllMocks();
430
+ }
431
+ });
432
+
433
+ it('should maintain domain name case sensitivity', async () => {
434
+ const upperCaseDomain = 'EXAMPLE.COM';
435
+ const mockDomain = createMockDomain({
436
+ name: upperCaseDomain,
437
+ });
438
+
439
+ const db = {
440
+ findFirst: vi.fn().mockResolvedValue(null),
441
+ create: vi.fn().mockResolvedValue(mockDomain),
442
+ };
443
+
444
+ const registry = domainRegistry({
445
+ db,
446
+ ctx: { logger: mockLogger },
447
+ } as unknown as Registry);
448
+
449
+ const result = await registry.findOrCreateDomain(upperCaseDomain);
450
+
451
+ expect(db.create).toHaveBeenCalledWith('domain', {
452
+ id: 'dom_test',
453
+ name: upperCaseDomain,
454
+ description: `Auto-created domain for ${upperCaseDomain}`,
455
+ isActive: true,
456
+ isVerified: true,
457
+ allowedOrigins: [],
458
+ });
459
+
460
+ expect(result.name).toBe(upperCaseDomain);
461
+ });
462
+ });
463
+ });
@@ -0,0 +1,51 @@
1
+ import { ORPCError } from '@orpc/server';
2
+ import type { Registry } from './types';
3
+ import { generateUniqueId } from './utils/generate-id';
4
+
5
+ export function domainRegistry({ db, ctx }: Registry) {
6
+ const { logger } = ctx;
7
+
8
+ const findDomainByName = async (name: string) => {
9
+ const domain = await db.findFirst('domain', {
10
+ where: (b) => b('name', '=', name),
11
+ });
12
+
13
+ if (!domain) {
14
+ logger.debug('No domain found', { name });
15
+ }
16
+
17
+ return domain;
18
+ };
19
+
20
+ return {
21
+ findDomainByName,
22
+ findOrCreateDomain: async (name: string) => {
23
+ const existingDomain = await findDomainByName(name);
24
+
25
+ if (existingDomain) {
26
+ logger.debug('Found existing domain', { name });
27
+ return existingDomain;
28
+ }
29
+
30
+ logger.debug('Creating new domain', { name });
31
+ const domain = await db.create('domain', {
32
+ id: await generateUniqueId(db, 'domain', ctx),
33
+ name,
34
+ description: `Auto-created domain for ${name}`,
35
+ isActive: true,
36
+ isVerified: true,
37
+ allowedOrigins: [],
38
+ });
39
+
40
+ if (!domain) {
41
+ throw new ORPCError('DOMAIN_CREATION_FAILED', {
42
+ message: 'Failed to create domain',
43
+ status: 503,
44
+ data: { name },
45
+ });
46
+ }
47
+
48
+ return domain;
49
+ },
50
+ };
51
+ }
@@ -0,0 +1,18 @@
1
+ import { auditLogRegistry } from './audit-log';
2
+ import { consentRegistry } from './consent';
3
+ import { policyRegistry } from './consent-policy';
4
+ import { consentPurposeRegistry } from './consent-purpose';
5
+ import { domainRegistry } from './domain';
6
+ import { subjectRegistry } from './subject';
7
+ import type { Registry } from './types';
8
+
9
+ export const createRegistry = (ctx: Registry) => {
10
+ return {
11
+ ...auditLogRegistry(ctx),
12
+ ...subjectRegistry(ctx),
13
+ ...consentRegistry(ctx),
14
+ ...consentPurposeRegistry(ctx),
15
+ ...policyRegistry(ctx),
16
+ ...domainRegistry(ctx),
17
+ };
18
+ };