@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,2130 @@
1
+ import * as __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__ from "@doubletie/logger";
2
+ import * as __WEBPACK_EXTERNAL_MODULE__orpc_openapi_fetch_89b49e61__ from "@orpc/openapi/fetch";
3
+ import * as __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__ from "@orpc/server";
4
+ import * as __WEBPACK_EXTERNAL_MODULE__orpc_server_plugins_e445fd4f__ from "@orpc/server/plugins";
5
+ import * as __WEBPACK_EXTERNAL_MODULE_defu__ from "defu";
6
+ import * as __WEBPACK_EXTERNAL_MODULE__orpc_openapi_a95cc8e7__ from "@orpc/openapi";
7
+ import * as __WEBPACK_EXTERNAL_MODULE__orpc_zod_716a28d4__ from "@orpc/zod";
8
+ import * as __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__ from "@orpc/contract";
9
+ import * as __WEBPACK_EXTERNAL_MODULE_zod__ from "zod";
10
+ import * as __WEBPACK_EXTERNAL_MODULE_fumadb__ from "fumadb";
11
+ import * as __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__ from "fumadb/schema";
12
+ import * as __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__ from "base-x";
13
+ import * as __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__ from "@c15t/translations";
14
+ import * as __WEBPACK_EXTERNAL_MODULE__opentelemetry_resources_c7ac8648__ from "@opentelemetry/resources";
15
+ import * as __WEBPACK_EXTERNAL_MODULE__opentelemetry_sdk_node_50b75088__ from "@opentelemetry/sdk-node";
16
+ import * as __WEBPACK_EXTERNAL_MODULE__opentelemetry_sdk_trace_base_5031a705__ from "@opentelemetry/sdk-trace-base";
17
+ import * as __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__ from "@opentelemetry/api";
18
+ const WWW_REGEX = /^www\./;
19
+ const PROTOCOL_WWW_REGEX = /^https?:\/\/(www\.)?/;
20
+ const SUPPORTED_METHODS = [
21
+ 'GET',
22
+ 'POST',
23
+ 'PUT',
24
+ 'DELETE',
25
+ 'PATCH',
26
+ 'OPTIONS'
27
+ ];
28
+ const SUPPORTED_HEADERS = [
29
+ 'Content-Type',
30
+ 'Authorization',
31
+ 'x-request-id'
32
+ ];
33
+ const DEFAULT_CORS_CONFIG = {
34
+ origin: async (origin)=>await Promise.resolve(origin || '*'),
35
+ credentials: true,
36
+ allowHeaders: SUPPORTED_HEADERS,
37
+ maxAge: 600,
38
+ methods: SUPPORTED_METHODS
39
+ };
40
+ function createCORSOptions(trustedOrigins) {
41
+ if (!trustedOrigins) return DEFAULT_CORS_CONFIG;
42
+ const origins = Array.isArray(trustedOrigins) ? trustedOrigins : [
43
+ trustedOrigins
44
+ ];
45
+ if (0 === origins.length) return DEFAULT_CORS_CONFIG;
46
+ function normalizeOrigin(origin) {
47
+ try {
48
+ if (!origin.includes('://') && !origin.includes(':') && !origin.includes('/')) return origin.toLowerCase();
49
+ const originWithProtocol = origin.startsWith('http://') || origin.startsWith('https://') || origin.startsWith('ws://') || origin.startsWith('wss://') ? origin : `http://${origin}`;
50
+ const url = new URL(originWithProtocol);
51
+ const hostname = url.hostname.replace(WWW_REGEX, '');
52
+ return `${hostname}${url.port ? `:${url.port}` : ''}`;
53
+ } catch {
54
+ return origin.replace(PROTOCOL_WWW_REGEX, '').replace(WWW_REGEX, '');
55
+ }
56
+ }
57
+ function expandWithWWW(origins) {
58
+ const expanded = new Set();
59
+ for (const origin of origins){
60
+ if ('*' === origin) {
61
+ expanded.add('*');
62
+ continue;
63
+ }
64
+ const normalized = normalizeOrigin(origin);
65
+ expanded.add(normalized);
66
+ if (!normalized.includes('www.')) expanded.add(`www.${normalized}`);
67
+ }
68
+ return Array.from(expanded);
69
+ }
70
+ const expandedTrusted = expandWithWWW(origins);
71
+ const returnConfig = {
72
+ origin: async (origin)=>{
73
+ if (!origin) return '*';
74
+ const normalizedOrigin = normalizeOrigin(origin);
75
+ if (expandedTrusted.includes('*')) return origin;
76
+ const isTrusted = expandedTrusted.some((trusted)=>{
77
+ const normalizedTrusted = normalizeOrigin(trusted);
78
+ if ('localhost' === normalizedTrusted) return 'localhost' === normalizedOrigin || normalizedOrigin.startsWith('localhost:') || '127.0.0.1' === normalizedOrigin || normalizedOrigin.startsWith('127.0.0.1:') || '[::1]' === normalizedOrigin || normalizedOrigin.startsWith('[::1]:');
79
+ return normalizedTrusted === normalizedOrigin;
80
+ });
81
+ return isTrusted ? origin : null;
82
+ },
83
+ credentials: true,
84
+ allowHeaders: SUPPORTED_HEADERS,
85
+ maxAge: 600,
86
+ methods: SUPPORTED_METHODS
87
+ };
88
+ return returnConfig;
89
+ }
90
+ const STRIP_REGEX = /^(https?:\/\/)|(wss?:\/\/)|(\/+$)|:\d+/g;
91
+ function matchesWildcard(hostname, wildcardPattern, logger) {
92
+ const wildcardDomain = wildcardPattern.slice(2);
93
+ const parts = hostname.split('.');
94
+ const isValid = parts.length > 2 && hostname.endsWith(wildcardDomain);
95
+ logger?.debug(`Wildcard match result: ${isValid} ${hostname} ends with ${wildcardDomain} ${parts.length > 2} ${hostname.endsWith(wildcardDomain)}`);
96
+ return isValid;
97
+ }
98
+ function isOriginTrusted(origin, trustedDomains, logger) {
99
+ try {
100
+ if (0 === trustedDomains.length) throw new Error('No trusted domains');
101
+ logger?.debug(`Checking if origin ${origin} is trusted in ${trustedDomains}`);
102
+ if (trustedDomains.includes('*')) {
103
+ logger?.debug('Allowing all origins');
104
+ return true;
105
+ }
106
+ const url = new URL(origin);
107
+ const originHostname = url.hostname.toLowerCase();
108
+ logger?.debug(`Parsed origin hostname: ${originHostname}`);
109
+ return trustedDomains.some((domain)=>{
110
+ if (!domain || '' === domain.trim()) {
111
+ logger?.debug('Skipping empty domain');
112
+ return false;
113
+ }
114
+ const strippedDomain = domain.replace(STRIP_REGEX, '').toLowerCase();
115
+ logger?.debug(`Checking against stripped domain: ${strippedDomain}`);
116
+ if (strippedDomain.startsWith('*.')) return matchesWildcard(originHostname, strippedDomain, logger);
117
+ const isMatch = originHostname === strippedDomain;
118
+ logger?.debug(`Exact match result: ${isMatch} ${originHostname} === ${strippedDomain}`);
119
+ return isMatch;
120
+ });
121
+ } catch (error) {
122
+ logger?.error('Error validating origin:', error);
123
+ return false;
124
+ }
125
+ }
126
+ function extractCORSInfo(request, trustedOrigins, logger) {
127
+ const origin = request.headers.get('origin');
128
+ if (!origin || !trustedOrigins) return {
129
+ origin: origin,
130
+ isTrusted: false
131
+ };
132
+ return {
133
+ origin,
134
+ isTrusted: isOriginTrusted(origin, trustedOrigins, logger)
135
+ };
136
+ }
137
+ const processCors = (request, context, trustedOrigins)=>{
138
+ const { origin, isTrusted } = extractCORSInfo(request, trustedOrigins, context.logger);
139
+ if (origin) {
140
+ context.origin = origin;
141
+ context.trustedOrigin = isTrusted;
142
+ }
143
+ return context;
144
+ };
145
+ const version = '1.6.0';
146
+ const createOpenAPIConfig = (options)=>{
147
+ const basePath = options.basePath || '';
148
+ return {
149
+ enabled: true,
150
+ specPath: `${basePath}/spec.json`,
151
+ docsPath: `${basePath}/docs`,
152
+ ...options.advanced?.openapi || {}
153
+ };
154
+ };
155
+ const createDefaultOpenAPIOptions = (options)=>({
156
+ info: {
157
+ title: options.appName || 'c15t API',
158
+ version: version,
159
+ description: 'API for consent management'
160
+ },
161
+ servers: [
162
+ {
163
+ url: options.basePath || '/'
164
+ }
165
+ ],
166
+ security: [
167
+ {
168
+ bearerAuth: []
169
+ }
170
+ ]
171
+ });
172
+ const auditLogTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('auditLog', {
173
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
174
+ entityType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('entityType', 'string'),
175
+ entityId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('entityId', 'string'),
176
+ actionType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('actionType', 'string'),
177
+ subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string').nullable(),
178
+ ipAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('ipAddress', 'string').nullable(),
179
+ userAgent: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('userAgent', 'string').nullable(),
180
+ changes: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('changes', 'json').nullable(),
181
+ metadata: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('metadata', 'json').nullable(),
182
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
183
+ eventTimezone: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('eventTimezone', 'string').defaultTo$(()=>'UTC')
184
+ });
185
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
186
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
187
+ entityType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
188
+ entityId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
189
+ actionType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
190
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
191
+ ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
192
+ userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
193
+ changes: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
194
+ metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
195
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
196
+ eventTimezone: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().prefault('UTC')
197
+ });
198
+ const consentTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consent', {
199
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
200
+ subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string'),
201
+ domainId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('domainId', 'string'),
202
+ policyId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('policyId', 'string').nullable(),
203
+ purposeIds: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('purposeIds', 'json'),
204
+ metadata: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('metadata', 'json').nullable(),
205
+ ipAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('ipAddress', 'string').nullable(),
206
+ userAgent: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('userAgent', 'string').nullable(),
207
+ status: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('status', 'string').defaultTo$(()=>'active'),
208
+ withdrawalReason: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('withdrawalReason', 'string').nullable(),
209
+ givenAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('givenAt', 'timestamp').defaultTo$('now'),
210
+ validUntil: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('validUntil', 'timestamp').nullable(),
211
+ isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true)
212
+ });
213
+ const consentStatusSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
214
+ 'active',
215
+ 'withdrawn',
216
+ 'expired'
217
+ ]);
218
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
219
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
220
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
221
+ domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
222
+ purposeIds: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
223
+ metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).nullish(),
224
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
225
+ ipAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
226
+ userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
227
+ status: consentStatusSchema.prefault('active'),
228
+ withdrawalReason: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
229
+ givenAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
230
+ validUntil: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullish(),
231
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true)
232
+ });
233
+ const consentPolicyTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentPolicy', {
234
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
235
+ version: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('version', 'string'),
236
+ type: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('type', 'string'),
237
+ name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string'),
238
+ effectiveDate: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('effectiveDate', 'timestamp'),
239
+ expirationDate: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('expirationDate', 'timestamp').nullable(),
240
+ content: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('content', 'string'),
241
+ contentHash: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('contentHash', 'string'),
242
+ isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
243
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now')
244
+ });
245
+ const PolicyTypeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
246
+ 'cookie_banner',
247
+ 'privacy_policy',
248
+ 'dpa',
249
+ 'terms_and_conditions',
250
+ 'marketing_communications',
251
+ 'age_verification',
252
+ 'other'
253
+ ]);
254
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
255
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
256
+ version: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
257
+ type: PolicyTypeSchema,
258
+ name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
259
+ effectiveDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date(),
260
+ expirationDate: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().nullish(),
261
+ content: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
262
+ contentHash: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
263
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
264
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
265
+ });
266
+ const consentPurposeTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentPurpose', {
267
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
268
+ code: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('code', 'string'),
269
+ name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string'),
270
+ description: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)("description", 'string'),
271
+ isEssential: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isEssential', 'bool'),
272
+ dataCategory: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('dataCategory', 'string').nullable(),
273
+ legalBasis: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('legalBasis', 'string').nullable(),
274
+ isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
275
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
276
+ updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
277
+ });
278
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
279
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
280
+ code: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
281
+ name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
282
+ description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
283
+ isEssential: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
284
+ dataCategory: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
285
+ legalBasis: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
286
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
287
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
288
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
289
+ });
290
+ const consentRecordTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('consentRecord', {
291
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
292
+ subjectId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectId', 'string'),
293
+ consentId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('consentId', 'string').nullable(),
294
+ actionType: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('actionType', 'string'),
295
+ details: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('details', 'json').nullable(),
296
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now')
297
+ });
298
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
299
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
300
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
301
+ consentId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
302
+ actionType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
303
+ details: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).nullish(),
304
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
305
+ });
306
+ const domainTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('domain', {
307
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
308
+ name: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('name', 'string').unique(),
309
+ description: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)("description", 'string').nullable(),
310
+ allowedOrigins: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('allowedOrigins', 'json').nullable(),
311
+ isVerified: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isVerified', 'bool').defaultTo$(()=>true),
312
+ isActive: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isActive', 'bool').defaultTo$(()=>true),
313
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
314
+ updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
315
+ });
316
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
317
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
318
+ name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
319
+ description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
320
+ allowedOrigins: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).nullish(),
321
+ isVerified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
322
+ isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(true),
323
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
324
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
325
+ });
326
+ const subjectTable = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.table)('subject', {
327
+ id: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.idColumn)('id', 'varchar(255)'),
328
+ isIdentified: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('isIdentified', 'bool').defaultTo$(()=>false),
329
+ externalId: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('externalId', 'string').nullable(),
330
+ identityProvider: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('identityProvider', 'string').nullable(),
331
+ lastIpAddress: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('lastIpAddress', 'string').nullable(),
332
+ subjectTimezone: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('subjectTimezone', 'string').nullable(),
333
+ createdAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('createdAt', 'timestamp').defaultTo$('now'),
334
+ updatedAt: (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.column)('updatedAt', 'timestamp').defaultTo$('now')
335
+ });
336
+ __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
337
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
338
+ isIdentified: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().prefault(false),
339
+ externalId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
340
+ identityProvider: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
341
+ lastIpAddress: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
342
+ subjectTimezone: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
343
+ createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date()),
344
+ updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().prefault(()=>new Date())
345
+ });
346
+ const v1 = (0, __WEBPACK_EXTERNAL_MODULE_fumadb_schema_96658f6d__.schema)({
347
+ version: '1.0.0',
348
+ tables: {
349
+ subject: subjectTable,
350
+ domain: domainTable,
351
+ consentPolicy: consentPolicyTable,
352
+ consentPurpose: consentPurposeTable,
353
+ consent: consentTable,
354
+ auditLog: auditLogTable,
355
+ consentRecord: consentRecordTable
356
+ },
357
+ relations: {
358
+ subject: ({ many })=>({
359
+ consents: many('consent'),
360
+ consentRecords: many('consentRecord'),
361
+ auditLogs: many('auditLog')
362
+ }),
363
+ domain: ({ many })=>({
364
+ consents: many('consent')
365
+ }),
366
+ consentPolicy: ({ many })=>({
367
+ consents: many('consent')
368
+ }),
369
+ consentPurpose: ()=>({}),
370
+ consent: ({ one, many })=>({
371
+ subject: one('subject', [
372
+ 'subjectId',
373
+ 'id'
374
+ ]).foreignKey(),
375
+ domain: one('domain', [
376
+ 'domainId',
377
+ 'id'
378
+ ]).foreignKey(),
379
+ policy: one('consentPolicy', [
380
+ 'policyId',
381
+ 'id'
382
+ ]).foreignKey(),
383
+ consentRecords: many('consentRecord')
384
+ }),
385
+ consentRecord: ({ one })=>({
386
+ subject: one('subject', [
387
+ 'subjectId',
388
+ 'id'
389
+ ]).foreignKey(),
390
+ consent: one('consent', [
391
+ 'consentId',
392
+ 'id'
393
+ ]).foreignKey()
394
+ }),
395
+ auditLog: ({ one })=>({
396
+ subject: one('subject', [
397
+ 'subjectId',
398
+ 'id'
399
+ ]).foreignKey()
400
+ })
401
+ }
402
+ });
403
+ const DB = (0, __WEBPACK_EXTERNAL_MODULE_fumadb__.fumadb)({
404
+ namespace: 'c15t',
405
+ schemas: [
406
+ v1
407
+ ]
408
+ });
409
+ const baseConsentSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
410
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
411
+ externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
412
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
413
+ type: PolicyTypeSchema,
414
+ metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional()
415
+ });
416
+ const cookieBannerSchema = baseConsentSchema.extend({
417
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('cookie_banner'),
418
+ preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean())
419
+ });
420
+ const policyBasedSchema = baseConsentSchema.extend({
421
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
422
+ 'privacy_policy',
423
+ 'dpa',
424
+ 'terms_and_conditions'
425
+ ]),
426
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
427
+ preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean()).optional()
428
+ });
429
+ const otherConsentSchema = baseConsentSchema.extend({
430
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
431
+ 'marketing_communications',
432
+ 'age_verification',
433
+ 'other'
434
+ ]),
435
+ preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean()).optional()
436
+ });
437
+ const postConsentContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
438
+ method: 'POST',
439
+ path: '/consent/set',
440
+ description: `Records a user's consent preferences and creates necessary consent records.
441
+ This endpoint handles various types of consent submissions:
442
+
443
+ 1. Cookie Banner Consent:
444
+ - Records granular cookie preferences
445
+ - Supports multiple consent purposes
446
+ - Creates audit trail for compliance
447
+
448
+ 2. Policy-Based Consent:
449
+ - Privacy Policy acceptance
450
+ - Data Processing Agreement (DPA) consent
451
+ - Terms and Conditions acceptance
452
+ - Links consent to specific policy versions
453
+
454
+ 3. Other Consent Types:
455
+ - Marketing communications preferences
456
+ - Age verification consent
457
+ - Custom consent types
458
+
459
+ The endpoint performs the following operations:
460
+ - Creates or retrieves subject records
461
+ - Validates domain and policy information
462
+ - Creates consent records with audit trails
463
+ - Records consent purposes and preferences
464
+ - Generates audit logs for compliance
465
+
466
+ Use this endpoint to record user consent and maintain a compliant consent management system.`,
467
+ tags: [
468
+ 'consent',
469
+ 'cookie-banner'
470
+ ]
471
+ }).errors({
472
+ INPUT_VALIDATION_FAILED: {
473
+ status: 422,
474
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
475
+ formErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
476
+ fieldErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()))
477
+ }),
478
+ error: 'Invalid input parameters'
479
+ },
480
+ SUBJECT_CREATION_FAILED: {
481
+ status: 400,
482
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
483
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
484
+ externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional()
485
+ }),
486
+ error: 'Failed to create or find subject'
487
+ },
488
+ DOMAIN_CREATION_FAILED: {
489
+ status: 500,
490
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
491
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
492
+ }),
493
+ error: 'Failed to create or find domain'
494
+ },
495
+ POLICY_NOT_FOUND: {
496
+ status: 404,
497
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
498
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
499
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
500
+ }),
501
+ error: 'Policy not found'
502
+ },
503
+ POLICY_INACTIVE: {
504
+ status: 409,
505
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
506
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
507
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
508
+ }),
509
+ error: 'Policy is not active'
510
+ },
511
+ POLICY_CREATION_FAILED: {
512
+ status: 500,
513
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
514
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
515
+ }),
516
+ error: 'Failed to create or find policy'
517
+ },
518
+ PURPOSE_CREATION_FAILED: {
519
+ status: 500,
520
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
521
+ purposeCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
522
+ }),
523
+ error: 'Failed to create consent purpose'
524
+ },
525
+ CONSENT_CREATION_FAILED: {
526
+ status: 500,
527
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
528
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
529
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
530
+ }),
531
+ error: 'Failed to create consent record'
532
+ }
533
+ }).input(__WEBPACK_EXTERNAL_MODULE_zod__.z.discriminatedUnion('type', [
534
+ cookieBannerSchema,
535
+ policyBasedSchema,
536
+ otherConsentSchema
537
+ ])).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
538
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
539
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
540
+ externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
541
+ domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
542
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
543
+ type: PolicyTypeSchema,
544
+ status: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
545
+ recordId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
546
+ metadata: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.unknown()).optional(),
547
+ givenAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date()
548
+ }));
549
+ const types_branding = [
550
+ 'c15t',
551
+ 'consent',
552
+ 'none'
553
+ ];
554
+ const JurisdictionMessages = {
555
+ GDPR: 'GDPR or equivalent regulations require a cookie banner.',
556
+ CH: 'Switzerland requires similar data protection measures.',
557
+ BR: "Brazil's LGPD requires consent for cookies.",
558
+ PIPEDA: 'PIPEDA requires consent for data collection.',
559
+ AU: "Australia's Privacy Act mandates transparency about data collection.",
560
+ APPI: "Japan's APPI requires consent for data collection.",
561
+ PIPA: "South Korea's PIPA requires consent for data collection.",
562
+ NONE: 'No specific requirements'
563
+ };
564
+ const JurisdictionCodeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
565
+ 'GDPR',
566
+ 'CH',
567
+ 'BR',
568
+ 'PIPEDA',
569
+ 'AU',
570
+ 'APPI',
571
+ 'PIPA',
572
+ 'NONE'
573
+ ]);
574
+ const JurisdictionInfoSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
575
+ code: JurisdictionCodeSchema,
576
+ message: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
577
+ });
578
+ const TitleDescriptionSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
579
+ title: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
580
+ description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
581
+ });
582
+ const TranslationsSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
583
+ common: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
584
+ acceptAll: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
585
+ rejectAll: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
586
+ customize: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
587
+ save: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
588
+ }),
589
+ cookieBanner: TitleDescriptionSchema,
590
+ consentManagerDialog: TitleDescriptionSchema,
591
+ consentTypes: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
592
+ experience: TitleDescriptionSchema,
593
+ functionality: TitleDescriptionSchema,
594
+ marketing: TitleDescriptionSchema,
595
+ measurement: TitleDescriptionSchema,
596
+ necessary: TitleDescriptionSchema
597
+ })
598
+ });
599
+ const showConsentBannerContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
600
+ method: 'GET',
601
+ path: '/show-consent-banner',
602
+ description: `Determines if a user should see a consent banner based on their location and applicable privacy regulations.
603
+ This endpoint performs the following checks:
604
+
605
+ 1. Detects the user's location using various header information:
606
+ - Cloudflare country headers
607
+ - Vercel IP country headers
608
+ - AWS CloudFront headers
609
+ - Custom country code headers
610
+
611
+ 2. Determines the applicable jurisdiction based on the location:
612
+ - GDPR (EU/EEA/UK)
613
+ - Swiss Data Protection Act
614
+ - LGPD (Brazil)
615
+ - PIPEDA (Canada)
616
+ - Australian Privacy Principles
617
+ - APPI (Japan)
618
+ - PIPA (South Korea)
619
+
620
+ 3. Returns detailed information about:
621
+ - Whether to show the consent banner
622
+ - The applicable jurisdiction and its requirements
623
+ - The user's detected location (country and region)
624
+
625
+ Use this endpoint to implement geo-targeted consent banners and ensure compliance with regional privacy regulations.`,
626
+ tags: [
627
+ 'cookie-banner'
628
+ ]
629
+ }).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
630
+ showConsentBanner: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
631
+ jurisdiction: JurisdictionInfoSchema,
632
+ location: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
633
+ countryCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
634
+ regionCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable()
635
+ }),
636
+ translations: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
637
+ language: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
638
+ translations: TranslationsSchema
639
+ }),
640
+ branding: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"](types_branding)
641
+ }));
642
+ const verifyConsentInputSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.strictObject({
643
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
644
+ externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
645
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
646
+ type: PolicyTypeSchema,
647
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
648
+ preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional()
649
+ });
650
+ const verify_contract_consentSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.looseObject({
651
+ id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
652
+ purposeIds: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string())
653
+ });
654
+ const verifyConsentContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
655
+ method: 'POST',
656
+ path: '/consent/verify',
657
+ description: `Verifies if a user has given valid consent for a specific policy and domain.
658
+ This endpoint performs comprehensive consent verification by:
659
+
660
+ 1. Validating the subject's identity (using subjectId or externalSubjectId)
661
+ 2. Verifying the domain's existence and validity
662
+ 3. Checking if the specified policy exists and is active
663
+ 4. Validating that all required purposes have been consented to
664
+ 5. Ensuring the consent record is current and valid
665
+
666
+ The endpoint supports different types of consent verification:
667
+ - Cookie banner consent verification
668
+ - Privacy policy consent verification
669
+ - Terms and conditions verification
670
+ - Marketing communications consent verification
671
+ - Age verification
672
+ - Custom consent types
673
+
674
+ Use this endpoint to ensure compliance with privacy regulations and to verify user consent before processing personal data.`,
675
+ tags: [
676
+ 'consent'
677
+ ]
678
+ }).errors({
679
+ INPUT_VALIDATION_FAILED: {
680
+ status: 422,
681
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
682
+ formErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
683
+ fieldErrors: __WEBPACK_EXTERNAL_MODULE_zod__.z.record(__WEBPACK_EXTERNAL_MODULE_zod__.z.string(), __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional())
684
+ }),
685
+ error: 'Invalid input parameters'
686
+ },
687
+ SUBJECT_NOT_FOUND: {
688
+ status: 404,
689
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
690
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
691
+ externalSubjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional()
692
+ }),
693
+ error: 'Subject not found'
694
+ },
695
+ DOMAIN_NOT_FOUND: {
696
+ status: 404,
697
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
698
+ domain: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
699
+ }),
700
+ error: 'Domain not found'
701
+ },
702
+ POLICY_NOT_FOUND: {
703
+ status: 404,
704
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
705
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
706
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
707
+ }),
708
+ error: 'Policy not found or invalid'
709
+ },
710
+ PURPOSES_NOT_FOUND: {
711
+ status: 404,
712
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
713
+ preferences: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()),
714
+ foundPurposes: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string())
715
+ }),
716
+ error: 'Could not find all specified purposes'
717
+ },
718
+ COOKIE_BANNER_PREFERENCES_REQUIRED: {
719
+ status: 400,
720
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
721
+ type: __WEBPACK_EXTERNAL_MODULE_zod__.z.literal('cookie_banner')
722
+ }),
723
+ error: 'Preferences are required for cookie banner consent'
724
+ },
725
+ NO_CONSENT_FOUND: {
726
+ status: 404,
727
+ data: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
728
+ policyId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
729
+ subjectId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
730
+ domainId: __WEBPACK_EXTERNAL_MODULE_zod__.z.string()
731
+ }),
732
+ error: 'No consent found for the given policy'
733
+ }
734
+ }).input(verifyConsentInputSchema).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
735
+ isValid: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean(),
736
+ reasons: __WEBPACK_EXTERNAL_MODULE_zod__.z.array(__WEBPACK_EXTERNAL_MODULE_zod__.z.string()).optional(),
737
+ consent: verify_contract_consentSchema.optional()
738
+ }));
739
+ const consentContracts = {
740
+ post: postConsentContract,
741
+ showBanner: showConsentBannerContract,
742
+ verify: verifyConsentContract
743
+ };
744
+ const statusContract = __WEBPACK_EXTERNAL_MODULE__orpc_contract_5a058524__.oc.route({
745
+ method: 'GET',
746
+ path: '/status',
747
+ description: `Returns the current operational status and health metrics of the service.
748
+ This endpoint provides real-time information about:
749
+ - Overall service status (ok/error)
750
+ - Current API version
751
+ - Server timestamp
752
+ - Storage system status and availability
753
+ - Client information (IP, User Agent, Region)
754
+
755
+ Use this endpoint for health checks, monitoring, and service status verification.`,
756
+ tags: [
757
+ 'meta'
758
+ ]
759
+ }).output(__WEBPACK_EXTERNAL_MODULE_zod__.z.object({
760
+ status: __WEBPACK_EXTERNAL_MODULE_zod__.z["enum"]([
761
+ 'ok',
762
+ 'error'
763
+ ]),
764
+ version: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
765
+ timestamp: __WEBPACK_EXTERNAL_MODULE_zod__.z.date(),
766
+ client: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
767
+ ip: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
768
+ userAgent: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
769
+ region: __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
770
+ countryCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable(),
771
+ regionCode: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullable()
772
+ })
773
+ })
774
+ }));
775
+ const metaContracts = {
776
+ status: statusContract
777
+ };
778
+ const contracts_config = {
779
+ consent: consentContracts,
780
+ meta: metaContracts
781
+ };
782
+ const os = (0, __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.implement)(contracts_config);
783
+ const prefixes = {
784
+ auditLog: 'log',
785
+ consent: 'cns',
786
+ consentPolicy: 'pol',
787
+ consentPurpose: 'pur',
788
+ consentRecord: 'rec',
789
+ domain: 'dom',
790
+ subject: 'sub'
791
+ };
792
+ const b58 = (0, __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__["default"])('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
793
+ function generateId(model) {
794
+ const buf = crypto.getRandomValues(new Uint8Array(20));
795
+ const prefix = prefixes[model];
796
+ const EPOCH_TIMESTAMP = 1700000000000;
797
+ const t = Date.now() - EPOCH_TIMESTAMP;
798
+ const high = Math.floor(t / 0x100000000);
799
+ const low = t >>> 0;
800
+ buf[0] = high >>> 24 & 255;
801
+ buf[1] = high >>> 16 & 255;
802
+ buf[2] = high >>> 8 & 255;
803
+ buf[3] = 255 & high;
804
+ buf[4] = low >>> 24 & 255;
805
+ buf[5] = low >>> 16 & 255;
806
+ buf[6] = low >>> 8 & 255;
807
+ buf[7] = 255 & low;
808
+ return `${prefix}_${b58.encode(buf)}`;
809
+ }
810
+ async function generateUniqueId(db, model, ctx, options = {}) {
811
+ const { maxRetries = 10, attempt = 0, baseDelay = 5 } = options;
812
+ if (attempt >= maxRetries) {
813
+ const error = new Error(`Failed to generate unique ID for ${model} after ${maxRetries} attempts`);
814
+ ctx?.logger?.error?.('ID generation failed', {
815
+ model,
816
+ maxRetries
817
+ });
818
+ throw error;
819
+ }
820
+ const id = generateId(model);
821
+ try {
822
+ const existing = await db.findFirst(model, {
823
+ where: (b)=>b('id', '=', id)
824
+ });
825
+ if (existing) {
826
+ ctx?.logger?.debug?.('ID conflict detected', {
827
+ id,
828
+ model,
829
+ attempt: attempt + 1,
830
+ maxRetries
831
+ });
832
+ const delay = Math.min(baseDelay * 2 ** attempt, 1000);
833
+ await new Promise((resolve)=>setTimeout(resolve, delay));
834
+ return generateUniqueId(db, model, ctx, {
835
+ maxRetries,
836
+ attempt: attempt + 1,
837
+ baseDelay
838
+ });
839
+ }
840
+ return id;
841
+ } catch (error) {
842
+ ctx?.logger?.error?.('Error checking ID uniqueness', {
843
+ error: error.message,
844
+ model,
845
+ attempt
846
+ });
847
+ if (attempt < maxRetries - 1) {
848
+ const delay = Math.min(baseDelay * 2 ** attempt, 2000);
849
+ await new Promise((resolve)=>setTimeout(resolve, delay));
850
+ return generateUniqueId(db, model, ctx, {
851
+ maxRetries,
852
+ attempt: attempt + 1,
853
+ baseDelay
854
+ });
855
+ }
856
+ throw error;
857
+ }
858
+ }
859
+ const postConsent = os.consent.post.handler(async ({ input, context })=>{
860
+ const typedContext = context;
861
+ const logger = typedContext.logger;
862
+ logger.info('Handling post-consent request');
863
+ const { db, registry } = typedContext;
864
+ const { type, subjectId, externalSubjectId, domain, metadata, preferences } = input;
865
+ logger.debug('Request parameters', {
866
+ type,
867
+ subjectId,
868
+ externalSubjectId,
869
+ domain
870
+ });
871
+ try {
872
+ const subject = await registry.findOrCreateSubject({
873
+ subjectId,
874
+ externalSubjectId,
875
+ ipAddress: typedContext.ipAddress
876
+ });
877
+ if (!subject) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_CREATION_FAILED', {
878
+ data: {
879
+ subjectId,
880
+ externalSubjectId
881
+ }
882
+ });
883
+ logger.debug('Subject found/created', {
884
+ subjectId: subject.id
885
+ });
886
+ const domainRecord = await typedContext.registry.findOrCreateDomain(domain);
887
+ if (!domainRecord) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('DOMAIN_CREATION_FAILED', {
888
+ data: {
889
+ domain
890
+ }
891
+ });
892
+ let policyId;
893
+ let purposeIds = [];
894
+ if ('policyId' in input && input.policyId) {
895
+ policyId = input.policyId;
896
+ const policy = await typedContext.registry.findConsentPolicyById(policyId);
897
+ if (!policy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
898
+ data: {
899
+ policyId,
900
+ type
901
+ }
902
+ });
903
+ if (!policy.isActive) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_INACTIVE', {
904
+ data: {
905
+ policyId,
906
+ type
907
+ }
908
+ });
909
+ } else {
910
+ const policy = await typedContext.registry.findOrCreatePolicy(type);
911
+ if (!policy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_CREATION_FAILED', {
912
+ data: {
913
+ type
914
+ }
915
+ });
916
+ policyId = policy.id;
917
+ }
918
+ if (preferences) {
919
+ const consentedPurposes = Object.entries(preferences).filter(([_, isConsented])=>isConsented).map(([purposeCode])=>purposeCode);
920
+ logger.debug('Consented purposes', {
921
+ consentedPurposes
922
+ });
923
+ const purposesRaw = await Promise.all(consentedPurposes.map((purposeCode)=>typedContext.registry.findOrCreateConsentPurposeByCode(purposeCode)));
924
+ const purposes = purposesRaw.map((purpose)=>purpose?.id);
925
+ logger.debug('Purposes: ', {
926
+ purposes
927
+ });
928
+ purposeIds = purposes;
929
+ }
930
+ const result = await db.transaction(async (tx)=>{
931
+ logger.debug('Creating consent record', {
932
+ subjectId: subject.id,
933
+ domainId: domainRecord.id,
934
+ policyId,
935
+ purposeIds
936
+ });
937
+ const consentRecord = await tx.create('consent', {
938
+ id: await generateUniqueId(tx, 'consent', typedContext),
939
+ subjectId: subject.id,
940
+ domainId: domainRecord.id,
941
+ policyId,
942
+ purposeIds: {
943
+ json: purposeIds
944
+ },
945
+ status: 'active',
946
+ isActive: true,
947
+ ipAddress: typedContext.ipAddress || null,
948
+ userAgent: typedContext.userAgent || null
949
+ });
950
+ logger.debug('Created consent', {
951
+ consentRecord: consentRecord.id
952
+ });
953
+ logger.debug('Creating consentRecord entry', {
954
+ subjectId: subject.id,
955
+ consentId: consentRecord.id,
956
+ actionType: 'consent_given',
957
+ details: metadata
958
+ });
959
+ const record = await tx.create('consentRecord', {
960
+ id: await generateUniqueId(tx, 'consentRecord', typedContext),
961
+ subjectId: subject.id,
962
+ consentId: consentRecord.id,
963
+ actionType: 'consent_given',
964
+ details: metadata
965
+ });
966
+ logger.debug('Created record entry', {
967
+ record: record.id
968
+ });
969
+ logger.debug('Creating audit log', {
970
+ subjectId: subject.id,
971
+ entityType: 'consent',
972
+ entityId: consentRecord.id,
973
+ actionType: 'consent_given',
974
+ metadata: metadata
975
+ });
976
+ await tx.create('auditLog', {
977
+ id: await generateUniqueId(tx, 'auditLog', typedContext),
978
+ subjectId: subject.id,
979
+ entityType: 'consent',
980
+ entityId: consentRecord.id,
981
+ actionType: 'consent_given',
982
+ metadata: {
983
+ consentId: consentRecord.id,
984
+ type
985
+ },
986
+ ipAddress: typedContext.ipAddress || null,
987
+ userAgent: typedContext.userAgent || null,
988
+ eventTimezone: 'UTC'
989
+ });
990
+ logger.debug('Created audit log');
991
+ if (!consentRecord || !record) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('CONSENT_CREATION_FAILED', {
992
+ data: {
993
+ subjectId: subject.id,
994
+ domain
995
+ }
996
+ });
997
+ return {
998
+ consent: consentRecord,
999
+ record
1000
+ };
1001
+ });
1002
+ return {
1003
+ id: result.consent.id,
1004
+ subjectId: subject.id,
1005
+ externalSubjectId: subject.externalId ?? void 0,
1006
+ domainId: domainRecord.id,
1007
+ domain: domainRecord.name,
1008
+ type,
1009
+ status: result.consent.status,
1010
+ recordId: result.record.id,
1011
+ metadata,
1012
+ givenAt: result.consent.givenAt
1013
+ };
1014
+ } catch (error) {
1015
+ logger.error('Error in post-consent handler', {
1016
+ error: error instanceof Error ? error.message : String(error),
1017
+ errorType: error instanceof Error ? error.constructor.name : typeof error
1018
+ });
1019
+ if (error instanceof __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError) throw error;
1020
+ throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('INTERNAL_SERVER_ERROR', {
1021
+ message: error instanceof Error ? error.message : String(error)
1022
+ });
1023
+ }
1024
+ });
1025
+ function checkJurisdiction(countryCode) {
1026
+ const jurisdictions = {
1027
+ EU: new Set([
1028
+ 'AT',
1029
+ 'BE',
1030
+ 'BG',
1031
+ 'HR',
1032
+ 'CY',
1033
+ 'CZ',
1034
+ 'DK',
1035
+ 'EE',
1036
+ 'FI',
1037
+ 'FR',
1038
+ 'DE',
1039
+ 'GR',
1040
+ 'HU',
1041
+ 'IE',
1042
+ 'IT',
1043
+ 'LV',
1044
+ 'LT',
1045
+ 'LU',
1046
+ 'MT',
1047
+ 'NL',
1048
+ 'PL',
1049
+ 'PT',
1050
+ 'RO',
1051
+ 'SK',
1052
+ 'SI',
1053
+ 'ES',
1054
+ 'SE'
1055
+ ]),
1056
+ EEA: new Set([
1057
+ 'IS',
1058
+ 'NO',
1059
+ 'LI'
1060
+ ]),
1061
+ UK: new Set([
1062
+ 'GB'
1063
+ ]),
1064
+ CH: new Set([
1065
+ 'CH'
1066
+ ]),
1067
+ BR: new Set([
1068
+ 'BR'
1069
+ ]),
1070
+ CA: new Set([
1071
+ 'CA'
1072
+ ]),
1073
+ AU: new Set([
1074
+ 'AU'
1075
+ ]),
1076
+ JP: new Set([
1077
+ 'JP'
1078
+ ]),
1079
+ KR: new Set([
1080
+ 'KR'
1081
+ ])
1082
+ };
1083
+ let showConsentBanner = true;
1084
+ let jurisdictionCode = 'NONE';
1085
+ if (countryCode) {
1086
+ const normalizedCountryCode = countryCode.toUpperCase();
1087
+ showConsentBanner = false;
1088
+ const jurisdictionMap = [
1089
+ {
1090
+ sets: [
1091
+ jurisdictions.EU,
1092
+ jurisdictions.EEA,
1093
+ jurisdictions.UK
1094
+ ],
1095
+ code: 'GDPR'
1096
+ },
1097
+ {
1098
+ sets: [
1099
+ jurisdictions.CH
1100
+ ],
1101
+ code: 'CH'
1102
+ },
1103
+ {
1104
+ sets: [
1105
+ jurisdictions.BR
1106
+ ],
1107
+ code: 'BR'
1108
+ },
1109
+ {
1110
+ sets: [
1111
+ jurisdictions.CA
1112
+ ],
1113
+ code: 'PIPEDA'
1114
+ },
1115
+ {
1116
+ sets: [
1117
+ jurisdictions.AU
1118
+ ],
1119
+ code: 'AU'
1120
+ },
1121
+ {
1122
+ sets: [
1123
+ jurisdictions.JP
1124
+ ],
1125
+ code: 'APPI'
1126
+ },
1127
+ {
1128
+ sets: [
1129
+ jurisdictions.KR
1130
+ ],
1131
+ code: 'PIPA'
1132
+ }
1133
+ ];
1134
+ for (const { sets, code } of jurisdictionMap)if (sets.some((set)=>set.has(normalizedCountryCode))) {
1135
+ jurisdictionCode = code;
1136
+ showConsentBanner = true;
1137
+ break;
1138
+ }
1139
+ }
1140
+ const message = JurisdictionMessages[jurisdictionCode];
1141
+ return {
1142
+ showConsentBanner,
1143
+ jurisdictionCode,
1144
+ message
1145
+ };
1146
+ }
1147
+ function isSupportedBaseLanguage(lang) {
1148
+ return lang in __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations;
1149
+ }
1150
+ function getPreferredLanguage(acceptLanguage, supportedLanguages) {
1151
+ if (!acceptLanguage) return 'en';
1152
+ const primaryLang = acceptLanguage.split(',')[0]?.split(';')[0]?.split('-')[0]?.toLowerCase();
1153
+ if (primaryLang && supportedLanguages.includes(primaryLang)) return primaryLang;
1154
+ return 'en';
1155
+ }
1156
+ function getTranslations(acceptLanguage, customTranslations) {
1157
+ const supportedDefaultLanguages = Object.keys(__WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations);
1158
+ const supportedCustomLanguages = Object.keys(customTranslations || {});
1159
+ const supportedLanguages = [
1160
+ ...supportedDefaultLanguages,
1161
+ ...supportedCustomLanguages
1162
+ ];
1163
+ const preferredLanguage = getPreferredLanguage(acceptLanguage, supportedLanguages);
1164
+ const base = isSupportedBaseLanguage(preferredLanguage) ? __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations[preferredLanguage] : __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.baseTranslations.en;
1165
+ const custom = supportedCustomLanguages.includes(preferredLanguage) ? customTranslations?.[preferredLanguage] : {};
1166
+ const translations = custom ? (0, __WEBPACK_EXTERNAL_MODULE__c15t_translations_cdae900b__.deepMergeTranslations)(base, custom) : base;
1167
+ return {
1168
+ translations: translations,
1169
+ language: preferredLanguage
1170
+ };
1171
+ }
1172
+ function getHeaders(headers) {
1173
+ if (!headers) return {
1174
+ countryCode: null,
1175
+ regionCode: null,
1176
+ acceptLanguage: null
1177
+ };
1178
+ const normalizeHeader = (value)=>{
1179
+ if (!value) return null;
1180
+ return Array.isArray(value) ? value[0] ?? null : value;
1181
+ };
1182
+ const countryCode = normalizeHeader(headers.get('x-c15t-country')) ?? normalizeHeader(headers.get('cf-ipcountry')) ?? normalizeHeader(headers.get('x-vercel-ip-country')) ?? normalizeHeader(headers.get('x-amz-cf-ipcountry')) ?? normalizeHeader(headers.get('x-country-code'));
1183
+ const regionCode = normalizeHeader(headers.get('x-c15t-region')) ?? normalizeHeader(headers.get('x-vercel-ip-country-region')) ?? normalizeHeader(headers.get('x-region-code'));
1184
+ const acceptLanguage = normalizeHeader(headers.get('accept-language'));
1185
+ return {
1186
+ countryCode,
1187
+ regionCode,
1188
+ acceptLanguage
1189
+ };
1190
+ }
1191
+ function buildResponse({ shouldShowBanner, jurisdiction, location, acceptLanguage, customTranslations, branding = 'c15t' }) {
1192
+ return {
1193
+ showConsentBanner: shouldShowBanner,
1194
+ jurisdiction,
1195
+ location,
1196
+ translations: getTranslations(acceptLanguage, customTranslations),
1197
+ branding: branding
1198
+ };
1199
+ }
1200
+ const handler_showConsentBanner = os.consent.showBanner.handler(({ context })=>{
1201
+ const typedContext = context;
1202
+ const { customTranslations, disableGeoLocation, branding } = typedContext.advanced ?? {};
1203
+ const { countryCode, regionCode, acceptLanguage } = getHeaders(typedContext.headers);
1204
+ if (disableGeoLocation) return buildResponse({
1205
+ shouldShowBanner: true,
1206
+ jurisdiction: {
1207
+ code: 'NONE',
1208
+ message: JurisdictionMessages.NONE
1209
+ },
1210
+ location: {
1211
+ countryCode: null,
1212
+ regionCode: null
1213
+ },
1214
+ acceptLanguage,
1215
+ customTranslations,
1216
+ branding
1217
+ });
1218
+ const { showConsentBanner, jurisdictionCode, message } = checkJurisdiction(countryCode);
1219
+ return buildResponse({
1220
+ shouldShowBanner: showConsentBanner,
1221
+ jurisdiction: {
1222
+ code: jurisdictionCode,
1223
+ message
1224
+ },
1225
+ location: {
1226
+ countryCode,
1227
+ regionCode
1228
+ },
1229
+ acceptLanguage,
1230
+ customTranslations,
1231
+ branding
1232
+ });
1233
+ });
1234
+ const verifyConsent = os.consent.verify.handler(async ({ input, context })=>{
1235
+ const typedContext = context;
1236
+ const logger = typedContext.logger;
1237
+ logger.info('Handling verify-consent request');
1238
+ const { type, subjectId, externalSubjectId, domain, policyId, preferences } = input;
1239
+ logger.debug('Request parameters', {
1240
+ type,
1241
+ subjectId,
1242
+ externalSubjectId,
1243
+ domain,
1244
+ policyId,
1245
+ preferences
1246
+ });
1247
+ try {
1248
+ const domainRecord = await typedContext.registry.findDomainByName(domain);
1249
+ if (!domainRecord) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('DOMAIN_NOT_FOUND', {
1250
+ data: {
1251
+ domain
1252
+ }
1253
+ });
1254
+ const subject = await typedContext.registry.findOrCreateSubject({
1255
+ subjectId,
1256
+ externalSubjectId,
1257
+ ipAddress: typedContext.ipAddress ?? 'unknown'
1258
+ });
1259
+ if (!subject) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_NOT_FOUND', {
1260
+ data: {
1261
+ subjectId,
1262
+ externalSubjectId
1263
+ }
1264
+ });
1265
+ if ('cookie_banner' === type && (!preferences || 0 === preferences.length)) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('COOKIE_BANNER_PREFERENCES_REQUIRED', {
1266
+ data: {
1267
+ type: 'cookie_banner'
1268
+ }
1269
+ });
1270
+ const purposePromises = preferences?.map((purpose)=>typedContext.registry.findOrCreateConsentPurposeByCode(purpose));
1271
+ const rawPurposes = await Promise.all(purposePromises ?? []);
1272
+ const purposeIds = rawPurposes.filter((purpose)=>null !== purpose).map((purpose)=>purpose.id);
1273
+ if (purposeIds.length !== (preferences?.length ?? 0)) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('PURPOSES_NOT_FOUND', {
1274
+ data: {
1275
+ preferences: preferences ?? [],
1276
+ foundPurposes: rawPurposes.filter((p)=>null !== p).map((p)=>p.code)
1277
+ }
1278
+ });
1279
+ if (policyId) {
1280
+ const policy = await typedContext.registry.findConsentPolicyById(policyId);
1281
+ if (!policy || policy.type !== type) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
1282
+ data: {
1283
+ policyId,
1284
+ type
1285
+ }
1286
+ });
1287
+ return await checkPolicyConsent({
1288
+ policyId: policy.id,
1289
+ subjectId: subject.id,
1290
+ domainId: domainRecord.id,
1291
+ purposeIds,
1292
+ type,
1293
+ context: typedContext
1294
+ });
1295
+ }
1296
+ const latestPolicy = await typedContext.registry.findOrCreatePolicy(type);
1297
+ if (!latestPolicy) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_NOT_FOUND', {
1298
+ data: {
1299
+ policyId: 'latest',
1300
+ type
1301
+ }
1302
+ });
1303
+ return await checkPolicyConsent({
1304
+ policyId: latestPolicy.id,
1305
+ subjectId: subject.id,
1306
+ domainId: domainRecord.id,
1307
+ purposeIds,
1308
+ type,
1309
+ context: typedContext
1310
+ });
1311
+ } catch (error) {
1312
+ logger.error('Error in verify-consent handler', {
1313
+ error: error instanceof Error ? error.message : String(error),
1314
+ errorType: error instanceof Error ? error.constructor.name : typeof error
1315
+ });
1316
+ if (error instanceof __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError) throw error;
1317
+ throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('INTERNAL_SERVER_ERROR', {
1318
+ message: error instanceof Error ? error.message : String(error)
1319
+ });
1320
+ }
1321
+ });
1322
+ async function checkPolicyConsent({ policyId, subjectId, domainId, purposeIds, type, context }) {
1323
+ const { registry, db } = context;
1324
+ const rawConsents = await db.findMany('consent', {
1325
+ where: (b)=>b.and(b('subjectId', '=', subjectId), b('policyId', '=', policyId), b('domainId', '=', domainId)),
1326
+ orderBy: [
1327
+ 'givenAt',
1328
+ 'desc'
1329
+ ]
1330
+ });
1331
+ const filteredConsents = rawConsents.filter((consent)=>{
1332
+ if (!purposeIds) return true;
1333
+ return purposeIds.every((id)=>consent.purposeIds.some((purposeId)=>purposeId === id));
1334
+ });
1335
+ await registry.createAuditLog({
1336
+ subjectId,
1337
+ entityType: 'consent_policy',
1338
+ entityId: policyId,
1339
+ actionType: 'verify_consent',
1340
+ metadata: {
1341
+ type,
1342
+ policyId,
1343
+ purposeIds,
1344
+ success: 0 !== filteredConsents.length,
1345
+ ...filteredConsents.length > 0 ? {
1346
+ consentId: filteredConsents[0]?.id
1347
+ } : {}
1348
+ },
1349
+ eventTimezone: 'UTC'
1350
+ });
1351
+ if (0 === rawConsents.length || 0 === filteredConsents.length) return {
1352
+ isValid: false
1353
+ };
1354
+ return {
1355
+ isValid: true,
1356
+ consent: filteredConsents[0]
1357
+ };
1358
+ }
1359
+ const consentHandlers = {
1360
+ post: postConsent,
1361
+ showBanner: handler_showConsentBanner,
1362
+ verify: verifyConsent
1363
+ };
1364
+ const statusHandler = os.meta.status.handler(({ context })=>{
1365
+ const typedContext = context;
1366
+ const headers = typedContext.headers;
1367
+ const normalizeHeader = (value)=>{
1368
+ if (!value) return null;
1369
+ return Array.isArray(value) ? value[0] ?? null : value;
1370
+ };
1371
+ const countryCode = normalizeHeader(headers?.get('cf-ipcountry')) ?? normalizeHeader(headers?.get('x-vercel-ip-country')) ?? normalizeHeader(headers?.get('x-amz-cf-ipcountry')) ?? normalizeHeader(headers?.get('x-country-code'));
1372
+ const regionCode = normalizeHeader(headers?.get('x-vercel-ip-country-region')) ?? normalizeHeader(headers?.get('x-region-code'));
1373
+ return {
1374
+ status: 'ok',
1375
+ version: version,
1376
+ timestamp: new Date(),
1377
+ client: {
1378
+ ip: typedContext.ipAddress ?? null,
1379
+ userAgent: typedContext.userAgent ?? null,
1380
+ region: {
1381
+ countryCode,
1382
+ regionCode
1383
+ }
1384
+ }
1385
+ };
1386
+ });
1387
+ const metaHandlers = {
1388
+ status: statusHandler
1389
+ };
1390
+ const router = os.router({
1391
+ consent: consentHandlers,
1392
+ meta: metaHandlers
1393
+ });
1394
+ const mergeOpenAPIOptions = (defaultOptions, userOptions)=>{
1395
+ const merged = {
1396
+ ...defaultOptions
1397
+ };
1398
+ if (userOptions.info && 'object' == typeof userOptions.info) merged.info = {
1399
+ ...merged.info,
1400
+ ...userOptions.info
1401
+ };
1402
+ for (const [key, value] of Object.entries(userOptions))if ('info' !== key) merged[key] = value;
1403
+ return merged;
1404
+ };
1405
+ const createOpenAPISpec = (context, options)=>{
1406
+ const openAPIGenerator = new __WEBPACK_EXTERNAL_MODULE__orpc_openapi_a95cc8e7__.OpenAPIGenerator({
1407
+ schemaConverters: [
1408
+ new __WEBPACK_EXTERNAL_MODULE__orpc_zod_716a28d4__.ZodToJsonSchemaConverter()
1409
+ ]
1410
+ });
1411
+ const getOpenAPISpec = async ()=>{
1412
+ if (getOpenAPISpec.cached) return getOpenAPISpec.cached;
1413
+ const defaultOptions = createDefaultOpenAPIOptions(options);
1414
+ const mergedOptions = options.advanced?.openapi?.options ? mergeOpenAPIOptions(defaultOptions, options.advanced.openapi.options) : defaultOptions;
1415
+ try {
1416
+ const spec = await openAPIGenerator.generate(router, mergedOptions);
1417
+ getOpenAPISpec.cached = spec;
1418
+ return spec;
1419
+ } catch (error) {
1420
+ context.logger?.error('Failed to generate OpenAPI spec:', error);
1421
+ return {
1422
+ openapi: '3.0.0',
1423
+ info: {
1424
+ title: options.appName || 'c15t API',
1425
+ version: '0.0.0'
1426
+ },
1427
+ paths: {}
1428
+ };
1429
+ }
1430
+ };
1431
+ return getOpenAPISpec;
1432
+ };
1433
+ const createDocsUI = (options)=>{
1434
+ const config = createOpenAPIConfig(options);
1435
+ if (config.customUiTemplate) return config.customUiTemplate;
1436
+ return `
1437
+ <!doctype html>
1438
+ <html>
1439
+ <head>
1440
+ <title>${options.appName || 'c15t API'} Documentation</title>
1441
+ <meta charset="utf-8" />
1442
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
1443
+ <link rel="icon" type="image/svg+xml" href="https://c15t.com/icon.svg" />
1444
+ </head>
1445
+ <body>
1446
+ <script
1447
+ id="api-reference"
1448
+ data-url="${encodeURI(config.specPath)}">
1449
+ </script>
1450
+ <script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
1451
+ </body>
1452
+ </html>
1453
+ `;
1454
+ };
1455
+ const DEFAULT_IP_HEADERS = [
1456
+ 'x-client-ip',
1457
+ 'x-forwarded-for',
1458
+ 'cf-connecting-ip',
1459
+ 'fastly-client-ip',
1460
+ 'x-real-ip',
1461
+ 'x-cluster-client-ip',
1462
+ 'x-forwarded',
1463
+ 'forwarded-for',
1464
+ 'forwarded'
1465
+ ];
1466
+ function getIpAddress(req, options) {
1467
+ const ipAddress = options.advanced?.ipAddress;
1468
+ if (ipAddress?.disableIpTracking) return 'unknown';
1469
+ const ipHeaders = ipAddress?.ipAddressHeaders || DEFAULT_IP_HEADERS;
1470
+ const headers = req instanceof Request ? req.headers : req;
1471
+ for (const key of ipHeaders){
1472
+ const value = headers.get(key);
1473
+ if (value) {
1474
+ const ip = value.split(',')[0]?.trim();
1475
+ if (ip) return ip;
1476
+ }
1477
+ }
1478
+ return 'unknown';
1479
+ }
1480
+ const generate_id_prefixes = {
1481
+ auditLog: 'log',
1482
+ consent: 'cns',
1483
+ consentPolicy: 'pol',
1484
+ consentPurpose: 'pur',
1485
+ consentRecord: 'rec',
1486
+ domain: 'dom',
1487
+ subject: 'sub'
1488
+ };
1489
+ const generate_id_b58 = (0, __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__["default"])('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
1490
+ function generate_id_generateId(model) {
1491
+ const buf = crypto.getRandomValues(new Uint8Array(20));
1492
+ const prefix = generate_id_prefixes[model];
1493
+ const EPOCH_TIMESTAMP = 1700000000000;
1494
+ const t = Date.now() - EPOCH_TIMESTAMP;
1495
+ const high = Math.floor(t / 0x100000000);
1496
+ const low = t >>> 0;
1497
+ buf[0] = high >>> 24 & 255;
1498
+ buf[1] = high >>> 16 & 255;
1499
+ buf[2] = high >>> 8 & 255;
1500
+ buf[3] = 255 & high;
1501
+ buf[4] = low >>> 24 & 255;
1502
+ buf[5] = low >>> 16 & 255;
1503
+ buf[6] = low >>> 8 & 255;
1504
+ buf[7] = 255 & low;
1505
+ return `${prefix}_${generate_id_b58.encode(buf)}`;
1506
+ }
1507
+ async function generate_id_generateUniqueId(db, model, ctx, options = {}) {
1508
+ const { maxRetries = 10, attempt = 0, baseDelay = 5 } = options;
1509
+ if (attempt >= maxRetries) {
1510
+ const error = new Error(`Failed to generate unique ID for ${model} after ${maxRetries} attempts`);
1511
+ ctx?.logger?.error?.('ID generation failed', {
1512
+ model,
1513
+ maxRetries
1514
+ });
1515
+ throw error;
1516
+ }
1517
+ const id = generate_id_generateId(model);
1518
+ try {
1519
+ const existing = await db.findFirst(model, {
1520
+ where: (b)=>b('id', '=', id)
1521
+ });
1522
+ if (existing) {
1523
+ ctx?.logger?.debug?.('ID conflict detected', {
1524
+ id,
1525
+ model,
1526
+ attempt: attempt + 1,
1527
+ maxRetries
1528
+ });
1529
+ const delay = Math.min(baseDelay * 2 ** attempt, 1000);
1530
+ await new Promise((resolve)=>setTimeout(resolve, delay));
1531
+ return generate_id_generateUniqueId(db, model, ctx, {
1532
+ maxRetries,
1533
+ attempt: attempt + 1,
1534
+ baseDelay
1535
+ });
1536
+ }
1537
+ return id;
1538
+ } catch (error) {
1539
+ ctx?.logger?.error?.('Error checking ID uniqueness', {
1540
+ error: error.message,
1541
+ model,
1542
+ attempt
1543
+ });
1544
+ if (attempt < maxRetries - 1) {
1545
+ const delay = Math.min(baseDelay * 2 ** attempt, 2000);
1546
+ await new Promise((resolve)=>setTimeout(resolve, delay));
1547
+ return generate_id_generateUniqueId(db, model, ctx, {
1548
+ maxRetries,
1549
+ attempt: attempt + 1,
1550
+ baseDelay
1551
+ });
1552
+ }
1553
+ throw error;
1554
+ }
1555
+ }
1556
+ function auditLogRegistry({ db, ctx }) {
1557
+ const logger = ctx?.logger ?? {
1558
+ debug: ()=>void 0,
1559
+ error: ()=>void 0
1560
+ };
1561
+ return {
1562
+ createAuditLog: async (auditLog)=>{
1563
+ logger.debug('Creating audit log', {
1564
+ auditLog
1565
+ });
1566
+ const createdLog = await db.create('auditLog', {
1567
+ id: await generate_id_generateUniqueId(db, 'auditLog', ctx),
1568
+ createdAt: new Date(),
1569
+ ...auditLog
1570
+ });
1571
+ if (!createdLog) {
1572
+ logger.error('Failed to create audit log', {
1573
+ auditLog
1574
+ });
1575
+ throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('INTERNAL_SERVER_ERROR', {
1576
+ message: 'Failed to create audit log',
1577
+ status: 500
1578
+ });
1579
+ }
1580
+ return createdLog;
1581
+ }
1582
+ };
1583
+ }
1584
+ function consentRegistry({ db, ctx }) {
1585
+ const { logger } = ctx;
1586
+ return {
1587
+ createConsent: async (consent)=>{
1588
+ logger.debug('Creating consent', {
1589
+ consent
1590
+ });
1591
+ const createdConsent = await db.create('consent', {
1592
+ id: await generate_id_generateUniqueId(db, 'consent', ctx),
1593
+ subjectId: consent.subjectId,
1594
+ domainId: consent.domainId,
1595
+ policyId: consent.policyId,
1596
+ purposeIds: consent.purposeIds,
1597
+ metadata: consent.metadata,
1598
+ ipAddress: consent.ipAddress,
1599
+ userAgent: consent.userAgent,
1600
+ status: consent.status,
1601
+ givenAt: consent.givenAt,
1602
+ isActive: consent.isActive
1603
+ });
1604
+ if (!createdConsent) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('CONSENT_CREATION_FAILED', {
1605
+ message: 'Failed to create consent - operation returned null',
1606
+ status: 500,
1607
+ data: {
1608
+ subjectId: consent.subjectId,
1609
+ domainId: consent.domainId
1610
+ }
1611
+ });
1612
+ return createdConsent;
1613
+ }
1614
+ };
1615
+ }
1616
+ function policyRegistry({ db, ctx }) {
1617
+ const { logger } = ctx;
1618
+ async function generatePolicyPlaceholder(name, date) {
1619
+ const content = `[PLACEHOLDER] This is an automatically generated version of the ${name} policy.\n\nThis placeholder content should be replaced with actual policy terms before being presented to users.\n\nGenerated on: ${date.toISOString()}`;
1620
+ let contentHash;
1621
+ try {
1622
+ const encoder = new TextEncoder();
1623
+ const data = encoder.encode(content);
1624
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1625
+ contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1626
+ } catch {
1627
+ throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('POLICY_CREATION_FAILED', {
1628
+ message: 'Failed to generate policy content hash',
1629
+ status: 500,
1630
+ data: {
1631
+ name
1632
+ }
1633
+ });
1634
+ }
1635
+ return {
1636
+ content,
1637
+ contentHash
1638
+ };
1639
+ }
1640
+ return {
1641
+ findConsentPolicyById: async (policyId)=>{
1642
+ const policy = await db.findFirst('consentPolicy', {
1643
+ where: (b)=>b('id', '=', policyId)
1644
+ });
1645
+ return policy;
1646
+ },
1647
+ findOrCreatePolicy: async (type)=>{
1648
+ const existingPolicy = await db.findFirst('consentPolicy', {
1649
+ where: (b)=>b.and(b('isActive', '=', true), b('type', '=', type)),
1650
+ orderBy: [
1651
+ 'effectiveDate',
1652
+ 'desc'
1653
+ ]
1654
+ });
1655
+ if (existingPolicy) {
1656
+ logger.debug('Found existing policy', {
1657
+ type,
1658
+ policyId: existingPolicy.id
1659
+ });
1660
+ return existingPolicy;
1661
+ }
1662
+ const { content, contentHash } = await generatePolicyPlaceholder(type, new Date());
1663
+ const policy = await db.create('consentPolicy', {
1664
+ id: await generate_id_generateUniqueId(db, 'consentPolicy', ctx),
1665
+ version: '1.0.0',
1666
+ type,
1667
+ name: type,
1668
+ effectiveDate: new Date(),
1669
+ content,
1670
+ contentHash,
1671
+ isActive: true,
1672
+ expirationDate: null
1673
+ });
1674
+ return policy;
1675
+ }
1676
+ };
1677
+ }
1678
+ function consentPurposeRegistry({ db, ctx }) {
1679
+ const { logger } = ctx;
1680
+ return {
1681
+ findOrCreateConsentPurposeByCode: async (code)=>{
1682
+ const existingPurpose = await db.findFirst('consentPurpose', {
1683
+ where: (b)=>b('code', '=', code)
1684
+ });
1685
+ if (existingPurpose) {
1686
+ logger.debug('Found existing consent purpose', {
1687
+ code
1688
+ });
1689
+ return existingPurpose;
1690
+ }
1691
+ logger.debug('Creating consent purpose', {
1692
+ code
1693
+ });
1694
+ const createdPurpose = await db.create('consentPurpose', {
1695
+ id: await generate_id_generateUniqueId(db, 'consentPurpose', ctx),
1696
+ code,
1697
+ name: code,
1698
+ description: `Auto-created consentPurpose for ${code}`,
1699
+ isActive: true,
1700
+ isEssential: false,
1701
+ legalBasis: 'consent'
1702
+ });
1703
+ if (!createdPurpose) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('PURPOSE_CREATION_FAILED', {
1704
+ message: 'Failed to create consent purpose',
1705
+ status: 500,
1706
+ data: {
1707
+ purposeCode: code
1708
+ }
1709
+ });
1710
+ return createdPurpose;
1711
+ }
1712
+ };
1713
+ }
1714
+ function domainRegistry({ db, ctx }) {
1715
+ const { logger } = ctx;
1716
+ const findDomainByName = async (name)=>{
1717
+ const domain = await db.findFirst('domain', {
1718
+ where: (b)=>b('name', '=', name)
1719
+ });
1720
+ if (!domain) logger.debug('No domain found', {
1721
+ name
1722
+ });
1723
+ return domain;
1724
+ };
1725
+ return {
1726
+ findDomainByName,
1727
+ findOrCreateDomain: async (name)=>{
1728
+ const existingDomain = await findDomainByName(name);
1729
+ if (existingDomain) {
1730
+ logger.debug('Found existing domain', {
1731
+ name
1732
+ });
1733
+ return existingDomain;
1734
+ }
1735
+ logger.debug('Creating new domain', {
1736
+ name
1737
+ });
1738
+ const domain = await db.create('domain', {
1739
+ id: await generate_id_generateUniqueId(db, 'domain', ctx),
1740
+ name,
1741
+ description: `Auto-created domain for ${name}`,
1742
+ isActive: true,
1743
+ isVerified: true,
1744
+ allowedOrigins: []
1745
+ });
1746
+ if (!domain) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('DOMAIN_CREATION_FAILED', {
1747
+ message: 'Failed to create domain',
1748
+ status: 503,
1749
+ data: {
1750
+ name
1751
+ }
1752
+ });
1753
+ return domain;
1754
+ }
1755
+ };
1756
+ }
1757
+ function subjectRegistry({ db, ctx }) {
1758
+ const { logger } = ctx;
1759
+ return {
1760
+ findOrCreateSubject: async ({ subjectId, externalSubjectId, ipAddress = 'unknown' })=>{
1761
+ if (subjectId && externalSubjectId) {
1762
+ const subject = await db.findFirst('subject', {
1763
+ where: (b)=>b.and(b('id', '=', subjectId), b('externalId', '=', externalSubjectId))
1764
+ });
1765
+ if (!subject) {
1766
+ logger?.error('Subject not found', {
1767
+ providedSubjectId: subjectId,
1768
+ providedExternalId: externalSubjectId
1769
+ });
1770
+ throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_NOT_FOUND', {
1771
+ message: 'The specified subject could not be found. Please verify the subject identifiers and try again.',
1772
+ status: 404,
1773
+ data: {
1774
+ providedSubjectId: subjectId,
1775
+ providedExternalId: externalSubjectId
1776
+ }
1777
+ });
1778
+ }
1779
+ return subject;
1780
+ }
1781
+ if (subjectId) {
1782
+ const subject = await db.findFirst('subject', {
1783
+ where: (b)=>b('id', '=', subjectId)
1784
+ });
1785
+ if (!subject) throw new __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError('SUBJECT_NOT_FOUND', {
1786
+ message: 'Subject not found by subjectId',
1787
+ status: 404,
1788
+ data: {
1789
+ subjectId
1790
+ }
1791
+ });
1792
+ return subject;
1793
+ }
1794
+ if (externalSubjectId) {
1795
+ logger.debug('Finding/Creating subject with external id');
1796
+ await db.upsert('subject', {
1797
+ where: (b)=>b('externalId', '=', externalSubjectId),
1798
+ create: {
1799
+ id: await generate_id_generateUniqueId(db, 'subject', ctx),
1800
+ externalId: externalSubjectId,
1801
+ identityProvider: 'anonymous',
1802
+ lastIpAddress: ipAddress,
1803
+ isIdentified: !!externalSubjectId
1804
+ },
1805
+ update: {
1806
+ lastIpAddress: ipAddress
1807
+ }
1808
+ });
1809
+ const subject = await db.findFirst('subject', {
1810
+ where: (b)=>b('externalId', '=', externalSubjectId)
1811
+ });
1812
+ return subject;
1813
+ }
1814
+ logger?.debug('Creating new anonymous subject');
1815
+ const subject = await db.create('subject', {
1816
+ id: await generate_id_generateUniqueId(db, 'subject', ctx),
1817
+ externalId: null,
1818
+ identityProvider: 'anonymous',
1819
+ lastIpAddress: ipAddress,
1820
+ isIdentified: false
1821
+ });
1822
+ logger.debug('Created new anonymous subject', {
1823
+ subject
1824
+ });
1825
+ return subject;
1826
+ }
1827
+ };
1828
+ }
1829
+ const createRegistry = (ctx)=>({
1830
+ ...auditLogRegistry(ctx),
1831
+ ...subjectRegistry(ctx),
1832
+ ...consentRegistry(ctx),
1833
+ ...consentPurposeRegistry(ctx),
1834
+ ...policyRegistry(ctx),
1835
+ ...domainRegistry(ctx)
1836
+ });
1837
+ function createTelemetryOptions(appName = 'c15t', telemetryConfig) {
1838
+ const config = {
1839
+ disabled: telemetryConfig?.disabled ?? false,
1840
+ tracer: telemetryConfig?.tracer,
1841
+ defaultAttributes: {
1842
+ ...telemetryConfig?.defaultAttributes || {},
1843
+ 'service.name': String(appName),
1844
+ 'service.version': version
1845
+ }
1846
+ };
1847
+ return config;
1848
+ }
1849
+ const getTracer = (options)=>{
1850
+ if (options?.advanced?.telemetry?.tracer) return options.advanced.telemetry.tracer;
1851
+ return __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.trace.getTracer(options?.appName ?? 'c15t');
1852
+ };
1853
+ const createRequestSpan = (method, path, options)=>{
1854
+ if (options?.advanced?.telemetry?.disabled) return null;
1855
+ const tracer = getTracer(options);
1856
+ const span = tracer.startSpan(`${method} ${path}`, {
1857
+ attributes: {
1858
+ 'http.method': method,
1859
+ 'http.path': path,
1860
+ ...options?.advanced?.telemetry?.defaultAttributes || {}
1861
+ }
1862
+ });
1863
+ return span;
1864
+ };
1865
+ const withRequestSpan = async (method, path, operation, options)=>{
1866
+ const span = createRequestSpan(method, path, options);
1867
+ if (!span) return operation();
1868
+ try {
1869
+ const result = await operation();
1870
+ span.setStatus({
1871
+ code: __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.SpanStatusCode.OK
1872
+ });
1873
+ return result;
1874
+ } catch (error) {
1875
+ handleSpanError(span, error);
1876
+ throw error;
1877
+ } finally{
1878
+ span.end();
1879
+ }
1880
+ };
1881
+ const handleSpanError = (span, error)=>{
1882
+ span.setStatus({
1883
+ code: __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.SpanStatusCode.ERROR,
1884
+ message: error instanceof Error ? error.message : String(error)
1885
+ });
1886
+ if (error instanceof Error) {
1887
+ span.setAttribute('error.type', error.name);
1888
+ span.setAttribute('error.message', error.message);
1889
+ if (error.stack) span.setAttribute('error.stack', error.stack);
1890
+ }
1891
+ };
1892
+ let globalLogger;
1893
+ function initLogger(options) {
1894
+ globalLogger = (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options);
1895
+ return globalLogger;
1896
+ }
1897
+ let telemetrySdk;
1898
+ const initializeTelemetry = (appName, telemetryOptions, logger)=>{
1899
+ if (telemetrySdk) {
1900
+ logger.debug('Telemetry SDK already initialized, skipping');
1901
+ return true;
1902
+ }
1903
+ if (telemetryOptions?.disabled) {
1904
+ logger.info('Telemetry is disabled by configuration');
1905
+ return false;
1906
+ }
1907
+ try {
1908
+ const resource = (0, __WEBPACK_EXTERNAL_MODULE__opentelemetry_resources_c7ac8648__.resourceFromAttributes)({
1909
+ 'service.name': appName,
1910
+ 'service.version': version,
1911
+ ...telemetryOptions?.defaultAttributes || {}
1912
+ });
1913
+ logger.debug('Initializing telemetry with resource attributes', {
1914
+ attributes: resource.attributes
1915
+ });
1916
+ const traceExporter = telemetryOptions?.tracer ? void 0 : new __WEBPACK_EXTERNAL_MODULE__opentelemetry_sdk_trace_base_5031a705__.ConsoleSpanExporter();
1917
+ telemetrySdk = new __WEBPACK_EXTERNAL_MODULE__opentelemetry_sdk_node_50b75088__.NodeSDK({
1918
+ resource,
1919
+ traceExporter
1920
+ });
1921
+ telemetrySdk.start();
1922
+ logger.info('Telemetry successfully initialized');
1923
+ return true;
1924
+ } catch (error) {
1925
+ logger.error('Telemetry initialization failed', {
1926
+ error: error instanceof Error ? error.message : String(error),
1927
+ stack: error instanceof Error ? error.stack : void 0
1928
+ });
1929
+ logger.warn('Continuing without telemetry');
1930
+ return false;
1931
+ }
1932
+ };
1933
+ const init = (options)=>{
1934
+ const appName = options.appName || 'c15t';
1935
+ const logger = initLogger({
1936
+ ...options.logger,
1937
+ appName: String(appName)
1938
+ });
1939
+ const telemetryOptions = createTelemetryOptions(String(appName), options.advanced?.telemetry);
1940
+ const telemetryInitialized = initializeTelemetry(String(appName), telemetryOptions, logger);
1941
+ if (telemetryOptions?.disabled) logger.info('Telemetry is disabled by configuration');
1942
+ else if (telemetryInitialized) logger.info('Telemetry initialized successfully');
1943
+ else logger.warn('Telemetry initialization failed, continuing without telemetry');
1944
+ const client = DB.client(options.adapter);
1945
+ const orm = client.orm('1.0.0');
1946
+ const context = {
1947
+ ...options,
1948
+ appName,
1949
+ logger,
1950
+ db: orm,
1951
+ registry: createRegistry({
1952
+ db: orm,
1953
+ ctx: {
1954
+ logger
1955
+ }
1956
+ })
1957
+ };
1958
+ return context;
1959
+ };
1960
+ const defineConfig = (config)=>config;
1961
+ const c15tInstance = (options)=>{
1962
+ const context = init(options);
1963
+ const corsOptions = createCORSOptions(options.trustedOrigins);
1964
+ const rpcHandler = new __WEBPACK_EXTERNAL_MODULE__orpc_openapi_fetch_89b49e61__.OpenAPIHandler(router, {
1965
+ plugins: [
1966
+ new __WEBPACK_EXTERNAL_MODULE__orpc_server_plugins_e445fd4f__.CORSPlugin(corsOptions)
1967
+ ]
1968
+ });
1969
+ const openApiConfig = createOpenAPIConfig(options);
1970
+ const getDocsUI = ()=>createDocsUI(options);
1971
+ const processTelemetry = (request, context)=>{
1972
+ const url = new URL(request.url);
1973
+ const path = url.pathname;
1974
+ const method = request.method;
1975
+ withRequestSpan(method, path, async ()=>{}, options);
1976
+ context.path = path;
1977
+ context.method = method;
1978
+ context.headers = request.headers;
1979
+ context.userAgent = request.headers.get('user-agent') || void 0;
1980
+ return context;
1981
+ };
1982
+ const handleOpenApiSpecRequest = async (url)=>{
1983
+ if (openApiConfig.enabled && url.pathname === openApiConfig.specPath) {
1984
+ const getOpenAPISpec = createOpenAPISpec(context, options);
1985
+ const spec = await getOpenAPISpec();
1986
+ return new Response(JSON.stringify(spec), {
1987
+ status: 200,
1988
+ headers: {
1989
+ 'Content-Type': 'application/json'
1990
+ }
1991
+ });
1992
+ }
1993
+ return null;
1994
+ };
1995
+ const handleDocsUiRequest = (url)=>{
1996
+ if (openApiConfig.enabled && url.pathname === openApiConfig.docsPath) {
1997
+ const html = getDocsUI();
1998
+ return new Response(html, {
1999
+ status: 200,
2000
+ headers: {
2001
+ 'Content-Type': 'text/html',
2002
+ 'Content-Security-Policy': "default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net;"
2003
+ }
2004
+ });
2005
+ }
2006
+ return null;
2007
+ };
2008
+ const createORPCErrorResponse = (error)=>{
2009
+ const sanitizedMessage = error.message.replace(/[^\w\s.,;:!?()[\]{}'"+-]/g, '');
2010
+ return new Response(JSON.stringify({
2011
+ code: error.code,
2012
+ message: sanitizedMessage,
2013
+ data: error.data ?? {},
2014
+ status: error.status,
2015
+ defined: true
2016
+ }), {
2017
+ status: error.status,
2018
+ headers: {
2019
+ 'Content-Type': 'application/json'
2020
+ }
2021
+ });
2022
+ };
2023
+ const createUnknownErrorResponse = (error)=>{
2024
+ const message = error instanceof Error ? error.message : String(error);
2025
+ let status = 500;
2026
+ if (error instanceof Error && 'status' in error) {
2027
+ const statusValue = error.status;
2028
+ if ('number' == typeof statusValue && statusValue >= 100 && statusValue < 600) status = statusValue;
2029
+ }
2030
+ return new Response(JSON.stringify({
2031
+ code: 'INTERNAL_SERVER_ERROR',
2032
+ message,
2033
+ status,
2034
+ defined: true,
2035
+ data: {}
2036
+ }), {
2037
+ status,
2038
+ headers: {
2039
+ 'Content-Type': 'application/json'
2040
+ }
2041
+ });
2042
+ };
2043
+ const handleApiRequest = async (request, ctx)=>{
2044
+ const { logger } = ctx;
2045
+ const enrichedContext = {
2046
+ ...context,
2047
+ ipAddress: getIpAddress(request, options),
2048
+ userAgent: request.headers.get('user-agent') || void 0
2049
+ };
2050
+ processCors(request, enrichedContext, options.trustedOrigins);
2051
+ processTelemetry(request, enrichedContext);
2052
+ logger.debug?.('Handling prefix', {
2053
+ prefix: options.basePath || '/'
2054
+ });
2055
+ const { matched, response } = await rpcHandler.handle(request, {
2056
+ prefix: options.basePath || '/',
2057
+ context: enrichedContext
2058
+ });
2059
+ if (matched && response) {
2060
+ logger.debug('Handler matched', {
2061
+ request,
2062
+ matched,
2063
+ response
2064
+ });
2065
+ return response;
2066
+ }
2067
+ logger.debug('No handler matched', {
2068
+ request,
2069
+ matched,
2070
+ response
2071
+ });
2072
+ return new Response('Not Found', {
2073
+ status: 404
2074
+ });
2075
+ };
2076
+ const handler = async (request, ctxOverride)=>{
2077
+ try {
2078
+ const url = new URL(request.url);
2079
+ (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger)?.debug?.('Incoming request', {
2080
+ method: request.method,
2081
+ pathname: url.pathname
2082
+ });
2083
+ const openApiResponse = await handleOpenApiSpecRequest(url);
2084
+ if (openApiResponse) return openApiResponse;
2085
+ const docsResponse = handleDocsUiRequest(url);
2086
+ if (docsResponse) return docsResponse;
2087
+ const ctx = (0, __WEBPACK_EXTERNAL_MODULE_defu__["default"])(ctxOverride || {}, context);
2088
+ const basePath = options.basePath;
2089
+ (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger)?.debug?.('[c15t] Using basePath', {
2090
+ basePath
2091
+ });
2092
+ (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger)?.debug?.('[c15t] Routing request', {
2093
+ method: request.method,
2094
+ url: request.url,
2095
+ prefix: basePath
2096
+ });
2097
+ return await handleApiRequest(request, ctx);
2098
+ } catch (error) {
2099
+ const logger = options.logger ? (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger) : console;
2100
+ logger.error('Request handling error:', error);
2101
+ if (error instanceof __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError) return createORPCErrorResponse(error);
2102
+ return createUnknownErrorResponse(error);
2103
+ }
2104
+ };
2105
+ const createNextHandlers = ()=>{
2106
+ const nextHandler = async (request)=>await handler(request);
2107
+ return {
2108
+ GET: nextHandler,
2109
+ POST: nextHandler,
2110
+ PUT: nextHandler,
2111
+ PATCH: nextHandler,
2112
+ DELETE: nextHandler,
2113
+ OPTIONS: nextHandler,
2114
+ HEAD: nextHandler
2115
+ };
2116
+ };
2117
+ return {
2118
+ options,
2119
+ $context: context,
2120
+ router: router,
2121
+ handler,
2122
+ ...createNextHandlers(),
2123
+ getOpenAPISpec: ()=>{
2124
+ const getOpenAPISpec = createOpenAPISpec(context, options);
2125
+ return getOpenAPISpec();
2126
+ },
2127
+ getDocsUI
2128
+ };
2129
+ };
2130
+ export { c15tInstance, defineConfig, version };