@c15t/backend 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/.turbo/turbo-build.log +63 -37
  2. package/CHANGELOG.md +4 -209
  3. package/README.md +86 -164
  4. package/dist/contracts/consent/index.d.ts +103 -615
  5. package/dist/contracts/consent/index.d.ts.map +1 -1
  6. package/dist/contracts/consent/post.contract.d.ts +42 -140
  7. package/dist/contracts/consent/post.contract.d.ts.map +1 -1
  8. package/dist/contracts/consent/show-banner.contract.d.ts +28 -376
  9. package/dist/contracts/consent/show-banner.contract.d.ts.map +1 -1
  10. package/dist/contracts/consent/verify.contract.d.ts +33 -99
  11. package/dist/contracts/consent/verify.contract.d.ts.map +1 -1
  12. package/dist/contracts/index.d.ts +222 -1356
  13. package/dist/contracts/index.d.ts.map +1 -1
  14. package/dist/contracts/meta/index.d.ts +8 -63
  15. package/dist/contracts/meta/index.d.ts.map +1 -1
  16. package/dist/contracts/meta/status.contract.d.ts +8 -63
  17. package/dist/contracts/meta/status.contract.d.ts.map +1 -1
  18. package/dist/contracts/shared/jurisdiction.schema.d.ts +21 -9
  19. package/dist/contracts/shared/jurisdiction.schema.d.ts.map +1 -1
  20. package/dist/contracts.cjs +100 -106
  21. package/dist/contracts.js +100 -106
  22. package/dist/core.cjs +681 -681
  23. package/dist/core.d.ts +118 -678
  24. package/dist/core.d.ts.map +1 -1
  25. package/dist/core.js +634 -637
  26. package/dist/handlers/consent/index.d.ts +103 -615
  27. package/dist/handlers/consent/index.d.ts.map +1 -1
  28. package/dist/handlers/consent/post.handler.d.ts +42 -140
  29. package/dist/handlers/consent/post.handler.d.ts.map +1 -1
  30. package/dist/handlers/consent/show-banner/handler.d.ts +28 -376
  31. package/dist/handlers/consent/show-banner/handler.d.ts.map +1 -1
  32. package/dist/handlers/consent/show-banner/translations.d.ts.map +1 -1
  33. package/dist/handlers/consent/verify.handler.d.ts +33 -99
  34. package/dist/handlers/consent/verify.handler.d.ts.map +1 -1
  35. package/dist/handlers/meta/index.d.ts +8 -63
  36. package/dist/handlers/meta/index.d.ts.map +1 -1
  37. package/dist/handlers/meta/status.handler.d.ts +8 -63
  38. package/dist/handlers/meta/status.handler.d.ts.map +1 -1
  39. package/dist/init.d.ts.map +1 -1
  40. package/dist/middleware/openapi/index.d.ts +2 -2
  41. package/dist/middleware/openapi/index.d.ts.map +1 -1
  42. package/dist/pkgs/data-model/fields/index.cjs +14 -26
  43. package/dist/pkgs/data-model/fields/index.d.ts +4 -4
  44. package/dist/pkgs/data-model/fields/index.d.ts.map +1 -1
  45. package/dist/pkgs/data-model/fields/index.js +14 -26
  46. package/dist/pkgs/data-model/fields/zod-fields.d.ts +195 -871
  47. package/dist/pkgs/data-model/fields/zod-fields.d.ts.map +1 -1
  48. package/dist/pkgs/data-model/hooks/index.d.ts +2 -2
  49. package/dist/pkgs/data-model/hooks/index.d.ts.map +1 -1
  50. package/dist/pkgs/data-model/index.cjs +346 -358
  51. package/dist/pkgs/data-model/index.d.ts +1 -1
  52. package/dist/pkgs/data-model/index.d.ts.map +1 -1
  53. package/dist/pkgs/data-model/index.js +345 -357
  54. package/dist/pkgs/data-model/schema/index.cjs +346 -358
  55. package/dist/pkgs/data-model/schema/index.d.ts +1 -1
  56. package/dist/pkgs/data-model/schema/index.d.ts.map +1 -1
  57. package/dist/pkgs/data-model/schema/index.js +345 -357
  58. package/dist/pkgs/data-model/schema/schemas.d.ts +2 -2
  59. package/dist/pkgs/data-model/schema/schemas.d.ts.map +1 -1
  60. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts +3 -0
  61. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -1
  62. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.cjs +158 -170
  63. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.js +157 -169
  64. package/dist/pkgs/db-adapters/adapters/index.d.ts +2 -2
  65. package/dist/pkgs/db-adapters/adapters/index.d.ts.map +1 -1
  66. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.cjs +215 -227
  67. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.d.ts +2 -2
  68. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.d.ts.map +1 -1
  69. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.js +213 -225
  70. package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts +2 -0
  71. package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -1
  72. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts +1 -1
  73. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts.map +1 -1
  74. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.cjs +158 -170
  75. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.js +157 -169
  76. package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts +3 -0
  77. package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts.map +1 -1
  78. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.cjs +243 -255
  79. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.d.ts +1 -1
  80. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.d.ts.map +1 -1
  81. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.js +241 -253
  82. package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts +3 -0
  83. package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -1
  84. package/dist/pkgs/db-adapters/index.cjs +714 -726
  85. package/dist/pkgs/db-adapters/index.d.ts +6 -6
  86. package/dist/pkgs/db-adapters/index.d.ts.map +1 -1
  87. package/dist/pkgs/db-adapters/index.js +708 -720
  88. package/dist/pkgs/migrations/get-migration.d.ts.map +1 -1
  89. package/dist/pkgs/migrations/get-schema/get-schema.d.ts.map +1 -1
  90. package/dist/pkgs/migrations/get-schema/process-tables.d.ts.map +1 -1
  91. package/dist/pkgs/migrations/index.cjs +236 -248
  92. package/dist/pkgs/migrations/index.d.ts +4 -4
  93. package/dist/pkgs/migrations/index.d.ts.map +1 -1
  94. package/dist/pkgs/migrations/index.js +235 -247
  95. package/dist/pkgs/results/index.cjs +67 -67
  96. package/dist/pkgs/results/index.d.ts +5 -5
  97. package/dist/pkgs/results/index.d.ts.map +1 -1
  98. package/dist/pkgs/results/index.js +67 -67
  99. package/dist/pkgs/results/orpc-error-handler.d.ts +1 -1
  100. package/dist/pkgs/results/orpc-error-handler.d.ts.map +1 -1
  101. package/dist/pkgs/types/index.d.ts +1 -2
  102. package/dist/pkgs/types/index.d.ts.map +1 -1
  103. package/dist/pkgs/types/options.d.ts +9 -2
  104. package/dist/pkgs/types/options.d.ts.map +1 -1
  105. package/dist/pkgs/utils/index.d.ts +1 -1
  106. package/dist/pkgs/utils/index.d.ts.map +1 -1
  107. package/dist/pkgs/utils/logger.d.ts +1 -1
  108. package/dist/pkgs/utils/logger.d.ts.map +1 -1
  109. package/dist/router.cjs +114 -117
  110. package/dist/router.d.ts +111 -678
  111. package/dist/router.d.ts.map +1 -1
  112. package/dist/router.js +114 -117
  113. package/dist/schema/audit-log/schema.d.ts +2 -24
  114. package/dist/schema/audit-log/schema.d.ts.map +1 -1
  115. package/dist/schema/audit-log/table.d.ts +2 -24
  116. package/dist/schema/audit-log/table.d.ts.map +1 -1
  117. package/dist/schema/consent/registry.d.ts +8 -8
  118. package/dist/schema/consent/schema.d.ts +9 -33
  119. package/dist/schema/consent/schema.d.ts.map +1 -1
  120. package/dist/schema/consent/table.d.ts +9 -33
  121. package/dist/schema/consent/table.d.ts.map +1 -1
  122. package/dist/schema/consent-policy/registry.d.ts +20 -20
  123. package/dist/schema/consent-policy/schema.d.ts +22 -30
  124. package/dist/schema/consent-policy/schema.d.ts.map +1 -1
  125. package/dist/schema/consent-policy/table.d.ts +13 -29
  126. package/dist/schema/consent-policy/table.d.ts.map +1 -1
  127. package/dist/schema/consent-purpose/registry.d.ts +6 -6
  128. package/dist/schema/consent-purpose/schema.d.ts +5 -27
  129. package/dist/schema/consent-purpose/schema.d.ts.map +1 -1
  130. package/dist/schema/consent-purpose/table.d.ts +5 -27
  131. package/dist/schema/consent-purpose/table.d.ts.map +1 -1
  132. package/dist/schema/consent-record/schema.d.ts +3 -19
  133. package/dist/schema/consent-record/schema.d.ts.map +1 -1
  134. package/dist/schema/consent-record/table.d.ts +3 -19
  135. package/dist/schema/consent-record/table.d.ts.map +1 -1
  136. package/dist/schema/create-registry.d.ts +58 -58
  137. package/dist/schema/definition.d.ts +42 -176
  138. package/dist/schema/definition.d.ts.map +1 -1
  139. package/dist/schema/domain/registry.d.ts +20 -20
  140. package/dist/schema/domain/schema.d.ts +6 -24
  141. package/dist/schema/domain/schema.d.ts.map +1 -1
  142. package/dist/schema/domain/table.d.ts +6 -24
  143. package/dist/schema/domain/table.d.ts.map +1 -1
  144. package/dist/schema/index.cjs +426 -438
  145. package/dist/schema/index.d.ts +12 -12
  146. package/dist/schema/index.d.ts.map +1 -1
  147. package/dist/schema/index.js +426 -438
  148. package/dist/schema/schemas.d.ts +42 -176
  149. package/dist/schema/schemas.d.ts.map +1 -1
  150. package/dist/schema/subject/registry.d.ts +4 -4
  151. package/dist/schema/subject/schema.d.ts +4 -20
  152. package/dist/schema/subject/schema.d.ts.map +1 -1
  153. package/dist/schema/subject/table.d.ts +4 -20
  154. package/dist/schema/subject/table.d.ts.map +1 -1
  155. package/dist/schema/types.d.ts +1 -1
  156. package/dist/schema/types.d.ts.map +1 -1
  157. package/dist/testing/contract-testing.d.ts +3 -2
  158. package/dist/testing/contract-testing.d.ts.map +1 -1
  159. package/dist/types/index.d.ts +5 -4
  160. package/dist/types/index.d.ts.map +1 -1
  161. package/dist/types/options.d.ts +2 -2
  162. package/dist/types/options.d.ts.map +1 -1
  163. package/dist/v2/contracts/consent/index.d.ts +260 -0
  164. package/dist/v2/contracts/consent/index.d.ts.map +1 -0
  165. package/dist/v2/contracts/consent/index.test.d.ts +2 -0
  166. package/dist/v2/contracts/consent/index.test.d.ts.map +1 -0
  167. package/dist/v2/contracts/consent/post.contract.d.ts +114 -0
  168. package/dist/v2/contracts/consent/post.contract.d.ts.map +1 -0
  169. package/dist/v2/contracts/consent/post.contract.test.d.ts +2 -0
  170. package/dist/v2/contracts/consent/post.contract.test.d.ts.map +1 -0
  171. package/dist/v2/contracts/consent/show-banner.contract.d.ts +68 -0
  172. package/dist/v2/contracts/consent/show-banner.contract.d.ts.map +1 -0
  173. package/dist/v2/contracts/consent/show-banner.contract.test.d.ts +2 -0
  174. package/dist/v2/contracts/consent/show-banner.contract.test.d.ts.map +1 -0
  175. package/dist/v2/contracts/consent/verify.contract.d.ts +81 -0
  176. package/dist/v2/contracts/consent/verify.contract.d.ts.map +1 -0
  177. package/dist/v2/contracts/consent/verify.contract.test.d.ts +2 -0
  178. package/dist/v2/contracts/consent/verify.contract.test.d.ts.map +1 -0
  179. package/dist/v2/contracts/index.cjs +644 -0
  180. package/dist/v2/contracts/index.d.ts +563 -0
  181. package/dist/v2/contracts/index.d.ts.map +1 -0
  182. package/dist/v2/contracts/index.js +607 -0
  183. package/dist/v2/contracts/meta/index.d.ts +19 -0
  184. package/dist/v2/contracts/meta/index.d.ts.map +1 -0
  185. package/dist/v2/contracts/meta/index.test.d.ts +2 -0
  186. package/dist/v2/contracts/meta/index.test.d.ts.map +1 -0
  187. package/dist/v2/contracts/meta/status.contract.d.ts +18 -0
  188. package/dist/v2/contracts/meta/status.contract.d.ts.map +1 -0
  189. package/dist/v2/contracts/meta/status.contract.test.d.ts +2 -0
  190. package/dist/v2/contracts/meta/status.contract.test.d.ts.map +1 -0
  191. package/dist/v2/contracts/shared/jurisdiction.schema.d.ts +36 -0
  192. package/dist/v2/contracts/shared/jurisdiction.schema.d.ts.map +1 -0
  193. package/dist/v2/contracts/test.utils.d.ts +38 -0
  194. package/dist/v2/contracts/test.utils.d.ts.map +1 -0
  195. package/dist/v2/core.cjs +2181 -0
  196. package/dist/v2/core.d.ts +364 -0
  197. package/dist/v2/core.d.ts.map +1 -0
  198. package/dist/v2/core.js +2130 -0
  199. package/dist/v2/db/adapters/drizzle.cjs +36 -0
  200. package/dist/v2/db/adapters/drizzle.d.ts +2 -0
  201. package/dist/v2/db/adapters/drizzle.d.ts.map +1 -0
  202. package/dist/v2/db/adapters/drizzle.js +3 -0
  203. package/dist/v2/db/adapters/index.cjs +18 -0
  204. package/dist/v2/db/adapters/index.d.ts +2 -0
  205. package/dist/v2/db/adapters/index.d.ts.map +1 -0
  206. package/dist/v2/db/adapters/index.js +0 -0
  207. package/dist/v2/db/adapters/kysely.cjs +36 -0
  208. package/dist/v2/db/adapters/kysely.d.ts +2 -0
  209. package/dist/v2/db/adapters/kysely.d.ts.map +1 -0
  210. package/dist/v2/db/adapters/kysely.js +3 -0
  211. package/dist/v2/db/adapters/mongo.cjs +36 -0
  212. package/dist/v2/db/adapters/mongo.d.ts +2 -0
  213. package/dist/v2/db/adapters/mongo.d.ts.map +1 -0
  214. package/dist/v2/db/adapters/mongo.js +3 -0
  215. package/dist/v2/db/adapters/prisma.cjs +36 -0
  216. package/dist/v2/db/adapters/prisma.d.ts +2 -0
  217. package/dist/v2/db/adapters/prisma.d.ts.map +1 -0
  218. package/dist/v2/db/adapters/prisma.js +3 -0
  219. package/dist/v2/db/adapters/typeorm.cjs +36 -0
  220. package/dist/v2/db/adapters/typeorm.d.ts +2 -0
  221. package/dist/v2/db/adapters/typeorm.d.ts.map +1 -0
  222. package/dist/v2/db/adapters/typeorm.js +3 -0
  223. package/dist/v2/db/migrator/index.cjs +61 -0
  224. package/dist/v2/db/migrator/index.d.ts +29 -0
  225. package/dist/v2/db/migrator/index.d.ts.map +1 -0
  226. package/dist/v2/db/migrator/index.js +27 -0
  227. package/dist/v2/db/registry/audit-log.d.ts +21 -0
  228. package/dist/v2/db/registry/audit-log.d.ts.map +1 -0
  229. package/dist/v2/db/registry/audit-log.test.d.ts +2 -0
  230. package/dist/v2/db/registry/audit-log.test.d.ts.map +1 -0
  231. package/dist/v2/db/registry/consent-policy.d.ts +29 -0
  232. package/dist/v2/db/registry/consent-policy.d.ts.map +1 -0
  233. package/dist/v2/db/registry/consent-policy.test.d.ts +2 -0
  234. package/dist/v2/db/registry/consent-policy.test.d.ts.map +1 -0
  235. package/dist/v2/db/registry/consent-purpose.d.ts +16 -0
  236. package/dist/v2/db/registry/consent-purpose.d.ts.map +1 -0
  237. package/dist/v2/db/registry/consent-purpose.test.d.ts +2 -0
  238. package/dist/v2/db/registry/consent-purpose.test.d.ts.map +1 -0
  239. package/dist/v2/db/registry/consent.d.ts +20 -0
  240. package/dist/v2/db/registry/consent.d.ts.map +1 -0
  241. package/dist/v2/db/registry/consent.test.d.ts +2 -0
  242. package/dist/v2/db/registry/consent.test.d.ts.map +1 -0
  243. package/dist/v2/db/registry/domain.d.ts +24 -0
  244. package/dist/v2/db/registry/domain.d.ts.map +1 -0
  245. package/dist/v2/db/registry/domain.test.d.ts +2 -0
  246. package/dist/v2/db/registry/domain.test.d.ts.map +1 -0
  247. package/dist/v2/db/registry/index.d.ts +102 -0
  248. package/dist/v2/db/registry/index.d.ts.map +1 -0
  249. package/dist/v2/db/registry/subject.d.ts +18 -0
  250. package/dist/v2/db/registry/subject.d.ts.map +1 -0
  251. package/dist/v2/db/registry/subject.test.d.ts +2 -0
  252. package/dist/v2/db/registry/subject.test.d.ts.map +1 -0
  253. package/dist/v2/db/registry/types.d.ts +10 -0
  254. package/dist/v2/db/registry/types.d.ts.map +1 -0
  255. package/dist/v2/db/registry/utils/generate-id.d.ts +25 -0
  256. package/dist/v2/db/registry/utils/generate-id.d.ts.map +1 -0
  257. package/dist/v2/db/registry/utils/generate-id.test.d.ts +2 -0
  258. package/dist/v2/db/registry/utils/generate-id.test.d.ts.map +1 -0
  259. package/dist/v2/db/registry/utils.d.ts +25 -0
  260. package/dist/v2/db/registry/utils.d.ts.map +1 -0
  261. package/dist/v2/db/schema/1.0.0/audit-log.d.ts +29 -0
  262. package/dist/v2/db/schema/1.0.0/audit-log.d.ts.map +1 -0
  263. package/dist/v2/db/schema/1.0.0/consent-policy.d.ts +45 -0
  264. package/dist/v2/db/schema/1.0.0/consent-policy.d.ts.map +1 -0
  265. package/dist/v2/db/schema/1.0.0/consent-purpose.d.ts +27 -0
  266. package/dist/v2/db/schema/1.0.0/consent-purpose.d.ts.map +1 -0
  267. package/dist/v2/db/schema/1.0.0/consent-record.d.ts +19 -0
  268. package/dist/v2/db/schema/1.0.0/consent-record.d.ts.map +1 -0
  269. package/dist/v2/db/schema/1.0.0/consent.d.ts +42 -0
  270. package/dist/v2/db/schema/1.0.0/consent.d.ts.map +1 -0
  271. package/dist/v2/db/schema/1.0.0/domain.d.ts +23 -0
  272. package/dist/v2/db/schema/1.0.0/domain.d.ts.map +1 -0
  273. package/dist/v2/db/schema/1.0.0/index.d.ts +1513 -0
  274. package/dist/v2/db/schema/1.0.0/index.d.ts.map +1 -0
  275. package/dist/v2/db/schema/1.0.0/subject.d.ts +23 -0
  276. package/dist/v2/db/schema/1.0.0/subject.d.ts.map +1 -0
  277. package/dist/v2/db/schema/index.cjs +326 -0
  278. package/dist/v2/db/schema/index.d.ts +1507 -0
  279. package/dist/v2/db/schema/index.d.ts.map +1 -0
  280. package/dist/v2/db/schema/index.js +241 -0
  281. package/dist/v2/define-config.cjs +36 -0
  282. package/dist/v2/define-config.d.ts +5 -0
  283. package/dist/v2/define-config.d.ts.map +1 -0
  284. package/dist/v2/define-config.js +2 -0
  285. package/dist/v2/handlers/consent/index.d.ts +260 -0
  286. package/dist/v2/handlers/consent/index.d.ts.map +1 -0
  287. package/dist/v2/handlers/consent/post.handler.d.ts +136 -0
  288. package/dist/v2/handlers/consent/post.handler.d.ts.map +1 -0
  289. package/dist/v2/handlers/consent/show-banner/geo.d.ts +10 -0
  290. package/dist/v2/handlers/consent/show-banner/geo.d.ts.map +1 -0
  291. package/dist/v2/handlers/consent/show-banner/geo.test.d.ts +2 -0
  292. package/dist/v2/handlers/consent/show-banner/geo.test.d.ts.map +1 -0
  293. package/dist/v2/handlers/consent/show-banner/handler.d.ts +71 -0
  294. package/dist/v2/handlers/consent/show-banner/handler.d.ts.map +1 -0
  295. package/dist/v2/handlers/consent/show-banner/handler.test.d.ts +2 -0
  296. package/dist/v2/handlers/consent/show-banner/handler.test.d.ts.map +1 -0
  297. package/dist/v2/handlers/consent/show-banner/translations.d.ts +13 -0
  298. package/dist/v2/handlers/consent/show-banner/translations.d.ts.map +1 -0
  299. package/dist/v2/handlers/consent/show-banner/translations.test.d.ts +2 -0
  300. package/dist/v2/handlers/consent/show-banner/translations.test.d.ts.map +1 -0
  301. package/dist/v2/handlers/consent/verify.handler.d.ts +103 -0
  302. package/dist/v2/handlers/consent/verify.handler.d.ts.map +1 -0
  303. package/dist/v2/handlers/meta/index.d.ts +19 -0
  304. package/dist/v2/handlers/meta/index.d.ts.map +1 -0
  305. package/dist/v2/handlers/meta/status.handler.d.ts +17 -0
  306. package/dist/v2/handlers/meta/status.handler.d.ts.map +1 -0
  307. package/dist/v2/init.d.ts +3 -0
  308. package/dist/v2/init.d.ts.map +1 -0
  309. package/dist/v2/init.test.d.ts +2 -0
  310. package/dist/v2/init.test.d.ts.map +1 -0
  311. package/dist/v2/middleware/cors/cors.d.ts +37 -0
  312. package/dist/v2/middleware/cors/cors.d.ts.map +1 -0
  313. package/dist/v2/middleware/cors/cors.test.d.ts +2 -0
  314. package/dist/v2/middleware/cors/cors.test.d.ts.map +1 -0
  315. package/dist/v2/middleware/cors/index.d.ts +30 -0
  316. package/dist/v2/middleware/cors/index.d.ts.map +1 -0
  317. package/dist/v2/middleware/cors/is-origin-trusted.d.ts +49 -0
  318. package/dist/v2/middleware/cors/is-origin-trusted.d.ts.map +1 -0
  319. package/dist/v2/middleware/cors/is-origin-trusted.test.d.ts +2 -0
  320. package/dist/v2/middleware/cors/is-origin-trusted.test.d.ts.map +1 -0
  321. package/dist/v2/middleware/cors/process-cors.d.ts +31 -0
  322. package/dist/v2/middleware/cors/process-cors.d.ts.map +1 -0
  323. package/dist/v2/middleware/openapi/config.d.ts +28 -0
  324. package/dist/v2/middleware/openapi/config.d.ts.map +1 -0
  325. package/dist/v2/middleware/openapi/handlers.d.ts +29 -0
  326. package/dist/v2/middleware/openapi/handlers.d.ts.map +1 -0
  327. package/dist/v2/middleware/openapi/index.d.ts +11 -0
  328. package/dist/v2/middleware/openapi/index.d.ts.map +1 -0
  329. package/dist/v2/middleware/process-ip/index.d.ts +3 -0
  330. package/dist/v2/middleware/process-ip/index.d.ts.map +1 -0
  331. package/dist/v2/router.cjs +1275 -0
  332. package/dist/v2/router.d.ts +280 -0
  333. package/dist/v2/router.d.ts.map +1 -0
  334. package/dist/v2/router.js +1231 -0
  335. package/dist/v2/types/api.d.ts +27 -0
  336. package/dist/v2/types/api.d.ts.map +1 -0
  337. package/dist/v2/types/index.cjs +40 -0
  338. package/dist/v2/types/index.d.ts +104 -0
  339. package/dist/v2/types/index.d.ts.map +1 -0
  340. package/dist/v2/types/index.js +6 -0
  341. package/dist/v2/utils/create-telemetry-options.d.ts +28 -0
  342. package/dist/v2/utils/create-telemetry-options.d.ts.map +1 -0
  343. package/dist/v2/utils/env.d.ts +60 -0
  344. package/dist/v2/utils/env.d.ts.map +1 -0
  345. package/dist/v2/utils/index.d.ts +3 -0
  346. package/dist/v2/utils/index.d.ts.map +1 -0
  347. package/dist/v2/utils/logger.d.ts +16 -0
  348. package/dist/v2/utils/logger.d.ts.map +1 -0
  349. package/dist/version.d.ts +1 -1
  350. package/package.json +106 -15
  351. package/readme.json +30 -0
  352. package/rslib.config.ts +13 -14
  353. package/src/__tests__/server.test.ts +1 -1
  354. package/src/contracts/consent/post.contract.test.ts +3 -8
  355. package/src/contracts/consent/post.contract.ts +13 -13
  356. package/src/contracts/consent/show-banner.contract.test.ts +9 -0
  357. package/src/contracts/consent/show-banner.contract.ts +2 -0
  358. package/src/contracts/consent/verify.contract.ts +19 -23
  359. package/src/core.ts +7 -0
  360. package/src/handlers/consent/show-banner/handler.ts +12 -9
  361. package/src/handlers/consent/show-banner/translations.ts +2 -2
  362. package/src/init.ts +9 -6
  363. package/src/middleware/openapi/index.ts +2 -2
  364. package/src/pkgs/api-router/hooks/__tests__/processor.test.ts +1 -1
  365. package/src/pkgs/data-model/fields/index.ts +17 -22
  366. package/src/pkgs/data-model/fields/zod-fields.ts +14 -26
  367. package/src/pkgs/data-model/hooks/index.ts +3 -2
  368. package/src/pkgs/data-model/index.ts +2 -4
  369. package/src/pkgs/data-model/schema/index.ts +6 -7
  370. package/src/pkgs/data-model/schema/schemas.ts +3 -3
  371. package/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts +4 -1
  372. package/src/pkgs/db-adapters/adapters/index.ts +2 -2
  373. package/src/pkgs/db-adapters/adapters/kysely-adapter/index.ts +4 -4
  374. package/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts +4 -5
  375. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/postgres.test.ts +2 -4
  376. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/sqlite.test.ts +2 -3
  377. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts +1 -6
  378. package/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts +4 -1
  379. package/src/pkgs/db-adapters/adapters/prisma-adapter/index.ts +1 -1
  380. package/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts +5 -2
  381. package/src/pkgs/db-adapters/index.ts +12 -13
  382. package/src/pkgs/migrations/get-migration.ts +4 -2
  383. package/src/pkgs/migrations/get-schema/get-schema.ts +0 -1
  384. package/src/pkgs/migrations/get-schema/process-fields.ts +1 -1
  385. package/src/pkgs/migrations/get-schema/process-tables.ts +0 -2
  386. package/src/pkgs/migrations/index.ts +7 -8
  387. package/src/pkgs/results/__tests__/error-codes.test.ts +2 -2
  388. package/src/pkgs/results/index.ts +22 -27
  389. package/src/pkgs/results/orpc-error-handler.ts +1 -1
  390. package/src/pkgs/results/results/result-helpers.ts +1 -1
  391. package/src/pkgs/types/index.ts +4 -4
  392. package/src/pkgs/types/options.ts +10 -3
  393. package/src/pkgs/utils/index.ts +1 -1
  394. package/src/pkgs/utils/logger.ts +1 -1
  395. package/src/schema/audit-log/schema.ts +3 -3
  396. package/src/schema/consent/schema.ts +4 -4
  397. package/src/schema/consent-policy/schema.ts +3 -3
  398. package/src/schema/consent-purpose/schema.ts +4 -4
  399. package/src/schema/consent-record/schema.ts +3 -3
  400. package/src/schema/definition.ts +1 -1
  401. package/src/schema/domain/schema.ts +5 -5
  402. package/src/schema/index.ts +14 -17
  403. package/src/schema/subject/schema.ts +3 -3
  404. package/src/schema/types.ts +1 -1
  405. package/src/testing/contract-testing.ts +15 -52
  406. package/src/types/index.ts +8 -8
  407. package/src/types/options.ts +2 -3
  408. package/src/v2/contracts/consent/index.test.ts +5 -0
  409. package/src/v2/contracts/consent/index.ts +9 -0
  410. package/src/v2/contracts/consent/post.contract.test.ts +521 -0
  411. package/src/v2/contracts/consent/post.contract.ts +155 -0
  412. package/src/v2/contracts/consent/show-banner.contract.test.ts +252 -0
  413. package/src/v2/contracts/consent/show-banner.contract.ts +73 -0
  414. package/src/v2/contracts/consent/verify.contract.test.ts +185 -0
  415. package/src/v2/contracts/consent/verify.contract.ts +122 -0
  416. package/src/v2/contracts/index.ts +20 -0
  417. package/src/v2/contracts/meta/index.test.ts +5 -0
  418. package/src/v2/contracts/meta/index.ts +5 -0
  419. package/src/v2/contracts/meta/status.contract.test.ts +226 -0
  420. package/src/v2/contracts/meta/status.contract.ts +34 -0
  421. package/src/v2/contracts/shared/jurisdiction.schema.ts +30 -0
  422. package/src/v2/contracts/test.utils.ts +400 -0
  423. package/src/v2/core.ts +379 -0
  424. package/src/v2/db/adapters/drizzle.ts +1 -0
  425. package/src/v2/db/adapters/index.ts +1 -0
  426. package/src/v2/db/adapters/kysely.ts +1 -0
  427. package/src/v2/db/adapters/mongo.ts +1 -0
  428. package/src/v2/db/adapters/prisma.ts +1 -0
  429. package/src/v2/db/adapters/typeorm.ts +1 -0
  430. package/src/v2/db/migrator/index.ts +80 -0
  431. package/src/v2/db/registry/audit-log.test.ts +77 -0
  432. package/src/v2/db/registry/audit-log.ts +46 -0
  433. package/src/v2/db/registry/consent-policy.test.ts +778 -0
  434. package/src/v2/db/registry/consent-policy.ts +74 -0
  435. package/src/v2/db/registry/consent-purpose.test.ts +485 -0
  436. package/src/v2/db/registry/consent-purpose.ts +41 -0
  437. package/src/v2/db/registry/consent.test.ts +843 -0
  438. package/src/v2/db/registry/consent.ts +42 -0
  439. package/src/v2/db/registry/domain.test.ts +463 -0
  440. package/src/v2/db/registry/domain.ts +51 -0
  441. package/src/v2/db/registry/index.ts +18 -0
  442. package/src/v2/db/registry/subject.test.ts +497 -0
  443. package/src/v2/db/registry/subject.ts +101 -0
  444. package/src/v2/db/registry/types.ts +10 -0
  445. package/src/v2/db/registry/utils/generate-id.test.ts +217 -0
  446. package/src/v2/db/registry/utils/generate-id.ts +134 -0
  447. package/src/v2/db/registry/utils.ts +134 -0
  448. package/src/v2/db/schema/1.0.0/audit-log.ts +32 -0
  449. package/src/v2/db/schema/1.0.0/consent-policy.ts +41 -0
  450. package/src/v2/db/schema/1.0.0/consent-purpose.ts +30 -0
  451. package/src/v2/db/schema/1.0.0/consent-record.ts +22 -0
  452. package/src/v2/db/schema/1.0.0/consent.ts +38 -0
  453. package/src/v2/db/schema/1.0.0/domain.ts +26 -0
  454. package/src/v2/db/schema/1.0.0/index.ts +56 -0
  455. package/src/v2/db/schema/1.0.0/subject.ts +26 -0
  456. package/src/v2/db/schema/index.ts +9 -0
  457. package/src/v2/define-config.ts +5 -0
  458. package/src/v2/handlers/consent/index.ts +9 -0
  459. package/src/v2/handlers/consent/post.handler.ts +254 -0
  460. package/src/v2/handlers/consent/show-banner/geo.test.ts +281 -0
  461. package/src/v2/handlers/consent/show-banner/geo.ts +96 -0
  462. package/src/v2/handlers/consent/show-banner/handler.test.ts +374 -0
  463. package/src/v2/handlers/consent/show-banner/handler.ts +123 -0
  464. package/src/v2/handlers/consent/show-banner/translations.test.ts +121 -0
  465. package/src/v2/handlers/consent/show-banner/translations.ts +79 -0
  466. package/src/v2/handlers/consent/verify.handler.ts +288 -0
  467. package/src/v2/handlers/meta/index.ts +5 -0
  468. package/src/v2/handlers/meta/status.handler.ts +43 -0
  469. package/src/v2/init.test.ts +114 -0
  470. package/src/v2/init.ts +126 -0
  471. package/src/v2/middleware/cors/cors.test.ts +111 -0
  472. package/src/v2/middleware/cors/cors.ts +192 -0
  473. package/src/v2/middleware/cors/index.ts +30 -0
  474. package/src/v2/middleware/cors/is-origin-trusted.test.ts +104 -0
  475. package/src/v2/middleware/cors/is-origin-trusted.ts +126 -0
  476. package/src/v2/middleware/cors/process-cors.ts +91 -0
  477. package/src/v2/middleware/openapi/config.ts +27 -0
  478. package/src/v2/middleware/openapi/handlers.ts +132 -0
  479. package/src/v2/middleware/openapi/index.ts +11 -0
  480. package/src/v2/middleware/process-ip/index.ts +39 -0
  481. package/src/v2/router.ts +8 -0
  482. package/src/v2/types/api.ts +32 -0
  483. package/src/v2/types/index.ts +121 -0
  484. package/src/v2/utils/create-telemetry-options.ts +115 -0
  485. package/src/v2/utils/env.ts +84 -0
  486. package/src/v2/utils/index.ts +2 -0
  487. package/src/v2/utils/logger.ts +38 -0
  488. package/src/version.ts +1 -1
  489. package/vitest.config.ts +11 -2
@@ -0,0 +1,132 @@
1
+ import { OpenAPIGenerator } from '@orpc/openapi';
2
+ import { ZodToJsonSchemaConverter } from '@orpc/zod';
3
+ import { router } from '~/v2/router';
4
+ import type { C15TContext, C15TOptions } from '~/v2/types';
5
+ import { createDefaultOpenAPIOptions, createOpenAPIConfig } from './config';
6
+
7
+ /**
8
+ * Type for the memoized OpenAPI spec function
9
+ */
10
+ type MemoizedSpecFunction = {
11
+ (): Promise<Record<string, unknown>>;
12
+ cached?: Record<string, unknown>;
13
+ };
14
+
15
+ /**
16
+ * Merges user OpenAPI options with default options
17
+ */
18
+ const mergeOpenAPIOptions = (
19
+ defaultOptions: Record<string, unknown>,
20
+ userOptions: Record<string, unknown>
21
+ ): Record<string, unknown> => {
22
+ const merged = { ...defaultOptions };
23
+
24
+ // Handle nested info object specially
25
+ if (userOptions.info && typeof userOptions.info === 'object') {
26
+ merged.info = {
27
+ ...(merged.info as Record<string, unknown>),
28
+ ...userOptions.info,
29
+ };
30
+ }
31
+
32
+ // For all other top-level properties, override defaults
33
+ for (const [key, value] of Object.entries(userOptions)) {
34
+ if (key !== 'info') {
35
+ merged[key] = value;
36
+ }
37
+ }
38
+
39
+ return merged;
40
+ };
41
+
42
+ /**
43
+ * Generate the OpenAPI specification document
44
+ *
45
+ * @param options - Configuration options for the OpenAPI spec generation
46
+ * @returns A memoized function that generates and caches the OpenAPI spec
47
+ *
48
+ * @throws {Error} When the OpenAPI generator fails to create a valid spec
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * const getSpec = createOpenAPISpec(options);
53
+ * const spec = await getSpec();
54
+ * ```
55
+ */
56
+ export const createOpenAPISpec = (
57
+ context: C15TContext,
58
+ options: C15TOptions
59
+ ) => {
60
+ // Initialize OpenAPI generator with schema converters
61
+ const openAPIGenerator = new OpenAPIGenerator({
62
+ schemaConverters: [new ZodToJsonSchemaConverter()],
63
+ });
64
+
65
+ // Memoise once per process
66
+ const getOpenAPISpec = (async (): Promise<Record<string, unknown>> => {
67
+ if (getOpenAPISpec.cached) {
68
+ return getOpenAPISpec.cached;
69
+ }
70
+
71
+ const defaultOptions = createDefaultOpenAPIOptions(options);
72
+ const mergedOptions = options.advanced?.openapi?.options
73
+ ? mergeOpenAPIOptions(
74
+ defaultOptions,
75
+ options.advanced.openapi.options as Record<string, unknown>
76
+ )
77
+ : defaultOptions;
78
+
79
+ try {
80
+ // We need to cast to the expected type due to incompatibilities between the types
81
+ // This is safe as we control the options format and it's compatible with what the generator expects
82
+ const spec = await openAPIGenerator.generate(
83
+ router,
84
+ mergedOptions as Record<string, unknown>
85
+ );
86
+ getOpenAPISpec.cached = spec;
87
+ return spec;
88
+ } catch (error) {
89
+ context.logger?.error('Failed to generate OpenAPI spec:', error);
90
+ // Return a minimal valid spec to prevent UI errors
91
+ return {
92
+ openapi: '3.0.0',
93
+ info: { title: options.appName || 'c15t API', version: '0.0.0' },
94
+ paths: {},
95
+ };
96
+ }
97
+ }) as MemoizedSpecFunction;
98
+
99
+ return getOpenAPISpec;
100
+ };
101
+
102
+ /**
103
+ * Generate the default UI for API documentation
104
+ */
105
+ export const createDocsUI = (options: C15TOptions) => {
106
+ const config = createOpenAPIConfig(options);
107
+
108
+ // If a custom template is provided, use it
109
+ if (config.customUiTemplate) {
110
+ return config.customUiTemplate;
111
+ }
112
+
113
+ // Otherwise, return the default Scalar UI
114
+ return `
115
+ <!doctype html>
116
+ <html>
117
+ <head>
118
+ <title>${options.appName || 'c15t API'} Documentation</title>
119
+ <meta charset="utf-8" />
120
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
121
+ <link rel="icon" type="image/svg+xml" href="https://c15t.com/icon.svg" />
122
+ </head>
123
+ <body>
124
+ <script
125
+ id="api-reference"
126
+ data-url="${encodeURI(config.specPath)}">
127
+ </script>
128
+ <script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
129
+ </body>
130
+ </html>
131
+ `;
132
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * OpenAPI middleware for c15t
3
+ *
4
+ * This module provides OpenAPI functionality including:
5
+ * - Configuration management
6
+ * - Specification generation
7
+ * - Documentation UI
8
+ */
9
+
10
+ export { createDefaultOpenAPIOptions, createOpenAPIConfig } from './config';
11
+ export { createDocsUI, createOpenAPISpec } from './handlers';
@@ -0,0 +1,39 @@
1
+ import type { C15TOptions } from '~/v2/types';
2
+
3
+ const DEFAULT_IP_HEADERS = [
4
+ 'x-client-ip',
5
+ 'x-forwarded-for',
6
+ 'cf-connecting-ip',
7
+ 'fastly-client-ip',
8
+ 'x-real-ip',
9
+ 'x-cluster-client-ip',
10
+ 'x-forwarded',
11
+ 'forwarded-for',
12
+ 'forwarded',
13
+ ];
14
+
15
+ export function getIpAddress(
16
+ req: Request | Headers,
17
+ options: C15TOptions
18
+ ): string | 'unknown' {
19
+ const ipAddress = options.advanced?.ipAddress;
20
+
21
+ if (ipAddress?.disableIpTracking) {
22
+ return 'unknown';
23
+ }
24
+
25
+ const ipHeaders = ipAddress?.ipAddressHeaders || DEFAULT_IP_HEADERS;
26
+
27
+ const headers = req instanceof Request ? req.headers : req;
28
+ for (const key of ipHeaders) {
29
+ const value = headers.get(key);
30
+ if (value) {
31
+ const ip = value.split(',')[0]?.trim();
32
+ if (ip) {
33
+ return ip;
34
+ }
35
+ }
36
+ }
37
+
38
+ return 'unknown';
39
+ }
@@ -0,0 +1,8 @@
1
+ import { os } from './contracts';
2
+ import { consentHandlers } from './handlers/consent';
3
+ import { metaHandlers } from './handlers/meta';
4
+
5
+ export const router = os.router({
6
+ consent: consentHandlers,
7
+ meta: metaHandlers,
8
+ });
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Base API path template literal for c15t consent endpoints
3
+ *
4
+ * This type defines the base path for all consent API routes in the c15t system.
5
+ * Used as a foundation for building type-safe consent API route paths.
6
+ *
7
+ * @see ApiPath for complete path patterns
8
+ */
9
+ export type ApiPathBase = `/api/c15t`;
10
+
11
+ /**
12
+ * Consent API route path with strict type checking
13
+ *
14
+ * This type union represents all valid consent API paths in the system.
15
+ * It enforces type safety when defining routes or middlewares to
16
+ * prevent typos and ensure consistency.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * // Valid consent API path
21
+ * const consentPath: ApiPath = '/api/c15t/consent';
22
+ *
23
+ * // Invalid - would cause a type error
24
+ * const invalidPath: ApiPath = '/api/c15t/unknown-endpoint';
25
+ * ```
26
+ */
27
+ export type ApiPath =
28
+ | `${ApiPathBase}`
29
+ | `${ApiPathBase}/consent`
30
+ | `${ApiPathBase}/consent/:id`
31
+ | `${ApiPathBase}/jurisdictions`
32
+ | `${ApiPathBase}/jurisdictions/:code`;
@@ -0,0 +1,121 @@
1
+ import type { Translations } from '@c15t/translations';
2
+ import type { createLogger, LoggerOptions } from '@doubletie/logger';
3
+ import type { Tracer } from '@opentelemetry/api';
4
+ import type { OpenAPIGeneratorOptions } from '@orpc/openapi';
5
+ import type { FumaDB, InferFumaDB } from 'fumadb';
6
+ import type { createRegistry } from '../db/registry';
7
+ import type { DB } from '../db/schema';
8
+
9
+ export * from './api';
10
+
11
+ export const branding = ['c15t', 'consent', 'none'] as const;
12
+ export type Branding = (typeof branding)[number];
13
+
14
+ export interface DatabaseOptions {
15
+ /**
16
+ * The database adapter to use.
17
+ */
18
+ adapter: FumaDB<FumaDBSchema>['adapter'];
19
+ }
20
+
21
+ interface BaseOptions {
22
+ appName?: string;
23
+ basePath?: string;
24
+ trustedOrigins: string[];
25
+ advanced?: {
26
+ /**
27
+ * Disable geo location - Banner will allways be shown
28
+ *
29
+ * @default false
30
+ */
31
+ disableGeoLocation?: boolean;
32
+ /**
33
+ * Override base translations
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * {
38
+ * en: enTranslations,
39
+ * de: deTranslations,
40
+ * }
41
+ * ```
42
+ */
43
+ customTranslations?: Record<string, Partial<Translations>>;
44
+
45
+ /**
46
+ * Select which branding to show in the consent banner.
47
+ * Use "none" to hide branding.
48
+ * @default "c15t"
49
+ */
50
+ branding?: Branding;
51
+
52
+ openapi?: {
53
+ /**
54
+ * Enable/disable OpenAPI spec generation
55
+ * @default true
56
+ */
57
+ enabled?: boolean;
58
+
59
+ /**
60
+ * Path to serve the OpenAPI JSON spec
61
+ * @default "/spec.json"
62
+ */
63
+ specPath?: string;
64
+
65
+ /**
66
+ * Path to serve the API documentation UI
67
+ * @default "/docs"
68
+ */
69
+ docsPath?: string;
70
+
71
+ /**
72
+ * OpenAPI specification options
73
+ * These are passed to the OpenAPIGenerator.generate() method
74
+ */
75
+ options?: Partial<OpenAPIGeneratorOptions>;
76
+
77
+ /**
78
+ * Custom template for rendering the API documentation UI
79
+ * If provided, this will be used instead of the default Scalar UI
80
+ */
81
+ customUiTemplate?: string;
82
+ };
83
+ telemetry?: {
84
+ disabled?: boolean;
85
+ tracer?: Tracer;
86
+ defaultAttributes?: Record<string, string | number | boolean>;
87
+ };
88
+ ipAddress?: {
89
+ disableIpTracking?: boolean;
90
+ // Override default ip address headers
91
+ ipAddressHeaders?: string[];
92
+ };
93
+ };
94
+ }
95
+
96
+ type FumaDBSchema = InferFumaDB<typeof DB>['schemas'];
97
+ export interface C15TOptions extends BaseOptions, DatabaseOptions {
98
+ logger?: LoggerOptions;
99
+ }
100
+
101
+ export interface C15TContext extends BaseOptions {
102
+ appName: string;
103
+ logger: ReturnType<typeof createLogger>;
104
+ registry: ReturnType<typeof createRegistry>;
105
+ db: ReturnType<InferFumaDB<typeof DB>['orm']>;
106
+
107
+ // Resolved from request
108
+ ipAddress?: string;
109
+ userAgent?: string;
110
+ origin?: string;
111
+ trustedOrigin?: boolean;
112
+ path?: string;
113
+ method?: string;
114
+ headers?: Headers;
115
+ }
116
+
117
+ export type DeepPartial<T> = T extends (...args: unknown[]) => unknown
118
+ ? T
119
+ : T extends object
120
+ ? { [K in keyof T]?: DeepPartial<T[K]> }
121
+ : T;
@@ -0,0 +1,115 @@
1
+ import { type Span, SpanStatusCode, trace } from '@opentelemetry/api';
2
+ import type { C15TOptions } from '~/v2/types';
3
+ import { version } from '~/version';
4
+
5
+ type TelemetryConfig = NonNullable<C15TOptions['advanced']>['telemetry'];
6
+
7
+ /**
8
+ * Creates telemetry configuration from provided options
9
+ *
10
+ * This function merges user-provided telemetry options with sensible defaults,
11
+ * ensuring that service name and version are always properly set.
12
+ *
13
+ * @param appName - The application name to use for service.name attribute
14
+ * @param telemetryConfig - Optional user-provided telemetry configuration
15
+ * @returns Properly structured telemetry options for the OpenTelemetry SDK
16
+ */
17
+ export function createTelemetryOptions(
18
+ appName = 'c15t',
19
+ telemetryConfig?: TelemetryConfig
20
+ ): TelemetryConfig {
21
+ const config: TelemetryConfig = {
22
+ disabled: telemetryConfig?.disabled ?? false,
23
+ tracer: telemetryConfig?.tracer,
24
+
25
+ defaultAttributes: {
26
+ ...(telemetryConfig?.defaultAttributes || {}),
27
+
28
+ // Always ensure these core attributes are set
29
+ // (will override user values if they exist)
30
+ 'service.name': String(appName),
31
+ 'service.version': version,
32
+ },
33
+ };
34
+
35
+ return config;
36
+ }
37
+
38
+ /**
39
+ * Gets or creates a tracer for the api-router package
40
+ */
41
+ export const getTracer = (options?: C15TOptions) => {
42
+ if (options?.advanced?.telemetry?.tracer) {
43
+ return options.advanced.telemetry.tracer;
44
+ }
45
+ return trace.getTracer(options?.appName ?? 'c15t');
46
+ };
47
+
48
+ /**
49
+ * Creates a span for an API request
50
+ */
51
+ export const createRequestSpan = (
52
+ method: string,
53
+ path: string,
54
+ options?: C15TOptions
55
+ ) => {
56
+ if (options?.advanced?.telemetry?.disabled) {
57
+ return null;
58
+ }
59
+
60
+ const tracer = getTracer(options);
61
+ const span = tracer.startSpan(`${method} ${path}`, {
62
+ attributes: {
63
+ 'http.method': method,
64
+ 'http.path': path,
65
+ ...(options?.advanced?.telemetry?.defaultAttributes || {}),
66
+ },
67
+ });
68
+
69
+ return span;
70
+ };
71
+
72
+ /**
73
+ * Wraps an API request handler in a span
74
+ */
75
+ export const withRequestSpan = async <T>(
76
+ method: string,
77
+ path: string,
78
+ operation: () => Promise<T>,
79
+ options?: C15TOptions
80
+ ): Promise<T> => {
81
+ const span = createRequestSpan(method, path, options);
82
+
83
+ if (!span) {
84
+ return operation();
85
+ }
86
+
87
+ try {
88
+ const result = await operation();
89
+ span.setStatus({ code: SpanStatusCode.OK });
90
+ return result;
91
+ } catch (error) {
92
+ handleSpanError(span, error);
93
+ throw error;
94
+ } finally {
95
+ span.end();
96
+ }
97
+ };
98
+
99
+ /**
100
+ * Handles errors in spans
101
+ */
102
+ const handleSpanError = (span: Span, error: unknown) => {
103
+ span.setStatus({
104
+ code: SpanStatusCode.ERROR,
105
+ message: error instanceof Error ? error.message : String(error),
106
+ });
107
+
108
+ if (error instanceof Error) {
109
+ span.setAttribute('error.type', error.name);
110
+ span.setAttribute('error.message', error.message);
111
+ if (error.stack) {
112
+ span.setAttribute('error.stack', error.stack);
113
+ }
114
+ }
115
+ };
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Environment variables object
3
+ *
4
+ * Provides access to environment variables in a way that works in both
5
+ * browser and Node.js environments. In Node.js, this will be process.env,
6
+ * and in browsers, it will be an empty object.
7
+ *
8
+ * @returns An object containing environment variables accessible in the current runtime
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * // Access an environment variable
13
+ * const apiKey = env.API_KEY;
14
+ * ```
15
+ */
16
+ export const env = typeof process !== 'undefined' ? process.env : {};
17
+
18
+ /**
19
+ * Determines if the application is running in production mode
20
+ *
21
+ * Checks if NODE_ENV is set to 'production'. This is useful for
22
+ * conditionally enabling or disabling features based on the environment.
23
+ *
24
+ * @returns Boolean indicating whether the application is running in production mode
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * // Conditionally execute code based on environment
29
+ * if (isProduction) {
30
+ * // Production-only code
31
+ * }
32
+ * ```
33
+ */
34
+ export const isProduction =
35
+ typeof process !== 'undefined' && process.env.NODE_ENV === 'production';
36
+
37
+ /**
38
+ * Converts a string or boolean value to a boolean
39
+ *
40
+ * @param val - The value to convert to boolean
41
+ * @returns `false` if the value is falsy or the string 'false', otherwise `true`
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * toBoolean('true'); // true
46
+ * toBoolean('false'); // false
47
+ * toBoolean(undefined); // false
48
+ * toBoolean(true); // true
49
+ * ```
50
+ *
51
+ * @internal Used for environment variable parsing
52
+ */
53
+ function toBoolean(val: boolean | string | undefined) {
54
+ return val ? val !== 'false' : false;
55
+ }
56
+
57
+ /**
58
+ * The current Node.js environment value
59
+ *
60
+ * Retrieves the NODE_ENV environment variable value if available,
61
+ * otherwise returns an empty string.
62
+ *
63
+ * @returns The current NODE_ENV value or empty string if not set
64
+ */
65
+ export const nodeENV =
66
+ (typeof process !== 'undefined' && process.env && process.env.NODE_ENV) || '';
67
+
68
+ /**
69
+ * Determines if the application is running in test mode
70
+ *
71
+ * Checks if NODE_ENV is set to 'test' or if the TEST environment
72
+ * variable is truthy and not 'false'.
73
+ *
74
+ * @returns Boolean indicating whether the application is running in test mode
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * // Skip expensive operations in tests
79
+ * if (!isTest) {
80
+ * runExpensiveOperation();
81
+ * }
82
+ * ```
83
+ */
84
+ export const isTest = nodeENV === 'test' || toBoolean(env.TEST);
@@ -0,0 +1,2 @@
1
+ export { env, isProduction, isTest } from './env';
2
+ export * from './logger';
@@ -0,0 +1,38 @@
1
+ import {
2
+ createLogger as createDTLogger,
3
+ type LoggerOptions,
4
+ } from '@doubletie/logger';
5
+
6
+ let globalLogger: ReturnType<typeof createDTLogger>;
7
+
8
+ /**
9
+ * Gets or creates a global logger instance
10
+ *
11
+ * @param options - Optional logger configuration options
12
+ * @returns The global logger instance
13
+ */
14
+ export function getLogger(
15
+ options?: LoggerOptions
16
+ ): ReturnType<typeof createDTLogger> {
17
+ if (!globalLogger) {
18
+ globalLogger = createDTLogger({
19
+ level: 'info',
20
+ appName: 'c15t',
21
+ ...options,
22
+ });
23
+ }
24
+ return globalLogger;
25
+ }
26
+
27
+ /**
28
+ * Initializes the global logger with specific options
29
+ *
30
+ * @param options - Logger configuration options
31
+ * @returns The initialized global logger instance
32
+ */
33
+ export function initLogger(
34
+ options: LoggerOptions
35
+ ): ReturnType<typeof createDTLogger> {
36
+ globalLogger = createDTLogger(options);
37
+ return globalLogger;
38
+ }
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  // Generated by genversion.
2
- export const version = '1.5.0';
2
+ export const version = '1.6.0';
package/vitest.config.ts CHANGED
@@ -1,17 +1,26 @@
1
- import { resolve } from 'node:path';
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
2
3
  import { baseConfig } from '@c15t/vitest-config/base';
3
4
  import { defineConfig, mergeConfig } from 'vitest/config';
4
5
 
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
5
9
  export default mergeConfig(
6
10
  baseConfig,
7
11
  defineConfig({
8
12
  resolve: {
9
13
  alias: {
10
- '~': resolve(__dirname, './src'),
14
+ '~': path.resolve(__dirname, './src'),
15
+ // Workaround: fumadb imports without extension, but Node ESM needs .js
16
+ 'semver/functions/compare': 'semver/functions/compare.js',
11
17
  },
12
18
  },
13
19
  test: {
14
20
  environment: 'node',
21
+ deps: {
22
+ inline: ['fumadb'],
23
+ },
15
24
  },
16
25
  })
17
26
  );