@c15t/backend 2.0.0-rc.0 → 2.0.0-rc.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/README.md +3 -3
  2. package/dist/302.js +473 -0
  3. package/dist/583.js +540 -0
  4. package/dist/915.js +1771 -0
  5. package/dist/cache.cjs +5 -5
  6. package/dist/cache.js +4 -415
  7. package/dist/core.cjs +1356 -120
  8. package/dist/core.js +163 -1981
  9. package/dist/db/adapters/drizzle.cjs +1 -1
  10. package/dist/db/adapters/drizzle.js +1 -2
  11. package/dist/db/adapters/kysely.cjs +1 -1
  12. package/dist/db/adapters/kysely.js +1 -2
  13. package/dist/db/adapters/mongo.cjs +1 -1
  14. package/dist/db/adapters/mongo.js +1 -2
  15. package/dist/db/adapters/prisma.cjs +1 -1
  16. package/dist/db/adapters/prisma.js +1 -2
  17. package/dist/db/adapters/typeorm.cjs +1 -1
  18. package/dist/db/adapters/typeorm.js +1 -2
  19. package/dist/db/adapters.cjs +1 -1
  20. package/dist/db/migrator.cjs +1 -1
  21. package/dist/db/schema.cjs +43 -3
  22. package/dist/db/schema.js +35 -4
  23. package/dist/define-config.cjs +1 -1
  24. package/dist/edge.cjs +1106 -0
  25. package/dist/edge.js +190 -0
  26. package/dist/router.cjs +885 -123
  27. package/dist/router.js +1 -1507
  28. package/dist/{types.cjs → types/index.cjs} +1 -1
  29. package/{dist → dist-types}/cache/adapters/cloudflare-kv.d.ts +0 -1
  30. package/{dist → dist-types}/cache/adapters/index.d.ts +0 -1
  31. package/{dist → dist-types}/cache/adapters/memory.d.ts +0 -1
  32. package/{dist → dist-types}/cache/adapters/upstash-redis.d.ts +0 -1
  33. package/{dist → dist-types}/cache/gvl-resolver.d.ts +0 -1
  34. package/{dist → dist-types}/cache/index.d.ts +0 -1
  35. package/{dist → dist-types}/cache/keys.d.ts +0 -1
  36. package/{dist → dist-types}/cache/types.d.ts +0 -1
  37. package/{dist → dist-types}/core.d.ts +8 -1
  38. package/{dist → dist-types}/db/migrator/index.d.ts +0 -1
  39. package/dist-types/db/registry/consent-policy.d.ts +78 -0
  40. package/{dist → dist-types}/db/registry/consent-purpose.d.ts +0 -1
  41. package/{dist → dist-types}/db/registry/domain.d.ts +0 -1
  42. package/dist-types/db/registry/index.d.ts +118 -0
  43. package/dist-types/db/registry/runtime-policy-decision.d.ts +60 -0
  44. package/{dist → dist-types}/db/registry/subject.d.ts +0 -2
  45. package/{dist → dist-types}/db/registry/types.d.ts +1 -1
  46. package/{dist → dist-types}/db/registry/utils/generate-id.d.ts +0 -1
  47. package/{dist → dist-types}/db/registry/utils.d.ts +0 -1
  48. package/{dist → dist-types}/db/schema/1.0.0/audit-log.d.ts +0 -1
  49. package/{dist → dist-types}/db/schema/1.0.0/consent-policy.d.ts +0 -1
  50. package/{dist → dist-types}/db/schema/1.0.0/consent-purpose.d.ts +0 -1
  51. package/{dist → dist-types}/db/schema/1.0.0/consent-record.d.ts +0 -1
  52. package/{dist → dist-types}/db/schema/1.0.0/consent.d.ts +1 -2
  53. package/{dist → dist-types}/db/schema/1.0.0/domain.d.ts +0 -1
  54. package/{dist → dist-types}/db/schema/1.0.0/index.d.ts +0 -32
  55. package/{dist → dist-types}/db/schema/1.0.0/subject.d.ts +0 -2
  56. package/{dist → dist-types}/db/schema/2.0.0/audit-log.d.ts +1 -2
  57. package/{dist → dist-types}/db/schema/2.0.0/consent-policy.d.ts +3 -3
  58. package/{dist → dist-types}/db/schema/2.0.0/consent-purpose.d.ts +1 -2
  59. package/{dist → dist-types}/db/schema/2.0.0/consent.d.ts +7 -2
  60. package/{dist → dist-types}/db/schema/2.0.0/domain.d.ts +1 -2
  61. package/{dist → dist-types}/db/schema/2.0.0/index.d.ts +455 -28
  62. package/dist-types/db/schema/2.0.0/runtime-policy-decision.d.ts +23 -0
  63. package/{dist → dist-types}/db/schema/2.0.0/subject.d.ts +1 -3
  64. package/{dist → dist-types}/db/schema/index.d.ts +908 -86
  65. package/{dist → dist-types}/db/tenant-scope.d.ts +0 -1
  66. package/dist-types/define-config.d.ts +17 -0
  67. package/dist-types/edge/index.d.ts +5 -0
  68. package/dist-types/edge/init-handler.d.ts +40 -0
  69. package/dist-types/edge/resolve-consent.d.ts +80 -0
  70. package/dist-types/edge/types.d.ts +13 -0
  71. package/{dist → dist-types}/handlers/consent/check.handler.d.ts +0 -1
  72. package/{src/handlers/consent/index.ts → dist-types/handlers/consent/index.d.ts} +0 -1
  73. package/{dist → dist-types}/handlers/init/geo.d.ts +2 -3
  74. package/{dist → dist-types}/handlers/init/index.d.ts +2 -3
  75. package/dist-types/handlers/init/policy.d.ts +26 -0
  76. package/dist-types/handlers/init/resolve-init.d.ts +44 -0
  77. package/dist-types/handlers/init/translations.d.ts +48 -0
  78. package/dist-types/handlers/legal-document/current.handler.d.ts +11 -0
  79. package/dist-types/handlers/legal-document/snapshot.d.ts +39 -0
  80. package/dist-types/handlers/policy/snapshot.d.ts +99 -0
  81. package/{src/handlers/status/index.ts → dist-types/handlers/status/index.d.ts} +0 -1
  82. package/{dist → dist-types}/handlers/status/status.handler.d.ts +0 -1
  83. package/{dist → dist-types}/handlers/subject/get.handler.d.ts +3 -2
  84. package/{src/handlers/subject/index.ts → dist-types/handlers/subject/index.d.ts} +0 -1
  85. package/{dist → dist-types}/handlers/subject/list.handler.d.ts +3 -2
  86. package/{dist → dist-types}/handlers/subject/patch.handler.d.ts +0 -2
  87. package/{dist → dist-types}/handlers/subject/post.handler.d.ts +12 -1
  88. package/{dist → dist-types}/handlers/utils/consent-enrichment.d.ts +3 -1
  89. package/{dist → dist-types}/init.d.ts +4 -7
  90. package/{dist → dist-types}/middleware/auth/index.d.ts +0 -1
  91. package/{dist → dist-types}/middleware/auth/validate-api-key.d.ts +0 -1
  92. package/{dist → dist-types}/middleware/cors/cors.d.ts +0 -1
  93. package/{src/middleware/cors/index.ts → dist-types/middleware/cors/index.d.ts} +0 -1
  94. package/{dist → dist-types}/middleware/cors/is-origin-trusted.d.ts +0 -1
  95. package/{dist → dist-types}/middleware/cors/process-cors.d.ts +0 -1
  96. package/{dist → dist-types}/middleware/openapi/config.d.ts +0 -1
  97. package/{dist → dist-types}/middleware/openapi/handlers.d.ts +0 -1
  98. package/{src/middleware/openapi/index.ts → dist-types/middleware/openapi/index.d.ts} +0 -1
  99. package/{dist → dist-types}/middleware/process-ip/index.d.ts +0 -1
  100. package/dist-types/policies/builder.d.ts +127 -0
  101. package/dist-types/policies/defaults.d.ts +2 -0
  102. package/dist-types/policies/matchers.d.ts +3 -0
  103. package/{dist → dist-types}/router.d.ts +0 -1
  104. package/{dist → dist-types}/routes/consent.d.ts +0 -1
  105. package/{dist → dist-types}/routes/index.d.ts +1 -1
  106. package/{dist → dist-types}/routes/init.d.ts +0 -1
  107. package/dist-types/routes/legal-document.d.ts +7 -0
  108. package/{dist → dist-types}/routes/status.d.ts +0 -1
  109. package/{dist → dist-types}/routes/subject.d.ts +0 -1
  110. package/{dist → dist-types}/types/api.d.ts +0 -1
  111. package/dist-types/types/index.d.ts +464 -0
  112. package/dist-types/utils/background.d.ts +6 -0
  113. package/{dist → dist-types}/utils/create-telemetry-options.d.ts +1 -2
  114. package/{dist → dist-types}/utils/env.d.ts +0 -1
  115. package/{dist → dist-types}/utils/extract-error-message.d.ts +0 -1
  116. package/{dist → dist-types}/utils/instrumentation.d.ts +2 -3
  117. package/{dist → dist-types}/utils/logger.d.ts +0 -1
  118. package/{dist → dist-types}/utils/metrics.d.ts +0 -1
  119. package/dist-types/version.d.ts +1 -0
  120. package/docs/README.md +49 -0
  121. package/docs/api/configuration.md +208 -0
  122. package/docs/api/endpoints.md +211 -0
  123. package/docs/guides/caching.md +85 -0
  124. package/docs/guides/database-setup.md +128 -0
  125. package/docs/guides/edge-deployment.md +251 -0
  126. package/docs/guides/framework-integration.md +142 -0
  127. package/docs/guides/iab-tcf.md +89 -0
  128. package/docs/guides/observability.md +96 -0
  129. package/docs/guides/policy-packs.md +396 -0
  130. package/docs/quickstart.md +129 -0
  131. package/package.json +53 -39
  132. package/.turbo/turbo-build.log +0 -49
  133. package/CHANGELOG.md +0 -89
  134. package/dist/cache/adapters/cloudflare-kv.d.ts.map +0 -1
  135. package/dist/cache/adapters/index.d.ts.map +0 -1
  136. package/dist/cache/adapters/memory.d.ts.map +0 -1
  137. package/dist/cache/adapters/upstash-redis.d.ts.map +0 -1
  138. package/dist/cache/gvl-resolver.d.ts.map +0 -1
  139. package/dist/cache/index.d.ts.map +0 -1
  140. package/dist/cache/keys.d.ts.map +0 -1
  141. package/dist/cache/types.d.ts.map +0 -1
  142. package/dist/core.d.ts.map +0 -1
  143. package/dist/db/adapters/drizzle.d.ts +0 -2
  144. package/dist/db/adapters/drizzle.d.ts.map +0 -1
  145. package/dist/db/adapters/index.d.ts +0 -2
  146. package/dist/db/adapters/index.d.ts.map +0 -1
  147. package/dist/db/adapters/kysely.d.ts +0 -2
  148. package/dist/db/adapters/kysely.d.ts.map +0 -1
  149. package/dist/db/adapters/mongo.d.ts +0 -2
  150. package/dist/db/adapters/mongo.d.ts.map +0 -1
  151. package/dist/db/adapters/prisma.d.ts +0 -2
  152. package/dist/db/adapters/prisma.d.ts.map +0 -1
  153. package/dist/db/adapters/typeorm.d.ts +0 -2
  154. package/dist/db/adapters/typeorm.d.ts.map +0 -1
  155. package/dist/db/migrator/index.d.ts.map +0 -1
  156. package/dist/db/registry/consent-policy.d.ts +0 -23
  157. package/dist/db/registry/consent-policy.d.ts.map +0 -1
  158. package/dist/db/registry/consent-purpose.d.ts.map +0 -1
  159. package/dist/db/registry/domain.d.ts.map +0 -1
  160. package/dist/db/registry/index.d.ts +0 -57
  161. package/dist/db/registry/index.d.ts.map +0 -1
  162. package/dist/db/registry/subject.d.ts.map +0 -1
  163. package/dist/db/registry/types.d.ts.map +0 -1
  164. package/dist/db/registry/utils/generate-id.d.ts.map +0 -1
  165. package/dist/db/registry/utils.d.ts.map +0 -1
  166. package/dist/db/schema/1.0.0/audit-log.d.ts.map +0 -1
  167. package/dist/db/schema/1.0.0/consent-policy.d.ts.map +0 -1
  168. package/dist/db/schema/1.0.0/consent-purpose.d.ts.map +0 -1
  169. package/dist/db/schema/1.0.0/consent-record.d.ts.map +0 -1
  170. package/dist/db/schema/1.0.0/consent.d.ts.map +0 -1
  171. package/dist/db/schema/1.0.0/domain.d.ts.map +0 -1
  172. package/dist/db/schema/1.0.0/index.d.ts.map +0 -1
  173. package/dist/db/schema/1.0.0/subject.d.ts.map +0 -1
  174. package/dist/db/schema/2.0.0/audit-log.d.ts.map +0 -1
  175. package/dist/db/schema/2.0.0/consent-policy.d.ts.map +0 -1
  176. package/dist/db/schema/2.0.0/consent-purpose.d.ts.map +0 -1
  177. package/dist/db/schema/2.0.0/consent.d.ts.map +0 -1
  178. package/dist/db/schema/2.0.0/domain.d.ts.map +0 -1
  179. package/dist/db/schema/2.0.0/index.d.ts.map +0 -1
  180. package/dist/db/schema/2.0.0/subject.d.ts.map +0 -1
  181. package/dist/db/schema/index.d.ts.map +0 -1
  182. package/dist/db/tenant-scope.d.ts.map +0 -1
  183. package/dist/define-config.d.ts +0 -5
  184. package/dist/define-config.d.ts.map +0 -1
  185. package/dist/handlers/consent/check.handler.d.ts.map +0 -1
  186. package/dist/handlers/consent/index.d.ts +0 -12
  187. package/dist/handlers/consent/index.d.ts.map +0 -1
  188. package/dist/handlers/init/geo.d.ts.map +0 -1
  189. package/dist/handlers/init/index.d.ts.map +0 -1
  190. package/dist/handlers/init/translations.d.ts +0 -28
  191. package/dist/handlers/init/translations.d.ts.map +0 -1
  192. package/dist/handlers/status/index.d.ts +0 -7
  193. package/dist/handlers/status/index.d.ts.map +0 -1
  194. package/dist/handlers/status/status.handler.d.ts.map +0 -1
  195. package/dist/handlers/subject/get.handler.d.ts.map +0 -1
  196. package/dist/handlers/subject/index.d.ts +0 -10
  197. package/dist/handlers/subject/index.d.ts.map +0 -1
  198. package/dist/handlers/subject/list.handler.d.ts.map +0 -1
  199. package/dist/handlers/subject/patch.handler.d.ts.map +0 -1
  200. package/dist/handlers/subject/post.handler.d.ts.map +0 -1
  201. package/dist/handlers/utils/consent-enrichment.d.ts.map +0 -1
  202. package/dist/init.d.ts.map +0 -1
  203. package/dist/middleware/auth/index.d.ts.map +0 -1
  204. package/dist/middleware/auth/validate-api-key.d.ts.map +0 -1
  205. package/dist/middleware/cors/cors.d.ts.map +0 -1
  206. package/dist/middleware/cors/index.d.ts +0 -30
  207. package/dist/middleware/cors/index.d.ts.map +0 -1
  208. package/dist/middleware/cors/is-origin-trusted.d.ts.map +0 -1
  209. package/dist/middleware/cors/process-cors.d.ts.map +0 -1
  210. package/dist/middleware/openapi/config.d.ts.map +0 -1
  211. package/dist/middleware/openapi/handlers.d.ts.map +0 -1
  212. package/dist/middleware/openapi/index.d.ts +0 -12
  213. package/dist/middleware/openapi/index.d.ts.map +0 -1
  214. package/dist/middleware/process-ip/index.d.ts.map +0 -1
  215. package/dist/router.d.ts.map +0 -1
  216. package/dist/routes/consent.d.ts.map +0 -1
  217. package/dist/routes/index.d.ts.map +0 -1
  218. package/dist/routes/init.d.ts.map +0 -1
  219. package/dist/routes/status.d.ts.map +0 -1
  220. package/dist/routes/subject.d.ts.map +0 -1
  221. package/dist/types/api.d.ts.map +0 -1
  222. package/dist/types/index.d.ts +0 -255
  223. package/dist/types/index.d.ts.map +0 -1
  224. package/dist/utils/create-telemetry-options.d.ts.map +0 -1
  225. package/dist/utils/env.d.ts.map +0 -1
  226. package/dist/utils/extract-error-message.d.ts.map +0 -1
  227. package/dist/utils/index.d.ts +0 -4
  228. package/dist/utils/index.d.ts.map +0 -1
  229. package/dist/utils/instrumentation.d.ts.map +0 -1
  230. package/dist/utils/logger.d.ts.map +0 -1
  231. package/dist/utils/metrics.d.ts.map +0 -1
  232. package/dist/version.d.ts +0 -2
  233. package/dist/version.d.ts.map +0 -1
  234. package/knip.json +0 -31
  235. package/rslib.config.ts +0 -93
  236. package/src/cache/adapters/cloudflare-kv.ts +0 -71
  237. package/src/cache/adapters/index.ts +0 -22
  238. package/src/cache/adapters/memory.ts +0 -111
  239. package/src/cache/adapters/upstash-redis.ts +0 -113
  240. package/src/cache/gvl-resolver.ts +0 -289
  241. package/src/cache/index.ts +0 -34
  242. package/src/cache/keys.ts +0 -68
  243. package/src/cache/types.ts +0 -66
  244. package/src/core.ts +0 -368
  245. package/src/db/migrator/index.ts +0 -80
  246. package/src/db/registry/consent-policy.test.ts +0 -451
  247. package/src/db/registry/consent-policy.ts +0 -82
  248. package/src/db/registry/consent-purpose.test.ts +0 -428
  249. package/src/db/registry/consent-purpose.ts +0 -61
  250. package/src/db/registry/domain.test.ts +0 -445
  251. package/src/db/registry/domain.ts +0 -91
  252. package/src/db/registry/index.ts +0 -14
  253. package/src/db/registry/subject.test.ts +0 -388
  254. package/src/db/registry/subject.ts +0 -129
  255. package/src/db/registry/types.ts +0 -10
  256. package/src/db/registry/utils/generate-id.test.ts +0 -216
  257. package/src/db/registry/utils/generate-id.ts +0 -133
  258. package/src/db/registry/utils.ts +0 -133
  259. package/src/db/schema/1.0.0/audit-log.ts +0 -15
  260. package/src/db/schema/1.0.0/consent-policy.ts +0 -14
  261. package/src/db/schema/1.0.0/consent-purpose.ts +0 -14
  262. package/src/db/schema/1.0.0/consent-record.ts +0 -10
  263. package/src/db/schema/1.0.0/consent.ts +0 -20
  264. package/src/db/schema/1.0.0/domain.ts +0 -12
  265. package/src/db/schema/1.0.0/index.ts +0 -48
  266. package/src/db/schema/1.0.0/subject.ts +0 -12
  267. package/src/db/schema/2.0.0/audit-log.ts +0 -18
  268. package/src/db/schema/2.0.0/consent-policy.ts +0 -28
  269. package/src/db/schema/2.0.0/consent-purpose.ts +0 -12
  270. package/src/db/schema/2.0.0/consent.ts +0 -26
  271. package/src/db/schema/2.0.0/domain.ts +0 -12
  272. package/src/db/schema/2.0.0/index.ts +0 -47
  273. package/src/db/schema/2.0.0/subject.ts +0 -14
  274. package/src/db/schema/index.ts +0 -15
  275. package/src/db/tenant-scope.test.ts +0 -750
  276. package/src/db/tenant-scope.ts +0 -103
  277. package/src/define-config.ts +0 -5
  278. package/src/handlers/consent/check.handler.ts +0 -126
  279. package/src/handlers/init/geo.test.ts +0 -317
  280. package/src/handlers/init/geo.ts +0 -195
  281. package/src/handlers/init/index.test.ts +0 -205
  282. package/src/handlers/init/index.ts +0 -114
  283. package/src/handlers/init/translations.test.ts +0 -121
  284. package/src/handlers/init/translations.ts +0 -72
  285. package/src/handlers/status/status.handler.test.ts +0 -155
  286. package/src/handlers/status/status.handler.ts +0 -51
  287. package/src/handlers/subject/get.handler.ts +0 -93
  288. package/src/handlers/subject/list.handler.ts +0 -93
  289. package/src/handlers/subject/patch.handler.ts +0 -122
  290. package/src/handlers/subject/post.handler.test.ts +0 -294
  291. package/src/handlers/subject/post.handler.ts +0 -254
  292. package/src/handlers/utils/consent-enrichment.test.ts +0 -380
  293. package/src/handlers/utils/consent-enrichment.ts +0 -218
  294. package/src/init.test.ts +0 -126
  295. package/src/init.ts +0 -87
  296. package/src/middleware/auth/index.ts +0 -11
  297. package/src/middleware/auth/validate-api-key.test.ts +0 -86
  298. package/src/middleware/auth/validate-api-key.ts +0 -107
  299. package/src/middleware/cors/cors.test.ts +0 -135
  300. package/src/middleware/cors/cors.ts +0 -186
  301. package/src/middleware/cors/is-origin-trusted.test.ts +0 -164
  302. package/src/middleware/cors/is-origin-trusted.ts +0 -130
  303. package/src/middleware/cors/process-cors.ts +0 -91
  304. package/src/middleware/openapi/config.ts +0 -29
  305. package/src/middleware/openapi/handlers.ts +0 -34
  306. package/src/middleware/process-ip/index.test.ts +0 -195
  307. package/src/middleware/process-ip/index.ts +0 -199
  308. package/src/router.ts +0 -15
  309. package/src/routes/consent.ts +0 -52
  310. package/src/routes/index.ts +0 -10
  311. package/src/routes/init.ts +0 -102
  312. package/src/routes/status.ts +0 -46
  313. package/src/routes/subject.ts +0 -152
  314. package/src/types/api.ts +0 -48
  315. package/src/types/index.ts +0 -288
  316. package/src/utils/create-telemetry-options.test.ts +0 -302
  317. package/src/utils/create-telemetry-options.ts +0 -229
  318. package/src/utils/env.ts +0 -84
  319. package/src/utils/extract-error-message.ts +0 -21
  320. package/src/utils/instrumentation.test.ts +0 -185
  321. package/src/utils/instrumentation.ts +0 -196
  322. package/src/utils/logger.ts +0 -41
  323. package/src/utils/metrics.test.ts +0 -323
  324. package/src/utils/metrics.ts +0 -402
  325. package/src/utils/telemetry-pii.test.ts +0 -325
  326. package/src/version.ts +0 -2
  327. package/tsconfig.json +0 -11
  328. package/vitest.config.ts +0 -28
  329. /package/dist/{types.js → types/index.js} +0 -0
  330. /package/{src/db/adapters/drizzle.ts → dist-types/db/adapters/drizzle.d.ts} +0 -0
  331. /package/{src/db/adapters/index.ts → dist-types/db/adapters/index.d.ts} +0 -0
  332. /package/{src/db/adapters/kysely.ts → dist-types/db/adapters/kysely.d.ts} +0 -0
  333. /package/{src/db/adapters/mongo.ts → dist-types/db/adapters/mongo.d.ts} +0 -0
  334. /package/{src/db/adapters/prisma.ts → dist-types/db/adapters/prisma.d.ts} +0 -0
  335. /package/{src/db/adapters/typeorm.ts → dist-types/db/adapters/typeorm.d.ts} +0 -0
  336. /package/{src/utils/index.ts → dist-types/utils/index.d.ts} +0 -0
@@ -1,288 +0,0 @@
1
- import type { createLogger, LoggerOptions } from '@c15t/logger';
2
- import {
3
- type Branding,
4
- brandingValues,
5
- type GlobalVendorList,
6
- type NonIABVendor,
7
- } from '@c15t/schema/types';
8
- import type { Translations } from '@c15t/translations';
9
- import type { Meter, Tracer } from '@opentelemetry/api';
10
- import type { FumaDB, InferFumaDB } from 'fumadb';
11
- import type { CacheAdapter } from '../cache/types';
12
- import type { createRegistry } from '../db/registry';
13
- import type { DB, LatestDB } from '../db/schema';
14
-
15
- export * from './api';
16
-
17
- // Re-export from @c15t/schema for backward compatibility
18
- export const branding = brandingValues;
19
- export type { Branding };
20
-
21
- export interface DatabaseOptions {
22
- /**
23
- * The database adapter to use.
24
- */
25
- adapter: FumaDB<FumaDBSchema>['adapter'];
26
-
27
- /**
28
- * Tenant ID for multi-tenant deployments.
29
- * When set, all database queries are automatically scoped to this tenant.
30
- */
31
- tenantId?: string;
32
-
33
- /**
34
- * Optional prefix for all database table names.
35
- * Useful when sharing a database with other applications to avoid naming conflicts.
36
- *
37
- * @example 'c15t_' // tables become: c15t_subject, c15t_consent, etc.
38
- */
39
- tablePrefix?: string;
40
- }
41
-
42
- export interface AdvancedOptions {
43
- /**
44
- * Disables the use of Geo Location to determine the jurisdiction
45
- *
46
- * When enabled, the jurisdiction will be set to "GDPR" to show the strictest version of the banner as we don't know the jurisdiction in this case
47
- *
48
- * @default false
49
- */
50
- disableGeoLocation?: boolean;
51
- /**
52
- * Override base translations
53
- *
54
- * @example
55
- * ```ts
56
- * {
57
- * en: enTranslations,
58
- * de: deTranslations,
59
- * }
60
- * ```
61
- */
62
- customTranslations?: Record<string, Partial<Translations>>;
63
-
64
- /**
65
- * Select which branding to show in the consent banner.
66
- * Use "none" to hide branding.
67
- * @default "c15t"
68
- */
69
- branding?: Branding;
70
-
71
- openapi?: {
72
- /**
73
- * Enable/disable OpenAPI spec generation
74
- * @default true
75
- */
76
- enabled?: boolean;
77
-
78
- /**
79
- * Path to serve the OpenAPI JSON spec
80
- * @default "/spec.json"
81
- */
82
- specPath?: string;
83
-
84
- /**
85
- * Path to serve the API documentation UI
86
- * @default "/docs"
87
- */
88
- docsPath?: string;
89
-
90
- /**
91
- * OpenAPI specification options
92
- */
93
- options?: {
94
- info?: {
95
- title?: string;
96
- version?: string;
97
- description?: string;
98
- };
99
- servers?: Array<{ url: string; description?: string }>;
100
- security?: Array<Record<string, string[]>>;
101
- };
102
-
103
- /**
104
- * Custom template for rendering the API documentation UI
105
- * If provided, this will be used instead of the default Scalar UI
106
- */
107
- customUiTemplate?: string;
108
- };
109
- /**
110
- * OpenTelemetry configuration for tracing and metrics.
111
- * Telemetry is opt-in and disabled by default.
112
- * Users must provide their own SDK setup (Node, Bun, edge, etc.).
113
- */
114
- telemetry?: {
115
- /**
116
- * Enable telemetry (tracing and metrics).
117
- * Must be explicitly set to true to activate.
118
- * @default false
119
- */
120
- enabled?: boolean;
121
- /**
122
- * User-provided tracer instance.
123
- * Users should set up their own OpenTelemetry SDK and pass the tracer here.
124
- * @example trace.getTracer('my-app')
125
- */
126
- tracer?: Tracer;
127
- /**
128
- * User-provided meter instance for metrics.
129
- * Users should set up their own OpenTelemetry SDK and pass the meter here.
130
- * @example metrics.getMeter('my-app')
131
- */
132
- meter?: Meter;
133
- /**
134
- * Default attributes to include on all spans and metrics.
135
- */
136
- defaultAttributes?: Record<string, string | number | boolean>;
137
- };
138
- ipAddress?: {
139
- /**
140
- * Enable/disable IP address tracking.
141
- * When disabled, all IP addresses will be stored as null.
142
- * @default true
143
- */
144
- tracking?: boolean;
145
-
146
- /**
147
- * Enable/disable IP address masking to reduce PII collection.
148
- * - IPv4: Last octet is replaced with 0 (e.g., 192.168.1.100 -> 192.168.1.0)
149
- * - IPv6: Last 80 bits are masked (e.g., 2001:db8:85a3::1 -> 2001:db8:85a3::)
150
- * @default true
151
- */
152
- masking?: boolean;
153
-
154
- /**
155
- * Override the default IP address headers used to extract client IP.
156
- * Headers are checked in order, first match wins.
157
- */
158
- ipAddressHeaders?: string[];
159
- };
160
-
161
- /**
162
- * Cache configuration for external persistent storage.
163
- * Used for caching GVL and other data.
164
- */
165
- cache?: {
166
- /**
167
- * External cache adapter (Redis, KV, etc.).
168
- * If not provided, only in-memory cache is used.
169
- */
170
- adapter?: CacheAdapter;
171
- };
172
-
173
- /**
174
- * API keys for authenticated endpoints.
175
- * Used for server-side endpoints like GET /subjects.
176
- *
177
- * @example
178
- * ```ts
179
- * apiKeys: ['sk_live_abc123', 'sk_live_def456']
180
- * ```
181
- */
182
- apiKeys?: string[];
183
-
184
- /**
185
- * GVL (Global Vendor List) configuration for IAB TCF compliance.
186
- * Disabled by default - most users don't need IAB TCF.
187
- * Set enabled: true to activate GVL support.
188
- */
189
- gvl?: {
190
- /**
191
- * Enable GVL support.
192
- * When false or not provided, /init returns gvl: null.
193
- */
194
- enabled: true;
195
-
196
- /**
197
- * Bundled GVL translations by language code.
198
- * These are checked first before any cache or fetch.
199
- *
200
- * @example
201
- * ```ts
202
- * import enGVL from './gvl/en.json';
203
- * import deGVL from './gvl/de.json';
204
- *
205
- * gvl: {
206
- * enabled: true,
207
- * bundled: { en: enGVL, de: deGVL }
208
- * }
209
- * ```
210
- */
211
- bundled?: Record<string, GlobalVendorList>;
212
-
213
- /**
214
- * Vendor IDs to filter when fetching non-bundled languages.
215
- * Reduces payload size.
216
- */
217
- vendorIds?: number[];
218
-
219
- /**
220
- * Override the default GVL endpoint.
221
- * @default 'https://gvl.consent.io'
222
- */
223
- endpoint?: string;
224
-
225
- /**
226
- * Custom vendors not registered with IAB.
227
- * These are synced to the frontend via the /init endpoint.
228
- *
229
- * @example
230
- * ```ts
231
- * customVendors: [
232
- * {
233
- * id: 'internal-analytics',
234
- * name: 'Our Analytics',
235
- * privacyPolicyUrl: 'https://example.com/privacy',
236
- * purposes: [1, 8],
237
- * }
238
- * ]
239
- * ```
240
- */
241
- customVendors?: NonIABVendor[];
242
- };
243
- }
244
-
245
- export interface BaseOptions {
246
- /** Display name for your application, used in consent records. */
247
- appName?: string;
248
- /** Base path prefix for all API routes (e.g. `/api/consent`). */
249
- basePath?: string;
250
- /** Allowed origins for CORS. Required for browser-based consent collection. */
251
- trustedOrigins: string[];
252
- /** Advanced configuration options. */
253
- advanced?: AdvancedOptions;
254
- }
255
-
256
- type FumaDBSchema = InferFumaDB<typeof DB>['schemas'];
257
- export interface C15TOptions extends BaseOptions, DatabaseOptions {
258
- logger?: LoggerOptions;
259
- }
260
-
261
- export interface C15TContext extends BaseOptions {
262
- appName: string;
263
- logger: ReturnType<typeof createLogger>;
264
- registry: ReturnType<typeof createRegistry>;
265
- db: ReturnType<InferFumaDB<typeof LatestDB>['orm']>;
266
-
267
- // Resolved from request
268
- ipAddress?: string | null;
269
- userAgent?: string;
270
- origin?: string;
271
- trustedOrigin?: boolean;
272
- path?: string;
273
- method?: string;
274
- headers?: Headers;
275
-
276
- // Authentication state
277
- /**
278
- * Whether the request was authenticated with a valid API key.
279
- * Set to true when a valid Bearer token is provided in the Authorization header.
280
- */
281
- apiKeyAuthenticated?: boolean;
282
- }
283
-
284
- export type DeepPartial<T> = T extends (...args: unknown[]) => unknown
285
- ? T
286
- : T extends object
287
- ? { [K in keyof T]?: DeepPartial<T[K]> }
288
- : T;
@@ -1,302 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
- import type { C15TOptions } from '../types';
3
- import {
4
- createRequestSpan,
5
- createTelemetryOptions,
6
- getDefaultAttributes,
7
- getMeter,
8
- getTraceContext,
9
- getTracer,
10
- isTelemetryEnabled,
11
- resetTelemetryConfig,
12
- withRequestSpan,
13
- } from './create-telemetry-options';
14
-
15
- afterEach(() => {
16
- resetTelemetryConfig();
17
- });
18
-
19
- describe('createTelemetryOptions', () => {
20
- it('returns disabled by default (opt-in)', () => {
21
- const options = createTelemetryOptions('test-app');
22
-
23
- expect(options?.enabled).toBe(false);
24
- });
25
-
26
- it('sets enabled when explicitly configured', () => {
27
- const options = createTelemetryOptions('test-app', { enabled: true });
28
-
29
- expect(options?.enabled).toBe(true);
30
- });
31
-
32
- it('includes default attributes with service name and version', () => {
33
- const options = createTelemetryOptions('my-app');
34
-
35
- expect(options?.defaultAttributes).toMatchObject({
36
- 'service.name': 'my-app',
37
- });
38
- expect(options?.defaultAttributes?.['service.version']).toBeDefined();
39
- });
40
-
41
- it('merges user-provided default attributes', () => {
42
- const options = createTelemetryOptions('my-app', {
43
- defaultAttributes: {
44
- environment: 'production',
45
- region: 'us-east-1',
46
- },
47
- });
48
-
49
- expect(options?.defaultAttributes).toMatchObject({
50
- 'service.name': 'my-app',
51
- environment: 'production',
52
- region: 'us-east-1',
53
- });
54
- });
55
-
56
- it('preserves user-provided tracer', () => {
57
- const mockTracer = { startSpan: vi.fn() };
58
- type TelemetryConfig = NonNullable<
59
- NonNullable<C15TOptions['advanced']>['telemetry']
60
- >;
61
- const options = createTelemetryOptions('my-app', {
62
- tracer: mockTracer as unknown as TelemetryConfig['tracer'],
63
- });
64
-
65
- expect(options?.tracer).toBe(mockTracer);
66
- });
67
- });
68
-
69
- describe('isTelemetryEnabled', () => {
70
- it('returns false when no options provided', () => {
71
- expect(isTelemetryEnabled()).toBe(false);
72
- });
73
-
74
- it('returns false when telemetry is not configured', () => {
75
- const options: C15TOptions = {
76
- trustedOrigins: [],
77
- adapter: {} as C15TOptions['adapter'],
78
- };
79
-
80
- expect(isTelemetryEnabled(options)).toBe(false);
81
- });
82
-
83
- it('returns false when enabled is not set', () => {
84
- const options: C15TOptions = {
85
- trustedOrigins: [],
86
- adapter: {} as C15TOptions['adapter'],
87
- advanced: {
88
- telemetry: {},
89
- },
90
- };
91
-
92
- expect(isTelemetryEnabled(options)).toBe(false);
93
- });
94
-
95
- it('returns true when enabled is true', () => {
96
- const options: C15TOptions = {
97
- trustedOrigins: [],
98
- adapter: {} as C15TOptions['adapter'],
99
- advanced: {
100
- telemetry: {
101
- enabled: true,
102
- },
103
- },
104
- };
105
-
106
- expect(isTelemetryEnabled(options)).toBe(true);
107
- });
108
- });
109
-
110
- describe('getTracer', () => {
111
- it('returns a tracer even when telemetry is disabled', () => {
112
- const tracer = getTracer();
113
-
114
- expect(tracer).toBeDefined();
115
- expect(tracer.startSpan).toBeDefined();
116
- });
117
-
118
- it('uses user-provided tracer when available', () => {
119
- const mockTracer = { startSpan: vi.fn() };
120
- type TelemetryConfig = NonNullable<
121
- NonNullable<C15TOptions['advanced']>['telemetry']
122
- >;
123
- const options: C15TOptions = {
124
- trustedOrigins: [],
125
- adapter: {} as C15TOptions['adapter'],
126
- advanced: {
127
- telemetry: {
128
- enabled: true,
129
- tracer: mockTracer as unknown as TelemetryConfig['tracer'],
130
- },
131
- },
132
- };
133
-
134
- const tracer = getTracer(options);
135
- expect(tracer).toBe(mockTracer);
136
- });
137
- });
138
-
139
- describe('getMeter', () => {
140
- it('returns a meter even when telemetry is disabled', () => {
141
- const meter = getMeter();
142
-
143
- expect(meter).toBeDefined();
144
- expect(meter.createCounter).toBeDefined();
145
- });
146
-
147
- it('returns meter with expected interface when telemetry is enabled', () => {
148
- const options: C15TOptions = {
149
- trustedOrigins: [],
150
- adapter: {} as C15TOptions['adapter'],
151
- advanced: {
152
- telemetry: {
153
- enabled: true,
154
- },
155
- },
156
- };
157
-
158
- const meter = getMeter(options);
159
- // Verify the meter has the expected interface
160
- expect(meter.createCounter).toBeDefined();
161
- expect(meter.createHistogram).toBeDefined();
162
- });
163
- });
164
-
165
- describe('createRequestSpan', () => {
166
- it('returns null when telemetry is disabled', () => {
167
- const span = createRequestSpan('GET', '/test');
168
-
169
- expect(span).toBeNull();
170
- });
171
-
172
- it('creates span when telemetry is enabled', () => {
173
- const options: C15TOptions = {
174
- trustedOrigins: [],
175
- adapter: {} as C15TOptions['adapter'],
176
- advanced: {
177
- telemetry: {
178
- enabled: true,
179
- },
180
- },
181
- };
182
-
183
- const span = createRequestSpan('GET', '/test', options);
184
-
185
- expect(span).toBeDefined();
186
- // Clean up
187
- span?.end();
188
- });
189
- });
190
-
191
- describe('withRequestSpan', () => {
192
- it('executes operation without span when telemetry is disabled', async () => {
193
- const operation = vi.fn().mockResolvedValue('result');
194
-
195
- const result = await withRequestSpan('GET', '/test', operation);
196
-
197
- expect(result).toBe('result');
198
- expect(operation).toHaveBeenCalledTimes(1);
199
- });
200
-
201
- it('wraps operation in span when telemetry is enabled', async () => {
202
- const options: C15TOptions = {
203
- trustedOrigins: [],
204
- adapter: {} as C15TOptions['adapter'],
205
- advanced: {
206
- telemetry: {
207
- enabled: true,
208
- },
209
- },
210
- };
211
- const operation = vi.fn().mockResolvedValue('result');
212
-
213
- const result = await withRequestSpan('GET', '/test', operation, options);
214
-
215
- expect(result).toBe('result');
216
- expect(operation).toHaveBeenCalledTimes(1);
217
- });
218
-
219
- it('propagates errors from operation', async () => {
220
- const error = new Error('Test error');
221
- const operation = vi.fn().mockRejectedValue(error);
222
-
223
- await expect(withRequestSpan('GET', '/test', operation)).rejects.toThrow(
224
- 'Test error'
225
- );
226
- });
227
- });
228
-
229
- describe('getTraceContext', () => {
230
- it('returns null when no active span', () => {
231
- const context = getTraceContext();
232
-
233
- expect(context).toBeNull();
234
- });
235
- });
236
-
237
- describe('cached telemetry config', () => {
238
- it('isTelemetryEnabled returns false before init', () => {
239
- expect(isTelemetryEnabled()).toBe(false);
240
- });
241
-
242
- it('isTelemetryEnabled returns cached value after init', () => {
243
- createTelemetryOptions('test-app', { enabled: true });
244
-
245
- expect(isTelemetryEnabled()).toBe(true);
246
- });
247
-
248
- it('getDefaultAttributes returns empty before init', () => {
249
- const attrs = getDefaultAttributes();
250
-
251
- expect(Object.keys(attrs)).toHaveLength(0);
252
- });
253
-
254
- it('getDefaultAttributes returns cached attributes after init', () => {
255
- createTelemetryOptions('test-app', {
256
- defaultAttributes: { environment: 'test' },
257
- });
258
-
259
- const attrs = getDefaultAttributes();
260
- expect(attrs['service.name']).toBe('test-app');
261
- expect(attrs['environment']).toBe('test');
262
- });
263
-
264
- it('includes tenantId in default attributes when provided', () => {
265
- createTelemetryOptions('test-app', {}, 'tenant-123');
266
-
267
- const attrs = getDefaultAttributes();
268
- expect(attrs['tenant.id']).toBe('tenant-123');
269
- });
270
-
271
- it('does not include tenant.id when tenantId is undefined', () => {
272
- createTelemetryOptions('test-app');
273
-
274
- const attrs = getDefaultAttributes();
275
- expect(attrs['tenant.id']).toBeUndefined();
276
- });
277
-
278
- it('resetTelemetryConfig clears the cache', () => {
279
- createTelemetryOptions('test-app', { enabled: true });
280
- expect(isTelemetryEnabled()).toBe(true);
281
-
282
- resetTelemetryConfig();
283
- expect(isTelemetryEnabled()).toBe(false);
284
- expect(Object.keys(getDefaultAttributes())).toHaveLength(0);
285
- });
286
-
287
- it('getTracer returns a tracer without explicit options after init', () => {
288
- createTelemetryOptions('test-app', { enabled: true });
289
-
290
- const tracer = getTracer();
291
- expect(tracer).toBeDefined();
292
- expect(tracer.startSpan).toBeDefined();
293
- });
294
-
295
- it('getMeter returns a meter without explicit options after init', () => {
296
- createTelemetryOptions('test-app', { enabled: true });
297
-
298
- const meter = getMeter();
299
- expect(meter).toBeDefined();
300
- expect(meter.createCounter).toBeDefined();
301
- });
302
- });