@c15t/backend 2.0.0-rc.3 → 2.0.0-rc.5

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 (314) hide show
  1. package/dist/cache.cjs +4 -4
  2. package/dist/cache.js +4 -4
  3. package/dist/core.cjs +845 -87
  4. package/dist/core.js +821 -87
  5. package/dist/db/schema.cjs +37 -0
  6. package/dist/db/schema.js +33 -2
  7. package/dist/edge.cjs +1106 -0
  8. package/dist/edge.js +1069 -0
  9. package/dist/router.cjs +621 -71
  10. package/dist/router.js +621 -71
  11. package/{dist → dist-types}/cache/adapters/cloudflare-kv.d.ts +0 -1
  12. package/{dist → dist-types}/cache/adapters/index.d.ts +0 -1
  13. package/{dist → dist-types}/cache/adapters/memory.d.ts +0 -1
  14. package/{dist → dist-types}/cache/adapters/upstash-redis.d.ts +0 -1
  15. package/{dist → dist-types}/cache/gvl-resolver.d.ts +1 -2
  16. package/{dist → dist-types}/cache/index.d.ts +0 -1
  17. package/{dist → dist-types}/cache/keys.d.ts +0 -1
  18. package/{dist → dist-types}/cache/types.d.ts +0 -1
  19. package/{dist → dist-types}/core.d.ts +8 -1
  20. package/{dist → dist-types}/db/migrator/index.d.ts +0 -1
  21. package/{dist → dist-types}/db/registry/consent-policy.d.ts +0 -1
  22. package/{dist → dist-types}/db/registry/consent-purpose.d.ts +0 -1
  23. package/{dist → dist-types}/db/registry/domain.d.ts +0 -1
  24. package/{dist → dist-types}/db/registry/index.d.ts +22 -2
  25. package/dist-types/db/registry/runtime-policy-decision.d.ts +60 -0
  26. package/{dist → dist-types}/db/registry/subject.d.ts +0 -1
  27. package/{dist → dist-types}/db/registry/types.d.ts +1 -2
  28. package/{dist → dist-types}/db/registry/utils/generate-id.d.ts +0 -1
  29. package/{dist → dist-types}/db/registry/utils.d.ts +0 -1
  30. package/{dist → dist-types}/db/schema/1.0.0/audit-log.d.ts +0 -1
  31. package/{dist → dist-types}/db/schema/1.0.0/consent-policy.d.ts +0 -1
  32. package/{dist → dist-types}/db/schema/1.0.0/consent-purpose.d.ts +0 -1
  33. package/{dist → dist-types}/db/schema/1.0.0/consent-record.d.ts +0 -1
  34. package/{dist → dist-types}/db/schema/1.0.0/consent.d.ts +1 -2
  35. package/{dist → dist-types}/db/schema/1.0.0/domain.d.ts +0 -1
  36. package/{dist → dist-types}/db/schema/1.0.0/index.d.ts +0 -1
  37. package/{dist → dist-types}/db/schema/1.0.0/subject.d.ts +0 -1
  38. package/{dist → dist-types}/db/schema/2.0.0/audit-log.d.ts +1 -2
  39. package/{dist → dist-types}/db/schema/2.0.0/consent-policy.d.ts +1 -2
  40. package/{dist → dist-types}/db/schema/2.0.0/consent-purpose.d.ts +1 -2
  41. package/{dist → dist-types}/db/schema/2.0.0/consent.d.ts +5 -2
  42. package/{dist → dist-types}/db/schema/2.0.0/domain.d.ts +1 -2
  43. package/{dist → dist-types}/db/schema/2.0.0/index.d.ts +432 -17
  44. package/dist-types/db/schema/2.0.0/runtime-policy-decision.d.ts +23 -0
  45. package/{dist → dist-types}/db/schema/2.0.0/subject.d.ts +1 -2
  46. package/{dist → dist-types}/db/schema/index.d.ts +862 -33
  47. package/{dist → dist-types}/db/tenant-scope.d.ts +0 -1
  48. package/dist-types/define-config.d.ts +17 -0
  49. package/dist-types/edge/index.d.ts +5 -0
  50. package/dist-types/edge/init-handler.d.ts +38 -0
  51. package/dist-types/edge/resolve-consent.d.ts +80 -0
  52. package/dist-types/edge/types.d.ts +13 -0
  53. package/{dist → dist-types}/handlers/consent/check.handler.d.ts +0 -1
  54. package/{src/handlers/consent/index.ts → dist-types/handlers/consent/index.d.ts} +0 -1
  55. package/{dist → dist-types}/handlers/init/geo.d.ts +2 -3
  56. package/{dist → dist-types}/handlers/init/index.d.ts +4 -5
  57. package/dist-types/handlers/init/policy.d.ts +26 -0
  58. package/dist-types/handlers/init/resolve-init.d.ts +44 -0
  59. package/dist-types/handlers/init/translations.d.ts +48 -0
  60. package/dist-types/handlers/policy/snapshot.d.ts +99 -0
  61. package/{src/handlers/status/index.ts → dist-types/handlers/status/index.d.ts} +0 -1
  62. package/{dist → dist-types}/handlers/status/status.handler.d.ts +0 -1
  63. package/{dist → dist-types}/handlers/subject/get.handler.d.ts +0 -1
  64. package/{src/handlers/subject/index.ts → dist-types/handlers/subject/index.d.ts} +0 -1
  65. package/{dist → dist-types}/handlers/subject/list.handler.d.ts +0 -1
  66. package/{dist → dist-types}/handlers/subject/patch.handler.d.ts +0 -1
  67. package/{dist → dist-types}/handlers/subject/post.handler.d.ts +12 -1
  68. package/{dist → dist-types}/handlers/utils/consent-enrichment.d.ts +0 -1
  69. package/{dist → dist-types}/init.d.ts +4 -7
  70. package/{dist → dist-types}/middleware/auth/index.d.ts +0 -1
  71. package/{dist → dist-types}/middleware/auth/validate-api-key.d.ts +0 -1
  72. package/{dist → dist-types}/middleware/cors/cors.d.ts +0 -1
  73. package/{src/middleware/cors/index.ts → dist-types/middleware/cors/index.d.ts} +0 -1
  74. package/{dist → dist-types}/middleware/cors/is-origin-trusted.d.ts +1 -2
  75. package/{dist → dist-types}/middleware/cors/process-cors.d.ts +0 -1
  76. package/{dist → dist-types}/middleware/openapi/config.d.ts +0 -1
  77. package/{dist → dist-types}/middleware/openapi/handlers.d.ts +0 -1
  78. package/{src/middleware/openapi/index.ts → dist-types/middleware/openapi/index.d.ts} +0 -1
  79. package/{dist → dist-types}/middleware/process-ip/index.d.ts +0 -1
  80. package/dist-types/policies/builder.d.ts +127 -0
  81. package/dist-types/policies/defaults.d.ts +2 -0
  82. package/dist-types/policies/matchers.d.ts +3 -0
  83. package/{dist → dist-types}/router.d.ts +0 -1
  84. package/{dist → dist-types}/routes/consent.d.ts +0 -1
  85. package/{src/routes/index.ts → dist-types/routes/index.d.ts} +0 -1
  86. package/{dist → dist-types}/routes/init.d.ts +0 -1
  87. package/{dist → dist-types}/routes/status.d.ts +0 -1
  88. package/{dist → dist-types}/routes/subject.d.ts +0 -1
  89. package/{dist → dist-types}/types/api.d.ts +0 -1
  90. package/dist-types/types/index.d.ts +443 -0
  91. package/dist-types/utils/background.d.ts +6 -0
  92. package/{dist → dist-types}/utils/create-telemetry-options.d.ts +1 -2
  93. package/{dist → dist-types}/utils/env.d.ts +0 -1
  94. package/{dist → dist-types}/utils/extract-error-message.d.ts +0 -1
  95. package/{dist → dist-types}/utils/instrumentation.d.ts +0 -1
  96. package/{dist → dist-types}/utils/logger.d.ts +1 -2
  97. package/{dist → dist-types}/utils/metrics.d.ts +0 -1
  98. package/dist-types/version.d.ts +1 -0
  99. package/docs/README.md +49 -0
  100. package/docs/api/configuration.md +197 -0
  101. package/docs/api/endpoints.md +211 -0
  102. package/docs/guides/caching.md +85 -0
  103. package/docs/guides/database-setup.md +128 -0
  104. package/docs/guides/edge-deployment.md +248 -0
  105. package/docs/guides/framework-integration.md +142 -0
  106. package/docs/guides/iab-tcf.md +89 -0
  107. package/docs/guides/observability.md +96 -0
  108. package/docs/guides/policy-packs.md +396 -0
  109. package/docs/quickstart.md +129 -0
  110. package/package.json +37 -23
  111. package/.turbo/turbo-build.log +0 -49
  112. package/CHANGELOG.md +0 -115
  113. package/dist/cache/adapters/cloudflare-kv.d.ts.map +0 -1
  114. package/dist/cache/adapters/index.d.ts.map +0 -1
  115. package/dist/cache/adapters/memory.d.ts.map +0 -1
  116. package/dist/cache/adapters/upstash-redis.d.ts.map +0 -1
  117. package/dist/cache/gvl-resolver.d.ts.map +0 -1
  118. package/dist/cache/index.d.ts.map +0 -1
  119. package/dist/cache/keys.d.ts.map +0 -1
  120. package/dist/cache/types.d.ts.map +0 -1
  121. package/dist/core.d.ts.map +0 -1
  122. package/dist/db/adapters/drizzle.d.ts +0 -2
  123. package/dist/db/adapters/drizzle.d.ts.map +0 -1
  124. package/dist/db/adapters/index.d.ts +0 -2
  125. package/dist/db/adapters/index.d.ts.map +0 -1
  126. package/dist/db/adapters/kysely.d.ts +0 -2
  127. package/dist/db/adapters/kysely.d.ts.map +0 -1
  128. package/dist/db/adapters/mongo.d.ts +0 -2
  129. package/dist/db/adapters/mongo.d.ts.map +0 -1
  130. package/dist/db/adapters/prisma.d.ts +0 -2
  131. package/dist/db/adapters/prisma.d.ts.map +0 -1
  132. package/dist/db/adapters/typeorm.d.ts +0 -2
  133. package/dist/db/adapters/typeorm.d.ts.map +0 -1
  134. package/dist/db/migrator/index.d.ts.map +0 -1
  135. package/dist/db/registry/consent-policy.d.ts.map +0 -1
  136. package/dist/db/registry/consent-purpose.d.ts.map +0 -1
  137. package/dist/db/registry/domain.d.ts.map +0 -1
  138. package/dist/db/registry/index.d.ts.map +0 -1
  139. package/dist/db/registry/subject.d.ts.map +0 -1
  140. package/dist/db/registry/types.d.ts.map +0 -1
  141. package/dist/db/registry/utils/generate-id.d.ts.map +0 -1
  142. package/dist/db/registry/utils.d.ts.map +0 -1
  143. package/dist/db/schema/1.0.0/audit-log.d.ts.map +0 -1
  144. package/dist/db/schema/1.0.0/consent-policy.d.ts.map +0 -1
  145. package/dist/db/schema/1.0.0/consent-purpose.d.ts.map +0 -1
  146. package/dist/db/schema/1.0.0/consent-record.d.ts.map +0 -1
  147. package/dist/db/schema/1.0.0/consent.d.ts.map +0 -1
  148. package/dist/db/schema/1.0.0/domain.d.ts.map +0 -1
  149. package/dist/db/schema/1.0.0/index.d.ts.map +0 -1
  150. package/dist/db/schema/1.0.0/subject.d.ts.map +0 -1
  151. package/dist/db/schema/2.0.0/audit-log.d.ts.map +0 -1
  152. package/dist/db/schema/2.0.0/consent-policy.d.ts.map +0 -1
  153. package/dist/db/schema/2.0.0/consent-purpose.d.ts.map +0 -1
  154. package/dist/db/schema/2.0.0/consent.d.ts.map +0 -1
  155. package/dist/db/schema/2.0.0/domain.d.ts.map +0 -1
  156. package/dist/db/schema/2.0.0/index.d.ts.map +0 -1
  157. package/dist/db/schema/2.0.0/subject.d.ts.map +0 -1
  158. package/dist/db/schema/index.d.ts.map +0 -1
  159. package/dist/db/tenant-scope.d.ts.map +0 -1
  160. package/dist/define-config.d.ts +0 -5
  161. package/dist/define-config.d.ts.map +0 -1
  162. package/dist/handlers/consent/check.handler.d.ts.map +0 -1
  163. package/dist/handlers/consent/index.d.ts +0 -12
  164. package/dist/handlers/consent/index.d.ts.map +0 -1
  165. package/dist/handlers/init/geo.d.ts.map +0 -1
  166. package/dist/handlers/init/index.d.ts.map +0 -1
  167. package/dist/handlers/init/translations.d.ts +0 -28
  168. package/dist/handlers/init/translations.d.ts.map +0 -1
  169. package/dist/handlers/status/index.d.ts +0 -7
  170. package/dist/handlers/status/index.d.ts.map +0 -1
  171. package/dist/handlers/status/status.handler.d.ts.map +0 -1
  172. package/dist/handlers/subject/get.handler.d.ts.map +0 -1
  173. package/dist/handlers/subject/index.d.ts +0 -10
  174. package/dist/handlers/subject/index.d.ts.map +0 -1
  175. package/dist/handlers/subject/list.handler.d.ts.map +0 -1
  176. package/dist/handlers/subject/patch.handler.d.ts.map +0 -1
  177. package/dist/handlers/subject/post.handler.d.ts.map +0 -1
  178. package/dist/handlers/utils/consent-enrichment.d.ts.map +0 -1
  179. package/dist/init.d.ts.map +0 -1
  180. package/dist/middleware/auth/index.d.ts.map +0 -1
  181. package/dist/middleware/auth/validate-api-key.d.ts.map +0 -1
  182. package/dist/middleware/cors/cors.d.ts.map +0 -1
  183. package/dist/middleware/cors/index.d.ts +0 -30
  184. package/dist/middleware/cors/index.d.ts.map +0 -1
  185. package/dist/middleware/cors/is-origin-trusted.d.ts.map +0 -1
  186. package/dist/middleware/cors/process-cors.d.ts.map +0 -1
  187. package/dist/middleware/openapi/config.d.ts.map +0 -1
  188. package/dist/middleware/openapi/handlers.d.ts.map +0 -1
  189. package/dist/middleware/openapi/index.d.ts +0 -12
  190. package/dist/middleware/openapi/index.d.ts.map +0 -1
  191. package/dist/middleware/process-ip/index.d.ts.map +0 -1
  192. package/dist/router.d.ts.map +0 -1
  193. package/dist/routes/consent.d.ts.map +0 -1
  194. package/dist/routes/index.d.ts +0 -10
  195. package/dist/routes/index.d.ts.map +0 -1
  196. package/dist/routes/init.d.ts.map +0 -1
  197. package/dist/routes/status.d.ts.map +0 -1
  198. package/dist/routes/subject.d.ts.map +0 -1
  199. package/dist/types/api.d.ts.map +0 -1
  200. package/dist/types/index.d.ts +0 -263
  201. package/dist/types/index.d.ts.map +0 -1
  202. package/dist/utils/create-telemetry-options.d.ts.map +0 -1
  203. package/dist/utils/env.d.ts.map +0 -1
  204. package/dist/utils/extract-error-message.d.ts.map +0 -1
  205. package/dist/utils/index.d.ts +0 -4
  206. package/dist/utils/index.d.ts.map +0 -1
  207. package/dist/utils/instrumentation.d.ts.map +0 -1
  208. package/dist/utils/logger.d.ts.map +0 -1
  209. package/dist/utils/metrics.d.ts.map +0 -1
  210. package/dist/version.d.ts +0 -2
  211. package/dist/version.d.ts.map +0 -1
  212. package/knip.json +0 -31
  213. package/rslib.config.ts +0 -93
  214. package/src/cache/adapters/cloudflare-kv.ts +0 -71
  215. package/src/cache/adapters/index.ts +0 -22
  216. package/src/cache/adapters/memory.ts +0 -111
  217. package/src/cache/adapters/upstash-redis.ts +0 -113
  218. package/src/cache/gvl-resolver.ts +0 -289
  219. package/src/cache/index.ts +0 -34
  220. package/src/cache/keys.ts +0 -68
  221. package/src/cache/types.ts +0 -66
  222. package/src/core.ts +0 -369
  223. package/src/db/migrator/index.ts +0 -80
  224. package/src/db/registry/consent-policy.test.ts +0 -451
  225. package/src/db/registry/consent-policy.ts +0 -82
  226. package/src/db/registry/consent-purpose.test.ts +0 -428
  227. package/src/db/registry/consent-purpose.ts +0 -61
  228. package/src/db/registry/domain.test.ts +0 -445
  229. package/src/db/registry/domain.ts +0 -91
  230. package/src/db/registry/index.ts +0 -14
  231. package/src/db/registry/subject.test.ts +0 -371
  232. package/src/db/registry/subject.ts +0 -126
  233. package/src/db/registry/types.ts +0 -10
  234. package/src/db/registry/utils/generate-id.test.ts +0 -216
  235. package/src/db/registry/utils/generate-id.ts +0 -133
  236. package/src/db/registry/utils.ts +0 -133
  237. package/src/db/schema/1.0.0/audit-log.ts +0 -15
  238. package/src/db/schema/1.0.0/consent-policy.ts +0 -14
  239. package/src/db/schema/1.0.0/consent-purpose.ts +0 -14
  240. package/src/db/schema/1.0.0/consent-record.ts +0 -10
  241. package/src/db/schema/1.0.0/consent.ts +0 -20
  242. package/src/db/schema/1.0.0/domain.ts +0 -12
  243. package/src/db/schema/1.0.0/index.ts +0 -48
  244. package/src/db/schema/1.0.0/subject.ts +0 -11
  245. package/src/db/schema/2.0.0/audit-log.ts +0 -18
  246. package/src/db/schema/2.0.0/consent-policy.ts +0 -28
  247. package/src/db/schema/2.0.0/consent-purpose.ts +0 -12
  248. package/src/db/schema/2.0.0/consent.ts +0 -28
  249. package/src/db/schema/2.0.0/domain.ts +0 -12
  250. package/src/db/schema/2.0.0/index.ts +0 -47
  251. package/src/db/schema/2.0.0/subject.ts +0 -13
  252. package/src/db/schema/index.ts +0 -15
  253. package/src/db/tenant-scope.test.ts +0 -747
  254. package/src/db/tenant-scope.ts +0 -103
  255. package/src/define-config.ts +0 -5
  256. package/src/handlers/consent/check.handler.ts +0 -126
  257. package/src/handlers/init/geo.test.ts +0 -317
  258. package/src/handlers/init/geo.ts +0 -195
  259. package/src/handlers/init/index.test.ts +0 -205
  260. package/src/handlers/init/index.ts +0 -114
  261. package/src/handlers/init/translations.test.ts +0 -121
  262. package/src/handlers/init/translations.ts +0 -72
  263. package/src/handlers/status/status.handler.test.ts +0 -155
  264. package/src/handlers/status/status.handler.ts +0 -51
  265. package/src/handlers/subject/get.handler.ts +0 -92
  266. package/src/handlers/subject/list.handler.ts +0 -92
  267. package/src/handlers/subject/patch.handler.ts +0 -119
  268. package/src/handlers/subject/post.handler.test.ts +0 -294
  269. package/src/handlers/subject/post.handler.ts +0 -268
  270. package/src/handlers/utils/consent-enrichment.test.ts +0 -380
  271. package/src/handlers/utils/consent-enrichment.ts +0 -218
  272. package/src/init.test.ts +0 -126
  273. package/src/init.ts +0 -87
  274. package/src/middleware/auth/index.ts +0 -11
  275. package/src/middleware/auth/validate-api-key.test.ts +0 -86
  276. package/src/middleware/auth/validate-api-key.ts +0 -107
  277. package/src/middleware/cors/cors.test.ts +0 -135
  278. package/src/middleware/cors/cors.ts +0 -186
  279. package/src/middleware/cors/is-origin-trusted.test.ts +0 -164
  280. package/src/middleware/cors/is-origin-trusted.ts +0 -130
  281. package/src/middleware/cors/process-cors.ts +0 -91
  282. package/src/middleware/openapi/config.ts +0 -29
  283. package/src/middleware/openapi/handlers.ts +0 -34
  284. package/src/middleware/process-ip/index.test.ts +0 -195
  285. package/src/middleware/process-ip/index.ts +0 -199
  286. package/src/router.ts +0 -15
  287. package/src/routes/consent.ts +0 -52
  288. package/src/routes/init.ts +0 -105
  289. package/src/routes/status.ts +0 -46
  290. package/src/routes/subject.ts +0 -152
  291. package/src/types/api.ts +0 -48
  292. package/src/types/index.ts +0 -297
  293. package/src/utils/create-telemetry-options.test.ts +0 -302
  294. package/src/utils/create-telemetry-options.ts +0 -229
  295. package/src/utils/env.ts +0 -84
  296. package/src/utils/extract-error-message.ts +0 -21
  297. package/src/utils/instrumentation.test.ts +0 -185
  298. package/src/utils/instrumentation.ts +0 -196
  299. package/src/utils/logger.ts +0 -41
  300. package/src/utils/metrics.test.ts +0 -323
  301. package/src/utils/metrics.ts +0 -402
  302. package/src/utils/telemetry-pii.test.ts +0 -325
  303. package/src/version.ts +0 -2
  304. package/tsconfig.json +0 -11
  305. package/vitest.config.ts +0 -28
  306. /package/dist/{types.cjs → types/index.cjs} +0 -0
  307. /package/dist/{types.js → types/index.js} +0 -0
  308. /package/{src/db/adapters/drizzle.ts → dist-types/db/adapters/drizzle.d.ts} +0 -0
  309. /package/{src/db/adapters/index.ts → dist-types/db/adapters/index.d.ts} +0 -0
  310. /package/{src/db/adapters/kysely.ts → dist-types/db/adapters/kysely.d.ts} +0 -0
  311. /package/{src/db/adapters/mongo.ts → dist-types/db/adapters/mongo.d.ts} +0 -0
  312. /package/{src/db/adapters/prisma.ts → dist-types/db/adapters/prisma.d.ts} +0 -0
  313. /package/{src/db/adapters/typeorm.ts → dist-types/db/adapters/typeorm.d.ts} +0 -0
  314. /package/{src/utils/index.ts → dist-types/utils/index.d.ts} +0 -0
@@ -1,297 +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
- * IAB TCF configuration including GVL, CMP registration, and custom vendors.
186
- * Disabled by default - most users don't need IAB TCF.
187
- * Set enabled: true to activate IAB support.
188
- */
189
- iab?: {
190
- /**
191
- * Enable IAB TCF support.
192
- * When false or not provided, /init returns gvl: null.
193
- */
194
- enabled: true;
195
-
196
- /**
197
- * CMP ID registered with IAB Europe.
198
- * This is returned to clients via the /init endpoint so they
199
- * can use the correct CMP identity in TC Strings.
200
- *
201
- * @see https://iabeurope.eu/cmp-list/ - List of registered CMPs
202
- */
203
- cmpId?: number;
204
-
205
- /**
206
- * Bundled GVL translations by language code.
207
- * These are checked first before any cache or fetch.
208
- *
209
- * @example
210
- * ```ts
211
- * import enGVL from './gvl/en.json';
212
- * import deGVL from './gvl/de.json';
213
- *
214
- * iab: {
215
- * enabled: true,
216
- * bundled: { en: enGVL, de: deGVL }
217
- * }
218
- * ```
219
- */
220
- bundled?: Record<string, GlobalVendorList>;
221
-
222
- /**
223
- * Vendor IDs to filter when fetching non-bundled languages.
224
- * Reduces payload size.
225
- */
226
- vendorIds?: number[];
227
-
228
- /**
229
- * Override the default GVL endpoint.
230
- * @default 'https://gvl.consent.io'
231
- */
232
- endpoint?: string;
233
-
234
- /**
235
- * Custom vendors not registered with IAB.
236
- * These are synced to the frontend via the /init endpoint.
237
- *
238
- * @example
239
- * ```ts
240
- * customVendors: [
241
- * {
242
- * id: 'internal-analytics',
243
- * name: 'Our Analytics',
244
- * privacyPolicyUrl: 'https://example.com/privacy',
245
- * purposes: [1, 8],
246
- * }
247
- * ]
248
- * ```
249
- */
250
- customVendors?: NonIABVendor[];
251
- };
252
- }
253
-
254
- export interface BaseOptions {
255
- /** Display name for your application, used in consent records. */
256
- appName?: string;
257
- /** Base path prefix for all API routes (e.g. `/api/consent`). */
258
- basePath?: string;
259
- /** Allowed origins for CORS. Required for browser-based consent collection. */
260
- trustedOrigins: string[];
261
- /** Advanced configuration options. */
262
- advanced?: AdvancedOptions;
263
- }
264
-
265
- type FumaDBSchema = InferFumaDB<typeof DB>['schemas'];
266
- export interface C15TOptions extends BaseOptions, DatabaseOptions {
267
- logger?: LoggerOptions;
268
- }
269
-
270
- export interface C15TContext extends BaseOptions {
271
- appName: string;
272
- logger: ReturnType<typeof createLogger>;
273
- registry: ReturnType<typeof createRegistry>;
274
- db: ReturnType<InferFumaDB<typeof LatestDB>['orm']>;
275
-
276
- // Resolved from request
277
- ipAddress?: string | null;
278
- userAgent?: string;
279
- origin?: string;
280
- trustedOrigin?: boolean;
281
- path?: string;
282
- method?: string;
283
- headers?: Headers;
284
-
285
- // Authentication state
286
- /**
287
- * Whether the request was authenticated with a valid API key.
288
- * Set to true when a valid Bearer token is provided in the Authorization header.
289
- */
290
- apiKeyAuthenticated?: boolean;
291
- }
292
-
293
- export type DeepPartial<T> = T extends (...args: unknown[]) => unknown
294
- ? T
295
- : T extends object
296
- ? { [K in keyof T]?: DeepPartial<T[K]> }
297
- : 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
- });