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